Merge branch 'master' into mistletoe

remotes/1693045480750635534/spooky-22
kek7198 2021-11-30 15:45:27 -06:00
commit 2670e1cad1
31 changed files with 225 additions and 123 deletions

View File

@ -3,7 +3,7 @@ from flask import g
def get_id(username, v=None, graceful=False):
username = username.replace('\\', '')
username = username.replace('_', '\_')
username = username.replace('%', '')
@ -28,6 +28,10 @@ def get_id(username, v=None, graceful=False):
def get_user(username, v=None, graceful=False):
if not username:
if not graceful: abort(404)
else: return None
username = username.replace('\\', '')
username = username.replace('_', '\_')
username = username.replace('%', '')
@ -42,10 +46,8 @@ def get_user(username, v=None, graceful=False):
).first()
if not user:
if not graceful:
abort(404)
else:
return None
if not graceful: abort(404)
else: return None
if v:
block = g.db.query(UserBlock).filter(

View File

@ -84,7 +84,7 @@ def is_not_banned(f):
check_ban_evade(v)
if v.is_suspended: abort(403)
if v.is_suspended: return {"error": "You can't perform this action while being banned."}, 403
g.v = v

View File

@ -546,13 +546,15 @@ def award_post(pid, v):
elif kind == "pause":
author.mute = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=68, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(68):
new_badge = Badge(badge_id=68, user_id=author.id)
g.db.add(new_badge)
elif kind == "unpausable":
author.unmutable = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=67, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(67):
new_badge = Badge(badge_id=67, user_id=author.id)
g.db.add(new_badge)
elif kind == "marsey":
if author.marseyawarded: author.marseyawarded += 86400
else: author.marseyawarded = time.time() + 86400
@ -570,18 +572,21 @@ def award_post(pid, v):
elif kind == "eye":
author.eye = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=83, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(83):
new_badge = Badge(badge_id=83, user_id=author.id)
g.db.add(new_badge)
elif kind == "alt":
author.alt = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=84, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(84):
new_badge = Badge(badge_id=84, user_id=author.id)
g.db.add(new_badge)
elif kind == "unblockable":
author.unblockable = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=87, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(87):
new_badge = Badge(badge_id=87, user_id=author.id)
g.db.add(new_badge)
for block in g.db.query(UserBlock).filter_by(target_id=author.id).all(): g.db.delete(block)
post.author.received_award_count += 1
@ -693,13 +698,15 @@ def award_comment(cid, v):
elif kind == "pause":
author.mute = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=68, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(68):
new_badge = Badge(badge_id=68, user_id=author.id)
g.db.add(new_badge)
elif kind == "unpausable":
author.unmutable = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=67, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(67):
new_badge = Badge(badge_id=67, user_id=author.id)
g.db.add(new_badge)
elif kind == "marsey":
if author.marseyawarded: author.marseyawarded += 86400
else: author.marseyawarded = time.time() + 86400
@ -717,18 +724,21 @@ def award_comment(cid, v):
elif kind == "eye":
author.eye = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=83, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(83):
new_badge = Badge(badge_id=83, user_id=author.id)
g.db.add(new_badge)
elif kind == "alt":
author.alt = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=84, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(84):
new_badge = Badge(badge_id=84, user_id=author.id)
g.db.add(new_badge)
elif kind == "unblockable":
author.unblockable = True
send_notification(CARP_ID, f"@{v.username} used {kind} award!")
new_badge = Badge(badge_id=87, user_id=author.id)
g.db.add(new_badge)
if not author.has_badge(87):
new_badge = Badge(badge_id=87, user_id=author.id)
g.db.add(new_badge)
for block in g.db.query(UserBlock).filter_by(target_id=author.id).all(): g.db.delete(block)
c.author.received_award_count += 1

View File

@ -221,6 +221,9 @@ def post_id(pid, anything=None, v=None):
@auth_required
@validate_formkey
def edit_post(pid, v):
if v and v.patron:
if request.content_length > 8 * 1024 * 1024: return "Max file size is 8 MB.", 413
elif request.content_length > 4 * 1024 * 1024: return "Max file size is 4 MB.", 413
p = get_post(pid)
@ -264,6 +267,16 @@ def edit_post(pid, v):
p.title = title
p.title_html = title_html
if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1":
file=request.files["file"]
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
file.save(name)
url = request.host_url[:-1] + process_image(name)
body += f"\n\n![]({url})"
if body != p.body:
for i in re.finditer('^(https:\/\/.*\.(png|jpg|jpeg|gif|webp|PNG|JPG|JPEG|GIF|WEBP|9999))', body, re.MULTILINE):
if "wikipedia" not in i.group(1): body = body.replace(i.group(1), f'![]({i.group(1)})')
@ -587,7 +600,7 @@ def submit_post(v):
domain = parsed_url.netloc
qd = parse_qs(parsed_url.query)
filtered = dict((k, v) for k, v in qd.items() if not k.startswith('utm_'))
filtered = dict((k, v) for k, v in qd.items() if not k.startswith('utm_') and not k.startswith('ref_'))
new_url = ParseResult(scheme="https",
netloc=parsed_url.netloc,
@ -742,6 +755,16 @@ def submit_post(v):
body = body.replace('I ', f'@{v.username} ')
body = censor_slurs2(body).upper().replace(' ME ', f' @{v.username} ')
if request.files.get("file2") and request.headers.get("cf-ipcountry") != "T1":
file=request.files["file2"]
if not file.content_type.startswith('image/'): return {"error": "That wasn't an image!"}, 400
name = f'/images/{int(time.time())}{secrets.token_urlsafe(2)}.webp'
file.save(name)
url = request.host_url[:-1] + process_image(name)
body += f"\n\n![]({url})"
body_html = sanitize(CustomRenderer().render(mistletoe.Document(body)))
if v.marseyawarded and len(list(re.finditer('>[^<\s+]|[^>\s+]<', body_html))) > 0: return {"error":"You can only type marseys!"}, 400

View File

@ -873,6 +873,8 @@ def fp(v, fp):
if v.username != fp:
v.fp = fp
users = g.db.query(User).filter(User.fp == fp, User.id != v.id).all()
if v.email and v.is_activated:
users += g.db.query(User).filter(User.email == email, User.is_activated, User.id != v.id).all()
for u in users:
li = [v.id, u.id]
existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).first()

View File

@ -12,6 +12,7 @@
{% block fixedMobileBarJS %}
<script>
window.addEventListener('DOMContentLoaded', function() {
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
@ -31,6 +32,8 @@
}
prevScrollpos = currentScrollPos;
}
});
</script>
{% endblock %}

View File

@ -40,6 +40,7 @@
{% block fixedMobileBarJS %}
<script>
window.addEventListener('DOMContentLoaded', function() {
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
@ -59,6 +60,8 @@
}
prevScrollpos = currentScrollPos;
}
});
</script>
{% endblock %}

View File

@ -1,5 +1,3 @@
<script src="/assets/js/award_modal.js?v=57"></script>
<div class="modal fade" id="awardModal" tabindex="-1" role="dialog" aria-labelledby="awardModalTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-dialog-centered" role="document">
<div class="modal-content">
@ -38,6 +36,8 @@
</div>
</div>
<script defer src="/assets/js/award_modal.js?v=57"></script>
<style>
.awards-wrapper input[type="radio"] {
display: none;

View File

@ -1,5 +1,6 @@
<script>
window.addEventListener('DOMContentLoaded', function() {
const banModal = function(link, id, name) {
document.getElementById("banModalTitle").innerHTML = `Ban @${name}`;
document.getElementById("ban-modal-link").value = link;
@ -22,6 +23,8 @@
xhr.send(fd);
}
};
});
</script>
<div class="modal fade" id="banModal" tabindex="-1" role="dialog" aria-labelledby="banModalTitle" aria-hidden="true">

View File

@ -3,7 +3,6 @@
{% block pagetitle %}Changelog{% endblock %}
{% block desktopBanner %}
<script src="/assets/js/changelog.js?v=54"></script>
<div class="row" style="overflow: visible;padding-top:5px;">
<div class="col">
@ -105,4 +104,7 @@
</ul>
</nav>
{% endif %}
<script defer src="/assets/js/changelog.js?v=54"></script>
{% endblock %}

View File

@ -1,6 +1,9 @@
{{p.embed_url | safe}}
<script src="/assets/js/twitter.js" charset="utf-8">
<script defer src="/assets/js/twitter.js" charset="utf-8">
</script>
<script>
window.addEventListener('DOMContentLoaded', function() {
document.getElementById('twitter-widget-0').setAttribute('sandbox','')
});
</script>

View File

@ -1,6 +1,9 @@
{{p.embed_url | safe}}
<script src="https://platform.twitter.com/widgets.js" charset="utf-8">
<script defer src="https://platform.twitter.com/widgets.js" charset="utf-8">
</script>
<script>
window.addEventListener('DOMContentLoaded', function() {
document.getElementById('twitter-widget-0').setAttribute('sandbox','')
});
</script>

View File

@ -1,23 +1,3 @@
<script src="/assets/js/emoji_modal.js?v=122"></script>
<style>
a.emojitab {
padding: 0.5rem 0.7rem !important;
font-size: 13px !important;
}
.emoji2 {
background: None!important;
width:60px;
overflow: hidden;
border: none;
}
.emoji2:focus {
border: 1px solid var(--primary) !important;
}
</style>
<div id="form" class="d-none"></div>
<div class="modal fade" id="emojiModal" tabindex="-1" role="dialog" aria-labelledby="emojiModalTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-dialog-centered p-2 py-5" role="document">
@ -102,4 +82,24 @@
</div>
</div>
</div>
</div>
</div>
<script defer src="/assets/js/emoji_modal.js?v=122"></script>
<style>
a.emojitab {
padding: 0.5rem 0.7rem !important;
font-size: 13px !important;
}
.emoji2 {
background: None!important;
width:60px;
overflow: hidden;
border: none;
}
.emoji2:focus {
border: 1px solid var(--primary) !important;
}
</style>

View File

@ -4,7 +4,6 @@
document.getElementById("desktop-expanded-image-link").href = image;
document.getElementById("desktop-expanded-image-wrap-link").href=image;
};
</script>

View File

@ -1,11 +1,14 @@
{% extends "default.html" %}
{% block content %}
<script>
window.addEventListener('DOMContentLoaded', function() {
function removeFollower(event, username) {
post_toast('/remove_follow/' + username);
let table = document.getElementById("followers-table");
table.removeChild(event.target.parentElement.parentElement);
}
});
</script>
<pre>

View File

@ -1,11 +1,14 @@
{% extends "default.html" %}
{% block content %}
<script>
window.addEventListener('DOMContentLoaded', function() {
function removeFollower(event, username) {
post_toast('/unfollow/' + username);
let table = document.getElementById("followers-table");
table.removeChild(event.target.parentElement.parentElement);
}
});
</script>
<pre>

View File

@ -1,5 +1,3 @@
<script src="/assets/js/gif_modal.js?v=54"></script>
<div class="modal fade" id="gifModal" tabindex="-1" role="dialog" aria-labelledby="gifModalTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-dialog-centered p-5" role="document">
<div class="modal-content">
@ -27,3 +25,5 @@
</div>
</div>
</div>
<script defer src="/assets/js/gif_modal.js?v=54"></script>

View File

@ -1,16 +1,3 @@
{% if v %}<script>function formkey() {return '{{v.formkey}}';}</script>{% endif %}
<script src="/assets/js/header.js?v=54"></script>
<style>
.notif-count {
background: red;
border-radius: 20%;
color: white;
padding: 2px 5px;
font-weight: 700;
}
</style>
<nav class="shadow shadow-md fixed-top">
{% if "rama" in request.host %}
<div id="srd" style="width: 100%; background-color: var(--primary); padding: 2px; text-align: center; font-weight: bold;">
@ -125,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>
</div>
<div class="px-2">
<a class="dropdown-item" href="/assets/{{'SITE_NAME' | app_config}}_App.apk"><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=2"><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>
@ -189,7 +176,7 @@
<li class="nav-item">
<a class="nav-link" href="/settings"><i class="fas fa-cog fa-fw mr-3"></i>Settings</a>
</li>
<a class="nav-item nav-link" href="/assets/{{'SITE_NAME' | app_config}}_App.apk"><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=2"><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>
@ -224,4 +211,21 @@
</div>
</div>
</div>
</nav>
</nav>
{% if v %}
<script>
function formkey() {return '{{v.formkey}}';}
</script>
{% endif %}
<script defer src="/assets/js/header.js?v=54"></script>
<style>
.notif-count {
background: red;
border-radius: 20%;
color: white;
padding: 2px 5px;
font-weight: 700;
}
</style>

View File

@ -4,17 +4,6 @@
{% block content %}
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>
<script>
var clipboard = new ClipboardJS('.copy-link');
clipboard.on('success', function(e) {
var myToast = new bootstrap.Toast(document.getElementById('toast-success'));
myToast.show();
console.log(e);
});
</script>
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=131"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=124">
@ -132,4 +121,16 @@
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>
<script>
var clipboard = new ClipboardJS('.copy-link');
clipboard.on('success', function(e) {
var myToast = new bootstrap.Toast(document.getElementById('toast-success'));
myToast.show();
});
</script>
{% endblock %}

View File

@ -3,7 +3,6 @@
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Sign in to {{'SITE_NAME' | app_config}}">
@ -115,6 +114,8 @@
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@ -3,10 +3,6 @@
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<script>function formkey() {return '{{v.formkey}}';}</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
@ -172,6 +168,12 @@
{% block scripts %}
{% endblock %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<script>
function formkey() {return '{{v.formkey}}';}
</script>
</body>
</html>

View File

@ -6,6 +6,7 @@
<script>
window.addEventListener('DOMContentLoaded', function() {
block_user=function() {
var exileForm = document.getElementById("exile-form");
@ -39,6 +40,8 @@
xhr.send(f)
}
}
});
</script>
<div class="row">

View File

@ -38,12 +38,15 @@
</div>
{% if v.agendaposter %}
<script>
window.addEventListener('DOMContentLoaded', function() {
const flip = (e) => {
e.preventDefault();
document.getElementsByTagName("body")[0].setAttribute("style", "-moz-transform: scale(-1, -1);-o-transform: scale(-1, -1);-webkit-transform: scale(-1, -1);transform: scale(-1, -1);");
};
document.getElementById("submit-btn").onclick = flip;
});
</script>
{% endif %}
</div>

View File

@ -5,11 +5,14 @@
{% block content %}
<script>
window.addEventListener('DOMContentLoaded', function() {
document.getElementById('new_email').addEventListener('input', function () {
document.getElementById("email-password").classList.remove("d-none");
document.getElementById("email-password-label").classList.remove("d-none");
document.getElementById("emailpasswordRequired").classList.remove("d-none");
});
});
</script>
<div class="row">

View File

@ -2,14 +2,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<script src="/assets/js/signup.js?v=63"></script>
{% if hcaptcha %}
<script src="https://hcaptcha.com/1/api.js"></script>
{% endif %}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Sign up in under 27 seconds.">
@ -153,6 +145,15 @@
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<script defer src="/assets/js/signup.js?v=63"></script>
{% if hcaptcha %}
<script defer src="https://hcaptcha.com/1/api.js"></script>
{% endif %}
</body>
</html>

View File

@ -3,8 +3,6 @@
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Sign up in under 27 seconds.">
@ -97,6 +95,9 @@
<i class="fas fa-check-circle text-success mr-2"></i>Link copied to clipboard
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@ -1,11 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/marked@3.0.8/lib/marked.min.js"></script>
<script src="/assets/js/submit.js?v=72"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
@ -18,9 +13,6 @@
{% set cc='Country Club' %}
{% endif %}
{% include "emoji_modal.html" %}
{% include "gif_modal.html" %}
{% block title %}
<title>Create a post - {{'SITE_NAME' | app_config}}</title>
{% endblock %}
@ -125,7 +117,12 @@
<label class="btn btn-secondary format d-inline-block m-0" for="emoji-reply-btn">
<div id="emoji-reply-btn" onclick="loadEmojis('post-text')" aria-hidden="true" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="Add Emoji"><i class="fas fa-smile-beam"></i></div>
</label>
<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>
<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>
</label>
<pre></pre>
<div class="form-text text-small"><a href="/formatting" target="_blank">Formatting help</a></div>
<pre></pre>
@ -175,6 +172,16 @@
</div>
{% endblock %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/marked@3.0.8/lib/marked.min.js"></script>
<script defer src="/assets/js/submit.js?v=72"></script>
{% include "emoji_modal.html" %}
{% include "gif_modal.html" %}
</body>
</html>
</html>

View File

@ -8,14 +8,6 @@
{% if u and u.profilecss and (u.admin_level or not (v and v.admin_level)) %}
<link rel="stylesheet" href="/@{{u.username}}/profilecss">
{% endif %}
<style>
.wtf {
object-fit: cover !important;
}
</style>
<script src="/assets/js/userpage.js?v=72"></script>
<title>{{u.username}}'s profile - {{'SITE_NAME' | app_config}}</title>
{% if u.is_private %}
<meta name="robots" content="noindex">
@ -43,6 +35,7 @@
{% if v %}
<script>
window.addEventListener('DOMContentLoaded', function() {
const TRANSFER_TAX = {% if v.patron or u.patron %}0{% else %}0.03{% endif %};
function updateTax(mobile=false) {
@ -74,11 +67,14 @@
setTimeout(_ => t.disabled = false, 2000);
}
</script>
});
</script>
{% endif %}
{% if u.song %}
<script>
window.addEventListener('DOMContentLoaded', function() {
var audio = new Audio('/songs/{{u.id}}');
audio.loop=true;
@ -107,7 +103,9 @@
}, {once : true});
});
</script>
});
</script>
{% endif %}
<div class="row d-none d-md-block">
@ -673,10 +671,6 @@
{% block content %}
{% if v %}
{% include "emoji_modal.html" %}
{% endif %}
<div id="profilecontent" class="row no-gutters">
<div class="col">
<div class="flex-row box-shadow-bottom d-flex justify-content-center justify-content-md-between align-items-center">
@ -782,7 +776,21 @@
</ul>
</nav>
{% endif %}
<style>
.wtf {
object-fit: cover !important;
}
</style>
<script defer src="/assets/js/userpage.js?v=72"></script>
{% if v %}
{% include "emoji_modal.html" %}
{% endif %}
{% endblock %}
{% block GIFpicker %}
{% endblock %}
{% endblock %}

View File

@ -4,6 +4,7 @@
{% block fixedMobileBarJS %}
<script>
window.addEventListener('DOMContentLoaded', function() {
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
@ -23,6 +24,8 @@
}
prevScrollpos = currentScrollPos;
}
});
</script>
{% endblock %}

View File

@ -4,6 +4,7 @@
{% block fixedMobileBarJS %}
<script>
window.addEventListener('DOMContentLoaded', function() {
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
@ -23,6 +24,8 @@
}
prevScrollpos = currentScrollPos;
}
});
</script>
{% endblock %}

View File

@ -4,6 +4,7 @@
{% block fixedMobileBarJS %}
<script>
window.addEventListener('DOMContentLoaded', function() {
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
@ -23,6 +24,8 @@
}
prevScrollpos = currentScrollPos;
}
});
</script>
{% endblock %}