Merge branch 'master' into use-ffmpeg-python
commit
e114311802
|
@ -1,5 +1,4 @@
|
|||
@charset "UTF-8";
|
||||
|
||||
:root {
|
||||
--dark: #3E2C18;
|
||||
--secondary: #FFE;
|
|
@ -1,4 +1,5 @@
|
|||
:root {
|
||||
color-scheme: dark;
|
||||
--muted: #999;
|
||||
--black: #999;
|
||||
--background: 34, 34, 34;
|
|
@ -1,6 +1,7 @@
|
|||
@charset "UTF-8";
|
||||
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
--dark: #383838;
|
||||
--secondary: #383838;
|
||||
--white: #E1E1E1;
|
|
@ -1,4 +1,5 @@
|
|||
:root {
|
||||
color-scheme: dark;
|
||||
--white: #E1E1E1;
|
||||
--black: #94a3b8;
|
||||
--primary: #0284c7;
|
|
@ -1,6 +1,7 @@
|
|||
@charset "UTF-8";
|
||||
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
--dark: #505961;
|
||||
--secondary: #505961;
|
||||
--white: #c9d1d9;
|
|
@ -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 |
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
});
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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!"}
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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 ''
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}}">
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue