diff --git a/files/classes/comment.py b/files/classes/comment.py index c8cf762d79..8068b5db79 100644 --- a/files/classes/comment.py +++ b/files/classes/comment.py @@ -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 diff --git a/files/classes/hats.py b/files/classes/hats.py index 804e110636..b0ddd5b6d0 100644 --- a/files/classes/hats.py +++ b/files/classes/hats.py @@ -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 diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index b2fdeccc7d..72bf326150 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -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'@{self.target_user.username}' elif self.target_post_id: - return censor_slurs(f'{self.target_post.title_html}', None) + return censor_slurs_profanities(f'{self.target_post.title_html}', None) elif self.target_comment_id: return f'comment' diff --git a/files/classes/post.py b/files/classes/post.py index 7ea6ad1c04..bc23555eec 100644 --- a/files/classes/post.py +++ b/files/classes/post.py @@ -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 diff --git a/files/classes/reports.py b/files/classes/reports.py index 3ee76145ee..f05e391f20 100644 --- a/files/classes/reports.py +++ b/files/classes/reports.py @@ -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 diff --git a/files/classes/sub_logs.py b/files/classes/sub_logs.py index 99ca14f088..9cca9b9e0c 100644 --- a/files/classes/sub_logs.py +++ b/files/classes/sub_logs.py @@ -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'@{self.target_user.username}' elif self.target_post_id: - return censor_slurs(f'{self.target_post.title_html}', None) + return censor_slurs_profanities(f'{self.target_post.title_html}', None) elif self.target_comment_id: return f'comment' diff --git a/files/classes/user.py b/files/classes/user.py index 565e3a3771..33ba4e4164 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -1,6 +1,5 @@ import random from operator import * -import re import pyotp from sqlalchemy import Column, ForeignKey, FetchedValue diff --git a/files/helpers/alerts.py b/files/helpers/alerts.py index 5378bdfc3a..cd343360fb 100644 --- a/files/helpers/alerts.py +++ b/files/helpers/alerts.py @@ -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] diff --git a/files/helpers/config/const.py b/files/helpers/config/const.py index c4c3f82744..94606a5f9e 100644 --- a/files/helpers/config/const.py +++ b/files/helpers/config/const.py @@ -117,40 +117,6 @@ GIRL_PHRASES = [ "$ PERIODT" ] -tranny = f':marseytrain:' -trannie = f':!marseytrain:' -troon = f':marseytrain2:' - -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, - "(?(.+?)<\/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("(.{1,200})", 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 "' in body or '' 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, diff --git a/files/helpers/sharpen.py b/files/helpers/sharpen.py index 6f52dfeb80..04903ec539 100644 --- a/files/helpers/sharpen.py +++ b/files/helpers/sharpen.py @@ -1,4 +1,3 @@ -import re from files.helpers.regex import * def sharpen(string): diff --git a/files/helpers/slurs_and_profanities.py b/files/helpers/slurs_and_profanities.py new file mode 100644 index 0000000000..eb121f9da9 --- /dev/null +++ b/files/helpers/slurs_and_profanities.py @@ -0,0 +1,167 @@ +import re +from .config.const import * + +tranny = f':marseytrain:' +trannie = f':!marseytrain:' +troon = f':marseytrain2:' + +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, + "(?]*>|{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 + SLURS_FOR_REPLACING[newkey.title()] = val.title() + SLURS_FOR_REPLACING[newkey.upper()] = val.upper() + +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 + PROFANITIES_FOR_REPLACING[newkey.title()] = val.title() + PROFANITIES_FOR_REPLACING[newkey.upper()] = val.upper() + + + +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] + 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 '
' in body or '' 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
diff --git a/files/routes/admin.py b/files/routes/admin.py
index 8cb2e3a605..abeed62c91 100644
--- a/files/routes/admin.py
+++ b/files/routes/admin.py
@@ -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
diff --git a/files/routes/awards.py b/files/routes/awards.py
index 9ff7694dd5..8e6500d072 100644
--- a/files/routes/awards.py
+++ b/files/routes/awards.py
@@ -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
@@ -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
diff --git a/files/routes/chat.py b/files/routes/chat.py
index 5ab422259d..d76466069d 100644
--- a/files/routes/chat.py
+++ b/files/routes/chat.py
@@ -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()),
 	}
 
diff --git a/files/routes/settings.py b/files/routes/settings.py
index fcd27ba7d9..c0140aca92 100644
--- a/files/routes/settings.py
+++ b/files/routes/settings.py
@@ -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!")