remotes/1693045480750635534/spooky-22
Aevann1 2021-12-15 00:48:37 +02:00
parent cdd24572ce
commit 1c9567b240
210 changed files with 15538 additions and 4204 deletions

View File

@ -42,6 +42,7 @@ services:
- DUES=0
- MAIL_USERNAME=blahblahblah@gmail.com
- MAIL_PASSWORD=3435tdfsdudebussylmaoxxt43
- CHRISTMAS=1
links:
- "redis"
- "postgres"

3
env
View File

@ -30,4 +30,5 @@ export DUES="0"
export DEFAULT_THEME="midnight"
export DEFAULT_COLOR="ff66ac" # YOU HAVE TO PICK ONE OF THOSE COLORS OR SHIT WILL BREAK: ff66ac, 805ad5, 62ca56, 38a169, 80ffff, 2a96f3, eb4963, ff0000, f39731, 30409f, 3e98a7, e4432d, 7b9ae4, ec72de, 7f8fa6, f8db58
export MAIL_USERNAME="blahblahblah@gmail.com"
export MAIL_PASSWORD="3435tdfsdudebussylmaoxxt43"
export MAIL_PASSWORD="3435tdfsdudebussylmaoxxt43"
export CHRISTMAS="0"

View File

@ -16,9 +16,7 @@ import gevent
from werkzeug.middleware.proxy_fix import ProxyFix
import redis
if environ.get("CHRISTMAS"): templates = 'templates/CHRISTMAS'
else: templates = 'templates'
app = Flask(__name__, template_folder=templates)
app = Flask(__name__, template_folder='templates/CHRISTMAS')
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=3)
app.url_map.strict_slashes = False

View File

@ -0,0 +1,60 @@
{% extends "default.html" %}
{% block title %}
<title>{{'SITE_NAME' | app_config}}</title>
<meta name="description" content="{{'SITE_NAME' | app_config}} Help">
{% endblock %}
{% block content %}
<div class="col-span-full">
<h3>Admin Tools</h3>
<h4>Content</h4>
<ul>
<li><a href="/admin/reported/posts">Reported Posts</a></li>
<li><a href="/admin/reported/comments">Reported Comments</a></li>
<li><a href="/admin/image_posts">Image Posts</a></li>
<li><a href="/admin/removed">Removed Posts</a></li>
</ul>
<h4>Users</h4>
<ul>
<li><a href="/admin/shadowbanned">Shadowbanned Users</a></li>
<li><a href="/admin/agendaposters">Users with Agendaposter Theme</a></li>
<li><a href="/admin/users">Users Feed</a></li>
</ul>
<h4>Safety</h4>
<ul>
<li><a href="/admin/banned_domains">Banned Domains</a></li>
<li><a href="/admin/alt_votes">Multi Vote Analysis</a></li>
</ul>
<h4>Grant</h4>
<ul>
<li><a href="/admin/awards">Give User Award</a></li>
<li><a href="/admin/badge_grant">Badges</a></li>
</ul>
<h4>API Access Control</h4>
<ul>
<li><a href="/admin/apps">Apps</a></li>
</ul>
<h4>Statistics</h4>
<ul>
<li><a href="/stats">Content Stats</a></li>
<li><a href="/chart">Stat Chart</a></li>
</ul>
<h4>Configuration</h4>
<ul>
<li><a href="/admin/rules">Site Rules</a></li>
</ul>
<div>
<input type="checkbox" id="disablesignups" name="disablesignups" {% if x == "yes" %}checked{% endif %} onchange="post_toast('/admin/disablesignups');">
<label class="label" for="disablesignups">Disable signups</label>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,89 @@
{% extends "default.html" %}
{% block title %}
<title>{{'SITE_NAME' | app_config}}</title>
<meta name="description" content="{{'SITE_NAME' | app_config}} Help">
{% endblock %}
{% block content %}
<div class="col-span-full my-4">
<pre>
</pre>
<h5>Vote Info</h5>
<form action="/admin/alt_votes" method="get" class="mb-6">
<label for="link-input">Usernames</label>
<input id="link-input" type="text" class="form-control mb-2" name="u1" value="{{u1.username if u1 else ''}}" placeholder="User 1">
<input id="link-input" type="text" class="form-control mb-2" name="u2" value="{{u2.username if u2 else ''}}" placeholder="User 2">
<input type="submit" value="Submit" class="btn btn-primary">
</form>
{% if u1 and u2 %}
<h2>Analysis</h2>
<table class="w-full table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th></th>
<th>@{{u1.username}} only(% unique)</th>
<th>Both</th>
<th>@{{u2.username}} only (% unique)</th>
</tr>
</thead>
<tr>
<td><b>Post Upvotes</b></td>
<td>{{data['u1_only_post_ups']}} ({{data['u1_post_ups_unique']}}%)</td>
<td>{{data['both_post_ups']}}</td>
<td>{{data['u2_only_post_ups']}} ({{data['u2_post_ups_unique']}}%)</td>
</tr>
<tr>
<td><b>Post Downvotes</b></td>
<td>{{data['u1_only_post_downs']}} ({{data['u1_post_downs_unique']}}%)</td>
<td>{{data['both_post_downs']}}</td>
<td>{{data['u2_only_post_downs']}} ({{data['u2_post_downs_unique']}}%)</td>
</tr>
<tr>
<td><b>Comment Upvotes</b></td>
<td>{{data['u1_only_comment_ups']}} ({{data['u1_comment_ups_unique']}}%)</td>
<td>{{data['both_comment_ups']}}</td>
<td>{{data['u2_only_comment_ups']}} ({{data['u2_comment_ups_unique']}}%)</td>
</tr>
<tr>
<td><b>Comment Downvotes</b></td>
<td>{{data['u1_only_comment_downs']}} ({{data['u1_comment_downs_unique']}}%)</td>
<td>{{data['both_comment_downs']}}</td>
<td>{{data['u2_only_comment_downs']}} ({{data['u2_comment_downs_unique']}}%)</td>
</tr>
</table>
<h2>Link Accounts</h2>
{% if u2 in u1.alts %}
<p>Accounts are known alts of eachother.</p>
{% else %}
<p>Two accounts controlled by different people should have most uniqueness percentages at or above 70-80%</p>
<p>A sockpuppet account will have its uniqueness percentages significantly lower.</p>
<a href="javascript:void(0)" class="btn btn-secondary" onclick="document.getElementById('linkbtn').classList.toggle('d-none');">Link Accounts</a>
<form action="/admin/link_accounts" method="post">
<input type="hidden" name="formkey" value="{{v.formkey}}">
<input type="hidden" name="u1" value="{{u1.id}}">
<input type="hidden" name="u2" value="{{u2.id}}">
<input type="submit" id="linkbtn" class="btn btn-primary d-none" value="Confirm Link: {{u1.username}} and {{u2.username}}">
</form>
{% endif %}
{% endif %}
</div>
{% endblock %}

View File

@ -0,0 +1,66 @@
{% extends "default.html" %}
{% block title %}
<title>API App Administration</title>
<meta name="description" content="{{'SITE_NAME' | app_config}} Help">
{% endblock %}
{% block content %}
<div class="col-span-full my-4">
<div class="settings-section rounded">
<div class="d-lg-flex">
<div class="title w-lg-25">
<label for="over18">{{app.app_name}}</label>
</div>
<div class="body w-lg-100">
<label for="edit-{{app.id}}-author" class="mb-0 w-lg-25">User</label>
<input id="edit-{{app.id}}-author" class="form-control" type="text" name="name" value="{{app.author.username}}" readonly=readonly>
<input type="hidden" name="formkey" value="{{v.formkey}}">
<label for="edit-{{app.id}}-name" class="mb-0 w-lg-25">App Name</label>
<input id="edit-{{app.id}}-name" class="form-control" type="text" name="name" value="{{app.app_name}}" readonly=readonly>
<label for="edit-{{app.id}}-redirect" class="mb-0 w-lg-25">Redirect URI</label>
<input id="edit-{{app.id}}-redirect" class="form-control" type="text" name="redirect_uri" value="{{app.redirect_uri}}" readonly="readonly">
<label for="edit-{{app.id}}-desc" class="mb-0 w-lg-25">Description</label>
<textarea form="edit-app-{{app.id}}" class="form-control" name="description" id="edit-{{app.id}}-desc" maxlength="256" readonly="readonly">{{app.description}}</textarea>
</div>
</div>
<div class="footer">
<div class="d-flex">
{% if not app.client_id%}
<a href="javascript:void(0)" class="btn btn-primary ml-auto" onclick="post_toast('/admin/app/approve/{{app.id}}')">Approve</a>
<a href="javascript:void(0)" class="btn btn-secondary mr-0" onclick="post_toast('/admin/app/reject/{{app.id}}')">Reject</a>
{% else %}
<a href="javascript:void(0)" class="btn btn-primary ml-auto" onclick="post_toast('/admin/app/revoke/{{app.id}}')">Revoke</a>
{% endif %}
</div>
</div>
</div>
{% if listing %}
{% include "submission_listing.html" %}
{% elif comments %}
{% include "comments.html" %}
{% endif %}
</div>
<div class="toast" id="toast-post-success" style="position: fixed; bottom: 1.5rem; margin: 0 auto; left: 0; right: 0; width: 275px; z-index: 1000" role="alert" aria-live="assertive" aria-atomic="true" data-bs-animation="true" data-bs-autohide="true" data-bs-delay="5000">
<div class="toast-body bg-success text-center text-white">
<i class="fas fa-comment-alt-smile mr-2"></i><span id="toast-post-success-text"></span>
</div>
</div>
<div class="toast" id="toast-post-error" style="position: fixed; bottom: 1.5rem; margin: 0 auto; left: 0; right: 0; width: 275px; z-index: 1000" role="alert" aria-live="assertive" aria-atomic="true" data-bs-animation="true" data-bs-autohide="true" data-bs-delay="5000">
<div class="toast-body bg-danger text-center text-white">
<i class="fas fa-exclamation-circle mr-2"></i><span id="toast-post-error-text">Error, please try again later.</span>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,68 @@
{% extends "default.html" %}
{% block title %}
<title>API App Administration</title>
<meta name="description" content="{{'SITE_NAME' | app_config}} Help">
{% endblock %}
{% block content %}
<div class="col-span-full my-4">
{% for app in apps %}
<div class="flex flex-col space-y-4">
<div class="d-lg-flex">
<div class="text-lg mb-2 learding-normal">
<label for="over18">
<a href="{{app.permalink}}" {% if v and v.newtab %}target="_blank"{% endif %}>{{app.app_name}}</a>
</label>
</div>
<div class="flex flex-col space-y-2">
<label for="edit-{{app.id}}-author" class="label">User</label>
<input id="edit-{{app.id}}-author" class="form-input" type="text" name="name" value="{{app.author.username}}" readonly=readonly>
<label for="edit-{{app.id}}-name" class="label">App Name</label>
<input id="edit-{{app.id}}-name" class="form-input" type="text" name="name" value="{{app.app_name}}" readonly=readonly>
{% if app.client_id %}
<label for="edit-{{app.id}}-client-id" class="label">Client ID</label>
<input id="edit-{{app.id}}-client-id" class="form-input" type="text" name="name" value="{{app.client_id}}" readonly="readonly">
{% endif %}
<label for="edit-{{app.id}}-redirect" class="label">Redirect URI</label>
<input id="edit-{{app.id}}-redirect" class="form-input" type="text" name="redirect_uri" value="{{app.redirect_uri}}" readonly="readonly">
<label for="edit-{{app.id}}-desc" class="label">Description</label>
<textarea form="edit-app-{{app.id}}" class="form-input" name="description" id="edit-{{app.id}}-desc" maxlength="256" readonly="readonly">{{app.description}}</textarea>
</div>
</div>
<div class="mt-2">
<div class="flex">
{% if not app.client_id %}
<a href="javascript:void(0)" class="btn btn-green ml-auto" onclick="post_toast('/admin/app/approve/{{app.id}}')">Approve</a>
<a href="javascript:void(0)" class="btn btn-red" onclick="post_toast('/admin/app/reject/{{app.id}}')">Reject</a>
{% else %}
<a href="javascript:void(0)" class="btn btn-red ml-auto" onclick="post_toast('/admin/app/revoke/{{app.id}}')">Revoke</a>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
<div class="toast" id="toast-post-success" style="position: fixed; bottom: 1.5rem; margin: 0 auto; left: 0; right: 0; width: 275px; z-index: 1000" role="alert" aria-live="assertive" aria-atomic="true" data-bs-animation="true" data-bs-autohide="true" data-bs-delay="5000">
<div class="toast-body bg-success text-center text-white">
<i class="fas fa-comment-alt-smile mr-2"></i><span id="toast-post-success-text"></span>
</div>
</div>
<div class="toast" id="toast-post-error" style="position: fixed; bottom: 1.5rem; margin: 0 auto; left: 0; right: 0; width: 275px; z-index: 1000" role="alert" aria-live="assertive" aria-atomic="true" data-bs-animation="true" data-bs-autohide="true" data-bs-delay="5000">
<div class="toast-body bg-danger text-center text-white">
<i class="fas fa-exclamation-circle mr-2"></i><span id="toast-post-error-text">Error, please try again later.</span>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,73 @@
{% extends "default.html" %}
{% block title %}
<title>Grant User Award</title>
{% endblock %}
{% block pagetype %}message{% endblock %}
{% block content %}
<div class="col-span-full my-4">
{% if error %}
<div class="alert alert-danger alert-dismissible fade show my-3" role="alert">
<i class="fas fa-exclamation-circle my-auto"></i>
<span>
{{error}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
{% if msg %}
<div class="alert alert-success alert-dismissible fade show my-3" role="alert">
<i class="fas fa-check-circle my-auto" aria-hidden="true"></i>
<span>
{{msg}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
<pre></pre>
<pre></pre>
<h5>User Award Grant</h5>
<form action="/admin/awards", method="post">
<input type="hidden" name="formkey" value="{{v.formkey}}">
<label for="input-username">Username</label><br>
<input id="input-username" class="form-input mb-3" type="text" name="username" required>
<table class="w-full table table-striped">
<thead class="bg-primary text-white">
<tr>
<th scope="col">Icon</th>
<th scope="col">Title</th>
<th scope="col">Amount</th>
</tr>
</thead>
<tbody>
{% for a in awards %}
<tr>
<td><i class="{{a['icon']}} {{a['color']}}" style="font-size: 30px"></i></td>
<td style="font-weight: bold">{{a['title']}}</td>
<td><input type="number" class="form-input" name="{{a['kind']}}" value="0" min="0" max="10" placeholder="Enter amount..." ></td>
</tr>
{% endfor %}
</table>
<input class="btn btn-green mt-3" type="submit" value="Grant Awards">
</form>
<pre></pre>
{% if 'rdrama.net' not in request.host or v.admin_level > 2 %}
<div><a class="btn btn-green mt-3" href="javascript:void(0)" onclick="post_toast('/admin/monthly')">Grant Monthly Marseybux</a></div>
{% endif %}
</div>
{% endblock %}

View File

@ -0,0 +1,87 @@
{% extends "default.html" %}
{% block title %}
<title>Badge Grant</title>
{% endblock %}
{% block pagetype %}message{% endblock %}
{% block content %}
<div class="col-span-full">
{% if error %}
<div class="alert alert-danger alert-dismissible fade show my-3" role="alert">
<i class="fas fa-exclamation-circle my-auto"></i>
<span>
{{error}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
{% if msg %}
<div class="alert alert-success alert-dismissible fade show my-3" role="alert">
<i class="fas fa-check-circle my-auto" aria-hidden="true"></i>
<span>
{{msg}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
<pre></pre>
<pre></pre>
<h5>Badge Grant</h5>
<form action="/admin/badge_grant", method="post">
<input type="hidden" name="formkey" value="{{v.formkey}}">
<label for="input-username">Username</label><br>
<input id="input-username" class="form-control" type="text" name="username" required>
<table class="table table-striped">
<thead class="bg-primary text-white">
<tr>
<th scope="col">Select</th>
<th scope="col">Image</th>
<th scope="col">Name</th>
<th scope="col">Default Description</th>
</tr>
</thead>
<tbody>
{% for k, v in badge_types.items() %}
<tr>
<td><input type="radio" id="badge-{{k}}" name="badge_id" value="{{k}}"></td>
<td><label for="badge-{{k}}"><img loading="lazy" src="/assets/CHRISTMAS/images/badges/{{v['name']}}.webp?v=200" width="70px" height="70px"></label></td>
<td>{{v['name']}}</td>
<td>{{v['description']}}</td>
</tr>
{% endfor %}
</table>
<label for="input-url">URL</label><br>
<input id="input-url" class="form-control" type="text" name="url" placeholder="Optional">
<label for="input-description">Custom description</label><br>
<input id="input-description" class="form-control" type="text" name="description" placeholder="Leave blank for badge default">
<input class="btn btn-primary" type="submit">
</form>
</div>
<style>
@media (max-width: 767.98px) {
table {
display: inline-block;
overflow: auto;
}
}
</style>
{% endblock %}

View File

@ -0,0 +1,37 @@
{% extends "default.html" %}
{% block title %}
<title>Banned Domains</title>
{% endblock %}
{% block content %}
<pre>
</pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight:bold;">Domain</th>
<th style="font-weight:bold;">Ban reason</th>
</tr>
</thead>
{% for domain in banned_domains %}
<tr>
<td style="font-weight:bold;">{{domain.domain}}</td>
<td>{{domain.reason}}</td>
</tr>
{% endfor %}
</table>
<form action="/admin/banned_domains" method="post">
<input type="hidden" name="formkey" value="{{v.formkey}}">
<input name="domain" placeholder="Enter domain here.." class="form-control" required>
<input name="reason" placeholder="Enter ban reason here.." onchange="document.getElementById('ban-submit').disabled=false" class="form-control">
<input id="ban-submit" type="submit" class="btn btn-primary" value="Toggle ban" disabled>
</form>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "default.html" %}
{% block title %}
<title>{{'SITE_NAME' | app_config}}</title>
<meta name="description" content="{{'SITE_NAME' | app_config}} Help">
{% endblock %}
{% block content %}
<pre></pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Statistic</th>
<th>Value</th>
</tr>
</thead>
{% for entry in data %}
<tr>
<td>{{entry}}</td>
<td>{{data[entry]}}</td>
</tr>
{% endfor %}
</table>
{% endblock %}

View File

@ -0,0 +1,56 @@
{% extends "userpage.html" %}
{% block adminpanel %}{% endblock %}
{% block pagetype %}userpage{% endblock %}
{% block banner %}{% endblock %}
{% block mobileBanner %}{% endblock %}
{% block desktopBanner %}{% endblock %}
{% block desktopUserBanner %}{% endblock %}
{% block mobileUserBanner %}{% endblock %}
{% block postNav %}{% endblock %}
{% block fixedMobileBarJS %}
{% endblock %}
{% block title %}
<title>Image feed</title>
<meta name="description" content="on {{'SITE_NAME' | app_config}}">
{% endblock %}
{% block content %}
<div class="row no-gutters">
<div class="col">
{% block listing %}
<div class="posts">
{% include "submission_listing.html" %}
</div>
{% endblock %}
</div>
</div>
{% endblock %}
{% block pagenav %}
<nav aria-label="Page navigation">
<ul class="pagination pagination-sm py-3 pl-3 mb-0">
{% if page>1 %}
<li class="page-item">
<small><a class="page-link" href="?page={{page-1}}" tabindex="-1">Prev</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<small><a class="page-link" href="?page={{page+1}}">Next</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Next</span></li>
{% endif %}
</ul>
</nav>
{% endblock %}

View File

@ -0,0 +1,9 @@
{% extends "mine.html" %}
{% block maincontent %}
<img loading="lazy" src="{{single_plot}}">
<img loading="lazy" src="{{multi_plot}}">
{% include "user_listing.html" %}
{% endblock %}
{% block navbar %}{% endblock %}

View File

@ -0,0 +1,59 @@
{% extends "admin/image_posts.html" %}
{% block title %}
<title>Removed Content</title>
<meta name="description" content="on {{'SITE_NAME' | app_config}}">
{% endblock %}
{% block content %}
<div class="row justify-content-around mx-lg-5 d-lg-none no-gutters">
<div class="col bg-light border-bottom rounded-md p-3">
<div class="profile-details">
<div class="media">
<div class="media-body">
<pre></pre>
<h5 class="h6 d-inline-block">Removed Posts</h5>
</div>
</div>
</div>
</div>
</div>
<div class="row no-gutters">
<div class="col">
{% block listing %}
<div class="posts">
{% include "submission_listing.html" %}
</div>
{% endblock %}
</div>
</div>
{% endblock %}
{% block pagenav %}
<nav aria-label="Page navigation">
<ul class="pagination pagination-sm py-3 pl-3 mb-0">
{% if page>1 %}
<li class="page-item">
<small><a class="page-link" href="?page={{page-1}}" tabindex="-1">Prev</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<small><a class="page-link" href="?page={{page+1}}">Next</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Next</span></li>
{% endif %}
</ul>
</nav>
{% endblock %}

View File

@ -0,0 +1,24 @@
{% extends "admin/reported_posts.html" %}
{% block listing %}
<div class="posts">
{% with comments=listing %}
{% include "comments.html" %}
{% endwith %}
{% if not listing %}
<div class="row no-gutters">
<div class="col">
<div class="text-center py-7">
<div class="h4 p-2">There are no comments here (yet).</div>
</div>
</div>
</div>
{% endif %}
</div>
{% endblock %}

View File

@ -0,0 +1,83 @@
{% extends "userpage.html" %}
{% block adminpanel %}{% endblock %}
{% block pagetype %}userpage{% endblock %}
{% block banner %}{% endblock %}
{% block mobileBanner %}{% endblock %}
{% block desktopBanner %}{% endblock %}
{% block desktopUserBanner %}{% endblock %}
{% block mobileUserBanner %}{% endblock %}
{% block postNav %}
<div class="container-fluid bg-white sticky">
<div class="row border-bottom">
<div class="col">
<div class="container">
<div class="row bg-white">
<div class="col">
<div class="d-flex">
<ul class="nav post-nav mr-auto">
<li class="nav-item">
<a class="nav-link {% if request.path=="/admin/reported/posts" %} active{% endif %}" href="/admin/reported/posts">
<div>Posts</div>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if request.path=="/admin/reported/comments" %} active{% endif %}" href="/admin/reported/comments">
<div>Comments</div>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block fixedMobileBarJS %}
{% endblock %}
{% block title %}
<title>Reported Posts</title>
<meta name="description" content="on {{'SITE_NAME' | app_config}}">
{% endblock %}
{% block content %}
<div class="row no-gutters">
<div class="col">
{% block listing %}
<div class="posts">
{% include "submission_listing.html" %}
</div>
{% endblock %}
</div>
</div>
{% endblock %}
{% block pagenav %}
<nav aria-label="Page navigation">
<ul class="pagination pagination-sm py-3 pl-3 mb-0">
{% if page>1 %}
<li class="page-item">
<small><a class="page-link" href="?page={{page-1}}" tabindex="-1">Prev</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<small><a class="page-link" href="?page={{page+1}}">Next</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Next</span></li>
{% endif %}
</ul>
</nav>
{% endblock %}

View File

@ -0,0 +1,31 @@
{% extends "settings2.html" %}
{% block pagetitle %}Admins{% endblock %}
{% block content %}
<pre class="hidden md:inline-block"></pre>
<h5 style="font-weight:bold;">Admins</h5>
<pre></pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th class="font-bold">Name</th>
<th class="font-bold text-right">Score</th>
</tr>
</thead>
{% for user in admins %}
<tr>
<td>
<a class="font-bold" style="color:#{{user.namecolor}}" href="/@{{user.username}}">
<img loading="lazy" src="/uid/{{user.id}}/pic" class="w-12 h-12 object-cover rounded"/>
<span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span>
</a>
{% if user.admin_level == 1 and v and v.admin_level > 1 %}
<i class="fas fa-broom align-middle ml-2 color-white" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="Meme Admin"></i>
{% endif %}
</td>
<td class="font-bold text-right">{{user.truecoins}}</td>
</tr>
{% endfor %}
</table>
{% endblock %}

View File

@ -0,0 +1,19 @@
{% extends "settings2.html" %}
{% block content %}
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight:bold;">#</th>
<th style="font-weight:bold;">Name</th>
</tr>
</thead>
{% for user in users %}
<tr>
<td style="font-weight:bold;">{{loop.index}}</td>
<td><a style="color:#{{user.namecolor}}; font-weight:bold;" href="/@{{user.username}}"><img loading="lazy" src="/uid/{{user.id}}/pic" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span></a></td>
</tr>
{% endfor %}
</table>
{% endblock %}

View File

@ -0,0 +1,82 @@
{% extends "default.html" %}
{% block title %}
<title>{{'SITE_NAME' | app_config}} - API</title>
<meta name="description" content="{{'SITE_NAME' | app_config}} API Guide">
{% endblock %}
{% block content %}
<pre>
</pre>
<h1>API Guide for Bots</h1>
<pre></pre>
<p>This page explains how to obtain and use an access token. </p>
<h2>Step 1: Create your Application</h2>
<p>In the <a href="/settings/apps">apps tab of Drama settings</a>, fill in and submit the form to request an access token. You will need:</p>
<ul>
<li>an application name</li>
<li>a Redirect URI. May not use HTTP unless using localhost (use HTTPS instead).</li>
<li>a brief description of what your bot is intended to do</li>
</ul>
<p>Don't worry too much about accuracy; you will be able to change all of these later.</p>
<p>Drama administrators will review and approve or deny your request for an access token. You'll know when your request has been approved when you get a private message with an access token tied to your account.</p>
<p>DO NOT reveal your Client ID or Access Token. Anyone with these information will be able to pretend to be you. You are responsible for keeping them a secret!</p>
<h2>Step 2: Using the Access Token</h2>
<p>To use the access token, include the following header in subsequent API requests to Drama: <code>Authorization: access_token_goes_here</code></p>
<p>Python example:</p>
<pre> import requests
headers={"Authorization": "access_token_goes_here"}
url="https://rdrama.net/@carpathianflorist"
r=requests.get(url, headers=headers)
print(r.json())
</pre>
<p>The expected result of this would be a large JSON representation of the posts posted by @carpathianflorist</p>
<pre>
</pre>
<h1>API Guide for Applications</h1>
<pre></pre>
<p>The OAuth2 authorization flow is used to enable users to authorize third-party applications to access their Drama account without having to provide their login information to the application.</p>
<p>This page explains how to obtain API application keys, how to prompt a user for authorization, and how to obtain and use access tokens. </p>
<h2>Step 1: Create your Application</h2>
<p>In the <a href="/settings/apps">apps tab of Drama settings</a>, fill in and submit the form to request new API keys. You will need:</p>
<ul>
<li>an application name</li>
<li>a Redirect URI. May not use HTTP unless using localhost (use HTTPS instead).</li>
<li>a brief description of what your application is intended to do</li>
</ul>
<p>Don't worry too much about accuracy; you will be able to change all of these later.</p>
<p>Drama administrators will review and approve or deny your request for API keys. You'll know when your request has been approved when you get a private message with an access token tied to your account.</p>
<p>DO NOT reveal your Client ID or Access Token. Anyone with these information will be able to pretend to be you. You are responsible for keeping them a secret!</p>
<h2>Step 2: Prompt Your User for Authorization</h2>
<p>Send your user to <code>https://rdrama.net/authorize/?client_id=YOUR_CLIENT_ID</code></p>
<p>If done correctly, the user will see that your application wants to access their Drama account, and be prompted to approve or deny the request.</p>
<h2>Step 3: Catch the redirect</h2>
<p>The user clicks "Authorize". Drama will redirect the user's browser to GET the designated redirect URI. The access token URL parameter will be included in the redirect, which your server should process.</p>
<h2>Step 4: Using the Access Token</h2>
<p>To use the access token, include the following header in subsequent API requests to Drama: <code>Authorization: access_token_goes_here</code></p>
<p>Python example:</p>
<pre> import requests
headers={"Authorization": "access_token_goes_here"}
url="https://rdrama.net/@carpathianflorist"
r=requests.get(url, headers=headers)
print(r.json())
</pre>
<p>The expected result of this would be a large JSON representation of the submissions submitted by @carpathianflorist</p>
{% endblock %}

View File

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'; connect-src 'self'; object-src 'none';">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="{% block pagedesc %}{{'SITE_NAME' | app_config}}{% endblock %}">
<meta name="author" content="">
<title>{% block pagetitle %}{{'SITE_NAME' | app_config}}{% endblock %}</title>
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=400"><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 %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=400"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
{% endif %}
</head>
<body id="login">
<nav class="navbar navbar-expand-lg navbar-dark bg-transparent fixed-top border-0">
<div class="container-fluid">
<button class="navbar-toggler d-none" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive"
aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</nav>
<div class="container-fluid position-absolute h-100 p-0">
<div class="row no-gutters h-100">
<div class="col-12 col-md-6 my-auto p-3">
<div class="row justify-content-center">
<div class="col-10 col-md-7">
<div class="mb-5">
<a href="/" class="text-decoration-none"><span class="h3 text-primary">{{'SITE_NAME' | app_config}}</span></a>
</div>
<h1 class="h2">{% block authtitle %}{% endblock %}</h1>
<p class="text-muted mb-md-5">{% block authtext %}{% endblock %}</p>
{% if error %}
<div class="alert alert-danger alert-dismissible fade show d-flex my-3" role="alert">
<i class="fas fa-exclamation-circle my-auto"></i>
<span>
{{error}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
{% if msg %}
<div class="alert alert-success alert-dismissible fade show d-flex my-3" role="alert">
<i class="fas fa-info-circle my-auto" aria-hidden="true"></i>
<span>
{{msg}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
{% block content %}
{% endblock %}
</div>
</div>
</div>
<div class="col-12 col-md-6 d-none d-md-block">
<div class="splash-wrapper">
<div class="splash-overlay"></div>
<img loading="lazy" class="splash-img" src="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/cover.webp?v=200"></img>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,91 @@
<script src="/assets/CHRISTMAS/js/award_modal.js?v=200"></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 mx-auto max-w-3xl bg-gray-100 rounded-md shadow-lg">
<div class="modal-header">
<h5 class="font-bold text-xl text-black font-heading leading-normal">Gift Award</h5>
<button type="button" class="close text-gray-700 hover:text-gray-900" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
<div id="awardModalBody" class="overflow-y-auto px-4">
<form id="awardTarget" action="" method="post">
<input type="hidden" name="formkey", value="{{v.formkey}}">
<div class="flex flex-wrap -mx-4 overflow-hidden">
{% for award in v.user_awards %}
<div class="my-4 px-4 w-1/2 overflow-hidden lg:w-1/4 flex items-center justify-center">
{% if award.owned %}
<input hidden name="kind" value="{{award.kind}}" type="radio" id="{{award.kind}}-award" class="peer">
<label for="{{award.kind}}-award" onclick="document.getElementById('giveaward').disabled=false" class="w-full h-full p-2 text-center hover:bg-gray-300 peer-checked:shadow-inner peer-checked:bg-gray-400 rounded">
{% else %}
<input hidden name="kind" value="{{award.kind}}" type="radio" id="{{award.kind}}-award" class="peer" disabled>
<label for="{{award.kind}}-award" onclick="document.getElementById('giveaward').disabled=false" class="w-full h-full p-2 text-center hover:bg-gray-300 peer-checked:shadow-inner peer-checked:bg-gray-400 rounded cursor-not-allowed opacity-50">
{% endif %}
<i class="{{award.icon}} {{award.color}}"></i>
<div class="mt-2 font-bold text-base text-black">{{award.title}}</div>
<div class="text-sm text-gray-600">{{award.owned}} owned</div>
</label>
</div>
{% endfor %}
<a class="card disabled d-md-none" style="border:none">
<i class="fas fa-volume-mute" style="opacity:0"></i>
<div class="pt-2" style="font-weight: bold; font-size: 14px; color:#E1E1E1">&nbsp;</div>
<div class="text-muted">&nbsp;</div>
</a>
</div>
<label id="notelabel" for="note" class="pt-4 label">
Note
<small class="font-normal text-gray-500">Optional</small>
</label>
<textarea id="note" maxlength="200" name="note" class="form-input" placeholder="Note to include in award notification..."></textarea>
<div class="flex justify-end space-x-2 border-t border-gray-300 p-4 -mx-4 mt-4">
<button type="button" class="px-4 py-2 text-sm font-bold text-gray-500 hover:text-gray-700" data-bs-dismiss="modal">
Cancel
</button>
<input id="giveaward" class="ml-auto btn btn-green" type="submit" value="Gift Award" disabled>
</div>
</form>
</div>
</div>
</div>
</div>
<style>
.awards-wrapper input[type="radio"] {
display: none;
}
.awards-wrapper a {
cursor: pointer;
padding: 15px !important;
text-align: center;
text-transform: none!important;
}
.awards-wrapper a i {
font-size: 25px;
}
.awards-wrapper a.disabled {
opacity: 0.6;
}
.awards-wrapper a:hover:not(.disabled), .awards-wrapper .picked {
background-color: var(--primary)!important;
}
.awards-wrapper input[type="radio"]:checked+a {
background-color: var(--primary)!important;
}
.award-columns {
column-count: 2;
}
@media (min-width: 767.98px) {
.award-columns {
column-count: 7 !important;
}
}
</style>

View File

@ -3,7 +3,7 @@
<div class="snowflakes">
{% for i in range(count) %}
<div class="snowflake pointer-events-none">
<img src="/assets/christmas/ginger2-1.png" class="animate-spin object-contain" style="width: 40px; height: 40px;" alt="animate marsey gingerbread icon"/>
<img src="/assets/CHRISTMAS/ginger2-1.png" class="animate-spin object-contain" style="width: 40px; height: 40px;" alt="animate marsey gingerbread icon"/>
</div>
{% endfor %}
</div>

View File

@ -2,18 +2,18 @@
<!-- Include in /templates/submission/submission.html -->
<!-- Requires `p` object -->
<img class="train1" src="/assets/christmas/santasleigh.gif">
<img class="train1" src="/assets/CHRISTMAS/santasleigh.gif">
{% if p.award_count("train") > 1 %}
<img class="train2" src="/assets/christmas/santasleigh.gif">
<img class="train2" src="/assets/CHRISTMAS/santasleigh.gif">
{% endif %}
{% if p.award_count("train") > 2 %}
<img class="train3" src="/assets/christmas/santasleigh.gif">
<img class="train3" src="/assets/CHRISTMAS/santasleigh.gif">
{% endif %}
{% if p.award_count("train") > 3 %}
<img class="train4" src="/assets/christmas/santasleigh.gif">
<img class="train4" src="/assets/CHRISTMAS/santasleigh.gif">
{% endif %}
<style>

View File

@ -2,18 +2,18 @@
<!-- Include in /templates/submission/submission.html -->
<!-- Requires `p` object -->
<img class="train1" src="/assets/images/emojis/marseytrain.webp">
<img class="train1" src="/assets/CHRISTMAS/images/emojis/marseytrain.webp">
{% if p.award_count("train") > 1 %}
<img class="train2" src="/assets/images/emojis/marseytrain.webp">
<img class="train2" src="/assets/CHRISTMAS/images/emojis/marseytrain.webp">
{% endif %}
{% if p.award_count("train") > 2 %}
<img class="train3" src="/assets/images/emojis/marseytrain.webp">
<img class="train3" src="/assets/CHRISTMAS/images/emojis/marseytrain.webp">
{% endif %}
{% if p.award_count("train") > 3 %}
<img class="train4" src="/assets/images/emojis/marseytrain.webp">
<img class="train4" src="/assets/CHRISTMAS/images/emojis/marseytrain.webp">
{% endif %}
<style>

View File

@ -0,0 +1,30 @@
{% extends "default.html" %}
{% block content %}
<pre>
</pre>
<h1>User Badges</h1>
<div>This page describes the requirements for obtaining all profile badges.</div>
<pre>
</pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
<th>Image</th>
<th>Description</th>
</tr>
</thead>
{% for k,v in badges.items() %}
<tr>
<td>{{v['name']}}</td>
<td><img loading="lazy" src="/assets/CHRISTMAS/images/badges/{{v['name']}}.webp?v=200" width=50 height=50>
<td>{{v['description']}}</td>
</tr>
{% endfor %}
</table>
{% endblock %}

View File

@ -0,0 +1,38 @@
<script src="/assets/CHRISTMAS/js/ban_modal.js?v=200"></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">
<div class="modal-content mx-auto max-w-3xl bg-gray-100 rounded-md shadow-lg">
<div class="modal-header pt-3">
<h5 id="banModalTitle"></h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
<div class="modal-body" id="ban-modal-body">
<form id="banModalForm">
<input type="hidden" name="formkey" value="{{v.formkey}}" >
<label for="ban-modal-link">Public ban reason (optional)</label>
<textarea maxlength="64" name="reason" form="banModalForm" class="form-control" id="ban-modal-link" aria-label="With textarea" placeholder="Enter reason"></textarea>
<label for="days" class="mt-3">Duration days</label>
<input type="number" step="any" name="days" id="days" class="form-control" placeholder="leave blank for permanent" >
<div class="custom-control custom-switch mt-3">
<input type="checkbox" class="custom-control-input" id="alts" name="alts">
<label class="custom-control-label" for="alts">Ban known alts</label>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-link text-muted" data-bs-dismiss="modal">Cancel</button>
<button type="button" id="banUserButton" class="btn btn-danger" data-bs-dismiss="modal"></button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,23 @@
{% extends "settings2.html" %}
{% block content %}
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight:bold;">#</th>
<th style="font-weight:bold;">Name</th>
<th style="font-weight:bold;">Ban reason</th>
<th style="font-weight:bold;">Banned by</th>
</tr>
</thead>
{% for user in users %}
<tr>
<td style="font-weight:bold;">{{loop.index}}</td>
<td><a style="color:#{{user.namecolor}}; font-weight:bold;" href="/@{{user.username}}"><img loading="lazy" src="/uid/{{user.id}}/pic" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span></a></td>
<td style="font-weight:bold;">{% if user.ban_reason %}{{user.ban_reason}}{% endif %}</td>
<td style="font-weight:bold;" href="/@{{user.banned_by.username}}"><img loading="lazy" src="/uid/{{user.banned_by.id}}/pic" class="pp20"><span {% if user.banned_by.patron %}class="patron" style="background-color:#{{user.banned_by.namecolor}};"{% endif %}>{{user.banned_by.username}}</span></a></td>
</tr>
{% endfor %}
</table>
{% endblock %}

View File

@ -0,0 +1,22 @@
{% extends "settings2.html" %}
{% block pagetitle %}Blocks{% endblock %}
{% block content %}
<h1> Blocks</h1>
<pre></pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight:bold;">User</th>
<th style="font-weight:bold;">Target</th>
</tr>
</thead>
{% for user in users %}
<tr>
<td><a style="font-weight:bold;color:#{{user.namecolor}}; " href="/@{{user.username}}"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span></a></td>
<td><a style="font-weight:bold;color:#{{targets[loop.index-1].namecolor}}; " href="/@{{targets[loop.index-1].username}}"><span {% if targets[loop.index-1].patron %}class="patron" style="background-color:#{{targets[loop.index-1].namecolor}};"{% endif %}>{{targets[loop.index-1].username}}</span></a></td>
</tr>
{% endfor %}
</table>
{% endblock %}

View File

@ -0,0 +1,107 @@
{% extends "settings2.html" %}
{% block pagetitle %}Changelog{% endblock %}
{% block desktopBanner %}
<div class="row" style="overflow: visible;padding-top:5px;">
<div class="col">
<div class="d-flex justify-content-between align-items-center">
{% block navbar %}
<div class="font-weight-bold py-3"></div>
<div class="d-flex align-items-center sortingbarmargin">
<div class="text-small font-weight-bold mr-2"></div>
<div class="dropdown dropdown-actions">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{% if t=="day" %}<i class="fas fa-calendar-day mr-1"></i>{% endif %}
{% if t=="week" %}<i class="fas fa-calendar-week mr-1"></i>{% endif %}
{% if t=="month" %}<i class="fas fa-calendar-alt mr-1"></i>{% endif %}
{% if t=="year" %}<i class="fas fa-calendar mr-1"></i>{% endif %}
{% if t=="all" %}<i class="fas fa-infinity mr-1"></i>{% endif %}
{{t | capitalize}}
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, 31px, 0px);">
{% if not t=="hour" %}<a class="dropdown-item" href="?sort={{sort}}&t=hour"><i class="fas fa-clock mr-2"></i>Hour</a>{% endif %}
{% if not t=="day" %}<a class="dropdown-item" href="?sort={{sort}}&t=day"><i class="fas fa-calendar-day mr-2"></i>Day</a>{% endif %}
{% if not t=="week" %}<a class="dropdown-item" href="?sort={{sort}}&t=week"><i class="fas fa-calendar-week mr-2"></i>Week</a>{% endif %}
{% if not t=="month" %}<a class="dropdown-item" href="?sort={{sort}}&t=month"><i class="fas fa-calendar-alt mr-2"></i>Month</a>{% endif %}
{% if not t=="year" %}<a class="dropdown-item" href="?sort={{sort}}&t=year"><i class="fas fa-calendar mr-2"></i>Year</a>{% endif %}
{% if not t=="all" %}<a class="dropdown-item" href="?sort={{sort}}&t=all"><i class="fas fa-infinity mr-2"></i>All</a>{% endif %}
</div>
</div>
<div class="text-small font-weight-bold ml-3 mr-2"></div>
<div class="dropdown dropdown-actions">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton2" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{% if sort=="hot" %}<i class="fas fa-fire mr-1"></i>{% endif %}
{% if sort=="top" %}<i class="fas fa-arrow-alt-circle-up mr-1"></i>{% endif %}
{% if sort=="bottom" %}<i class="fas fa-arrow-alt-circle-down mr-1"></i>{% endif %}
{% if sort=="new" %}<i class="fas fa-sparkles mr-1"></i>{% endif %}
{% if sort=="old" %}<i class="fas fa-book mr-1"></i>{% endif %}
{% if sort=="controversial" %}<i class="fas fa-bullhorn mr-1"></i>{% endif %}
{% if sort=="comments" %}<i class="fas fa-comments mr-1"></i>{% endif %}
{{sort | capitalize}}
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton2" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, 31px, 0px);">
{% if sort != "hot" %}<a class="dropdown-item" href="?sort=hot&t={{t}}"><i class="fas fa-fire mr-2"></i>Hot</a>{% endif %}
{% if sort != "top" %}<a class="dropdown-item" href="?sort=top&t={{t}}"><i class="fas fa-arrow-alt-circle-up mr-2"></i>Top</a>{% endif %}
{% if sort != "bottom" %}<a class="dropdown-item" href="?sort=bottom&t={{t}}"><i class="fas fa-arrow-alt-circle-down mr-2"></i>Bottom</a>{% endif %}
{% if sort != "new" %}<a class="dropdown-item" href="?sort=new&t={{t}}"><i class="fas fa-sparkles mr-2"></i>New</a>{% endif %}
{% if sort != "old" %}<a class="dropdown-item" href="?sort=old&t={{t}}"><i class="fas fa-book mr-2"></i>Old</a>{% endif %}
{% if sort != "controversial" %}<a class="dropdown-item" href="?sort=controversial&t={{t}}"><i class="fas fa-bullhorn mr-2"></i>Controversial</a>{% endif %}
{% if sort != "comments" %}<a class="dropdown-item" href="?sort=comments&t={{t}}"><i class="fas fa-comments mr-2"></i>Comments</a>{% endif %}
</div>
</div>
</div>
{% endblock %}
</div>
</div>
</div>
{% endblock %}
{% block content %}
{% if v %}
<a id="subscribe" class="{% if v.changelogsub %}d-none{% endif %} btn btn-primary followbutton " href="javascript:void(0)" onclick="post_toast2('/changelogsub','subscribe','unsubscribe')">Subscribe</a>
<a id="unsubscribe" class="{% if not v.changelogsub %}d-none{% endif %} btn btn-primary followbutton " href="javascript:void(0)" onclick="post_toast2('/changelogsub','subscribe','unsubscribe')">Unsubscribe</a>
{% endif %}
<div class="row no-gutters {% if listing %}mt-md-3{% elif not listing %}my-md-3{% endif %}">
<div class="col-12">
<div class="posts" id="posts">
{% include "submission_listing.html" %}
</div>
</div>
</div>
{% if listing %}
<nav aria-label="Page navigation">
<ul class="pagination pagination-sm mb-0">
{% if page>1 %}
<li class="page-item">
<small><a class="page-link" href="?sort={{sort}}&page={{page-1}}&t={{t}}{% if only %}&only={{only}}{% endif %}" tabindex="-1">Prev</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<small><a class="page-link" href="?sort={{sort}}&page={{page+1}}&t={{t}}{% if only %}&only={{only}}{% endif %}">Next</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Next</span></li>
{% endif %}
</ul>
</nav>
{% endif %}
<script src="/assets/CHRISTMAS/js/post_toast2.js?v=200"></script>
{% endblock %}

View File

@ -0,0 +1,44 @@
{% extends "default.html" %}
{% block title %}
<title>Unable to post comment</title>
{% endblock %}
{% block pagetype %}message{% endblock %}
{% block content %}
<div class="">
<p>Please remove the following link(s) from your comment, and then you will be able to post it:</p>
<ul>
{% for site in badlinks %}
<li>{{site}}</li>
{% endfor %}
</ul>
<div>
<div class="comment-write collapsed child p-4">
<form id="reply" action="{{action}}" method="post" class="input-group">
<input type="hidden" name="formkey" value="{{v.formkey}}">
{% if parent_fullname %}<input type="hidden" name="parent_fullname" value="{{parent_fullname}}">{% endif %}
{% if parent_submission %}<input type="hidden" name="submission" value="{{parent_submission}}">{% endif %}
<textarea name="body" form="reply" class="comment-box form-control rounded" id="reply-form" aria-label="With textarea" placeholder="Add your comment..." {% if v.longpost %}minlength="280"{% endif %} maxlength="{% if v.bird %}140{% else %}10000{% endif %}" rows="10">{{body}}</textarea>
<div class="comment-format">
<small class="format pl-0"><i class="fas fa-bold" aria-hidden="true" onclick="makeReplyBold()" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Bold"></i></small>
<a class="format" href="javascript:void(0)"><i class="fas fa-italic" aria-hidden="true" onclick="makeReplyItalics()" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Italicize"></i></a>
<a class="format" href="javascript:void(0)"><i class="fas fa-quote-right" aria-hidden="true" onclick="makeReplyQuote()" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Quote"></i></a>
<a class="format" href="javascript:void(0)"><i class="fas fa-link" aria-hidden="true"></i></small>
</div>
<button form="reply" class="btn btn-primary ml-auto fl-r">Comment</a>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,561 @@
{% if v %}
{% include "award_modal.html" %}
<script defer src="/assets/CHRISTMAS/js/marked.js?v=200"></script>
<script defer src="/assets/CHRISTMAS/js/comments_v.js?v=200"></script>
{% endif %}
{% if v and v.admin_level > 1 %}
<script defer src="/assets/CHRISTMAS/js/comments_admin.js?v=200"></script>
{% endif %}
<script defer src="/assets/CHRISTMAS/js/comments.js?v=200"></script>
{% include "expanded_image_modal.html" %}
<script defer>
function poll_vote(cid, parentid) {
{% if v %}
for(let el of document.getElementsByClassName('presult-'+parentid)) {
el.classList.remove('hidden');
}
for(let el of document.getElementsByClassName('presult')) {
el.classList.remove('hidden');
}
var type = document.getElementById(cid).checked;
var scoretext = document.getElementById('poll-' + cid);
var score = Number(scoretext.textContent);
if (type == true) scoretext.textContent = score + 1;
else scoretext.textContent = score - 1;
post('/vote/poll/' + cid + '?vote=' + type);
{% else %}
var myToast = new bootstrap.Toast(document.getElementById('toast-post-error'));
myToast.show();
document.getElementById('toast-post-error-text').innerText = "Only logged-in users can vote!";
{% endif %}
}
</script>
{% macro single_comment(c, level=1) %}
{% if p and not (v and v.id==c.author_id) and (not v or v.highlightcomments) %}
<script defer>
comments = JSON.parse(localStorage.getItem("comment-counts")) || {}
lastCount = comments['{{p.id}}']
if (lastCount && {{c.created_utc*1000}} > lastCount.t) {
document.getElementById("reddot-{{c.id}}").innerHTML = '<i style="color:red !important" class="text-admin fas fa-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="Unread"></i>'
}
</script>
{% endif %}
<script defer>
(() => {
const date = new Date({{c.created_utc*1000}});
document.getElementById('timestamp-{{c.id}}').title = date.toString();
{% if c.is_pinned %}
const pinned_info = document.getElementById('pinned-{{c.id}}')
{% if c.is_pinned.startswith('t:') %}
pinned_info.setAttribute("data-bs-original-title", `Pinned until ${new Date({{c.is_pinned[2:]}} * 1000).toString()}`)
{% else %}
pinned_info.setAttribute("data-bs-original-title", "Pinned by @{{c.is_pinned}}")
{%endif%}
{%endif%}
})()
</script>
{% set ups=c.upvotes %}
{% set downs=c.downvotes %}
{% set score=ups-downs %}
{% if v and (v.shadowbanned or v.admin_level > 1) %}
{% set replies=c.replies3 %}
{% else %}
{% set replies=c.replies %}
{% endif %}
{% if (c.is_banned or c.deleted_utc > 0 or c.is_blocking) and not (v and v.admin_level>0) and not (v and v.id==c.author_id) %}
<div id="comment-{{c.id}}" class="comment">
<span class="comment-collapse-desktop hidden d-md-block" style="border-left: 2px solid #{{c.author.namecolor}};" onclick="collapse_comment('{{c.id}}')"></span>
<div class="comment-body">
<div id="comment-{{c.id}}-only">
<div class="user-info">
<span class="comment-collapse-icon" onclick="collapse_comment('{{c.id}}')"></span>
<button class="p-2 md:hidden" onclick="collapse_comment('{{c.id}}')">
<i class="fas fa-minus-circle fa-sm fa-fw comment-toggle-icon-{{c.id}}"></i>
</button>
{% if standalone and c.over_18 %}<span class="badge badge-red">+18</span>{% endif %}
{% if c.is_banned %}removed by @{{c.ban_reason}}{% elif c.deleted_utc > 0 %}Deleted by author{% elif c.is_blocking %}You are blocking @{{c.author.username}}{% endif %}
</div>
</div>
{% if render_replies %}
{% if level<10 %}
<div id="replies-of-{{c.id}}" class="">
{% set standalone=False %}
{% for reply in replies %}
{{single_comment(reply, level=level+1)}}
{% endfor %}
</div>
{% elif "notifications" in request.path %}
<div id="replies-of-{{c.id}}" class="hidden md:block">
{% set standalone=False %}
{% for reply in replies %}
{{single_comment(reply, level=level+1)}}
{% endfor %}
</div>
<div id="morecomment-{{c.id}}" class="md:hidden mt-2 more-comments text-small">
<a {% if v %}href="{{c.shortlink}}"{% else %}href="/logged_out{{c.shortlink}}"{% endif %}>More comments <i class="fas fa-long-arrow-right ml-1"></i></a>
</div>
{% elif replies %}
<div id="morecomment-{{c.id}}" class="mt-2 more-comments text-small">
<a {% if v %}href="{{c.shortlink}}"{% else %}href="/logged_out{{c.shortlink}}"{% endif %}>More comments <i class="fas fa-long-arrow-right ml-1"></i></a>
</div>
{% endif %}
{% endif %}
</div>
</div>
{% else %}
{% set score=c.score %}
{% if v %}
{% set voted=c.voted %}
{% else %}
{% set voted=-2 %}
{% endif %}
{% if standalone and level==1 %}
<div class="post-info font-bold mt-5 mb-1">
{% if c.post and c.post.over_18 %}
<span class="badge badge-red">+18</span>
{% endif %}
<div>
{% if c.post %}
{% if c.author_id==v.id and c.child_comments and is_notification_page%}
<span>
Comment {{'Replies' if (c.child_comments | length)>1 else 'Reply'}}:
<a href="{{c.post.permalink}}" class="text-gray-700 hover:text-gray-900">{{c.post.realtitle(v) | safe}}</a>
</span>
{% elif c.post.author_id==v.id and c.level == 1 and is_notification_page%}
<span>Post Reply:
<a href="{{c.post.permalink}}" class="text-gray-700 hover:text-gray-900">{{c.post.realtitle(v) | safe}}</a>
</span>
{% elif is_notification_page and c.parent_submission in v.subscribed_idlist() %}
<span>Subscribed Thread:
<a href="{{c.post.permalink}}" class="text-gray-700 hover:text-gray-900">{{c.post.realtitle(v) | safe}}</a></span>
{% elif is_notification_page %}
<span>Username Mention:
<a href="{{c.post.permalink}}" class="text-gray-700 hover:text-gray-900">{{c.post.realtitle(v) | safe}}</a>
</span>
{% else %}
<span>
<a href="{{c.post.permalink}}" class="text-gray-700 hover:text-gray-900">{{c.post.realtitle(v) | safe}}</a>
</span>
{% endif %}
{% elif c.author_id==NOTIFICATIONS_ID or c.author_id==AUTOJANNY_ID %}
<span>{{'SITE_NAME' | app_config}} Notification</span>
{% else %}
{% if c.sentto == 0 %}
<span>Sent to admins</span>
{% else %}
<span>Sent to @{{c.senttouser.username}}</span>
{% endif %}
{% endif %}
</div>
</div>
{% endif %}
<div id="comment-{{c.id}}" class="comment anchor {% if c.unread %}bg-gradient-to-r from-red-200{% endif %} relative flex mt-4 md:mt-6 {% if standalone and level==1 %} mt-0{% endif %}{% if c.collapse_for_user(v) or (standalone and c.over_18 and not (v and v.over_18)) %} collapsed items-center opacity-50 md:hover:opacity-100{% endif %}">
{% if c.collapse_for_user(v) or (standalone and c.over_18 and not (v and v.over_18)) %}
<div id="comment-collapse-{{c.id}}" class="z-20 absolute w-full h-full bottom-0 left-0 right-0 top-0 cursor-pointer" onclick="collapse_comment('{{c.id}}')"></div>
{% else %}
<div id="comment-collapse-{{c.id}}" class="hidden pointer-events-none z-20 absolute w-full h-full bottom-0 left-0 right-0 top-0 cursor-pointer" onclick="collapse_comment('{{c.id}}')"></div>
{% endif %}
<span class="comment-collapse-desktop hidden" {% if not c.unread %}style="border-left: 2px solid #{{c.author.namecolor}};"{% endif %} onclick="collapse_comment('{{c.id}}')"></span>
<div class="flex flex-col flex-shrink-0 items-center mr-2.5 {{ 'md:mr-4' if not c.parent_comment_id or standalone else 'md:mr-3' }}">
<div class="relative {{ 'santa' if c.author.patron else 'cap' }}">
{% if standalone or level==1 %}
<img loading="lazy" src="{{ c.author.profile_url }}" class="hidden md:block flex-shrink-0 w-14 h-14 p-[3px] bg-white border border-gray-300 object-cover lozad" alt="{{ c.author.username }} avatar"/>
{% else %}
<img loading="lazy" src="{{ c.author.profile_url }}" class="hidden md:block flex-shrink-0 w-9 h-9 p-[3px] bg-white border border-gray-300 object-cover lozad" alt="{{ c.author.username }} avatar"/>
{% endif %}
</div>
<button onclick="collapse_comment('{{c.id}}')" class="invisible-on-collapse md:ml-4 w-[1px] md:w-4 h-full border-l border-gray-400"></button>
</div>
<div class="w-full">
<div id="{% if comment_info and comment_info.id == c.id %}context{%else%}comment-{{c.id}}-only{% endif %}" class="comment-anchor relative {% if comment_info and comment_info.id == c.id %}context{%endif%}{% if c.is_banned %} banned{% endif %}{% if c.deleted_utc %} deleted{% endif %} {% if c.award_count("snow") %}snowcaps{% endif %} {% if c.award_count("lights") %}lights{% endif %}">
<span class="absolute right-4 top-2" id="reddot-{{c.id}}"></span>
<div class="relative z-10 user-info no-scrollbar overflow-y-hidden overflow-x-auto flex items-center space-x-2 md:-ml-2 text-sm text-gray-500 leading-normal">
<button class="p-2 md:hidden" onclick="collapse_comment('{{c.id}}')">
<i class="fas fa-minus-circle fa-fw fa-sm comment-toggle-icon-{{c.id}}"></i>
</button>
{% if c.awards %}
<ul class="flex space-x-2 mb-0">
{% for a in c.awards %}
<li>
<i class="{{a.class_list}} px-1" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="{{a.title}} Award given by @{{a.user.username}}"></i>
</li>
{% endfor %}
</ul>
{% endif %}
{% if c.post and c.post.award_count("ghosts") %}
<span>👻</span>
{% else %}
{% if c.author.verified %}
<i class="fas fa-badge-check" style="color:{% if c.author.verifiedcolor %}#{{c.author.verifiedcolor}}{% else %}#1DA1F2{% endif %}" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="{{c.author.verified}}"></i>
{% endif %}
<div class="relative md:hidden flex-shrink-0 {{ 'santa' if c.author.patron else 'cap' }}">
<img loading="lazy" src="{{ c.author.profile_url }}" class="flex-shrink-0 w-9 h-9 p-[3px] bg-white border border-gray-300 object-cover lozad" alt="{{ c.author.username }} avatar"/>
</div>
<span class="flex-shrink-0">
<a class="user-name" onclick='userPopover({{c.author.json_popover | 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}};">
<span class="text-sm font-bold">
{% if c.author.patron and not c.distinguish_level %}
<span class="patron" style="background-color:#{{c.author.namecolor}};">
{{c.author.username}}
</span>
{% elif c.distinguish_level and 'rama' in request.host %}
<span class="mod" style="background-color:#{{c.author.namecolor}};">
{{c.author.username}}
</span>
{% else %}
{{c.author.username}}
{% endif %}
</span>
</a>
</span>
{% if c.author.customtitle %}
<bdi class="flex-shrink-0" style="color: #{{c.author.titlecolor}}">
{{c.author.customtitle | safe }}
</bdi>
{% endif %}
{% if c.bannedfor and c.author.banned_by %}
<a href="javascript:void(0)"><i class="fad fa-gavel text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="User was banned for this comment by @{{c.author.banned_by.username}}"></i></a>
{% endif %}
{% if c.active_flags %}
<a class="flex-shrink-0 badge badge-red" style="padding:1px 5px; font-size:10px;" href="javascript:void(0)" onclick="document.getElementById('flaggers-{{c.id}}').classList.toggle('hidden')">{{c.active_flags}} Reports</a>
{% endif %}
{% if c.over_18 %}
<span class="badge badge-red">+18</span>
{% endif %}
{% if v and v.admin_level==6 and c.author.shadowbanned %}
<i class="fas fa-user-times text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="Shadowbanned by @{{c.author.shadowbanned}}"></i>
{% endif %}
{% if c.is_pinned %}
<i id='pinned-{{c.id}}' class="fas fa-thumbtack fa-rotate--45 text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="Pinned {% if c.is_pinned.startswith('t:') %}until {{c.is_pinned[2:]}}{% else %}by @{{c.is_pinned}}{%endif%}"></i>
{% endif %}
{% if c.distinguish_level %}
<i class="fas fa-broom text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="{{'SITE_NAME' | app_config}} Admin, speaking officially"></i>
{% endif %}
{% if c.is_op %}
<i class="fas fa-microphone-stand text-info" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="OP"></i>
{% endif %}
{% if c.is_bot %}
<i class="fad fa-robot text-info" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="Bot"></i>
{% endif %}
{% if c.is_blocking %}
<i class="fas fa-user-minus text-warning" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="You're blocking this user, but you can see this comment because you're an admin"></i>
{% endif %}
{% if c.is_blocked %}
<i class="fas fa-user-minus text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="" data-bs-original-title="This user is blocking you."></i>
{% endif %}
{% if c.parent_comment_id and not standalone and level<=7 %}
<a href="#comment-{{ c.parent_comment_id }}-only" class="flex-shrink-0 text-gray-500 hover:text-gray-400 user-name-reply">
<i class="fas fa-reply fa-sm fa-fw fa-flip-horizontal"></i>
<span class="hidden sm:inline-block">replying to</span>
<span class="font-bold">
{% if c.post and c.post.award_count("ghosts") %}
👻
{% else %}
{{ c.parent_comment.author.username }}{% endif %}
</span>
</a>
{% endif %}
<span onmouseover="timestamp('timestamp-{{c.id}}','{{c.created_utc}}')" id="timestamp-{{c.id}}" data-bs-toggle="tooltip" data-bs-placement="bottom" class="flex-shrink-0 time-stamp">
{{c.age_string}}
</span>
{% if c.edited_utc %}
<span onmouseover="timestamp('time-edit-{{c.id}}','{{c.edited_utc}}')" id="time-edit-{{c.id}}" class="flex-shrink-0 time-edited italic">
Edited {{c.edited_string}}
</span>
{% endif %}
{% endif %}
</div>
{% if c.active_flags %}
<div id="flaggers-{{c.id}}" class="flaggers hidden hidden-on-collapse">
<strong><i class="far fa-fw fa-flag"></i> Reported by:</strong>
<pre></pre>
<ul style="padding-left:20px; margin-bottom: 0;">
{% for f in c.ordered_flags %}
<li><a style="font-weight:bold" href="{{f.user.url}}">{{f.user.username}}</a>{% if f.reason %}: {{f.reason | safe}}{% endif %} {% if v and v.admin_level > 1 %}<a href="javascript:void(0)" onclick="post_toast('/del_report/c{{ f.id }}')">[remove]</a>{% endif %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if c.is_banned and c.ban_reason %}
<div id="comment-banned-warning" class="hidden-on-collapse text-red-600 mb-0">Removed by @{{c.ban_reason}}</div>
{% endif %}
<div id="comment-text-{{c.id}}" class="hidden-on-collapse text-black mt-2 break-words {% if c.award_count("candycane") %}candycane{% endif %}">
{{c.realbody(v) | safe}}
{% if c.options %}
{% for o in c.options %}
<div class="custom-control">
<input type="checkbox" class="custom-control-input" id="{{o.id}}" name="option" {% if o.poll_voted(v) %}checked{% endif %} onchange="poll_vote('{{o.id}}', '{{c.id}}')">
<label class="custom-control-label" for="{{o.id}}">{{o.body_html | safe}}<span class="presult-{{c.id}} {% if not c.total_poll_voted(v) %}hidden{% endif %}"> - <a href="/votes?link=t3_{{o.id}}"><span id="poll-{{o.id}}">{{o.upvotes}}</span> votes</a></span></label>
</div>
{% endfor %}
<pre></pre>
{% endif %}
{% if c.author.sig_html and (c.author_id == 1904 or not (v and v.sigs_disabled)) %}
<hr>
{{c.author.sig_html | safe}}
{% endif %}
{% if not c.parent_submission and c.author_id!=NOTIFICATIONS_ID and c.author_id!=AUTOJANNY_ID and c.author_id!=v.id %}
<button class="btn btn-gray" onclick="document.getElementById('reply-m-{{c.id}}').classList.toggle('hidden')">
<i class="fas fa-reply fa-sm fa-fw mr-1"></i>
Reply
</button>
{% include "/comments/CommentMessageReplyForm.html" %}
{% endif %}
</div>
{% if c.parent_submission %}
<!-- Author's edit comment form -->
{% if v and v.id==c.author_id %}
{% include "/comments/CommentEditForm.html" %}
{% endif %}
<!-- Comment actions -->
<div id="comment-{{c.id}}-actions" class="hidden-on-collapse py-3 {% if voted==1 %} upvoted{% elif voted==-1 %} downvoted{% endif %}">
{% include "/comments/CommentActions.html" %}
</div>
{% endif %}
</div>
<div id="reply-to-{{c.id}}" class="hidden hidden-on-collapse">
{% include "/comments/CommentReplyForm.html" %}
</div>
{% if render_replies %}
{% if level<10 %}
<div id="replies-of-{{c.id}}" class="hidden-on-collapse">
{% for reply in replies %}
{{single_comment(reply, level=level+1)}}
{% endfor %}
</div>
{% elif replies and "notifications" in request.path %}
<div id="replies-of-{{c.id}}" class="hidden md:block hidden-on-collapse">
{% set standalone=False %}
{% for reply in replies %}
{{single_comment(reply, level=level+1)}}
{% endfor %}
</div>
<div id="morecomment-{{c.id}}" class="md:hidden mt-2 more-comments text-small hidden-on-collapse">
<a href="{{c.shortlink}}">More comments <i class="fas fa-long-arrow-right ml-1"></i></a>
</div>
{% elif replies %}
<div id="morecomments-{{c.id}}" class="mt-2 more-comments text-small hidden-on-collapse hidden md:block">
<button class="mt-2 w-full btn btn-gray" id="load-more-replies-button-{{c.id}}" onclick="loadMoreReplies('{{c.id}}','morecomments-{{c.id}}',this.id); this.disabled = true;">
Load more replies
</button>
</div>
<a class="md:hidden hidden-on-collapse" href="{{c.shortlink}}">More comments <i class="fas fa-long-arrow-right ml-1"></i></a>
{% endif %}
{% endif %}
</div>
{% include "/modals/ModalCommentActions.html" %}
</div>
{% endif %}
{% endmacro %}
<div id="comment-list">
{% for comment in comments %}
{{single_comment(comment)}}
{% endfor %}
</div>
{% if v %}
{% include "gif_modal.html" %}
{% include "emoji_modal.html" %}
{% if v.admin_level > 1 %}
{% include "ban_modal.html" %}
{% endif %}
<div class="modal fade" id="deleteCommentModal" tabindex="-1" role="dialog" aria-labelledby="deleteCommentModalTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Delete comment?</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
<div class="modal-body text-center">
<div class="py-4">
<i class="fad fa-trash-alt text-muted" style="font-size: 3.5rem;"></i>
</div>
<p>Your comment will be removed everywhere on {{'SITE_NAME' | app_config}}. This action can be undone.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-link text-muted" data-bs-dismiss="modal">Cancel</button>
<button id="deleteCommentButton" class="btn btn-danger">Delete comment</button>
</div>
</div>
</div>
</div>
{% include "/modals/ModalReportComment.html" %}
{% endif %}
{% if offset %}
{% if p %}
{% set pid = p.id %}
{% endif %}
<div id="comment-list-{{ offset }}">
<button class="mt-2 w-full btn btn-gray" id="load-more-button-{{ offset }}" onclick="loadMore({{pid}},'{{sort}}',{{offset}},'comment-list-{{ offset }}',this.id); this.disabled = true;">
Load more comments
</button>
</div>
{% endif %}
<style>
html {
scroll-padding-top: 75px;
}
.comment .comment-body {
padding: 3px 0;
}
.comment-anchor:target {
transition: all 0.25s ease;
animation: blink normal 1s ease;
}
@keyframes blink {
0% {
background-color: rgba(0,0,0,0.1)
}
50% {
background-color: rgba(0,0,0,0.2)
}
100% {
background-color: rgba(0,0,0,0.1)
}
}
.mod:before {
content: '(((';
}
.mod:after {
content: ')))';
}
.mod {
padding: 2px 5px 3px 5px;
border-radius: 5px;
color:white!important;
background: -moz-linear-gradient(180deg, red, orange, yellow, green, blue, indigo, violet);
background: -webkit-linear-gradient(left, red, orange, yellow, green, blue, indigo, violet );
text-shadow:-1px -1px 0 black,1px -1px 0 black,-1px 1px 0 black,1px 1px 0 black;
}
.popover {
max-width: 100%;
box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175);
border-color: #dadada;
}
.popover-arrow {
display: none !important;
}
.popover-user-profile {
display: flex;
flex-direction: column;
padding: 0;
background: var(--gray-600);
}
.popover-body {
padding: 0;
border-radius: .25rem;
overflow: hidden;
}
.mt-n6 {
margin-top: -1.75rem !important;
}
.avatar-72 {
width: 72px;
height: 72px;
object-fit: cover;
}
.h-64 {
height: 64px;
}
.object-cover {
object-fit: cover;
}
.smolbtn {
font-weight: 600;
font-size: .9rem;
border-radius: 0.2rem;
padding: 0.1rem 0.50rem 0rem 0.30rem;
background-color: var(--black) !important;
}
.smol {
font-size: 11.5px;
}
.comment.collapsed .hidden-on-collapse {
display: none;
}
.comment.collapsed .invisible-on-collapse {
visibility: hidden;
}
</style>

View File

@ -0,0 +1,67 @@
{% extends "default.html" %}
{% block title %}
<title>{{'SITE_NAME' | app_config}} - Contact</title>
<meta name="description" content="Contact {{'SITE_NAME' | app_config}} Admins">
{% endblock %}
{% block content %}
<div class="col-span-full">
{% if request.values.get('error') or error %}
<div class="alert alert-danger alert-dismissible fade show my-3" role="alert">
<i class="fas fa-exclamation-circle my-auto"></i>
<span>
{{error if error else request.values.get('error')}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
{% if request.values.get('msg') or msg %}
<div class="alert alert-success alert-dismissible fade show my-3" role="alert">
<i class="fas fa-check-circle my-auto" aria-hidden="true"></i>
<span>
{{msg if msg else request.values.get('msg')}}
</span>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
{% endif %}
<h1 class="article-title">Contact {{'SITE_NAME' | app_config}} Admins</h1>
{% if v and v.is_activated and not v.is_suspended %}
<p>Use this form to contact {{'SITE_NAME' | app_config}} Admins.</p>
<label class="mt-3">Your Email</label>
<input class="form-control" value="{{v.email}}" readonly="readonly" disabled>
<form id="contactform" action="/contact" method="post">
<label for="input-message" class="mt-3">Your message</label>
<textarea maxlength="10000" id="input-message" form="contactform" name="message" class="form-control" required></textarea>
<input type="submit" value="Submit" class="btn btn-primary mt-3">
</form>
{% elif v %}
<p>Please <a {% if v and v.newtab %}target="_blank"{% endif %} href="/settings/security">verify your email address</a> in order to ensure we can respond to your message if needed. Then, refresh this page.</p>
{% else %}
<p>In order to ensure that we can respond to your message, please first <a href="/signup" {% if v and v.newtab %}target="_blank"{% endif %}>sign up</a> or <a href="/login" {% if v and v.newtab %}target="_blank"{% endif %}>log in</a> and make sure you have <a {% if v and v.newtab %}target="_blank"{% endif %} href="/settings/security">verified your email address</a>. Then, refresh this page.</p>
{% endif %}
<p>If you can see this line, we haven't been contacted by any law enforcement or governmental organizations in 2021 yet.</p>
</div>
{% endblock %}

View File

@ -0,0 +1,353 @@
<!DOCTYPE html>
<html lang="en">
<head>
{% if v and v.agendaposter %}
<script src="/assets/CHRISTMAS/js/agendaposter.js"></script>
<noscript>
<style>
body {
-moz-transform: scale(-1, -1);
-o-transform: scale(-1, -1);
-webkit-transform: scale(-1, -1);
transform: scale(-1, -1);
}
</style>
</noscript>
{% endif %}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="thumbnail" content="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/preview.gif">
<link rel="icon" type="image/png" href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99">
{% block title %}
<title>{{'SITE_NAME' | app_config}}</title>
<meta property="og:type" content="article" >
<meta property="og:title" content="{{'SITE_NAME' | app_config}}" >
<meta property="og:site_name" content="{{request.host}}" >
<meta property="og:image" content="{{'SITE_NAME' | app_config}}/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/preview.gif" >
<meta property="og:url" content="{{request.path | full_link}}">
<meta property="og:description" name="description" content="{{'SITE_NAME' | app_config}} - {{'SLOGAN' | app_config}}">
<meta property="og:author" name="author" content="@{{request.host_url}}" >
<meta property="og:site_name" content="{{request.host}}" >
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@{{request.host_url}}">
<meta name="twitter:title" content="{{'SITE_NAME' | app_config}}" >
<meta name="twitter:creator" content="@{{request.host_url}}">
<meta name="twitter:description" content="{{'SITE_NAME' | app_config}} - {{'SLOGAN' | app_config}}" >
<meta name="twitter:image" content="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/preview.gif" >
<meta name="twitter:url" content="{{request.path | full_link}}" >
{% endblock %}
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-touch-fullscreen" content="yes">
<meta name="format-detection" content="telephone=no">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99">
<!---<link rel="icon" type="image/png" sizes="32x32" href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99">--->
<link rel="manifest" href="/assets/CHRISTMAS/manifest.json">
<link rel="mask-icon" href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99" color="#{{'DEFAULT_COLOR' | app_config}}">
<link rel="shortcut icon" href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99">
<meta name="apple-mobile-web-app-title" content="{{'SITE_NAME' | app_config}}">
<meta name="application-name" content="{{'SITE_NAME' | app_config}}">
<meta name="msapplication-TileColor" content="#{{'DEFAULT_COLOR' | app_config}}">
<meta name="msapplication-config" content="/assets/CHRISTMAS/images/browserconfig.xml">
<meta name="theme-color" content="#{{'DEFAULT_COLOR' | app_config}}">
<link
rel="apple-touch-startup-image"
sizes="320x480"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="640x960"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-icon"
sizes="640x1136"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-icon"
sizes="750x1334"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="768x1004"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="768x1024"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="828x1792"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1024x748"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1024x768"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1125x2436"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1242x2208"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1242x2688"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1334x750"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1536x2008"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1536x2048"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1668x2224"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="1792x828"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2048x1496"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2048x1536"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2048x2732"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2208x1242"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2224x1668"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2436x1125"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2668x1242"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
<link
rel="apple-touch-startup-image"
sizes="2737x2048"
href="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/icon.webp?v=99"
>
{% block stylesheets %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=400">
<link rel="stylesheet" href="/static/dist/main.css?v=400">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/mistletoe.css?v=400">
{% if v %}
<style>:root{--primary:#dc2626}</style>
<!-- <style>:root{--primary:#{{v.themecolor}}}</style> -->
<!-- <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 %}
{% else %}
<style>:root{--primary:#dc2626}</style>
<!-- <style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}}</style> -->
<!-- <link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200"> -->
{% endif %}
{% endblock %}
<link href="/assets/CHRISTMAS/css/fa.css?v=200" rel="stylesheet">
<style>
@font-face { font-family: 'Delius Swash Caps'; src: url('/assets/CHRISTMAS/fonts/DeliusSwashCaps-Regular.ttf'); }
</style>
</head>
<body id="{% if request.path != '/comments' %}{% block pagetype %}frontpage{% endblock %}{% endif %}" class="overflow-hidden overflow-y-auto sm:overflow-y-none antialiased bg-cover bg-center bg-gray-500 text-gray-900">
{% block Banner %}
{% endblock %}
{% include "header-tw.html" %}
{% block mobileUserBanner %}
{% endblock %}
{% block mobileBanner %}
{% endblock %}
{% block postNav %}
{% endblock %}
<div class="flex h-screen pt-16 bg-gray-500">
<div class="w-full sm:overflow-y-auto">
{% block desktopUserBanner %}
{% endblock %}
{% block desktopBanner %}
{% endblock %}
<div class="md:px-4 bg-gray-700" id="sub-header-row">
{% block subHeader %}
{% endblock %}
</div>
{% block subHeader2 %}
{% endblock %}
<div class="w-full md:px-4">
<div class="w-full max-w-screen-2xl mx-auto mb-4 md:px-4 grid grid-cols-12 gap-6 bg-gray-300 md:bg-gray-200 rounded-b" id="main-content-row">
{% block searchText %}
{% endblock %}
{% block content %}
{% endblock %}
{% block pagenav %}
{% endblock %}
{% block sidebar %}
{% endblock %}
</div>
</div>
{% include "footer.html" %}
</div>
</div>
{% if v %}
<div id="formkey" class="hidden">{{ v.formkey }}</div>
{% endif %}
{% include "ProfilePopover.html" %}
{% block mobilenavbar %}
{% include "mobile_navigation_bar.html" %}
{% endblock %}
{% block actionsModal %}
{% endblock %}
{% block reportCommentModal %}
{% endblock %}
{% block GIFtoast %}
{% endblock %}
{% block GIFpicker %}
{% endblock %}
<!-- Import toast notifications -->
{% include "/toasts/toasts.html" %}
{% block modals %}
{% endblock %}
{% block popovers %}
{% endblock %}
{% block fixedMobileBarJS %}
{% endblock %}
{% block scripts %}
{% endblock %}
<!-- Scripts -->
<script src="/assets/CHRISTMAS/js/header.js?v=200"></script>
<!-- Lazy Loading -->
<script src="/assets/CHRISTMAS/js/lozad.js?v=200"></script>
<script>
const observer = lozad();
observer.observe();
</script>
<!-- Bootstrap -->
<script src="/assets/CHRISTMAS/js/bootstrap.js"></script>
<!-- Clipboard JS -->
<script src="/assets/CHRISTMAS/js/clipboard.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>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/lite-youtube.css?v=200">
<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/emoji_modal.js?v=202"></script>
<script defer src="/assets/CHRISTMAS/js/popover.js?v=200"></script>
<script src="/assets/CHRISTMAS/js/mobile_navigation_bar.js?v=204"></script>
{% if v %}
<script>function formkey() {return '{{v.formkey}}';}</script>
<script src="/assets/CHRISTMAS/js/default.js?v=200"></script>
{% endif %}
</body>
</html>

View File

@ -0,0 +1,39 @@
<script src="/assets/CHRISTMAS/js/delete_post_modal.js?v=200"></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">
<div class="modal-content">
<div class="modal-header d-none d-md-flex">
<h5 class="modal-title">Delete post?</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
</button>
</div>
<div class="modal-body text-center">
<div class="py-4">
<i class="fad fa-trash-alt text-muted d-none d-md-block" style="font-size: 3.5rem;"></i>
</div>
<div class="h4 d-md-none">Delete post?</div>
<p class="d-none d-md-block">Your post will be removed everywhere on {{'SITE_NAME' | app_config}}. This action can be undone.</p>
<p class="text-muted d-md-none">Your post will be removed everywhere on {{'SITE_NAME' | app_config}}. This action can be undone.</p>
<div class="d-md-none">
<button type="button" id="deletePostButton-mobile" class="btn btn-danger btn-block btn-lg">Delete post</button>
<button type="button" class="btn btn-secondary btn-block btn-lg" data-bs-dismiss="modal">Cancel</button>
</div>
</div>
<div class="modal-footer d-none d-md-flex">
<button type="button" class="btn btn-link text-muted" data-bs-dismiss="modal">Cancel</button>
<button type="button" id="deletePostButton" class="btn btn-danger">Delete post</button>
</div>
</div>
</div>
</div>

View File

@ -41,7 +41,7 @@
</a>
</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/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_App.apk">
<i class="fab fa-android fa-sm fa-fw mr-4"></i>Android App
</a>
</li>

View File

@ -17,12 +17,12 @@
</div>
<div class="flex space-x-4 mt-1">
<small class="flex items-center block mt-1 text-gray-300">
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/images/emojis/marseycoin.webp" data-bs-original-title="{{'COINS_NAME' | app_config}}" aria-label="{{'COINS_NAME' | app_config}}" class="w-6 h-6 object-contain" alt="coin icon"/>
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/CHRISTMAS/images/emojis/marseycoin.webp" data-bs-original-title="{{'COINS_NAME' | app_config}}" aria-label="{{'COINS_NAME' | app_config}}" class="w-6 h-6 object-contain" alt="coin icon"/>
<span class="pl-2">{{v.coins}}</span>
</small>
{% if v.procoins %}
<small class="flex items-center block mt-1 text-gray-300">
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/images/emojis/marseybux.webp" data-bs-original-title="MarseyBux" aria-label="MarseyBux" class="w-6 h-6 object-contain" alt="coin icon"/>
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/CHRISTMAS/images/emojis/marseybux.webp" data-bs-original-title="MarseyBux" aria-label="MarseyBux" class="w-6 h-6 object-contain" alt="coin icon"/>
<span class="pl-2">{{v.procoins}}</span>
</small>
{% endif %}

View File

@ -0,0 +1,34 @@
{% extends "email/default.html" %}
{% block title %}Remove Two-Factor Authentication{% endblock %}</h1>
{% block preheader %}Remove Two-Factor Authentication.{% endblock %}
{% block content %}
<p>We received a request to remove two-factor authentication from your account. In 72 hours, click the link below.</p>
<p>If you didn't make this request, change your password and use the Log Out Everywhere feature in your <a href="/settings/security">Security Settings</a> to permanently invalidate the link.</p>
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<!-- Border based button
https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
<tr>
<td align="center">
<a href="{{action_url}}" class="f-fallback button" target="_blank">Remove 2FA</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>Please note that {{'SITE_NAME' | app_config}} will never ask you for your email, password, or two-factor token via email, text, or phone.</p>
<table class="body-sub" role="presentation">
<tr>
<td>
<p class="f-fallback sub">If youre having trouble with the button above, copy and paste the URL below into your web browser.</p>
<p class="f-fallback sub">{{action_url}}</p>
</td>
</tr>
</table>
{% endblock %}

View File

@ -0,0 +1,409 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'; connect-src 'self'; object-src 'none';">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="x-apple-disable-message-reformatting" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
<style type="text/css" rel="stylesheet" media="all">
html {
font-size: 14px;
}
body {
width: 100% !important;
height: 100%;
margin: 0;
-webkit-text-size-adjust: none;
}
a {
color: #FF66AC!important;
}
a img {
border: none;
}
td {
word-break: break-word;
}
.preheader {
display: none !important;
visibility: hidden;
mso-hide: all;
font-size: 1px;
line-height: 1px;
max-height: 0;
max-width: 0;
opacity: 0;
overflow: hidden;
}
body,
td,
th {
font-family: Helvetica, Arial, sans-serif;
}
h1 {
margin-top: 0;
color: #121213;
font-size: 22px;
font-weight: bold;
text-align: left;
}
h2 {
margin-top: 0;
color: #121213;
font-size: 1rem;
font-weight: bold;
text-align: left;
}
h3 {
margin-top: 0;
color: #121213;
font-size: 14px;
font-weight: bold;
text-align: left;
}
td,
th {
font-size: 1rem;
}
p,
ul,
ol,
blockquote {
margin: .4em 0 1.1875em;
font-size: 1rem;
line-height: 1.625;
}
p.sub {
font-size: 13px;
}
.align-right {
text-align: right;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.button {
background-color: #FF66AC;
border-top: 10px solid #FF66AC;
border-right: 18px solid #FF66AC;
border-bottom: 10px solid #FF66AC;
border-left: 18px solid #FF66AC;
display: inline-block;
color: #FFF!important;
text-decoration: none;
border-radius: .25rem;
-webkit-text-size-adjust: none;
box-sizing: border-box;
}
.button--green {
background-color: #23CE6B;
border-top: 10px solid #23CE6B;
border-right: 18px solid #23CE6B;
border-bottom: 10px solid #23CE6B;
border-left: 18px solid #23CE6B;
}
.button--red {
background-color: #F05D5E;
border-top: 10px solid #F05D5E;
border-right: 18px solid #F05D5E;
border-bottom: 10px solid #F05D5E;
border-left: 18px solid #F05D5E;
}
@media only screen and (max-width: 500px) {
.button {
width: 100% !important;
text-align: center !important;
}
}
.attributes {
margin: 0 0 21px;
}
.attributes_content {
background-color: #EDF2F7;
padding: 1rem;
border-radius: 0.35rem;
}
.attributes_item {
padding: 0;
}
.related {
width: 100%;
margin: 0;
padding: 25px 0 0 0;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
.related_item {
padding: 10px 0;
color: #CBCCCF;
font-size: 15px;
line-height: 18px;
}
.related_item-title {
display: block;
margin: .5em 0 0;
}
.related_item-thumb {
display: block;
padding-bottom: 10px;
}
.related_heading {
border-top: 1px solid #CBCCCF;
text-align: center;
padding: 25px 0 10px;
}
.discount {
width: 100%;
margin: 0;
padding: 24px;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
background-color: #EDF2F7;
border: 2px dashed #CBCCCF;
}
.discount_heading {
text-align: center;
}
.discount_body {
text-align: center;
font-size: 15px;
}
.social {
width: auto;
}
.social td {
padding: 0;
width: auto;
}
.social_icon {
height: 20px;
margin: 0 8px 10px 8px;
padding: 0;
}
.purchase {
width: 100%;
margin: 0;
padding: 35px 0;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
.purchase_content {
width: 100%;
margin: 0;
padding: 25px 0 0 0;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
.purchase_item {
padding: 10px 0;
color: #121213;
font-size: 15px;
line-height: 18px;
}
.purchase_heading {
padding-bottom: 8px;
border-bottom: 1px solid #E6E6E6;
}
.purchase_heading p {
margin: 0;
color: #85878E;
font-size: 12px;
}
.purchase_footer {
padding-top: 15px;
border-top: 1px solid #E6E6E6;
}
.purchase_total {
margin: 0;
text-align: right;
font-weight: bold;
color: #121213;
}
.purchase_total--label {
padding: 0 15px 0 0;
}
body {
background-color: #EDF2F7;
color: #121213;
}
p {
color: #121213;
}
p.sub {
color: #6B6E76;
}
.email-wrapper {
width: 100%;
margin: 0;
padding: 0;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
background-color: #EDF2F7;
}
.email-content {
width: 100%;
margin: 0;
padding: 0;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
}
.email-masthead {
display: none;
}
.email-masthead_logo {
width: 94px;
}
.email-masthead_name {
font-size: 1.25rem;
font-weight: bold;
color: #121213;
text-decoration: none;
}
.email-body {
width: 100%;
margin: 0;
padding: 0;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
background-color: #cfcfcf;
}
.email-body_inner {
width: 570px;
margin: 0 auto;
padding: 0;
-premailer-width: 570px;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
background-color: #cfcfcf;
}
.email-footer {
width: 570px;
margin: 0 auto;
padding: 0;
-premailer-width: 570px;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
text-align: center;
}
.email-footer p {
color: #6B6E76;
}
.body-action {
width: 100%;
margin: 30px auto;
padding: 0;
-premailer-width: 100%;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
text-align: center;
}
.body-sub {
margin-top: 25px;
padding-top: 25px;
border-top: 1px solid #E6E6E6;
}
.content-cell {
padding: 35px;
}
@media only screen and (max-width: 600px) {
.email-body_inner,
.email-footer {
width: 100% !important;
}
}
@media (prefers-color-scheme: dark) {
body,
.email-body,
.email-body_inner,
.email-content,
.email-wrapper,
.email-masthead,
.email-footer {
background-color: #121213 !important;
color: #FFF !important;
}
p,
ul,
ol,
blockquote,
h1,
h2,
h3 {
color: #FFF !important;
}
.attributes_content,
.discount {
background-color: #222 !important;
}
.email-masthead_name {
text-shadow: none !important;
}
}
</style>
</head>
<body>
<span class="preheader">{% block preheader %}Thanks for joining {{'SITE_NAME' | app_config}}! Please take a sec to verify the email you used to sign up.{% endblock %}</span>
<table class="email-wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table class="email-content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="email-masthead">
<a href="/" class="f-fallback email-masthead_name">
{{'SITE_NAME' | app_config}}
</a>
</td>
</tr>
<tr>
<td class="email-body" width="100%" cellpadding="0" cellspacing="0">
<table class="email-body_inner" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="content-cell">
<div class="f-fallback">
<h1>{% block title %}Title Goes Here{% endblock %}</h1>
{% block content %}
{% for entry in data %}
<h3>{{entry[0]}}</h3>
<p>{{entry[1]}}</p>
{% endfor %}
{% endblock %}
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

View File

@ -0,0 +1,56 @@
{% extends "email/default.html" %}
{% block title %}Verify Your Email{% endblock %}</h1>
{% block preheader %}Verify your new {{'SITE_NAME' | app_config}} email.{% endblock %}
{% block content %}
<p>You told us you wanted to change your {{'SITE_NAME' | app_config}} account email. To finish this process, please verify your new email address:</p>
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<!-- Border based button
https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
<tr>
<td align="center">
<a href="{{action_url}}" class="f-fallback button" target="_blank">Verify email</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>For reference, here's your current information:</p>
<table class="attributes" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="attributes_content">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="attributes_item">
<span class="f-fallback">
<strong>Email:</strong> {{v.email}}
</span>
</td>
</tr>
<tr>
<td class="attributes_item">
<span class="f-fallback">
<strong>Username:</strong> {{v.username}}
</span>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>Please note that {{'SITE_NAME' | app_config}} will never ask you for your email, password, or two-factor token via email, text, or phone.</p>
<table class="body-sub" role="presentation">
<tr>
<td>
<p class="f-fallback sub">If youre having trouble with the button above, copy and paste the URL below into your web browser.</p>
<p class="f-fallback sub">{{action_url}}</p>
</td>
</tr>
</table>
{% endblock %}

View File

@ -0,0 +1,54 @@
{% extends "email/default.html" %}
{% block title %}Welcome to {{'SITE_NAME' | app_config}}!{% endblock %}</h1>
{% block content %}
<p>Thanks for joining {{'SITE_NAME' | app_config}}. Were happy to have you on board. To get the most out of {{'SITE_NAME' | app_config}}, please verify your account email:</p>
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<!-- Border based button
https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
<tr>
<td align="center">
<a href="{{action_url}}" class="f-fallback button" target="_blank">Verify email</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>For reference, here's your username.</p>
<table class="attributes" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="attributes_content">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="attributes_item">
<span class="f-fallback">
<strong>Email:</strong> {{v.email}}
</span>
</td>
</tr>
<tr>
<td class="attributes_item">
<span class="f-fallback">
<strong>Username:</strong> {{v.username}}
</span>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>Please note that {{'SITE_NAME' | app_config}} will never ask you for your email, password, or two-factor token via email, text, or phone.</p>
<table class="body-sub" role="presentation">
<tr>
<td>
<p class="f-fallback sub">If youre having trouble with the button above, copy and paste the URL below into your web browser.</p>
<p class="f-fallback sub">{{action_url}}</p>
</td>
</tr>
</table>
{% endblock %}

View File

@ -0,0 +1,54 @@
{% extends "email/default.html" %}
{% block title %}Reset Your Password{% endblock %}
{% block preheader %}Reset your {{'SITE_NAME' | app_config}} password.{% endblock %}
{% block content %}
<p>To reset your password, click the button below:</p>
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<!-- Border based button
https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->
<table width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
<tr>
<td align="center">
<a href="{{action_url}}" class="f-fallback button" target="_blank">Reset password</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>For reference, here's your login information:</p>
<table class="attributes" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="attributes_content">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="attributes_item">
<span class="f-fallback">
<strong>Email:</strong> {{v.email}}
</span>
</td>
</tr>
<tr>
<td class="attributes_item">
<span class="f-fallback">
<strong>Username:</strong> {{v.username}}
</span>
</td>
</tr>
</table>
</td>
</tr>
</table>
<table class="body-sub" role="presentation">
<tr>
<td>
<p class="f-fallback sub">If youre having trouble with the button above, copy and paste the URL below into your web browser.</p>
<p class="f-fallback sub">{{action_url}}</p>
</td>
</tr>
</table>
{% endblock %}

View File

@ -0,0 +1,105 @@
<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">
<div class="modal-content mx-auto max-w-3xl bg-gray-100 rounded-md shadow-lg" id="emojiTabs">
<div class="modal-header">
<div>
<ul class="nav nav-pills py-2">
<li class="nav-item">
<a class="nav-link active emojitab" data-bs-toggle="tab" href="#emoji-tab-favorite">Favorite</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-marsey">Marsey</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-platy">Platy</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-tay">Tay</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-classic">Classic</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-rage">Rage</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-wojak">Wojak</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-flags">Flags</a>
</li>
<li class="nav-item">
<a class="nav-link emojitab" data-bs-toggle="tab" href="#emoji-tab-misc">Misc</a>
</li>
</ul>
</div>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<i class="fal fa-times text-muted"></i>
</button>
</div>
<div class="px-3">
<input class="form-input" type="text" id="emoji_search" placeholder="Search emoji..">
</div>
<div style="overflow-y: scroll;">
<div class="modal-body p-0" id="emoji-modal-body">
<div id="emoji-tab-search"></div>
<div id="no-emojis-found"></div>
<div class="tab-content">
<div class="tab-pane fade show active" id="emoji-tab-favorite">
<div class="flex flex-wrap p-3" id="EMOJIS_favorite">
{% if session.get("favorite_emojis") %}
{{session.get("favorite_emojis") | favorite_emojis | safe}}
{% endif %}
</div>
</div>
<div class="tab-pane fade" id="emoji-tab-marsey">
<div class="flex flex-wrap p-3" id="EMOJIS_marsey"></div>
</div>
<div class="tab-pane fade" id="emoji-tab-platy">
<div class="flex flex-wrap p-3" id="EMOJIS_platy"></div>
</div>
<div class="tab-pane fade" id="emoji-tab-tay">
<div class="flex flex-wrap p-3" id="EMOJIS_tay"></div>
</div>
<div class="tab-pane fade" id="emoji-tab-classic">
<div class="flex flex-wrap p-3" id="EMOJIS_classic"></div>
</div>
<div class="tab-pane fade" id="emoji-tab-rage">
<div class="flex flex-wrap p-3" id="EMOJIS_rage"></div>
</div>
<div class="tab-pane fade" id="emoji-tab-wojak">
<div class="flex flex-wrap p-3" id="EMOJIS_wojak"></div>
</div>
<div class="tab-pane fade" id="emoji-tab-flags">
<div class="flex flex-wrap p-3" id="EMOJIS_flags"></div>
</div>
<div class="tab-pane fade" id="emoji-tab-misc">
<div class="flex flex-wrap p-3" id="EMOJIS_misc"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<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

@ -0,0 +1,26 @@
{% extends "default.html" %}
{% block content %}
<pre>
</pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight: bold">#</th>
<th style="font-weight: bold">Name</th>
<th style="font-weight: bold">Emoji</th>
</tr>
</thead>
<tbody id="followers-table">
{% for emoji in emojis %}
<tr>
<td style="font-weight: bold">{{loop.index}}</td>
<td style="font-weight: bold">{{emoji}}</td>
<td><img loading="lazy" data-bs-toggle="tooltip" alt=":{{emoji}}:" title=":{{emoji}}:" delay="0" src="/assets/CHRISTMAS/images/emojis/{{emoji}}.webp" ></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -0,0 +1,19 @@
{% extends "default.html" %}
{% block title %}
<title>400 Bad Request</title>
{% endblock %}
{% block pagetype %}error-400{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseybrainlet.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">400 Bad Request</h1>
<p class="text-gray-500">
That request was bad and you should feel bad.
</p>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,21 @@
{% extends "default.html" %}
{% block title %}
<title>401 Not Authorized</title>
{% endblock %}
{% block pagetype %}error-401{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseydead.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">401 Not Authorized</h1>
<p class="text-gray-500 mb-3">
What you're trying to do requires an account. I think. The original error message said something about a castle and I hated that.
</p>
<a href="/signup" class="btn btn-gray">Create an account</a>
<a href="/login" class="btn btn-gray">Login</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,20 @@
{% extends "default.html" %}
{% block title %}
<title>403 Forbidden</title>
{% endblock %}
{% block pagetype %}error-403{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseytroll.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">403 Forbidden</h1>
<p class="text-gray-500 mb-3">
YOU AREN'T WELCOME HERE GO AWAY
</p>
<a href="/" class="btn btn-gray">Go to frontpage</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,19 @@
{% extends "default.html" %}
{% block title %}
<title>404 Page Not Found</title>
{% endblock %}
{% block pagetype %}error-404{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseyconfused.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">404 Page Not Found</h1>
<p class="text-gray-500">
Someone typed something wrong and it was probably you, please do better.
</p>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,23 @@
{% extends "default.html" %}
{% block title %}
<title>405 Method Not Allowed</title>
{% endblock %}
{% block pagetype %}error-405{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseyretard.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">405 Method Not Allowed</h1>
<p class="text-gray-500">
idk how anyone gets this error but if you see this, remember to follow @carpathianflorist
</p>
<p class="text-gray-500 mb-3">
the original error text here talked about internet gremlins and wtf
</p>
<a href="/" class="btn btn-gray">Go to frontpage</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,20 @@
{% extends "default.html" %}
{% block title %}
<title>429 Too Many Requests</title>
{% endblock %}
{% block pagetype %}error-429{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseyrentfree.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">429 Too Many Requests</h1>
<p class="text-gray-500 mb-3">
go spam somewhere else nerd
</p>
<a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ" class="btn btn-gray">Go to frontpage</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,20 @@
{% extends "default.html" %}
{% block title %}
<title>500 Internal Server Error</title>
{% endblock %}
{% block pagetype %}error-500{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseydead.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">500 Interal Server Error</h1>
<p class="text-gray-500 mb-3">
Hiiiii it's carp! I think this error means that there's a timeout error. And I think that means something took too long to load so it decided not to work at all. If you keep seeing this on the same page <em>but not other pages</em>, then something is probably wrong with that specific function. It may not be called a function, but that sounds right to me. Anyway, ping me and I'll whine to someone smarter to fix it. Don't bother them. Thanks ily <3
</p>
<a href="/" class="btn btn-gray">Go to frontpage</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,27 @@
{% extends "default.html" %}
{% block title %}
<title>+18</title>
{% endblock %}
{% block pagetype %}error-451{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseytwerking.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">Are you over 18?</h1>
<p class="text-gray-500 mb-3">
This post is rated +18 (Adult-Only). You must be 18 or older to continue. Are you sure you want to proceed?
</p>
<div class="flex flex-wrap justify-center space-x-2">
<form action="/allow_nsfw" method="post">
<input type="hidden" name="redir" value="{{request.path}}">
<input type="submit" class="btn btn-red" value="Yes, I am +18">
</form>
<a href="/" class="btn btn-gray">No</a>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,20 @@
{% extends "default.html" %}
{% block title %}
<title>401 Not Authorized</title>
{% endblock %}
{% block pagetype %}error-401{% endblock %}
{% block content %}
<div class="col-span-full h-screen flex items-center justify-center">
<div class="md:max-w-xl text-center">
<img loading="lazy" src="/assets/CHRISTMAS/images/emojis/marseymerchant.webp?v=200" class="w-14 h-14 object-contain mb-4">
<h1 class="h5">401 Not Authorized</h1>
<p class="text-gray-500 mb-3">
This page is only available to {% if "rama" in request.host %}paypigs{% else %}patrons{% endif %}:
</p>
<a rel="nofollow noopener noreferrer" href="{{'GUMROAD_LINK' | app_config}}" class='btn btn-gray'>{{'GUMROAD_LINK' | app_config}}</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,28 @@
<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">
<div class="modal-body text-center p-0">
<div class="d-inline-block position-relative">
<a href="" rel="nofollow noopener noreferrer" target="_blank" id="desktop-expanded-image-wrap-link">
<img loading="lazy" src="" class="img-fluid rounded" id="desktop-expanded-image" style="min-width: 250px;">
</a>
<div class="position-absolute d-flex justify-content-between align-items-center w-100 mt-1">
<a href="" rel="nofollow noopener noreferrer" target="_blank" class="text-gray-500 font-weight-bold text-left" id="desktop-expanded-image-link">View original</a>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.expandedimage {
width: fit-content;
width: -moz-fit-content;
}
.m-5 {
margin: 2.5rem !important;
}
</style>

View File

@ -0,0 +1,37 @@
{% extends "default.html" %}
{% block content %}
<div class="col-span-full">
<pre>
</pre>
<h5>@{{u.username}}'s followers</h5>
<pre></pre>
<table class="w-full table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight: bold">#</th>
<th style="font-weight: bold">Name</th>
{% if v.id == u.id %}
<th style="font-weight: bold"></th>
{% endif %}
</tr>
</thead>
<tbody id="followers-table">
{% for user in users %}
<tr>
<td style="font-weight: bold">{{loop.index}}</td>
<td><a style="color:#{{user.namecolor}}; font-weight:bold;" href="/@{{user.username}}"><img loading="lazy" src="/uid/{{user.id}}/pic" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span></a></td>
{% if v.id == u.id %}
<td><div class="btn btn-red" onclick="removeFollower(event, '{{user.username}}')">Remove follow</div></td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
{% block scripts %}
<script src="/assets/CHRISTMAS/js/followers.js?v=200"></script>
{% endblock %}

View File

@ -0,0 +1,33 @@
{% extends "default.html" %}
{% block content %}
<div class="col-span-full my-4">
<h5>Users followed by @{{u.username}}</h5>
<pre></pre>
<table class="w-full table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight: bold">#</th>
<th style="font-weight: bold">Name</th>
{% if v.id == u.id %}
<th style="font-weight: bold"></th>
{% endif %}
</tr>
</thead>
<tbody id="followers-table">
{% for user in users %}
<tr>
<td style="font-weight: bold">{{loop.index}}</td>
<td><a style="color:#{{user.namecolor}}; font-weight:bold;" href="/@{{user.username}}"><img loading="lazy" src="/uid/{{user.id}}/pic" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span></a></td>
{% if v.id == u.id %}
<td><div class="btn btn-danger" onclick="removeFollowing(event, '{{user.username}}')">Unfollow</div></td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
{% block scripts %}
<script src="/assets/CHRISTMAS/js/following.js?v=200"></script>
{% endblock %}

View File

@ -0,0 +1,31 @@
{% extends "authforms.html" %}
{% block pagetitle %}{{'SITE_NAME' | app_config}} Password Reset{% endblock %}
{% block authtitle %}Reset your password.{% endblock %}
{% block authtext %}If there's an email address associated with your account, you can use it to recover your {{'SITE_NAME' | app_config}} account and change your password.{% endblock %}
{% block content %}
<div id="login-form" class="">
<form action="/forgot" method="post" class="mt-3">
<label for="username" class="mt-3">Username</label>
<input class="form-control" id="username" aria-describedby="usernameHelp"
type="text" name="username" required="">
<label for="email" class="mt-3">Email</label>
<input class="form-control" id="password" aria-describedby="passwordHelp"
type="email" name="email" required="">
<input class="btn btn-primary login w-100 mt-3" type="submit" value="Send recovery link">
</form>
</div>
{% endblock %}

View File

@ -0,0 +1,524 @@
{% extends "settings2.html" %}
{% block title %}
<title>{{'SITE_NAME' | app_config}} - Formatting</title>
<meta name="description" content="{{'SITE_NAME' | app_config}} Formatting">
{% endblock %}
{% block content %}
<pre>
</pre>
<h1>Markdown Formatting</h1>
You can use Markdown formatting:
<pre>
</pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
<th>What you type</th>
<th>What gets displayed</th>
</tr>
</thead>
<tbody>
<tr>
<td>Italics</td>
<td>*text*</td>
<td><i>text</i></td>
</tr>
<tr>
<td>Bold</td>
<td>**text**</td>
<td><b>text</b></td>
</tr>
<tr>
<td>Code</td>
<td>`text`</td>
<td><code>text</code></td>
</tr>
<tr>
<td>Strikethrough</td>
<td>~~text~~</td>
<td><del>text</del></td>
</tr>
<tr>
<td>Links</td>
<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>MP4 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>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>
<td>Emojis</td>
<td>:marseylove:</td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="emj" alt=":marseylove:" data-bs-original-title=":marseylove:" delay="0" height="30" src="/assets/CHRISTMAS/images/emojis/marseylove.webp?v=200"></td>
</tr>
<tr>
<td>Mirrored Emojis</td>
<td>:!marseylove:</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/CHRISTMAS/images/emojis/marseylove.webp?v=200"></td>
</tr>
<tr>
<td>Large Emojis</td>
<td>:#marseylove:</td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="emj" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" src="/assets/CHRISTMAS/images/emojis/marseylove.webp?v=200"></td>
</tr>
<tr>
<td>Large Mirroed Emojis</td>
<td>:#!marseylove:</td>
<td><img loading="lazy" data-bs-toggle="tooltip" class="emj mirrored" alt=":!marseylove:" data-bs-original-title=":!marseylove:" delay="0" src="/assets/CHRISTMAS/images/emojis/marseylove.webp?v=200"></td>
</tr>
<tr>
<td>Poll Options</td>
<td>$$bussy$$</td>
<td>
<div class="custom-control">
<input type="checkbox" class="custom-control-input" id="422741" name="option">
<label class="custom-control-label" for="422741">bussy - <a href="/votes?link=t3_422741"><span id="poll-422741">0</span> votes</a></label>
</div>
</td>
</tr>
<tr>
<td>Blockquote</td>
<td>&gt; text</td>
<td><blockquote>text</blockquote></td>
</tr>
<tr>
<td>Headers 1-6</td>
<td># Header 1<br>## Header 2<br>### Header 3<br>#### Header 4<br>##### Header 5<br>###### Header 6</td>
<td><h1>Header 1</h1><h2>Header 2</h2><h3>Header 3</h3><h4>Header 4</h4><h5>Header 5</h5><h6>Header 6</h6></td>
</tr>
<tr>
<td>Ordered list</td>
<td>1. First thing<br>2. Second thing</td>
<td><ol><li>First thing</li><li>Second thing</li></ol></td>
</tr>
<tr>
<td>Unordered list</td>
<td>* First thing<br>* Second thing</td>
<td><ul><li>First thing</li><li>Second thing</li></ul></td>
</tr>
<tr>
<td>Code Block</td>
<td>```<br>Use three backticks above and below.<br>Or, indent the lines with four spaces.<br>```</td>
<td>
<pre>
Use three backticks above and below.
Or, indent the lines with four spaces.
</pre>
</td>
</tr>
<tr>
<td>Spoilers</td>
<td>||bussy > gussy||</td>
<td><p class="spoiler">bussy > gussy</p></td>
</tr>
<tr>
<td>Username Mention</td>
<td>@QuadNarca</td>
<td><a class="d-inline-block" href="/@QuadNarca"><img loading="lazy" src="/uid/29/pic" class="pp20">@QuadNarca</a></td>
</tr>
<tr>
<td>Subreddit Mention</td>
<td>r/{{'SITE_NAME' | app_config}}</td>
<td><a class="d-inline-block" rel="nofollow noopener noreferrer" href="https://www.reddit.com/r/{{'SITE_NAME' | app_config}}/">r/{{'SITE_NAME' | app_config}}</a></td>
</tr>
<tr>
<td>Redditor Mention</td>
<td>u/Bardfinn</td>
<td><a class="d-inline-block" rel="nofollow noopener noreferrer" href="https://www.reddit.com/u/Bardfinn/">u/Bardfinn</a></td>
</tr>
</tbody>
</table>
<h1>HTML Formatting</h1>
And we allow custom HTML in most places:
<pre>
</pre>
<h4>Allowed Tags</h4>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</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>
<td>
This will be <b>bold</b>
</td>
</tr>
<tr>
<td>Blockquote</td>
<td>
&lt;blockquote&gt;This is a blockquote&lt;/blockquote&gt;
</td>
<td>
<blockquote>
This is a blockquote
</blockquote>
</td>
</tr>
<tr>
<td>Line Break</td>
<td>
<pre style="color:var(--white)">
Line 1
&lt;br&gt;
Line 2
</pre>
</td>
<td>
Line 1
<br>
Line 2
</td>
</tr>
<tr>
<td>Code</td>
<td>
&lt;code&gt;This is code&lt;/code&gt;
</td>
<td>
<code>This is code</code>
</td>
</tr>
<tr>
<td>Strikethrough</td>
<td>
The last word will have a &lt;del&gt;strikethrough&lt;/del&gt;
</td>
<td>
The last word will have a <del>strikethrough</del>
</td>
</tr>
<tr>
<td>Emphasis</td>
<td>
We &lt;em&gt;cannot&lt;/em&gt; live like this.
</td>
<td>
We <em>cannot</em> live like this.
</td>
</tr>
<tr>
<td>Headings</td>
<td>
<pre>
&lt;h1&gt;This is heading 1&lt;/h1&gt;
&lt;h2&gt;This is heading 2&lt;/h2&gt;
&lt;h3&gt;This is heading 3&lt;/h3&gt;
&lt;h4&gt;This is heading 4&lt;/h4&gt;
&lt;h5&gt;This is heading 5&lt;/h5&gt;
&lt;h6&gt;This is heading 6&lt;/h6&gt;
</pre>
</td>
<td>
<h1>This is heading 1</h1>
<h2>This is heading 2</h2>
<h3>This is heading 3</h3>
<h4>This is heading 4</h4>
<h5>This is heading 5</h5>
<h6>This is heading 6</h6>
</td>
</tr>
<tr>
<td>Horizontal Rule</td>
<td>
<pre>
Text 1
&lt;hr&gt;
Text 2
</pre>
</td>
<td>
Text 1
<hr>
Text 2
</td>
</tr>
<tr>
<td>Italics</td>
<td>
&lt;i&gt;This&lt;/i&gt; is how you get italics.
</td>
<td>
<i>This</i> is how you get italics.
</td>
</tr>
<tr>
<td>Lists</td>
<td>
<pre>
&lt;ul&gt;
&lt;li&gt;Bullet 1&lt;/li&gt;
&lt;li&gt;Bullet 2&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Number 1&lt;/li&gt;
&lt;li&gt;Number 2&lt;/li&gt;
&lt;/ol&gt;
</pre>
</td>
<td>
<ul>
<li>Bullet 1</li>
<li>Bullet 2</li>
</ul>
<ol>
<li>Number 1</li>
<li>Number 2</li>
</ol>
</td>
</tr>
<tr>
<td>Paragraphs</td>
<td>
<pre>
&lt;p&gt;Paragraph 1&lt;/p&gt;
&lt;p&gt;Paragraph 2&lt;/p&gt;
</pre>
</td>
<td>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</td>
</tr>
<tr>
<td>Preformatted Text</td>
<td><pre>
&lt;pre&gt;
Text in a pre element
is displayed in a fixed-width
font, and it preserves
both spaces and
line breaks
&lt;/pre&gt;
</pre></td>
<td>
<pre>
Text in a pre element
is displayed in a fixed-width
font, and it preserves
both spaces and
line breaks
</pre>
</td>
</tr>
<tr>
<td>Strong</td>
<td>
&lt;strong&gt;This text is important!&lt;/strong&gt;
</td>
<td>
<strong>This text is important!</strong>
</td>
</tr>
<tr>
<td>Subscript</td>
<td>
This text contains &lt;sub&gt;subscript&lt;/sub&gt; text.
</td>
<td>
This text contains <sub>subscript</sub> text.
</td>
</tr>
<tr>
<td>Superscript</td>
<td>
E = mc&lt;sup&gt;2&lt;/sup&gt;
</td>
<td>
E = mc<sup>2</sup>
</td>
</tr>
<tr>
<td>Tables</td>
<td><pre>
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td&gt;Col 1&lt;/td&gt;
&lt;td&gt;Col 2&lt;/td&gt;
&lt;td&gt;Col 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</pre>
</td>
<td>
<table>
<thead>
<tr>
<td>Col 1</td>
<td>Col 2</td>
<td>Col 3</td>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td>Marquee</td>
<td>
&lt;marquee direction="up" behavior="scroll" scrollamount="10" height="100"&gt;
This is a sample scrolling text that has scrolls in the upper direction.
&lt;/marquee&gt;
</td>
<td>
<marquee direction="up" behavior="scroll" scrollamount="10" height="100">
This is a sample scrolling text that has scrolls in the upper direction.
</marquee>
</td>
</tr>
<tr>
<td>Links</td>
<td>
This is a &lt;a href='https://www.w3schools.com/tags/tag_a.asp'&gt;link&lt;/a&gt;
</td>
<td>
This is a <a href='https://www.w3schools.com/tags/tag_a.asp'>link</a>
</td>
</tr>
<tr>
<td>Images</td>
<td>
&lt;img src="https://i.imgur.com/SwVuagI_d.webp" width="200"&gt;
</td>
<td>
<img src="https://i.imgur.com/SwVuagI_d.webp" width="200">
</td>
</tr>
</tbody>
</table>
<h4>Allowed Attributes</h4>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>href</td>
</tr>
<tr>
<td>style</td>
</tr>
<tr>
<td>src</td>
</tr>
<tr>
<td>class</td>
</tr>
<tr>
<td>title</td>
</tr>
<tr>
<td>direction</td>
</tr>
<tr>
<td>behavior</td>
</tr>
<tr>
<td>scrollamount</td>
</tr>
</tbody>
</table>
<h5>Allowed Styles</h5>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>color</td>
</tr>
<tr>
<td>background-color</td>
</tr>
<tr>
<td>font-weight</td>
</tr>
<tr>
<td>transform</td>
</tr>
<tr>
<td>-webkit-transform</td>
</tr>
</tbody>
</table>
{% include "expanded_image_modal.html" %}
{% endblock %}

View File

@ -0,0 +1,23 @@
<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 mx-auto max-w-3xl bg-gray-100 rounded-md shadow-lg">
<div class="flex justify-between border-b border-gray-300 p-3">
<div class="form-group flex items-center w-full mb-0">
<div id="gifs-back-btn"></div>
<input type="text" class="form-input w-full" id="gifSearch" placeholder="Search and press enter" onchange="getGif(this.value);">
<div id="gifs-cancel-btn"></div>
</div>
</div>
<div class="overflow-y-scroll">
<div class="modal-body p-0" id="gif-modal-body">
<div id="no-gifs-found">
</div>
<div class="card-columns gif-categories pt-3 px-3 pb-0" id="GIFs">
</div>
<div id="gifs-load-more">
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -33,8 +33,8 @@
<div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start">
<div class="flex-shrink-0 flex items-center">
<a href="{{ '/' if v else '/logged_out'}}">
<img class="block lg:hidden w-32 object-contain" src="/assets/images/logos/winter/logo-{{ random }}.png" alt="logo">
<img class="hidden lg:block w-32 object-contain" src="/assets/images/logos/winter/logo-{{ random }}.png" alt="logo">
<img class="block lg:hidden w-32 object-contain" src="/assets/CHRISTMAS/images/logos/winter/logo-{{ random }}.png" alt="logo">
<img class="hidden lg:block w-32 object-contain" src="/assets/CHRISTMAS/images/logos/winter/logo-{{ random }}.png" alt="logo">
</a>
</div>
<div class="relative hidden sm:flex flex-shrink-0 items-center sm:ml-6">
@ -125,8 +125,8 @@
<div class="offcanvas offcanvas-end bg-gray-200" tabindex="-1" id="offcanvasNavbar" aria-labelledby="offcanvasNavbarLabel">
<div class="relative flex w-full bg-gray-700 h-16 px-4 items-center snowcaps">
<a class="block" href="{{ '/' if v else '/logged_out'}}">
<img class="block lg:hidden w-32 object-contain" src="/assets/images/logos/winter/logo-{{ random }}.png" alt="logo">
<img class="hidden lg:block w-32 object-contain" src="/assets/images/logos/winter/logo-{{ random }}.png" alt="logo">
<img class="block lg:hidden w-32 object-contain" src="/assets/CHRISTMAS/images/logos/winter/logo-{{ random }}.png" alt="logo">
<img class="hidden lg:block w-32 object-contain" src="/assets/CHRISTMAS/images/logos/winter/logo-{{ random }}.png" alt="logo">
</a>
<button type="button" class="ml-auto close" data-bs-dismiss="offcanvas" aria-label="Close">
<span aria-hidden="true"><i class="far fa-times"></i></span>
@ -155,12 +155,12 @@
</div>
<div class="flex space-x-3 mt-1">
<small class="flex items-center block mt-1 text-gray-500">
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/images/emojis/marseycoin.webp" data-bs-original-title="{{'COINS_NAME' | app_config}}" aria-label="{{'COINS_NAME' | app_config}}" class="w-6 h-6 object-contain" alt="coin icon"/>
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/CHRISTMAS/images/emojis/marseycoin.webp" data-bs-original-title="{{'COINS_NAME' | app_config}}" aria-label="{{'COINS_NAME' | app_config}}" class="w-6 h-6 object-contain" alt="coin icon"/>
<span class="pl-1">{{v.coins}} {{'COINS_NAME' | app_config}}</span>
</small>
{% if v.procoins %}
<small class="flex items-center block mt-1 text-gray-500">
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/images/emojis/marseybux.webp" data-bs-original-title="{{'COINS_NAME' | app_config}}" aria-label="{{'COINS_NAME' | app_config}}" class="w-6 h-6 object-contain" alt="coin icon"/>
<img data-bs-toggle="tooltip" data-bs-placement="bottom" src="/assets/CHRISTMAS/images/emojis/marseybux.webp" data-bs-original-title="{{'COINS_NAME' | app_config}}" aria-label="{{'COINS_NAME' | app_config}}" class="w-6 h-6 object-contain" alt="coin icon"/>
<span class="pl-1">{{v.procoins}} MarseyBux</span>
</small>
{% endif %}

View File

@ -0,0 +1,229 @@
<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;">
<a style="color: white" href="https://reddit.com/r/SubredditDrama">/r/SubredditDrama official site</a>
</div>
{% endif %}
<div class="navbar navbar-expand-md navbar-light" id="navbar">
<div class="container-fluid" style="padding:0;">
<div class="flex-grow-1">
<a href="/" class="navbar-brand mr-auto">
<img loading="lazy" height="30" src="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/headericon.webp?v=200">
{% if "gigachadlife" in request.host %}
<span style="font-weight: bold; font-size: 1.2rem;">GigaChadLife</span>
{% elif 'pcm' not in request.host %}
<img loading="lazy" src="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/logo.webp?v=200" height="20">
{% endif %}
</a>
</div>
<div class="flex-grow-1 d-fl d-none d-md-block">
<form class="form-inline search flex-nowrap mx-0 mx-lg-auto" action="/search/posts/" method="get">
<input class="form-control w-100" type="search" placeholder="Search" aria-label="Search" name="q" value="{{request.args.get('q', '')}}">
<span class="input-group-append">
<span class="input-group-text border-0 bg-transparent" style="margin-left: -2.5rem;">
<i class="fa fa-search" aria-hidden="true"></i>
</span>
</span>
</form>
</div>
<a class="mobile-nav-icon d-md-none" href="/random"><i class="fas fa-random align-middle text-gray-500 black"></i></a>
{% if v and v.admin_level > 0 %}
<a class="mobile-nav-icon d-md-none" href="/admin"><i class="fas fa-crown align-middle text-gray-500 black"></i></a>
{% endif %}
{% if v %}
<a class="mobile-nav-icon d-md-none" href="/submit"><i class="fas fa-feather-alt align-middle text-gray-500 black"></i></a>
{% else %}
<a class="mobile-nav-icon d-md-none" href="/login"><i class="fas fa-feather-alt align-middle text-gray-500 black"></i></a>
{% endif %}
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive"
aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon {% if v and v.notifications_count %}position-relative{% endif %}"><i class="fal fa-bars text-gray-500 black"></i>
{% if v and v.notifications_count %}
<span class="notif-count">{{v.notifications_count}}</span>
{% endif %}
</span>
</button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto d-none d-md-flex">
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
<a class="nav-link" href="/random/" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Random post"><i class="fas fa-random"></i></a>
</li>
{% if v and v.admin_level > 1 %}
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
<a class="nav-link" href="/admin/" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Admin tools"><i class="fas fa-crown{% if v.has_report_queue %} text-success{% endif %}"></i></a>
</li>
{% endif %}
{% if v %}
{% if v.notifications_count %}
<li class="nav-item d-flex align-items-center text-center justify-content-center mx-1">
<a class="nav-link position-relative" href="/notifications{% if v.notifications_count and v.notifications_count == v.post_notifications_count %}?posts=true{% endif %}" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Notifications"><i class="fas fa-bell text-danger"></i><span class="notif-count ml-1" style="padding-left: 4.5px;">{{v.notifications_count}}</span></a>
</li>
{% else %}
<li class="nav-item d-flex align-items-center text-center justify-content-center mx-1">
<a class="nav-link" href="/notifications" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Notifications"><i class="fas fa-bell"></i></a>
</li>
{% endif %}
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
<a class="nav-link" href="/submit" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Create post"><i class="fas fa-feather-alt"></i></a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
<a class="nav-link" href="/comments" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Comments"><i class="fas fa-comment-dots"></i></a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
<a class="nav-link" href="/leaderboard" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Users"><i class="fas fa-trophy"></i></a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center text-center mx-1">
<a class="nav-link" href="/shop" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-original-title="Shop"><i class="fas fa-store"></i></a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center text-center">
<div class="dropdown">
<a class="nav-link bg-transparent py-0 pr-0" href="javascript:void(0)" role="button" id="dropdownMenuLink" data-bs-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<div class="d-flex">
<div><img loading="lazy" src="{{v.profile_url}}" class="profile-pic-35"></div>
<div class="text-left pl-2">
<div style="color: #{{v.namecolor}}" class="text-small font-weight-bold {% if v.patron %}patron{% endif %}"><span {% if v.patron %}class="patron" style="background-color:#{{v.namecolor}};"{% endif %}>{{v.username}}</span></div>
<div class="text-small-extra text-primary"><img class="mr-1 ml-1" data-bs-toggle="tooltip" data-bs-placement="bottom" height="13" src="/assets/CHRISTMAS/images/emojis/marseycoin.webp" data-bs-original-title="{{'COINS_NAME' | app_config}}" aria-label="{{'COINS_NAME' | app_config}}"><span id="user-coins-amount">{{v.coins}}</span> {{'COINS_NAME' | app_config}}</div>
{% if v.procoins %}<div class="text-small-extra text-primary"><img class="mr-1 ml-1" data-bs-toggle="tooltip" data-bs-placement="bottom" height="13" src="/assets/CHRISTMAS/images/emojis/marseybux.webp" data-bs-original-title="Marseybux" aria-label="Marseybux"><span>{{v.procoins}}</span> Marseybux</div>{% endif %}
</div>
</div>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-lg-left border-0 shadow fade px-0 mt-2">
<div class="px-2">
<a class="dropdown-item" href="{{v.url}}"><i class="fas fa-user-circle fa-fw text-left mr-3"></i>My
profile</a>
<a class="dropdown-item" href="/settings"><i class="fas fa-cog fa-fw text-left mr-3"></i>Settings</a>
</div>
<div class="px-2">
<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/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="/rules"><i class="fas fa-balance-scale fa-fw text-left mr-3"></i>Rules</a>
<a class="dropdown-item" href="/changelog"><i class="fas fa-clipboard fa-fw text-left mr-3"></i>Changelog</a>
<a class="dropdown-item" rel="nofollow noopener noreferrer" href="https://github.com/Aevann1/Drama"><i class="fab fa-github fa-fw text-left mr-3"></i>Source code</a>
{% if request.host in ['rdrama.net', 'pcmemes.net'] %}
<a class="dropdown-item" rel="nofollow noopener noreferrer" href="/report_bugs"><i class="fas fa-bug fa-fw text-left mr-3"></i>Report bugs or suggestions</a>
{% endif %}
{% if 'pcm' not in request.host %}
<a class="dropdown-item" href="/discord"><i class="fab fa-discord fa-fw text-left mr-3"></i>Discord</a>
{% endif %}
<a class="dropdown-item" rel="nofollow noopener noreferrer" href="{{'GUMROAD_LINK' | app_config}}"><i class="fas fa-dollar-sign fa-fw text-left mr-3"></i>Donate</a>
{% if 'rama' in request.host %}<a class="dropdown-item" href="/archives"><i class="fas fa-book fa-fw text-left mr-3"></i>Archives</a>{% endif %}
<a class="dropdown-item" href="/contact"><i class="fas fa-file-signature fa-fw text-left mr-3"></i>Contact us</a>
</div>
<div class="px-2">
<a class="dropdown-item" href="javascript:void(0)", onclick="post_toast('/logout', '1')"><i class="fas fa-sign-out fa-fw text-left mr-3"></i>Log out</a>
</div>
</div>
</div>
</li>
{% else %}
<li class="nav-item d-flex align-items-center justify-content-center mx-1">
<a class="btn btn-outline-purple" href="/contact">Contact us</a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center mx-1">
<a class="btn btn-outline-purple" href="/login?redirect={{request.path | urlencode}}">Sign in</a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center mx-1">
<a class="btn btn-outline-purple" href="/signup?redirect={{request.path | urlencode}}">Sign up</a>
</li>
{% endif %}
</ul>
<ul class="navbar-nav ml-auto d-flex d-md-none mt-3">
<li class="nav-item pb-3">
<form id="searchform" class="form-inline search flex-nowrap mx-0 mx-lg-auto" action="/search/posts/" method="get">
<input class="form-control form-control-sm w-100" type="search" placeholder="Search" aria-label="Search" name="q">
<span class="input-group-append">
<span class="input-group-text border-0 bg-transparent" style="margin-left: -2.5rem;" onclick="document.getElementById('searchform').submit()">
<i class="fa fa-search" aria-hidden="true"></i>
</span>
</span>
</form>
</li>
{% if v %}
<li class="nav-item">
<a class="nav-link" href="{{v.url}}"><i class="fas fa-user-circle fa-fw mr-3"></i>@{{v.username}}</a>
</li>
<li class="nav-item">
<a class="nav-link {% if v.notifications_count %}position-relative{% endif %}" href="/notifications{% if v.notifications_count and v.notifications_count == v.post_notifications_count %}?posts=true{% endif %}">
<i class="fas fa-envelope fa-fw mr-3"></i>Inbox
{% if v.notifications_count %}
<i class="fas fa-circle text-danger position-absolute" style="left: 19px; top: 5px; font-size: 10px;"></i>
{% endif %}
</a>
</li>
<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/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="/rules"><i class="fas fa-balance-scale fa-fw mr-3"></i>Rules</a>
<a class="nav-item nav-link" rel="nofollow noopener noreferrer" href="https://github.com/Aevann1/Drama"><i class="fab fa-github fa-fw mr-3"></i>Source code</a>
{% if request.host in ['rdrama.net', 'pcmemes.net'] %}
<a class="nav-item nav-link" rel="nofollow noopener noreferrer" href="/report_bugs"><i class="fas fa-bug fa-fw mr-3"></i>Report bugs or suggestions</a>
{% endif %}
{% if 'pcm' not in request.host %}
<a class="nav-item nav-link" href="/discord"><i class="fab fa-discord fa-fw mr-3"></i>Discord</a>
{% endif %}
<a class="nav-item nav-link" rel="nofollow noopener noreferrer" href="{{'GUMROAD_LINK' | app_config}}"><i class="fas fa-dollar-sign fa-fw mr-3"></i>Donate</a>
{% if 'rama' in request.host %}<a class="nav-item nav-link" href="/archives"><i class="fas fa-book fa-fw mr-3"></i>Archives</a>{% endif %}
<a class="nav-item nav-link" href="/contact"><i class="fas fa-file-signature fa-fw mr-3"></i>Contact us</a>
<li class="nav-item border-top border-bottom mt-2 pt-2">
<a class="nav-link" href="javascript:void(0)", onclick="post_toast('/logout', '1')"><i class="fas fa-sign-out fa-fw mr-3 text-danger"></i>Log out</a>
</li>
{% else %}
<li class="nav-item d-flex align-items-center justify-content-center pb-3">
<a class="btn btn-outline-purple btn-block" href="/contact">Contact us</a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center pb-3">
<a class="btn btn-outline-purple btn-block" href="/login?redirect={{request.path | urlencode}}">Sign in</a>
</li>
<li class="nav-item d-flex align-items-center justify-content-center">
<a class="btn btn-outline-purple btn-block" href="/signup?redirect={{request.path | urlencode}}">Sign up</a>
</li>
{% endif %}
</ul>
</div>
</div>
</div>
</nav>
<script src="/assets/CHRISTMAS/js/header.js?v=200"></script>
<style>
.notif-count {
background: red;
border-radius: 20%;
color: white;
padding: 2px 5px;
font-weight: 700;
}
</style>
{% if v %}
<div id="formkey" class="d-none">{{v.formkey}}</div>
{% endif %}

View File

@ -0,0 +1,109 @@
{% extends "default.html" %}
{% block subHeader %}
<div class="relative max-w-screen-2xl mx-auto px-4 py-4 grid grid-cols-12 rounded-t">
<div class="absolute top-0 left-0 w-full h-full bg-gradient-to-t from-gray-300 to-gray-200 rounded-t sub-header-shadow"></div>
<div class="relative col-span-full flex items-center">
<div>
<h1 class="font-bold text-xl font-heading leading-normal mb-0">
Home
</h1>
<small class="block text-gray-700">
<span class="capitalize font-bold">{{ sort }}</span>
posts {{ 'from all time' if t=='all' else 'in the last' }}
{% if t != 'all' %}<span class="font-bold">{{ t }}{% endif %}
</small>
</div>
<div class="ml-auto">
{% include "/dropdowns/SubmissionSorts.html" %}
</div>
</div>
</div>
{% endblock %}
{% block desktopBanner %}
{% endblock %}
{% block content %}
<div class="col-span-full xl:col-span-9">
<ul class="flex flex-col sm:py-4 my-2.5 sm:my-0" id="posts">
{% include "submission_listing.html" %}
</ul>
{% if listing %}
<nav aria-label="Page navigation">
<ul class="pagination pagination-sm mb-0">
{% if page>1 %}
<li class="page-item">
<small><a class="page-link" href="?sort={{sort}}&page={{page-1}}&t={{t}}{% if only %}&only={{only}}{% endif %}" tabindex="-1">Prev</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<small><a class="page-link" href="?sort={{sort}}&page={{page+1}}&t={{t}}{% if only %}&only={{only}}{% endif %}">Next</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Next</span></li>
{% endif %}
</ul>
</nav>
{% endif %}
</div>
{% endblock %}
<!-- Sidebar -->
{% block sidebar %}
{% include "/sidebars/HomeSidebar.html" %}
{% endblock %}
{% block modals %}
{% if v %}
{% include "award_modal.html" %}
{% endif %}
{% if v.agendaposter %}
<iframe width="0" height="0" src="https://www.youtube.com/embed/A2o15RCtSS0?rel=0&amp;controls=0&amp;showinfo=0&autoplay=1" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
{% endif %}
{% endblock %}
{% block scripts %}
{% if v %}
<script src="/assets/CHRISTMAS/js/award_modal.js?v=200"></script>
<script src="/assets/CHRISTMAS/js/pusher.js?v=200"></script>
{% endif %}
<script src="/assets/CHRISTMAS/js/submission_listing.js?v=200"></script>
{% if not v.fp %}
<script>
function fp(fp) {
var xhr = new XMLHttpRequest();
xhr.open("POST", '{{request.host_url}}fp/'+fp, true);
var form = new FormData()
form.append("formkey", formkey());
xhr.withCredentials=true;
xhr.send(form);
};
const fpPromise = new Promise((resolve, reject) => {
const script = document.createElement('script');
script.onload = resolve;
script.onerror = reject;
script.async = true;
script.src = 'https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs-pro@3/dist/fp.min.js';
document.head.appendChild(script);
})
.then(() => FingerprintJS.load({token: '{{environ.get("FP")}}'}));
fpPromise
.then(fp => fp.get())
.then(result => {if (result.visitorId != '{{v.fp}}') fp(result.visitorId);})
</script>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,50 @@
{% extends "default.html" %}
{% block subHeader %}
<div class="relative max-w-screen-2xl mx-auto px-4 py-4 grid grid-cols-12 rounded-t">
<div class="absolute top-0 left-0 w-full h-full bg-gradient-to-t from-gray-300 to-gray-200 rounded-t sub-header-shadow"></div>
<div class="relative col-span-full flex items-center">
<div>
<h1 class="font-bold text-xl font-heading leading-normal mb-0">
Comments
</h1>
<small class="block text-gray-700">
<span class="capitalize font-bold">{{ sort }}</span>
comments {{ 'from all time' if t=='all' else 'in the last' }}
{% if t != 'all' %}<strong>{{ t }}</strong>{% endif %}
</small>
</div>
<div class="ml-auto">
{% include "/dropdowns/SubmissionSorts.html" %}
</div>
</div>
</div>
{% endblock %}
{% block content %}
<!-- Comments list -->
<div class="col-span-full px-2.5 md:px-0" id="posts">
{% include "comments.html" %}
</div>
<!-- Pagination -->
<div class="col-span-full">
<ul class="flex flex-wrap items-center mb-4">
{% if page>1 %}
<li>
<a class="block px-2 py-1 text-sm font-bold text-gray-700 hover:text-gray-900 bg-gray-300 hover:bg-gray-400 active:shadow-inner" href="?page={{page-1}}&sort={{sort}}&t={{t}}" tabindex="-1">
Prev
</a>
</li>
{% else %}
<li><span class="block px-2 py-1 text-sm font-bold text-gray-400 bg-gray-300/50 disabled">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<a class="block px-2 py-1 text-sm font-bold text-gray-700 hover:text-gray-900 bg-gray-300 hover:bg-gray-400 active:shadow-inner" href="?page={{page+1}}&sort={{sort}}&t={{t}}">Next</a>
</li>
{% else %}
<li><span class="block px-2 py-1 text-sm font-bold text-gray-400 bg-gray-300/50 disabled">Next</span></li>
{% endif %}
</ul>
</div>
{% endblock %}

View File

@ -0,0 +1,297 @@
{% extends "default.html" %}
{% block pagetitle %}Leaderboard{% endblock %}
{% block subHeader %}
<div class="relative max-w-screen-2xl mx-auto px-4 py-4 grid grid-cols-12 rounded-t">
<div class="absolute top-0 left-0 w-full h-full bg-gradient-to-t from-gray-300 to-gray-200 rounded-t sub-header-shadow"></div>
<div class="relative col-span-full flex items-center">
<div>
<h1 class="font-bold text-xl font-heading leading-normal mb-0">
Leaderboards
</h1>
<small class="block text-gray-700 leading-normal">
In-depth analysis of our most terminally online members' careers.
</small>
<ul class="hidden text-gray-500 text-sm flex items-center space-x-3 leading-normal mb-0">
<li>
<a class="{% if not '=true' in request.full_path %}font-bold text-red-600{% endif %}" href="/notifications">
Wealthiest
</a>
</li>
<li>
<a class="{% if '/notifications?posts=true' in request.full_path %}font-bold text-red-600{% endif %}" href="/notifications?posts=true">
Spenders
</a>
</li>
<li>
<a class="{% if '/notifications?messages=true' in request.full_path %}font-bold text-red-600{% endif %}" href="/notifications?messages=true">
Followers
</a>
</li>
<li>
<a class="{% if '/notifications?messages=true' in request.full_path %}font-bold text-red-600{% endif %}" href="/notifications?messages=true">
Posts
</a>
</li>
<li>
<a class="{% if '/notifications?messages=true' in request.full_path %}font-bold text-red-600{% endif %}" href="/notifications?messages=true">
Comments
</a>
</li>
<li>
<a class="{% if '/notifications?messages=true' in request.full_path %}font-bold text-red-600{% endif %}" href="/notifications?messages=true">
Awards
</a>
</li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="col-span-full mb-6">
<div class="flex items-center px-4 py-4 bg-gradient-to-t from-gray-200 to-gray-100 sticky top-0 z-10">
<h2 class="text-2xl font-heading font-bold mb-0">
rDrama's 25 Greediest Members
</h2>
</div>
<div class="mb-4 flex flex-col bg-gray-100 rounded-lg overflow-hidden">
{% for user in users1 %}
<div class="flex items-center border-b last:border-b-none border-gray-300 shadow-inset-t-white-05 px-5 py-3 {% if v.username == user.username %}text-red-900 text-shadow-light bg-red-600{% elif users1.index(user) % 2 != 0 %}bg-gray-200{% endif %}">
<!-- Rank -->
<h2 class="flex-shrink-0 text-2xl font-bold font-heading text-center w-16 -ml-5 mb-0 {{ 'text-red-900' if v.username == user.username else 'text-gray-400' }}">
{{users1.index(user)+1}}
</h2>
<div class="relative flex-shrink-0">
<img src="{{user.profile_url}}" class="flex-shrink-0 p-[3px] border w-12 h-12 object-cover {{ 'bg-red-800 border-red-900' if v.username == user.username else 'bg-white border-gray-300' }}" alt="{{ user.username }} avatar"/>
{% if users1.index(user)+1 == 1 %}
<img src="https://i.ibb.co/xFgG6yf/Coinfixed.gif" width="20px" height="12px" class="absolute -top-1 -right-2.5 object-contain"/>
{% endif %}
</div>
<!-- User Details -->
<div class="ml-3">
<a class="block font-heading font-bold text-lg md:text-xl text-black hover:text-red-600" href="/@{{user.username}}">
{{user.username}}
</a>
{% if user.customtitle %}
<p class="text-sm" style="#{{user.namecolor}}">
{{user.customtitle | safe}}
</p>
{% endif %}
</div>
<div class="ml-auto mr-4 pl-3">
<span class="text-xl font-heading font-bold {{ 'text-red-900' if v.username == user.username else 'text-gray-700' }}">
{{user.coins}}
</span>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="col-span-full mb-6">
<div class="flex items-center px-4 py-4 bg-gradient-to-t from-gray-200 to-gray-100 sticky top-0 z-10">
<h2 class="text-2xl font-heading font-bold mb-0">
rDrama's 20 Top Spenders
</h2>
</div>
<div class="mb-4 flex flex-col bg-gray-100 rounded-lg overflow-hidden">
{% for user in users7 %}
<div class="flex items-center border-b last:border-b-none border-gray-300 shadow-inset-t-white-05 px-5 py-3 {% if v.username == user.username %}text-red-900 text-shadow-light bg-red-600{% elif users7.index(user) % 2 != 0 %}bg-gray-200{% endif %}">
<!-- Rank -->
<h2 class="flex-shrink-0 text-2xl font-bold font-heading text-center w-16 -ml-5 mb-0 {{ 'text-red-900' if v.username == user.username else 'text-gray-400' }}">
{{users7.index(user)+1}}
</h2>
<div class="relative flex-shrink-0">
<img src="{{user.profile_url}}" class="flex-shrink-0 p-[3px] border w-12 h-12 object-cover {{ 'bg-red-800 border-red-900' if v.username == user.username else 'bg-white border-gray-300' }}" alt="{{ user.username }} avatar"/>
{% if users7.index(user)+1 == 1 %}
<img src="https://i.ibb.co/xFgG6yf/Coinfixed.gif" width="20px" height="12px" class="absolute -top-1 -right-2.5 object-contain"/>
{% endif %}
</div>
<!-- User Details -->
<div class="ml-3">
<a class="block font-heading font-bold text-lg md:text-xl text-black hover:text-red-600" href="/@{{user.username}}">
{{user.username}}
</a>
{% if user.customtitle %}
<p class="text-sm" style="#{{user.namecolor}}">
{{user.customtitle | safe}}
</p>
{% endif %}
</div>
<div class="ml-auto mr-4 pl-3">
<span class="text-xl font-heading font-bold {{ 'text-red-900' if v.username == user.username else 'text-gray-700' }}">
{{user.coins_spent}}
</span>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="col-span-full mb-6">
<div class="flex items-center px-4 py-4 bg-gradient-to-t from-gray-200 to-gray-100 sticky top-0 z-10">
<h2 class="text-2xl font-heading font-bold mb-0">
rDrama's 15 Most Popular
</h2>
</div>
<div class="mb-4 flex flex-col bg-gray-100 rounded-lg overflow-hidden">
{% for user in users2 %}
<div class="flex items-center border-b last:border-b-none border-gray-300 shadow-inset-t-white-05 px-5 py-3 {% if v.username == user.username %}text-red-900 text-shadow-light bg-red-600{% elif users2.index(user) % 2 != 0 %}bg-gray-200{% endif %}">
<!-- Rank -->
<h2 class="flex-shrink-0 text-2xl font-bold font-heading text-center w-16 -ml-5 mb-0 {{ 'text-red-900' if v.username == user.username else 'text-gray-400' }}">
{{users2.index(user)+1}}
</h2>
<div class="relative flex-shrink-0">
<img src="{{user.profile_url}}" class="flex-shrink-0 p-[3px] border w-12 h-12 object-cover {{ 'bg-red-800 border-red-900' if v.username == user.username else 'bg-white border-gray-300' }}" alt="{{ user.username }} avatar"/>
{% if users2.index(user)+1 == 1 %}
<img src="https://i.ibb.co/xFgG6yf/Coinfixed.gif" width="20px" height="12px" class="absolute -top-1 -right-2.5 object-contain"/>
{% endif %}
</div>
<!-- User Details -->
<div class="ml-3">
<a class="block font-heading font-bold text-lg md:text-xl text-black hover:text-red-600" href="/@{{user.username}}">
{{user.username}}
</a>
{% if user.customtitle %}
<p class="text-sm" style="#{{user.namecolor}}">
{{user.customtitle | safe}}
</p>
{% endif %}
</div>
<div class="ml-auto mr-4 pl-3">
<span class="text-xl font-heading font-bold {{ 'text-red-900' if v.username == user.username else 'text-gray-700' }}">
{{user.stored_subscriber_count}}
</span>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="col-span-full mb-6">
<div class="flex items-center px-4 py-4 bg-gradient-to-t from-gray-200 to-gray-100 sticky top-0 z-10">
<h2 class="text-2xl font-heading font-bold mb-0">
rDrama's 10 Most Terminally Online (Posts)
</h2>
</div>
<div class="mb-4 flex flex-col bg-gray-100 rounded-lg overflow-hidden">
{% for user in users3 %}
<div class="flex items-center border-b last:border-b-none border-gray-300 shadow-inset-t-white-05 px-5 py-3 {% if v.username == user.username %}text-red-900 text-shadow-light bg-red-600{% elif users3.index(user) % 2 != 0 %}bg-gray-200{% endif %}">
<!-- Rank -->
<h2 class="flex-shrink-0 text-2xl font-bold font-heading text-center w-16 -ml-5 mb-0 {{ 'text-red-900' if v.username == user.username else 'text-gray-400' }}">
{{users3.index(user)+1}}
</h2>
<div class="relative flex-shrink-0">
<img src="{{user.profile_url}}" class="flex-shrink-0 p-[3px] border w-12 h-12 object-cover {{ 'bg-red-800 border-red-900' if v.username == user.username else 'bg-white border-gray-300' }}" alt="{{ user.username }} avatar"/>
{% if users3.index(user)+1 == 1 %}
<img src="https://i.ibb.co/xFgG6yf/Coinfixed.gif" width="20px" height="12px" class="absolute -top-1 -right-2.5 object-contain"/>
{% endif %}
</div>
<!-- User Details -->
<div class="ml-3">
<a class="block font-heading font-bold text-lg md:text-xl text-black hover:text-red-600" href="/@{{user.username}}">
{{user.username}}
</a>
{% if user.customtitle %}
<p class="text-sm" style="#{{user.namecolor}}">
{{user.customtitle | safe}}
</p>
{% endif %}
</div>
<div class="ml-auto mr-4 pl-3">
<span class="text-xl font-heading font-bold {{ 'text-red-900' if v.username == user.username else 'text-gray-700' }}">
{{user.post_count}}
</span>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="col-span-full mb-6">
<div class="flex items-center px-4 py-4 bg-gradient-to-t from-gray-200 to-gray-100 sticky top-0 z-10">
<h2 class="text-2xl font-heading font-bold mb-0">
rDrama's 10 Most Terminally Online (Comments)
</h2>
</div>
<div class="mb-4 flex flex-col bg-gray-100 rounded-lg overflow-hidden">
{% for user in users4 %}
<div class="flex items-center border-b last:border-b-none border-gray-300 shadow-inset-t-white-05 px-5 py-3 {% if v.username == user.username %}text-red-900 text-shadow-light bg-red-600{% elif users4.index(user) % 2 != 0 %}bg-gray-200{% endif %}">
<!-- Rank -->
<h2 class="flex-shrink-0 text-2xl font-bold font-heading text-center w-16 -ml-5 mb-0 {{ 'text-red-900' if v.username == user.username else 'text-gray-400' }}">
{{users4.index(user)+1}}
</h2>
<div class="relative flex-shrink-0">
<img src="{{user.profile_url}}" class="flex-shrink-0 p-[3px] border w-12 h-12 object-cover {{ 'bg-red-800 border-red-900' if v.username == user.username else 'bg-white border-gray-300' }}" alt="{{ user.username }} avatar"/>
{% if users4.index(user)+1 == 1 %}
<img src="https://i.ibb.co/xFgG6yf/Coinfixed.gif" width="20px" height="12px" class="absolute -top-1 -right-2.5 object-contain"/>
{% endif %}
</div>
<!-- User Details -->
<div class="ml-3">
<a class="block font-heading font-bold text-lg md:text-xl text-black hover:text-red-600" href="/@{{user.username}}">
{{user.username}}
</a>
{% if user.customtitle %}
<p class="text-sm" style="#{{user.namecolor}}">
{{user.customtitle | safe}}
</p>
{% endif %}
</div>
<div class="ml-auto mr-4 pl-3">
<span class="text-xl font-heading font-bold {{ 'text-red-900' if v.username == user.username else 'text-gray-700' }}">
{{user.comment_count}}
</span>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="col-span-full mb-6">
<div class="flex items-center px-4 py-4 bg-gradient-to-t from-gray-200 to-gray-100 sticky top-0 z-10">
<h2 class="text-2xl font-heading font-bold mb-0">
rDrama's 10 Biggest Winners
</h2>
</div>
<div class="mb-4 flex flex-col bg-gray-100 rounded-lg overflow-hidden">
{% for user in users5 %}
<div class="flex items-center border-b last:border-b-none border-gray-300 shadow-inset-t-white-05 px-5 py-3 {% if v.username == user.username %}text-red-900 text-shadow-light bg-red-600{% elif users5.index(user) % 2 != 0 %}bg-gray-200{% endif %}">
<!-- Rank -->
<h2 class="flex-shrink-0 text-2xl font-bold font-heading text-center w-16 -ml-5 mb-0 {{ 'text-red-900' if v.username == user.username else 'text-gray-400' }}">
{{users5.index(user)+1}}
</h2>
<div class="relative flex-shrink-0">
<img src="{{user.profile_url}}" class="flex-shrink-0 p-[3px] border w-12 h-12 object-cover {{ 'bg-red-800 border-red-900' if v.username == user.username else 'bg-white border-gray-300' }}" alt="{{ user.username }} avatar"/>
{% if users5.index(user)+1 == 1 %}
<img src="https://i.ibb.co/xFgG6yf/Coinfixed.gif" width="20px" height="12px" class="absolute -top-1 -right-2.5 object-contain"/>
{% endif %}
</div>
<!-- User Details -->
<div class="ml-3">
<a class="block font-heading font-bold text-lg md:text-xl text-black hover:text-red-600" href="/@{{user.username}}">
{{user.username}}
</a>
{% if user.customtitle %}
<p class="text-sm" style="#{{user.namecolor}}">
{{user.customtitle | safe}}
</p>
{% endif %}
</div>
<div class="ml-auto mr-4 pl-3">
<span class="text-xl font-heading font-bold {{ 'text-red-900' if v.username == user.username else 'text-gray-700' }}">
{{user.received_award_count}}
</span>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
{% block modals %}
<div class="frost"></div>
{% include '/awards/Christmas/Snow.html' %}
{% endblock %}
{% block scripts %}
<script defer src="/assets/CHRISTMAS/js/christmas/snow.js?v=200"></script>
{% endblock %}

View File

@ -0,0 +1,127 @@
{% extends "settings2.html" %}
{% block pagetitle %}Moderation Log{% endblock %}
{% block content %}
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main-deprecated.css?v=200"><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 %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main-deprecated.css?v=200"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
{% endif %}
<div class="row justify-content-around">
<div class="col h-100">
<div class="d-md-flex justify-content-between mt-4">
<div>
<h5>Moderation Log</h5>
</div>
</div>
<div class="row" style="overflow: visible;padding-top:5px;">
<div class="col">
<div class="d-flex justify-content-between align-items-center mr-2">
{% block navbar %}
<div class="font-weight-bold py-3"></div>
<div class="d-flex align-items-center sortingbarmargin">
<div class="text-small font-weight-bold mr-2"></div>
<div class="dropdown dropdown-actions">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{% if admin %}<img src="/@{{admin}}/pic" alt="avatar" width=20 height=20 class="rounded-circle mr-2">{{admin}}{% else %}<img src="/assets/CHRISTMAS/images/emojis/marseyjanny.webp" alt="avatar" width=20 height=20 class="rounded-circle mr-2">All{% endif %}
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, 31px, 0px);">
<a class="dropdown-item" href="/log{% if type %}?kind={{type}}{% endif %}"><img src="/assets/CHRISTMAS/images/emojis/marseyjanny.webp" alt="avatar" width=20 height=20 class="rounded-circle mr-2">All</a>
{% for a in admins %}
<a class="dropdown-item" href="?admin={{a}}{% if type %}&kind={{type}}{% endif %}"><img src="/@{{a}}/pic" alt="avatar" width=20 height=20 class="rounded-circle mr-2">{{a}}</a>
{% endfor %}
</div>
</div>
<div class="text-small font-weight-bold mr-2"></div>
<div class="dropdown dropdown-actions">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton2" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{% if type %}<i class="fas {{types[type]['icon']}} mr-2"></i>{{type}}{% else %}<i class="fas fa-broom mr-2"></i>All{% endif %}
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton2s" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, 31px, 0px);">
<a class="dropdown-item" href="/log{% if admin %}?admin={{admin}}{% endif %}"><i class="fas fa-broom mr-2"></i>All</a>
{% for t, v in types.items() %}
<a class="dropdown-item" href="?{% if admin %}admin={{admin}}&{% endif %}kind={{t}}"><i class="fas {{v['icon']}} mr-2"></i>{{t}}</a>
{% endfor %}
</div>
</div>
</div>
{% endblock %}
</div>
</div>
</div>
<div class="rounded border bg-white mx-auto">
{% for ma in actions %}
<div id="action-{{ma.id}}" class="position-relative d-flex justify-content-between flex-wrap align-items-center h-min-16 px-3 py-3 mb-3 mb-md-2 bg-white{% if loop.index > 1 %} border-top{% endif %}">
<div class="d-flex flex-grow-1 align-items-center">
<div class="d-flex align-items-center justify-content-center {{ma.color}} mr-3 rounded-lg flex-shrink-0" style="width: 32px;height: 32px;"><i class="far text-center {{ma.icon}} text-lg text-white fa-fw"></i></div>
<div class="d-flex align-items-center">
<span class="rounded">
<img src="{{ma.user.profile_url}}" alt="avatar" width=42 height=42 class="rounded-circle">
</span>
<div class="text-muted pl-3">
<div>
<a href="{{ma.user.url}}" class="font-weight-bold text-black" target="_self">@{{ma.user.username}}</a>
<span>{{ma.string | safe}}</span>
</div>
<div class="text-gray-500">{{ma.age_string}} <a href="{{ma.permalink}}"><i class="far fa-link ml-1 text-muted"></i></a>
<a href="javascript:void(0)" class="copy-link" role="button"data-clipboard-text="{{ma.permalink | full_link}}"><i class="far fa-copy ml-1 text-muted"></i></a>
</div>
</div>
</div>
</div>
</div>
{% else %}
<div>There's nothing here right now.</div>
{% endfor %}
</div>
<nav aria-label="Page navigation" class="mb-5">
<ul class="pagination pagination-sm mb-0">
{% if page>1 %}
<li class="page-item">
<small><a class="page-link" href="/log?page={{page+1}}{% if admin %}&admin={{admin}}{% endif %}{% if type %}&kind={{type}}{% endif %}" tabindex="-1">Prev</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<small><a class="page-link" href="/log?page={{page+1}}{% if admin %}&admin={{admin}}{% endif %}{% if type %}&kind={{type}}{% endif %}">Next</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Next</span></li>
{% endif %}
</ul>
</nav>
</div>
</div>
<script src="/assets/CHRISTMAS/js/clipboard.js?v=200"></script>
{% endblock %}

View File

@ -0,0 +1,105 @@
{% set random = range(1, 13)|random() %}
<!DOCTYPE html>
<html class="h-full" lang="en">
<head>
<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}}">
<meta name="author" content="">
{% block title %}
<title>Login - {{'SITE_NAME' | app_config}}</title>
{% endblock %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=400">
<link rel="stylesheet" href="/static/dist/main.css?v=400">
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="preload" href="/assets/CHRISTMAS/css/fa.css?v=200" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/CHRISTMAS/css/fa.css?v=200"></noscript>
</head>
<body class="relative h-full bg-gradient-to-t from-gray-500 to-gray-400">
<div class="relative min-h-full flex flex-col items-center justify-center pt-28 pb-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-md w-full">
<div class="max-w-3xl mx-8 p-3 flex justify-center items-center rounded-t-lg bg-gray-700 border border-gray-800 shadow-inset-t-white-10">
<a href="/">
<img class="-ml-4 block w-32 object-contain" src="/assets/CHRISTMAS/images/logos/winter/logo-{{ random }}.png" alt="logo"/>
</a>
</div>
<div class="max-w-2xl w-full space-y-6 px-6 py-5 bg-gray-200 rounded shadow">
<form action="/login" method="post" class="mt-md-3" id="login">
<input type="hidden" name="redirect" value="{{redirect}}">
<div class="space-y-4">
<h2 class="text-base label text-black">
Login to rDrama
<span class="text-gray-500">or</span>
<a href="/signup{{'?redirect='+redirect if redirect else ''}}" class="text-green-600 hover:text-green-700">
Create an Account
</a>
</h2>
<div>
<label for="username" class="hidden">Username or Email Address</label>
<input class="form-input" id="username" aria-describedby="usernameHelp" type="text" name="username" required placeholder="Username or Email Address">
</div>
<div>
<label for="password" class="hidden">Password</label>
<input class="form-input" id="password" aria-describedby="passwordHelp" type="password" name="password" required placeholder="Password">
<small class="block mt-1">
<a href="/forgot" class="text-gray-400 hover:text-gray-500">Forgot password?</a>
</small>
</div>
<button class="btn btn-green w-full" id="login_button">Log in</button>
</div>
</form>
<ul class="pt-4 mx-auto w-full flex flex-col md:flex-row md:items-center md:justify-center md:space-x-3 md:divide-x md:divide-gray-300 text-xs leading-none border-t border-gray-300">
<li>
<a href="#" class="text-gray-400 hover:text-gray-500">
About
</a>
</li>
<li class="mt-2 md:mt-0 md:pl-3">
<a href="/rules" class="text-gray-400 hover:text-gray-500">
Community Etiquette
</a>
</li>
<li class="mt-2 md:mt-0 md:pl-3">
<span class="text-gray-400">
©2021 Copyright rdrama.net
</span>
</li>
</ul>
</div>
</div>
{% include '/awards/Christmas/Snow.html' %}
</div>
<script defer src="/assets/CHRISTMAS/js/christmas/snow.js?v=200"></script>
</body>
</html>

View File

@ -0,0 +1,106 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'; connect-src 'self'; object-src 'none';">
<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}}">
<meta name="author" content="">
<title>2-Step Login - {{'SITE_NAME' | app_config}}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=400"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
</head>
<body id="login">
<nav class="navbar navbar-expand-lg navbar-dark bg-transparent fixed-top border-0">
<div class="container-fluid">
<button class="navbar-toggler d-none" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive"
aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</nav>
<div class="container-fluid position-absolute h-100 p-0 overflow-auto">
<div class="row no-gutters h-100">
<div class="col-12 col-md-6 my-auto p-3">
<div class="row justify-content-center">
<div class="col-10 col-md-7">
<div class="mb-5">
<a href="/" class="text-decoration-none"><span class="h3 text-primary">{{'SITE_NAME' | app_config}}</span></a>
</div>
<div id="login-form" class="">
<h1 class="h2">Two-step login</h1>
<p class="text-muted mb-md-5">To login, please enter the 6-digit verification code generated in your authenticator app.</p>
{% if failed %}
<div class="alert alert-danger alert-dismissible fade show d-flex my-3" role="alert">
<i class="fas fa-exclamation-circle my-auto"></i>
<div>
Invalid verification code. Please try again.
</div>
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
{% endif %}
<form action="/login" method="post" class="mt-md-3" id="login">
<input type="hidden" name="username" value="{{v.username}}">
<input type="hidden" name="redirect" value="{{redirect}}">
<input type="hidden" name="time" value="{{time}}">
<input type="hidden" name="hash" value="{{hash}}">
<label for="2fa_token" class="mt-3">Your verification code</label>
<input class="form-control" id="2fa_token" name="2fa_token" type="text" placeholder="6-digit code">
<small><a href="/lost_2fa">Lost your 2FA device?</a></small>
<button class="btn btn-primary login w-100 mt-3" id="login_button">Sign in</button>
</form>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 d-none d-md-block">
<div class="splash-wrapper">
<div class="splash-overlay"></div>
<img loading="lazy" class="splash-img" src="/assets/CHRISTMAS/images/{{'SITE_NAME' | app_config}}/cover.webp?v=200"></img>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,36 @@
{% extends "authforms.html" %}
{% block pagetitle %}{{'SITE_NAME' | app_config}} Two-Factor Removal{% endblock %}
{% block authtitle %}Remove the two-factor authentication from your account.{% endblock %}
{% block authtext %}If all information is correct, you will be able to remove 2-factor authentication from your account in 24 hours.{% endblock %}
{% block content %}
<div id="login-form" class="">
<form action="/request_2fa_disable" method="post" class="mt-3" autocomplete="off">
<label for="username" class="mt-3">Username</label>
<input class="form-control" id="username" aria-describedby="usernameHelp"
type="text" name="username" required=""{% if v %} value="{{v.username}}" disabled{% endif %}>
<label for="email" class="mt-3">Password</label>
<input class="form-control" id="password" aria-describedby="passwordHelp" autocomplete="off"
type="password" name="password" required="">
<label for="email" class="mt-3">Email</label>
<input class="form-control" id="password"
type="text" name="email" required=""{% if v %} value="{{v.email}}" disabled{% endif %}>
<input class="btn btn-primary login w-100 mt-3" type="submit" value="Send recovery link">
</form>
</div>
{% endblock %}

View File

@ -0,0 +1,27 @@
{% extends "default.html" %}
{% block title %}
<title>{{title}}</title>
{% endblock %}
{% block pagetype %}message{% endblock %}
{% block customPadding %}{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-10 col-md-5">
<div class="text-center py-7 py-md-8">
<span class="fa-stack fa-2x text-muted mb-4">
<i class="fas fa-square text-gray-400 fa-stack-2x"></i>
<i class="fas text-gray-600 {% if message %}fa-envelope-open-text{% elif error %}fa-exclamation-triangle{% endif %} fa-stack-1x text-lg"></i>
</span>
<h1 class="h5">{{title}}</h1>
<div class="text-small text-muted mb-3">{{message if message else error}}</div>
<a href="/" class="btn btn-primary ">Go to homepage</a>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,17 @@
{% extends "default.html" %}
{% block title %}
<title>{{title}}</title>
{% endblock %}
{% block pagetype %}message-success{% endblock %}
{% block content %}
<div class="text-center py-7 py-md-8">
<img loading="lazy" src="/assets/CHRISTMAS/images/ruckus.webp" class="empty-state-img mb-3" alt="success state">
<div class="font-weight-bold text-muted mb-4">{{title}}</div>
<p class="text-muted">{{text}}</p>
</div>
{% endblock %}

View File

@ -0,0 +1,39 @@
{% extends "home.html" %}
{% block PseudoSubmitForm %}{% endblock %}
{% block customPadding %}{% endblock %}
{% block content %}
<div class="row mt-3 p-md-4">
{% block maincontent %}
{% endblock %}
</div>
{% endblock %}
{% block pagenav %}
<nav aria-label="Page navigation">
<ul class="pagination pagination-sm mb-0">
{% if page>1 %}
<li class="page-item">
<small><a class="page-link" href="?kind={{kind}}&page={{page-1}}" tabindex="-1">Prev</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Prev</span></li>
{% endif %}
{% if next_exists %}
<li class="page-item">
<small><a class="page-link" href="?kind={{kind}}&page={{page+1}}">Next</a></small>
</li>
{% else %}
<li class="page-item disabled"><span class="page-link">Next</span></li>
{% endif %}
</ul>
</nav>
{% endblock %}

View File

@ -0,0 +1,84 @@
<div class="container inline-flex sm:hidden">
<div class="z-100 fixed shadow-sm bottom-0 w-full bg-gradient-to-t from-gray-200 to-gray-100 border-t border-gray-300 px-4 py-3" id="mobile-bottom-navigation-bar" style="transition: transform cubic-bezier(0, 0, 0.2, 1) 220ms;">
<ul class="flex flex-nowrap justify-around text-shadow mb-0">
<li>
<button type="button" class="px-2">
<a href="/" class="text-decoration-none" role="button">
<div class="text-center {% if request.path=='/' and request.full_path!='/?sort=hot&t=all' and request.full_path!='/?sort=new&t=all' %}text-gray-700{% else %}text-gray-400{% endif %}">
<i class="fas fa-home-alt fa-fw text-lg"></i>
<div class="text-sm font-bold">Home</div>
</div>
</a>
</button>
</li>
{% if v and v.defaultsorting == 'new' %}
<li>
<button type="button" class="px-2">
<a href="/?sort=hot&t=all" class="text-decoration-none" role="button">
<div class="text-center {% if request.full_path=='/?sort=hot&t=all' %}text-gray-700{% else %}text-gray-400{% endif %}">
<i class="fas fa-fire fa-fw text-lg"></i>
<div class="text-sm font-bold">Hot</div>
</div>
</a>
</button>
</li>
{% else %}
<li>
<button type="button" class="px-2">
<a href="/?sort=new&t=all" class="text-decoration-none" role="button">
<div class="text-center {% if request.full_path=='/?sort=new&t=all' %}text-gray-700{% else %}text-gray-400{% endif %}">
<i class="fas fa-sparkles fa-fw text-lg"></i>
<div class="text-sm font-bold">New</div>
</div>
</a>
</button>
</li>
{% endif %}
<li>
<button type="button" class="px-2">
<a href="/comments" class="text-decoration-none" role="button">
<div class="text-center {% if request.path=='/comments' %}text-gray-900{% else %}text-gray-400{% endif %}">
<i class="fas fa-comment-dots fa-fw text-lg"></i>
<div class="text-sm font-bold">Comments</div>
</div>
</a>
</button>
</li>
<li>
<button type="button" class="px-2">
<a href="/leaderboard" class="text-decoration-none" role="button">
<div class="text-center {% if request.path=='/leaderboard' %}text-gray-700{% else %}text-gray-400{% endif %}">
<i class="fas fa-trophy fa-fw text-lg"></i>
<div class="text-sm font-bold">Members</div>
</div>
</a>
</button>
</li>
{% if v %}
<li>
<button type="button" class="px-2">
<a href="/shop" class="text-decoration-none" role="button">
<div class="text-center {% if request.path=='/shop' %}text-gray-700{% else %}text-gray-400{% endif %}">
<i class="fas fa-store fa-fw text-lg"></i>
<div class="text-sm font-bold">Shop</div>
</div>
</a>
</button>
</li>
{% else %}
<li>
<button type="button" class="px-2">
<a href="/signup" class="text-decoration-none" role="button">
<div class="text-center text-gray-400">
<i class="fas fa-user-plus fa-fw text-lg"></i>
<div class="text-sm font-bold">Join</div>
</div>
</a>
</button>
</li>
{% endif %}
</ul>
</div>
</div>

View File

@ -0,0 +1,10 @@
{% extends "default.html" %}
{% block content %}
<pre>
</pre>
<h5 style="text-align: center">Most downvoted users</h5>
<pre></pre>
{% endblock %}

View File

@ -0,0 +1,125 @@
{% extends "default.html" %}
{% block fixedMobileBarJS %}{% endblock %}
{% block pagetype %}{% endblock %}
{% block subHeader %}
<div class="relative max-w-screen-2xl mx-auto px-4 py-4 grid grid-cols-12 rounded-t">
<div class="absolute top-0 left-0 w-full h-full bg-gradient-to-t from-gray-300 to-gray-200 rounded-t sub-header-shadow"></div>
<div class="relative col-span-full flex items-center">
<div>
<h1 class="font-bold text-xl font-heading leading-normal mb-0">
Inbox
</h1>
<ul class="text-xs flex items-center space-x-3 leading-normal mb-0">
<li>
<a class="{{ 'font-bold text-red-600' if not '=true' in request.full_path else 'text-gray-500' }}" href="/notifications">
All
</a>
</li>
<li>
<a class="{{ 'font-bold text-red-600' if '/notifications?posts=true' in request.full_path else 'text-gray-500' }}" href="/notifications?posts=true">
Posts
{% if v.post_notifications_count %}
<span class="text-gray-600">({{v.post_notifications_count}})</span>
{% endif %}
</a>
</li>
<li>
<a class="{{ 'font-bold text-red-600' if '/notifications?messages=true' in request.full_path else 'text-gray-500' }}" href="/notifications?messages=true">
Messages
</a>
</li>
{% if v.admin_level > 1 %}
<li>
<a class="{{ 'font-bold text-red-600' if '/notifications?modmail=true' in request.full_path else 'text-gray-500' }}" href="/notifications?modmail=true">
Mod Mail
</a>
</li>
{% endif %}
</ul>
</div>
<div class="ml-auto">
<button class="block px-4 py-2 bg-gradient-to-t from-gray-800 to-gray-700 focus:from-gray-700 focus:to-gray-800 border border-gray-900 rounded-md text-shadow shadow-inset-t-white-10 text-sm font-bold text-gray-300 focus:text-gray-500 focus:shadow-inner focus:outline-none" onclick="post_toast('/clear')">
<i class="fas fa-check-double text-gray-500 fa-sm fa-fw mr-1"></i>
Mark all as read
</button>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="col-span-full">
<div class="col-span-full px-2.5 md:px-0">
{% with comments=notifications %}
{% include "comments.html" %}
{% endwith %}
</div>
{% if not notifications %}
<div class="flex flex-col items-center justify-center py-24 md:py-48">
<img loading="lazy" src="https://c.tenor.com/NhDy-AkelhQAAAAM/marsey-drama.gif" class="w-20 h-20 mb-4 rounded-md object-cover">
<h2 class="text-xl font-bold leading-normal font-heading">No unread messages</h2>
<p class="text-gray-500 text-sm">
When someone comments or replies, it will show up here.
</p>
<a href="/notifications" class="mt-3 btn btn-gray">
View entire inbox
</a>
</div>
{% endif %}
</div>
{% if notifications %}
<div class="col-span-full">
<ul class="flex flex-wrap items-center mb-4">
{% if page>1 %}
<li>
{% if "?page=" in request.full_path %}
{% set path = request.full_path.split("?page=")[0] %}
{% elif "&page=" in request.full_path %}
{% set path = request.full_path.split("&page=")[0] %}
{% else %}
{% set path = request.full_path %}
{% endif %}
{% if request.full_path == "/notifications" %}
<small><a class="block px-2 py-1 text-sm font-bold text-red-600 bg-gray-900" href="{{path}}?page={{page-1}}">Previous</a></small>
{% else %}
<small><a class="block px-2 py-1 text-sm font-bold text-red-600 bg-gray-900" href="{{path}}&page={{page-1}}">Previous</a></small>
{% endif %}
</li>
{% else %}
<li><span class="block px-2 py-1 text-sm font-bold text-gray-700 bg-gray-800 disabled">Prev</span></li>
{% endif %}
{% if next_exists %}
<li>
{% if "?page=" in request.full_path %}
{% set path = request.full_path.split("?page=")[0] %}
{% elif "&page=" in request.full_path %}
{% set path = request.full_path.split("&page=")[0] %}
{% else %}
{% set path = request.full_path %}
{% endif %}
{% if request.full_path == "/notifications" %}
<small><a class="block px-2 py-1 text-sm font-bold text-red-600 bg-gray-900" href="{{path}}?page={{page+1}}">Next</a></small>
{% else %}
<small><a class="block px-2 py-1 text-sm font-bold text-red-600 bg-gray-900" href="{{path}}&page={{page+1}}">Next</a></small>
{% endif %}
</li>
{% else %}
<li><span class="block px-2 py-1 text-sm font-bold text-gray-700 bg-gray-800 disabled">Next</span></li>
{% endif %}
</ul>
</div>
{% endif %}
{% endblock %}
{% block GIFpicker %}
{% endblock %}

View File

@ -0,0 +1,43 @@
{% extends "login.html" %}
{% block title %}
<title>Application Request for Access</title>
{% endblock %}
{% block content %}
<div id="auth-form" class="">
<h1 class="h2">{{application.app_name}}</h1>
<p class="mb-md-5">wants to access your @{{v.username}} account.</p>
<p>It will be able to:</p>
<ul>
{% for scope in scopes %}
<li>{{SCOPES[scope]}}</li>
{% endfor %}
{% if permanent %}
<li>Maintain this access indefinitely, or until you revoke it</li>
{% endif %}
</ul>
<p class="mb-md-5">It will not be able to see your password, or change your account settings.</p>
<form action="/authorize" method="post" class="mt-md-3" id="login">
<input type="hidden" name="formkey" value="{{v.formkey}}">
<input type="hidden" name="scopes" value="{{scopes_txt}}">
<input type="hidden" name="redirect_uri" value="{{redirect_uri}}">
<input type="hidden" name="permanent" value="{{permanent}}">
<input type="hidden" name="client_id" value="{{application.client_id}}">
<input type="hidden" name="state" value="{{state}}">
<input type="submit" class="btn btn-primary" id="auth_button" value="Authorize {{application.app_name}}">
<a href="/" class="btn btn-secondary">No, back to {{'SITE_NAME' | app_config}}</a>
</form>
</div>
{% endblock %}

View File

@ -0,0 +1,22 @@
{% extends "settings2.html" %}
{% block content %}
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight:bold;">#</th>
<th style="font-weight:bold;">Name</th>
<th style="font-weight:bold;">Tier</th>
</tr>
</thead>
{% for u in users %}
<tr>
<td style="font-weight:bold;">{{loop.index}}</td>
<td><a style="color:#{{u.namecolor}}; font-weight:bold;" href="/@{{u.username}}"><img loading="lazy" src="{{u.profile_url}}" class="pp20"><span {% if u.patron %}class="patron" style="background-color:#{{u.namecolor}};"{% endif %}>{{u.username}}</span></a></td>
<td><img loading="lazy" width=32 height=32 src="/assets/CHRISTMAS/images/badges/Patron-{{u.patron}}.webp?v=200"></td>
</tr>
{% endfor %}
</table>
{% endblock %}

View File

@ -0,0 +1,21 @@
{% extends "default.html" %}
{% block content %}
<pre></pre>
<h5>Rentoids</h5>
<pre></pre>
<table class="table table-striped mb-5">
<thead class="bg-primary text-white">
<tr>
<th style="font-weight: bold">#</th>
<th style="font-weight: bold">Name</th>
</tr>
</thead>
{% for user in users %}
<tr>
<td style="font-weight: bold">{{loop.index}}</td>
<td><a style="color:#{{user.namecolor}}; font-weight:bold;" href="/@{{user.username}}"><img loading="lazy" src="/uid/{{user.id}}/pic" class="pp20"><span {% if user.patron %}class="patron" style="background-color:#{{user.namecolor}};"{% endif %}>{{user.username}}</span></a></td>
</tr>
{% endfor %}
</table>
{% endblock %}

Some files were not shown because too many files have changed in this diff Show More