Merge branch 'rDrama-master' into top/fix-split
|
@ -7745,7 +7745,7 @@ body {
|
|||
}
|
||||
}
|
||||
|
||||
p { /* fix the transform:exploit */
|
||||
p { /* DO NOT REMOVE */
|
||||
overflow: hidden !important;
|
||||
}
|
||||
|
||||
|
|
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 197 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 1.9 MiB |
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 7.9 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 9.8 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 9.3 KiB |
After Width: | Height: | Size: 30 KiB |
|
@ -171,7 +171,7 @@ function updateBlackjackTable(state) {
|
|||
|
||||
|
||||
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 {
|
||||
enableWager();
|
||||
}
|
||||
|
|
|
@ -367,3 +367,22 @@ setTimeout(function () {
|
|||
document.addEventListener('DOMContentLoaded', function () {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,21 +38,3 @@ orgy_file.addEventListener("timeupdate", function(){
|
|||
}, 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);
|
||||
|
|
|
@ -12,6 +12,7 @@ from sqlalchemy.sql.sqltypes import *
|
|||
|
||||
from files.classes import Base
|
||||
from files.helpers.config.const import *
|
||||
from files.helpers.slurs_and_profanities import *
|
||||
from files.helpers.lazy import lazy
|
||||
from files.helpers.regex import *
|
||||
from files.helpers.sorting_and_time import *
|
||||
|
@ -368,7 +369,7 @@ class Comment(Base):
|
|||
|
||||
if body:
|
||||
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)
|
||||
|
||||
|
@ -384,7 +385,7 @@ class Comment(Base):
|
|||
if not body: return ""
|
||||
|
||||
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)
|
||||
|
||||
return body
|
||||
|
|
|
@ -7,7 +7,7 @@ from flask import g
|
|||
|
||||
from files.classes import Base
|
||||
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):
|
||||
__tablename__ = "hat_defs"
|
||||
|
@ -37,7 +37,7 @@ class HatDef(Base):
|
|||
|
||||
@lazy
|
||||
def censored_description(self, v):
|
||||
return censor_slurs(self.description, v)
|
||||
return censor_slurs_profanities(self.description, v)
|
||||
|
||||
@property
|
||||
@lazy
|
||||
|
|
|
@ -7,7 +7,7 @@ from sqlalchemy.sql.sqltypes import *
|
|||
from files.classes import Base
|
||||
from files.helpers.config.const import *
|
||||
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
|
||||
|
||||
class ModAction(Base):
|
||||
|
@ -63,7 +63,7 @@ class ModAction(Base):
|
|||
if self.target_user_id:
|
||||
return f'<a href="{self.target_user.url}">@{self.target_user.username}</a>'
|
||||
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:
|
||||
return f'<a href="{self.target_comment.permalink}">comment</a>'
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ from sqlalchemy.sql.sqltypes import *
|
|||
|
||||
from files.classes import Base
|
||||
from files.helpers.config.const import *
|
||||
from files.helpers.slurs_and_profanities import *
|
||||
from files.helpers.lazy import lazy
|
||||
from files.helpers.regex import *
|
||||
from files.helpers.sorting_and_time import make_age_string
|
||||
|
@ -300,7 +301,7 @@ class Post(Base):
|
|||
body = add_options(self, body, v)
|
||||
|
||||
if self.sub != 'chudrama':
|
||||
body = censor_slurs(body, v)
|
||||
body = censor_slurs_profanities(body, v)
|
||||
|
||||
body = normalize_urls_runtime(body, v)
|
||||
|
||||
|
@ -315,7 +316,7 @@ class Post(Base):
|
|||
if not body: return ""
|
||||
|
||||
if self.sub != 'chudrama':
|
||||
body = censor_slurs(body, v)
|
||||
body = censor_slurs_profanities(body, v)
|
||||
body = replace_train_html(body)
|
||||
|
||||
body = normalize_urls_runtime(body, v)
|
||||
|
@ -327,7 +328,7 @@ class Post(Base):
|
|||
title = self.title_html
|
||||
|
||||
if self.sub != 'chudrama':
|
||||
title = censor_slurs(title, v)
|
||||
title = censor_slurs_profanities(title, v)
|
||||
|
||||
return title
|
||||
|
||||
|
@ -336,7 +337,7 @@ class Post(Base):
|
|||
title = self.title
|
||||
|
||||
if self.sub != 'chudrama':
|
||||
title = censor_slurs(title, v)
|
||||
title = censor_slurs_profanities(title, v)
|
||||
title = replace_train_html(title)
|
||||
|
||||
return title
|
||||
|
|
|
@ -6,7 +6,7 @@ from sqlalchemy.sql.sqltypes import *
|
|||
|
||||
from files.classes import Base
|
||||
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):
|
||||
__tablename__ = "reports"
|
||||
|
@ -27,7 +27,7 @@ class Report(Base):
|
|||
|
||||
@lazy
|
||||
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
|
||||
@property
|
||||
|
@ -55,7 +55,7 @@ class CommentReport(Base):
|
|||
|
||||
@lazy
|
||||
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
|
||||
@property
|
||||
|
|
|
@ -7,7 +7,7 @@ from sqlalchemy.sql.sqltypes import *
|
|||
from files.classes import Base
|
||||
from files.helpers.config.const import *
|
||||
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
|
||||
|
||||
class SubAction(Base):
|
||||
|
@ -52,7 +52,7 @@ class SubAction(Base):
|
|||
if self.target_user_id:
|
||||
return f'<a href="{self.target_user.url}">@{self.target_user.username}</a>'
|
||||
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:
|
||||
return f'<a href="{self.target_comment.permalink}">comment</a>'
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import random
|
||||
from operator import *
|
||||
import re
|
||||
|
||||
import pyotp
|
||||
from sqlalchemy import Column, ForeignKey, FetchedValue
|
||||
|
@ -493,7 +492,7 @@ class User(Base):
|
|||
|
||||
@property
|
||||
@lazy
|
||||
def discount(self):
|
||||
def award_discount(self):
|
||||
if self.patron in {1,2}: after_discount = 0.90
|
||||
elif self.patron == 3: after_discount = 0.85
|
||||
elif self.patron == 4: after_discount = 0.80
|
||||
|
@ -503,17 +502,19 @@ class User(Base):
|
|||
elif self.patron == 8: after_discount = 0.60
|
||||
else: after_discount = 1
|
||||
|
||||
after_discount -= 0.02 * self.admin_level
|
||||
|
||||
owned_badges = [x.badge_id for x in self.badges]
|
||||
|
||||
for badge in discounts:
|
||||
if badge in owned_badges: after_discount -= discounts[badge]
|
||||
|
||||
return after_discount
|
||||
return max(after_discount, 0.55)
|
||||
|
||||
@property
|
||||
@lazy
|
||||
def formatted_discount(self):
|
||||
discount = 100 - int(self.discount * 100)
|
||||
def formatted_award_discount(self):
|
||||
discount = 100 - int(self.award_discount * 100)
|
||||
return f'{discount}%'
|
||||
|
||||
@property
|
||||
|
|
|
@ -13,6 +13,7 @@ from files.classes import Comment, Notification, PushSubscription, Group
|
|||
from .config.const import *
|
||||
from .regex import *
|
||||
from .sanitize import *
|
||||
from .slurs_and_profanities import censor_slurs_profanities
|
||||
|
||||
def create_comment(text_html):
|
||||
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:
|
||||
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 = [x[0] for x in subscriptions]
|
||||
|
|
|
@ -700,7 +700,7 @@ AWARDS = {
|
|||
"benefactor": {
|
||||
"kind": "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",
|
||||
"color": "text-blue",
|
||||
"price": 4000,
|
||||
|
|
|
@ -106,7 +106,6 @@ GIRL_PHRASES = [
|
|||
"literally, $",
|
||||
"i feel like $",
|
||||
"my heart is telling me $",
|
||||
"its almost as if $",
|
||||
"omg! $",
|
||||
"im literally screaming, $",
|
||||
"$ and thats the tea, sis",
|
||||
|
@ -118,40 +117,6 @@ GIRL_PHRASES = [
|
|||
"$ 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"
|
||||
|
||||
REDDIT_NOTIFS_SITE = set()
|
||||
|
@ -200,55 +165,6 @@ if SITE_NAME == 'rDrama':
|
|||
"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 = {
|
||||
'furry',
|
||||
'femboy',
|
||||
|
@ -276,28 +192,6 @@ elif SITE_NAME == 'WPD':
|
|||
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')
|
||||
|
||||
CHUD_MSGS = (
|
||||
|
@ -764,6 +658,7 @@ elif SITE == 'watchpeopledie.tv':
|
|||
PERMS['HOLE_CREATE'] = 2
|
||||
PERMS['POST_COMMENT_EDITING'] = 3
|
||||
PERMS['MODS_EVERY_HOLE'] = 3
|
||||
PERMS['IS_PERMA_PROGSTACKED'] = 4
|
||||
|
||||
SUB_BANNER_LIMIT = 69420
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ from files.cli import app, db_session, g
|
|||
|
||||
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():
|
||||
g.db = db_session()
|
||||
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()
|
||||
|
||||
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()
|
||||
|
||||
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-20', 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):
|
||||
cron_fn(**kwargs)
|
||||
|
||||
|
@ -177,11 +182,7 @@ def _create_orgy():
|
|||
)
|
||||
g.db.add(orgy)
|
||||
|
||||
def _delete_all():
|
||||
orgy = g.db.query(Orgy).one_or_none()
|
||||
if orgy:
|
||||
g.db.delete(orgy)
|
||||
|
||||
def _delete_all_posts():
|
||||
posts = g.db.query(Post).filter_by(author_id=AUTOJANNY_ID, deleted_utc=0).all()
|
||||
for p in posts:
|
||||
p.deleted_utc = int(time.time())
|
||||
|
@ -415,3 +416,9 @@ def _unpin_expired():
|
|||
|
||||
if pins:
|
||||
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!")
|
||||
|
|
|
@ -84,11 +84,16 @@ def notify_mentions(mentions, send_to=None, mention_str='site mention'):
|
|||
)
|
||||
|
||||
g.db.flush()
|
||||
existing_comment = g.db.query(Comment.id).filter_by(
|
||||
author_id=const.AUTOJANNY_ID,
|
||||
parent_post=None,
|
||||
body_html=notif_text).one_or_none()
|
||||
if existing_comment: break
|
||||
try:
|
||||
existing_comment = g.db.query(Comment.id).filter_by(
|
||||
author_id=const.AUTOJANNY_ID,
|
||||
parent_post=None,
|
||||
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(
|
||||
author_id=const.AUTOJANNY_ID,
|
||||
|
|
|
@ -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)
|
||||
|
||||
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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
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_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)
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
||||
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 = {
|
||||
"fortune": FORTUNE_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
|
||||
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
|
||||
|
|
|
@ -260,6 +260,15 @@ def find_all_emote_endings(word):
|
|||
|
||||
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
|
||||
|
||||
|
||||
|
@ -282,16 +291,6 @@ def render_emoji(html, regexp, golden, emojis_used, b=False, is_title=False):
|
|||
old = emoji
|
||||
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 = '<img alt=":{0}:" data-bs-toggle="tooltip" loading="lazy" src="{1}" title=":{0}:"{2}>'
|
||||
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 = 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)
|
||||
|
||||
|
@ -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)
|
||||
soup = BeautifulSoup(sanitized, 'lxml')
|
||||
|
||||
has_transform = bool(soup.select('[style*=transform]'))
|
||||
|
||||
links = soup.find_all("a")
|
||||
|
||||
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["rel"] = "nofollow noopener"
|
||||
|
||||
if has_transform:
|
||||
del link["href"]
|
||||
|
||||
sanitized = str(soup).replace('<html><body>','').replace('</body></html>','').replace('/>','>')
|
||||
|
||||
captured = []
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import re
|
||||
from files.helpers.regex import *
|
||||
|
||||
def sharpen(string):
|
||||
|
|
|
@ -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
|
|
@ -269,7 +269,7 @@ def can_double_down(state):
|
|||
player = state['player']
|
||||
player_hand_value = get_value_of_hand(player)
|
||||
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):
|
||||
player = state['player']
|
||||
|
|
|
@ -56,4 +56,4 @@ if IS_LOCALHOST:
|
|||
if "cron" not in argv and "load_chat" not in argv:
|
||||
from files.helpers.cron import cron_fn
|
||||
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)
|
||||
|
|
|
@ -11,6 +11,7 @@ from files.helpers.actions import *
|
|||
from files.helpers.alerts import *
|
||||
from files.helpers.cloudflare 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.media import *
|
||||
from files.helpers.sanitize import *
|
||||
|
@ -909,7 +910,7 @@ def admin_title_change(user_id, v):
|
|||
|
||||
user.customtitleplain = 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.customtitle=new_name
|
||||
|
|
|
@ -9,6 +9,7 @@ from files.classes.userblock import UserBlock
|
|||
from files.helpers.actions import *
|
||||
from files.helpers.alerts 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.get import *
|
||||
from files.helpers.marsify import marsify
|
||||
|
@ -48,7 +49,7 @@ def shop(v):
|
|||
val["baseprice"] = int(val["price"])
|
||||
if val["kind"].endswith('Founder'):
|
||||
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()
|
||||
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"]
|
||||
|
||||
award_title = AWARDS[award]['title']
|
||||
price = int(og_price * v.discount)
|
||||
price = int(og_price * v.award_discount)
|
||||
|
||||
|
||||
if award == "grass":
|
||||
|
@ -394,7 +395,7 @@ def award_thing(v, thing_type, id):
|
|||
else:
|
||||
author.customtitleplain = 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)
|
||||
author.customtitle = new_name
|
||||
author.flairchanged = int(time.time()) + 86400
|
||||
|
@ -461,7 +462,7 @@ def award_thing(v, thing_type, id):
|
|||
author.patron = 1
|
||||
if author.patron_utc: author.patron_utc += 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)
|
||||
elif kind == "rehab":
|
||||
if author.rehab: author.rehab += 86400
|
||||
|
|
|
@ -9,6 +9,7 @@ from flask import request
|
|||
from files.helpers.actions import *
|
||||
from files.helpers.alerts 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.media import *
|
||||
from files.helpers.sanitize import *
|
||||
|
@ -167,9 +168,9 @@ def speak(data, v):
|
|||
"namecolor": v.name_color,
|
||||
"patron": v.patron,
|
||||
"text": text,
|
||||
"text_censored": censor_slurs(text, 'chat'),
|
||||
"text_censored": censor_slurs_profanities(text, 'chat'),
|
||||
"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()),
|
||||
}
|
||||
|
||||
|
|
|
@ -663,12 +663,10 @@ def edit_comment(cid, v):
|
|||
abort(400, "You have to actually type something!")
|
||||
|
||||
if body != c.body or request.files.get("file") and not g.is_tor:
|
||||
|
||||
if v.id == c.author_id:
|
||||
if v.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
|
||||
abort(403, "You have to type more than 280 characters!")
|
||||
elif v.bird and len(body) > 140:
|
||||
abort(403, "You have to type less than 140 characters!")
|
||||
if c.author.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
|
||||
abort(403, "You have to type more than 280 characters!")
|
||||
elif c.author.bird and len(body) > 140:
|
||||
abort(403, "You have to type less than 140 characters!")
|
||||
|
||||
execute_antispam_comment_check(body, v)
|
||||
|
||||
|
@ -677,11 +675,10 @@ def edit_comment(cid, v):
|
|||
|
||||
body_for_sanitize = body
|
||||
|
||||
if v.id == c.author_id:
|
||||
if v.owoify:
|
||||
body_for_sanitize = owoify(body_for_sanitize)
|
||||
if v.marsify and not v.chud:
|
||||
body_for_sanitize = marsify(body_for_sanitize)
|
||||
if c.author.owoify:
|
||||
body_for_sanitize = owoify(body_for_sanitize)
|
||||
if c.author.marsify and not c.author.chud:
|
||||
body_for_sanitize = marsify(body_for_sanitize)
|
||||
|
||||
if c.sharpened:
|
||||
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 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!")
|
||||
|
||||
oldtext = c.body
|
||||
|
@ -702,7 +699,7 @@ def edit_comment(cid, v):
|
|||
execute_blackjack(v, c, c.body, "comment")
|
||||
|
||||
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)
|
||||
|
||||
|
|
|
@ -995,11 +995,10 @@ def edit_post(pid, v):
|
|||
body = request.values.get("body", "")
|
||||
body = body[:POST_BODY_LENGTH_LIMIT(g.v)].strip()
|
||||
|
||||
if v.id == p.author_id:
|
||||
if v.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
|
||||
abort(403, "You have to type more than 280 characters!")
|
||||
elif v.bird and len(body) > 140:
|
||||
abort(403, "You have to type less than 140 characters!")
|
||||
if p.author.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
|
||||
abort(403, "You have to type more than 280 characters!")
|
||||
elif p.author.bird and len(body) > 140:
|
||||
abort(403, "You have to type less than 140 characters!")
|
||||
|
||||
if not title:
|
||||
abort(400, "Please enter a better title!")
|
||||
|
@ -1019,7 +1018,7 @@ def edit_post(pid, v):
|
|||
if title != p.title:
|
||||
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!")
|
||||
|
||||
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)
|
||||
|
||||
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!")
|
||||
|
||||
|
||||
|
@ -1057,7 +1056,7 @@ def edit_post(pid, v):
|
|||
|
||||
|
||||
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:
|
||||
|
|
|
@ -22,6 +22,7 @@ valid_params = [
|
|||
'title',
|
||||
'sentto',
|
||||
search_operator_hole,
|
||||
'subreddit',
|
||||
]
|
||||
|
||||
def searchparse(text):
|
||||
|
@ -114,27 +115,30 @@ def searchposts(v):
|
|||
if 'over18' in criteria: posts = posts.filter(Post.over_18==True)
|
||||
|
||||
if 'domain' in criteria:
|
||||
domain=criteria['domain']
|
||||
domain = criteria['domain']
|
||||
|
||||
domain = domain.replace('\\', '').replace('_', '\_').replace('%', '').strip()
|
||||
|
||||
posts=posts.filter(
|
||||
posts = posts.filter(
|
||||
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://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)
|
||||
)
|
||||
)
|
||||
|
||||
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:
|
||||
posts = posts.filter(Post.sub == criteria[search_operator_hole])
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ from sqlalchemy.orm import load_only
|
|||
from files.helpers.actions import *
|
||||
from files.helpers.alerts 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.mail import *
|
||||
from files.helpers.media import *
|
||||
|
@ -908,7 +909,7 @@ def settings_title_change(v):
|
|||
|
||||
if customtitleplain:
|
||||
customtitle = filter_emojis_only(customtitleplain)
|
||||
customtitle = censor_slurs(customtitle, None)
|
||||
customtitle = censor_slurs_profanities(customtitle, None)
|
||||
|
||||
if len(customtitle) > 1000:
|
||||
abort(400, "Flair too long!")
|
||||
|
|
|
@ -15,17 +15,16 @@
|
|||
|
||||
<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-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-STAY" class="btn btn-primary twentyone-btn" data-nonce="{{g.nonce}}" data-onclick="stay()"
|
||||
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()"
|
||||
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()"
|
||||
style="display: none">Buy
|
||||
Insurance</button>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="twentyone-SPLIT_ACTIONS" class="btn-group" style="display: none;">
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
</a>
|
||||
|
||||
{% 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 %}
|
||||
<div id="logo-container" class="flex-grow-1 logo-container">
|
||||
<a href="/">
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<div class="awards-wrapper" style="text-align:center">
|
||||
{% macro iterate_awards(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}})">
|
||||
<i class="{{award.icon}} {{award.color}}"></i>
|
||||
<div class="pt-1 award-name">{{award.title}}</div>
|
||||
|
|
|
@ -77,6 +77,10 @@
|
|||
<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>
|
||||
</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 %}
|
||||
{% if FEATURES['NSFW_MARKING'] %}
|
||||
<div>
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
<form action="{{form_action}}" id="{{id}}-color-code-form" method="post">
|
||||
<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 %}">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -124,7 +124,7 @@
|
|||
<form action="/settings/images/profile" method="post" enctype="multipart/form-data">
|
||||
<input hidden name="formkey" value="{{v|formkey}}">
|
||||
<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>
|
||||
</form>
|
||||
</div>
|
||||
|
@ -146,7 +146,7 @@
|
|||
<form action="/settings/images/banner" method="post" enctype="multipart/form-data">
|
||||
<input hidden name="formkey" value="{{v|formkey}}">
|
||||
<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>
|
||||
</form>
|
||||
</div>
|
||||
|
@ -171,7 +171,7 @@
|
|||
<form action="/settings/images/profile_background" method="post" enctype="multipart/form-data">
|
||||
<input hidden name="formkey" value="{{v|formkey}}">
|
||||
<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>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
{% if FEATURES['MARSEYBUX'] %}
|
||||
<li>Your current marseybux: {{"{:,}".format(v.marseybux)}}</li>
|
||||
{% endif %}
|
||||
<li>Your total award discount: {{v.formatted_discount}}</li>
|
||||
<li>Your total award discount: {{v.formatted_award_discount}}</li>
|
||||
</ul>
|
||||
</header>
|
||||
{% endblock %}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<form class="d-inline-block" action="/h/{{sub}}/marsey_image" method="post" enctype="multipart/form-data">
|
||||
<input hidden name="formkey" value="{{v|formkey}}">
|
||||
<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>
|
||||
</form>
|
||||
<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">
|
||||
<input hidden name="formkey" value="{{v|formkey}}">
|
||||
<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>
|
||||
</form>
|
||||
<div class="text-small text-muted mt-3">
|
||||
|
|
|
@ -245,7 +245,7 @@
|
|||
<p id="profile--info--lifetime-donated">Lifetime donated: ${{u.lifetimedonated}} (shown to you only)</p>
|
||||
{% 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 %}
|
||||
<p id="profile--info--private">User has private mode enabled</p>
|
||||
|
@ -394,7 +394,7 @@
|
|||
|
||||
{% if FEATURES['USERS_PROFILE_BODYTEXT'] -%}
|
||||
{% 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 %}
|
||||
|
||||
{% 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>
|
||||
{% 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 %}
|
||||
<p id="profile-mobile--info--private">User has private mode enabled</p>
|
||||
|
|
|
@ -3327,3 +3327,55 @@ How’s 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 you’re a woman by noticing that what you’re saying is wrong.
|
||||
{[para]}
|
||||
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
|
||||
|
|
|
@ -4484,3 +4484,13 @@ mom said its my turn to post this
|
|||
:stabl#er:
|
||||
{[para]}
|
||||
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
|
||||
|
|