Merge branch 'master' of https://fsdfsd.net/rDrama/rDrama into rDrama-master

pull/205/head^2
Chuck 2023-09-22 21:28:06 -07:00
commit b76037b8d5
93 changed files with 4564 additions and 2696 deletions

View File

@ -7745,7 +7745,7 @@ body {
} }
} }
p { /* fix the transform:exploit */ p { /* DO NOT REMOVE */
overflow: hidden !important; overflow: hidden !important;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -171,7 +171,7 @@ function updateBlackjackTable(state) {
if (state.status === 'PLAYING' || (state.has_player_split && state.status_split === 'PLAYING')) { if (state.status === 'PLAYING' || (state.has_player_split && state.status_split === 'PLAYING')) {
updateResult(`${state.wager.amount} ${currency} are at stake`, "success"); updateResult(`${state.has_player_split ? state.wager.amount * 2 : state.wager.amount} ${currency} are at stake`, "success");
} else { } else {
enableWager(); enableWager();
} }

View File

@ -367,3 +367,22 @@ setTimeout(function () {
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
box.scrollTo(0, box.scrollHeight) box.scrollTo(0, box.scrollHeight)
}); });
if (location.pathname == '/orgy') {
const now = new Date();
const day_of_week = now.getUTCDay()
if ([4,5,7].includes(day_of_week)) {
let hour
if (day_of_week == 7) hour = 20
else hour = 0
let millis = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), hour, 0, 10) - now;
if (millis < 0)
millis += 86400000;
const minutes = Math.round(millis/1000/60*10)/10
console.log(`Refreshing page in ${minutes} minutes`)
setTimeout(() => location.reload(), millis);
}
}

View File

@ -38,21 +38,3 @@ orgy_file.addEventListener("timeupdate", function(){
}, 300000); }, 300000);
} }
}); });
const now = new Date();
const now_utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
let millis_00 = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0, 10) - now;
if (millis_00 < 0)
millis_00 += 86400000;
console.log(millis_00/1000/60)
setTimeout(() => location.reload(), millis_00);
let millis_20 = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 20, 0, 10) - now;
if (millis_20 < 0)
millis_20 += 86400000;
console.log(millis_20/1000/60)
setTimeout(() => location.reload(), millis_20);

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,7 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base from files.classes import Base
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.slurs_and_profanities import *
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
from files.helpers.regex import * from files.helpers.regex import *
from files.helpers.sorting_and_time import * from files.helpers.sorting_and_time import *
@ -368,7 +369,7 @@ class Comment(Base):
if body: if body:
if not (self.parent_post and self.post.sub == 'chudrama'): if not (self.parent_post and self.post.sub == 'chudrama'):
body = censor_slurs(body, v) body = censor_slurs_profanities(body, v)
body = normalize_urls_runtime(body, v) body = normalize_urls_runtime(body, v)
@ -384,7 +385,7 @@ class Comment(Base):
if not body: return "" if not body: return ""
if not (self.parent_post and self.post.sub == 'chudrama'): if not (self.parent_post and self.post.sub == 'chudrama'):
body = censor_slurs(body, v) body = censor_slurs_profanities(body, v)
body = replace_train_html(body) body = replace_train_html(body)
return body return body

View File

@ -7,7 +7,7 @@ from flask import g
from files.classes import Base from files.classes import Base
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
from files.helpers.regex import censor_slurs from files.helpers.slurs_and_profanities import censor_slurs_profanities
class HatDef(Base): class HatDef(Base):
__tablename__ = "hat_defs" __tablename__ = "hat_defs"
@ -37,7 +37,7 @@ class HatDef(Base):
@lazy @lazy
def censored_description(self, v): def censored_description(self, v):
return censor_slurs(self.description, v) return censor_slurs_profanities(self.description, v)
@property @property
@lazy @lazy

View File

@ -7,7 +7,7 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base from files.classes import Base
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
from files.helpers.regex import censor_slurs from files.helpers.slurs_and_profanities import censor_slurs_profanities
from files.helpers.sorting_and_time import make_age_string from files.helpers.sorting_and_time import make_age_string
class ModAction(Base): class ModAction(Base):
@ -63,7 +63,7 @@ class ModAction(Base):
if self.target_user_id: if self.target_user_id:
return f'<a href="{self.target_user.url}">@{self.target_user.username}</a>' return f'<a href="{self.target_user.url}">@{self.target_user.username}</a>'
elif self.target_post_id: elif self.target_post_id:
return censor_slurs(f'<a href="{self.target_post.permalink}">{self.target_post.title_html}</a>', None) return censor_slurs_profanities(f'<a href="{self.target_post.permalink}">{self.target_post.title_html}</a>', None)
elif self.target_comment_id: elif self.target_comment_id:
return f'<a href="{self.target_comment.permalink}">comment</a>' return f'<a href="{self.target_comment.permalink}">comment</a>'

View File

@ -9,6 +9,7 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base from files.classes import Base
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.slurs_and_profanities import *
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
from files.helpers.regex import * from files.helpers.regex import *
from files.helpers.sorting_and_time import make_age_string from files.helpers.sorting_and_time import make_age_string
@ -300,7 +301,7 @@ class Post(Base):
body = add_options(self, body, v) body = add_options(self, body, v)
if self.sub != 'chudrama': if self.sub != 'chudrama':
body = censor_slurs(body, v) body = censor_slurs_profanities(body, v)
body = normalize_urls_runtime(body, v) body = normalize_urls_runtime(body, v)
@ -315,7 +316,7 @@ class Post(Base):
if not body: return "" if not body: return ""
if self.sub != 'chudrama': if self.sub != 'chudrama':
body = censor_slurs(body, v) body = censor_slurs_profanities(body, v)
body = replace_train_html(body) body = replace_train_html(body)
body = normalize_urls_runtime(body, v) body = normalize_urls_runtime(body, v)
@ -327,7 +328,7 @@ class Post(Base):
title = self.title_html title = self.title_html
if self.sub != 'chudrama': if self.sub != 'chudrama':
title = censor_slurs(title, v) title = censor_slurs_profanities(title, v)
return title return title
@ -336,7 +337,7 @@ class Post(Base):
title = self.title title = self.title
if self.sub != 'chudrama': if self.sub != 'chudrama':
title = censor_slurs(title, v) title = censor_slurs_profanities(title, v)
title = replace_train_html(title) title = replace_train_html(title)
return title return title

View File

@ -6,7 +6,7 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base from files.classes import Base
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
from files.helpers.regex import censor_slurs from files.helpers.slurs_and_profanities import censor_slurs_profanities
class Report(Base): class Report(Base):
__tablename__ = "reports" __tablename__ = "reports"
@ -27,7 +27,7 @@ class Report(Base):
@lazy @lazy
def realreason(self, v): def realreason(self, v):
return censor_slurs(self.reason, v) return censor_slurs_profanities(self.reason, v)
#lazy hack to avoid having to rename the comment_id column and causing potential new bugs #lazy hack to avoid having to rename the comment_id column and causing potential new bugs
@property @property
@ -55,7 +55,7 @@ class CommentReport(Base):
@lazy @lazy
def realreason(self, v): def realreason(self, v):
return censor_slurs(self.reason, v) return censor_slurs_profanities(self.reason, v)
#lazy hack to avoid having to rename the comment_id column and causing potential new bugs #lazy hack to avoid having to rename the comment_id column and causing potential new bugs
@property @property

View File

@ -7,7 +7,7 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base from files.classes import Base
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
from files.helpers.regex import censor_slurs from files.helpers.slurs_and_profanities import censor_slurs_profanities
from files.helpers.sorting_and_time import make_age_string from files.helpers.sorting_and_time import make_age_string
class SubAction(Base): class SubAction(Base):
@ -52,7 +52,7 @@ class SubAction(Base):
if self.target_user_id: if self.target_user_id:
return f'<a href="{self.target_user.url}">@{self.target_user.username}</a>' return f'<a href="{self.target_user.url}">@{self.target_user.username}</a>'
elif self.target_post_id: elif self.target_post_id:
return censor_slurs(f'<a href="{self.target_post.permalink}">{self.target_post.title_html}</a>', None) return censor_slurs_profanities(f'<a href="{self.target_post.permalink}">{self.target_post.title_html}</a>', None)
elif self.target_comment_id: elif self.target_comment_id:
return f'<a href="{self.target_comment.permalink}">comment</a>' return f'<a href="{self.target_comment.permalink}">comment</a>'

View File

@ -1,6 +1,5 @@
import random import random
from operator import * from operator import *
import re
import pyotp import pyotp
from sqlalchemy import Column, ForeignKey, FetchedValue from sqlalchemy import Column, ForeignKey, FetchedValue
@ -493,7 +492,7 @@ class User(Base):
@property @property
@lazy @lazy
def discount(self): def award_discount(self):
if self.patron in {1,2}: after_discount = 0.90 if self.patron in {1,2}: after_discount = 0.90
elif self.patron == 3: after_discount = 0.85 elif self.patron == 3: after_discount = 0.85
elif self.patron == 4: after_discount = 0.80 elif self.patron == 4: after_discount = 0.80
@ -503,17 +502,19 @@ class User(Base):
elif self.patron == 8: after_discount = 0.60 elif self.patron == 8: after_discount = 0.60
else: after_discount = 1 else: after_discount = 1
after_discount -= 0.02 * self.admin_level
owned_badges = [x.badge_id for x in self.badges] owned_badges = [x.badge_id for x in self.badges]
for badge in discounts: for badge in discounts:
if badge in owned_badges: after_discount -= discounts[badge] if badge in owned_badges: after_discount -= discounts[badge]
return after_discount return max(after_discount, 0.55)
@property @property
@lazy @lazy
def formatted_discount(self): def formatted_award_discount(self):
discount = 100 - int(self.discount * 100) discount = 100 - int(self.award_discount * 100)
return f'{discount}%' return f'{discount}%'
@property @property

View File

@ -13,6 +13,7 @@ from files.classes import Comment, Notification, PushSubscription, Group
from .config.const import * from .config.const import *
from .regex import * from .regex import *
from .sanitize import * from .sanitize import *
from .slurs_and_profanities import censor_slurs_profanities
def create_comment(text_html): def create_comment(text_html):
new_comment = Comment(author_id=AUTOJANNY_ID, new_comment = Comment(author_id=AUTOJANNY_ID,
@ -237,7 +238,7 @@ def push_notif(uids, title, body, url_or_comment):
if len(body) > PUSH_NOTIF_LIMIT: if len(body) > PUSH_NOTIF_LIMIT:
body = body[:PUSH_NOTIF_LIMIT] + "..." body = body[:PUSH_NOTIF_LIMIT] + "..."
body = censor_slurs(body, None) body = censor_slurs_profanities(body, None)
subscriptions = g.db.query(PushSubscription.subscription_json).filter(PushSubscription.user_id.in_(uids)).all() subscriptions = g.db.query(PushSubscription.subscription_json).filter(PushSubscription.user_id.in_(uids)).all()
subscriptions = [x[0] for x in subscriptions] subscriptions = [x[0] for x in subscriptions]

View File

@ -700,7 +700,7 @@ AWARDS = {
"benefactor": { "benefactor": {
"kind": "benefactor", "kind": "benefactor",
"title": "Benefactor", "title": "Benefactor",
"description": f"Grants one month of {patron} status and 2500 marseybux to the recipient. Cannot be used on yourself.", "description": f"Grants one month of {patron} status and 2000 marseybux to the recipient. Cannot be used on yourself.",
"icon": "fas fa-gift", "icon": "fas fa-gift",
"color": "text-blue", "color": "text-blue",
"price": 4000, "price": 4000,

View File

@ -106,7 +106,6 @@ GIRL_PHRASES = [
"literally, $", "literally, $",
"i feel like $", "i feel like $",
"my heart is telling me $", "my heart is telling me $",
"its almost as if $",
"omg! $", "omg! $",
"im literally screaming, $", "im literally screaming, $",
"$ and thats the tea, sis", "$ and thats the tea, sis",
@ -118,40 +117,6 @@ GIRL_PHRASES = [
"$ PERIODT" "$ PERIODT"
] ]
tranny = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain:" title=":marseytrain:" src="{SITE_FULL_IMAGES}/e/marseytrain.webp">'
trannie = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!marseytrain:" title=":!marseytrain:" src="{SITE_FULL_IMAGES}/e/marseytrain.webp">'
troon = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain2:" title=":marseytrain2:" src="{SITE_FULL_IMAGES}/e/marseytrain2.webp">'
def replace_train_html(body):
body = body.replace(tranny, ':marseytrain:')
body = body.replace(trannie, ':!marseytrain:')
body = body.replace(troon, ':marseytrain2:')
return body
SLURS = {
"tranny": tranny,
"trannie": trannie,
"troon": troon,
"(?<!\\bs)nigger": "BIPOC",
"negroid": "BIPOC",
"nignog": "BIPOC",
"nig nog": "BIPOC",
"niglet": 'BIPOClet',
"negress": "BIPOCette",
"faggot": "cute twink",
"fag": "strag",
"(?<!\w)spic(?!\w)": "hard-working American",
"(?<!\w)spics(?!\w)": "hard-working Americans",
"kike": "jewish chad",
"(?<!\w)heeb": "jewish chad",
"daisy's destruction": "Cars 2",
"daisys destruction": "Cars 2",
"daisy destruction": "Cars 2",
"pajeet": "sexy Indian dude",
"hunter2": "*******",
"dyke": "cute butch",
}
patron = "Patron" patron = "Patron"
REDDIT_NOTIFS_SITE = set() REDDIT_NOTIFS_SITE = set()
@ -200,55 +165,6 @@ if SITE_NAME == 'rDrama':
"watch Family Guy online", "watch Family Guy online",
) )
RDRAMA_SLURS = {
"retarded": "r-slurred",
"retard": "r-slur",
"pedophile": "p-dophile",
"kill youself": "keep yourself safe",
"kill yourself": "keep yourself safe",
"kill yourselves": "keep yourselves safe",
"latinos": "latinx",
"latino": "latinx",
"latinas": "latinx",
"latina": "latinx",
"hispanics": "latinx",
"hispanic": "latinx",
"autistic": "neurodivergent",
"gamer": "g*mer",
"journalist": "journ*list",
"journalism": "journ*lism",
"fake and gay": "fake and straight",
"(?<!\w)rapist": "male feminist",
"(?<!\w)pedo(?!\w)": "p-do",
"(?<!\w)kys": "keep yourself safe",
"kys(?!\w)": "keep yourself safe",
"republican": 'rethuglican',
"america": 'ameriKKKa',
"it's almost as if": "I'm an r-slur but",
"it's almost like": "I'm an r-slur but",
"its almost as if": "I'm an r-slur but",
"its almost like": "I'm an r-slur but",
"my brother in christ": "my brother in Allah (ﷻ)",
"(?<!\w)cool (?!it|down|off)": "fetch ",
"krayon(?! \()": "krayon (sister toucher)",
"discord": "groomercord",
"allah(?! \()": "Allah (ﷻ)",
"my wife(?! \()": "my wife (male)",
"(?<!cow) tools(?!\w)": " cow tools",
"explain": "mansplain",
'nigga': 'neighbor',
'(?<![\w.])cat(?!\w)': 'marsey',
'(?<!\w)cats(?!\w)': 'marseys',
'hello': 'hecko',
'ryan gosling': 'literally me',
'howdy': 'meowdy',
'corgi': 'klenny',
"right now": "right meow",
"(?<!\/)linux": "GNU/Linux",
'(?<!-)based': 'keyed',
}
SLURS.update(RDRAMA_SLURS)
BOOSTED_HOLES = { BOOSTED_HOLES = {
'furry', 'furry',
'femboy', 'femboy',
@ -276,28 +192,6 @@ elif SITE_NAME == 'WPD':
REDDIT_NOTIFS_SITE.update({'watchpeopledie', 'makemycoffin'}) REDDIT_NOTIFS_SITE.update({'watchpeopledie', 'makemycoffin'})
PROFANITIES = {
'motherfucker': 'motherlover',
'fuck': 'frick',
'(?<!\w)ass(?!\w)': 'butt',
'shitting': 'pooping',
'damn': 'darn',
'bitch(?!\w)': 'b-word',
'toilet': 'potty',
'(?<!\w)asshole': 'butthole',
'(?<!\w)rape': 'r*pe',
'(?<!\w)hell(?!\w)': 'heck',
'(?<!\w)sex(?!\w)': 's*x',
'(?<!\w)cum(?!\w)': 'c*m',
'(?<!\w)dick': 'peepee',
'cock(?!\w)': 'peepee',
'cocks': 'peepees',
'penis': 'peepee',
'pussy': 'kitty',
'pussies': 'kitties',
'cunt': 'c*nt',
}
LONGPOSTBOT_REPLIES = ('Wow, you must be a JP fan.', 'This is one of the worst posts I have EVER seen. Delete it.', "No, don't reply like this, please do another wall of unhinged rant please.", '# 😴😴😴', "Ma'am we've been over this before. You need to stop.", "I've known more coherent downies.", "Your pulitzer's in the mail", "That's great and all, but I asked for my burger without cheese.", 'That degree finally paying off', "That's nice sweaty. Why don't you have a seat in the time out corner with Pizzashill until you calm down, then you can have your Capri Sun.", "All them words won't bring your pa back.", "You had a chance to not be completely worthless, but it looks like you threw it away. At least you're consistent.", 'Some people are able to display their intelligence by going on at length on a subject and never actually saying anything. This ability is most common in trades such as politics, public relations, and law. You have impressed me by being able to best them all, while still coming off as an absolute idiot.', "You can type 10,000 characters and you decided that these were the one's that you wanted.", 'Have you owned the libs yet?', "I don't know what you said, because I've seen another human naked.", 'Impressive. Normally people with such severe developmental disabilities struggle to write much more than a sentence or two. He really has exceded our expectations for the writing portion. Sadly the coherency of his writing, along with his abilities in the social skills and reading portions, are far behind his peers with similar disabilities.', "This is a really long way of saying you don't fuck.", "Sorry ma'am, looks like his delusions have gotten worse. We'll have to admit him.", 'If only you could put that energy into your relationships', 'Posts like this is why I do Heroine.', 'still unemployed then?', 'K', 'look im gunna have 2 ask u 2 keep ur giant dumps in the toilet not in my replys 😷😷😷', "Mommy is soooo proud of you, sweaty. Let's put this sperg out up on the fridge with all your other failures.", "Good job bobby, here's a star", "That was a mistake. You're about to find out the hard way why.", 'You sat down and wrote all this shit. You could have done so many other things with your life. What happened to your life that made you decide writing novels of bullshit here was the best option?', "I don't have enough spoons to read this shit", "All those words won't bring daddy back.", 'OUT!', "Damn, you're really mad over this, but thanks for the effort you put into typing that all out! Sadly I won't read it all.", "Jesse what the fuck are you talking about??", "▼you're fucking bananas if you think I'm reading all that, take my downvote and shut up idiot", "Are you feeling okay bud?", ':#marseywoah:', 'At no point in your rambling, incoherent post were you even close to anything that could be considered a rational thought. Everyone on this site is now dumber for having read it. May God have mercy on your soul.', 'https://rdrama.net/videos/1671169024815045.mp4', 'https://i.rdrama.net/images/16766675896248007.webp', 'https://i.rdrama.net/images/1683531328305875.webp', 'https://i.rdrama.net/images/1691152552869678.webp', 'You could have done crack instead of this shit', 'Not one single person is gonna read all that', 'PlsRope', 'I hope you had chatgpt pen that one fam') LONGPOSTBOT_REPLIES = ('Wow, you must be a JP fan.', 'This is one of the worst posts I have EVER seen. Delete it.', "No, don't reply like this, please do another wall of unhinged rant please.", '# 😴😴😴', "Ma'am we've been over this before. You need to stop.", "I've known more coherent downies.", "Your pulitzer's in the mail", "That's great and all, but I asked for my burger without cheese.", 'That degree finally paying off', "That's nice sweaty. Why don't you have a seat in the time out corner with Pizzashill until you calm down, then you can have your Capri Sun.", "All them words won't bring your pa back.", "You had a chance to not be completely worthless, but it looks like you threw it away. At least you're consistent.", 'Some people are able to display their intelligence by going on at length on a subject and never actually saying anything. This ability is most common in trades such as politics, public relations, and law. You have impressed me by being able to best them all, while still coming off as an absolute idiot.', "You can type 10,000 characters and you decided that these were the one's that you wanted.", 'Have you owned the libs yet?', "I don't know what you said, because I've seen another human naked.", 'Impressive. Normally people with such severe developmental disabilities struggle to write much more than a sentence or two. He really has exceded our expectations for the writing portion. Sadly the coherency of his writing, along with his abilities in the social skills and reading portions, are far behind his peers with similar disabilities.', "This is a really long way of saying you don't fuck.", "Sorry ma'am, looks like his delusions have gotten worse. We'll have to admit him.", 'If only you could put that energy into your relationships', 'Posts like this is why I do Heroine.', 'still unemployed then?', 'K', 'look im gunna have 2 ask u 2 keep ur giant dumps in the toilet not in my replys 😷😷😷', "Mommy is soooo proud of you, sweaty. Let's put this sperg out up on the fridge with all your other failures.", "Good job bobby, here's a star", "That was a mistake. You're about to find out the hard way why.", 'You sat down and wrote all this shit. You could have done so many other things with your life. What happened to your life that made you decide writing novels of bullshit here was the best option?', "I don't have enough spoons to read this shit", "All those words won't bring daddy back.", 'OUT!', "Damn, you're really mad over this, but thanks for the effort you put into typing that all out! Sadly I won't read it all.", "Jesse what the fuck are you talking about??", "▼you're fucking bananas if you think I'm reading all that, take my downvote and shut up idiot", "Are you feeling okay bud?", ':#marseywoah:', 'At no point in your rambling, incoherent post were you even close to anything that could be considered a rational thought. Everyone on this site is now dumber for having read it. May God have mercy on your soul.', 'https://rdrama.net/videos/1671169024815045.mp4', 'https://i.rdrama.net/images/16766675896248007.webp', 'https://i.rdrama.net/images/1683531328305875.webp', 'https://i.rdrama.net/images/1691152552869678.webp', 'You could have done crack instead of this shit', 'Not one single person is gonna read all that', 'PlsRope', 'I hope you had chatgpt pen that one fam')
CHUD_MSGS = ( CHUD_MSGS = (
@ -764,6 +658,7 @@ elif SITE == 'watchpeopledie.tv':
PERMS['HOLE_CREATE'] = 2 PERMS['HOLE_CREATE'] = 2
PERMS['POST_COMMENT_EDITING'] = 3 PERMS['POST_COMMENT_EDITING'] = 3
PERMS['MODS_EVERY_HOLE'] = 3 PERMS['MODS_EVERY_HOLE'] = 3
PERMS['IS_PERMA_PROGSTACKED'] = 4
SUB_BANNER_LIMIT = 69420 SUB_BANNER_LIMIT = 69420

View File

@ -29,7 +29,7 @@ from files.cli import app, db_session, g
CRON_CACHE_TIMEOUT = 172800 CRON_CACHE_TIMEOUT = 172800
def cron_fn(every_5m, every_1d, every_fri_12, every_fri_23, every_sat_00, every_sat_03, every_sun_07, every_sun_19, every_sun_20, every_sun_23): def cron_fn(every_5m, every_1d, every_fri_12, every_fri_23, every_sat_00, every_sat_03, every_sun_07, every_sun_19, every_sun_20, every_sun_23, every_1mo):
with app.app_context(): with app.app_context():
g.db = db_session() g.db = db_session()
g.v = None g.v = None
@ -99,7 +99,11 @@ def cron_fn(every_5m, every_1d, every_fri_12, every_fri_23, every_sat_00, every_
g.db.commit() g.db.commit()
if every_sat_03 or every_sun_23: if every_sat_03 or every_sun_23:
_delete_all() _delete_all_posts()
g.db.commit()
if every_1mo:
_give_marseybux_salary()
g.db.commit() g.db.commit()
except: except:
@ -124,6 +128,7 @@ def cron_fn(every_5m, every_1d, every_fri_12, every_fri_23, every_sat_00, every_
@click.option('--every-sun-19', is_flag=True, help='Call every Sunday.') @click.option('--every-sun-19', is_flag=True, help='Call every Sunday.')
@click.option('--every-sun-20', is_flag=True, help='Call every Sunday.') @click.option('--every-sun-20', is_flag=True, help='Call every Sunday.')
@click.option('--every-sun-23', is_flag=True, help='Call every Sunday.') @click.option('--every-sun-23', is_flag=True, help='Call every Sunday.')
@click.option('--every-1mo', is_flag=True, help='Call every 1 month.')
def cron(**kwargs): def cron(**kwargs):
cron_fn(**kwargs) cron_fn(**kwargs)
@ -177,11 +182,7 @@ def _create_orgy():
) )
g.db.add(orgy) g.db.add(orgy)
def _delete_all(): def _delete_all_posts():
orgy = g.db.query(Orgy).one_or_none()
if orgy:
g.db.delete(orgy)
posts = g.db.query(Post).filter_by(author_id=AUTOJANNY_ID, deleted_utc=0).all() posts = g.db.query(Post).filter_by(author_id=AUTOJANNY_ID, deleted_utc=0).all()
for p in posts: for p in posts:
p.deleted_utc = int(time.time()) p.deleted_utc = int(time.time())
@ -415,3 +416,9 @@ def _unpin_expired():
if pins: if pins:
cache.delete_memoized(frontlist) cache.delete_memoized(frontlist)
def _give_marseybux_salary():
for u in g.db.query(User).filter(User.admin_level > 0).all():
marseybux_salary = u.admin_level * 10000
u.pay_account('marseybux', marseybux_salary)
send_repeatable_notification(u.id, f"You have received your monthly janny salary of {marseybux_salary} Marseybux!")

View File

@ -84,11 +84,16 @@ def notify_mentions(mentions, send_to=None, mention_str='site mention'):
) )
g.db.flush() g.db.flush()
existing_comment = g.db.query(Comment.id).filter_by( try:
author_id=const.AUTOJANNY_ID, existing_comment = g.db.query(Comment.id).filter_by(
parent_post=None, author_id=const.AUTOJANNY_ID,
body_html=notif_text).one_or_none() parent_post=None,
if existing_comment: break body_html=notif_text).one_or_none()
if existing_comment: break
# todo: handle this exception by removing one of the existing
# means that multiple rows were found, happens on new install for some reason
except:
pass
new_comment = Comment( new_comment = Comment(
author_id=const.AUTOJANNY_ID, author_id=const.AUTOJANNY_ID,

View File

@ -43,7 +43,7 @@ title_regex = re.compile("[^\w ]", flags=re.A)
controversial_regex = re.compile('https:\/\/old\.reddit\.com/r/\w{2,20}\/comments\/[\w\-.#&/=\?@%+]{5,250}', flags=re.A) controversial_regex = re.compile('https:\/\/old\.reddit\.com/r/\w{2,20}\/comments\/[\w\-.#&/=\?@%+]{5,250}', flags=re.A)
spoiler_regex = re.compile('\|\|(.+?)\|\|' + NOT_IN_CODE_OR_LINKS, flags=re.A) spoiler_regex = re.compile('\|\|(.+?)\|\|' + NOT_IN_CODE_OR_LINKS, flags=re.A)
sub_regex = re.compile('(?<![\w/])\/?([hH]\/\w{3,25})' + NOT_IN_CODE_OR_LINKS, flags=re.A) hole_mention_regex = re.compile('(?<![\w/])\/?([hH]\/\w{3,25})' + NOT_IN_CODE_OR_LINKS, flags=re.A)
strikethrough_regex = re.compile('(^|\s|>|")~{1,2}([^~]+)~{1,2}' + NOT_IN_CODE_OR_LINKS, flags=re.A) strikethrough_regex = re.compile('(^|\s|>|")~{1,2}([^~]+)~{1,2}' + NOT_IN_CODE_OR_LINKS, flags=re.A)
@ -56,22 +56,6 @@ snappy_url_regex = re.compile('<a href="(https?:\/\/.+?)".*?>(.+?)<\/a>', flags=
email_regex = re.compile('[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{2,63}\.[A-Za-z]{2,63}', flags=re.A) email_regex = re.compile('[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{2,63}\.[A-Za-z]{2,63}', flags=re.A)
slur_single_words = "|".join([slur.lower() for slur in SLURS.keys()])
slur_single_words_title = slur_single_words.title().replace('!\W','!\w')
slur_single_words_upper = slur_single_words.upper().replace('!\W','!\w')
profanity_single_words = "|".join([profanity.lower() for profanity in PROFANITIES.keys()])
profanity_single_words_title = profanity_single_words.title().replace('!\W','!\w')
profanity_single_words_upper = profanity_single_words.upper().replace('!\W','!\w')
slur_regex = re.compile(f"<[^>]*>|{slur_single_words}", flags=re.I|re.A)
slur_regex_title = re.compile(f"<[^>]*>|{slur_single_words_title}", flags=re.A)
slur_regex_upper = re.compile(f"<[^>]*>|{slur_single_words_upper}", flags=re.A)
profanity_regex = re.compile(f"<[^>]*>|{profanity_single_words}", flags=re.I|re.A)
profanity_regex_title = re.compile(f"<[^>]*>|{profanity_single_words_title}", flags=re.A)
profanity_regex_upper = re.compile(f"<[^>]*>|{profanity_single_words_upper}", flags=re.A)
torture_regex = re.compile('(^|\s)(i|me)($|\s)', flags=re.I|re.A) torture_regex = re.compile('(^|\s)(i|me)($|\s)', flags=re.I|re.A)
torture_regex2 = re.compile("(^|\s)(i'm)($|\s)", flags=re.I|re.A) torture_regex2 = re.compile("(^|\s)(i'm)($|\s)", flags=re.I|re.A)
torture_regex3 = re.compile("(^|\s)(my|mine)($|\s)", flags=re.I|re.A) torture_regex3 = re.compile("(^|\s)(my|mine)($|\s)", flags=re.I|re.A)
@ -158,81 +142,6 @@ pronouns_regex = re.compile("([a-z]{1,7})\/[a-z]{1,7}(\/[a-z]{1,7})?", flags=re.
html_title_regex = re.compile("<title>(.{1,200})</title>", flags=re.I) html_title_regex = re.compile("<title>(.{1,200})</title>", flags=re.I)
SLURS_FOR_REPLACING = {}
for k, val in SLURS.items():
newkey = k.split('(?!')[0]
if ')' in newkey:
newkey = newkey.split(')')[1]
SLURS_FOR_REPLACING[newkey] = val
PROFANITIES_FOR_REPLACING = {}
for k, val in PROFANITIES.items():
newkey = k.split('(?!')[0]
if ')' in newkey:
newkey = newkey.split(')')[1]
PROFANITIES_FOR_REPLACING[newkey] = val
def sub_matcher(match, upper=False, title=False, replace_with=SLURS_FOR_REPLACING):
group_num = 0
match_str = match.group(group_num)
if match_str.startswith('<'):
return match_str
else:
repl = replace_with[match_str.lower()]
if (not upper and not title) or "<img" in repl:
return repl
elif title:
return repl.title()
else:
return repl.upper()
def sub_matcher_upper(match, replace_with=SLURS_FOR_REPLACING):
return sub_matcher(match, upper=True, replace_with=replace_with)
# TODO: make censoring a bit better
def sub_matcher_slurs(match, upper=False, title=False):
return sub_matcher(match, upper, title, replace_with=SLURS_FOR_REPLACING)
def sub_matcher_slurs_title(match):
return sub_matcher_slurs(match, title=True)
def sub_matcher_slurs_upper(match):
return sub_matcher_slurs(match, upper=True)
def sub_matcher_profanities(match, upper=False, title=False):
return sub_matcher(match, upper, title, replace_with=PROFANITIES_FOR_REPLACING)
def sub_matcher_profanities_title(match):
return sub_matcher_profanities(match, title=True)
def sub_matcher_profanities_upper(match):
return sub_matcher_profanities(match, upper=True)
def replace_re(body, regex, regex_title, regex_upper, sub_func, sub_func_title, sub_func_upper):
body = regex_upper.sub(sub_func_upper, body)
body = regex_title.sub(sub_func_title, body)
return regex.sub(sub_func, body)
def censor_slurs(body, logged_user):
if not body: return ""
if '<pre>' in body or '<code>' in body:
return body
if not logged_user or logged_user == 'chat' or logged_user.slurreplacer:
body = replace_re(body, slur_regex, slur_regex_title, slur_regex_upper, sub_matcher_slurs, sub_matcher_slurs_title, sub_matcher_slurs_upper)
if SITE_NAME == 'rDrama':
if not logged_user or logged_user == 'chat' or logged_user.profanityreplacer:
body = replace_re(body, profanity_regex, profanity_regex_title, profanity_regex_upper, sub_matcher_profanities, sub_matcher_profanities_title, sub_matcher_profanities_upper)
return body
commands = { commands = {
"fortune": FORTUNE_REPLIES, "fortune": FORTUNE_REPLIES,
"factcheck": FACTCHECK_REPLIES, "factcheck": FACTCHECK_REPLIES,
@ -279,6 +188,8 @@ reddit_s_url_regex = re.compile("https:\/\/reddit.com\/[ru]\/\w{2,25}\/s\/\w{10}
#run-time #run-time
reddit_to_vreddit_regex = re.compile('(^|>|")https:\/\/old.reddit.com\/(r|user)\/', flags=re.A) reddit_to_vreddit_regex = re.compile('(^|>|")https:\/\/old.reddit.com\/(r|user)\/', flags=re.A)
#post search
subreddit_name_regex = re.compile('\w{2,25}', flags=re.A)
###YOUTUBE ###YOUTUBE

View File

@ -260,6 +260,15 @@ def find_all_emote_endings(word):
is_non_ending_found = True is_non_ending_found = True
if word.endswith('random'):
kind = word.split('random')[0].title()
if kind == 'Donkeykong': kind = 'Donkey Kong'
elif kind == 'Marseyflag': kind = 'Marsey Flags'
elif kind == 'Marseyalphabet': kind = 'Marsey Alphabet'
if kind in EMOJI_KINDS:
word = g.db.query(Emoji.name).filter_by(kind=kind).order_by(func.random()).first()[0]
return endings, word return endings, word
@ -282,16 +291,6 @@ def render_emoji(html, regexp, golden, emojis_used, b=False, is_title=False):
old = emoji old = emoji
emoji = emoji.replace('!','').replace('#','') emoji = emoji.replace('!','').replace('#','')
if emoji.endswith('random'):
kind = emoji.split('random')[0].title()
if kind == 'Donkeykong': kind = 'Donkey Kong'
elif kind == 'Marseyflag': kind = 'Marsey Flags'
elif kind == 'Marseyalphabet': kind = 'Marsey Alphabet'
if kind in EMOJI_KINDS:
emoji = g.db.query(Emoji.name).filter_by(kind=kind).order_by(func.random()).first()[0]
emoji_partial_pat = '<img alt=":{0}:" loading="lazy" src="{1}"{2}>' emoji_partial_pat = '<img alt=":{0}:" loading="lazy" src="{1}"{2}>'
emoji_partial = '<img alt=":{0}:" data-bs-toggle="tooltip" loading="lazy" src="{1}" title=":{0}:"{2}>' emoji_partial = '<img alt=":{0}:" data-bs-toggle="tooltip" loading="lazy" src="{1}" title=":{0}:"{2}>'
emoji_html = None emoji_html = None
@ -449,7 +448,7 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=False, count_emojis
sanitized = sanitized.replace('<a href="/%21', '<a href="/!') sanitized = sanitized.replace('<a href="/%21', '<a href="/!')
sanitized = reddit_mention_regex.sub(r'<a href="https://old.reddit.com/\1" rel="nofollow noopener" target="_blank">/\1</a>', sanitized) sanitized = reddit_mention_regex.sub(r'<a href="https://old.reddit.com/\1" rel="nofollow noopener" target="_blank">/\1</a>', sanitized)
sanitized = sub_regex.sub(r'<a href="/\1">/\1</a>', sanitized) sanitized = hole_mention_regex.sub(r'<a href="/\1">/\1</a>', sanitized)
v = getattr(g, 'v', None) v = getattr(g, 'v', None)
@ -582,6 +581,8 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=False, count_emojis
#doing this here cuz of the linkifyfilter right above it (therefore unifying all link processing logic) #doing this here cuz of the linkifyfilter right above it (therefore unifying all link processing logic)
soup = BeautifulSoup(sanitized, 'lxml') soup = BeautifulSoup(sanitized, 'lxml')
has_transform = bool(soup.select('[style*=transform]'))
links = soup.find_all("a") links = soup.find_all("a")
if g.v and g.v.admin_level >= PERMS["IGNORE_DOMAIN_BAN"]: if g.v and g.v.admin_level >= PERMS["IGNORE_DOMAIN_BAN"]:
@ -645,6 +646,9 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=False, count_emojis
link["target"] = "_blank" link["target"] = "_blank"
link["rel"] = "nofollow noopener" link["rel"] = "nofollow noopener"
if has_transform:
del link["href"]
sanitized = str(soup).replace('<html><body>','').replace('</body></html>','').replace('/>','>') sanitized = str(soup).replace('<html><body>','').replace('</body></html>','').replace('/>','>')
captured = [] captured = []

View File

@ -1,4 +1,3 @@
import re
from files.helpers.regex import * from files.helpers.regex import *
def sharpen(string): def sharpen(string):

View File

@ -0,0 +1,167 @@
import re
from .config.const import *
tranny = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain:" title=":marseytrain:" src="{SITE_FULL_IMAGES}/e/marseytrain.webp">'
trannie = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":!marseytrain:" title=":!marseytrain:" src="{SITE_FULL_IMAGES}/e/marseytrain.webp">'
troon = f'<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain2:" title=":marseytrain2:" src="{SITE_FULL_IMAGES}/e/marseytrain2.webp">'
def replace_train_html(body):
body = body.replace(tranny, ':marseytrain:')
body = body.replace(trannie, ':!marseytrain:')
body = body.replace(troon, ':marseytrain2:')
return body
SLURS = {
"tranny": tranny,
"trannie": trannie,
"troon": troon,
"(?<!\\bs)nigger": "BIPOC",
"negroid": "BIPOC",
"nignog": "BIPOC",
"nig nog": "BIPOC",
"niglet": 'BIPOClet',
"negress": "BIPOCette",
"faggot": "cute twink",
"fag": "strag",
"(?<!\w)spic(?!\w)": "hard-working American",
"(?<!\w)spics(?!\w)": "hard-working Americans",
"kike": "jewish chad",
"(?<!\w)heeb": "jewish chad",
"daisy's destruction": "Cars 2",
"daisys destruction": "Cars 2",
"daisy destruction": "Cars 2",
"pajeet": "sexy Indian dude",
"hunter2": "*******",
"dyke": "cute butch",
}
if SITE_NAME == 'rDrama':
SLURS |= {
"retarded": "r-slurred",
"retard": "r-slur",
"pedophile": "p-dophile",
"kill youself": "keep yourself safe",
"kill yourself": "keep yourself safe",
"kill yourselves": "keep yourselves safe",
"latinos": "latinx",
"latino": "latinx",
"latinas": "latinx",
"latina": "latinx",
"hispanics": "latinx",
"hispanic": "latinx",
"autistic": "neurodivergent",
"gamer": "g*mer",
"journalist": "journ*list",
"journalism": "journ*lism",
"fake and gay": "fake and straight",
"(?<!\w)rapist": "male feminist",
"(?<!\w)pedo(?!\w)": "p-do",
"(?<!\w)kys": "keep yourself safe",
"kys(?!\w)": "keep yourself safe",
"republican": 'rethuglican',
"america": 'ameriKKKa',
"it's almost as if": "I'm an r-slur but",
"it's almost like": "I'm an r-slur but",
"its almost as if": "I'm an r-slur but",
"its almost like": "I'm an r-slur but",
"my brother in christ": "my brother in Allah (ﷻ)",
"(?<!\w)cool(?! (it|down|off))": "fetch",
"krayon(?! \()": "krayon (sister toucher)",
"discord": "groomercord",
"allah(?! \()": "Allah (ﷻ)",
"my wife(?! \()": "my wife (male)",
"(?<!cow )tools(?!\w)": "cow tools",
"explain": "mansplain",
'nigga': 'neighbor',
'(?<![\w.])cat(?!\w)': 'marsey',
'(?<!\w)cats(?!\w)': 'marseys',
'hello': 'hecko',
'ryan gosling': 'literally me',
'howdy': 'meowdy',
'corgi': 'klenny',
"right now": "right meow",
"(?<!\/)linux": "GNU/Linux",
'(?<!-)based': 'keyed',
'needful': 'sneedful',
}
PROFANITIES = {
'motherfucker': 'motherlover',
'fuck': 'frick',
'(?<!\w)ass(?!\w)': 'butt',
'shitting': 'pooping',
'damn': 'darn',
'bitch(?!\w)': 'b-word',
'toilet': 'potty',
'(?<!\w)asshole': 'butthole',
'(?<!\w)rape': 'r*pe',
'(?<!\w)hell(?!\w)': 'heck',
'(?<!\w)sex(?!\w)': 's*x',
'(?<!\w)cum(?!\w)': 'c*m',
'(?<!\w)dick': 'peepee',
'cock(?!\w)': 'peepee',
'cocks': 'peepees',
'penis': 'peepee',
'pussy': 'kitty',
'pussies': 'kitties',
'cunt': 'c*nt',
}
slur_single_words = "|".join([slur.lower() for slur in SLURS.keys()])
profanity_single_words = "|".join([profanity.lower() for profanity in PROFANITIES.keys()])
slur_regex = re.compile(f"<[^>]*>|{slur_single_words}", flags=re.I|re.A)
profanity_regex = re.compile(f"<[^>]*>|{profanity_single_words}", flags=re.I|re.A)
SLURS_FOR_REPLACING = {}
for k, val in SLURS.items():
newkey = k.split('(?!')[0]
if ')' in newkey:
newkey = newkey.split(')')[1]
SLURS_FOR_REPLACING[newkey] = val
PROFANITIES_FOR_REPLACING = {}
for k, val in PROFANITIES.items():
newkey = k.split('(?!')[0]
if ')' in newkey:
newkey = newkey.split(')')[1]
PROFANITIES_FOR_REPLACING[newkey] = val
def sub_matcher(match, X_FOR_REPLACING):
group_num = 0
match_str = match.group(group_num)
if match_str.startswith('<'):
return match_str
else:
repl = X_FOR_REPLACING[match_str.lower()]
if match_str.isupper():
return repl.upper()
if match_str.istitle():
return repl.title()
return repl
def sub_matcher_slurs(match):
return sub_matcher(match, SLURS_FOR_REPLACING)
def sub_matcher_profanities(match):
return sub_matcher(match, PROFANITIES_FOR_REPLACING)
def censor_slurs_profanities(body, logged_user):
if not body: return ""
if '<pre>' in body or '<code>' in body:
return body
if not logged_user or logged_user == 'chat' or logged_user.slurreplacer:
body = slur_regex.sub(sub_matcher_slurs, body)
if SITE_NAME == 'rDrama':
if not logged_user or logged_user == 'chat' or logged_user.profanityreplacer:
body = profanity_regex.sub(sub_matcher_profanities, body)
return body

View File

@ -269,7 +269,7 @@ def can_double_down(state):
player = state['player'] player = state['player']
player_hand_value = get_value_of_hand(player) player_hand_value = get_value_of_hand(player)
player_never_hit = len(player) == 2 player_never_hit = len(player) == 2
return not state['has_player_split'] and player_hand_value in (10, 11) and player_never_hit return not state['has_player_split'] and player_hand_value in (9, 10, 11) and player_never_hit
def can_split(state): def can_split(state):
player = state['player'] player = state['player']

View File

@ -56,4 +56,4 @@ if IS_LOCALHOST:
if "cron" not in argv and "load_chat" not in argv: if "cron" not in argv and "load_chat" not in argv:
from files.helpers.cron import cron_fn from files.helpers.cron import cron_fn
print('Starting cron tasks!', flush=True) print('Starting cron tasks!', flush=True)
gevent.spawn(cron_fn, True, False, False, False, False, False, False, False, False, False) gevent.spawn(cron_fn, True, False, False, False, False, False, False, False, False, False, False)

View File

@ -11,6 +11,7 @@ from files.helpers.actions import *
from files.helpers.alerts import * from files.helpers.alerts import *
from files.helpers.cloudflare import * from files.helpers.cloudflare import *
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.slurs_and_profanities import censor_slurs_profanities
from files.helpers.get import * from files.helpers.get import *
from files.helpers.media import * from files.helpers.media import *
from files.helpers.sanitize import * from files.helpers.sanitize import *
@ -909,7 +910,7 @@ def admin_title_change(user_id, v):
user.customtitleplain = new_name user.customtitleplain = new_name
new_name = filter_emojis_only(new_name) new_name = filter_emojis_only(new_name)
new_name = censor_slurs(new_name, None) new_name = censor_slurs_profanities(new_name, None)
user = get_account(user.id) user = get_account(user.id)
user.customtitle=new_name user.customtitle=new_name

View File

@ -9,6 +9,7 @@ from files.classes.userblock import UserBlock
from files.helpers.actions import * from files.helpers.actions import *
from files.helpers.alerts import * from files.helpers.alerts import *
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.slurs_and_profanities import censor_slurs_profanities
from files.helpers.config.awards import AWARDS_ENABLED, HOUSE_AWARDS, LOOTBOX_ITEM_COUNT, LOOTBOX_CONTENTS from files.helpers.config.awards import AWARDS_ENABLED, HOUSE_AWARDS, LOOTBOX_ITEM_COUNT, LOOTBOX_CONTENTS
from files.helpers.get import * from files.helpers.get import *
from files.helpers.marsify import marsify from files.helpers.marsify import marsify
@ -48,7 +49,7 @@ def shop(v):
val["baseprice"] = int(val["price"]) val["baseprice"] = int(val["price"])
if val["kind"].endswith('Founder'): if val["kind"].endswith('Founder'):
val["baseprice"] = int(val["baseprice"] / 0.75) val["baseprice"] = int(val["baseprice"] / 0.75)
val["price"] = int(val["price"] * v.discount) val["price"] = int(val["price"] * v.award_discount)
sales = g.db.query(func.sum(User.coins_spent)).scalar() sales = g.db.query(func.sum(User.coins_spent)).scalar()
return render_template("shop.html", awards=list(AWARDS.values()), v=v, sales=sales) return render_template("shop.html", awards=list(AWARDS.values()), v=v, sales=sales)
@ -73,7 +74,7 @@ def buy(v, award):
og_price = AWARDS[award]["price"] og_price = AWARDS[award]["price"]
award_title = AWARDS[award]['title'] award_title = AWARDS[award]['title']
price = int(og_price * v.discount) price = int(og_price * v.award_discount)
if award == "grass": if award == "grass":
@ -394,7 +395,7 @@ def award_thing(v, thing_type, id):
else: else:
author.customtitleplain = new_name author.customtitleplain = new_name
new_name = filter_emojis_only(new_name) new_name = filter_emojis_only(new_name)
new_name = censor_slurs(new_name, None) new_name = censor_slurs_profanities(new_name, None)
if len(new_name) > 1000: abort(403) if len(new_name) > 1000: abort(403)
author.customtitle = new_name author.customtitle = new_name
author.flairchanged = int(time.time()) + 86400 author.flairchanged = int(time.time()) + 86400
@ -461,7 +462,7 @@ def award_thing(v, thing_type, id):
author.patron = 1 author.patron = 1
if author.patron_utc: author.patron_utc += 2629746 if author.patron_utc: author.patron_utc += 2629746
else: author.patron_utc = int(time.time()) + 2629746 else: author.patron_utc = int(time.time()) + 2629746
author.pay_account('marseybux', 2500) author.pay_account('marseybux', 2000)
badge_grant(user=v, badge_id=103) badge_grant(user=v, badge_id=103)
elif kind == "rehab": elif kind == "rehab":
if author.rehab: author.rehab += 86400 if author.rehab: author.rehab += 86400

View File

@ -9,6 +9,7 @@ from flask import request
from files.helpers.actions import * from files.helpers.actions import *
from files.helpers.alerts import * from files.helpers.alerts import *
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.slurs_and_profanities import censor_slurs_profanities
from files.helpers.regex import * from files.helpers.regex import *
from files.helpers.media import * from files.helpers.media import *
from files.helpers.sanitize import * from files.helpers.sanitize import *
@ -167,9 +168,9 @@ def speak(data, v):
"namecolor": v.name_color, "namecolor": v.name_color,
"patron": v.patron, "patron": v.patron,
"text": text, "text": text,
"text_censored": censor_slurs(text, 'chat'), "text_censored": censor_slurs_profanities(text, 'chat'),
"text_html": text_html, "text_html": text_html,
"text_html_censored": censor_slurs(text_html, 'chat'), "text_html_censored": censor_slurs_profanities(text_html, 'chat'),
"time": int(time.time()), "time": int(time.time()),
} }

View File

@ -663,12 +663,10 @@ def edit_comment(cid, v):
abort(400, "You have to actually type something!") abort(400, "You have to actually type something!")
if body != c.body or request.files.get("file") and not g.is_tor: if body != c.body or request.files.get("file") and not g.is_tor:
if c.author.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
if v.id == c.author_id: abort(403, "You have to type more than 280 characters!")
if v.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')): elif c.author.bird and len(body) > 140:
abort(403, "You have to type more than 280 characters!") abort(403, "You have to type less than 140 characters!")
elif v.bird and len(body) > 140:
abort(403, "You have to type less than 140 characters!")
execute_antispam_comment_check(body, v) execute_antispam_comment_check(body, v)
@ -677,11 +675,10 @@ def edit_comment(cid, v):
body_for_sanitize = body body_for_sanitize = body
if v.id == c.author_id: if c.author.owoify:
if v.owoify: body_for_sanitize = owoify(body_for_sanitize)
body_for_sanitize = owoify(body_for_sanitize) if c.author.marsify and not c.author.chud:
if v.marsify and not v.chud: body_for_sanitize = marsify(body_for_sanitize)
body_for_sanitize = marsify(body_for_sanitize)
if c.sharpened: if c.sharpened:
body_for_sanitize = sharpen(body_for_sanitize) body_for_sanitize = sharpen(body_for_sanitize)
@ -690,7 +687,7 @@ def edit_comment(cid, v):
if len(body_html) > COMMENT_BODY_HTML_LENGTH_LIMIT: abort(400) if len(body_html) > COMMENT_BODY_HTML_LENGTH_LIMIT: abort(400)
if v.id == c.author_id and v.marseyawarded and marseyaward_body_regex.search(body_html): if c.author.marseyawarded and marseyaward_body_regex.search(body_html):
abort(403, "You can only type marseys!") abort(403, "You can only type marseys!")
oldtext = c.body oldtext = c.body
@ -702,7 +699,7 @@ def edit_comment(cid, v):
execute_blackjack(v, c, c.body, "comment") execute_blackjack(v, c, c.body, "comment")
if not complies_with_chud(c): if not complies_with_chud(c):
abort(403, f'You have to include "{v.chud_phrase}" in your comment!') abort(403, f'You have to include "{c.author.chud_phrase}" in your comment!')
process_poll_options(v, c) process_poll_options(v, c)

View File

@ -995,11 +995,10 @@ def edit_post(pid, v):
body = request.values.get("body", "") body = request.values.get("body", "")
body = body[:POST_BODY_LENGTH_LIMIT(g.v)].strip() body = body[:POST_BODY_LENGTH_LIMIT(g.v)].strip()
if v.id == p.author_id: if p.author.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
if v.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')): abort(403, "You have to type more than 280 characters!")
abort(403, "You have to type more than 280 characters!") elif p.author.bird and len(body) > 140:
elif v.bird and len(body) > 140: abort(403, "You have to type less than 140 characters!")
abort(403, "You have to type less than 140 characters!")
if not title: if not title:
abort(400, "Please enter a better title!") abort(400, "Please enter a better title!")
@ -1019,7 +1018,7 @@ def edit_post(pid, v):
if title != p.title: if title != p.title:
title_html = filter_emojis_only(title, golden=False) title_html = filter_emojis_only(title, golden=False)
if v.id == p.author_id and v.marseyawarded and not marseyaward_title_regex.fullmatch(title_html): if p.author.marseyawarded and not marseyaward_title_regex.fullmatch(title_html):
abort(403, "You can only type marseys!") abort(403, "You can only type marseys!")
if 'megathread' in title.lower() and 'megathread' not in p.title.lower(): if 'megathread' in title.lower() and 'megathread' not in p.title.lower():
@ -1037,7 +1036,7 @@ def edit_post(pid, v):
body_html = sanitize(body_for_sanitize, golden=False, limit_pings=100) body_html = sanitize(body_for_sanitize, golden=False, limit_pings=100)
if v.id == p.author_id and v.marseyawarded and marseyaward_body_regex.search(body_html): if p.author.marseyawarded and marseyaward_body_regex.search(body_html):
abort(403, "You can only type marseys!") abort(403, "You can only type marseys!")
@ -1057,7 +1056,7 @@ def edit_post(pid, v):
if not complies_with_chud(p): if not complies_with_chud(p):
abort(403, f'You have to include "{v.chud_phrase}" in your post!') abort(403, f'You have to include "{p.author.chud_phrase}" in your post!')
if v.id == p.author_id: if v.id == p.author_id:

View File

@ -22,6 +22,7 @@ valid_params = [
'title', 'title',
'sentto', 'sentto',
search_operator_hole, search_operator_hole,
'subreddit',
] ]
def searchparse(text): def searchparse(text):
@ -114,27 +115,30 @@ def searchposts(v):
if 'over18' in criteria: posts = posts.filter(Post.over_18==True) if 'over18' in criteria: posts = posts.filter(Post.over_18==True)
if 'domain' in criteria: if 'domain' in criteria:
domain=criteria['domain'] domain = criteria['domain']
domain = domain.replace('\\', '').replace('_', '\_').replace('%', '').strip() domain = domain.replace('\\', '').replace('_', '\_').replace('%', '').strip()
posts=posts.filter( posts = posts.filter(
or_( or_(
Post.url.ilike("https://"+domain+'/%'), Post.url.ilike("https://"+domain+'/%'),
Post.url.ilike("https://"+domain+'/%'),
Post.url.ilike("https://"+domain),
Post.url.ilike("https://"+domain), Post.url.ilike("https://"+domain),
Post.url.ilike("https://www."+domain+'/%'), Post.url.ilike("https://www."+domain+'/%'),
Post.url.ilike("https://www."+domain+'/%'),
Post.url.ilike("https://www."+domain),
Post.url.ilike("https://www."+domain), Post.url.ilike("https://www."+domain),
Post.url.ilike("https://old." + domain + '/%'), Post.url.ilike("https://old." + domain + '/%'),
Post.url.ilike("https://old." + domain + '/%'),
Post.url.ilike("https://old." + domain),
Post.url.ilike("https://old." + domain) Post.url.ilike("https://old." + domain)
) )
) )
if 'subreddit' in criteria:
subreddit = criteria['subreddit']
if not subreddit_name_regex.fullmatch(subreddit):
abort(400, "Invalid subreddit name.")
posts = posts.filter(Post.url.ilike(f"https://old.reddit.com/r/{subreddit}/%"))
if search_operator_hole in criteria: if search_operator_hole in criteria:
posts = posts.filter(Post.sub == criteria[search_operator_hole]) posts = posts.filter(Post.sub == criteria[search_operator_hole])

View File

@ -12,6 +12,7 @@ from sqlalchemy.orm import load_only
from files.helpers.actions import * from files.helpers.actions import *
from files.helpers.alerts import * from files.helpers.alerts import *
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.slurs_and_profanities import censor_slurs_profanities
from files.helpers.get import * from files.helpers.get import *
from files.helpers.mail import * from files.helpers.mail import *
from files.helpers.media import * from files.helpers.media import *
@ -908,7 +909,7 @@ def settings_title_change(v):
if customtitleplain: if customtitleplain:
customtitle = filter_emojis_only(customtitleplain) customtitle = filter_emojis_only(customtitleplain)
customtitle = censor_slurs(customtitle, None) customtitle = censor_slurs_profanities(customtitle, None)
if len(customtitle) > 1000: if len(customtitle) > 1000:
abort(400, "Flair too long!") abort(400, "Flair too long!")

View File

@ -15,17 +15,16 @@
<div class="btn-group"> <div class="btn-group">
<button type="button" id="twentyone-DEAL" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="deal()">Deal</button> <button type="button" id="twentyone-DEAL" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="deal()">Deal</button>
<button type="button" id="twentyone-SPLIT" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="split()"
style="display: none">Split</button>
<button type="button" id="twentyone-HIT" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="hit()" style="display: none">Hit</button> <button type="button" id="twentyone-HIT" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="hit()" style="display: none">Hit</button>
<button type="button" id="twentyone-STAY" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="stay()" <button type="button" id="twentyone-STAY" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="stay()"
style="display: none">Stay</button> style="display: none">Stay</button>
<button type="button" id="twentyone-SPLIT" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="split()"
style="display: none">Split</button>
<button type="button" id="twentyone-DOUBLE_DOWN" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="doubleDown()" <button type="button" id="twentyone-DOUBLE_DOWN" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="doubleDown()"
style="display: none">Double Down</button> style="display: none">Double Down</button>
<button type="button" id="twentyone-BUY_INSURANCE" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="buyInsurance()" <button type="button" id="twentyone-BUY_INSURANCE" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="buyInsurance()"
style="display: none">Buy style="display: none">Buy
Insurance</button> Insurance</button>
</div> </div>
<div id="twentyone-SPLIT_ACTIONS" class="btn-group" style="display: none;"> <div id="twentyone-SPLIT_ACTIONS" class="btn-group" style="display: none;">

View File

@ -103,7 +103,7 @@
</a> </a>
{% if sub %} {% if sub %}
<a id="sub-name" href="/h/{{sub}}" class="font-weight-bold ml-1 flex-grow-1 mt-1" {% if sub.name|length >= 17 %}style="font-size:max(10px,1.2vw)"{% endif %}>{% if not HOLE_STYLE_FLAIR %}/h/{% endif %}{{sub}}</a> <a id="sub-name" href="/h/{{sub}}" class="font-weight-bold flex-grow-1 ml-2 mt-1" {% if sub.name|length >= 17 %}style="font-size:max(10px,1.2vw)"{% endif %}>{% if not HOLE_STYLE_FLAIR %}/h/{% endif %}{{sub}}</a>
{% elif has_logo %} {% elif has_logo %}
<div id="logo-container" class="flex-grow-1 logo-container"> <div id="logo-container" class="flex-grow-1 logo-container">
<a href="/"> <a href="/">

View File

@ -21,7 +21,7 @@
<div class="awards-wrapper" style="text-align:center"> <div class="awards-wrapper" style="text-align:center">
{% macro iterate_awards(awards) %} {% macro iterate_awards(awards) %}
{% for award in awards %} {% for award in awards %}
{% set price = (award.price*v.discount)|int %} {% set price = (award.price*v.award_discount)|int %}
<div data-bs-toggle="tooltip" data-bs-placement="bottom" title="Price: {{price}} coins/marseybux - {{award.description}}" id="{{award.kind}}" data-nonce="{{g.nonce}}" data-onclick="pick('{{award.kind}}', {{price}}, {{v.coins}}, {{v.marseybux}})"> <div data-bs-toggle="tooltip" data-bs-placement="bottom" title="Price: {{price}} coins/marseybux - {{award.description}}" id="{{award.kind}}" data-nonce="{{g.nonce}}" data-onclick="pick('{{award.kind}}', {{price}}, {{v.coins}}, {{v.marseybux}})">
<i class="{{award.icon}} {{award.color}}"></i> <i class="{{award.icon}} {{award.color}}"></i>
<div class="pt-1 award-name">{{award.title}}</div> <div class="pt-1 award-name">{{award.title}}</div>

View File

@ -77,6 +77,10 @@
<div style="display: inline-block; width: 150px; text-align: center">Exact Match Only:</div> <div style="display: inline-block; width: 150px; text-align: center">Exact Match Only:</div>
<button type="button" data-nonce="{{g.nonce}}" data-onclick="addParam(this, 'bool')" class="searchparam mb-1">exact:true</button> <button type="button" data-nonce="{{g.nonce}}" data-onclick="addParam(this, 'bool')" class="searchparam mb-1">exact:true</button>
</div> </div>
<div>
<div style="display: inline-block; width: 150px; text-align: center">Subreddit:</div>
<button type="button" data-nonce="{{g.nonce}}" data-onclick="addParam(this)" class="searchparam mb-1">subreddit:menslib</button>
</div>
{% endif %} {% endif %}
{% if FEATURES['NSFW_MARKING'] %} {% if FEATURES['NSFW_MARKING'] %}
<div> <div>

View File

@ -45,7 +45,7 @@
<form action="{{form_action}}" id="{{id}}-color-code-form" method="post"> <form action="{{form_action}}" id="{{id}}-color-code-form" method="post">
<input hidden name="formkey" value="{{v|formkey}}"> <input hidden name="formkey" value="{{v|formkey}}">
<input autocomplete="off" class="form-control" type="text" name="{{form_name}}" id="{{id}}-color-code" minlength="6" maxlength="6" value="{% if current_color %}{{current_color}}{% endif %}"> <input autocomplete="off" class="form-control" type="text" name="{{form_name}}" id="{{id}}-color-code" minlength="6" maxlength="6" value="{% if current_color %}{{current_color}}{% endif %}">
<label class="btn btn-secondary text-capitalize mr-2 mt-2 mb-0">Upload<input type="submit" for="{{id}}-color-code" hidden></label> <label class="btn btn-secondary text-capitalize mr-2 mt-2 mb-0">Update<input type="submit" for="{{id}}-color-code" hidden></label>
</form> </form>
</div> </div>
</div> </div>

View File

@ -124,7 +124,7 @@
<form action="/settings/images/profile" method="post" enctype="multipart/form-data"> <form action="/settings/images/profile" method="post" enctype="multipart/form-data">
<input hidden name="formkey" value="{{v|formkey}}"> <input hidden name="formkey" value="{{v|formkey}}">
<label class="btn btn-secondary text-capitalize mr-2 mb-0"> <label class="btn btn-secondary text-capitalize mr-2 mb-0">
Update<input autocomplete="off" type="file" accept="image/*" {% if g.is_tor %}disabled{% endif %} hidden name="profile" data-nonce="{{g.nonce}}" onchange_submit> Upload<input autocomplete="off" type="file" accept="image/*" {% if g.is_tor %}disabled{% endif %} hidden name="profile" data-nonce="{{g.nonce}}" onchange_submit>
</label> </label>
</form> </form>
</div> </div>
@ -146,7 +146,7 @@
<form action="/settings/images/banner" method="post" enctype="multipart/form-data"> <form action="/settings/images/banner" method="post" enctype="multipart/form-data">
<input hidden name="formkey" value="{{v|formkey}}"> <input hidden name="formkey" value="{{v|formkey}}">
<label class="btn btn-secondary text-capitalize mr-2 mb-0"> <label class="btn btn-secondary text-capitalize mr-2 mb-0">
Update<input autocomplete="off" type="file" {% if g.is_tor %}disabled{% endif %} accept="image/*" hidden name="banner" data-nonce="{{g.nonce}}" onchange_submit> Upload<input autocomplete="off" type="file" {% if g.is_tor %}disabled{% endif %} accept="image/*" hidden name="banner" data-nonce="{{g.nonce}}" onchange_submit>
</label> </label>
</form> </form>
</div> </div>
@ -171,7 +171,7 @@
<form action="/settings/images/profile_background" method="post" enctype="multipart/form-data"> <form action="/settings/images/profile_background" method="post" enctype="multipart/form-data">
<input hidden name="formkey" value="{{v|formkey}}"> <input hidden name="formkey" value="{{v|formkey}}">
<label class="btn btn-secondary text-capitalize mr-2 mb-0"> <label class="btn btn-secondary text-capitalize mr-2 mb-0">
Update<input autocomplete="off" type="file" {% if g.is_tor %}disabled{% endif %} accept="image/*" hidden name="profile_background" data-nonce="{{g.nonce}}" onchange_submit> Upload<input autocomplete="off" type="file" {% if g.is_tor %}disabled{% endif %} accept="image/*" hidden name="profile_background" data-nonce="{{g.nonce}}" onchange_submit>
</label> </label>
</form> </form>
</div> </div>

View File

@ -29,7 +29,7 @@
{% if FEATURES['MARSEYBUX'] %} {% if FEATURES['MARSEYBUX'] %}
<li>Your current marseybux: {{"{:,}".format(v.marseybux)}}</li> <li>Your current marseybux: {{"{:,}".format(v.marseybux)}}</li>
{% endif %} {% endif %}
<li>Your total award discount: {{v.formatted_discount}}</li> <li>Your total award discount: {{v.formatted_award_discount}}</li>
</ul> </ul>
</header> </header>
{% endblock %} {% endblock %}

View File

@ -22,7 +22,7 @@
<form class="d-inline-block" action="/h/{{sub}}/marsey_image" method="post" enctype="multipart/form-data"> <form class="d-inline-block" action="/h/{{sub}}/marsey_image" method="post" enctype="multipart/form-data">
<input hidden name="formkey" value="{{v|formkey}}"> <input hidden name="formkey" value="{{v|formkey}}">
<label class="btn btn-secondary text-capitalize mr-2 mb-0"> <label class="btn btn-secondary text-capitalize mr-2 mb-0">
Update<input autocomplete="off" type="file" accept="image/*" {% if g.is_tor %}disabled{% endif %} hidden name="marsey" data-nonce="{{g.nonce}}" onchange_submit> Upload<input autocomplete="off" type="file" accept="image/*" {% if g.is_tor %}disabled{% endif %} hidden name="marsey" data-nonce="{{g.nonce}}" onchange_submit>
</label> </label>
</form> </form>
<div class="text-small text-muted mt-3"> <div class="text-small text-muted mt-3">
@ -36,7 +36,7 @@
<form class="d-inline-block mt-2" action="/h/{{sub}}/sidebar_image" method="post" enctype="multipart/form-data"> <form class="d-inline-block mt-2" action="/h/{{sub}}/sidebar_image" method="post" enctype="multipart/form-data">
<input hidden name="formkey" value="{{v|formkey}}"> <input hidden name="formkey" value="{{v|formkey}}">
<label class="btn btn-secondary text-capitalize mr-2 mb-0"> <label class="btn btn-secondary text-capitalize mr-2 mb-0">
Update<input autocomplete="off" type="file" accept="image/*" {% if g.is_tor %}disabled{% endif %} hidden name="sidebar" data-nonce="{{g.nonce}}" onchange_submit> Upload<input autocomplete="off" type="file" accept="image/*" {% if g.is_tor %}disabled{% endif %} hidden name="sidebar" data-nonce="{{g.nonce}}" onchange_submit>
</label> </label>
</form> </form>
<div class="text-small text-muted mt-3"> <div class="text-small text-muted mt-3">

View File

@ -245,7 +245,7 @@
<p id="profile--info--lifetime-donated">Lifetime donated: ${{u.lifetimedonated}} (shown to you only)</p> <p id="profile--info--lifetime-donated">Lifetime donated: ${{u.lifetimedonated}} (shown to you only)</p>
{% endif %} {% endif %}
<p id="profile--info--discount">Total award discount: {{u.formatted_discount}}</p> <p id="profile--info--discount">Total award discount: {{u.formatted_award_discount}}</p>
{% if u.is_private %} {% if u.is_private %}
<p id="profile--info--private">User has private mode enabled</p> <p id="profile--info--private">User has private mode enabled</p>
@ -394,7 +394,7 @@
{% if FEATURES['USERS_PROFILE_BODYTEXT'] -%} {% if FEATURES['USERS_PROFILE_BODYTEXT'] -%}
{% if u.bio_html and u.can_see_my_shit %} {% if u.bio_html and u.can_see_my_shit %}
<div class="text-muted text-break" id="profile-mobile--bio">{{u.bio_html | safe}}</div> <div class="text-muted text-break mt-1" id="profile-mobile--bio">{{u.bio_html | safe}}</div>
{% endif %} {% endif %}
{% if u.friends_html and u.can_see_my_shit %} {% if u.friends_html and u.can_see_my_shit %}
@ -533,7 +533,7 @@
<p id="profile-mobile--info--lifetime-donated">Lifetime donated: ${{u.lifetimedonated}} (shown to you only)</p> <p id="profile-mobile--info--lifetime-donated">Lifetime donated: ${{u.lifetimedonated}} (shown to you only)</p>
{% endif %} {% endif %}
<p id="profile-mobile--info--discount">Total award discount: {{u.formatted_discount}}</p> <p id="profile-mobile--info--discount">Total award discount: {{u.formatted_award_discount}}</p>
{% if u.is_private %} {% if u.is_private %}
<p id="profile-mobile--info--private">User has private mode enabled</p> <p id="profile-mobile--info--private">User has private mode enabled</p>

View File

@ -3327,3 +3327,55 @@ Hows that job going? Still working at the gay retard factory?
Instead of saying “speaking as a woman”, just make your point without the preamble. People will know that youre a woman by noticing that what youre saying is wrong. Instead of saying “speaking as a woman”, just make your point without the preamble. People will know that youre a woman by noticing that what youre saying is wrong.
{[para]} {[para]}
https://i.watchpeopledie.tv/images/16950118870526097.webp https://i.watchpeopledie.tv/images/16950118870526097.webp
{[para]}
Pisses me right off!..
Especially when a guy
(who used to basically be my step dad.... not joking.)
GOT 40 YEARS!!!!!!!!!! 😡
What?
What did he do you ask?...
He drove...
(under the threat of his girlfriend..
[being my mum..at the time]
and his family..
[being me and his own mum]
being shot)
a close friend of his around a bit........
Who critically injured his ex partner with a sawed off shotgun,
Then shot her new boyfriend..who later died,
Then went on to shoot a police officer in the face through the officers side window.. resulting in the officer being permanently blinded in both eyes.
My (basically) step-dad didn't pull a trigger at all............
BUT AGAIN!.... HE GOT F-O-R-T-Y YEARSSS!!!!!!!! 😤
So if what you're saying about this bitch is true.......
Only getting......
8 years..........
In a place where the death penalty is. 😐😕 Wow!
(The crime I'm referring to happened in United Kingdom)
Sorry about the rant. You're comment about 8 years got me riled up about the justice system.
P.S...... Yes i like putting lots of full stops and starting new lines 😂.
{[para]}
get off this site retard

View File

@ -4484,3 +4484,13 @@ mom said its my turn to post this
:stabl#er: :stabl#er:
{[para]} {[para]}
https://i.rdrama.net/images/16952178175040581.webp https://i.rdrama.net/images/16952178175040581.webp
{[para]}
Are the Redditors biting son?
{[para]}
"But lo, the butt was flat. And so Abraham wept unto the sky, "O Lord, why hast thou forced a pancake butt upon my household?" - Bimothy 14:88
{[para]}
Ezekiel 23:20
{[para]}
https://i.rdrama.net/images/16953344801317484.webp
{[para]}
https://i.rdrama.net/images/16954095136634.webp