forked from rDrama/rDrama
1
0
Fork 0

Merge branch 'frost' into rudolph

master
kek7198 2021-12-18 14:08:45 -06:00
commit af8c2e3001
46 changed files with 262 additions and 302 deletions

View File

@ -54,7 +54,6 @@ app.config["SPAM_SIMILAR_COUNT_THRESHOLD"] = int(environ.get("SPAM_SIMILAR_COUNT
app.config["SPAM_URL_SIMILARITY_THRESHOLD"] = float(environ.get("SPAM_URL_SIMILARITY_THRESHOLD", 0.5)) app.config["SPAM_URL_SIMILARITY_THRESHOLD"] = float(environ.get("SPAM_URL_SIMILARITY_THRESHOLD", 0.5))
app.config["COMMENT_SPAM_SIMILAR_THRESHOLD"] = float(environ.get("COMMENT_SPAM_SIMILAR_THRESHOLD", 0.5)) app.config["COMMENT_SPAM_SIMILAR_THRESHOLD"] = float(environ.get("COMMENT_SPAM_SIMILAR_THRESHOLD", 0.5))
app.config["COMMENT_SPAM_COUNT_THRESHOLD"] = int(environ.get("COMMENT_SPAM_COUNT_THRESHOLD", 0.5)) app.config["COMMENT_SPAM_COUNT_THRESHOLD"] = int(environ.get("COMMENT_SPAM_COUNT_THRESHOLD", 0.5))
app.config["VIDEO_COIN_REQUIREMENT"] = int(environ.get("VIDEO_COIN_REQUIREMENT", 0))
app.config["READ_ONLY"]=bool(int(environ.get("READ_ONLY", "0"))) app.config["READ_ONLY"]=bool(int(environ.get("READ_ONLY", "0")))
app.config["BOT_DISABLE"]=bool(int(environ.get("BOT_DISABLE", False))) app.config["BOT_DISABLE"]=bool(int(environ.get("BOT_DISABLE", False)))
app.config["RATELIMIT_KEY_PREFIX"] = "flask_limiting_" app.config["RATELIMIT_KEY_PREFIX"] = "flask_limiting_"

View File

@ -397,6 +397,11 @@ class Submission(Base):
return title return title
@property
@lazy
def is_video(self):
return self.url and any((self.url.lower().endswith(x) for x in ('.mp4','.webm','.mov')))
@property @property
@lazy @lazy
def is_image(self): def is_image(self):

View File

@ -198,7 +198,7 @@ def sanitize(sanitized, noimages=False):
elif path.isfile(f'files/assets/images/emojis/{emoji}.webp'): elif path.isfile(f'files/assets/images/emojis/{emoji}.webp'):
sanitized = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emoji" src="/assets/images/emojis/{emoji}.webp">', sanitized, flags=re.I) sanitized = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emoji" src="/assets/images/emojis/{emoji}.webp">', sanitized, flags=re.I)
sanitized = sanitized.replace("https://www.", "https://").replace("https://youtu.be/", "https://youtube.com/watch?v=").replace("https://music.youtube.com/watch?v=", "https://youtube.com/watch?v=").replace("https://open.spotify.com/", "https://open.spotify.com/embed/").replace("https://streamable.com/", "https://streamable.com/e/").replace("https://youtube.com/shorts/", "https://youtube.com/watch?v=").replace("https://mobile.twitter", "https://twitter").replace("https://m.facebook", "https://facebook").replace("https://m.wikipedia", "https://wikipedia").replace("https://m.youtube", "https://youtube") sanitized = sanitized.replace("https://www.", "https://").replace("https://youtu.be/", "https://youtube.com/watch?v=").replace("https://music.youtube.com/watch?v=", "https://youtube.com/watch?v=").replace("https://open.spotify.com/", "https://open.spotify.com/embed/").replace("https://streamable.com/", "https://streamable.com/e/").replace("https://youtube.com/shorts/", "https://youtube.com/watch?v=").replace("https://mobile.twitter", "https://twitter").replace("https://m.facebook", "https://facebook").replace("m.wikipedia.org", "wikipedia.org").replace("https://m.youtube", "https://youtube")
if "https://youtube.com/watch?v=" in sanitized: sanitized = sanitized.replace("?t=", "&t=") if "https://youtube.com/watch?v=" in sanitized: sanitized = sanitized.replace("?t=", "&t=")
@ -216,8 +216,8 @@ def sanitize(sanitized, noimages=False):
htmlsource += '"></lite-youtube>' htmlsource += '"></lite-youtube>'
sanitized = sanitized.replace(replacing, htmlsource) sanitized = sanitized.replace(replacing, htmlsource)
for i in re.finditer('<p>(https:.*?\.(mp4|webm))</p>', sanitized): for i in re.finditer('>(https://.*?\.(mp4|webm|mov))</a></p>', sanitized):
sanitized = sanitized.replace(i.group(0), f'<p><video controls preload="none" class="embedvid"><source src="{i.group(1)}" type="video/{i.group(2)}"></video>') sanitized = sanitized.replace(f'<p><a href="{i.group(1)}" rel="nofollow noopener noreferrer" target="_blank">{i.group(1)}</a></p>', f'<p><video controls preload="none" class="embedvid"><source src="{i.group(1)}" type="video/{i.group(2)}"></video>')
for rd in ["https://reddit.com/", "https://new.reddit.com/", "https://www.reddit.com/", "https://redd.it/"]: for rd in ["https://reddit.com/", "https://new.reddit.com/", "https://www.reddit.com/", "https://redd.it/"]:
sanitized = sanitized.replace(rd, "https://old.reddit.com/") sanitized = sanitized.replace(rd, "https://old.reddit.com/")

View File

@ -18,8 +18,7 @@ def get_logged_in_user():
nonce = session.get("login_nonce", 0) nonce = session.get("login_nonce", 0)
logged_in = session.get("logged_in") logged_in = session.get("logged_in")
if not uid: return None if not uid or not logged_in or uid != logged_in: return None
# if not uid or not logged_in or uid != logged_in: return None
try: try:
if g.db: v = g.db.query(User).filter_by(id=uid).first() if g.db: v = g.db.query(User).filter_by(id=uid).first()

View File

@ -10,10 +10,12 @@ from pusher_push_notifications import PushNotifications
from flask import * from flask import *
from files.__main__ import app, limiter from files.__main__ import app, limiter
from files.helpers.sanitize import filter_emojis_only from files.helpers.sanitize import filter_emojis_only
import requests
site = environ.get("DOMAIN").strip() site = environ.get("DOMAIN").strip()
if site == 'pcmemes.net': cc = "SPLASH MOUNTAIN" if site == 'pcmemes.net': cc = "SPLASH MOUNTAIN"
else: cc = "COUNTRY CLUB" else: cc = "COUNTRY CLUB"
CATBOX_KEY = environ.get("CATBOX_KEY").strip()
beams_client = PushNotifications( beams_client = PushNotifications(
instance_id=PUSHER_INSTANCE_ID, instance_id=PUSHER_INSTANCE_ID,
@ -190,13 +192,17 @@ def api_comment(v):
if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1": if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1":
file=request.files["file"] file=request.files["file"]
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400 if file.content_type.startswith('image/'):
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' file.save(name)
file.save(name) url = process_image(name)
url = process_image(name) body += f"\n\n![]({url})"
elif file.content_type.startswith('video/'):
body += f"\n\n![]({url})" file.save("video.mp4")
with open("video.mp4", 'rb') as f:
url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {CATBOX_KEY}'}, files=[('video', f)]).json()['data']['link']
body += f"\n\n{url}"
else: return {"error": f"Image/Video files only"}, 400
if v.agendaposter and not v.marseyawarded: if v.agendaposter and not v.marseyawarded:
for k, l in AJ_REPLACEMENTS.items(): body = body.replace(k, l) for k, l in AJ_REPLACEMENTS.items(): body = body.replace(k, l)
@ -720,13 +726,18 @@ def edit_comment(cid, v):
if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1": if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1":
file=request.files["file"] file=request.files["file"]
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400 if file.content_type.startswith('image/'):
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
file.save(name)
url = process_image(name)
body += f"\n\n![]({url})"
elif file.content_type.startswith('video/'):
file.save("video.mp4")
with open("video.mp4", 'rb') as f:
url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {CATBOX_KEY}'}, files=[('video', f)]).json()['data']['link']
body += f"\n\n{url}"
else: return {"error": f"Image/Video files only"}, 400
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
file.save(name)
url = process_image(name)
body += f"\n\n![]({url})"
body_md = CustomRenderer().render(mistletoe.Document(body)) body_md = CustomRenderer().render(mistletoe.Document(body))
body_html = sanitize(body_md) body_html = sanitize(body_md)

View File

@ -123,9 +123,6 @@ def notifications(v):
@auth_desired @auth_desired
def front_all(v): def front_all(v):
if request.host == 'old.rdrama.net' and not (v and (v.admin_level or v.patron)):
return render_template("home.html", v=v, listing=[], next_exists=False, sort='hot', t='all', page=1)
if not v and request.path == "/" and not request.headers.get("Authorization"): return redirect(f"/logged_out{request.full_path}") if not v and request.path == "/" and not request.headers.get("Authorization"): return redirect(f"/logged_out{request.full_path}")
if v and v.is_banned and not v.unban_utc: return render_template('errors/500.html', error=True, v=v), 500 if v and v.is_banned and not v.unban_utc: return render_template('errors/500.html', error=True, v=v), 500

View File

@ -18,6 +18,7 @@ from PIL import Image as PILimage
from .front import frontlist, changeloglist from .front import frontlist, changeloglist
from urllib.parse import ParseResult, urlunparse, urlparse, quote from urllib.parse import ParseResult, urlunparse, urlparse, quote
from os import path from os import path
import requests
site = environ.get("DOMAIN").strip() site = environ.get("DOMAIN").strip()
site_name = environ.get("SITE_NAME").strip() site_name = environ.get("SITE_NAME").strip()
@ -420,13 +421,17 @@ def edit_post(pid, v):
if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1": if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1":
file=request.files["file"] file=request.files["file"]
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400 if file.content_type.startswith('image/'):
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' file.save(name)
file.save(name) url = process_image(name)
url = process_image(name) body += f"\n\n![]({url})"
elif file.content_type.startswith('video/'):
body += f"\n\n![]({url})" file.save("video.mp4")
with open("video.mp4", 'rb') as f:
url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {CATBOX_KEY}'}, files=[('video', f)]).json()['data']['link']
body += f"\n\n{url}"
else: return {"error": f"Image/Video files only"}, 400
if body != p.body: if body != p.body:
for i in re.finditer('^(https:\/\/.*\.(png|jpg|jpeg|gif|webp|PNG|JPG|JPEG|GIF|WEBP|9999))', body, re.MULTILINE): for i in re.finditer('^(https:\/\/.*\.(png|jpg|jpeg|gif|webp|PNG|JPG|JPEG|GIF|WEBP|9999))', body, re.MULTILINE):
@ -743,7 +748,7 @@ def submit_post(v):
for rd in ["https://reddit.com/", "https://new.reddit.com/", "https://www.reddit.com/", "https://redd.it/"]: for rd in ["https://reddit.com/", "https://new.reddit.com/", "https://www.reddit.com/", "https://redd.it/"]:
url = url.replace(rd, "https://old.reddit.com/") url = url.replace(rd, "https://old.reddit.com/")
url = url.replace("old.reddit.com/gallery", "new.reddit.com/gallery").replace("https://youtu.be/", "https://youtube.com/watch?v=").replace("https://music.youtube.com/watch?v=", "https://youtube.com/watch?v=").replace("https://open.spotify.com/", "https://open.spotify.com/embed/").replace("https://streamable.com/", "https://streamable.com/e/").replace("https://youtube.com/shorts/", "https://youtube.com/watch?v=").replace("https://mobile.twitter", "https://twitter").replace("https://m.facebook", "https://facebook").replace("https://m.wikipedia", "https://wikipedia").replace("https://m.youtube", "https://youtube").replace("https://www.youtube", "https://youtube") url = url.replace("old.reddit.com/gallery", "new.reddit.com/gallery").replace("https://youtu.be/", "https://youtube.com/watch?v=").replace("https://music.youtube.com/watch?v=", "https://youtube.com/watch?v=").replace("https://open.spotify.com/", "https://open.spotify.com/embed/").replace("https://streamable.com/", "https://streamable.com/e/").replace("https://youtube.com/shorts/", "https://youtube.com/watch?v=").replace("https://mobile.twitter", "https://twitter").replace("https://m.facebook", "https://facebook").replace("m.wikipedia.org", "wikipedia.org").replace("https://m.youtube", "https://youtube").replace("https://www.youtube", "https://youtube")
if url.startswith("https://streamable.com/") and not url.startswith("https://streamable.com/e/"): url = url.replace("https://streamable.com/", "https://streamable.com/e/") if url.startswith("https://streamable.com/") and not url.startswith("https://streamable.com/e/"): url = url.replace("https://streamable.com/", "https://streamable.com/e/")
@ -916,13 +921,18 @@ def submit_post(v):
if request.files.get("file2") and request.headers.get("cf-ipcountry") != "T1": if request.files.get("file2") and request.headers.get("cf-ipcountry") != "T1":
file=request.files["file2"] file=request.files["file2"]
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400 if file.content_type.startswith('image/'):
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' file.save(name)
file.save(name) body += f"\n\n![]({url})"
url = process_image(name) elif file.content_type.startswith('video/'):
file.save("video.mp4")
body += f"\n\n![]({url})" with open("video.mp4", 'rb') as f:
url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {CATBOX_KEY}'}, files=[('video', f)]).json()['data']['link']
body += f"\n\n{url}"
else:
if request.headers.get("Authorization"): return {"error": f"Image/Video files only"}, 400
else: return render_template("submit.html", v=v, error=f"Image/Video files only."), 400
body_html = sanitize(CustomRenderer().render(mistletoe.Document(body))) body_html = sanitize(CustomRenderer().render(mistletoe.Document(body)))
@ -1003,20 +1013,6 @@ def submit_post(v):
if request.headers.get("Authorization"): return {"error": f"File type not allowed"}, 400 if request.headers.get("Authorization"): return {"error": f"File type not allowed"}, 400
else: return render_template("submit.html", v=v, error=f"File type not allowed.", title=title, body=request.values.get("body", "")), 400 else: return render_template("submit.html", v=v, error=f"File type not allowed.", title=title, body=request.values.get("body", "")), 400
if file.content_type.startswith('video/') and v.truecoins < app.config["VIDEO_COIN_REQUIREMENT"] and v.admin_level < 1:
if request.headers.get("Authorization"):
return {
"error": f"You need at least {app.config['VIDEO_COIN_REQUIREMENT']} coins to upload videos"
}, 403
else:
return render_template(
"submit.html",
v=v,
error=f"You need at least {app.config['VIDEO_COIN_REQUIREMENT']} coins to upload videos.",
title=title,
body=request.values.get("body", "")
), 403
if file.content_type.startswith('image/'): if file.content_type.startswith('image/'):
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
file.save(name) file.save(name)
@ -1025,7 +1021,7 @@ def submit_post(v):
elif file.content_type.startswith('video/'): elif file.content_type.startswith('video/'):
file.save("video.mp4") file.save("video.mp4")
with open("video.mp4", 'rb') as f: with open("video.mp4", 'rb') as f:
new_post.url = requests.post('https://catbox.moe/user/api.php', timeout=5, data={'userhash':CATBOX_KEY, 'reqtype':'fileupload'}, files={'fileToUpload':f}).text url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {CATBOX_KEY}'}, files=[('video', f)]).json()['data']['link']
g.db.add(new_post) g.db.add(new_post)

View File

@ -22,6 +22,7 @@ YOUTUBE_KEY = environ.get("YOUTUBE_KEY", "").strip()
COINS_NAME = environ.get("COINS_NAME").strip() COINS_NAME = environ.get("COINS_NAME").strip()
GUMROAD_TOKEN = environ.get("GUMROAD_TOKEN", "").strip() GUMROAD_TOKEN = environ.get("GUMROAD_TOKEN", "").strip()
SITE_NAME = environ.get("SITE_NAME", "").strip() SITE_NAME = environ.get("SITE_NAME", "").strip()
CATBOX_KEY = environ.get("CATBOX_KEY").strip()
tiers={ tiers={
"(Paypig)": 1, "(Paypig)": 1,
@ -116,50 +117,6 @@ def settings_profile_post(v):
updated = True updated = True
v.is_nofollow = request.values.get("nofollow", None) == 'true' v.is_nofollow = request.values.get("nofollow", None) == 'true'
elif request.values.get("bio") or request.files.get('file') and request.headers.get("cf-ipcountry") != "T1":
bio = request.values.get("bio")[:1500]
for i in re.finditer('^(https:\/\/.*\.(png|jpg|jpeg|gif|webp|PNG|JPG|JPEG|GIF|WEBP|9999))', bio, re.MULTILINE):
if "wikipedia" not in i.group(1): bio = bio.replace(i.group(1), f'![]({i.group(1)})')
if request.files.get('file'):
file = request.files['file']
if not file.content_type.startswith('image/'):
if request.headers.get("Authorization"): return {"error": f"Image files only"}, 400
else: return render_template("settings_profile.html", v=v, error=f"Image files only."), 400
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
file.save(name)
url = process_image(name)
bio += f"\n\n![]({url})"
bio_html = CustomRenderer().render(mistletoe.Document(bio))
bio_html = sanitize(bio_html)
bans = filter_comment_html(bio_html)
if bans:
ban = bans[0]
reason = f"Remove the {ban.domain} link from your bio and try again."
if ban.reason:
reason += f" {ban.reason}"
return {"error": reason}, 401
if len(bio_html) > 10000:
return render_template("settings_profile.html",
v=v,
error="Your bio is too long")
v.bio = bio[:1500]
v.bio_html=bio_html
g.db.add(v)
g.db.commit()
return render_template("settings_profile.html",
v=v,
msg="Your bio has been updated.")
elif request.values.get("bio") == "": elif request.values.get("bio") == "":
v.bio = None v.bio = None
v.bio_html = None v.bio_html = None
@ -314,15 +271,19 @@ def settings_profile_post(v):
if request.files.get('file'): if request.files.get('file'):
file = request.files['file'] file = request.files['file']
if not file.content_type.startswith('image/'): if file.content_type.startswith('image/'):
if request.headers.get("Authorization"): return {"error": f"Image files only"}, 400 name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp'
else: return render_template("settings_profile.html", v=v, error=f"Image files only."), 400 file.save(name)
url = process_image(name)
name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' bio += f"\n\n![]({url})"
file.save(name) elif file.content_type.startswith('video/'):
url = process_image(name) file.save("video.mp4")
with open("video.mp4", 'rb') as f:
bio += f"\n\n![]({url})" url = requests.request("POST", "https://api.imgur.com/3/upload", headers={'Authorization': f'Client-ID {CATBOX_KEY}'}, files=[('video', f)]).json()['data']['link']
bio += f"\n\n{url}"
else:
if request.headers.get("Authorization"): return {"error": f"Image/Video files only"}, 400
else: return render_template("settings_profile.html", v=v, error=f"Image/Video files only."), 400
bio_html = CustomRenderer().render(mistletoe.Document(bio)) bio_html = CustomRenderer().render(mistletoe.Document(bio))
bio_html = sanitize(bio_html) bio_html = sanitize(bio_html)

View File

@ -14,11 +14,11 @@
{% if v %} {% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style> <style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=420"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{v.theme}}.css?v=200"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{v.theme}}.css?v=200">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/CHRISTMAS/css/agendaposter.css?v=200">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %} {% if v.agendaposter %}<link rel="stylesheet" href="/assets/CHRISTMAS/css/agendaposter.css?v=200">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %} {% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=420"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
{% endif %} {% endif %}
</head> </head>

View File

@ -1,6 +1,6 @@
{% if v %} {% if v %}
{% include "award_modal.html" %} {% include "award_modal.html" %}
<script defer src="/assets/CHRISTMAS/js/marked.js?v=201"></script> <script defer src="/assets/CHRISTMAS/js/marked.js?v=202"></script>
<script defer src="/assets/CHRISTMAS/js/comments_v.js?v=200"></script> <script defer src="/assets/CHRISTMAS/js/comments_v.js?v=200"></script>
{% endif %} {% endif %}

View File

@ -34,7 +34,7 @@
<div id="filename-edit-reply-{{c.id}}"> <div id="filename-edit-reply-{{c.id}}">
<i class="fas fa-camera fa-fw fa-sm"></i> <i class="fas fa-camera fa-fw fa-sm"></i>
</div> </div>
<input id="file-edit-reply-{{c.id}}" type="file" name="file" accept="image/*" onchange="document.getElementById('filename-edit-reply-{{c.id}}').innerHTML='image';" hidden> <input id="file-edit-reply-{{c.id}}" type="file" name="file" accept="image/*, video/*" onchange="document.getElementById('filename-edit-reply-{{c.id}}').innerHTML='image/video';" hidden>
</label> </label>
</li> </li>
{% endif %} {% endif %}
@ -60,7 +60,7 @@
&nbsp; &nbsp;
<label class="btn btn-secondary format d-inline-block m-0" for="file-edit-reply-{{c.id}}"> <label class="btn btn-secondary format d-inline-block m-0" for="file-edit-reply-{{c.id}}">
<div id="filename-edit-reply-{{c.id}}"><i class="far fa-image"></i></div> <div id="filename-edit-reply-{{c.id}}"><i class="far fa-image"></i></div>
<input id="file-edit-reply-{{c.id}}" type="file" name="file" accept="image/*" onchange="document.getElementById('filename-edit-reply-{{c.id}}').innerHTML='image';" hidden> <input id="file-edit-reply-{{c.id}}" type="file" name="file" accept="image/*, video/*" onchange="document.getElementById('filename-edit-reply-{{c.id}}').innerHTML='image/video';" hidden>
</label> </label>
<a id="cancel-edit-{{c.id}}" href="javascript:void(0)" onclick="toggleEdit('{{c.id}}')" class="hidden d-md-block btn btn-link text-muted ml-auto cancel-form">Cancel</a> <a id="cancel-edit-{{c.id}}" href="javascript:void(0)" onclick="toggleEdit('{{c.id}}')" class="hidden d-md-block btn btn-link text-muted ml-auto cancel-form">Cancel</a>

View File

@ -35,7 +35,7 @@
<div id="filename-show-reply-{{p.fullname}}"> <div id="filename-show-reply-{{p.fullname}}">
<i class="fas fa-camera fa-fw fa-sm"></i> <i class="fas fa-camera fa-fw fa-sm"></i>
</div> </div>
<input id="file-upload-reply-{{p.fullname}}" type="file" name="file" accept="image/*" onchange="document.getElementById('filename-show-reply-{{p.fullname}}').innerHTML='image';" hidden> <input id="file-upload-reply-{{p.fullname}}" type="file" name="file" accept="image/*, video/*" onchange="document.getElementById('filename-show-reply-{{p.fullname}}').innerHTML='image/video';" hidden>
</label> </label>
</li> </li>
{% endif %} {% endif %}

View File

@ -36,7 +36,7 @@
<div id="filename-show-reply-{{c.fullname}}"> <div id="filename-show-reply-{{c.fullname}}">
<i class="fas fa-camera fa-fw fa-sm"></i> <i class="fas fa-camera fa-fw fa-sm"></i>
</div> </div>
<input id="file-upload-reply-{{c.fullname}}" type="file" name="file" accept="image/*" onchange="document.getElementById('filename-show-reply-{{c.fullname}}').innerHTML='image';" hidden> <input id="file-upload-reply-{{c.fullname}}" type="file" name="file" accept="image/*, video/*" onchange="document.getElementById('filename-show-reply-{{c.fullname}}').innerHTML='image/video';" hidden>
</label> </label>
</li> </li>
{% endif %} {% endif %}
@ -67,7 +67,7 @@
&nbsp; &nbsp;
<label class="btn btn-secondary format d-inline-block m-0" for="file-upload-reply-{{c.fullname}}"> <label class="btn btn-secondary format d-inline-block m-0" for="file-upload-reply-{{c.fullname}}">
<div id="filename-show-reply-{{c.fullname}}"><i class="far fa-image"></i></div> <div id="filename-show-reply-{{c.fullname}}"><i class="far fa-image"></i></div>
<input id="file-upload-reply-{{c.fullname}}" type="file" name="file" accept="image/*" onchange="document.getElementById('filename-show-reply-{{c.fullname}}').innerHTML='image';" hidden> <input id="file-upload-reply-{{c.fullname}}" type="file" name="file" accept="image/*, video/*" onchange="document.getElementById('filename-show-reply-{{c.fullname}}').innerHTML='image/video';" hidden>
</label> </label>
<a href="javascript:void(0)" onclick="document.getElementById('reply-to-{{c.id}}').classList.add('hidden')" class="hidden d-md-block btn btn-link text-muted ml-auto cancel-form">Cancel</a> <a href="javascript:void(0)" onclick="document.getElementById('reply-to-{{c.id}}').classList.add('hidden')" class="hidden d-md-block btn btn-link text-muted ml-auto cancel-form">Cancel</a>
<a id="save-reply-to-{{c.fullname}}" class="hidden d-md-block btn btn-primary text-muted ml-2" onclick="post_comment('{{c.fullname}}', '{{c.post.id}}');" href="javascript:void(0)">Comment</a> <a id="save-reply-to-{{c.fullname}}" class="hidden d-md-block btn btn-primary text-muted ml-2" onclick="post_comment('{{c.fullname}}', '{{c.post.id}}');" href="javascript:void(0)">Comment</a>

View File

@ -186,9 +186,9 @@
{% block stylesheets %} {% block stylesheets %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=421"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428">
<link rel="stylesheet" href="/static/dist/main.css?v=420"> <link rel="stylesheet" href="/static/dist/main.css?v=428">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/mistletoe.css?v=400"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/mistletoe.css?v=400">
@ -338,7 +338,7 @@
<script src="/assets/CHRISTMAS/js/lite-youtube.js?v=200"></script> <script src="/assets/CHRISTMAS/js/lite-youtube.js?v=200"></script>
<script src="/assets/CHRISTMAS/js/gif_modal.js?v=200"></script> <script src="/assets/CHRISTMAS/js/gif_modal.js?v=200"></script>
<script src="/assets/CHRISTMAS/js/emoji_modal.js?v=203"></script> <script src="/assets/CHRISTMAS/js/emoji_modal.js?v=204"></script>
<script defer src="/assets/CHRISTMAS/js/popover.js?v=200"></script> <script defer src="/assets/CHRISTMAS/js/popover.js?v=200"></script>
@ -346,8 +346,8 @@
{% if v %} {% if v %}
<script>function formkey() {return '{{v.formkey}}';}</script> <script>function formkey() {return '{{v.formkey}}';}</script>
<script src="/assets/CHRISTMAS/js/default.js?v=201"></script>
{% endif %} {% endif %}
<script src="/assets/CHRISTMAS/js/default.js?v=201"></script>
</body> </body>
</html> </html>

View File

@ -41,7 +41,7 @@
</a> </a>
</li> </li>
<li> <li>
<a class="dropdown-item block w-full text-left px-4 py-2 text-sm text-gray-200 bg-gradient-to-t hover:from-red-800 hover:to-red-700 hover:shadow-inner focus:shadow-inner focus:bg-gradient-to-t focus:from-red-800 focus:to-red-700" href="/assets/CHRISTMAS/Drama_App.apk"> <a class="dropdown-item block w-full text-left px-4 py-2 text-sm text-gray-200 bg-gradient-to-t hover:from-red-800 hover:to-red-700 hover:shadow-inner focus:shadow-inner focus:bg-gradient-to-t focus:from-red-800 focus:to-red-700" href="/assets/CHRISTMAS/Drama.apk?v=201">
<i class="fab fa-android fa-sm fa-fw mr-4"></i>Android App <i class="fab fa-android fa-sm fa-fw mr-4"></i>Android App
</a> </a>
</li> </li>

View File

@ -62,15 +62,10 @@ You can use Markdown formatting:
<td><lite-youtube videoid="3Hecr51ByE4" params="controls=0&modestbranding=1"></lite-youtube></td> <td><lite-youtube videoid="3Hecr51ByE4" params="controls=0&modestbranding=1"></lite-youtube></td>
</tr> </tr>
<tr> <tr>
<td>MP4 Files</td> <td>Video Files</td>
<td>https://files.catbox.moe/v4om92.mp4</td> <td>https://files.catbox.moe/v4om92.mp4</td>
<td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/v4om92.mp4" type="video/mp4"></video></td> <td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/v4om92.mp4" type="video/mp4"></video></td>
</tr> </tr>
<tr>
<td>WEBM Files</td>
<td>https://files.catbox.moe/v4om92.mp4</td>
<td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/nr9joo.webm" type="video/webm"></video></td>
</tr>
<tr> <tr>
<td>Emojis</td> <td>Emojis</td>
<td>:marseylove:</td> <td>:marseylove:</td>

View File

@ -16,7 +16,7 @@
Menu open: "hidden", Menu closed: "block" Menu open: "hidden", Menu closed: "block"
--> -->
<svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> <svg class="block h-6 w-6" xmlns="https://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg> </svg>
<!-- <!--
@ -26,7 +26,7 @@
Menu open: "block", Menu closed: "hidden" Menu open: "block", Menu closed: "hidden"
--> -->
<svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> <svg class="hidden h-6 w-6" xmlns="https://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg> </svg>
</button> </button>

View File

@ -111,7 +111,7 @@
<button class="dropdown-item copy-link" data-clipboard-text="/signup?ref={{v.username}}"><i class="fad fa-user-friends fa-fw text-left mr-3"></i>Invite friends</button> <button class="dropdown-item copy-link" data-clipboard-text="/signup?ref={{v.username}}"><i class="fad fa-user-friends fa-fw text-left mr-3"></i>Invite friends</button>
</div> </div>
<div class="px-2"> <div class="px-2">
<a class="dropdown-item" href="/assets/CHRISTMAS/{{'SITE_NAME' | app_config}}.apk?v=200"><i class="fab fa-android fa-fw text-left mr-3"></i>Android app</a> <a class="dropdown-item" href="/assets/CHRISTMAS/{{'SITE_NAME' | app_config}}.apk?v=201"><i class="fab fa-android fa-fw text-left mr-3"></i>Android app</a>
<a class="dropdown-item" href="/rules"><i class="fas fa-balance-scale fa-fw text-left mr-3"></i>Rules</a> <a class="dropdown-item" href="/rules"><i class="fas fa-balance-scale fa-fw text-left mr-3"></i>Rules</a>
@ -175,7 +175,7 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="/settings"><i class="fas fa-cog fa-fw mr-3"></i>Settings</a> <a class="nav-link" href="/settings"><i class="fas fa-cog fa-fw mr-3"></i>Settings</a>
</li> </li>
<a class="nav-item nav-link" href="/assets/CHRISTMAS/{{'SITE_NAME' | app_config}}.apk?v=200"><i class="fab fa-android fa-fw mr-3"></i>Android app</a> <a class="nav-item nav-link" href="/assets/CHRISTMAS/{{'SITE_NAME' | app_config}}.apk?v=201"><i class="fab fa-android fa-fw mr-3"></i>Android app</a>
<a class="nav-item nav-link" href="/rules"><i class="fas fa-balance-scale fa-fw mr-3"></i>Rules</a> <a class="nav-item nav-link" href="/rules"><i class="fas fa-balance-scale fa-fw mr-3"></i>Rules</a>

View File

@ -13,9 +13,9 @@
<title>Login - {{'SITE_NAME' | app_config}}</title> <title>Login - {{'SITE_NAME' | app_config}}</title>
{% endblock %} {% endblock %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=420"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428">
<link rel="stylesheet" href="/static/dist/main.css?v=420"> <link rel="stylesheet" href="/static/dist/main.css?v=428">
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>

View File

@ -13,7 +13,7 @@
<title>2-Step Login - {{'SITE_NAME' | app_config}}</title> <title>2-Step Login - {{'SITE_NAME' | app_config}}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=420"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
</head> </head>

View File

@ -29,9 +29,9 @@
{% block stylesheets %} {% block stylesheets %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=420"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428">
<link rel="stylesheet" href="/static/dist/main.css?v=420"> <link rel="stylesheet" href="/static/dist/main.css?v=428">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/mistletoe.css?v=400"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/mistletoe.css?v=400">

View File

@ -96,7 +96,7 @@
<form action="/settings/images/banner" method="post" enctype="multipart/form-data"> <form action="/settings/images/banner" method="post" enctype="multipart/form-data">
<input type="hidden" name="formkey" value="{{v.formkey}}"> <input type="hidden" name="formkey" value="{{v.formkey}}">
<label class="btn btn-secondary text-capitalize mr-2 mb-0"> <label class="btn btn-secondary text-capitalize mr-2 mb-0">
Update<input type="file" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} accept="image/*" hidden name="banner" onchange="form.submit()"> Update<input type="file" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} accept="image/*, video/*" hidden name="banner" onchange="form.submit()">
</label> </label>
</form> </form>
@ -409,7 +409,7 @@
<script src="/assets/CHRISTMAS/js/settings_profile.js?v=200"></script> <script src="/assets/CHRISTMAS/js/settings_profile.js?v=200"></script>
<script src="/assets/CHRISTMAS/js/gif_modal.js?v=200"></script> <script src="/assets/CHRISTMAS/js/gif_modal.js?v=200"></script>
<script src="/assets/CHRISTMAS/js/emoji_modal.js?v=203"></script> <script src="/assets/CHRISTMAS/js/emoji_modal.js?v=204"></script>
<script> <script>
document.onpaste = function(event) { document.onpaste = function(event) {

View File

@ -26,9 +26,9 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}Sign up - {{'SITE_NAME' | app_config}}{% endif %}</title> <title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}Sign up - {{'SITE_NAME' | app_config}}{% endif %}</title>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=420"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428">
<link rel="stylesheet" href="/static/dist/main.css?v=420"> <link rel="stylesheet" href="/static/dist/main.css?v=428">
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
@ -157,7 +157,7 @@
<script src="/assets/CHRISTMAS/js/signup.js?v=200"></script> <script src="/assets/CHRISTMAS/js/signup.js?v=200"></script>
{% if hcaptcha %} {% if hcaptcha %}
<script src="/assets/CHRISTMAS/js/hcaptcha.js?v=200"></script> <script src="/assets/CHRISTMAS/js/hcaptcha.js?v=201"></script>
{% endif %} {% endif %}
<script defer src="/assets/CHRISTMAS/js/christmas/snow.js?v=200"></script> <script defer src="/assets/CHRISTMAS/js/christmas/snow.js?v=200"></script>

View File

@ -31,7 +31,7 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}{{'SITE_NAME' | app_config}}{% endif %}</title> <title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}{{'SITE_NAME' | app_config}}{% endif %}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=420"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200"> <link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=428"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
</head> </head>

View File

@ -304,6 +304,8 @@
{% if p.is_image %} {% if p.is_image %}
<span class="flex-shrink-0">(image post)</span> <span class="flex-shrink-0">(image post)</span>
{% elif p.is_video %}
<span class="flex-shrink-0">(video post)</span>
{% elif p.realurl(v) %} {% elif p.realurl(v) %}
<a class="flex-shrink-0 text-gray-500 hover:underline" href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if not v or v.newtabexternal %}target="_blank"{% endif %}> <a class="flex-shrink-0 text-gray-500 hover:underline" href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if not v or v.newtabexternal %}target="_blank"{% endif %}>
({{p.domain}}) ({{p.domain}})
@ -352,13 +354,13 @@
{% endif %} {% endif %}
<div id="post-text" class="text-black {% if p.award_count("candycane") %}candycane{% endif %}"> <div id="post-text" class="text-black {% if p.award_count("candycane") %}candycane{% endif %}">
{% if p.is_image %} {% if p.is_image %}
<a {% if not v or v.newtabexternal %}target="_blank"{% endif %} rel="nofollow noopener noreferrer" href="{{p.realurl(v)}}"> <a {% if not v or v.newtabexternal %}target="_blank"{% endif %} rel="nofollow noopener noreferrer" href="{{p.realurl(v)}}">
<img loading="lazy" src="{{p.realurl(v)}}" class="img-fluid" style="max-height:500px;" alt="Unable to load image"> <img loading="lazy" src="{{p.realurl(v)}}" class="img-fluid" style="max-height:500px;" alt="Unable to load image">
</a> </a>
{% elif p.url and p.url.lower().endswith('.mp4') %} {% elif p.is_video %}
<video controls loop preload="metadata" style="max-width: 100%"> <video controls loop preload="metadata" style="max-width: 100%">
<source src="{{ p.realurl(v) }}" type="video/mp4"/> <source src="{{ p.realurl(v) }}" type="video/mp4"/>
</video> </video>
{% endif %} {% endif %}
{{p.realbody(v) | safe}} {{p.realbody(v) | safe}}

View File

@ -149,6 +149,8 @@
{% if p.is_image %} {% if p.is_image %}
<span>(image post)</span> <span>(image post)</span>
{% elif p.is_video %}
<span>(video post)</span>
{% elif p.realurl(v) %} {% elif p.realurl(v) %}
<a class="flex-shrink-0" class="text-gray-500 hover:underline" href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if not v or v.newtabexternal %}target="_blank"{% endif %}> <a class="flex-shrink-0" class="text-gray-500 hover:underline" href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if not v or v.newtabexternal %}target="_blank"{% endif %}>
({{p.domain}}) ({{p.domain}})
@ -285,7 +287,7 @@
{% endif %} {% endif %}
{% if not p.club or v and (v.paid_dues or v.id == p.author_id) %} {% if not p.club or v and (v.paid_dues or v.id == p.author_id) %}
{% if p.url and p.url.lower().endswith('.mp4') %} {% if p.is_video %}
<div id="video-{{p.id}}" style="text-align: center" class="{% if p.over_18 or not ((v and v.cardview) or (not v and environ.get('CARD_VIEW') == '1')) %}hidden{% endif %} md:ml-[4.5rem] mt-3"> <div id="video-{{p.id}}" style="text-align: center" class="{% if p.over_18 or not ((v and v.cardview) or (not v and environ.get('CARD_VIEW') == '1')) %}hidden{% endif %} md:ml-[4.5rem] mt-3">
<video controls loop preload="metadata" class="w-full max-h-[20rem]"> <video controls loop preload="metadata" class="w-full max-h-[20rem]">
<source src="{{p.realurl(v)}}" type="video/mp4"> <source src="{{p.realurl(v)}}" type="video/mp4">

View File

@ -166,7 +166,7 @@
{% endblock %} {% endblock %}
{% block scripts %} {% block scripts %}
<script defer src="/assets/CHRISTMAS/js/marked.js?v=201"></script> <script defer src="/assets/CHRISTMAS/js/marked.js?v=202"></script>
<script defer src="/assets/CHRISTMAS/js/submit.js?v=200"></script> <script defer src="/assets/CHRISTMAS/js/submit.js?v=200"></script>
<script defer src="/assets/CHRISTMAS/js/christmas/snow.js?v=200"></script> <script defer src="/assets/CHRISTMAS/js/christmas/snow.js?v=200"></script>
{% endblock %} {% endblock %}

View File

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/static/dist/main.css?v=420"> <link rel="stylesheet" href="/static/dist/main.css?v=428">
<title>Flask + Tailwind CSS</title> <title>Flask + Tailwind CSS</title>
</head> </head>

View File

@ -14,11 +14,11 @@
{% if v %} {% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style> <style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %} {% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %} {% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
{% endif %} {% endif %}
</head> </head>

View File

@ -43,25 +43,25 @@
<div class="pop-badges ml-3 mr-3 my-2"> <div class="pop-badges ml-3 mr-3 my-2">
</div> </div>
<div class="border-top d-flex align-items-center p-3 gap-3 smol"> <div class="border-top d-flex align-items-center p-3 gap-3 smol">
<span> <span>
<strong class="pop-postcount text-black"></strong> <strong class="pop-postcount text-black"></strong>
<span class="text-black">posts</span> <span class="text-black">posts</span>
</span> </span>
<span class="ml-3"> <span class="ml-3">
<strong class="pop-commentcount text-black"></strong> <strong class="pop-commentcount text-black"></strong>
<span class="text-black">comments</span> <span class="text-black">comments</span>
</span> </span>
<span class="ml-3"> <span class="ml-3">
<strong class="pop-coins text-black"></strong> <strong class="pop-coins text-black"></strong>
<span class="text-black">coins</span> <span class="text-black">coins</span>
</span> </span>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;
<a {% if v and v.newtab %}target="_blank"{% endif %} class="pop-viewmore ml-auto text-decoration-none"> <a {% if v and v.newtab %}target="_blank"{% endif %} class="pop-viewmore ml-auto text-decoration-none">
View View
<i class="fas fa-arrow-right fa-sm px-1"></i> <i class="fas fa-arrow-right fa-sm px-1"></i>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
@ -205,7 +205,7 @@
{% if c.author.verified %}<i class="fas fa-badge-check align-middle ml-1" style="color:{% if c.author.verifiedcolor %}#{{c.author.verifiedcolor}}{% else %}#1DA1F2{% endif %}" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="{{c.author.verified}}"></i> {% if c.author.verified %}<i class="fas fa-badge-check align-middle ml-1" style="color:{% if c.author.verifiedcolor %}#{{c.author.verifiedcolor}}{% else %}#1DA1F2{% endif %}" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="{{c.author.verified}}"></i>
{% endif %} {% endif %}
<a class="user-name text-decoration-none" onclick='popclick({{c.author.json_popover(v) | tojson}})' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="focus" data-content-id="popover" href="javascript:void(0)" tabindex="0" style="color:#{{c.author.namecolor}}; font-size:12px; font-weight:bold;"><img loading="lazy" src="{{c.author.profile_url}}" class="profile-pic-25 mr-2"><span {% if c.author.patron and not c.distinguish_level %}class="patron" style="background-color:#{{c.author.namecolor}};"{% elif c.distinguish_level and 'rama' in request.host %}class="mod"{% endif %}>{{c.author.username}}</span></a> <a class="user-name text-decoration-none" onclick='popclick({{c.author.json_popover(v) | tojson}})' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="focus" data-content-id="popover" href="javascript:void(0)" tabindex="0" style="color:#{{c.author.namecolor}}; font-size:12px; font-weight:bold;"><img loading="lazy" src="{{c.author.profile_url}}" class="profile-pic-25 mr-2"><span {% if c.author.patron and not c.distinguish_level %}class="patron" style="background-color:#{{c.author.namecolor}};"{% elif c.distinguish_level and 'rama' in request.host %}class="mod"{% endif %}>{{c.author.username}}</span></a>
{% if c.author.customtitle %}&nbsp;<bdi style="color: #{{c.author.titlecolor}}">&nbsp;{% if c.author.quadrant %}<img loading="lazy" height="20" src="/assets/images/quadrants/{{c.author.quadrant}}.webp?v=190">{% endif %}{{c.author.customtitle | safe}}</bdi>{% endif %} {% if c.author.customtitle %}&nbsp;<bdi style="color: #{{c.author.titlecolor}}">&nbsp;{% if c.author.quadrant %}<img loading="lazy" height="20" src="/assets/images/quadrants/{{c.author.quadrant}}.webp?v=190">{% endif %}{{c.author.customtitle | safe}}</bdi>{% endif %}
{% if c.parent_comment_id and not standalone and level != 1 %}<a href="#comment-{{ c.parent_comment_id }}-only" class="text-muted ml-2"><i class="fas fa-reply fa-sm fa-fw fa-flip-horizontal mr-1"></i>{{ c.parent_comment.author.username }}</a>{% endif %} {% if c.parent_comment_id and not standalone and level != 1 %}<a href="#comment-{{ c.parent_comment_id }}-only" class="text-muted ml-2"><i class="fas fa-reply fa-sm fa-fw fa-flip-horizontal mr-1"></i>{{ c.parent_comment.author.username }}</a>{% endif %}
@ -231,7 +231,7 @@
<div id="comment-banned-warning" class="comment-text text-removed mb-0">removed by @{{c.ban_reason}}</div> <div id="comment-banned-warning" class="comment-text text-removed mb-0">removed by @{{c.ban_reason}}</div>
{% endif %} {% endif %}
<div id="comment-text-{{c.id}}" class="pb-2 comment-text mb-0"> <div id="comment-text-{{c.id}}" class="comment-text mb-0">
{{c.realbody(v) | safe}} {{c.realbody(v) | safe}}
{% if c.options %} {% if c.options %}
{{c.options_html(v) | safe}} {{c.options_html(v) | safe}}
@ -252,7 +252,7 @@
<input type="hidden" name="formkey" value="{{v.formkey}}"> <input type="hidden" name="formkey" value="{{v.formkey}}">
<textarea maxlength="10000" name="body" form="reply-to-t3_{{c.id}}" data-id="{{c.id}}" class="comment-box form-control rounded" id="reply-form-body-{{c.id}}" aria-label="With textarea" rows="3"></textarea> <textarea maxlength="10000" name="body" form="reply-to-t3_{{c.id}}" data-id="{{c.id}}" class="comment-box form-control rounded" id="reply-form-body-{{c.id}}" aria-label="With textarea" rows="3"></textarea>
<div class="comment-format" id="comment-format-bar-{{c.id}}"> <div class="comment-format" id="comment-format-bar-{{c.id}}">
<label class="btn btn-secondary format d-inline-block m-0" for="gif-reply-btn-{{c.id}}"> <label class="btn btn-secondary format m-0" for="gif-reply-btn-{{c.id}}">
<i id="emoji-reply-btn-{{c.id}}" class="fas fa-smile-beam" onclick="loadEmojis('reply-form-body-{{c.id}}')" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add Emoji"></i> <i id="emoji-reply-btn-{{c.id}}" class="fas fa-smile-beam" onclick="loadEmojis('reply-form-body-{{c.id}}')" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add Emoji"></i>
</label> </label>
</div> </div>
@ -274,21 +274,21 @@
<div class="text-small font-weight-bold mt-1" id="charcount-edit-{{c.id}}" style="right: 1rem; bottom: 0.5rem; z-index: 3;"></div> <div class="text-small font-weight-bold mt-1" id="charcount-edit-{{c.id}}" style="right: 1rem; bottom: 0.5rem; z-index: 3;"></div>
<div class="comment-format"> <div class="comment-format">
<a class="btn btn-secondary format d-inline-block m-0" href="javascript:void(0)"><i class="fas fa-bold" onclick="makeBold('comment-edit-body-{{c.id}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Bold"></i></a> <a class="btn btn-secondary format m-0" href="javascript:void(0)"><i class="fas fa-bold" onclick="makeBold('comment-edit-body-{{c.id}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Bold"></i></a>
&nbsp; &nbsp;
<a class="btn btn-secondary format d-inline-block m-0" href="javascript:void(0)"><i class="fas fa-italic" onclick="makeItalics('comment-edit-body-{{c.id}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Italicize"></i></a> <a class="btn btn-secondary format m-0" href="javascript:void(0)"><i class="fas fa-italic" onclick="makeItalics('comment-edit-body-{{c.id}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Italicize"></i></a>
&nbsp; &nbsp;
<a class="btn btn-secondary format d-inline-block m-0" href="javascript:void(0)"><i class="fas fa-quote-right" onclick="makeQuote('comment-edit-body-{{c.id}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Quote"></i></a> <a class="btn btn-secondary format m-0" href="javascript:void(0)"><i class="fas fa-quote-right" onclick="makeQuote('comment-edit-body-{{c.id}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Quote"></i></a>
&nbsp; &nbsp;
<small class="btn btn-secondary format d-inline-block m-0"><span class="font-weight-bolder text-uppercase" aria-hidden="true" onclick="commentForm('comment-edit-body-{{c.id}}');getGif()" data-bs-toggle="modal" data-bs-target="#gifModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add GIF">GIF</span></small> <small class="btn btn-secondary format m-0"><span class="font-weight-bolder text-uppercase" aria-hidden="true" onclick="commentForm('comment-edit-body-{{c.id}}');getGif()" data-bs-toggle="modal" data-bs-target="#gifModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add GIF">GIF</span></small>
&nbsp; &nbsp;
<small class="btn btn-secondary format d-inline-block m-0"><i class="fas fa-smile-beam" aria-hidden="true" onclick="loadEmojis('comment-edit-body-{{c.id}}')" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add Emoji"></i></small> <small class="btn btn-secondary format m-0"><i class="fas fa-smile-beam" aria-hidden="true" onclick="loadEmojis('comment-edit-body-{{c.id}}')" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add Emoji"></i></small>
&nbsp; &nbsp;
<label class="btn btn-secondary format d-inline-block m-0" for="file-edit-reply-{{c.id}}"> <label class="btn btn-secondary format m-0" for="file-edit-reply-{{c.id}}">
<div id="filename-edit-reply-{{c.id}}"><i class="far fa-image"></i></div> <div id="filename-edit-reply-{{c.id}}"><i class="far fa-image"></i></div>
<input id="file-edit-reply-{{c.id}}" type="file" name="file" accept="image/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-edit-reply-{{c.id}}').innerHTML='image';" hidden> <input id="file-edit-reply-{{c.id}}" type="file" name="file" accept="image/*, video/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-edit-reply-{{c.id}}').innerHTML='image/video';" hidden>
</label> </label>
</div> </div>
<a href="javascript:void(0)" form="comment-edit-form-{{c.id}}" class="btn btn-primary ml-2 fl-r commentmob" onclick="comment_edit('{{c.id}}')">Save Edit</a> <a href="javascript:void(0)" form="comment-edit-form-{{c.id}}" class="btn btn-primary ml-2 fl-r commentmob" onclick="comment_edit('{{c.id}}')">Save Edit</a>
@ -299,139 +299,154 @@
</div> </div>
{% endif %} {% endif %}
<div id="comment-{{c.id}}-actions" class="comment-actions{% if voted==1 %} upvoted{% elif voted==-1 %} downvoted{% endif %}"> <div id="comment-{{c.id}}-actions" class="comment-actions{% if voted==1 %} upvoted{% elif voted==-1 %} downvoted{% endif %}">
<ul class="list-inline text-right text-md-left {% if v and v.admin_level > 1 %}d-flex{% endif %}">
<ul class="d-md-none list-inline text-right text-md-left {% if v and v.admin_level > 1 %}d-flex{% endif %}">
{% if v and v.admin_level > 1 %} {% if v and v.admin_level > 1 %}
<button class="btn py-0 nobackground px-1 list-inline-item mr-auto d-md-none" href="javascript:void(0)" data-bs-toggle="modal" data-bs-target="#adminModal-{{c.id}}"> <button class="btn py-0 nobackground px-1 mr-auto d-md-none" href="javascript:void(0)" data-bs-toggle="modal" data-bs-target="#adminModal-{{c.id}}">
<i class="fas fa-broom"></i> <i class="fas fa-broom"></i>
</button> </button>
{% endif %} {% endif %}
<li class="pt-1">
{% if v %}
<button class="btn py-0 nobackground px-1 text-muted" href="javascript:void(0)" onclick="openReplyBox('reply-to-{{c.id}}')"><i class="fas fa-reply" aria-hidden="true"></i></button>
{% endif %}
<button class="btn py-0 nobackground px-1 " href="javascript:void(0)" data-bs-toggle="modal" data-bs-target="#actionsModal-{{c.id}}" data-bs-focus="false"><i class="fas fa-ellipsis-h"></i></button>
{% if v and request.path.startswith('/@') and v.admin_level == 0 %}
{% if voted==1 %}
<button class="btn m-0 p-0 nobackground arrow-up comment-{{c.id}}-up active"></button>
{% endif %}
{% elif v %}
<button id="comment-mobile-{{c.id}}-up" tabindex="0" onclick="vote('comment-mobile', '{{c.id}}', '1')" class="btn m-0 p-0 nobackground arrow-up upvote-button comment-{{c.id}}-up {% if voted==1 %}active{% endif %}"></button>
{% else %}
<button id="comment-{{c.id}}-up" tabindex="0" onclick="vote('comment', '{{c.id}}', '1')" class="btn m-0 p-0 nobackground arrow-up" onclick="location.href='/login';"></button>
{% endif %}
<button class="btn m-0 px-1 nobackground"><span class="points" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-original-title="+{{ups}} | -{{downs}}"><span id="comment-mobile-score-{{c.id}}" class="score comment-score-{{c.id}} {% if voted==1 %}score-up{% elif voted==-1%}score-down{% endif %}">{{score}}</span></span></button>
{% if v and request.path.startswith('/@') and v.admin_level == 0 %}
{% if voted==-1 %}
<button class="btn m-0 p-0 nobackground arrow-down comment-{{c.id}}-up active"></button>
{% endif %}
{% elif v %}
<button {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-mobile-{{c.id}}-down" tabindex="0" onclick="vote('comment-mobile', '{{c.id}}', '-1')" class="btn m-0 p-0 nobackground arrow-down downvote-button comment-{{c.id}}-down {% if voted==-1 %}active{% endif %}"></button>
{% else %}
<a {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-{{c.id}}-down" tabindex="0" onclick="vote('comment', '{{c.id}}', '-1')" class="arrow-down" onclick="location.href='/login';"></a>
{% endif %}
</li>
</ul>
<ul class="d-none d-md-flex list-inline text-right text-md-left"><li>
{% if v and request.path.startswith('/@') and v.admin_level == 0%} {% if v and request.path.startswith('/@') and v.admin_level == 0%}
{% if voted==1 %} {% if voted==1 %}
<button class="btn p-0 mr-1 list-inline-item arrow-up d-none d-md-inline-block mx-0 comment-{{c.id}}-up active"></button> <button class="btn p-0 m-0 arrow-up mx-0 comment-{{c.id}}-up active"></button>
{% endif %} {% endif %}
{% elif v %} {% elif v %}
<button id="comment-{{c.id}}-up" tabindex="0" href="javascript:void(0)" onclick="vote('comment', '{{c.id}}', '1')" class="btn p-0 mr-1 nobackground list-inline-item arrow-up upvote-button d-none d-md-inline-block mx-0 comment-{{c.id}}-up {% if voted==1 %}active{% endif %}"></button> <button id="comment-{{c.id}}-up" tabindex="0" href="javascript:void(0)" onclick="vote('comment', '{{c.id}}', '1')" class="btn p-0 m-0 nobackground arrow-up upvote-button mx-0 comment-{{c.id}}-up {% if voted==1 %}active{% endif %}"></button>
{% else %} {% else %}
<button id="comment-{{c.id}}-up" tabindex="0" class="btn p-0 mr-1 list-inline-item arrow-up d-none d-md-inline-block" onclick="location.href='/login';"></button> <button id="comment-{{c.id}}-up" tabindex="0" class="btn p-0 m-0 arrow-up" onclick="location.href='/login';"></button>
{% endif %} {% endif %}
<button class="btn nobackground list-inline-item d-none d-md-inline-block px-3 mx-0"> <button class="btn nobackground p-0 m-0">
<span data-bs-toggle="tooltip" data-bs-placement="top" data-bs-original-title="+{{ups}} | -{{downs}}" id="comment-score-{{c.id}}" class="score comment-score-{{c.id}} {% if voted==1 %}score-up{% elif voted==-1%}score-down{% endif %}">{{score}}</span> <span data-bs-toggle="tooltip" data-bs-placement="top" data-bs-original-title="+{{ups}} | -{{downs}}" id="comment-score-{{c.id}}" class="p-2 m-0 score comment-score-{{c.id}} {% if voted==1 %}score-up{% elif voted==-1%}score-down{% endif %}">{{score}}</span>
</button> </button>
{% if v and request.path.startswith('/@') and v.admin_level == 0 %} {% if v and request.path.startswith('/@') and v.admin_level == 0 %}
{% if voted==-1 %} {% if voted==-1 %}
<li class="list-inline-item arrow-down d-none d-md-inline-block px-2 mx-0 comment-{{c.id}}-down active"></li> <li class=" arrow-down p-0 m-0 comment-{{c.id}}-down active"></li>
{% endif %} {% endif %}
{% elif v %} {% elif v %}
<button {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-{{c.id}}-down" tabindex="0" href="javascript:void(0)" onclick="vote('comment', '{{c.id}}', '-1')" class="btn p-0 ml-1 mr-3 nobackground list-inline-item arrow-down downvote-button d-none d-md-inline-block mx-0 comment-{{c.id}}-down {% if voted==-1 %}active{% endif %}"></button> <button {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-{{c.id}}-down" tabindex="0" href="javascript:void(0)" onclick="vote('comment', '{{c.id}}', '-1')" class="btn p-0 m-0 pr-2 nobackground arrow-down downvote-button comment-{{c.id}}-down {% if voted==-1 %}active{% endif %}"></button>
{% else %} {% else %}
<button {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-{{c.id}}-down" tabindex="0" href="javascript:void(0)" class="btn py-0 nobackground px-1 list-inline-item arrow-down d-none d-md-inline-block" onclick="location.href='/login';"></button> <button {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-{{c.id}}-down" tabindex="0" href="javascript:void(0)" class="btn p-0 m-0 nobackground arrow-down" onclick="location.href='/login';"></button>
{% endif %} {% endif %}
<a href="/votes?link={{c.fullname}}" class="btn nobackground px-1 list-inline-item text-muted d-none d-md-inline-block"><i class="fas fa-arrows-v"></i>Votes</a> <a href="/votes?link={{c.fullname}}" class="btn nobackground px-1 text-muted"><i class="fas fa-arrows-v"></i>Votes</a>
{% if v %} {% if v %}
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block" href="javascript:void(0)" data-bs-toggle="modal" data-bs-target="#awardModal" onclick="awardModal('/comment/{{c.id}}/awards')"><i class="fas fa-gift" aria-hidden="true"></i>Give Award</button> <button class="btn py-0 nobackground px-1 text-muted" href="javascript:void(0)" data-bs-toggle="modal" data-bs-target="#awardModal" onclick="awardModal('/comment/{{c.id}}/awards')"><i class="fas fa-gift" aria-hidden="true"></i>Give Award</button>
<button id="unsave-{{c.id}}" class="btn {% if c.id in v.saved_comment_idlist() %}d-md-inline-block{% endif %} list-inline-item text-muted d-none" href="javascript:void(0)" onclick="post_toast3('/unsave_comment/{{c.id}}','save-{{c.id}}','unsave-{{c.id}}')"><i class="fas fa-save"></i>Unsave</button> <button id="unsave-{{c.id}}" class="btn {% if c.id in v.saved_comment_idlist() %}d-md-inline-block{% endif %} text-muted d-none" href="javascript:void(0)" onclick="post_toast3('/unsave_comment/{{c.id}}','save-{{c.id}}','unsave-{{c.id}}')"><i class="fas fa-save"></i>Unsave</button>
<button id="save-{{c.id}}" class="btn py-0 nobackground px-1 {% if c.id not in v.saved_comment_idlist() %}d-md-inline-block{% endif %} list-inline-item text-muted d-none" href="javascript:void(0)" onclick="post_toast3('/save_comment/{{c.id}}','save-{{c.id}}','unsave-{{c.id}}')"><i class="fas fa-save"></i>Save</button> <button id="save-{{c.id}}" class="btn py-0 nobackground px-1 {% if c.id not in v.saved_comment_idlist() %}d-md-inline-block{% endif %} text-muted d-none" href="javascript:void(0)" onclick="post_toast3('/save_comment/{{c.id}}','save-{{c.id}}','unsave-{{c.id}}')"><i class="fas fa-save"></i>Save</button>
<button class="btn py-0 nobackground px-1 list-inline-item text-muted" href="javascript:void(0)" onclick="openReplyBox('reply-to-{{c.id}}')"><i class="fas fa-reply" aria-hidden="true"></i><span class="d-none d-md-inline-block">Reply</span></button> <button class="btn py-0 nobackground px-1 text-muted" href="javascript:void(0)" onclick="openReplyBox('reply-to-{{c.id}}')"><i class="fas fa-reply" aria-hidden="true"></i>Reply</button>
{% endif %} {% endif %}
<a class="btn nobackground px-1 list-inline-item text-muted d-none d-md-inline-block" href="{{c.permalink}}"><i class="fas fa-book-open"></i>Context</a> <a class="btn nobackground px-1 text-muted" href="{{c.permalink}}"><i class="fas fa-book-open"></i>Context</a>
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block copy-link" href="javascript:void(0);" role="button" data-clipboard-text="{% if 'rama' in request.host %}https://freeghettohoes.biz{{c.permalink}}{% else %}{{c.permalink | full_link}}{% endif %}"><i class="fas fa-copy"></i>Copy link</button> <button class="btn py-0 nobackground px-1 text-muted copy-link" href="javascript:void(0);" role="button" data-clipboard-text="{% if 'rama' in request.host %}https://freeghettohoes.biz{{c.permalink}}{% else %}{{c.permalink | full_link}}{% endif %}"><i class="fas fa-copy"></i>Copy link</button>
{% if v %} {% if v %}
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block" data-bs-toggle="modal" data-bs-target="#reportCommentModal" onclick="report_commentModal('{{c.id}}','{{c.author.username}}',)"><i class="fas fa-flag fa-fw"></i>Report</button> <button class="btn py-0 nobackground px-1 text-muted" data-bs-toggle="modal" data-bs-target="#reportCommentModal" onclick="report_commentModal('{{c.id}}','{{c.author.username}}',)"><i class="fas fa-flag fa-fw"></i>Report</button>
{% endif %} {% endif %}
{% if v and c.parent_submission and c.author_id==v.id %} {% if v and c.parent_submission and c.author_id==v.id %}
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block" onclick="toggleEdit('{{c.id}}')"><i class="fas fa-edit fa-fw"></i>Edit</button> <button class="btn py-0 nobackground px-1 text-muted" onclick="toggleEdit('{{c.id}}')"><i class="fas fa-edit fa-fw"></i>Edit</button>
{% if c.deleted_utc > 0 %} {% if c.deleted_utc > 0 %}
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block" onclick="post_toast('/undelete/comment/{{c.id}}')"><i class="fas fa-trash-alt fa-fw"></i>Undelete</button> <button class="btn py-0 nobackground px-1 text-muted" onclick="post_toast('/undelete/comment/{{c.id}}')"><i class="fas fa-trash-alt fa-fw"></i>Undelete</button>
{% else %} {% else %}
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block" data-bs-toggle="modal" data-bs-target="#deleteCommentModal" onclick="delete_commentModal('{{c.id}}')"><i class="fas fa-trash-alt fa-fw"></i>Delete</button> <button class="btn py-0 nobackground px-1 text-muted" data-bs-toggle="modal" data-bs-target="#deleteCommentModal" onclick="delete_commentModal('{{c.id}}')"><i class="fas fa-trash-alt fa-fw"></i>Delete</button>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if v and v.admin_level > 0 and v.id==c.author_id %} {% if v and v.admin_level > 0 and v.id==c.author_id %}
<button id="undistinguish-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item d-none {% if c.distinguish_level %}d-md-inline-block{% endif %} text-info" onclick="post_toast3('/distinguish_comment/{{c.id}}','distinguish-{{c.id}}','undistinguish-{{c.id}}','no')"><i class="fas fa-id-badge text-info fa-fw"></i>Undistinguish</button> <button id="undistinguish-{{c.id}}" class="btn py-0 nobackground px-1 d-none {% if c.distinguish_level %}d-md-inline-block{% endif %} text-info" onclick="post_toast3('/distinguish_comment/{{c.id}}','distinguish-{{c.id}}','undistinguish-{{c.id}}','no')"><i class="fas fa-id-badge text-info fa-fw"></i>Undistinguish</button>
<button id="distinguish-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item d-none {% if not c.distinguish_level %}d-md-inline-block{% endif %} text-info" onclick="post_toast3('/distinguish_comment/{{c.id}}','distinguish-{{c.id}}','undistinguish-{{c.id}}','yes')"><i class="fas fa-id-badge text-info fa-fw"></i>Distinguish</button> <button id="distinguish-{{c.id}}" class="btn py-0 nobackground px-1 d-none {% if not c.distinguish_level %}d-md-inline-block{% endif %} text-info" onclick="post_toast3('/distinguish_comment/{{c.id}}','distinguish-{{c.id}}','undistinguish-{{c.id}}','yes')"><i class="fas fa-id-badge text-info fa-fw"></i>Distinguish</button>
{% endif %} {% endif %}
{% if v and not v.id==c.author_id %} {% if v and not v.id==c.author_id %}
<button id="unblock-{{c.id}}" class="text-success {% if c.is_blocking %}d-md-inline-block{% endif %} list-inline-item d-none" onclick="post_toast3('/settings/unblock?username={{c.author.username}}','block-{{c.id}}','unblock-{{c.id}}')"><i class="fas fa-eye-slash fa-fw text-success"></i>Unblock user</button> <button id="unblock-{{c.id}}" class="text-success {% if c.is_blocking %}d-md-inline-block{% endif %} d-none" onclick="post_toast3('/settings/unblock?username={{c.author.username}}','block-{{c.id}}','unblock-{{c.id}}')"><i class="fas fa-eye-slash fa-fw text-success"></i>Unblock user</button>
<button id="prompt-{{c.id}}" class="blockuser list-inline-item d-none text-danger" onclick="post_toast3('/settings/block?username={{c.author.username}}','prompt-{{c.id}}','unblock-{{c.id}}')"><i class="fas fa-eye-slash fa-fw text-danger"></i>Are you sure?</button> <button id="prompt-{{c.id}}" class="blockuser d-none text-danger" onclick="post_toast3('/settings/block?username={{c.author.username}}','prompt-{{c.id}}','unblock-{{c.id}}')"><i class="fas fa-eye-slash fa-fw text-danger"></i>Are you sure?</button>
<button id="block-{{c.id}}" class="btn py-0 nobackground px-1 {% if not c.is_blocking %}d-md-inline-block{% endif %} list-inline-item d-none text-danger" onclick="document.getElementById('block-{{c.id}}').classList.toggle('d-md-inline-block');document.getElementById('prompt-{{c.id}}').classList.toggle('d-md-inline-block');"><i class="fas fa-eye-slash fa-fw text-danger"></i>Block user</button> <button id="block-{{c.id}}" class="btn py-0 nobackground px-1 {% if not c.is_blocking %}d-md-inline-block{% endif %} d-none text-danger" onclick="document.getElementById('block-{{c.id}}').classList.toggle('d-md-inline-block');document.getElementById('prompt-{{c.id}}').classList.toggle('d-md-inline-block');"><i class="fas fa-eye-slash fa-fw text-danger"></i>Block user</button>
{% endif %} {% endif %}
{% if v and c.post and (v.admin_level > 1 or v.id == c.post.author_id) %} {% if v and c.post and (v.admin_level > 1 or v.id == c.post.author_id) %}
<button id="unpin-{{c.id}}" class="{% if c.is_pinned %}d-md-inline-block{% endif %} list-inline-item text-muted d-none text-info" data-bs-dismiss="modal" data-bs-target="#actionsModal-{{c.id}}" onclick="post_toast3('/pin_comment/{{c.id}}','pin-{{c.id}}','unpin-{{c.id}}')"><i class="fas fa-thumbtack fa-rotate--45 text-info fa-fw"></i>Unpin</button> <button id="unpin-{{c.id}}" class="btn py-0 nobackground {% if c.is_pinned %}d-md-inline-block{% endif %} text-muted d-none text-info" data-bs-dismiss="modal" data-bs-target="#actionsModal-{{c.id}}" onclick="post_toast3('/pin_comment/{{c.id}}','pin-{{c.id}}','unpin-{{c.id}}')"><i class="fas fa-thumbtack fa-rotate--45 text-info fa-fw"></i>Unpin</button>
<button id="pin-{{c.id}}" class="btn py-0 nobackground px-1 {% if not c.is_pinned %}d-md-inline-block{% endif %} list-inline-item text-muted d-none text-info" data-bs-dismiss="modal" data-bs-target="#actionsModal-{{c.id}}" onclick="post_toast3('/pin_comment/{{c.id}}','pin-{{c.id}}','unpin-{{c.id}}')"><i class="fas fa-thumbtack fa-rotate--45 text-info fa-fw"></i>Pin</button> <button id="pin-{{c.id}}" class="btn py-0 nobackground px-1 {% if not c.is_pinned %}d-md-inline-block{% endif %} text-muted d-none text-info" data-bs-dismiss="modal" data-bs-target="#actionsModal-{{c.id}}" onclick="post_toast3('/pin_comment/{{c.id}}','pin-{{c.id}}','unpin-{{c.id}}')"><i class="fas fa-thumbtack fa-rotate--45 text-info fa-fw"></i>Pin</button>
{% endif %} {% endif %}
{% if v and v.admin_level > 1 %} {% if v and v.admin_level > 1 %}
{% if "/reported/" in request.path %} {% if "/reported/" in request.path %}
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block text-success" onclick="approveComment('{{c.id}}')"><i class="fas fa-check text-success fa-fw"></i>Approve</button> <button class="btn py-0 nobackground px-1 text-muted text-success" onclick="approveComment('{{c.id}}')"><i class="fas fa-check text-success fa-fw"></i>Approve</button>
<button class="btn py-0 nobackground px-1 list-inline-item text-muted d-none d-md-inline-block text-danger" onclick="removeComment('{{c.id}}')"><i class="fas fa-ban text-danger fa-fw"></i>Remove</button> <button class="btn py-0 nobackground px-1 text-muted text-danger" onclick="removeComment('{{c.id}}')"><i class="fas fa-ban text-danger fa-fw"></i>Remove</button>
{% else %} {% else %}
<button id="approve-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item text-success d-none {% if c.is_banned %}d-md-inline-block{% endif %} text-success" onclick="approveComment('{{c.id}}','approve-{{c.id}}','remove-{{c.id}}')"><i class="fas fa-check text-success fa-fw"></i>Approve</button> <button id="approve-{{c.id}}" class="btn py-0 nobackground px-1 text-success d-none {% if c.is_banned %}d-md-inline-block{% endif %} text-success" onclick="approveComment('{{c.id}}','approve-{{c.id}}','remove-{{c.id}}')"><i class="fas fa-check text-success fa-fw"></i>Approve</button>
<button id="remove-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item text-danger d-none {% if not c.is_banned %}d-md-inline-block{% endif %} text-danger" onclick="removeComment('{{c.id}}','approve-{{c.id}}','remove-{{c.id}}')"><i class="fas fa-ban text-danger fa-fw"></i>Remove</button> <button id="remove-{{c.id}}" class="btn py-0 nobackground px-1 text-danger d-none {% if not c.is_banned %}d-md-inline-block{% endif %} text-danger" onclick="removeComment('{{c.id}}','approve-{{c.id}}','remove-{{c.id}}')"><i class="fas fa-ban text-danger fa-fw"></i>Remove</button>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if v and c.parent_submission and (c.author_id==v.id or v.admin_level > 0) %} {% if v and c.parent_submission and (c.author_id==v.id or v.admin_level > 0) %}
<button id="unmark-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item d-none {% if c.over_18 %}d-md-inline-block{% endif %} text-danger" onclick="post_toast3('/toggle_comment_nsfw/{{c.id}}','mark-{{c.id}}','unmark-{{c.id}}')"><i class="fas fa-eye-evil text-danger fa-fw"></i>Unmark +18</button> <button id="unmark-{{c.id}}" class="btn py-0 nobackground px-1 d-none {% if c.over_18 %}d-md-inline-block{% endif %} text-danger" onclick="post_toast3('/toggle_comment_nsfw/{{c.id}}','mark-{{c.id}}','unmark-{{c.id}}')"><i class="fas fa-eye-evil text-danger fa-fw"></i>Unmark +18</button>
<button id="mark-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item d-none {% if not c.over_18 %}d-md-inline-block{% endif %} text-danger" onclick="post_toast3('/toggle_comment_nsfw/{{c.id}}','mark-{{c.id}}','unmark-{{c.id}}')"><i class="fas fa-eye-evil text-danger fa-fw"></i>Mark +18</button> <button id="mark-{{c.id}}" class="btn py-0 nobackground px-1 d-none {% if not c.over_18 %}d-md-inline-block{% endif %} text-danger" onclick="post_toast3('/toggle_comment_nsfw/{{c.id}}','mark-{{c.id}}','unmark-{{c.id}}')"><i class="fas fa-eye-evil text-danger fa-fw"></i>Mark +18</button>
{% endif %} {% endif %}
{% if v and v.admin_level > 1 and v.id != c.author_id %} {% if v and v.admin_level > 1 and v.id != c.author_id %}
<button id="unban-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item d-none {% if c.author.is_suspended %}d-md-inline-block{% endif %} text-success" id="unexile-comment-{{c.id}}" onclick="post_toast3('/unban_user/{{c.author_id}}','ban-{{c.id}}','unban-{{c.id}}')"><i class="fas fa-user-slash text-success fa-fw"></i>Unban user</button> <button id="unban-{{c.id}}" class="btn py-0 nobackground px-1 d-none {% if c.author.is_suspended %}d-md-inline-block{% endif %} text-success" id="unexile-comment-{{c.id}}" onclick="post_toast3('/unban_user/{{c.author_id}}','ban-{{c.id}}','unban-{{c.id}}')"><i class="fas fa-user-slash text-success fa-fw"></i>Unban user</button>
<button id="ban-{{c.id}}" class="btn py-0 nobackground px-1 list-inline-item d-none {% if not c.author.is_suspended %}d-md-inline-block{% endif %} text-danger" id="exile-comment-{{c.id}}" data-bs-toggle="modal" data-bs-target="#banModal" onclick="banModal('/comment/{{c.id}}', '{{ c.author.id }}', '{{c.author.username}}')"><i class="fas fa-user-slash text-danger fa-fw"></i>Ban user</button> <button id="ban-{{c.id}}" class="btn py-0 nobackground px-1 d-none {% if not c.author.is_suspended %}d-md-inline-block{% endif %} text-danger" id="exile-comment-{{c.id}}" data-bs-toggle="modal" data-bs-target="#banModal" onclick="banModal('/comment/{{c.id}}', '{{ c.author.id }}', '{{c.author.username}}')"><i class="fas fa-user-slash text-danger fa-fw"></i>Ban user</button>
{% endif %} {% endif %}
{% if v and v.admin_level > 1 and c.oauth_app %} {% if v and v.admin_level > 1 and c.oauth_app %}
<a class="list-inline-item text-muted d-none d-md-inline-block" href="{{c.oauth_app.permalink}}/comments"><i class="fas fa-code fa-fw"></i>API App</a> <a class=" text-muted" href="{{c.oauth_app.permalink}}/comments"><i class="fas fa-code fa-fw"></i>API App</a>
{% endif %} {% endif %}
</li></ul>
<button class="btn py-0 nobackground px-1 list-inline-item d-inline-block d-md-none" href="javascript:void(0)" data-bs-toggle="modal" data-bs-target="#actionsModal-{{c.id}}" data-bs-focus="false"><i class="fas fa-ellipsis-h"></i></button>
{% if v and request.path.startswith('/@') and v.admin_level == 0 %}
{% if voted==1 %}<button class="btn py-0 nobackground px-1 list-inline-item arrow-up d-inline-block d-md-none mr-2 comment-{{c.id}}-up active"></button>{% endif %}
{% elif v %}
<button id="comment-mobile-{{c.id}}-up" tabindex="0" onclick="vote('comment-mobile', '{{c.id}}', '1')" class="btn py-0 nobackground px-1 list-inline-item arrow-up upvote-button d-inline-block d-md-none mx-0 mr-1 comment-{{c.id}}-up {% if voted==1 %}active{% endif %}"></button>
{% else %}
<button id="comment-{{c.id}}-up" tabindex="0" onclick="vote('comment', '{{c.id}}', '1')" class="btn py-0 nobackground px-1 list-inline-item arrow-up d-inline-block d-md-none mx-0 mr-1" onclick="location.href='/login';"></button>
{% endif %}
<button class="btn py-0 nobackground px-2 list-inline-item d-inline-block d-md-none mx-0"><span class="points" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-original-title="+{{ups}} | -{{downs}}"><span id="comment-mobile-score-{{c.id}}" class="score comment-score-{{c.id}} {% if voted==1 %}score-up{% elif voted==-1%}score-down{% endif %}">{{score}}</span></span></button>
{% if v and request.path.startswith('/@') and v.admin_level == 0 %}
{% if voted==-1 %}
<button class="btn py-0 nobackground px-1 list-inline-item arrow-down d-inline-block d-md-none mr-2 comment-{{c.id}}-up active"></button>
{% endif %}
{% elif v %}
<button {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-mobile-{{c.id}}-down" tabindex="0" onclick="vote('comment-mobile', '{{c.id}}', '-1')" class="btn py-0 nobackground px-1 list-inline-item arrow-down downvote-button d-inline-block d-md-none mr-0 ml-1 comment-{{c.id}}-down {% if voted==-1 %}active{% endif %}"></button>
{% else %}
<a {% if environ.get('DISABLE_DOWNVOTES') == '1' %}style="display:None!important"{% endif %} id="comment-{{c.id}}-down" tabindex="0" onclick="vote('comment', '{{c.id}}', '-1')" class="list-inline-item arrow-down mr-0 ml-1 d-inline-block d-md-none" onclick="location.href='/login';"></a>
{% endif %}
</ul>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@ -447,24 +462,24 @@
<div class="text-small font-weight-bold mt-1" id="charcount-{{c.id}}" style="right: 1rem; bottom: 0.5rem; z-index: 3;"></div> <div class="text-small font-weight-bold mt-1" id="charcount-{{c.id}}" style="right: 1rem; bottom: 0.5rem; z-index: 3;"></div>
<div class="comment-format" id="comment-format-bar-{{c.id}}"> <div class="comment-format" id="comment-format-bar-{{c.id}}">
<a class="btn btn-secondary format d-inline-block m-0" href="javascript:void(0)"><i class="fas fa-bold" onclick="makeBold('reply-form-body-{{c.fullname}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Bold"></i></a> <a class="btn btn-secondary format m-0" href="javascript:void(0)"><i class="fas fa-bold" onclick="makeBold('reply-form-body-{{c.fullname}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Bold"></i></a>
&nbsp; &nbsp;
<a class="btn btn-secondary format d-inline-block m-0" href="javascript:void(0)"><i class="fas fa-italic" onclick="makeItalics('reply-form-body-{{c.fullname}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Italicize"></i></a> <a class="btn btn-secondary format m-0" href="javascript:void(0)"><i class="fas fa-italic" onclick="makeItalics('reply-form-body-{{c.fullname}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Italicize"></i></a>
&nbsp; &nbsp;
<a class="btn btn-secondary format d-inline-block m-0" href="javascript:void(0)"><i class="fas fa-quote-right" onclick="makeQuote('reply-form-body-{{c.fullname}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Quote"></i></a> <a class="btn btn-secondary format m-0" href="javascript:void(0)"><i class="fas fa-quote-right" onclick="makeQuote('reply-form-body-{{c.fullname}}')" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Quote"></i></a>
&nbsp; &nbsp;
<label class="btn btn-secondary format d-inline-block m-0" for="gif-reply-btn-{{c.fullname}}"> <label class="btn btn-secondary format m-0" for="gif-reply-btn-{{c.fullname}}">
<span id="gif-reply-btn-{{c.fullname}}" class="font-weight-bolder text-uppercase" onclick="commentForm('reply-form-body-{{c.fullname}}');getGif()" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#gifModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add GIF">GIF</span> <span id="gif-reply-btn-{{c.fullname}}" class="font-weight-bolder text-uppercase" onclick="commentForm('reply-form-body-{{c.fullname}}');getGif()" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#gifModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add GIF">GIF</span>
</label> </label>
&nbsp; &nbsp;
<label class="btn btn-secondary format d-inline-block m-0" for="gif-reply-btn-{{c.fullname}}"> <label class="btn btn-secondary format m-0" for="gif-reply-btn-{{c.fullname}}">
<i id="emoji-reply-btn-{{c.fullname}}" class="fas fa-smile-beam" onclick="loadEmojis('reply-form-body-{{c.fullname}}')" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add Emoji"></i> <i id="emoji-reply-btn-{{c.fullname}}" class="fas fa-smile-beam" onclick="loadEmojis('reply-form-body-{{c.fullname}}')" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Add Emoji"></i>
</label> </label>
&nbsp; &nbsp;
<label class="btn btn-secondary format d-inline-block m-0" for="file-upload-reply-{{c.fullname}}"> <label class="btn btn-secondary format m-0" for="file-upload-reply-{{c.fullname}}">
<div id="filename-show-reply-{{c.fullname}}"><i class="far fa-image"></i></div> <div id="filename-show-reply-{{c.fullname}}"><i class="far fa-image"></i></div>
<input id="file-upload-reply-{{c.fullname}}" type="file" name="file" accept="image/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-reply-{{c.fullname}}').innerHTML='image';" hidden> <input id="file-upload-reply-{{c.fullname}}" type="file" name="file" accept="image/*, video/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-reply-{{c.fullname}}').innerHTML='image/video';" hidden>
</label> </label>
</div> </div>
<a id="save-reply-to-{{c.fullname}}" class="btn btn-primary text-white ml-2 fl-r commentmob" onclick="post_comment('{{c.fullname}}', '{{c.post.id}}');" href="javascript:void(0)">Comment</a> <a id="save-reply-to-{{c.fullname}}" class="btn btn-primary text-white ml-2 fl-r commentmob" onclick="post_comment('{{c.fullname}}', '{{c.post.id}}');" href="javascript:void(0)">Comment</a>
@ -788,7 +803,7 @@
</style> </style>
{% if v %} {% if v %}
<script src="/assets/js/marked.js?v=190"></script> <script src="/assets/js/marked.js?v=191"></script>
<script src="/assets/js/comments_v.js?v=191"></script> <script src="/assets/js/comments_v.js?v=191"></script>
{% endif %} {% endif %}

View File

@ -6,12 +6,12 @@
<script src="/assets/js/bootstrap.js?v=190"></script> <script src="/assets/js/bootstrap.js?v=190"></script>
{% if v %} {% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style> <style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"> <link rel="stylesheet" href="/assets/css/main.css?v=428">
<link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190"> <link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %} {% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %} {% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
{% endif %} {% endif %}
<link href="/assets/css/fa.css?v=193" rel="stylesheet"> <link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -81,7 +81,7 @@
</div> </div>
</div> </div>
<script src="/assets/js/emoji_modal.js?v=193"></script> <script src="/assets/js/emoji_modal.js?v=194"></script>
<style> <style>
a.emojitab { a.emojitab {

View File

@ -62,15 +62,10 @@ You can use Markdown formatting:
<td><lite-youtube videoid="3Hecr51ByE4" params="controls=0&modestbranding=1"></lite-youtube></td> <td><lite-youtube videoid="3Hecr51ByE4" params="controls=0&modestbranding=1"></lite-youtube></td>
</tr> </tr>
<tr> <tr>
<td>MP4 Files</td> <td>Video Files</td>
<td>https://files.catbox.moe/v4om92.mp4</td> <td>https://files.catbox.moe/v4om92.mp4</td>
<td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/v4om92.mp4" type="video/mp4"></video></td> <td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/v4om92.mp4" type="video/mp4"></video></td>
</tr> </tr>
<tr>
<td>WEBM Files</td>
<td>https://files.catbox.moe/v4om92.mp4</td>
<td><video controls preload="none" class="embedvid"><source src="https://files.catbox.moe/nr9joo.webm" type="video/webm"></video></td>
</tr>
<tr> <tr>
<td>Emojis</td> <td>Emojis</td>
<td>:marseylove:</td> <td>:marseylove:</td>

View File

@ -112,7 +112,7 @@
<button class="dropdown-item copy-link" data-clipboard-text="/signup?ref={{v.username}}"><i class="fad fa-user-friends fa-fw text-left mr-3"></i>Invite friends</button> <button class="dropdown-item copy-link" data-clipboard-text="/signup?ref={{v.username}}"><i class="fad fa-user-friends fa-fw text-left mr-3"></i>Invite friends</button>
</div> </div>
<div class="px-2"> <div class="px-2">
<a class="dropdown-item" href="/assets/{{'SITE_NAME' | app_config}}.apk?v=190"><i class="fab fa-android fa-fw text-left mr-3"></i>Android app</a> <a class="dropdown-item" href="/assets/{{'SITE_NAME' | app_config}}.apk?v=192"><i class="fab fa-android fa-fw text-left mr-3"></i>Android app</a>
<a class="dropdown-item" href="/rules"><i class="fas fa-balance-scale fa-fw text-left mr-3"></i>Rules</a> <a class="dropdown-item" href="/rules"><i class="fas fa-balance-scale fa-fw text-left mr-3"></i>Rules</a>
@ -176,7 +176,7 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="/settings"><i class="fas fa-cog fa-fw mr-3"></i>Settings</a> <a class="nav-link" href="/settings"><i class="fas fa-cog fa-fw mr-3"></i>Settings</a>
</li> </li>
<a class="nav-item nav-link" href="/assets/{{'SITE_NAME' | app_config}}.apk?v=190"><i class="fab fa-android fa-fw mr-3"></i>Android app</a> <a class="nav-item nav-link" href="/assets/{{'SITE_NAME' | app_config}}.apk?v=192"><i class="fab fa-android fa-fw mr-3"></i>Android app</a>
<a class="nav-item nav-link" href="/rules"><i class="fas fa-balance-scale fa-fw mr-3"></i>Rules</a> <a class="nav-item nav-link" href="/rules"><i class="fas fa-balance-scale fa-fw mr-3"></i>Rules</a>

View File

@ -19,7 +19,7 @@
script.onload = resolve; script.onload = resolve;
script.onerror = reject; script.onerror = reject;
script.async = true; script.async = true;
script.src = '/assets/js/fp.js?v=3'; script.src = '/assets/js/fp.js?v=4';
document.head.appendChild(script); document.head.appendChild(script);
}) })
.then(() => FingerprintJS.load({token: '{{environ.get("FP")}}'})); .then(() => FingerprintJS.load({token: '{{environ.get("FP")}}'}));

View File

@ -6,11 +6,11 @@
{% block content %} {% block content %}
{% if v %} {% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style> <style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %} {% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %} {% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
{% endif %} {% endif %}
<div class="row justify-content-around"> <div class="row justify-content-around">

View File

@ -17,7 +17,7 @@
{% endblock %} {% endblock %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"> <link rel="stylesheet" href="/assets/css/main.css?v=428">
<link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
<link href="/assets/css/fa.css?v=193" rel="stylesheet"> <link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -13,7 +13,7 @@
<title>2-Step Login - {{'SITE_NAME' | app_config}}</title> <title>2-Step Login - {{'SITE_NAME' | app_config}}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
</head> </head>

View File

@ -33,7 +33,7 @@
<style>:root{--primary:#{{v.themecolor}}}</style> <style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %} {% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
<link href="/assets/css/fa.css?v=193" rel="stylesheet"> <link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -38,10 +38,10 @@
{% if v %} {% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style> <style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190">
{% else %} {% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
{% endif %} {% endif %}
<link href="/assets/css/fa.css?v=193" rel="stylesheet"> <link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -544,7 +544,7 @@
&nbsp; &nbsp;
<label class="btn btn-secondary format d-inline-block m-0"> <label class="btn btn-secondary format d-inline-block m-0">
<div id="filename-show"><i class="far fa-image"></i></div> <div id="filename-show"><i class="far fa-image"></i></div>
<input id="file-upload" type="file" name="file" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} accept="image/*" onchange="document.getElementById('filename-show').innerHTML='image';" hidden> <input id="file-upload" type="file" name="file" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} accept="image/*, video/*" onchange="document.getElementById('filename-show').innerHTML='image/video';" hidden>
</label> </label>
</div> </div>
<pre></pre> <pre></pre>

View File

@ -30,7 +30,7 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}Sign up - {{'SITE_NAME' | app_config}}{% endif %}</title> <title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}Sign up - {{'SITE_NAME' | app_config}}{% endif %}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
</head> </head>
@ -151,7 +151,7 @@
<script src="/assets/js/signup.js?v=190"></script> <script src="/assets/js/signup.js?v=190"></script>
{% if hcaptcha %} {% if hcaptcha %}
<script src="/assets/js/hcaptcha.js?v=190"></script> <script src="/assets/js/hcaptcha.js?v=191"></script>
{% endif %} {% endif %}
</body> </body>

View File

@ -31,7 +31,7 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}{{'SITE_NAME' | app_config}}{% endif %}</title> <title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}{{'SITE_NAME' | app_config}}{% endif %}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
</head> </head>

View File

@ -339,7 +339,7 @@
{% endif %} {% endif %}
<a class="user-name text-decoration-none" onclick='popclick({{p.author.json_popover(v) | tojson}})' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="focus" data-content-id="popover" href="javascript:void(0)" tabindex="0" style="color: #{{p.author.namecolor}}; font-weight: bold;" class="user-name"><img loading="lazy" src="{{p.author.profile_url}}" class="profile-pic-25 mr-2"><span {% if p.author.patron and not p.distinguish_level %}class="patron" style="background-color:#{{p.author.namecolor}};"{% elif p.distinguish_level and 'rama' in request.host %}class="mod"{% endif %}>{{p.author.username}}</span></a>{% if p.author.customtitle %}&nbsp;<bdi style="color: #{{p.author.titlecolor}}">&nbsp;{% if p.author.quadrant %}<img loading="lazy" height="20" src="/assets/images/quadrants/{{p.author.quadrant}}.webp?v=190">{% endif %}{{p.author.customtitle | safe}}</bdi>{% endif %} <a class="user-name text-decoration-none" onclick='popclick({{p.author.json_popover(v) | tojson}})' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="focus" data-content-id="popover" href="javascript:void(0)" tabindex="0" style="color: #{{p.author.namecolor}}; font-weight: bold;" class="user-name"><img loading="lazy" src="{{p.author.profile_url}}" class="profile-pic-25 mr-2"><span {% if p.author.patron and not p.distinguish_level %}class="patron" style="background-color:#{{p.author.namecolor}};"{% elif p.distinguish_level and 'rama' in request.host %}class="mod"{% endif %}>{{p.author.username}}</span></a>{% if p.author.customtitle %}&nbsp;<bdi style="color: #{{p.author.titlecolor}}">&nbsp;{% if p.author.quadrant %}<img loading="lazy" height="20" src="/assets/images/quadrants/{{p.author.quadrant}}.webp?v=190">{% endif %}{{p.author.customtitle | safe}}</bdi>{% endif %}
<span data-bs-toggle="tooltip" data-bs-placement="bottom" id="timestamp" onmouseover="timestamp('timestamp','{{p.created_utc}}')">&nbsp;{{p.age_string}}</span> <span data-bs-toggle="tooltip" data-bs-placement="bottom" id="timestamp" onmouseover="timestamp('timestamp','{{p.created_utc}}')">&nbsp;{{p.age_string}}</span>
({% if p.is_image %}image post{% elif p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if not v or v.newtabexternal %}target="_blank"{% endif %}>{{p.domain}}</a>{% else %}text post{% endif %}) ({% if p.is_image %}image post{% elif p.is_video %}video post{% elif p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if not v or v.newtabexternal %}target="_blank"{% endif %}>{{p.domain}}</a>{% else %}text post{% endif %})
{% if p.edited_utc %} {% if p.edited_utc %}
&nbsp;&nbsp;Edited <span data-bs-toggle="tooltip" data-bs-placement="bottom" onmouseover="timestamp('edited_timestamp','{{p.edited_utc}}')" id="edited_timestamp">{{p.edited_string}}</span> &nbsp;&nbsp;Edited <span data-bs-toggle="tooltip" data-bs-placement="bottom" onmouseover="timestamp('edited_timestamp','{{p.edited_utc}}')" id="edited_timestamp">{{p.edited_string}}</span>
@ -408,7 +408,7 @@
</div> </div>
</div> </div>
<pre></pre> <pre></pre>
{% elif p.url and p.url.lower().endswith('.mp4') %} {% elif p.is_video %}
<div class="row no-gutters"> <div class="row no-gutters">
<div class="col"> <div class="col">
<video controls preload="none" class="embedvid"> <video controls preload="none" class="embedvid">
@ -417,15 +417,6 @@
</div> </div>
</div> </div>
<pre></pre> <pre></pre>
{% elif p.url and p.url.lower().endswith('.webm') %}
<div class="row no-gutters">
<div class="col">
<video controls preload="none" class="embedvid">
<source src="{{p.realurl(v)}}" type="video/webm">
</video>
</div>
</div>
<pre></pre>
{% endif %} {% endif %}
{{p.realbody(v) | safe}} {{p.realbody(v) | safe}}
@ -477,7 +468,7 @@
<label class="format btn btn-secondary m-0 ml-1 {% if v %}d-inline-block{% else %}d-none{% endif %}" for="file-upload-edit-{{p.id}}"> <label class="format btn btn-secondary m-0 ml-1 {% if v %}d-inline-block{% else %}d-none{% endif %}" for="file-upload-edit-{{p.id}}">
<div id="filename-show-edit-{{p.id}}"><i class="far fa-image"></i></div> <div id="filename-show-edit-{{p.id}}"><i class="far fa-image"></i></div>
<input id="file-upload-edit-{{p.id}}" type="file" name="file" accept="image/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-edit-{{p.id}}').innerHTML='image';" hidden> <input id="file-upload-edit-{{p.id}}" type="file" name="file" accept="image/*, video/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-edit-{{p.id}}').innerHTML='image/video';" hidden>
</label> </label>
<small class="format d-none"><i class="fas fa-link" aria-hidden="true"></i></small> <small class="format d-none"><i class="fas fa-link" aria-hidden="true"></i></small>
@ -751,7 +742,7 @@
</label> </label>
<label class="format btn btn-secondary m-0 ml-1 {% if v %}d-inline-block{% else %}d-none{% endif %}" for="file-upload-reply-{{p.fullname}}"> <label class="format btn btn-secondary m-0 ml-1 {% if v %}d-inline-block{% else %}d-none{% endif %}" for="file-upload-reply-{{p.fullname}}">
<div id="filename-show-reply-{{p.fullname}}"><i class="far fa-image"></i></div> <div id="filename-show-reply-{{p.fullname}}"><i class="far fa-image"></i></div>
<input id="file-upload-reply-{{p.fullname}}" type="file" name="file" accept="image/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-reply-{{p.fullname}}').innerHTML='image';" hidden> <input id="file-upload-reply-{{p.fullname}}" type="file" name="file" accept="image/*, video/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-reply-{{p.fullname}}').innerHTML='image/video';" hidden>
</label> </label>
</div> </div>
<a id="save-reply-to-{{p.fullname}}" href="javascript:void(0)" form="reply-to-{{p.fullname}}" class="btn btn-primary text-whitebtn ml-auto fl-r" onclick="post_comment('{{p.fullname}}', '{{p.id}}')">Comment</a> <a id="save-reply-to-{{p.fullname}}" href="javascript:void(0)" form="reply-to-{{p.fullname}}" class="btn btn-primary text-whitebtn ml-auto fl-r" onclick="post_comment('{{p.fullname}}', '{{p.id}}')">Comment</a>

View File

@ -185,7 +185,7 @@
<a class="user-name text-decoration-none" onclick='popclick({{p.author.json_popover(v) | tojson}})' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="focus" data-content-id="popover" href="javascript:void(0)" tabindex="0" style="color: #{{p.author.namecolor}}; font-weight: bold;"><img loading="lazy" src="{{p.author.profile_url}}" class="profile-pic-25 mr-2"><span {% if p.author.patron and not p.distinguish_level %}class="patron" style="background-color:#{{p.author.namecolor}};"{% elif p.distinguish_level and 'rama' in request.host %}class="mod"{% endif %}>{{p.author.username}}</span></a>{% if p.author.customtitle %}<bdi style="color: #{{p.author.titlecolor}}">&nbsp;&nbsp;{% if p.author.quadrant %}<img loading="lazy" height="20" src="/assets/images/quadrants/{{p.author.quadrant}}.webp?v=190">{% endif %}{{p.author.customtitle | safe}}</bdi>{% endif %} <a class="user-name text-decoration-none" onclick='popclick({{p.author.json_popover(v) | tojson}})' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="focus" data-content-id="popover" href="javascript:void(0)" tabindex="0" style="color: #{{p.author.namecolor}}; font-weight: bold;"><img loading="lazy" src="{{p.author.profile_url}}" class="profile-pic-25 mr-2"><span {% if p.author.patron and not p.distinguish_level %}class="patron" style="background-color:#{{p.author.namecolor}};"{% elif p.distinguish_level and 'rama' in request.host %}class="mod"{% endif %}>{{p.author.username}}</span></a>{% if p.author.customtitle %}<bdi style="color: #{{p.author.titlecolor}}">&nbsp;&nbsp;{% if p.author.quadrant %}<img loading="lazy" height="20" src="/assets/images/quadrants/{{p.author.quadrant}}.webp?v=190">{% endif %}{{p.author.customtitle | safe}}</bdi>{% endif %}
<span data-bs-toggle="tooltip" data-bs-placement="bottom" onmouseover="timestamp('timestamp-{{p.id}}','{{p.created_utc}}')" id="timestamp-{{p.id}}">&nbsp;{{p.age_string}}</span> <span data-bs-toggle="tooltip" data-bs-placement="bottom" onmouseover="timestamp('timestamp-{{p.id}}','{{p.created_utc}}')" id="timestamp-{{p.id}}">&nbsp;{{p.age_string}}</span>
&nbsp; &nbsp;
({% if p.is_image %}image post{% elif p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if v and v.newtab %}target="_blank"{% endif %}>{{p.domain}}</a>{% else %}text post{% endif %}) ({% if p.is_image %}image post{% elif p.is_video %}video post{% elif p.realurl(v) %}<a href="/search/posts/?q=domain%3A{{p.domain}}&sort=new&t=all" {% if v and v.newtab %}target="_blank"{% endif %}>{{p.domain}}</a>{% else %}text post{% endif %})
{% if p.edited_utc %} {% if p.edited_utc %}
&nbsp;&nbsp;Edited <span data-bs-toggle="tooltip" data-bs-placement="bottom" id="edited_timestamp-{{p.id}}" onmouseover="timestamp('edited_timestamp-{{p.id}}','{{p.edited_utc}}')">{{p.edited_string}}</span> &nbsp;&nbsp;Edited <span data-bs-toggle="tooltip" data-bs-placement="bottom" id="edited_timestamp-{{p.id}}" onmouseover="timestamp('edited_timestamp-{{p.id}}','{{p.edited_utc}}')">{{p.edited_string}}</span>
{% endif %} {% endif %}
@ -506,20 +506,12 @@
<img loading="lazy" src="/assets/images/loading.webp" data-src="{{p.url}}" class="img-fluid" style="max-height:20rem;" alt="Unable to load image"> <img loading="lazy" src="/assets/images/loading.webp" data-src="{{p.url}}" class="img-fluid" style="max-height:20rem;" alt="Unable to load image">
</a> </a>
</div> </div>
{% endif %} {% elif p.is_video %}
{% if p.url and p.url.lower().endswith('.mp4') %}
<div id="video-{{p.id}}" style="text-align: center" class="{% if p.over_18 or not ((v and v.cardview) or (not v and environ.get('CARD_VIEW') == '1')) %}d-none{% endif %} mt-4"> <div id="video-{{p.id}}" style="text-align: center" class="{% if p.over_18 or not ((v and v.cardview) or (not v and environ.get('CARD_VIEW') == '1')) %}d-none{% endif %} mt-4">
<video controls preload="none" class="embedvid"> <video controls preload="none" class="embedvid">
<source src="{{p.realurl(v)}}" type="video/mp4"> <source src="{{p.realurl(v)}}" type="video/mp4">
</video> </video>
</div> </div>
{% elif p.url and p.url.lower().endswith('.webm') %}
<div id="video-{{p.id}}" style="text-align: center" class="{% if p.over_18 or not ((v and v.cardview) or (not v and environ.get('CARD_VIEW') == '1')) %}d-none{% endif %} mt-4">
<video controls preload="none" class="embedvid">
<source src="{{p.realurl(v)}}" type="video/webm">
</video>
</div>
{% elif p.embed_url and p.domain in ['youtu.be','youtube.com'] and p.embed_url.startswith('<lite-youtube') %} {% elif p.embed_url and p.domain in ['youtu.be','youtube.com'] and p.embed_url.startswith('<lite-youtube') %}
<div id="video-{{p.id}}" class="{% if p.over_18 or not ((v and v.cardview) or (not v and environ.get('CARD_VIEW') == '1')) %}d-none{% endif %} mt-3 mb-4"> <div id="video-{{p.id}}" class="{% if p.over_18 or not ((v and v.cardview) or (not v and environ.get('CARD_VIEW') == '1')) %}d-none{% endif %} mt-3 mb-4">
{{p.embed_url | safe}} {{p.embed_url | safe}}

View File

@ -25,11 +25,11 @@
{% block stylesheets %} {% block stylesheets %}
{% if v %} {% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style> <style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190"> <link rel="stylesheet" href="/assets/css/main.css?v=428"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=190">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %} {% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %} {% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style> <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=420"> <link rel="stylesheet" href="/assets/css/main.css?v=428">
<link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190"> <link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=190">
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@ -122,7 +122,7 @@
<label class="format btn btn-secondary m-0 ml-1 {% if v %}d-inline-block{% else %}d-none{% endif %}" for="file-upload-submit"> <label class="format btn btn-secondary m-0 ml-1 {% if v %}d-inline-block{% else %}d-none{% endif %}" for="file-upload-submit">
<div id="filename-show-submit"><i class="far fa-image"></i></div> <div id="filename-show-submit"><i class="far fa-image"></i></div>
<input id="file-upload-submit" type="file" name="file2" accept="image/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-submit').innerHTML='image';" hidden> <input id="file-upload-submit" type="file" name="file2" accept="image/*, video/*" {% if request.headers.get('cf-ipcountry')=="T1" %}disabled{% endif %} onchange="document.getElementById('filename-show-submit').innerHTML='image/video';" hidden>
</label> </label>
<pre></pre> <pre></pre>
@ -175,7 +175,7 @@
</div> </div>
{% endblock %} {% endblock %}
<script src="/assets/js/marked.js?v=190"></script> <script src="/assets/js/marked.js?v=191"></script>
<script src="/assets/js/formatting.js?v=190"></script> <script src="/assets/js/formatting.js?v=190"></script>
<script src="/assets/js/submit.js?v=190"></script> <script src="/assets/js/submit.js?v=190"></script>