Merge branch 'master' into use-ffmpeg-python

pull/209/head
Aevann 2023-09-26 16:58:39 +00:00
commit e114311802
34 changed files with 205 additions and 190 deletions

View File

@ -1,5 +1,4 @@
@charset "UTF-8";
:root {
--dark: #3E2C18;
--secondary: #FFE;

View File

@ -1,4 +1,5 @@
:root {
color-scheme: dark;
--muted: #999;
--black: #999;
--background: 34, 34, 34;

View File

@ -1,6 +1,7 @@
@charset "UTF-8";
:root {
color-scheme: dark;
--dark: #383838;
--secondary: #383838;
--white: #E1E1E1;

View File

@ -1,4 +1,5 @@
:root {
color-scheme: dark;
--white: #E1E1E1;
--black: #94a3b8;
--primary: #0284c7;

View File

@ -1,6 +1,7 @@
@charset "UTF-8";
:root {
color-scheme: dark;
--dark: #505961;
--secondary: #505961;
--white: #c9d1d9;

View File

@ -146,6 +146,7 @@
}
:root {
color-scheme: dark;
--dark: #00001f;
--secondary: var(--primary);
--white: #f0f0f0;

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

View File

@ -0,0 +1,48 @@
//youtube
const playbtn = document.querySelector('#orgy-file-container > lite-youtube > .lty-playbtn')
if (playbtn) playbtn.click()
//file
const orgy_file = document.getElementById('orgy-file');
if (orgy_file) {
const break_file = document.getElementById('break-file');
addEventListener("load", () => {
orgy_file.play()
});
document.addEventListener('click', () => {
if (orgy_file.paused) orgy_file.play();
}, {once : true});
function add_playing_listener() {
orgy_file.addEventListener('playing', () => {
const now = Date.now() / 1000;
const created_utc = orgy_file.dataset.created_utc
orgy_file.currentTime = now - created_utc
}, {once : true});
}
add_playing_listener()
orgy_file.addEventListener('pause', () => {
add_playing_listener()
})
orgy_file.addEventListener("timeupdate", function(){
if (break_file.dataset.run == "0" && parseInt(orgy_file.currentTime) == 3000) {
break_file.dataset.run = "1"
orgy_file.pause();
orgy_file.classList.add('d-none');
break_file.classList.remove('d-none');
break_file.play()
setTimeout(function () {
break_file.pause()
break_file.classList.add('d-none');
orgy_file.classList.remove('d-none');
orgy_file.dataset.created_utc = parseInt(orgy_file.dataset.created_utc) + 303
orgy_file.play()
}, 300000);
}
});
}

View File

@ -1,40 +0,0 @@
const orgy_file = document.getElementById('orgy-file');
const break_file = document.getElementById('break-file');
addEventListener("load", () => {
orgy_file.play()
});
document.addEventListener('click', () => {
if (orgy_file.paused) orgy_file.play();
}, {once : true});
function add_playing_listener() {
orgy_file.addEventListener('playing', () => {
const now = Date.now() / 1000;
const created_utc = orgy_file.dataset.created_utc
orgy_file.currentTime = now - created_utc
}, {once : true});
}
add_playing_listener()
orgy_file.addEventListener('pause', () => {
add_playing_listener()
})
orgy_file.addEventListener("timeupdate", function(){
if (break_file.dataset.run == "0" && parseInt(orgy_file.currentTime) == 3000) {
break_file.dataset.run = "1"
orgy_file.pause();
orgy_file.classList.add('d-none');
break_file.classList.remove('d-none');
break_file.play()
setTimeout(function () {
break_file.pause()
break_file.classList.add('d-none');
orgy_file.classList.remove('d-none');
orgy_file.dataset.created_utc = parseInt(orgy_file.dataset.created_utc) + 303
orgy_file.play()
}, 300000);
}
});

View File

@ -385,8 +385,7 @@ class Comment(Base):
if not body: return ""
if not (self.parent_post and self.post.sub == 'chudrama'):
body = censor_slurs_profanities(body, v)
body = replace_train_html(body)
body = censor_slurs_profanities(body, v, True)
return body

View File

@ -37,7 +37,7 @@ class HatDef(Base):
@lazy
def censored_description(self, v):
return censor_slurs_profanities(self.description, v)
return censor_slurs_profanities(self.description, v, True)
@property
@lazy

View File

@ -316,8 +316,7 @@ class Post(Base):
if not body: return ""
if self.sub != 'chudrama':
body = censor_slurs_profanities(body, v)
body = replace_train_html(body)
body = censor_slurs_profanities(body, v, True)
body = normalize_urls_runtime(body, v)
@ -337,8 +336,7 @@ class Post(Base):
title = self.title
if self.sub != 'chudrama':
title = censor_slurs_profanities(title, v)
title = replace_train_html(title)
title = censor_slurs_profanities(title, v, True)
return title

View File

@ -238,7 +238,7 @@ def push_notif(uids, title, body, url_or_comment):
if len(body) > PUSH_NOTIF_LIMIT:
body = body[:PUSH_NOTIF_LIMIT] + "..."
body = censor_slurs_profanities(body, None)
body = censor_slurs_profanities(body, None, True)
subscriptions = g.db.query(PushSubscription.subscription_json).filter(PushSubscription.user_id.in_(uids)).all()
subscriptions = [x[0] for x in subscriptions]

View File

@ -8,14 +8,19 @@ import gevent_inotifyx as inotify
from files.helpers.config.const import *
ASSET_DIR = 'files/assets'
ASSET_SUBDIRS = ['/css', '/js', '/js/vendor']
ASSET_URL = '/assets/'
ASSET_CACHE = defaultdict(lambda: None)
ASSET_SUBDIRS = ['/css', '/js']
if IS_DKD():
ASSET_SUBDIRS.extend(['/events/DKD/js'])
elif IS_FISTMAS():
ASSET_SUBDIRS.extend(['/events/fistmas/css', '/events/fistmas/css/themes', '/events/fistmas/js', '/events/fistmas/js/vendor'])
ASSET_SUBDIRS.extend(['/events/fistmas/css', '/events/fistmas/js'])
new_dirs = []
for directory in ASSET_SUBDIRS:
new_dirs += [x[0].split(ASSET_DIR)[1] for x in os.walk(f'{ASSET_DIR}{directory}')]
ASSET_SUBDIRS = new_dirs
def assetcache_build(asset_dir, subdirs):
for subdir in subdirs:

View File

@ -185,7 +185,7 @@ def _create_and_delete_orgy():
del g.db
stdout.flush()
requests.get(f'{SITE_FULL}/refresh_chat')
requests.post(f'{SITE_FULL}/refresh_chat')
video_info = ffmpeg.probe(f'/orgies/{get_file()}')
seconds = int(video_info['streams'][0]['duration'])
@ -195,7 +195,7 @@ def _create_and_delete_orgy():
if orgy:
g.db.delete(orgy)
g.db.commit()
requests.get(f'{SITE_FULL}/refresh_chat')
requests.post(f'{SITE_FULL}/refresh_chat')
def _delete_all_posts():
posts = g.db.query(Post).filter_by(author_id=AUTOJANNY_ID, deleted_utc=0).all()

View File

@ -5,12 +5,6 @@ tranny = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain:" titl
trannie = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!marseytrain:" title=":!marseytrain:" src="{SITE_FULL_IMAGES}/e/marseytrain.webp">'
troon = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain2:" title=":marseytrain2:" src="{SITE_FULL_IMAGES}/e/marseytrain2.webp">'
def replace_train_html(body):
body = body.replace(tranny, ':marseytrain:')
body = body.replace(trannie, ':!marseytrain:')
body = body.replace(troon, ':marseytrain2:')
return body
SLURS = {
"tranny": tranny,
"trannie": trannie,
@ -56,8 +50,7 @@ if SITE_NAME == 'rDrama':
"fake and gay": "fake and straight",
"(?<!\w)rapist": "male feminist",
"(?<!\w)pedo(?!\w)": "p-do",
"(?<!\w)kys": "keep yourself safe",
"kys(?!\w)": "keep yourself safe",
"(?<!\w)kys(?!\w)": "keep yourself safe",
"republican": 'rethuglican',
"america": 'ameriKKKa',
"it's almost as if": "I'm an r-slur but",
@ -152,7 +145,7 @@ def sub_matcher_profanities(match):
def censor_slurs_profanities(body, logged_user):
def censor_slurs_profanities(body, logged_user, is_plain=False):
if not body: return ""
if '<pre>' in body or '<code>' in body:
@ -165,4 +158,9 @@ def censor_slurs_profanities(body, logged_user):
if not logged_user or logged_user == 'chat' or logged_user.profanityreplacer:
body = profanity_regex.sub(sub_matcher_profanities, body)
if is_plain:
body = body.replace(tranny, ':marseytrain:')
body = body.replace(trannie, ':!marseytrain:')
body = body.replace(troon, ':marseytrain2:')
return body

View File

@ -1979,7 +1979,7 @@ def start_orgy(v):
g.db.add(orgy)
g.db.commit()
requests.get(f'{SITE_FULL}/refresh_chat')
requests.post(f'{SITE_FULL}/refresh_chat')
return redirect('/chat')
@ -1987,5 +1987,5 @@ def start_orgy(v):
@admin_level_required(PERMS['ORGIES'])
def stop_orgy(v):
g.db.query(Orgy).delete()
requests.get(f'{SITE_FULL}/refresh_chat')
requests.post(f'{SITE_FULL}/refresh_chat')
return {"message": "Orgy stopped successfully!"}

View File

@ -61,7 +61,7 @@ def is_not_banned_socketio(f):
CHAT_ERROR_MESSAGE = f"To prevent spam, you'll need {TRUESCORE_CC_CHAT_MINIMUM} truescore (this is {TRUESCORE_CC_CHAT_MINIMUM} votes, either up or down, on any threads or comments you've made) in order to access chat. Sorry! I love you 💖"
@app.get('/refresh_chat')
@app.post('/refresh_chat')
def refresh_chat():
emit('refresh_chat', namespace='/', to=f'{SITE_FULL}/chat')
return ''
@ -155,7 +155,7 @@ def speak(data, v):
"namecolor": v.name_color,
"patron": v.patron,
"text": text,
"text_censored": censor_slurs_profanities(text, 'chat'),
"text_censored": censor_slurs_profanities(text, 'chat', True),
"text_html": text_html,
"text_html_censored": censor_slurs_profanities(text_html, 'chat'),
"time": int(time.time()),
@ -180,7 +180,7 @@ def speak(data, v):
typing = []
return '', 204
return ''
def refresh_online():
emit("online", [online[request.referrer], muted], room=request.referrer, broadcast=True)
@ -205,7 +205,7 @@ def connect(v):
refresh_online()
emit('typing', typing[request.referrer], room=request.referrer)
return '', 204
return ''
@socketio.on('disconnect')
@auth_required_socketio
@ -225,7 +225,7 @@ def disconnect(v):
refresh_online()
return '', 204
return ''
@socketio.on('typing')
@is_not_banned_socketio
@ -239,7 +239,7 @@ def typing_indicator(data, v):
typing[request.referrer].remove(v.username)
emit('typing', typing[request.referrer], room=request.referrer, broadcast=True)
return '', 204
return ''
@socketio.on('delete')
@ -255,7 +255,7 @@ def delete(id, v):
emit('delete', id, room=request.referrer, broadcast=True)
return '', 204
return ''
def close_running_threads():

View File

@ -67,4 +67,4 @@ def error_500(e):
def allow_nsfw():
session["over_18_cookies"] = int(time.time()) + 3600
redir = request.values.get("redir", "/")
return '', 204
return ''

View File

@ -380,7 +380,7 @@ def mobile_app(v):
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400)
def dismiss_mobile_tip():
session["tooltip_dismissed"] = int(time.time())
return "", 204
return ''
@app.get("/transfers/<int:id>")
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400)

View File

@ -1399,7 +1399,7 @@ def subscribed_posts(v, username):
@auth_required
def fp(v, fp):
if session.get("GLOBAL"):
return '', 204
return ''
v.fp = fp
users = g.db.query(User).filter(User.fp == fp, User.id != v.id).all()
@ -1416,7 +1416,7 @@ def fp(v, fp):
check_for_alts(v, include_current_session=True)
g.db.add(v)
return '', 204
return ''
@app.post("/toggle_pins/<sub>/<sort>")
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400)

View File

@ -62,7 +62,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
imlazy = 0
if existing and existing.vote_type == new: return "", 204
if existing and existing.vote_type == new: return ''
if existing:
if existing.vote_type == 0 and new != 0:
imlazy = 1
@ -178,7 +178,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
target.author.pay_account('coins', coin_value)
target.author.truescore += coin_delta
return "", 204
return ''
@app.get("/votes/<link>")
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400)

View File

@ -36,7 +36,7 @@
<input id="admin_level" hidden value="{{v.admin_level}}">
<input id="blocked_user_ids" hidden value="{{(v.userblocks|string)[1:-1]}}">
<script defer src="{{'js/vendor/socketio.js' | asset}}"></script>
<script defer src="{{'js/chat.js' | asset}}"></script>
<script defer src="{{'js/vendor/lozad.js' | asset}}"></script>
<script defer src="{{'js/vendor/lite-youtube.js' | asset}}"></script>
<script defer src="{{'js/chat.js' | asset}}"></script>
{% endblock %}

View File

@ -27,7 +27,6 @@
<track label="English" kind="subtitles" srclang="en" src="/assets/subtitles.vtt?v={{subtitles_hash}}" default>
</video>
<video id="break-file" class="d-none" controls preload="none" src="/assets/break.mp4" data-run="0"></video>
<script defer src="{{'js/orgy_file.js' | asset}}"></script>
{% endif %}
</p>
</div>
@ -53,7 +52,8 @@
<input id="admin_level" hidden value="{{v.admin_level}}">
<input id="blocked_user_ids" hidden value="{{(v.userblocks|string)[1:-1]}}">
<script defer src="{{'js/vendor/socketio.js' | asset}}"></script>
<script defer src="{{'js/chat.js' | asset}}"></script>
<script defer src="{{'js/vendor/lozad.js' | asset}}"></script>
<script defer src="{{'js/vendor/lite-youtube.js' | asset}}"></script>
<script defer src="{{'js/chat.js' | asset}}"></script>
<script defer src="{{'js/orgy.js' | asset}}"></script>
{% endblock %}

View File

@ -92,69 +92,79 @@
</h1>
{% if not v_forbid_deleted %}
<div id="post-body" class="post-body mt-3 {% if p.award_count('tilt', v) %}tilt-post{% endif %}">
{% if p.realurl(v) and not p.is_image and not p.is_video and not p.is_audio %}
<a rel="nofollow noopener" href="{{p.realurl(v)}}" {% if not v or v.newtabexternal %}target="_blank"{% endif %}>
<div class="d-flex justify-content-between align-items-center border rounded p-2 mb-3">
<span>{{p.realurl(v)}}</span>
<i class="fas fa-external-link-alt text-small"></i>
</div>
</a>
{% endif %}
{% if p.embed %}
{% if p.domain == "twitter.com" %}
{{p.embed | safe}}
{% if v and v.theme in LIGHT_THEMES %}
<script defer src="{{'js/vendor/twitterlight.js' | asset}}"></script>
{% else %}
<script defer src="{{'js/vendor/twitter.js' | asset}}"></script>
{% endif %}
{% elif p.domain in ['youtu.be','youtube.com'] and p.embed and p.embed.startswith('<lite-youtube') %}
<p class="resizable yt" style="width:100%">
<div id="post-body" class="post-body mt-3 {% if p.award_count('tilt', v) %}tilt-post{% endif %}">
{% if p.realurl(v) and not p.is_image and not p.is_video and not p.is_audio %}
<a rel="nofollow noopener" href="{{p.realurl(v)}}" {% if not v or v.newtabexternal %}target="_blank"{% endif %}>
<div class="d-flex justify-content-between align-items-center border rounded p-2 mb-3">
<span>{{p.realurl(v)}}</span>
<i class="fas fa-external-link-alt text-small"></i>
</div>
</a>
{% endif %}
{% if p.embed %}
{% if p.domain == "twitter.com" %}
{{p.embed | safe}}
</p>
{% if v and v.theme in LIGHT_THEMES %}
<script defer src="{{'js/vendor/twitterlight.js' | asset}}"></script>
{% else %}
<script defer src="{{'js/vendor/twitter.js' | asset}}"></script>
{% endif %}
{% elif p.domain in ['youtu.be','youtube.com'] and p.embed and p.embed.startswith('<lite-youtube') %}
<p class="resizable yt" style="width:100%">
{{p.embed | safe}}
</p>
{% else %}
<div id="crosspost-embed" class="mb-3">
<div class="row no-gutters">
<div id="frontpage" class="col-12 pt-0">
<div class="posts">
{{p.embed | post_embed(v) | safe}}
</div>
</div>
</div>
</div>
{% endif %}
{% endif %}
{% endif %}
<div id="post-text" class="{% if p.chudded %}text-uppercase chud-img chud-{{p.id_last_num}}{% endif %} {% if p.rainbowed %}rainbow-text{% endif %} {% if p.queened %}queen{% endif %} {% if p.sharpened %}sharpen chud-img sharpen-{{p.id_last_num}}{% endif %}">
{% if p.is_image %}
<div class="row no-gutters mb-4">
<div class="col">
<a {% if not v or v.newtabexternal %}target="_blank"{% endif %} rel="nofollow noopener" href="{{p.realurl(v)}}">
<img loading="lazy" data-nonce="{{g.nonce}}" data-onclick="expandImage()" src="{{p.realurl(v)}}" class="post-linked-img" alt="Unable to load image">
</a>
</div>
</div>
{% elif p.is_video %}
<div class="row no-gutters mb-4">
<div class="col">
<p class="resizable">
<video {% if p.poster_url %}poster="{{p.poster_url}}"{% endif %} controls preload="none" src="{{p.realurl(v)}}"></video>
</p>
</div>
</div>
{% elif p.is_audio %}
<div class="row no-gutters mb-4">
<div class="col">
<audio controls preload="none" src="{{p.realurl(v)}}"></audio>
</div>
</div>
{% endif %}
{{p.realbody(v) | safe}}
<div id="post-text" class="{% if p.chudded %}text-uppercase chud-img chud-{{p.id_last_num}}{% endif %} {% if p.rainbowed %}rainbow-text{% endif %} {% if p.queened %}queen{% endif %} {% if p.sharpened %}sharpen chud-img sharpen-{{p.id_last_num}}{% endif %}">
{% if p.is_image %}
<div class="row no-gutters mb-4">
<div class="col">
<a {% if not v or v.newtabexternal %}target="_blank"{% endif %} rel="nofollow noopener" href="{{p.realurl(v)}}">
<img loading="lazy" data-nonce="{{g.nonce}}" data-onclick="expandImage()" src="{{p.realurl(v)}}" class="post-linked-img" alt="Unable to load image">
</a>
</div>
</div>
{% elif p.is_video %}
<div class="row no-gutters mb-4">
<div class="col">
<p class="resizable">
<video {% if p.poster_url %}poster="{{p.poster_url}}"{% endif %} controls preload="none" src="{{p.realurl(v)}}"></video>
</p>
</div>
</div>
{% elif p.is_audio %}
<div class="row no-gutters mb-4">
<div class="col">
<audio controls preload="none" src="{{p.realurl(v)}}"></audio>
</div>
</div>
{% endif %}
{{p.realbody(v) | safe}}
{% if p.is_banned %}
<div class="text-removed mb-0">Removed by @{{p.ban_reason}} (Site Admin)</div>
{% if p.is_banned %}
<div class="text-removed mb-0">Removed by @{{p.ban_reason}} (Site Admin)</div>
{% endif %}
</div>
{% if not p.ghost %}
{{p.author.rendered_sig(v) | safe}}
{% endif %}
</div>
{% if not p.ghost %}
{{p.author.rendered_sig(v) | safe}}
{% endif %}
</div>
{% else %}
<div id="post-body" class="post-body mt-3">
<div id="post-text"><code>[Deleted by author.]</code></div>
</div>
<div id="post-body" class="post-body mt-3">
<div id="post-text"><code>[Deleted by author.]</code></div>
</div>
{% endif %}
{% if v and v.can_edit(p) and not v.is_suspended %}
@ -176,58 +186,46 @@
<div id="post-edit-{{p.id}}" class="preview mb-3 mt-5"></div>
</div>
{% endif %}
{% if p.embed and "http" not in p.embed and "<" not in p.embed %}
<div id="crosspost-embed" class="mb-3">
<div class="row no-gutters">
<div id="frontpage" class="col-12 pt-0">
<div class="posts">
{{p.embed | post_embed(v) | safe}}
</div>
</div>
</div>
</div>
{% endif %}
<div class="d-none d-md-flex justify-content-between align-items-center mt-2">
<div class="post-actions mt-2">
<ul class="list-inline text-right d-flex">
<a class="list-inline-item" {% if v and v.newtab %}data-target="t" target="_blank"{% endif %} href="{{p.permalink}}">
<i class="fas fa-comment-dots mr-2"></i>{{p.comment_count}}
<span class="text-info d-none {{p.id}}-new-comments"></span>
</a>
<div class="d-none d-md-flex justify-content-between align-items-center mt-2">
<div class="post-actions mt-2">
<ul class="list-inline text-right d-flex">
<a class="list-inline-item" {% if v and v.newtab %}data-target="t" target="_blank"{% endif %} href="{{p.permalink}}">
<i class="fas fa-comment-dots mr-2"></i>{{p.comment_count}}
<span class="text-info d-none {{p.id}}-new-comments"></span>
</a>
{% if v and v.can_edit(p) %}
<button type="button" class="list-inline-item" data-nonce="{{g.nonce}}" data-onclick="togglePostEdit('{{p.id}}')"><i class="fas fa-edit"></i>Edit</button>
{% elif v and v.id != p.author_id and p.body and not v_forbid_deleted %}
<button type="button" class="list-inline-item" data-nonce="{{g.nonce}}" data-onclick="expandMarkdown('{{p.fullname}}')"><i class="fas text-expand-icon-{{p.fullname}} fa-expand-alt"></i><span class="expand-text-{{p.fullname}}">View source</span></button>
{% endif %}
{% if v and v.can_edit(p) %}
<button type="button" class="list-inline-item" data-nonce="{{g.nonce}}" data-onclick="togglePostEdit('{{p.id}}')"><i class="fas fa-edit"></i>Edit</button>
{% elif v and v.id != p.author_id and p.body and not v_forbid_deleted %}
<button type="button" class="list-inline-item" data-nonce="{{g.nonce}}" data-onclick="expandMarkdown('{{p.fullname}}')"><i class="fas text-expand-icon-{{p.fullname}} fa-expand-alt"></i><span class="expand-text-{{p.fullname}}">View source</span></button>
{% endif %}
{% include 'post_actions.html' %}
</ul>
{% include 'post_actions.html' %}
</ul>
</div>
</div>
</div>
{% if v %}
<div id="voting" class="voting d-mob-none mb-auto mt-1">
<div tabindex="0" data-nonce="{{g.nonce}}" data-onclick="vote('post', '{{p.id}}', '1')" class="post-{{p.id}}-up mx-auto arrow-up upvote-button post-{{p.id}}-up {% if voted==1 %}active{% endif %}"></div>
<span class="post-score-{{p.id}} score post-score-{{p.id}} {% if voted==1 %}score-up{% elif voted==-1 %}score-down{% endif %}{% if p.controversial %} controversial{% endif %}" data-bs-toggle="tooltip" data-bs-placement="right" title="+{{ups}} | -{{downs}}" style="cursor: default">{{score}}</span>
<div {% if DISABLE_DOWNVOTES %}style="display:None!important"{% endif %} tabindex="0" data-nonce="{{g.nonce}}" data-onclick="vote('post', '{{p.id}}', '-1')" class="post-{{p.id}}-down text-muted mx-auto arrow-down downvote-button post-{{p.id}}-down {% if voted==-1 %}active{% endif %}"></div>
</div>
{% else %}
<div id="voting" class="voting d-mob-none mb-auto mt-1">
<a tabindex="0" class="post-{{p.id}}-up arrow-up mx-auto" href="/login?redirect={{request.full_path | urlencode}}">
</a>
<span class="post-{{p.id}}-score-none score text-muted{% if p.controversial %} controversial{% endif %}"{% if not p.is_banned %} data-bs-toggle="tooltip" data-bs-placement="right" title="+{{ups}} | -{{downs}}"{% endif %}style="cursor: default">{{score}}</span>
<a {% if DISABLE_DOWNVOTES %}style="display:None!important"{% endif %} tabindex="0" data-nonce="{{g.nonce}}" data-onclick="vote('post', '{{p.id}}', '-1')" class="post-{{p.id}}-down arrow-down mx-auto" href="/login?redirect={{request.full_path | urlencode}}"></a>
</div>
{% endif %}
</div>
{% if v %}
<div id="voting" class="voting d-mob-none mb-auto mt-1">
<div tabindex="0" data-nonce="{{g.nonce}}" data-onclick="vote('post', '{{p.id}}', '1')" class="post-{{p.id}}-up mx-auto arrow-up upvote-button post-{{p.id}}-up {% if voted==1 %}active{% endif %}"></div>
<span class="post-score-{{p.id}} score post-score-{{p.id}} {% if voted==1 %}score-up{% elif voted==-1 %}score-down{% endif %}{% if p.controversial %} controversial{% endif %}" data-bs-toggle="tooltip" data-bs-placement="right" title="+{{ups}} | -{{downs}}" style="cursor: default">{{score}}</span>
<div {% if DISABLE_DOWNVOTES %}style="display:None!important"{% endif %} tabindex="0" data-nonce="{{g.nonce}}" data-onclick="vote('post', '{{p.id}}', '-1')" class="post-{{p.id}}-down text-muted mx-auto arrow-down downvote-button post-{{p.id}}-down {% if voted==-1 %}active{% endif %}"></div>
</div>
{% else %}
<div id="voting" class="voting d-mob-none mb-auto mt-1">
<a tabindex="0" class="post-{{p.id}}-up arrow-up mx-auto" href="/login?redirect={{request.full_path | urlencode}}">
</a>
<span class="post-{{p.id}}-score-none score text-muted{% if p.controversial %} controversial{% endif %}"{% if not p.is_banned %} data-bs-toggle="tooltip" data-bs-placement="right" title="+{{ups}} | -{{downs}}"{% endif %}style="cursor: default">{{score}}</span>
<a {% if DISABLE_DOWNVOTES %}style="display:None!important"{% endif %} tabindex="0" data-nonce="{{g.nonce}}" data-onclick="vote('post', '{{p.id}}', '-1')" class="post-{{p.id}}-down arrow-down mx-auto" href="/login?redirect={{request.full_path | urlencode}}"></a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<div class="row mb-3 d-md-none">
<div class="col-12">

View File

@ -6,6 +6,7 @@
{% endif %}
{% set ns = namespace() %}
{% set pfp = u.highres if (u.highres and u.can_see_my_shit) else u.profile_url %}
{% block desktopUserBanner %}
<div class="row d-mob-none">
@ -16,10 +17,10 @@
<div class="container-fluid nobackground">
<div class="d-md-flex text-center text-md-left">
<div id="profile--pfp" {% if u.hat_active(v)[0] %}class="profile--pfp--hat hat"{% endif %}>
<a rel="nofollow noopener" href="{% if u.highres and u.can_see_my_shit %}{{u.highres}}{% else %}{{u.profile_url}}{% endif %}" class="profile-pic-100-wrapper">
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{% if u.highres and u.can_see_my_shit %}{{u.highres}}{% else %}{{u.profile_url}}{% endif %}')" loading="lazy" src="{{u.profile_url}}" class="profile-pic profile-pic-100 mb-5">
<a rel="nofollow noopener" href="{{pfp}}" class="profile-pic-100-wrapper">
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{{pfp}}')" loading="lazy" src="{{pfp}}" class="profile-pic profile-pic-100 mb-5">
{% if u.hat_active(v)[0] -%}
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{% if u.highres and u.can_see_my_shit %}{{u.highres}}{% else %}{{u.profile_url}}{% endif %}')" class="profile-pic-100-hat hat" loading="lazy" src="{{u.hat_active(v)[0]}}?x=6" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{u.hat_active(v)[1]}}">
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{{pfp}}')" class="profile-pic-100-hat hat" loading="lazy" src="{{u.hat_active(v)[0]}}?x=6" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{u.hat_active(v)[1]}}">
{%- endif %}
</a>
</div>
@ -303,10 +304,10 @@
<div class="row border-bottom">
<div class="col">
<div style="margin-top: -34px" id="profile-mobile--pfp">
<a rel="nofollow noopener" href="{% if u.highres and u.can_see_my_shit %}{{u.highres}}{% else %}{{u.profile_url}}{% endif %}" class="profile-pic-65-wrapper">
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{% if u.highres and u.can_see_my_shit %}{{u.highres}}{% else %}{{u.profile_url}}{% endif %}')" loading="lazy" src="{{u.profile_url}}" class="profile-pic-65 bg-white mb-2">
<a rel="nofollow noopener" href="{{pfp}}" class="profile-pic-65-wrapper">
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{{pfp}}')" loading="lazy" src="{{pfp}}" class="profile-pic-65 bg-white mb-2">
{% if u.hat_active(v)[0] -%}
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{% if u.highres and u.can_see_my_shit %}{{u.highres}}{% else %}{{u.profile_url}}{% endif %}')" class="profile-pic-65-hat hat" loading="lazy" src="{{u.hat_active(v)[0]}}?x=6">
<img data-nonce="{{g.nonce}}" data-onclick="expandImage('{{pfp}}')" class="profile-pic-65-hat hat" loading="lazy" src="{{u.hat_active(v)[0]}}?x=6">
{%- endif %}
</a>
</div>

View File

@ -105,9 +105,9 @@
{% endif %}
{% if include_user_css and not IS_FISTMAS() %}
{% if v.theme == 'classic_dark' %}
<link rel="stylesheet" href="{{('css/classic.css') | asset}}">
<link rel="stylesheet" href="{{('css/themes/classic.css') | asset}}">
{% endif %}
<link rel="stylesheet" href="{{('css/'~v.theme~'.css') | asset}}">
<link rel="stylesheet" href="{{('css/themes/'~v.theme~'.css') | asset}}">
{% if (v.css or v.background) and not request.path.startswith('/settings') %}
<link rel="stylesheet" href="/@{{v.username}}/css">
{% endif %}
@ -115,10 +115,10 @@
<link rel="stylesheet" href="{{('css/30409f.css') | asset}}">
{% endif %}
{% else %}
<link rel="stylesheet" href="{{('css/'~DEFAULT_THEME~'.css') | asset}}">
<link rel="stylesheet" href="{{('css/themes/'~DEFAULT_THEME~'.css') | asset}}">
{% endif %}
{% else %}
<link rel="stylesheet" href="{{('css/'~DEFAULT_THEME~'.css') | asset}}">
<link rel="stylesheet" href="{{('css/themes/'~DEFAULT_THEME~'.css') | asset}}">
{% endif %}
<link rel="stylesheet" href="{{'css/awards.css' | asset}}">

View File

@ -25,6 +25,8 @@ server {
include includes/headers;
}
location /refresh_chat {
allow 127.0.0.1;
deny all;
proxy_pass http://localhost:5001/refresh_chat;
include includes/headers;
}

View File

@ -4502,3 +4502,5 @@ https://i.rdrama.net/images/16955910947466805.webp
https://i.rdrama.net/images/16956126921889853.webp
{[para]}
https://i.rdrama.net/images/1695656308406325.webp
{[para]}
https://i.rdrama.net/images/16957344461694555.webp