MarseyWorld/files/templates/util/macros.html

407 lines
21 KiB
HTML
Raw Normal View History

{%- macro plural(value, suffix='s') -%}
{%- if value != 1 -%}
{{suffix}}
{%- endif -%}
{%- endmacro -%}
{%- macro random_image(path) -%}
2023-12-22 20:14:21 +00:00
{{- SITE_FULL_IMAGES ~ "/" ~ path ~ "/" ~ listdir('files/' ~ path)|random() ~ '?x=7' -}}
2022-11-21 04:57:20 +00:00
{%- endmacro -%}
2022-11-19 19:54:07 +00:00
{% macro post_meta(p) %}
2023-10-07 17:55:50 +00:00
{% if p.hole %}
2023-10-08 11:38:14 +00:00
{% if SITE_NAME == 'WPD' -%}
<a href='/h/{{p.hole}}' class="hole-flair font-weight-bold">{{p.hole|capitalize}}</a>
{%- else -%}
<a class="mr-2 font-weight-bold" href='/h/{{p.hole}}'>/h/{{p.hole}}</a>
{%- endif %}
2022-11-19 19:54:07 +00:00
{% endif %}
2023-10-07 17:55:50 +00:00
{% if p.hole and p.author.exiler_username(p.hole) %}
<a><i class="fas fa-campfire text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="User has been exiled from /h/{{p.hole}} by @{{p.author.exiler_username(p.hole)}}"></i></a>
2022-11-19 19:54:07 +00:00
{% endif %}
{% if p.bannedfor %}
2022-11-19 19:54:07 +00:00
<i class="fas fa-hammer-crash text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="User was banned for this post {{p.bannedfor}}"></i>
{% endif %}
{% if p.chuddedfor %}
2023-10-27 10:43:07 +00:00
<i class="fas fa-face-sleeping text-danger mr-1" data-bs-toggle="tooltip" data-bs-placement="bottom" title="User was chudded for this post {{p.chuddedfor}}"></i>
2022-11-19 19:54:07 +00:00
{% endif %}
{% for a in p.awards %}
2023-10-15 15:38:13 +00:00
<span class="mr-1">
{% if a.kind in ["emoji","emoji-hz"] %}
<img alt='{{a.title}} Award given by @{{a.user.username}}: "{{a.note}}"' data-bs-toggle="tooltip" loading="lazy" src="{{SITE_FULL_IMAGES}}/e/{{a.note}}.webp" data-bs-toggle="tooltip" data-bs-placement="bottom" title='{{a.title}} Award given by @{{a.user.username}}: "{{a.note}}"' width="20px">
{% else %}
<i class="{{a.class_list}} px-1" data-bs-toggle="tooltip" data-bs-placement="bottom" title='{{a.title}} Award given by @{{a.user.username}}{% if a.kind in ["chud","namelock","flairlock"] %}: "{{a.note}}"{% endif %}'></i>
{% endif %}
</span>
2022-11-19 19:54:07 +00:00
{% endfor %}
2024-01-12 06:24:05 +00:00
{% with user = p.author %}
{%- include 'admin/shadowbanned_tooltip.html' -%}
{% endwith %}
2022-11-19 19:54:07 +00:00
{% if p.stickied %}
2023-01-25 03:32:08 +00:00
<i id='pinned-{{p.id}}' class="fas fa-thumbtack fa-rotate--45 pr-1 ml-1 mt-3 text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Pinned by @{{p.stickied}}" {% if p.stickied_utc %}data-onmouseover="pinned_timestamp('pinned-{{p.id}}')" data-timestamp={{p.stickied_utc}} data-nonce="{{g.nonce}}"{% endif %}></i>
2022-11-19 19:54:07 +00:00
{% endif %}
{% if p.hole_pinned %}
2023-10-07 17:55:50 +00:00
<i id='hole-pinned-{{p.id}}' class="fas fa-thumbtack fa-rotate--45 pr-1 ml-1 mt-3 text-blue" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Pinned to /h/{{p.hole}} by @{{p.hole_pinned}}"></i>
2022-11-19 19:54:07 +00:00
{% endif %}
{% if p.distinguish_level %}<i class="fas fa-broom text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{SITE_NAME}} Admin, speaking officially"></i>{% endif %}
2023-01-22 08:50:03 +00:00
{% if p.is_pinned and request.path != '/' %}
2023-01-25 03:32:08 +00:00
<i class="fas fa-thumbtack fa-rotate--45 pr-1 ml-1 mt-3 text-admin" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Pinned to profile"></i>
2023-01-22 08:50:03 +00:00
{% endif %}
2023-10-05 10:19:50 +00:00
{% if p.nsfw %}<span class="badge badge-danger text-small-extra mr-1">NSFW</span>{% endif %}
2022-11-19 19:54:07 +00:00
{% if p.is_bot %} <i class="fas fa-robot text-info" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Bot"></i>{% endif %}
{% if p.is_blocking and not p.ghost %}<i class="fas fa-user-minus text-warning" data-bs-toggle="tooltip" data-bs-placement="bottom" title="You're blocking this user."></i>{% endif %}
{% if p.is_blocked and not p.ghost %}<i class="fas fa-user-minus text-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="This user is blocking you."></i>{% endif %}
2023-02-10 04:21:19 +00:00
{% if p.private %}<span class="mr-2 badge border-warning border-1 text-small-extra">Draft</span>{% endif %}
2023-10-08 19:44:22 +00:00
{% if p.active_reports(v) %}
2023-11-04 22:20:27 +00:00
<button type="button" class="btn btn-primary mx-1" style="padding:1px 5px; font-size:10px" data-nonce="{{g.nonce}}" data-toggleelement="#reports-{{p.id}}" data-toggleattr="d-none">{{p.active_reports(v)}} Report{{plural(p.active_reports(v))}}</button>
2023-10-08 19:44:22 +00:00
{% endif %}
2022-11-19 19:54:07 +00:00
{% if p.ghost %}
<span {% if p.distinguish_level %}class="mod {% if SITE_NAME == 'rDrama' %}mod-rdrama{% endif %}"{% endif %}>👻</span>
2022-11-19 19:54:07 +00:00
{% else %}
{% if FEATURES['PATRON_ICONS'] and p.author.patron > 1 %}
2023-08-01 07:44:35 +00:00
<img loading="lazy" src="{{SITE_FULL_IMAGES}}/i/{{SITE_NAME}}/badges/2{{p.author.patron}}.webp?b=11" class="patron-img" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{p.author.patron_tooltip}}" alt="{{p.author.patron_tooltip}}">
2022-11-19 19:54:07 +00:00
{% endif %}
{% if FEATURES['HOUSES'] and p.author.house %}
2024-01-31 22:03:40 +00:00
<img loading="lazy" src="{{SITE_FULL_IMAGES}}/i/houses/{{p.author.house}}.webp?x=7" class="house-img" data-bs-toggle="tooltip" data-bs-placement="bottom" title="House {{p.author.house}}" alt="House {{p.author.house}}">
2022-11-19 19:54:07 +00:00
{% endif %}
{% if p.author.verified %}<i class="fas fa-badge-check align-middle ml-1 {% if p.author.verified=='Glowiefied' %}glow{% endif %}" style="color:{% if p.author.verifiedcolor %}#{{p.author.verifiedcolor}}{% else %}#1DA1F2{% endif %}" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{p.author.verified}}"></i>
{% endif %}
2023-10-13 17:12:33 +00:00
<a class="user-name text-decoration-none unbreakable" href="{{p.author.url}}" data-pop-info='{{p.author.json_popover(v) | tojson}}' data-bs-placement="bottom" data-bs-toggle="popover" data-bs-trigger="manual" data-content-id="popover" tabindex="0" style="color: #{{p.author.name_color}}; font-weight: bold">
2022-11-19 19:54:07 +00:00
<div class="profile-pic-30-wrapper" style="margin-top:9px">
2023-05-03 17:53:51 +00:00
<img loading="lazy" alt="@{{p.author.username}}'s profile picture" src="{{p.author.profile_url}}" class="profile-pic-30 mr-2">
2022-12-24 22:21:49 +00:00
{% if p.author.hat_active(v)[0] -%}
2023-12-22 20:14:21 +00:00
<img class="profile-pic-30-hat hat" loading="lazy" src="{{p.author.hat_active(v)[0]}}?x=7" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{p.author.hat_active(v)[1]}}" alt="@{{p.author.username}}'s hat">
2022-11-19 19:54:07 +00:00
{%- endif %}
</div>
2023-10-05 19:40:44 +00:00
<span {% if p.author.patron and not p.distinguish_level %}class="patron" style="background-color:#{{p.author.name_color}}"{% elif p.distinguish_level %}class="mod {% if SITE_NAME == 'rDrama' %}mod-rdrama{% endif %}"{% endif %} {% if p.author.pride_username(v) %}pride_username{% endif %}>{{p.author_name}}</span>
2022-11-19 19:54:07 +00:00
</a>
{% if FEATURES['PRONOUNS'] %}
2023-10-17 18:54:02 +00:00
<span class="pronouns" style="color:#{{p.author.flaircolor}} !important;border-color:#{{p.author.flaircolor}} !important">{{p.author.pronouns_display}}</span>
2022-11-19 19:54:07 +00:00
{% endif %}
2023-10-05 10:39:12 +00:00
{% if p.author.flair_html %}
2023-10-17 18:54:02 +00:00
<bdi class="text-break ml-2" style="color: #{{p.author.flaircolor}}">{{p.author.flair_html | safe}}</bdi>
2022-11-19 19:54:07 +00:00
{% endif %}
{% endif %}
<span class="ml-2 d-inline-block" data-bs-toggle="tooltip" data-bs-placement="bottom" data-nonce="{{g.nonce}}" data-onmouseover="timestamp(this, '{{p.created_utc}}')" id="timestamp-{{p.id}}">&nbsp;{{p.age_string}}</span>
{% if not p.deleted_utc %}
<span class="ml-2 d-inline-block">({% if p.is_image %}image post{% elif p.is_video %}video post{% elif p.is_audio %}audio post{% elif p.domain %}<a href="/search/posts/?q=domain%3A{{p.domain}}" class="post-meta-domain" {% if v and v.newtab %}data-target="t" target="_blank"{% endif %}>{{p.domain|truncate(50, True)}}</a>{% else %}text post{% endif %})</span>
{% endif %}
2022-11-19 19:54:07 +00:00
{% if p.edited_utc %}
<span class="ml-2 d-inline-block">Edited <span data-bs-toggle="tooltip" data-bs-placement="bottom" id="edited_timestamp-{{p.id}}" data-nonce="{{g.nonce}}" data-onmouseover="timestamp(this, '{{p.edited_utc}}')">{{p.edited_string}}</span></span>
2022-11-19 19:54:07 +00:00
{% endif %}
<span class="ml-2 d-inline-block">{{p.views}} thread views</span>
2023-03-16 06:36:24 +00:00
&nbsp;&nbsp;#{{p.id}}
{% if p.ping_cost %}
2023-08-09 13:11:22 +00:00
<em class="ml-2">spent {{p.ping_cost}} currency on pings</em>
{% endif %}
2022-11-19 19:54:07 +00:00
{% endmacro %}
2023-02-27 15:02:35 +00:00
2023-08-14 14:28:27 +00:00
{% macro emoji_btn(textarea_id, previous_modal) %}
2023-10-27 08:09:07 +00:00
<button type="button" class="btn btn-secondary format m-0 mr-1" data-nonce="{{g.nonce}}" data-onclick="openEmojiModal(this, '{{textarea_id}}')" data-bs-toggle="modal" data-bs-target="#emojiModal" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Add Emoji" {% if previous_modal %}data-previous-modal="{{previous_modal}}"{% endif %}>
2023-10-05 11:20:05 +00:00
<i class="fas fa-smile-beam"></i>
</button>
{% endmacro %}
2023-10-06 14:57:11 +00:00
{% macro gif_btn(textarea_id, previous_modal) %}
<button type="button" class="btn btn-secondary format m-0 mr-1 font-weight-bolder text-uppercase" data-nonce="{{g.nonce}}" data-onclick="show_gif_categories(this, '{{textarea_id}}')" data-bs-toggle="modal" data-bs-target="#gifModal" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Add GIF" {% if previous_modal %}data-previous-modal="{{previous_modal}}"{% endif %}>GIF</button>
{% endmacro %}
2023-08-14 14:28:27 +00:00
2023-10-05 11:11:03 +00:00
{% macro file_btn(input_id, disabled, image_only) %}
<label class="btn btn-secondary format m-0" for="{{input_id}}" {% if g.is_tor or disabled %}disabled{% endif %}>
2023-10-05 12:40:03 +00:00
<span class="fas fa-{% if image_only %}image{% else %}file{% endif %}"></span>
<input autocomplete="off" id="{{input_id}}" accept="image/*{% if not image_only %}, video/*, audio/*{% endif %}" type="file" multiple="multiple" name="file" {% if g.is_tor or disabled %}disabled{% endif %} hidden>
</label>
2023-02-27 15:02:35 +00:00
{% endmacro %}
2023-08-14 14:28:27 +00:00
{% macro comment_reply_box(target_fullname, html_id, wrapper_css_classes="", subwrapper_css_classes="", hide="", enable_cancel_button=true) %}
<div class="comment-box-wrapper{% if wrapper_css_classes %} {{wrapper_css_classes}}{% endif %}" id="{{html_id}}">
{% if v %}
<div id="comment-form-space-{{target_fullname}}" class="comment-write {{subwrapper_css_classes}}">
2023-01-24 05:10:16 +00:00
<input hidden name="formkey" value="{{v|formkey}}">
<input hidden name="parent_fullname" value="{target_fullname}}">
<textarea required autocomplete="off" {% if not (p and p.id in ADMIGGER_THREADS) %}{% if v.longpost %}minlength="280"{% elif v.bird %}maxlength="140"{% endif %}{% endif %} minlength="1" maxlength="10000" data-preview="form-preview-{{target_fullname}}" data-nonce="{{g.nonce}}" data-oninput="markdown(this);charLimit('reply-form-body-{{target_fullname}}','charcount-{{target_fullname}}');handle_disabled(this)" id="reply-form-body-{{target_fullname}}" data-fullname="{{target_fullname}}" class="file-ta comment-box form-control rounded" name="body" form="reply-to-{{target_fullname}}" placeholder="Add your comment..." rows="3"></textarea>
2022-12-30 16:56:16 +00:00
2023-09-15 11:01:04 +00:00
<div class="text-small font-weight-bold mt-1" id="charcount-{{target_fullname}}" style="right: 1rem; bottom: 0.5rem; z-index: 3"></div>
2022-12-30 16:56:16 +00:00
2023-10-05 14:57:22 +00:00
<div class="format-btns">
{{emoji_btn('reply-form-body-' ~ target_fullname)}}
{{gif_btn('reply-form-body-' ~ target_fullname)}}
{{file_btn('file-upload-reply-' ~ target_fullname)}}
</div>
2023-02-27 15:02:35 +00:00
<button type="button" id="save-reply-to-{{target_fullname}}" form="reply-to-{{target_fullname}}" class="btn btn-primary text-whitebtn ml-auto fl-r handle_disabled disabled" disabled data-nonce="{{g.nonce}}" data-onclick="post_comment('{{target_fullname}}', '{{hide}}')">Comment</button>
2023-02-27 17:25:38 +00:00
2022-12-30 16:56:16 +00:00
{% if enable_cancel_button %}
<button type="button" data-nonce="{{g.nonce}}" data-onclick="cancel('{{target_fullname}}')" class="btn btn-link text-muted ml-auto fl-r mr-3">Cancel</button>
2022-12-30 16:56:16 +00:00
{% endif %}
2023-02-27 17:25:38 +00:00
<span id="upload-prog-{{target_fullname}}" class="d-none mt-1 mr-2 fl-r">
<progress max="100"></progress>
<span></span>
</span>
<div id="form-preview-{{target_fullname}}" class="preview mb-3 mt-5"></div>
<div class="form-text text-small p-0 m-0"><a href="/formatting" data-target="t" target="_blank">Formatting help</a></div>
</div>
{% else %}
2022-12-10 15:25:34 +00:00
<div class="comment-write mt-4 mb-3 mx-3">
2022-12-30 12:14:18 +00:00
<textarea autocomplete="off" maxlength="10000" class="comment-box form-control rounded" name="body" placeholder="Add your comment..." rows="3" data-href="/login?redirect={{request.full_path | urlencode}}"></textarea>
</div>
2023-01-01 11:36:20 +00:00
<div class="card border-0 mt-4">
<div class="card-body">
<h5 class="card-title">Jump in the discussion.</h5>
<p class="card-text">No email address required.</p>
<div>
<a href="/signup?redirect={{request.full_path | urlencode}}" class="btn btn-primary">Sign up</a>
<a href="/login?redirect={{request.full_path | urlencode}}" class="btn btn-link text-muted">Sign in</a>
</div>
</div>
</div>
{% endif %}
</div>
{% endmacro %}
{% macro ghost_box(text1, text2, mode, extra_css) %}
2023-09-29 03:20:48 +00:00
{% if mode == 1 %}
<div id="ghost-town-box" class="text-center p-6"{% if extra_css %} style="{{extra_css}}"{% endif %}>
<span class="fa-stack fa-2x text-muted mb-4">
<i class="fas fa-square text-gray-500 opacity-25 fa-stack-2x"></i>
<i class="fas text-gray-500 fa-ghost fa-stack-1x text-lg"></i>
</span>
{% if text1 %}
<h5>{{text1|safe}}</h5>
<p></p>
{% endif %}
{% if text2 %}
<p class="text-muted">{{text2|safe}}</p>
{% endif %}
</div>
{% elif mode == 2 %}
<div id="ghost-town-box" class="text-center border-md rounded p-6"{% if extra_css %} style="{{extra_css}}"{% endif %}>
<i class="fas fa-ghost text-gray-500 mb-3" style="font-size: 3.5rem"></i>
<p class="font-weight-bold text-gray-500 mb-0">{{text1|safe}}</p>
</div>
{% endif %}
{% endmacro %}
{% macro alert(msg, error=false) %}
2023-10-29 12:51:00 +00:00
<div class="alert {% if error %}alert-danger{% else %}alert-success{% endif %} alert-dismissible fade show mb-3 mt-4">
<i class="fas {% if error %}fa-exclamation-circle{% else %}fa-check-circle{% endif %} my-auto"></i>
<span>{{msg}}</span>
<button type="button" class="close" data-bs-dismiss="alert">
<span><i class="fas fa-times"></i></span>
</button>
</div>
{% endmacro %}
2023-06-23 16:49:23 +00:00
{% macro reports(i, kind) %}
2023-10-29 12:51:00 +00:00
{% if i.active_reports(v) %}
<div id="reports-{{i.id}}" class="reports d-none">
<strong><i class="far fa-fw fa-flag"></i> Reported by:</strong>
<ul class="mt-1 mb-0" style="padding-left:20px;word-wrap:break-word">
{% for r in i.filtered_reports(v) %}
<li>
2024-01-12 06:24:05 +00:00
{% with user = r.user %}
{%- include 'admin/shadowbanned_tooltip.html' -%}
{% endwith %}
2023-10-29 12:51:00 +00:00
<a style="font-weight:bold" href="{{r.user.url}}">{{r.user.username}}</a>
{% if r.reason %}: {{r.realreason(v) | safe}}{% endif %}
2024-01-31 21:14:20 +00:00
{% if v and (v.id == r.user_id or v.admin_level >= PERMS['REPORTS_REMOVE']) %}
2023-10-29 12:51:00 +00:00
<button type="button" data-nonce="{{g.nonce}}" data-onclick="delReport(this,'/del_report/{{kind}}/{{r.parent_id}}/{{r.user_id}}')">[remove]</button>
{% endif %}
</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% endmacro %}
Bring back orgies (watchparties), now controllable by admins, and generally better in all ways (#165) This PR adds orgies back into rdrama. Long ago, snakes made the original orgy code, and it was super fun. But he had to rush it out, and ended up making it a bit unsustainable, and had a couple questionable coding decisions, which meant that it had to be removed. Hey, the man literally did it in a few hours before the DB trial continued, lmao. Anyways, I took my own approach to it. I do not use iframes, i just just repurpose code from /chat window. Because I had that freedom, I also moved things around to make the user experience a bit better. I also added a title to give users some context about what's happening. Check it out ![image](/attachments/6719146c-4922-4d75-967d-8d424a09b198) Most importantly, this is all configurable from the site. Admins with the permission "ORGIES" will see this in their control panel ![image](/attachments/423d6046-a11d-4e84-bd2c-a2a641afd552) Nigga, idk where to put it, so I made my own category. If there is no orgy in progress, admins will see this: ![image](/attachments/7c64b9fa-cdf4-4986-a0c4-f2324878062e) Click the button, and, viola, the orgy begins. If there is an orgy in progress, the page will look like this: ![image](/attachments/b65be4b3-5db1-43cb-8857-7d3a8ea24ca7) Click the button, and the orgy stops. If an orgy is in progress, navigating to /chat will take the user to the orgy seemlessly. But what if they don't want to participate, liek some kind of spoilsport? Just navigate to /old_chat. That's just about it, it's really that simple. I have lots of ideas for the future, but I'll let that wait til later :). A few notes about implementation: - I moved some functionality out of /templates/chat.html and into /templates/util/macros.html. This is just so I could reference the code directly from my new template, /templates/orgy.html. - The orgy is stored as a single row in the new table "orgies". Okay, I know this is a little silly, but you know what they say: "if it's stupid and it works, it's not stupid". (tbf the oceangate ceo also said that) Co-authored-by: Chuck Sneed <sneed@formerlychucks.net> Reviewed-on: https://fsdfsd.net/rDrama/rDrama/pulls/165 Co-authored-by: HeyMoon <heymoon@noreply.fsdfsd.net> Co-committed-by: HeyMoon <heymoon@noreply.fsdfsd.net>
2023-07-02 23:55:37 +00:00
{% macro chat_users_online() %}
2023-10-29 12:51:00 +00:00
<div class="border-right pb-1 px-3">
<span id="online2" data-bs-html="true" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Users Online" class="text-muted">
<i class="fas fa-user fa-sm mr-1"></i>
<span class="board-chat-count">0</span>
</span>
</div>
Bring back orgies (watchparties), now controllable by admins, and generally better in all ways (#165) This PR adds orgies back into rdrama. Long ago, snakes made the original orgy code, and it was super fun. But he had to rush it out, and ended up making it a bit unsustainable, and had a couple questionable coding decisions, which meant that it had to be removed. Hey, the man literally did it in a few hours before the DB trial continued, lmao. Anyways, I took my own approach to it. I do not use iframes, i just just repurpose code from /chat window. Because I had that freedom, I also moved things around to make the user experience a bit better. I also added a title to give users some context about what's happening. Check it out ![image](/attachments/6719146c-4922-4d75-967d-8d424a09b198) Most importantly, this is all configurable from the site. Admins with the permission "ORGIES" will see this in their control panel ![image](/attachments/423d6046-a11d-4e84-bd2c-a2a641afd552) Nigga, idk where to put it, so I made my own category. If there is no orgy in progress, admins will see this: ![image](/attachments/7c64b9fa-cdf4-4986-a0c4-f2324878062e) Click the button, and, viola, the orgy begins. If there is an orgy in progress, the page will look like this: ![image](/attachments/b65be4b3-5db1-43cb-8857-7d3a8ea24ca7) Click the button, and the orgy stops. If an orgy is in progress, navigating to /chat will take the user to the orgy seemlessly. But what if they don't want to participate, liek some kind of spoilsport? Just navigate to /old_chat. That's just about it, it's really that simple. I have lots of ideas for the future, but I'll let that wait til later :). A few notes about implementation: - I moved some functionality out of /templates/chat.html and into /templates/util/macros.html. This is just so I could reference the code directly from my new template, /templates/orgy.html. - The orgy is stored as a single row in the new table "orgies". Okay, I know this is a little silly, but you know what they say: "if it's stupid and it works, it's not stupid". (tbf the oceangate ceo also said that) Co-authored-by: Chuck Sneed <sneed@formerlychucks.net> Reviewed-on: https://fsdfsd.net/rDrama/rDrama/pulls/165 Co-authored-by: HeyMoon <heymoon@noreply.fsdfsd.net> Co-committed-by: HeyMoon <heymoon@noreply.fsdfsd.net>
2023-07-02 23:55:37 +00:00
{% endmacro %}
{% macro chat_group_template(id, m) %}
2023-08-01 07:38:30 +00:00
<div class="chat-group">
2023-08-14 12:26:42 +00:00
<a class="font-weight-bold userlink" target="_blank" {% if m %}style="color:#{{m.namecolor}}" href="/@{{m.username}}" {% endif %}>
<div class="avatar profile-pic-20-wrapper mr-1">
<img loading="lazy" class="avatar-pic pp20 mr-1" {% if m %}src="/pp/{{m.user_id}}"{% endif %}>
<img class="avatar-hat profile-pic-20-hat hat" loading="lazy" {% if m %}src="{{m.hat}}"{% endif %}>
</div>
2023-10-26 19:16:27 +00:00
<span {% if m and m.patron %}class="username patron" style="background-color:#{{m.namecolor}}"{% else %}class="username"{% endif %} {% if m and m.pride_username %}pride_username{% endif %}>{% if m %}{{m.username}}{% endif %}</span>
2023-08-14 12:26:42 +00:00
</a>
<span class="text-black time ml-1 mb-3 text-center" {% if m %}data-time="{{m.time}}"{% endif %}></span>
2023-08-09 15:19:32 +00:00
<input hidden class="user_id" {% if m %}value="{{m.user_id}}"{% endif %}>
Bring back orgies (watchparties), now controllable by admins, and generally better in all ways (#165) This PR adds orgies back into rdrama. Long ago, snakes made the original orgy code, and it was super fun. But he had to rush it out, and ended up making it a bit unsustainable, and had a couple questionable coding decisions, which meant that it had to be removed. Hey, the man literally did it in a few hours before the DB trial continued, lmao. Anyways, I took my own approach to it. I do not use iframes, i just just repurpose code from /chat window. Because I had that freedom, I also moved things around to make the user experience a bit better. I also added a title to give users some context about what's happening. Check it out ![image](/attachments/6719146c-4922-4d75-967d-8d424a09b198) Most importantly, this is all configurable from the site. Admins with the permission "ORGIES" will see this in their control panel ![image](/attachments/423d6046-a11d-4e84-bd2c-a2a641afd552) Nigga, idk where to put it, so I made my own category. If there is no orgy in progress, admins will see this: ![image](/attachments/7c64b9fa-cdf4-4986-a0c4-f2324878062e) Click the button, and, viola, the orgy begins. If there is an orgy in progress, the page will look like this: ![image](/attachments/b65be4b3-5db1-43cb-8857-7d3a8ea24ca7) Click the button, and the orgy stops. If an orgy is in progress, navigating to /chat will take the user to the orgy seemlessly. But what if they don't want to participate, liek some kind of spoilsport? Just navigate to /old_chat. That's just about it, it's really that simple. I have lots of ideas for the future, but I'll let that wait til later :). A few notes about implementation: - I moved some functionality out of /templates/chat.html and into /templates/util/macros.html. This is just so I could reference the code directly from my new template, /templates/orgy.html. - The orgy is stored as a single row in the new table "orgies". Okay, I know this is a little silly, but you know what they say: "if it's stupid and it works, it's not stupid". (tbf the oceangate ceo also said that) Co-authored-by: Chuck Sneed <sneed@formerlychucks.net> Reviewed-on: https://fsdfsd.net/rDrama/rDrama/pulls/165 Co-authored-by: HeyMoon <heymoon@noreply.fsdfsd.net> Co-committed-by: HeyMoon <heymoon@noreply.fsdfsd.net>
2023-07-02 23:55:37 +00:00
{% endmacro %}
{% macro chat_line_template(id, m, vlink) %}
2023-08-09 15:19:32 +00:00
{% set quote_exists = m and m.quotes and messages.get(m.quotes) %}
{% set mentioned = m and vlink in m.text_html or (quote_exists and messages[m.quotes].user_id == v.id) %}
2023-08-01 07:38:30 +00:00
<div class="chat-line {% if mentioned %}chat-mention{% endif %}" {% if m %}id="{{id}}"{% endif %}>
<div class="d-flex align-items-center">
<div class="text-muted chat-line-content">
2023-08-09 15:19:32 +00:00
<div class="{% if not (m and m.quotes) %}d-none{% endif %} quotes" style="font-size:12px">
<a class="QuotedMessageLink" {% if m and m.quotes %}href="#{{m.quotes}}"{% endif %}>
2023-09-07 15:26:31 +00:00
<i class="fas fa-reply"></i>
2023-08-01 07:38:30 +00:00
<span class="text-primary">@<span class="QuotedUser">
{%- if quote_exists -%}
2023-08-09 15:19:32 +00:00
{{messages[m.quotes].username}}
2023-08-01 07:38:30 +00:00
{%- endif -%}
2023-09-07 15:26:31 +00:00
</span></span>:
2023-08-01 07:38:30 +00:00
<em class="QuotedMessage text-break">
{%- if quote_exists -%}
{%- if v.slurreplacer -%}
2023-08-09 15:19:32 +00:00
{{messages[m.quotes].text_censored}}
{%- else -%}
2023-08-09 15:19:32 +00:00
{{messages[m.quotes].text}}
{%- endif -%}
2023-08-01 07:38:30 +00:00
{%- endif -%}
</em>
</a>
</div>
<div class="d-flex">
<span class="chat-message text-black text-break">
{% if m %}
{% if v.slurreplacer %}
2023-08-09 15:19:32 +00:00
{{m.text_html_censored | safe}}
2023-08-01 07:38:30 +00:00
{% else %}
2023-08-09 15:19:32 +00:00
{{m.text_html | safe}}
2023-08-01 07:38:30 +00:00
{% endif %}
{% endif %}
</span>
<span class="text d-none">
{%- if m -%}
2023-08-01 07:38:30 +00:00
{%- if v.slurreplacer -%}
2023-08-09 15:19:32 +00:00
{{m.text_censored}}
2023-08-01 07:38:30 +00:00
{%- else -%}
2023-08-09 15:19:32 +00:00
{{m.text}}
2023-08-01 07:38:30 +00:00
{%- endif -%}
{%- endif -%}
</span>
2023-08-01 07:38:30 +00:00
<i class="quote btn fas fa-reply ml-auto" data-nonce="{{g.nonce}}" data-onclick="quote(this)"></i>
2023-08-09 15:19:32 +00:00
{% if v.admin_level >= PERMS.POST_COMMENT_MODERATION %}
2023-08-01 07:38:30 +00:00
<i class="btn del delconfirm fas fa-trash-alt"></i>
<i class="btn d-none del delmsg fas fa-trash-alt text-danger" data-nonce="{{g.nonce}}" data-onclick="del(this)"></i>
{% endif %}
</div>
</div>
</div>
</div>
Bring back orgies (watchparties), now controllable by admins, and generally better in all ways (#165) This PR adds orgies back into rdrama. Long ago, snakes made the original orgy code, and it was super fun. But he had to rush it out, and ended up making it a bit unsustainable, and had a couple questionable coding decisions, which meant that it had to be removed. Hey, the man literally did it in a few hours before the DB trial continued, lmao. Anyways, I took my own approach to it. I do not use iframes, i just just repurpose code from /chat window. Because I had that freedom, I also moved things around to make the user experience a bit better. I also added a title to give users some context about what's happening. Check it out ![image](/attachments/6719146c-4922-4d75-967d-8d424a09b198) Most importantly, this is all configurable from the site. Admins with the permission "ORGIES" will see this in their control panel ![image](/attachments/423d6046-a11d-4e84-bd2c-a2a641afd552) Nigga, idk where to put it, so I made my own category. If there is no orgy in progress, admins will see this: ![image](/attachments/7c64b9fa-cdf4-4986-a0c4-f2324878062e) Click the button, and, viola, the orgy begins. If there is an orgy in progress, the page will look like this: ![image](/attachments/b65be4b3-5db1-43cb-8857-7d3a8ea24ca7) Click the button, and the orgy stops. If an orgy is in progress, navigating to /chat will take the user to the orgy seemlessly. But what if they don't want to participate, liek some kind of spoilsport? Just navigate to /old_chat. That's just about it, it's really that simple. I have lots of ideas for the future, but I'll let that wait til later :). A few notes about implementation: - I moved some functionality out of /templates/chat.html and into /templates/util/macros.html. This is just so I could reference the code directly from my new template, /templates/orgy.html. - The orgy is stored as a single row in the new table "orgies". Okay, I know this is a little silly, but you know what they say: "if it's stupid and it works, it's not stupid". (tbf the oceangate ceo also said that) Co-authored-by: Chuck Sneed <sneed@formerlychucks.net> Reviewed-on: https://fsdfsd.net/rDrama/rDrama/pulls/165 Co-authored-by: HeyMoon <heymoon@noreply.fsdfsd.net> Co-committed-by: HeyMoon <heymoon@noreply.fsdfsd.net>
2023-07-02 23:55:37 +00:00
{% endmacro %}
{% macro chat_window(vlink)%}
2023-10-29 12:51:00 +00:00
<div id="shrink">
<div id="chat-window" class="container p-0">
{% set messages_list = messages.items()|list %}
{% for id, m in messages_list %}
{% set same = loop.index > 1 and m.user_id == messages_list[loop.index-2][1].user_id %}
{% if not same %}
{% if loop.index > 1 %}
</div>
{% endif %}
{{chat_group_template(id, m)}}
2023-08-01 07:38:30 +00:00
{% endif %}
2023-10-29 12:51:00 +00:00
{{chat_line_template(id, m, vlink)}}
{% endfor %}
</div>
2023-08-01 07:38:30 +00:00
</div>
2023-10-29 12:51:00 +00:00
<div class="mt-3"></div>
<div id="quotes" class="mt-3 ml-3 mb-2 d-none" style="font-size:12px">
<a id="QuotedMessageLink">
<i class="fas fa-reply"></i> <span class="text-primary">@<span id="QuotedUser"></span></span>: <em id="QuotedMessage"></em>
</a>
<button type="button" id="cancel" class="btn btn-secondary">Cancel</button>
<input hidden id="quotes_id">
2023-08-01 07:38:30 +00:00
</div>
2023-10-29 12:51:00 +00:00
<div id='message' class="position-relative form-group d-flex">
<div class="position-absolute text-muted text-small ml-1" style="bottom: -1.5rem; line-height: 1">
<span id="typing-indicator"></span>
</div>
2023-08-01 07:38:30 +00:00
2023-10-29 12:51:00 +00:00
{{emoji_btn('input-text-chat')}}
{{gif_btn('input-text-chat')}}
{{file_btn('file', False, True)}}
2023-08-01 07:38:30 +00:00
2023-10-29 12:51:00 +00:00
<textarea id="input-text-chat" minlength="1" maxlength="{% if SITE == 'rdrama.net' %}200{% else %}1000{% endif %}" {% if g.browser in ("iphone","mac") %}style="font-size:16px!important"{% endif %} class="file-ta form-control ml-2" placeholder="Message" autocomplete="off" autofocus rows="1"></textarea>
<i id="chatsend" data-nonce="{{g.nonce}}" data-onclick="send()" class="btn btn-secondary fas fa-reply ml-1 my-auto" style="transform:rotateY(180deg)"></i>
</div>
<div id="ghostdiv-chat" class="ghostdiv" style="display: none"><span></span></div>
2023-08-01 07:38:30 +00:00
</div>
Bring back orgies (watchparties), now controllable by admins, and generally better in all ways (#165) This PR adds orgies back into rdrama. Long ago, snakes made the original orgy code, and it was super fun. But he had to rush it out, and ended up making it a bit unsustainable, and had a couple questionable coding decisions, which meant that it had to be removed. Hey, the man literally did it in a few hours before the DB trial continued, lmao. Anyways, I took my own approach to it. I do not use iframes, i just just repurpose code from /chat window. Because I had that freedom, I also moved things around to make the user experience a bit better. I also added a title to give users some context about what's happening. Check it out ![image](/attachments/6719146c-4922-4d75-967d-8d424a09b198) Most importantly, this is all configurable from the site. Admins with the permission "ORGIES" will see this in their control panel ![image](/attachments/423d6046-a11d-4e84-bd2c-a2a641afd552) Nigga, idk where to put it, so I made my own category. If there is no orgy in progress, admins will see this: ![image](/attachments/7c64b9fa-cdf4-4986-a0c4-f2324878062e) Click the button, and, viola, the orgy begins. If there is an orgy in progress, the page will look like this: ![image](/attachments/b65be4b3-5db1-43cb-8857-7d3a8ea24ca7) Click the button, and the orgy stops. If an orgy is in progress, navigating to /chat will take the user to the orgy seemlessly. But what if they don't want to participate, liek some kind of spoilsport? Just navigate to /old_chat. That's just about it, it's really that simple. I have lots of ideas for the future, but I'll let that wait til later :). A few notes about implementation: - I moved some functionality out of /templates/chat.html and into /templates/util/macros.html. This is just so I could reference the code directly from my new template, /templates/orgy.html. - The orgy is stored as a single row in the new table "orgies". Okay, I know this is a little silly, but you know what they say: "if it's stupid and it works, it's not stupid". (tbf the oceangate ceo also said that) Co-authored-by: Chuck Sneed <sneed@formerlychucks.net> Reviewed-on: https://fsdfsd.net/rDrama/rDrama/pulls/165 Co-authored-by: HeyMoon <heymoon@noreply.fsdfsd.net> Co-committed-by: HeyMoon <heymoon@noreply.fsdfsd.net>
2023-07-02 23:55:37 +00:00
{% endmacro %}
{% macro chat_users_list() %}
2023-08-23 23:50:18 +00:00
<div class="col text-left d-none d-lg-block pt-3 pb-5" style="max-width:300px">
2023-08-01 07:38:30 +00:00
<h5>Users Online</h5>
<div id="online" class="mt-3"></div>
</div>
{% endmacro %}
2023-09-05 14:32:36 +00:00
{% macro time_filter_buttons() %}
<div class="dropdown dropdown-actions mr-2">
<button type="button" class="btn btn-secondary dropdown-toggle" id="dropdownMenuButton" data-bs-toggle="dropdown">
<i class="fas fa-{{TIME_FILTERS[t]}} mr-2"></i>
{{t | capitalize}}
</button>
2023-09-15 11:01:04 +00:00
<div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px">
2023-09-05 14:32:36 +00:00
{% for new_time, icon in TIME_FILTERS.items() %}
{% if t != new_time %}
<a class="dropdown-item" href="{{'t'|change_arg(new_time, request.full_path)|safe}}">
<i class="fas fa-{{icon}} mr-2"></i>
{{new_time | capitalize}}
</a>
{% endif %}
{% endfor %}
</div>
</div>
{% endmacro %}
{% macro sorting_buttons(sorts, hot_allowed) %}
2023-09-05 14:32:36 +00:00
<div class="dropdown dropdown-actions">
<button type="button" class="btn btn-secondary dropdown-toggle" id="dropdownMenuButton2" data-bs-toggle="dropdown">
<i class="fas fa-{{sorts[sort]}} mr-1"></i>
{{sort | capitalize}}
</button>
2023-09-15 11:01:04 +00:00
<div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: transform; top: 0px; left: 0px">
{% set sorts = sorts.items()|list %}
{% if not hot_allowed %}
{% set sorts = sorts[1:] %}
{% endif %}
{% for new_sort, icon in sorts %}
2023-09-05 14:32:36 +00:00
{% if sort != new_sort %}
<a class="dropdown-item" href="{{'sort'|change_arg(new_sort, request.full_path)|safe}}">
<i class="fas fa-{{icon}} mr-2"></i>
{{new_sort | capitalize}}
</a>
{% endif %}
{% endfor %}
</div>
</div>
{% endmacro %}