diff --git a/files/assets/css/main.css b/files/assets/css/main.css
index 694f0112e2..bc5e963bc1 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 0000000000..d492774081
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 3661de299f..47cfc432d6 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 51810b245c..ae3418f21f 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 0000000000..32cd3ed728
--- /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 860b09cbe6..c5450d4aff 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 7ea66099b3..761305c234 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') %}
-
- Found {{c.treasure_amount.replace('l', '')}} Lottershe Tickets!
+
+
+ Found {{c.treasure_amount.replace('l', '')}} Lottershe Tickets!
+
{% elif '-' in c.treasure_amount %}
-
- A Mimic Ate {{c.treasure_amount.replace('-', '')}} Coins!
+
+
+ A Mimic Ate {{c.treasure_amount.replace('-', '')}} Coins!
+
{% else %}
-
- Found {{c.treasure_amount}} Coins!
+
+
+ Found {{c.treasure_amount}} Coins!
+
{% endif %}
{% endif %}
diff --git a/files/templates/formatting.html b/files/templates/formatting.html
index 70aedc2006..24accb0d2e 100644
--- a/files/templates/formatting.html
+++ b/files/templates/formatting.html
@@ -5,7 +5,7 @@
Name | @@ -237,7 +237,7 @@ And we allow custom HTML in most places:
---|
Name | @@ -626,4 +626,12 @@ line breaks
---|
The beheadings of Louisa Vesterager Jespersen and Maren Ueland
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)
diff --git a/schema.sql b/schema.sql index 19d86b1829..a071e4610f 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 ae9604c060..54d7d1bc53 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 bc06e5482d..a2613de6f6 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