diff --git a/files/assets/css/main.css b/files/assets/css/main.css index 694f0112e..bc5e963bc 100644 --- a/files/assets/css/main.css +++ b/files/assets/css/main.css @@ -3014,9 +3014,6 @@ pre { a.dropdown-toggle:hover { text-decoration: none; } -.comment-text ul li ul { - padding-left: 0; -} ul.no-bullets { list-style-type: none; } diff --git a/files/assets/images/rDrama/sidebar/926.webp b/files/assets/images/rDrama/sidebar/926.webp new file mode 100644 index 000000000..d49277408 Binary files /dev/null and b/files/assets/images/rDrama/sidebar/926.webp differ diff --git a/files/assets/js/chat.js b/files/assets/js/chat.js index 3661de299..47cfc432d 100644 --- a/files/assets/js/chat.js +++ b/files/assets/js/chat.js @@ -196,6 +196,7 @@ textbox.addEventListener("keyup", function(e) { socket.on('online', function(data){ document.getElementsByClassName('board-chat-count')[0].innerHTML = data[0].length + document.getElementById('chat-count-header-bar').innerHTML = data[0].length const admin_level = parseInt(document.getElementById('admin_level').value) let online = '' let online2 = 'Users Online' diff --git a/files/assets/js/emoji_modal.js b/files/assets/js/emoji_modal.js index 51810b245..ae3418f21 100644 --- a/files/assets/js/emoji_modal.js +++ b/files/assets/js/emoji_modal.js @@ -444,7 +444,9 @@ function populate_speed_emoji_modal(results, textbox) speed_carot_modal.style.display = "none"; textbox.value = textbox.value.replace(new RegExp(current_word+"(?=\\s|$)", "g"), `:${result}:`) textbox.focus() - markdown(textbox) + if (document.location.pathname != '/chat'){ + markdown(textbox) + } }); // Pack emoji_option.appendChild(emoji_option_img); diff --git a/files/assets/js/formatting.js b/files/assets/js/formatting.js new file mode 100644 index 000000000..32cd3ed72 --- /dev/null +++ b/files/assets/js/formatting.js @@ -0,0 +1,37 @@ + +/* addFormattingCopyButtons(): creates a button in the first column of each row of a table + that copies the text in the second column of that row */ +function addFormattingCopyButtons() { + var allTablesGenerateCopyButtons = document.getElementsByClassName('generate-copy-buttons') + + for (let table = 0; table < allTablesGenerateCopyButtons.length; table++) { + + if(allTablesGenerateCopyButtons[table].tagName != 'TABLE') { + continue; + } + + for (var i = 1, row; row = allTablesGenerateCopyButtons[table].rows[i]; i++) { + + let textCopyButton = document.createElement("button"); + textCopyButton.setAttribute("type", "button"); + textCopyButton.className = "btn caction py-0 nobackground px-1 text-muted copy-link"; + + /* replace HTML newlines with text newlines */ + var cleanedText = row.cells[1].cloneNode(true) + cleanedText.innerHTML = cleanedText.innerHTML.replace(/
/gi, "\n") + /* remove lots of extraneous tabs */ + cleanedText = cleanedText.textContent.replace(/\t/g,''); + textCopyButton.setAttribute("data-clipboard-text", cleanedText); + + copyIcon = document.createElement("i"); + copyIcon.className = "fas fa-copy"; + + textCopyButton.insertAdjacentElement('afterbegin', copyIcon) + row.cells[0].appendChild(textCopyButton); + } + } + + +} + +addFormattingCopyButtons(); diff --git a/files/routes/chat.py b/files/routes/chat.py index 860b09cbe..c5450d4af 100644 --- a/files/routes/chat.py +++ b/files/routes/chat.py @@ -3,6 +3,7 @@ import time import uuid from flask_socketio import SocketIO, emit +from flask import request from files.helpers.actions import * from files.helpers.alerts import * @@ -22,6 +23,7 @@ socketio = SocketIO( typing = [] online = [] +sessions = [] cache.set(CHAT_ONLINE_CACHE_KEY, len(online), timeout=0) muted = cache.get(f'muted') or {} messages = cache.get(f'messages') or {} @@ -132,6 +134,13 @@ def refresh_online(): @admin_level_required(PERMS['CHAT']) def connect(v): + if any(v.id in session for session in sessions) and [v.username, v.id, v.name_color] not in online: + # user has previous running sessions with a different username or name_color + for chat_user in online: + if(v.id == chat_user[1]): + online.remove(chat_user) + + sessions.append([v.id, request.sid]) if [v.username, v.id, v.name_color] not in online: online.append([v.username, v.id, v.name_color]) @@ -143,13 +152,20 @@ def connect(v): @socketio.on('disconnect') @admin_level_required(PERMS['CHAT']) def disconnect(v): - if [v.username, v.id, v.name_color] in online: - online.remove([v.username, v.id, v.name_color]) - refresh_online() + if ([v.id, request.sid]) in sessions: + sessions.remove([v.id, request.sid]) + if any(v.id in session for session in sessions): + # user has other running sessions + return '', 204 + + for chat_user in online: + if(v.id == chat_user[1]): + online.remove(chat_user) + if chat_user[0] in typing: + typing.remove(chat_user[0]) + + refresh_online() - if v.username in typing: - typing.remove(v.username) - return '', 204 @socketio.on('typing') diff --git a/files/templates/comments.html b/files/templates/comments.html index 7ea66099b..761305c23 100644 --- a/files/templates/comments.html +++ b/files/templates/comments.html @@ -193,25 +193,31 @@ {% endif %} {% if c.notif_utc %} -  {{c.age_string}} +  {{c.age_string}} {% elif c.created_utc %} -  {{c.age_string}} +  {{c.age_string}} {% endif %} {% if c.edited_utc %} - · Edited {{c.edited_string}} + · Edited {{c.edited_string}} {% endif %} {% if c.treasure_amount and c.treasure_amount != '0' %} {% if c.treasure_amount.startswith('l') %} - treasure - Found {{c.treasure_amount.replace('l', '')}} Lottershe Tickets! + + treasure + Found {{c.treasure_amount.replace('l', '')}} Lottershe Tickets! + {% elif '-' in c.treasure_amount %} - treasure - A Mimic Ate {{c.treasure_amount.replace('-', '')}} Coins! + + treasure + A Mimic Ate {{c.treasure_amount.replace('-', '')}} Coins! + {% else %} - treasure - Found {{c.treasure_amount}} Coins! + + treasure + Found {{c.treasure_amount}} Coins! + {% endif %} {% endif %} diff --git a/files/templates/formatting.html b/files/templates/formatting.html index 70aedc200..24accb0d2 100644 --- a/files/templates/formatting.html +++ b/files/templates/formatting.html @@ -5,7 +5,7 @@
You can use Markdown formatting:
-
+
@@ -237,7 +237,7 @@ And we allow custom HTML in most places:

Allowed Tags

-
Name
+
@@ -626,4 +626,12 @@ line breaks
Name
+
+
+ Text copied to clipboard +
+
+ + + {% endblock %} diff --git a/files/templates/header.html b/files/templates/header.html index d6d17b01c..aac24eca4 100644 --- a/files/templates/header.html +++ b/files/templates/header.html @@ -157,7 +157,7 @@
  • Also no reposts of famous videos (unless you have a more HQ version, have a different POV, or are doing a writeup on it). These are listed below.
  • FAMOUS VIDEOS:

    -

    Ronnie McNutt's suicide

    +

    Ronnie McNutt's suicide

    The Christchurch shooting

    The Buffalo shooting

    The beheadings of Louisa Vesterager Jespersen and Maren Ueland

    Budd Dwyer's live TV suicide

    1444 (Russian man shoots himself on his couch)

    Gary Plauché shoots his son's rapist

    -

    Ms. Pacman (woman with her head split open)

    +

    Ms. Pacman (woman with her head split open)

    The Russian brick video

    Funky Town (cartel flaying+torturing)

    Chechclear

    diff --git a/schema.sql b/schema.sql index 19d86b182..a071e4610 100644 --- a/schema.sql +++ b/schema.sql @@ -2,7 +2,7 @@ -- PostgreSQL database dump -- --- Dumped from database version 14.5 +-- Dumped from database version 14.6 -- Dumped by pg_dump version 14.6 (Ubuntu 14.6-1.pgdg20.04+1) SET statement_timeout = 0; diff --git a/seed-db.sql b/seed-db.sql index ae9604c06..54d7d1bc5 100644 --- a/seed-db.sql +++ b/seed-db.sql @@ -25,7 +25,7 @@ INSERT INTO public.users ( -- PostgreSQL database dump -- --- Dumped from database version 14.5 +-- Dumped from database version 14.6 -- Dumped by pg_dump version 14.6 (Ubuntu 14.6-1.pgdg20.04+1) SET statement_timeout = 0; @@ -231,7 +231,7 @@ SELECT pg_catalog.setval('public.badge_defs_id_seq', 230, true); -- PostgreSQL database dump -- --- Dumped from database version 14.5 +-- Dumped from database version 14.6 -- Dumped by pg_dump version 14.6 (Ubuntu 14.6-1.pgdg20.04+1) SET statement_timeout = 0; diff --git a/snappy_rDrama.txt b/snappy_rDrama.txt index bc06e5482..a2613de6f 100644 --- a/snappy_rDrama.txt +++ b/snappy_rDrama.txt @@ -3384,3 +3384,12 @@ Woman have to be literally perfect or be condemned to stripped of their last nam They have totally forsaken any level of introspection and understanding because it would be politically inconvenient, they want to live within a simplistic world of good and evil with all grey causing a mental breakdown. They're complete mongrels of the soul, choosing to refuse anything which could allow for emotional development because it would be mildly uncomfortable. {[para]} ![](/images/16758166234569614.webp) + +{[para]} +![](/images/16763687631229467.webp) +{[para]} +Hehehe you think you've escaped... But then you stumble upon a random interracial commercial (like all of them are 🤣) and BOOM your thoughts go right there! To that tasty BBC he must have 😏 in second you are feeding yourself porn and end up cumming like a fountain 🖤🤍 BBC WINS! +{[para]} +Kill Soren. Behead Soren. Roundhouse kick Soren into the concrete. Slam dunk a baby Soren into the trashcan. Crucify filthy Soren. Defecate in Soren's food. Launch Soren into the sun. Stir fry Soren in a wok. Toss Soren into active volcanoes. Urinate into Soren's gas tank. Judo throw Soren into a wood chipper. Twist Soren's head off. Report Soren to the IRS. Karate chop Soren in half. Curb stomp pregnant Soren. Trap Soren in quicksand. Crush Soren in the trash compactor. Liquify Soren in a vat of acid. Eat Soren. Dissect Soren. Exterminate Soren in the gas chamber. Stomp Soren's skull with steel toed boots. Cremate Soren in the oven. Lobotomize Soren. Mandatory abortions for Soren. Grind Soren fetuses in the garbage disposal. Drown Soren in fried chicken grease. Vaporize Soren with a ray gun. Kick old Soren down the stairs. Feed Soren to alligators. Slice Soren with a katana. +{[para]} +https://rdrama.net/videos/16766137166070707.mov \ No newline at end of file