Merge branch 'rDrama-master' into top/fix-split

pull/205/head
Chuck 2023-09-22 21:28:10 -07:00
commit 443b9632cf
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;
}

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')) {
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();
}

View File

@ -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);
}
}

View File

@ -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);

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.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

View File

@ -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

View File

@ -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>'

View File

@ -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

View File

@ -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

View File

@ -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>'

View File

@ -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

View File

@ -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]

View File

@ -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,

View File

@ -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

View File

@ -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!")

View File

@ -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,

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)
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

View File

@ -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 = []

View File

@ -1,4 +1,3 @@
import re
from files.helpers.regex import *
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_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']

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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()),
}

View File

@ -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)

View File

@ -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:

View File

@ -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])

View File

@ -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!")

View File

@ -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;">

View File

@ -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="/">

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 %}

View File

@ -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">

View File

@ -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>

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.
{[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

View File

@ -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