Merge branch 'master' into mistletoe

remotes/1693045480750635534/spooky-22
kek7198 2021-12-09 13:32:42 -06:00
commit 2216812f04
22 changed files with 85 additions and 314 deletions

View File

@ -136,8 +136,8 @@ def teardown_request(error):
def after_request(response):
response.headers.add("Strict-Transport-Security", "max-age=31536000")
response.headers.add("Referrer-Policy", "same-origin")
response.headers.add("X-Frame-Options", "deny")
response.headers.add("Content-Security-Policy", "script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self' *.pusher.com; object-src 'none';")
return response

View File

@ -172,16 +172,16 @@ def sanitize(sanitized, noimages=False):
for i in re.finditer('(?<!"):([!#A-Za-z0-9]{1,30}?):', new):
emoji = i.group(1).lower()
if emoji.startswith("#!") or emoji.startswith("!#"):
classes = 'class="mirrored" '
classes = 'class="emj mirrored" '
remoji = emoji[2:]
elif emoji.startswith("!"):
classes = 'height=60 class="mirrored" '
classes = 'height=60 class="emj mirrored" '
remoji = emoji[1:]
elif emoji.startswith("#"):
classes = ""
classes = 'class="emj" '
remoji = emoji[1:]
else:
classes = 'height=60 '
classes = 'height=60 class="emj" '
remoji = emoji
if path.isfile(f'./files/assets/images/emojis/{remoji}.webp'):
@ -198,13 +198,13 @@ def sanitize(sanitized, noimages=False):
if emoji.startswith("!"):
emoji = emoji[1:]
if 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="mirrored" src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized)
sanitized = re.sub(f'(?<!"):!{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!{emoji}:" title=":!{emoji}:" delay="0" height=30 class="emj mirrored" src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized)
if emoji in session["favorite_emojis"]: session["favorite_emojis"][emoji] += 1
else: session["favorite_emojis"][emoji] = 1
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 src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized)
sanitized = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emj" src="https://{site}/assets/images/emojis/{emoji}.webp">', sanitized)
if emoji in session["favorite_emojis"]: session["favorite_emojis"][emoji] += 1
else: session["favorite_emojis"][emoji] = 1
@ -229,7 +229,7 @@ def sanitize(sanitized, noimages=False):
sanitized = sanitized.replace(replacing, htmlsource)
for i in re.finditer('<p>(https:.*?\.mp4)</p>', sanitized):
sanitized = sanitized.replace(i.group(0), f'<p><video controls preload="metadata" class="embedvid"><source src="{i.group(1)}" type="video/mp4"></video>')
sanitized = sanitized.replace(i.group(0), f'<p><video controls preload="none" class="embedvid"><source src="{i.group(1)}" type="video/mp4"></video>')
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/")
@ -252,10 +252,10 @@ def filter_emojis_only(title):
if emoji.startswith("!"):
emoji = emoji[1:]
if path.isfile(f'./files/assets/images/emojis/{emoji}.webp'):
title = re.sub(f'(?<!"):!{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!{emoji}:" title=":!{emoji}:" delay="0" height=30 src="https://{site}/assets/images/emojis/{emoji}.webp" class="mirrored">', title)
title = re.sub(f'(?<!"):!{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!{emoji}:" title=":!{emoji}:" delay="0" height=30 src="https://{site}/assets/images/emojis/{emoji}.webp" class="emj mirrored">', title)
elif path.isfile(f'./files/assets/images/emojis/{emoji}.webp'):
title = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 src="https://{site}/assets/images/emojis/{emoji}.webp">', title)
title = re.sub(f'(?<!"):{emoji}:', f'<img loading="lazy" data-bs-toggle="tooltip" alt=":{emoji}:" title=":{emoji}:" delay="0" height=30 class="emj" src="https://{site}/assets/images/emojis/{emoji}.webp">', title)
if len(title) > 1500: abort(400)
else: return title

View File

@ -114,7 +114,7 @@ def post_id(pid, anything=None, v=None):
post = get_post(pid, v=v)
if post.club and not (v and (v.paid_dues or v.id == post.author_id)) or post.private and not (v and v.id == post.author_id): abort(403)
if not (v and v.admin_level > 1) and post.club and not (v and (v.paid_dues or v.id == post.author_id)) or post.private and not (v and v.id == post.author_id): abort(403)
if v:
votes = g.db.query(CommentVote).filter_by(user_id=v.id).subquery()
@ -1070,7 +1070,7 @@ def submit_post(v):
if "rama" in request.host or "pcm" in request.host:
if v.id == CARP_ID:
if random.random() < 0.02: body = "i love you carp"
else: body = "![](/assets/images/emojis/fuckoffcarp.webp)"
else: body = ":#marseyfuckoffcarp:"
elif v.id == LAWLZ_ID:
if random.random() < 0.5: body = "wow, this lawlzpost sucks!"
else: body = "wow, a good lawlzpost for once!"

View File

@ -11,27 +11,6 @@
{% block postNav %}{% endblock %}
{% block fixedMobileBarJS %}
<script>
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else if (currentScrollPos <= 125) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else {
document.getElementById("fixed-bar-mobile").style.top = "-48px";
document.getElementById("dropdownMenuSortBy").classList.remove('show');
document.getElementById("dropdownMenuFrom").classList.remove('show');
document.getElementById("navbar").classList.add("shadow");
}
prevScrollpos = currentScrollPos;
}
</script>
{% endblock %}
{% block title %}

View File

@ -39,27 +39,6 @@
{% block fixedMobileBarJS %}
<script>
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else if (currentScrollPos <= 125) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else {
document.getElementById("fixed-bar-mobile").style.top = "-48px";
document.getElementById("dropdownMenuSortBy").classList.remove('show');
document.getElementById("dropdownMenuFrom").classList.remove('show');
document.getElementById("navbar").classList.add("shadow");
}
prevScrollpos = currentScrollPos;
}
</script>
{% endblock %}
{% block title %}

View File

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

View File

@ -1,28 +1,5 @@
<script>
const banModal = function(link, id, name) {
document.getElementById("banModalTitle").innerHTML = `Ban @${name}`;
document.getElementById("ban-modal-link").value = link;
document.getElementById("banUserButton").innerHTML = `Ban @${name}`;
document.getElementById("banUserButton").onclick = function() {
let fd = new FormData(document.getElementById("banModalForm"));
fd.append("formkey", formkey());
let xhr = new XMLHttpRequest();
xhr.open("POST", `/ban_user/${id}?form`, true);
xhr.withCredentials = true;
xhr.onload = function(){
var myToast = new bootstrap.Toast(document.getElementById('toast-post-success'));
myToast.show();
document.getElementById('toast-post-success-text').innerHTML = `@${name} banned`;
}
xhr.send(fd);
}
};
</script>
<script src="/assets/js/ban_modal.js?v=1"></script>
<div class="modal fade" id="banModal" tabindex="-1" role="dialog" aria-labelledby="banModalTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">

View File

@ -1,27 +1,4 @@
<script>
function delete_postModal(id) {
function delete_post(){
this.innerHTML='Deleting post';
this.disabled = true;
var url = '/delete_post/' + id
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
var form = new FormData()
form.append("formkey", formkey());
xhr.withCredentials=true;
xhr.onload = function() {location.reload(true);};
xhr.send(form);
}
document.getElementById("deletePostButton-mobile").onclick = delete_post;
document.getElementById("deletePostButton").onclick = delete_post;
};
</script>
<script src="/assets/js/delete_post_modal.js?v=2"></script>
<div class="modal fade modal-sm-bottom" id="deletePostModal" tabindex="-1" role="dialog" aria-labelledby="deletePostModalTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">

View File

@ -1,12 +1,3 @@
<script>
function expandDesktopImage(image) {
document.getElementById("desktop-expanded-image").src = image.replace("200w_d.webp", "giphy.webp");
document.getElementById("desktop-expanded-image-link").href = image;
document.getElementById("desktop-expanded-image-wrap-link").href=image;
};
</script>
<div class="modal desktop-expanded-image-modal" id="expandImageModal" tabindex="-1" role="dialog" aria-labelledby="expandImageModalTitle" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered mx-auto expandedimage" role="document">
<div class="modal-content bg-transparent shadow-none m-5 m-md-0">

View File

@ -1,12 +1,6 @@
{% extends "default.html" %}
{% block content %}
<script>
function removeFollower(event, username) {
post_toast('/remove_follow/' + username);
let table = document.getElementById("followers-table");
table.removeChild(event.target.parentElement.parentElement);
}
</script>
<script src="/assets/js/followers.js?v=2"></script>
<pre>

View File

@ -1,12 +1,6 @@
{% extends "default.html" %}
{% block content %}
<script>
function removeFollower(event, username) {
post_toast('/unfollow/' + username);
let table = document.getElementById("followers-table");
table.removeChild(event.target.parentElement.parentElement);
}
</script>
<script src="/assets/js/following.js?v=2"></script>
<pre>

View File

@ -9,22 +9,20 @@
</pre>
<h1>Formatting</h1>
<h1>Markdown Formatting</h1>
On {{'SITE_NAME' | app_config}}, you can use Markdown formatting.
You can use Markdown formatting:
<pre>
</pre>
<h2>Inline formatting</h2>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
<th>Type</th>
<th>Displays as</th>
<th>What you type</th>
<th>What gets displayed</th>
</tr>
</thead>
<tbody>
@ -53,25 +51,40 @@ On {{'SITE_NAME' | app_config}}, you can use Markdown formatting.
<td>[{{'SITE_NAME' | app_config}}]({{request.host_url}})</td>
<td><a href="{{request.host_url}}">{{'SITE_NAME' | app_config}}</a></td>
</tr>
<tr>
<td>Images</td>
<td>https://i.imgur.com/Lf6dfPO.jpg</td>
<td><img src="https://i.imgur.com/Lf6dfPO.jpg"></td>
</tr>
<tr>
<td>Youtube Videos</td>
<td>https://youtube.com/watch?v=3Hecr51ByE4</td>
<td><lite-youtube videoid="3Hecr51ByE4" params="controls=0&modestbranding=1"></lite-youtube></td>
</tr>
<tr>
<td>Video Files</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>
</tr>
<tr>
<td>Emojis</td>
<td>:marseylove:</td>
<td><img loading="lazy" data-bs-toggle="tooltip" alt=":marseylove:" data-bs-original-title=":marseylove:" delay="0" height="30" src="/assets/images/emojis/marseylove.webp?v=1"></td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="emj" alt=":marseylove:" data-bs-original-title=":marseylove:" delay="0" height="30" src="/assets/images/emojis/marseylove.webp?v=1"></td>
</tr>
<tr>
<td>Mirrored Emojis</td>
<td>:!marseylove:</td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="mirrored" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" height="30" src="/assets/images/emojis/marseylove.webp?v=1"></td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="emj mirrored" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" height="30" src="/assets/images/emojis/marseylove.webp?v=1"></td>
</tr>
<tr>
<td>Large Emojis</td>
<td>:#marseylove:</td>
<td><img loading="lazy" data-bs-toggle="tooltip" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" src="/assets/images/emojis/marseylove.webp?v=1"></td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="emj" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" src="/assets/images/emojis/marseylove.webp?v=1"></td>
</tr>
<tr>
<td>Large Mirroed Emojis</td>
<td>:#!marseylove:</td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="mirrored" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" src="/assets/images/emojis/marseylove.webp?v=1"></td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="emj mirrored" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" src="/assets/images/emojis/marseylove.webp?v=1"></td>
</tr>
<tr>
<td>Poll Options</td>
@ -83,22 +96,6 @@ On {{'SITE_NAME' | app_config}}, you can use Markdown formatting.
</div>
</td>
</tr>
</tbody>
</table>
<h2>Block formatting</h2>
These Markdown tags format an entire paragraph of text at a time.
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
<th>Type</th>
<th>Displays as</th>
</tr>
</thead>
<tbody>
<tr>
<td>Blockquote</td>
<td>&gt; text</td>
@ -122,12 +119,6 @@ These Markdown tags format an entire paragraph of text at a time.
<tr>
<td>Code Block</td>
<td>```<br>Use three backticks above and below.<br>Or, indent the lines with four spaces.<br>```</td>
<td>
</tr>
<tr>
<td>Spoilers</td>
<td>&lt;s&gt; bussy > gussy &lt;/s&gt;</td>
<td><p class="spoiler">bussy > gussy</p></td>
<td>
<pre>
Use three backticks above and below.
@ -135,23 +126,11 @@ These Markdown tags format an entire paragraph of text at a time.
</pre>
</td>
</tr>
</tbody>
</table>
<h2>Custom Formatting</h2>
We also have some custom hooks for mentioning users and subreddits. Note that these only work if the mentioned user or subreddit actually exists.
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
<th>Type</th>
<th>Displays as</th>
<td>Spoilers</td>
<td>&lt;s&gt; bussy > gussy &lt;/s&gt;</td>
<td><p class="spoiler">bussy > gussy</p></td>
</tr>
</thead>
<tbody>
<tr>
<td>Username Mention</td>
<td>@QuadNarca</td>
@ -170,21 +149,34 @@ We also have some custom hooks for mentioning users and subreddits. Note that th
</tbody>
</table>
<h2>Custom HTML</h2>
<h1>HTML Formatting</h1>
And we allow custom HTML in most places.
And we allow custom HTML in most places:
Allowed tags:
<pre>
</pre>
<h4>Allowed Tags</h4>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
<th>Type</th>
<th>Displays as</th>
<th>What you type</th>
<th>What gets displayed</th>
</tr>
</thead>
<tbody>
<tr>
<td>Span</td>
<td>
My mother has &lt;span style="color:blue"&gt;blue&lt;/span&gt; eyes.
</td>
<td>
My mother has <span style="color:blue">blue</span> eyes.
</td>
</tr>
<tr>
<td>Bold</td>
<td>This will be &lt;b&gt;bold&lt;/b&gt;</td>
@ -285,7 +277,6 @@ Text 2
<td>Italics</td>
<td>
&lt;i&gt;This&lt;/i&gt; is how you get italics.
<i>This</i> is how you get italics.
</td>
<td>
<i>This</i> is how you get italics.
@ -457,19 +448,10 @@ line breaks
<img src="https://i.imgur.com/SwVuagI_d.webp" width="200">
</td>
</tr>
<tr>
<td>Span</td>
<td>
My mother has &lt;span style="color:blue"&gt;blue&lt;/span&gt; eyes.
</td>
<td>
My mother has <span style="color:blue">blue</span> eyes.
</td>
</tr>
</tbody>
</table>
<h2>Allowed Attributes</h2>
<h4>Allowed Attributes</h4>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
@ -511,7 +493,7 @@ line breaks
</tbody>
</table>
<h2>Allowed Styles</h2>
<h5>Allowed Styles</h5>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
@ -547,6 +529,9 @@ line breaks
overflow: auto;
}
}
pre {
color: var(--white) !important;
}
</style>
{% endblock %}

View File

@ -213,11 +213,6 @@
</div>
</nav>
{% if v %}
<script>
function formkey() {return '{{v.formkey}}';}
</script>
{% endif %}
<script src="/assets/js/header.js?v=54"></script>
<style>

View File

@ -6,11 +6,11 @@
{% block content %}
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=137"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=125">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=137"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
{% endif %}
<div class="row justify-content-around">
@ -122,14 +122,6 @@
</div>
</div>
<script src="/assets/js/clipboard.js?v=1"></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>
<script src="/assets/js/clipboard.js?v=3"></script>
{% endblock %}

View File

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

View File

@ -36,10 +36,10 @@
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=137"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=125">
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=137"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
{% endif %}
<link href="/assets/css/fa.css?v=54" rel="stylesheet">
@ -168,10 +168,6 @@
{% block scripts %}
{% endblock %}
<script>
function formkey() {return '{{v.formkey}}';}
</script>
</body>
</html>

View File

@ -4,42 +4,7 @@
{% block content %}
<script>
function block_user() {
var exileForm = document.getElementById("exile-form");
var usernameField = document.getElementById("exile-username");
var isValidUsername = usernameField.checkValidity();
username = usernameField.value;
if (isValidUsername) {
var xhr = new XMLHttpRequest();
xhr.open("post", "/settings/block");
xhr.withCredentials=true;
f=new FormData();
f.append("username", username);
f.append("formkey", formkey());
xhr.onload=function(){
if (xhr.status<300) {
location.reload(true);
}
else {
var myToast = new bootstrap.Toast(document.getElementById('toast-post-success'));
myToast.hide();
var myToast = new bootstrap.Toast(document.getElementById('toast-post-error'));
myToast.show();
document.getElementById("toast-error-message").textContent = "Error. Please try again later.";
}
}
xhr.send(f)
}
}
</script>
<script src="/assets/js/settings_block.js?v=2"></script>
<div class="row">

View File

@ -29,7 +29,7 @@
<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>
<link rel="stylesheet" href="/assets/css/main.css?v=137"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
<link rel="stylesheet" href="/assets/css/main.css?v=139"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=125">
</head>

View File

@ -3,27 +3,6 @@
{% block pagetype %}userpage{% endblock %}
{% block fixedMobileBarJS %}
<script>
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else if (currentScrollPos <= 125) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else {
document.getElementById("fixed-bar-mobile").style.top = "-48px";
document.getElementById("dropdownMenuSortBy").classList.remove('show');
document.getElementById("dropdownMenuFrom").classList.remove('show');
document.getElementById("navbar").classList.add("shadow");
}
prevScrollpos = currentScrollPos;
}
</script>
{% endblock %}
{% block title %}

View File

@ -3,27 +3,6 @@
{% block pagetype %}userpage{% endblock %}
{% block fixedMobileBarJS %}
<script>
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else if (currentScrollPos <= 125) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else {
document.getElementById("fixed-bar-mobile").style.top = "-48px";
document.getElementById("dropdownMenuSortBy").classList.remove('show');
document.getElementById("dropdownMenuFrom").classList.remove('show');
document.getElementById("navbar").classList.add("shadow");
}
prevScrollpos = currentScrollPos;
}
</script>
{% endblock %}
{% block title %}

View File

@ -3,27 +3,6 @@
{% block pagetype %}userpage{% endblock %}
{% block fixedMobileBarJS %}
<script>
var prevScrollpos = window.pageYOffset;
window.onscroll = function () {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else if (currentScrollPos <= 125) {
document.getElementById("fixed-bar-mobile").style.top = "48px";
document.getElementById("navbar").classList.remove("shadow");
}
else {
document.getElementById("fixed-bar-mobile").style.top = "-48px";
document.getElementById("dropdownMenuSortBy").classList.remove('show');
document.getElementById("dropdownMenuFrom").classList.remove('show');
document.getElementById("navbar").classList.add("shadow");
}
prevScrollpos = currentScrollPos;
}
</script>
{% endblock %}
{% block title %}

View File

@ -2769,3 +2769,13 @@ I only follow the patriarchal aspects of Islam. Not the aspects that make you a
{[para]}
There are only two rules: no bigotry and no /r/drama users.
{[para]}
hey, last night was fun but after watching you eat the rolls as soon as they came to the table I don't think I want to continue this.
{[para]}
I've posted my created memes for over a decade(s) across the chans, and onto almost EVERY FREE SPEECH SITE. So much of the internet's humor is from me for a very long time.
So many memes that are world famous are MINE. Mine mine mine.
{[para]}
I SENSE YOU ARE TRYING TO DOXX ME in a clumsy probing manner.
DOXXING is frowned upon on all free speech sites.
{[para]}