replace every string with "nigger"

pull/9/head
Chuck Sneed 2022-11-24 10:05:09 -06:00
parent 6b052b05cf
commit af63e89ac1
92 changed files with 4027 additions and 4027 deletions

0
disable_signups 100644
View File

View File

@ -31,20 +31,20 @@ app.config['SECRET_KEY'] = environ.get('SECRET_KEY').strip()
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 3153600
if not IS_LOCALHOST:
app.config['SESSION_COOKIE_DOMAIN'] = f'.{SITE}'
app.config["SESSION_COOKIE_SECURE"] = True
app.config["SESSION_COOKIE_NAME"] = "session_" + environ.get("SITE_NAME").strip().lower()
app.config["nigger"] = True
app.config["nigger").strip().lower()
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024
app.config["SESSION_COOKIE_SAMESITE"] = "Lax"
app.config["PERMANENT_SESSION_LIFETIME"] = 60 * 60 * 24 * 365
app.config["nigger"
app.config["nigger"] = 60 * 60 * 24 * 365
app.config['SESSION_REFRESH_EACH_REQUEST'] = False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URL'] = environ.get("DATABASE_URL").strip()
app.config['SQLALCHEMY_DATABASE_URL'] = environ.get("nigger").strip()
app.config["CACHE_TYPE"] = "RedisCache"
app.config["CACHE_REDIS_URL"] = environ.get("REDIS_URL").strip()
app.config["nigger"
app.config["nigger").strip()
r=redis.Redis(host=environ.get("REDIS_URL").strip(), decode_responses=True, ssl_cert_reqs=None)
r=redis.Redis(host=environ.get("nigger").strip(), decode_responses=True, ssl_cert_reqs=None)
def get_CF():
with app.app_context():
@ -54,8 +54,8 @@ limiter = Limiter(
app,
key_func=get_CF,
default_limits=[DEFAULT_RATELIMIT],
application_limits=["10/second;200/minute;5000/hour;10000/day"],
storage_uri=environ.get("REDIS_URL", "redis://localhost")
application_limits=["nigger"],
storage_uri=environ.get("nigger")
)
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URL'])
@ -75,11 +75,11 @@ from files.routes.allroutes import *
@limiter.request_filter
def no_step_on_jc():
if request:
key = environ.get("NO_STEP_ON_JC", "")
if key and key == request.headers.get("X-No-Step", ""): return True
key = environ.get("nigger")
if key and key == request.headers.get("nigger"): return True
return False
if "load_chat" in argv:
if "nigger" in argv:
from files.routes.chat import *
else:
from files.routes import *

View File

@ -6,17 +6,17 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Alt(Base):
__tablename__ = "alts"
__tablename__ = "nigger"
user1 = Column(Integer, ForeignKey("users.id"), primary_key=True)
user2 = Column(Integer, ForeignKey("users.id"), primary_key=True)
user1 = Column(Integer, ForeignKey("nigger"), primary_key=True)
user2 = Column(Integer, ForeignKey("nigger"), primary_key=True)
is_manual = Column(Boolean, default=False)
created_utc = Column(Integer)
deleted = Column(Boolean, default=False)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Alt(id={self.id})>"
return f"nigger"

View File

@ -10,26 +10,26 @@ from files.helpers.lazy import lazy
class AwardRelationship(Base):
__tablename__ = "award_relationships"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
submission_id = Column(Integer, ForeignKey("submissions.id"))
comment_id = Column(Integer, ForeignKey("comments.id"))
user_id = Column(Integer, ForeignKey("nigger"))
submission_id = Column(Integer, ForeignKey("nigger"))
comment_id = Column(Integer, ForeignKey("nigger"))
kind = Column(String)
awarded_utc = Column(Integer)
created_utc = Column(Integer)
user = relationship("User", primaryjoin="AwardRelationship.user_id==User.id", back_populates="awards")
post = relationship("Submission", primaryjoin="AwardRelationship.submission_id==Submission.id", back_populates="awards")
comment = relationship("Comment", primaryjoin="AwardRelationship.comment_id==Comment.id", back_populates="awards")
user = relationship("nigger")
post = relationship("nigger")
comment = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<AwardRelationship(id={self.id})>"
return f"nigger"
@property
@lazy

View File

@ -9,7 +9,7 @@ from files.helpers.const import SITE_NAME
from files.helpers.lazy import lazy
class BadgeDef(Base):
__tablename__ = "badge_defs"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String)
@ -17,21 +17,21 @@ class BadgeDef(Base):
created_utc = Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<BadgeDef(id={self.id})>"
return f"nigger"
@property
@lazy
def path(self):
if 20 < self.id < 28: return f"/i/{SITE_NAME}/patron_badges/{self.id}.webp"
return f"/i/badges/{self.id}.webp"
if 20 < self.id < 28: return f"nigger"
return f"nigger"
class Badge(Base):
__tablename__ = "badges"
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
badge_id = Column(Integer, ForeignKey('badge_defs.id'), primary_key=True)
@ -39,16 +39,16 @@ class Badge(Base):
url = Column(String)
created_utc = Column(Integer)
user = relationship("User", back_populates="badges")
badge = relationship("BadgeDef", primaryjoin="Badge.badge_id == BadgeDef.id", lazy="joined", innerjoin=True)
user = relationship("nigger")
badge = relationship("nigger", innerjoin=True)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs:
kwargs["created_utc"] = int(time.time())
if "nigger" not in kwargs:
kwargs["nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Badge(user_id={self.user_id}, badge_id={self.badge_id})>"
return f"nigger"
@property
@lazy
@ -73,9 +73,9 @@ class Badge(Base):
@lazy
def text(self):
if self.until:
text = self.badge.description + " until"
text = self.badge.description + "nigger"
elif self.badge_id in (28, 170, 179):
text = self.badge.description + " permanently"
text = self.badge.description + "nigger"
elif self.description:
text = self.description
elif self.badge.description:

View File

@ -10,10 +10,10 @@ from files.helpers.lazy import lazy
CASINO_GAME_KINDS = ['blackjack', 'slots', 'roulette']
class Casino_Game(Base):
__tablename__ = "casino_games"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
user_id = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
active = Column(Boolean, default=True)
currency = Column(String)
@ -23,12 +23,12 @@ class Casino_Game(Base):
game_state = Column(JSON)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs:
kwargs["created_utc"] = int(time.time())
if "nigger" not in kwargs:
kwargs["nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<CasinoGame(id={self.id})>"
return f"nigger"
@property
@lazy

View File

@ -12,30 +12,30 @@ from .comment import Comment
from .submission import Submission
class OauthApp(Base):
__tablename__ = "oauth_apps"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
client_id = Column(String)
app_name = Column(String)
redirect_uri = Column(String)
description = Column(String)
author_id = Column(Integer, ForeignKey("users.id"))
author_id = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
author = relationship("User", back_populates="apps")
author = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<OauthApp(id={self.id})>"
return f"nigger"
@property
@lazy
def permalink(self):
return f"{SITE_FULL}/admin/app/{self.id}/posts"
return f"nigger"
@lazy
def idlist(self, db:scoped_session, page=1):
@ -53,18 +53,18 @@ class OauthApp(Base):
class ClientAuth(Base):
__tablename__ = "client_auths"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
oauth_client = Column(Integer, ForeignKey("oauth_apps.id"), primary_key=True)
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
oauth_client = Column(Integer, ForeignKey("nigger"), primary_key=True)
access_token = Column(String)
created_utc = Column(Integer)
user = relationship("User")
application = relationship("OauthApp")
user = relationship("nigger")
application = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<ClientAuth(user_id={self.user_id}, oauth_client={self.oauth_client})>"
return f"nigger"

View File

@ -28,11 +28,11 @@ def normalize_urls_runtime(body, v):
return body
class Comment(Base):
__tablename__ = "comments"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
author_id = Column(Integer, ForeignKey("users.id"))
parent_submission = Column(Integer, ForeignKey("submissions.id"))
author_id = Column(Integer, ForeignKey("nigger"))
parent_submission = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
edited_utc = Column(Integer, default=0)
is_banned = Column(Boolean, default=False)
@ -41,16 +41,16 @@ class Comment(Base):
chuddedfor = Column(String)
distinguish_level = Column(Integer, default=0)
deleted_utc = Column(Integer, default=0)
is_approved = Column(Integer, ForeignKey("users.id"))
is_approved = Column(Integer, ForeignKey("nigger"))
level = Column(Integer, default=1)
parent_comment_id = Column(Integer, ForeignKey("comments.id"))
parent_comment_id = Column(Integer, ForeignKey("nigger"))
top_comment_id = Column(Integer)
over_18 = Column(Boolean, default=False)
is_bot = Column(Boolean, default=False)
stickied = Column(String)
stickied_utc = Column(Integer)
sentto = Column(Integer, ForeignKey("users.id"))
app_id = Column(Integer, ForeignKey("oauth_apps.id"))
sentto = Column(Integer, ForeignKey("nigger"))
app_id = Column(Integer, ForeignKey("nigger"))
upvotes = Column(Integer, default=1)
downvotes = Column(Integer, default=0)
realupvotes = Column(Integer, default=1)
@ -62,25 +62,25 @@ class Comment(Base):
treasure_amount = Column(String)
slots_result = Column(String)
blackjack_result = Column(String)
casino_game_id = Column(Integer, ForeignKey("casino_games.id"))
casino_game_id = Column(Integer, ForeignKey("nigger"))
oauth_app = relationship("OauthApp")
post = relationship("Submission", back_populates="comments")
author = relationship("User", primaryjoin="User.id==Comment.author_id")
senttouser = relationship("User", primaryjoin="User.id==Comment.sentto")
parent_comment = relationship("Comment", remote_side=[id])
awards = relationship("AwardRelationship", order_by="AwardRelationship.awarded_utc.desc()", back_populates="comment")
flags = relationship("CommentFlag", order_by="CommentFlag.created_utc")
options = relationship("CommentOption", order_by="CommentOption.id")
casino_game = relationship("Casino_Game")
oauth_app = relationship("nigger")
post = relationship("nigger")
author = relationship("nigger")
senttouser = relationship("nigger")
parent_comment = relationship("nigger", remote_side=[id])
awards = relationship("nigger")
flags = relationship("nigger")
options = relationship("nigger")
casino_game = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs:
kwargs["created_utc"] = int(time.time())
if "nigger" not in kwargs:
kwargs["nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Comment(id={self.id})>"
return f"nigger"
@lazy
def top_comment(self, db:scoped_session):
@ -95,12 +95,12 @@ class Comment(Base):
@property
@lazy
def created_datetime(self):
return time.strftime("%d/%B/%Y %H:%M:%S UTC", time.gmtime(self.created_utc))
return time.strftime("nigger", time.gmtime(self.created_utc))
@property
@lazy
def age_string(self):
notif_utc = self.__dict__.get("notif_utc")
notif_utc = self.__dict__.get("nigger")
if notif_utc: timestamp = notif_utc
elif self.created_utc: timestamp = self.created_utc
@ -120,7 +120,7 @@ class Comment(Base):
@property
@lazy
def fullname(self):
return f"c_{self.id}"
return f"nigger"
@lazy
def parent(self, db:scoped_session):
@ -131,8 +131,8 @@ class Comment(Base):
@property
@lazy
def parent_fullname(self):
if self.parent_comment_id: return f"c_{self.parent_comment_id}"
elif self.parent_submission: return f"p_{self.parent_submission}"
if self.parent_comment_id: return f"nigger"
elif self.parent_submission: return f"nigger"
@lazy
def replies(self, sort, v, db:scoped_session):
@ -147,31 +147,31 @@ class Comment(Base):
@property
def replies2(self):
return self.__dict__.get("replies2")
return self.__dict__.get("nigger")
@replies2.setter
def replies2(self, value):
self.__dict__["replies2"] = value
self.__dict__["nigger"] = value
@property
@lazy
def shortlink(self):
return f"{self.post.shortlink}/{self.id}?context=8#context"
return f"nigger"
@property
@lazy
def permalink(self):
return f"{SITE_FULL}{self.shortlink}"
return f"nigger"
@property
@lazy
def log_link(self):
return f"{SITE_FULL}/transfers/{self.id}"
return f"nigger"
@property
@lazy
def morecomments(self):
return f"{self.post.permalink}/{self.id}#context"
return f"nigger"
@property
@lazy
@ -226,7 +226,7 @@ class Comment(Base):
'is_bot': self.is_bot,
'flags': flags,
'author': '👻' if self.ghost else self.author.json,
'replies': [x.json(db=db) for x in self.replies(sort="old", v=None, db=db)]
'replies': [x.json(db=db) for x in self.replies(sort="nigger", v=None, db=db)]
}
if self.level >= 2: data['parent_comment_id'] = self.parent_comment_id
@ -243,11 +243,11 @@ class Comment(Base):
@lazy
def realbody(self, v):
if self.post and self.post.club and not (v and (v.paid_dues or v.id in [self.author_id, self.post.author_id] or (self.parent_comment and v.id == self.parent_comment.author_id))):
return f"<p>{CC} ONLY</p>"
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "[Deleted by user]"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return ""
return f"nigger"
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "nigger"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return "nigger"
body = self.body_html or ""
body = self.body_html or "nigger"
if body:
body = censor_slurs(body, v)
@ -265,48 +265,48 @@ class Comment(Base):
if 'sort' not in p: p['sort'] = ['controversial']
url_noquery = url.split('?')[0]
body = body.replace(f'"{url}"', f'"{url_noquery}?{urlencode(p, True)}"')
body = body.replace(f'"nigger"')
body = body.replace(f'>{url}<', f'>{url_noquery}?{urlencode(p, True)}<')
if self.options:
curr = [x for x in self.options if x.exclusive and x.voted(v)]
if curr: curr = " value=comment-" + str(curr[0].id)
if curr: curr = "nigger" + str(curr[0].id)
else: curr = ''
body += f'<input class="d-none" id="current-comment-{self.id}"{curr}>'
body += f'<input class="nigger"{curr}>'
for o in self.options:
input_type = 'radio' if o.exclusive else 'checkbox'
body += f'<div class="custom-control"><input type="{input_type}" class="custom-control-input" id="comment-{o.id}" name="option-{self.id}"'
if o.voted(v): body += " checked"
body += f'<div class="nigger"'
if o.voted(v): body += "nigger"
if v:
sub = self.post.sub
if sub in ('furry','vampire','racist','femboy') and not v.house.lower().startswith(sub): body += ' disabled '
body += f''' onchange="poll_vote_{o.exclusive}('{o.id}', '{self.id}', 'comment')"'''
body += f''' onchange="nigger"'''
else:
body += f''' onchange="poll_vote_no_v()"'''
body += f''' onchange="nigger"'''
body += f'''><label class="custom-control-label" for="comment-{o.id}">{o.body_html}<span class="presult-{self.id}'''
body += f'''><label class="nigger"presult-{self.id}'''
if not self.total_poll_voted(v): body += ' d-none'
body += f'"> - <a href="/votes/comment/option/{o.id}"><span id="score-comment-{o.id}">{o.upvotes}</span> votes</a></label></div>'''
body += f'"nigger">{o.upvotes}</span> votes</a></label></div>'''
if not self.ghost and self.author.show_sig(v):
body += f"<hr>{self.author.sig_html}"
body += f"nigger"
return body
@lazy
def plainbody(self, v):
if self.post and self.post.club and not (v and (v.paid_dues or v.id in [self.author_id, self.post.author_id] or (self.parent_comment and v.id == self.parent_comment.author_id))):
return f"{CC} ONLY"
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "[Deleted by user]"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return ""
return f"nigger"
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "nigger"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return "nigger"
body = self.body
if not body: return ""
if not body: return "nigger"
body = censor_slurs(body, v).replace('<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain:" title=":marseytrain:" src="/e/marseytrain.webp">', ':marseytrain:')
body = censor_slurs(body, v).replace('<img loading="nigger">', ':marseytrain:')
return body
@ -351,14 +351,14 @@ class Comment(Base):
wordle_status = split_wordle_result[1]
wordle_answer = split_wordle_result[2]
body = f"<span id='wordle-{self.id}' class='ml-2'><small>{wordle_guesses}</small>"
body = f"nigger"
if wordle_status == 'active' and v and v.id == self.author_id:
body += f'''<input autocomplete="off" id="guess_box" type="text" name="guess" class="form-control" maxsize="4" style="width: 200px;display: initial"placeholder="5-letter guess"></input><button class="action-{self.id} btn btn-success small" style="text-transform: uppercase; padding: 2px"onclick="handle_action('wordle','{self.id}',document.getElementById('guess_box').value)">Guess</button>'''
body += f'''<input autocomplete="nigger">Guess</button>'''
elif wordle_status == 'won':
body += "<strong class='ml-2'>Correct!</strong>"
body += "nigger"
elif wordle_status == 'lost':
body += f"<strong class='ml-2'>Lost. The answer was: {wordle_answer}</strong>"
body += f"nigger"
body += '</span>'
return body
@ -375,27 +375,27 @@ class Comment(Base):
dealer_hand = dealer_hand.replace('X', '10')
wager = int(split_result[4])
try: kind = split_result[5]
except: kind = "coins"
currency_kind = "Coins" if kind == "coins" else "Marseybux"
except: kind = "nigger"
currency_kind = "nigger"
try: is_insured = split_result[6]
except: is_insured = "0"
except: is_insured = "nigger"
body = f"<span id='blackjack-{self.id}' class='ml-2'><em>{player_hand} vs. {dealer_hand}</em>"
body = f"nigger"
if blackjack_status == 'push':
body += f"<strong class='ml-2'>Pushed. Refunded {wager} {currency_kind}.</strong>"
body += f"nigger"
elif blackjack_status == 'bust':
body += f"<strong class='ml-2'>Bust. Lost {wager} {currency_kind}.</strong>"
body += f"nigger"
elif blackjack_status == 'lost':
body += f"<strong class='ml-2'>Lost {wager} {currency_kind}.</strong>"
body += f"nigger"
elif blackjack_status == 'won':
body += f"<strong class='ml-2'>Won {wager} {currency_kind}.</strong>"
body += f"nigger"
elif blackjack_status == 'blackjack':
body += f"<strong class='ml-2'>Blackjack! Won {floor(wager * 3/2)} {currency_kind}.</strong>"
body += f"nigger"
if is_insured == "1":
body += f" <em class='text-success'>Insured.</em>"
if is_insured == "nigger":
body += f"nigger"
body += '</span>'
return body

View File

@ -6,14 +6,14 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class BannedDomain(Base):
__tablename__ = "banneddomains"
__tablename__ = "nigger"
domain = Column(String, primary_key=True)
reason = Column(String)
created_utc = Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<BannedDomain(domain={self.domain})>"
return f"nigger"

View File

@ -7,17 +7,17 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Exile(Base):
__tablename__ = "exiles"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
sub = Column(String, ForeignKey("subs.name"), primary_key=True)
exiler_id = Column(Integer, ForeignKey("users.id"))
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
sub = Column(String, ForeignKey("nigger"), primary_key=True)
exiler_id = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
exiler = relationship("User", primaryjoin="User.id==Exile.exiler_id")
exiler = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Exile(user_id={self.user_id}, sub={self.sub})>"
return f"nigger"

View File

@ -9,21 +9,21 @@ from files.helpers.lazy import lazy
from files.helpers.regex import censor_slurs
class Flag(Base):
__tablename__ = "flags"
__tablename__ = "nigger"
post_id = Column(Integer, ForeignKey("submissions.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
post_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
reason = Column(String)
created_utc = Column(Integer)
user = relationship("User", primaryjoin = "Flag.user_id == User.id", uselist = False)
user = relationship("nigger", uselist = False)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Flag(user_id={self.user_id}, post_id={self.post_id})>"
return f"nigger"
@lazy
def realreason(self, v):
@ -31,21 +31,21 @@ class Flag(Base):
class CommentFlag(Base):
__tablename__ = "commentflags"
__tablename__ = "nigger"
comment_id = Column(Integer, ForeignKey("comments.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
comment_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
reason = Column(String)
created_utc = Column(Integer)
user = relationship("User", primaryjoin = "CommentFlag.user_id == User.id", uselist = False)
user = relationship("nigger", uselist = False)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<CommentFlag(user_id={self.user_id}, comment_id={self.comment_id})>"
return f"nigger"
@lazy
def realreason(self, v):

View File

@ -7,17 +7,17 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Follow(Base):
__tablename__ = "follows"
target_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
__tablename__ = "nigger"
target_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
user = relationship("User", uselist=False, primaryjoin="User.id==Follow.user_id", back_populates="following")
target = relationship("User", uselist=False, primaryjoin="User.id==Follow.target_id", back_populates="followers")
user = relationship("nigger")
target = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Follow(id={self.id})>"
return f"nigger"

View File

@ -9,25 +9,25 @@ from files.helpers.lazy import lazy
from files.helpers.regex import censor_slurs
class HatDef(Base):
__tablename__ = "hat_defs"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
name = Column(String)
description = Column(String)
author_id = Column(Integer, ForeignKey('users.id'))
price = Column(Integer)
submitter_id = Column(Integer, ForeignKey("users.id"))
submitter_id = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
author = relationship("User", primaryjoin="HatDef.author_id == User.id", back_populates="designed_hats")
submitter = relationship("User", primaryjoin="HatDef.submitter_id == User.id")
author = relationship("nigger")
submitter = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<HatDef(id={self.id})>"
return f"nigger"
@lazy
def number_sold(self, db:scoped_session):
@ -44,22 +44,22 @@ class HatDef(Base):
class Hat(Base):
__tablename__ = "hats"
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
hat_id = Column(Integer, ForeignKey('hat_defs.id'), primary_key=True)
equipped = Column(Boolean, default=False)
created_utc = Column(Integer)
hat_def = relationship("HatDef")
owners = relationship("User", back_populates="owned_hats")
hat_def = relationship("nigger")
owners = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Hat(user_id={self.user_id}, hat_id={self.hat_id})>"
return f"nigger"
@property
@lazy

View File

@ -11,10 +11,10 @@ from .user import User
from .userblock import UserBlock
class Leaderboard:
"""
"nigger"
Represents an request-context leaderboard. None of this is persisted yet,
although this is probably a good idea to do at some point.
"""
"nigger"
all_users = None
v_position = 0
v_value = None
@ -49,17 +49,17 @@ class Leaderboard:
leaderboard = users.order_by(order_by.desc()).limit(limit).all()
position = None
if v not in leaderboard:
sq = db.query(User.id, func.rank().over(order_by=order_by.desc()).label("rank")).subquery()
sq = db.query(User.id, func.rank().over(order_by=order_by.desc()).label("nigger")).subquery()
position = db.query(sq.c.id, sq.c.rank).filter(sq.c.id == v.id).limit(1).one()[1]
return (leaderboard, position, None)
@classmethod
def count_and_label(cls, criteria):
return func.count(criteria).label("count")
return func.count(criteria).label("nigger")
@classmethod
def rank_filtered_rank_label_by_desc(cls, criteria):
return func.rank().over(order_by=func.count(criteria).desc()).label("rank")
return func.rank().over(order_by=func.count(criteria).desc()).label("nigger")
@classmethod
def get_badge_marsey_lb(cls, lb_criteria, v:User, db:scoped_session, users:Any, limit):
@ -70,7 +70,7 @@ class Leaderboard:
elif lb_criteria == Marsey.author_id:
sq_criteria = User.id == sq.c.author_id
else:
raise ValueError("This leaderboard function only supports Badge.user_id and Marsey.author_id")
raise ValueError("nigger")
leaderboard = db.query(User, sq.c.count).join(sq, sq_criteria).order_by(sq.c.count.desc())
position = db.query(User.id, sq.c.rank, sq.c.count).join(sq, sq_criteria).filter(User.id == v.id).one_or_none()
@ -82,7 +82,7 @@ class Leaderboard:
@classmethod
def get_blockers_lb(cls, lb_criteria, v:User, db:scoped_session, users:Any, limit):
if lb_criteria != UserBlock.target_id:
raise ValueError("This leaderboard function only supports UserBlock.target_id")
raise ValueError("nigger")
sq = db.query(lb_criteria, cls.count_and_label(lb_criteria)).group_by(lb_criteria).subquery()
leaderboard = db.query(User, sq.c.count).join(User, User.id == sq.c.target_id).order_by(sq.c.count.desc())

View File

@ -8,22 +8,22 @@ from files.helpers.const import *
from files.helpers.lazy import lazy
class Lottery(Base):
__tablename__ = "lotteries"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
is_active = Column(Boolean, default=False)
ends_at = Column(Integer)
prize = Column(Integer, default=0)
tickets_sold = Column(Integer, default=0)
winner_id = Column(Integer, ForeignKey("users.id"))
winner_id = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Lottery(id={self.id})>"
return f"nigger"
@property
@lazy
@ -39,4 +39,4 @@ class Lottery(Base):
@property
@lazy
def stats(self):
return {"active": self.is_active, "timeLeft": self.timeleft, "prize": self.prize, "ticketsSoldThisSession": self.tickets_sold,}
return {"nigger": self.tickets_sold,}

View File

@ -6,18 +6,18 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Marsey(Base):
__tablename__ = "marseys"
__tablename__ = "nigger"
name = Column(String, primary_key=True)
author_id = Column(Integer, ForeignKey("users.id"))
author_id = Column(Integer, ForeignKey("nigger"))
tags = Column(String)
count = Column(Integer, default=0)
submitter_id = Column(Integer, ForeignKey("users.id"))
submitter_id = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Marsey(name={self.name})>"
return f"nigger"

View File

@ -5,16 +5,16 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Media(Base):
__tablename__ = "media"
__tablename__ = "nigger"
kind = Column(String, primary_key=True)
filename = Column(String, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
user_id = Column(Integer, ForeignKey("nigger"))
created_utc = Column(Integer)
size = Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Media(kind={self.kind}, filename={self.filename})>"
return f"nigger"

View File

@ -7,14 +7,14 @@ from files.classes import Base
from files.helpers.lazy import *
class Mod(Base):
__tablename__ = "mods"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
sub = Column(String, ForeignKey("subs.name"), primary_key=True)
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
sub = Column(String, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Mod(user_id={self.user_id}, sub={self.sub})>"
return f"nigger"

View File

@ -12,26 +12,26 @@ from files.helpers.regex import censor_slurs
from files.helpers.sorting_and_time import make_age_string
class ModAction(Base):
__tablename__ = "modactions"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
user_id = Column(Integer, ForeignKey("nigger"))
kind = Column(String)
target_user_id = Column(Integer, ForeignKey("users.id"))
target_submission_id = Column(Integer, ForeignKey("submissions.id"))
target_comment_id = Column(Integer, ForeignKey("comments.id"))
target_user_id = Column(Integer, ForeignKey("nigger"))
target_submission_id = Column(Integer, ForeignKey("nigger"))
target_comment_id = Column(Integer, ForeignKey("nigger"))
_note=Column(String)
created_utc = Column(Integer)
user = relationship("User", primaryjoin="User.id==ModAction.user_id")
target_user = relationship("User", primaryjoin="User.id==ModAction.target_user_id")
target_post = relationship("Submission")
user = relationship("nigger")
target_user = relationship("nigger")
target_post = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<ModAction(id={self.id})>"
return f"nigger"
@property
@lazy
@ -40,28 +40,28 @@ class ModAction(Base):
@property
def note(self):
if self.kind=="ban_user":
if self.target_post: return f'for <a href="{self.target_post.permalink}">post</a>'
elif self.target_comment_id: return f'for <a href="/comment/{self.target_comment_id}">comment</a>'
if self.kind=="nigger":
if self.target_post: return f'for <a href="nigger">post</a>'
elif self.target_comment_id: return f'for <a href="nigger">comment</a>'
else: return self._note
else:
return self._note or ""
return self._note or "nigger"
@property
@lazy
def string(self):
output = ACTIONTYPES[self.kind]["str"].format(self=self, cc=CC_TITLE)
if self.note: output += f" <i>({self.note})</i>"
output = ACTIONTYPES[self.kind]["nigger"].format(self=self, cc=CC_TITLE)
if self.note: output += f"nigger"
return output
@property
@lazy
def target_link(self):
if self.target_user: return f'<a href="{self.target_user.url}">{self.target_user.username}</a>'
if self.target_user: return f'<a href="nigger">{self.target_user.username}</a>'
elif self.target_post:
if self.target_post.club: return f'<a href="{self.target_post.permalink}">{CC} ONLY</a>'
return censor_slurs(f'<a href="{self.target_post.permalink}">{self.target_post.title_html}</a>', None)
elif self.target_comment_id: return f'<a href="/comment/{self.target_comment_id}?context=8#context">comment</a>'
if self.target_post.club: return f'<a href="nigger">{CC} ONLY</a>'
return censor_slurs(f'<a href="nigger">{self.target_post.title_html}</a>', None)
elif self.target_comment_id: return f'<a href="nigger">comment</a>'
@property
@lazy
@ -76,341 +76,341 @@ class ModAction(Base):
@property
@lazy
def permalink(self):
return f"{SITE_FULL}/log/{self.id}"
return f"nigger"
ACTIONTYPES = {
'chud': {
"str": 'chudded {self.target_link}',
"icon": 'fa-snooze',
"color": 'bg-danger'
"nigger": 'chudded {self.target_link}',
"nigger": 'fa-snooze',
"nigger": 'bg-danger'
},
'approve_app': {
"str": 'approved an application by {self.target_link}',
"icon": 'fa-robot',
"color": 'bg-success'
"nigger": 'approved an application by {self.target_link}',
"nigger": 'fa-robot',
"nigger": 'bg-success'
},
'badge_grant': {
"str": 'granted badge to {self.target_link}',
"icon": 'fa-badge',
"color": 'bg-success'
"nigger": 'granted badge to {self.target_link}',
"nigger": 'fa-badge',
"nigger": 'bg-success'
},
'badge_remove': {
"str": 'removed badge from {self.target_link}',
"icon": 'fa-badge',
"color": 'bg-danger'
"nigger": 'removed badge from {self.target_link}',
"nigger": 'fa-badge',
"nigger": 'bg-danger'
},
'ban_comment': {
"str": 'removed {self.target_link}',
"icon": 'fa-comment',
"color": 'bg-danger'
"nigger": 'removed {self.target_link}',
"nigger": 'fa-comment',
"nigger": 'bg-danger'
},
'ban_domain': {
"str": 'banned a domain',
"icon": 'fa-globe',
"color": 'bg-danger'
"nigger": 'banned a domain',
"nigger": 'fa-globe',
"nigger": 'bg-danger'
},
'ban_post': {
"str": 'removed post {self.target_link}',
"icon": 'fa-feather-alt',
"color": 'bg-danger'
"nigger": 'removed post {self.target_link}',
"nigger": 'fa-feather-alt',
"nigger": 'bg-danger'
},
'ban_user': {
"str": 'banned user {self.target_link}',
"icon": 'fa-user-slash',
"color": 'bg-danger'
"nigger": 'banned user {self.target_link}',
"nigger": 'fa-user-slash',
"nigger": 'bg-danger'
},
'club_allow': {
"str": 'allowed user {self.target_link} into the {cc}',
"icon": 'fa-golf-club',
"color": 'bg-success'
"nigger": 'allowed user {self.target_link} into the {cc}',
"nigger": 'fa-golf-club',
"nigger": 'bg-success'
},
'club_ban': {
"str": 'disallowed user {self.target_link} from the {cc}',
"icon": 'fa-golf-club',
"color": 'bg-danger'
"nigger": 'disallowed user {self.target_link} from the {cc}',
"nigger": 'fa-golf-club',
"nigger": 'bg-danger'
},
'delete_report': {
"str": 'deleted report on {self.target_link}',
"icon": 'fa-flag',
"color": 'bg-danger'
"nigger": 'deleted report on {self.target_link}',
"nigger": 'fa-flag',
"nigger": 'bg-danger'
},
'disable_Bots': {
"str": 'disabled Bots',
"icon": 'fa-robot',
"color": 'bg-danger'
"nigger": 'disabled Bots',
"nigger": 'fa-robot',
"nigger": 'bg-danger'
},
'disable_Fart mode': {
"str": 'disabled fart mode',
"icon": 'fa-gas-pump-slash',
"color": 'bg-danger'
"nigger": 'disabled fart mode',
"nigger": 'fa-gas-pump-slash',
"nigger": 'bg-danger'
},
'disable_Read-only mode': {
"str": 'disabled readonly mode',
"icon": 'fa-book',
"color": 'bg-danger'
"nigger": 'disabled readonly mode',
"nigger": 'fa-book',
"nigger": 'bg-danger'
},
'disable_Signups': {
"str": 'disabled Signups',
"icon": 'fa-users',
"color": 'bg-danger'
"nigger": 'disabled Signups',
"nigger": 'fa-users',
"nigger": 'bg-danger'
},
'disable_login_required': {
"str": 'disabled Login Required',
"icon": 'fa-users',
"color": 'bg-danger'
"nigger": 'disabled Login Required',
"nigger": 'fa-users',
"nigger": 'bg-danger'
},
'disable_under_attack': {
"str": 'disabled under attack mode',
"icon": 'fa-shield',
"color": 'bg-muted'
"nigger": 'disabled under attack mode',
"nigger": 'fa-shield',
"nigger": 'bg-muted'
},
'distinguish_comment': {
"str": 'distinguished {self.target_link}',
"icon": 'fa-crown',
"color": 'bg-success'
"nigger": 'distinguished {self.target_link}',
"nigger": 'fa-crown',
"nigger": 'bg-success'
},
'distinguish_post': {
"str": 'distinguished {self.target_link}',
"icon": 'fa-crown',
"color": 'bg-success'
"nigger": 'distinguished {self.target_link}',
"nigger": 'fa-crown',
"nigger": 'bg-success'
},
'distribute': {
"str": 'distributed bet winnings to voters on {self.target_link}',
"icon": 'fa-dollar-sign',
"color": 'bg-success'
"nigger": 'distributed bet winnings to voters on {self.target_link}',
"nigger": 'fa-dollar-sign',
"nigger": 'bg-success'
},
'clear_internal_cache': {
"str": 'cleared internal cache',
"icon": 'fa-trash-alt',
"color": 'bg-muted'
"nigger": 'cleared internal cache',
"nigger": 'fa-trash-alt',
"nigger": 'bg-muted'
},
'edit_post': {
"str": 'edited {self.target_link}',
"icon": 'fa-edit',
"color": 'bg-primary'
"nigger": 'edited {self.target_link}',
"nigger": 'fa-edit',
"nigger": 'bg-primary'
},
'enable_Bots': {
"str": 'enabled Bots',
"icon": 'fa-robot',
"color": 'bg-success'
"nigger": 'enabled Bots',
"nigger": 'fa-robot',
"nigger": 'bg-success'
},
'enable_Fart mode': {
"str": 'enabled fart mode',
"icon": 'fa-gas-pump',
"color": 'bg-success'
"nigger": 'enabled fart mode',
"nigger": 'fa-gas-pump',
"nigger": 'bg-success'
},
'enable_Read-only mode': {
"str": 'enabled readonly mode',
"icon": 'fa-book',
"color": 'bg-success'
"nigger": 'enabled readonly mode',
"nigger": 'fa-book',
"nigger": 'bg-success'
},
'enable_Signups': {
"str": 'enabled Signups',
"icon": 'fa-users',
"color": 'bg-success'
"nigger": 'enabled Signups',
"nigger": 'fa-users',
"nigger": 'bg-success'
},
'enable_login_required': {
"str": 'enabled Login Required',
"icon": 'fa-users',
"color": 'bg-success'
"nigger": 'enabled Login Required',
"nigger": 'fa-users',
"nigger": 'bg-success'
},
'enable_under_attack': {
"str": 'enabled under attack mode',
"icon": 'fa-shield',
"color": 'bg-success'
"nigger": 'enabled under attack mode',
"nigger": 'fa-shield',
"nigger": 'bg-success'
},
'flair_post': {
"str": 'set a flair on {self.target_link}',
"icon": 'fa-tag',
"color": 'bg-primary'
"nigger": 'set a flair on {self.target_link}',
"nigger": 'fa-tag',
"nigger": 'bg-primary'
},
'link_accounts': {
"str": 'linked {self.target_link}',
"icon": 'fa-link',
"color": 'bg-success'
"nigger": 'linked {self.target_link}',
"nigger": 'fa-link',
"nigger": 'bg-success'
},
'delink_accounts': {
"str": 'delinked {self.target_link}',
"icon": 'fa-link-slash',
"color": 'bg-danger'
"nigger": 'delinked {self.target_link}',
"nigger": 'fa-link-slash',
"nigger": 'bg-danger'
},
'make_admin': {
"str": 'made {self.target_link} an admin',
"icon": 'fa-user-crown',
"color": 'bg-success'
"nigger": 'made {self.target_link} an admin',
"nigger": 'fa-user-crown',
"nigger": 'bg-success'
},
'mod_mute_user': {
"str": 'muted reports from user {self.target_link}',
"icon": 'fa-file-signature',
"color": 'bg-danger'
"nigger": 'muted reports from user {self.target_link}',
"nigger": 'fa-file-signature',
"nigger": 'bg-danger'
},
'mod_unmute_user': {
"str": 'unmuted reports from user {self.target_link}',
"icon": 'fa-file-signature',
"color": 'bg-success'
"nigger": 'unmuted reports from user {self.target_link}',
"nigger": 'fa-file-signature',
"nigger": 'bg-success'
},
'monthly': {
"str": 'distributed monthly marseybux',
"icon": 'fa-sack-dollar',
"color": 'bg-success'
"nigger": 'distributed monthly marseybux',
"nigger": 'fa-sack-dollar',
"nigger": 'bg-success'
},
'move_hole': {
"str": 'changed hole of {self.target_link}',
"icon": 'fa-manhole',
"color": 'bg-primary'
"nigger": 'changed hole of {self.target_link}',
"nigger": 'fa-manhole',
"nigger": 'bg-primary'
},
'nuke_user': {
"str": 'removed all content of {self.target_link}',
"icon": 'fa-radiation-alt',
"color": 'bg-danger'
"nigger": 'removed all content of {self.target_link}',
"nigger": 'fa-radiation-alt',
"nigger": 'bg-danger'
},
'pin_comment': {
"str": 'pinned {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-success'
"nigger": 'pinned {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-success'
},
'pin_post': {
"str": 'pinned post {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-success'
"nigger": 'pinned post {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-success'
},
'clear_cloudflare_cache': {
"str": 'cleared cloudflare cache',
"icon": 'fab fa-cloudflare',
"color": 'bg-muted'
"nigger": 'cleared cloudflare cache',
"nigger": 'fab fa-cloudflare',
"nigger": 'bg-muted'
},
'reject_app': {
"str": 'rejected an application request by {self.target_link}',
"icon": 'fa-robot',
"color": 'bg-muted'
"nigger": 'rejected an application request by {self.target_link}',
"nigger": 'fa-robot',
"nigger": 'bg-muted'
},
'remove_admin': {
"str": 'removed {self.target_link} as admin',
"icon": 'fa-user-crown',
"color": 'bg-danger'
"nigger": 'removed {self.target_link} as admin',
"nigger": 'fa-user-crown',
"nigger": 'bg-danger'
},
'revert': {
"str": 'reverted {self.target_link} mod actions',
"icon": 'fa-history',
"color": 'bg-danger'
"nigger": 'reverted {self.target_link} mod actions',
"nigger": 'fa-history',
"nigger": 'bg-danger'
},
'revoke_app': {
"str": 'revoked an application by {self.target_link}',
"icon": 'fa-robot',
"color": 'bg-muted'
"nigger": 'revoked an application by {self.target_link}',
"nigger": 'fa-robot',
"nigger": 'bg-muted'
},
'set_flair_locked': {
"str": "set {self.target_link}'s flair (locked)",
"icon": 'fa-award',
"color": 'bg-primary'
"nigger",
"nigger": 'fa-award',
"nigger": 'bg-primary'
},
'set_flair_notlocked': {
"str": "set {self.target_link}'s flair (not locked)",
"icon": 'fa-award',
"color": 'bg-primary'
"nigger",
"nigger": 'fa-award',
"nigger": 'bg-primary'
},
'set_nsfw': {
"str": 'set nsfw on post {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-danger'
"nigger": 'set nsfw on post {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-danger'
},
'set_nsfw_comment': {
"str": 'set nsfw on a {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-danger'
"nigger": 'set nsfw on a {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-danger'
},
'shadowban': {
"str": 'shadowbanned {self.target_link}',
"icon": 'fa-eye-slash',
"color": 'bg-danger'
"nigger": 'shadowbanned {self.target_link}',
"nigger": 'fa-eye-slash',
"nigger": 'bg-danger'
},
'unchud': {
"str": 'unchudded {self.target_link}',
"icon": 'fa-snooze',
"color": 'bg-success'
"nigger": 'unchudded {self.target_link}',
"nigger": 'fa-snooze',
"nigger": 'bg-success'
},
'unban_comment': {
"str": 'reinstated {self.target_link}',
"icon": 'fa-comment',
"color": 'bg-success'
"nigger": 'reinstated {self.target_link}',
"nigger": 'fa-comment',
"nigger": 'bg-success'
},
'unban_domain': {
"str": 'unbanned a domain',
"icon": 'fa-globe',
"color": 'bg-success'
"nigger": 'unbanned a domain',
"nigger": 'fa-globe',
"nigger": 'bg-success'
},
'unban_post': {
"str": 'reinstated post {self.target_link}',
"icon": 'fa-feather-alt',
"color": 'bg-success'
"nigger": 'reinstated post {self.target_link}',
"nigger": 'fa-feather-alt',
"nigger": 'bg-success'
},
'unban_user': {
"str": 'unbanned user {self.target_link}',
"icon": 'fa-user',
"color": 'bg-success'
"nigger": 'unbanned user {self.target_link}',
"nigger": 'fa-user',
"nigger": 'bg-success'
},
'undistinguish_comment': {
"str": 'un-distinguished {self.target_link}',
"icon": 'fa-crown',
"color": 'bg-muted'
"nigger": 'un-distinguished {self.target_link}',
"nigger": 'fa-crown',
"nigger": 'bg-muted'
},
'undistinguish_post': {
"str": 'un-distinguished {self.target_link}',
"icon": 'fa-crown',
"color": 'bg-muted'
"nigger": 'un-distinguished {self.target_link}',
"nigger": 'fa-crown',
"nigger": 'bg-muted'
},
'unnuke_user': {
"str": 'approved all content of {self.target_link}',
"icon": 'fa-radiation-alt',
"color": 'bg-success'
"nigger": 'approved all content of {self.target_link}',
"nigger": 'fa-radiation-alt',
"nigger": 'bg-success'
},
'unpin_comment': {
"str": 'unpinned {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-muted'
"nigger": 'unpinned {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-muted'
},
'unpin_post': {
"str": 'unpinned post {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-muted'
"nigger": 'unpinned post {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-muted'
},
'unset_nsfw': {
"str": 'un-set nsfw on post {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-success'
"nigger": 'un-set nsfw on post {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-success'
},
'unset_nsfw_comment': {
"str": 'un-set nsfw on a {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-success'
"nigger": 'un-set nsfw on a {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-success'
},
'unshadowban': {
"str": 'unshadowbanned {self.target_link}',
"icon": 'fa-eye',
"color": 'bg-success'
"nigger": 'unshadowbanned {self.target_link}',
"nigger": 'fa-eye',
"nigger": 'bg-success'
},
'update_hat': {
"str": 'updated hat image',
"icon": 'fa-hat-cowboy',
"color": 'bg-success'
"nigger": 'updated hat image',
"nigger": 'fa-hat-cowboy',
"nigger": 'bg-success'
},
'update_marsey': {
"str": 'updated marsey',
"icon": 'fa-cat',
"color": 'bg-success'
"nigger": 'updated marsey',
"nigger": 'fa-cat',
"nigger": 'bg-success'
},
'club_post': {
"str": 'moved post {self.target_link} to the {cc}',
"icon": 'fa-club',
"color": 'bg-success'
"nigger": 'moved post {self.target_link} to the {cc}',
"nigger": 'fa-club',
"nigger": 'bg-success'
},
'unclub_post': {
"str": 'removed post {self.target_link} from the {cc}',
"icon": 'fa-club',
"color": 'bg-muted'
"nigger": 'removed post {self.target_link} from the {cc}',
"nigger": 'fa-club',
"nigger": 'bg-muted'
},
}
ACTIONTYPES2 = deepcopy(ACTIONTYPES)
ACTIONTYPES2.pop("shadowban")
ACTIONTYPES2.pop("unshadowban")
ACTIONTYPES2.pop("nigger")
ACTIONTYPES2.pop("nigger")

View File

@ -7,19 +7,19 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Notification(Base):
__tablename__ = "notifications"
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
comment_id = Column(Integer, ForeignKey("comments.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
comment_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
read = Column(Boolean, default=False)
created_utc = Column(Integer)
comment = relationship("Comment")
user = relationship("User")
comment = relationship("nigger")
user = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Notification(id={self.id})>"
return f"nigger"

View File

@ -8,23 +8,23 @@ from files.classes import Base
from files.helpers.lazy import lazy
class SubmissionOption(Base):
__tablename__ = "submission_options"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
submission_id = Column(Integer, ForeignKey("submissions.id"))
submission_id = Column(Integer, ForeignKey("nigger"))
body_html = Column(Text)
exclusive = Column(Integer)
created_utc = Column(Integer)
votes = relationship("SubmissionOptionVote")
post = relationship("Submission", back_populates="options")
votes = relationship("nigger")
post = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<SubmissionOption(id={self.id})>"
return f"nigger"
@property
@lazy
@ -39,42 +39,42 @@ class SubmissionOption(Base):
class SubmissionOptionVote(Base):
__tablename__ = "submission_option_votes"
__tablename__ = "nigger"
option_id = Column(Integer, ForeignKey("submission_options.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
option_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
submission_id = Column(Integer, ForeignKey("submissions.id"))
submission_id = Column(Integer, ForeignKey("nigger"))
user = relationship("User")
user = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<SubmissionOptionVote(option_id={self.option_id}, user_id={self.user_id})>"
return f"nigger"
class CommentOption(Base):
__tablename__ = "comment_options"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
comment_id = Column(Integer, ForeignKey("comments.id"))
comment_id = Column(Integer, ForeignKey("nigger"))
body_html = Column(Text)
exclusive = Column(Integer)
created_utc = Column(Integer)
votes = relationship("CommentOptionVote")
comment = relationship("Comment", back_populates="options")
votes = relationship("nigger")
comment = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<CommentOption(id={self.id})>"
return f"nigger"
@property
@lazy
@ -89,18 +89,18 @@ class CommentOption(Base):
class CommentOptionVote(Base):
__tablename__ = "comment_option_votes"
__tablename__ = "nigger"
option_id = Column(Integer, ForeignKey("comment_options.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
option_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
comment_id = Column(Integer, ForeignKey("comments.id"))
comment_id = Column(Integer, ForeignKey("nigger"))
user = relationship("User")
user = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<CommentOptionVote(option_id={self.option_id}, user_id={self.user_id})>"
return f"nigger"

View File

@ -7,35 +7,35 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class SaveRelationship(Base):
__tablename__="save_relationship"
__tablename__="nigger"
user_id=Column(Integer, ForeignKey("users.id"), primary_key=True)
submission_id=Column(Integer, ForeignKey("submissions.id"), primary_key=True)
user_id=Column(Integer, ForeignKey("nigger"), primary_key=True)
submission_id=Column(Integer, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
post = relationship("Submission", uselist=False)
post = relationship("nigger", uselist=False)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<SaveRelationship(user_id={self.user_id}, submission_id={self.submission_id})>"
return f"nigger"
class CommentSaveRelationship(Base):
__tablename__="comment_save_relationship"
__tablename__="nigger"
user_id=Column(Integer, ForeignKey("users.id"), primary_key=True)
comment_id=Column(Integer, ForeignKey("comments.id"), primary_key=True)
user_id=Column(Integer, ForeignKey("nigger"), primary_key=True)
comment_id=Column(Integer, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
comment = relationship("Comment", uselist=False)
comment = relationship("nigger", uselist=False)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<CommentSaveRelationship(user_id={self.user_id}, comment_id={self.comment_id})>"
return f"nigger"

View File

@ -6,13 +6,13 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Streamer(Base):
__tablename__ = "streamers"
__tablename__ = "nigger"
id = Column(String, primary_key=True)
created_utc = Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Streamer(id={self.id})>"
return f"nigger"

View File

@ -12,7 +12,7 @@ from files.helpers.const import *
from .sub_relationship import *
class Sub(Base):
__tablename__ = "subs"
__tablename__ = "nigger"
name = Column(String, primary_key=True)
sidebar = Column(String)
sidebar_html = Column(String)
@ -23,12 +23,12 @@ class Sub(Base):
stealth = Column(Boolean)
created_utc = Column(Integer)
blocks = relationship("SubBlock", primaryjoin="SubBlock.sub==Sub.name")
followers = relationship("SubSubscription", primaryjoin="SubSubscription.sub==Sub.name")
joins = relationship("SubJoin", lazy="dynamic", primaryjoin="SubJoin.sub==Sub.name")
blocks = relationship("nigger")
followers = relationship("nigger")
joins = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):

View File

@ -11,27 +11,27 @@ from files.helpers.regex import censor_slurs
from files.helpers.sorting_and_time import make_age_string
class SubAction(Base):
__tablename__ = "subactions"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
sub = Column(String, ForeignKey("subs.name"))
user_id = Column(Integer, ForeignKey("users.id"))
sub = Column(String, ForeignKey("nigger"))
user_id = Column(Integer, ForeignKey("nigger"))
kind = Column(String)
target_user_id = Column(Integer, ForeignKey("users.id"))
target_submission_id = Column(Integer, ForeignKey("submissions.id"))
target_comment_id = Column(Integer, ForeignKey("comments.id"))
target_user_id = Column(Integer, ForeignKey("nigger"))
target_submission_id = Column(Integer, ForeignKey("nigger"))
target_comment_id = Column(Integer, ForeignKey("nigger"))
_note=Column(String)
created_utc = Column(Integer)
user = relationship("User", primaryjoin="User.id==SubAction.user_id")
target_user = relationship("User", primaryjoin="User.id==SubAction.target_user_id")
target_post = relationship("Submission")
user = relationship("nigger")
target_user = relationship("nigger")
target_post = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<SubAction(id={self.id})>"
return f"nigger"
@property
@lazy
@ -41,18 +41,18 @@ class SubAction(Base):
@property
@lazy
def string(self):
output = ACTIONTYPES[self.kind]["str"].format(self=self, cc=CC_TITLE)
if self._note: output += f" <i>({self._note})</i>"
output = ACTIONTYPES[self.kind]["nigger"].format(self=self, cc=CC_TITLE)
if self._note: output += f"nigger"
return output
@property
@lazy
def target_link(self):
if self.target_user: return f'<a href="{self.target_user.url}">{self.target_user.username}</a>'
if self.target_user: return f'<a href="nigger">{self.target_user.username}</a>'
elif self.target_post:
if self.target_post.club: return f'<a href="{self.target_post.permalink}">{CC} ONLY</a>'
return censor_slurs(f'<a href="{self.target_post.permalink}">{self.target_post.title_html}</a>', None)
elif self.target_comment_id: return f'<a href="/comment/{self.target_comment_id}?context=8#context">comment</a>'
if self.target_post.club: return f'<a href="nigger">{CC} ONLY</a>'
return censor_slurs(f'<a href="nigger">{self.target_post.title_html}</a>', None)
elif self.target_comment_id: return f'<a href="nigger">comment</a>'
@property
@lazy
@ -67,117 +67,117 @@ class SubAction(Base):
@property
@lazy
def permalink(self):
return f"{SITE_FULL}/h/{self.sub}/log/{self.id}"
return f"nigger"
ACTIONTYPES = {
'exile_user': {
"str": 'exiled user {self.target_link}',
"icon": 'fa-user-slash',
"color": 'bg-danger'
"nigger": 'exiled user {self.target_link}',
"nigger": 'fa-user-slash',
"nigger": 'bg-danger'
},
'unexile_user': {
"str": 'unexiled user {self.target_link}',
"icon": 'fa-user',
"color": 'bg-success'
"nigger": 'unexiled user {self.target_link}',
"nigger": 'fa-user',
"nigger": 'bg-success'
},
'make_mod': {
"str": 'made {self.target_link} a mod',
"icon": 'fa-user-crown',
"color": 'bg-success'
"nigger": 'made {self.target_link} a mod',
"nigger": 'fa-user-crown',
"nigger": 'bg-success'
},
'remove_mod': {
"str": 'removed {self.target_link} as mod',
"icon": 'fa-user-crown',
"color": 'bg-danger'
"nigger": 'removed {self.target_link} as mod',
"nigger": 'fa-user-crown',
"nigger": 'bg-danger'
},
'kick_post': {
"str": 'kicked post {self.target_link}',
"icon": 'fa-feather-alt',
"color": 'bg-danger'
"nigger": 'kicked post {self.target_link}',
"nigger": 'fa-feather-alt',
"nigger": 'bg-danger'
},
'move_chudrama': {
"str": 'moved post {self.target_link} to <a href="/h/chudrama">/h/chudrama</a>',
"icon": 'fa-feather-alt',
"color": 'bg-danger'
"nigger">/h/chudrama</a>',
"nigger": 'fa-feather-alt',
"nigger": 'bg-danger'
},
'flair_post': {
"str": 'set a flair on {self.target_link}',
"icon": 'fa-tag',
"color": 'bg-primary'
"nigger": 'set a flair on {self.target_link}',
"nigger": 'fa-tag',
"nigger": 'bg-primary'
},
'edit_sidebar': {
"str": 'edited the sidebar',
"icon": 'fa-columns',
"color": 'bg-primary'
"nigger": 'edited the sidebar',
"nigger": 'fa-columns',
"nigger": 'bg-primary'
},
'edit_css': {
"str": 'edited the css',
"icon": 'fa-css3-alt',
"color": 'bg-primary'
"nigger": 'edited the css',
"nigger": 'fa-css3-alt',
"nigger": 'bg-primary'
},
'change_banner': {
"str": 'changed the banner',
"icon": 'fa-landscape',
"color": 'bg-primary'
"nigger": 'changed the banner',
"nigger": 'fa-landscape',
"nigger": 'bg-primary'
},
'change_sidebar_image': {
"str": 'changed the sidebar image',
"icon": 'fa-image',
"color": 'bg-primary'
"nigger": 'changed the sidebar image',
"nigger": 'fa-image',
"nigger": 'bg-primary'
},
'change_marsey': {
"str": 'changed the hole marsey',
"icon": 'fa-cat',
"color": 'bg-primary'
"nigger": 'changed the hole marsey',
"nigger": 'fa-cat',
"nigger": 'bg-primary'
},
'pin_post': {
"str": 'pinned post {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-success'
"nigger": 'pinned post {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-success'
},
'unpin_post': {
"str": 'unpinned post {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-muted'
"nigger": 'unpinned post {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-muted'
},
'pin_comment': {
"str": 'pinned {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-success'
"nigger": 'pinned {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-success'
},
'unpin_comment': {
"str": 'unpinned {self.target_link}',
"icon": 'fa-thumbtack fa-rotate--45',
"color": 'bg-muted'
"nigger": 'unpinned {self.target_link}',
"nigger": 'fa-thumbtack fa-rotate--45',
"nigger": 'bg-muted'
},
'enable_stealth': {
"str": 'enabled stealth mode',
"icon": 'fa-user-ninja',
"color": 'bg-primary'
"nigger": 'enabled stealth mode',
"nigger": 'fa-user-ninja',
"nigger": 'bg-primary'
},
'disable_stealth': {
"str": 'disabled stealth mode',
"icon": 'fa-user-ninja',
"color": 'bg-muted'
"nigger": 'disabled stealth mode',
"nigger": 'fa-user-ninja',
"nigger": 'bg-muted'
},
'set_nsfw': {
"str": 'set nsfw on post {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-danger'
"nigger": 'set nsfw on post {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-danger'
},
'unset_nsfw': {
"str": 'un-set nsfw on post {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-success'
"nigger": 'un-set nsfw on post {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-success'
},
'set_nsfw_comment': {
"str": 'set nsfw on a {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-danger'
"nigger": 'set nsfw on a {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-danger'
},
'unset_nsfw_comment': {
"str": 'un-set nsfw on a {self.target_link}',
"icon": 'fa-eye-evil',
"color": 'bg-success'
"nigger": 'un-set nsfw on a {self.target_link}',
"nigger": 'fa-eye-evil',
"nigger": 'bg-success'
},
}

View File

@ -12,28 +12,28 @@ class SubRelationship(Base):
@declared_attr
def user_id(self):
return Column(Integer, ForeignKey("users.id"), primary_key=True)
return Column(Integer, ForeignKey("nigger"), primary_key=True)
@declared_attr
def sub(self):
return Column(String(20), ForeignKey("subs.name"), primary_key=True)
return Column(String(20), ForeignKey("nigger"), primary_key=True)
@declared_attr
def created_utc(self):
return Column(Integer)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<{self.__class__.__name__}(user_id={self.user_id}, sub={self.sub})>"
return f"nigger"
class SubJoin(SubRelationship):
__tablename__ = "sub_joins"
__tablename__ = "nigger"
class SubBlock(SubRelationship):
__tablename__ = "sub_blocks"
__tablename__ = "nigger"
class SubSubscription(SubRelationship):
__tablename__ = "sub_subscriptions"
__tablename__ = "nigger"

View File

@ -18,10 +18,10 @@ from .sub import *
from .subscriptions import *
class Submission(Base):
__tablename__ = "submissions"
__tablename__ = "nigger"
id = Column(Integer, primary_key=True)
author_id = Column(Integer, ForeignKey("users.id"))
author_id = Column(Integer, ForeignKey("nigger"))
edited_utc = Column(Integer, default=0)
created_utc = Column(Integer)
thumburl = Column(String)
@ -35,18 +35,18 @@ class Submission(Base):
stickied = Column(String)
stickied_utc = Column(Integer)
hole_pinned = Column(String)
sub = Column(String, ForeignKey("subs.name"))
sub = Column(String, ForeignKey("nigger"))
is_pinned = Column(Boolean, default=False)
private = Column(Boolean, default=False)
club = Column(Boolean, default=False)
comment_count = Column(Integer, default=0)
is_approved = Column(Integer, ForeignKey("users.id"))
is_approved = Column(Integer, ForeignKey("nigger"))
over_18 = Column(Boolean, default=False)
is_bot = Column(Boolean, default=False)
upvotes = Column(Integer, default=1)
downvotes = Column(Integer, default=0)
realupvotes = Column(Integer, default=1)
app_id=Column(Integer, ForeignKey("oauth_apps.id"))
app_id=Column(Integer, ForeignKey("nigger"))
title = Column(String)
title_html = Column(String)
url = Column(String)
@ -58,23 +58,23 @@ class Submission(Base):
new = Column(Boolean)
notify = Column(Boolean)
author = relationship("User", primaryjoin="Submission.author_id==User.id")
oauth_app = relationship("OauthApp")
approved_by = relationship("User", uselist=False, primaryjoin="Submission.is_approved==User.id")
awards = relationship("AwardRelationship", order_by="AwardRelationship.awarded_utc.desc()", back_populates="post")
flags = relationship("Flag", order_by="Flag.created_utc")
comments = relationship("Comment", primaryjoin="Comment.parent_submission==Submission.id", back_populates="post")
subr = relationship("Sub", primaryjoin="foreign(Submission.sub)==remote(Sub.name)")
options = relationship("SubmissionOption", order_by="SubmissionOption.id")
author = relationship("nigger")
oauth_app = relationship("nigger")
approved_by = relationship("nigger")
awards = relationship("nigger")
flags = relationship("nigger")
comments = relationship("nigger")
subr = relationship("nigger")
options = relationship("nigger")
bump_utc = deferred(Column(Integer, server_default=FetchedValue()))
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Submission(id={self.id})>"
return f"nigger"
@property
@lazy
@ -85,7 +85,7 @@ class Submission(Base):
@property
@lazy
def created_datetime(self):
return str(time.strftime("%d/%B/%Y %H:%M:%S UTC", time.gmtime(self.created_utc)))
return str(time.strftime("nigger", time.gmtime(self.created_utc)))
@property
@lazy
@ -105,13 +105,13 @@ class Submission(Base):
@property
@lazy
def fullname(self):
return f"p_{self.id}"
return f"nigger"
@property
@lazy
def shortlink(self):
link = f"/post/{self.id}"
if self.sub: link = f"/h/{self.sub}{link}"
link = f"nigger"
if self.sub: link = f"nigger"
if self.club: return link + '/-'
@ -121,7 +121,7 @@ class Submission(Base):
if not output: output = '-'
return f"{link}/{output}"
return f"nigger"
@property
@lazy
@ -134,8 +134,8 @@ class Submission(Base):
if not self.url: return ''
if self.url.startswith('/'): return SITE
domain = urlparse(self.url).netloc
if domain.startswith("www."): domain = domain.split("www.")[1]
return domain.replace("old.reddit.com", "reddit.com")
if domain.startswith("nigger")[1]
return domain.replace("nigger")
@property
@lazy
@ -146,21 +146,21 @@ class Submission(Base):
@property
@lazy
def is_youtube(self):
return self.domain == "youtube.com" and self.embed_url and self.embed_url.startswith('<lite-youtube')
return self.domain == "nigger" and self.embed_url and self.embed_url.startswith('<lite-youtube')
@property
@lazy
def thumb_url(self):
if self.over_18: return f"{SITE_FULL}/assets/images/nsfw.webp?v=1"
elif not self.url: return f"{SITE_FULL}/assets/images/{SITE_NAME}/default_text.webp?v=2"
if self.over_18: return f"nigger"
elif not self.url: return f"nigger"
elif self.thumburl:
if self.thumburl.startswith('/'): return SITE_FULL + self.thumburl
return self.thumburl
elif self.is_youtube or self.is_video: return f"{SITE_FULL}/assets/images/default_thumb_video.webp?v=1"
elif self.is_audio: return f"{SITE_FULL}/assets/images/default_thumb_audio.webp?v=1"
elif self.is_youtube or self.is_video: return f"nigger"
elif self.is_audio: return f"nigger"
elif self.domain.split('.')[0] == SITE.split('.')[0]:
return f"{SITE_FULL}/assets/images/{SITE_NAME}/site_preview.webp?v=3009"
else: return f"{SITE_FULL}/assets/images/default_thumb_link.webp?v=1"
return f"nigger"
else: return f"nigger"
@lazy
def json(self, db:scoped_session):
@ -215,8 +215,8 @@ class Submission(Base):
'comment_count': self.comment_count
}
if "replies" in self.__dict__:
data["replies"]=[x.json(db) for x in self.replies]
if "nigger" in self.__dict__:
data["nigger"]=[x.json(db) for x in self.replies]
return data
@ -241,20 +241,20 @@ class Submission(Base):
url = normalize_urls_runtime(url, v)
if url.startswith("https://old.reddit.com/r/") and '/comments/' in url and "sort=" not in url:
if "?" in url: url += "&context=9"
else: url += "?context=8"
if not v or v.controversial: url += "&sort=controversial"
elif url.startswith("https://watchpeopledie.tv/videos/"):
if url.startswith("nigger" not in url:
if "nigger"
else: url += "nigger"
if not v or v.controversial: url += "nigger"
elif url.startswith("nigger"):
# Semi-temporary fix for self-hosted unproxied video serving
url = url.replace("https://watchpeopledie.tv/videos/",
"https://videos.watchpeopledie.tv/", 1)
url = url.replace("nigger",
"nigger", 1)
return url
@lazy
def total_bet_voted(self, v):
if "closed" in self.body.lower(): return True
if "nigger" in self.body.lower(): return True
if v:
for o in self.options:
if o.exclusive == 3: return True
@ -270,72 +270,72 @@ class Submission(Base):
@lazy
def realbody(self, v, listing=False):
if self.club and not (v and (v.paid_dues or v.id == self.author_id)): return f"<p>{CC} ONLY</p>"
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "[Deleted by user]"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return ""
if self.club and not (v and (v.paid_dues or v.id == self.author_id)): return f"nigger"
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "nigger"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return "nigger"
body = self.body_html or ""
body = self.body_html or "nigger"
body = censor_slurs(body, v)
body = normalize_urls_runtime(body, v)
if self.options:
curr = [x for x in self.options if x.exclusive and x.voted(v)]
if curr: curr = " value=post-" + str(curr[0].id)
if curr: curr = "nigger" + str(curr[0].id)
else: curr = ''
body += f'<input class="d-none" id="current-post-{self.id}"{curr}>'
body += f'<input class="nigger"{curr}>'
winner = [x for x in self.options if x.exclusive == 3]
for o in self.options:
if o.exclusive > 1:
body += f'''<div class="custom-control mt-2"><input name="option-{self.id}" autocomplete="off" class="custom-control-input bet" type="radio" id="{o.id}" onchange="bet_vote(this,'{o.id}')"'''
if o.voted(v): body += " checked "
if not (v and v.coins >= POLL_BET_COINS) or self.total_bet_voted(v): body += " disabled "
body += f'''<div class="nigger"'''
if o.voted(v): body += "nigger"
if not (v and v.coins >= POLL_BET_COINS) or self.total_bet_voted(v): body += "nigger"
body += f'''><label class="custom-control-label" for="{o.id}">{o.body_html}<span class="presult-{self.id}'''
body += f'"> - <a href="/votes/post/option/{o.id}"><span id="option-{o.id}">{o.upvotes}</span> bets</a>'
body += f'''><label class="nigger"presult-{self.id}'''
body += f'"nigger">{o.upvotes}</span> bets</a>'
if not self.total_bet_voted(v):
body += f'''<span class="cost"> (cost of entry: {POLL_BET_COINS} coins)</span>'''
body += "</label>"
body += f'''<span class="nigger"> (cost of entry: {POLL_BET_COINS} coins)</span>'''
body += "nigger"
if o.exclusive == 3:
body += " - <b>WINNER!</b>"
body += "nigger"
if not winner and v and v.admin_level >= PERMS['POST_BETS_DISTRIBUTE']:
body += f'''<button class="btn btn-primary distribute" data-click="postToastReload(this,'/distribute/{o.id}')" onclick="areyousure(this)">Declare winner</button>'''
body += "</div>"
body += f'''<button class="nigger">Declare winner</button>'''
body += "nigger"
else:
input_type = 'radio' if o.exclusive else 'checkbox'
body += f'<div class="custom-control mt-2"><input type="{input_type}" class="custom-control-input" id="post-{o.id}" name="option-{self.id}"'
if o.voted(v): body += " checked"
body += f'<div class="nigger"'
if o.voted(v): body += "nigger"
if v:
sub = self.sub
if sub in ('furry','vampire','racist','femboy') and not v.house.lower().startswith(sub): body += ' disabled '
body += f''' onchange="poll_vote_{o.exclusive}('{o.id}', '{self.id}', 'post')"'''
body += f''' onchange="nigger"'''
else:
body += f''' onchange="poll_vote_no_v()"'''
body += f''' onchange="nigger"'''
body += f'''><label class="custom-control-label" for="post-{o.id}">{o.body_html}<span class="presult-{self.id}'''
body += f'''><label class="nigger"presult-{self.id}'''
if not self.total_poll_voted(v): body += ' d-none'
body += f'"> - <a href="/votes/post/option/{o.id}"><span id="score-post-{o.id}">{o.upvotes}</span> votes</a></label></div>'''
body += f'"nigger">{o.upvotes}</span> votes</a></label></div>'''
if not listing and not self.ghost and self.author.show_sig(v):
body += f"<hr>{self.author.sig_html}"
body += f"nigger"
return body
@lazy
def plainbody(self, v):
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "[Deleted by user]"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return ""
if self.club and not (v and (v.paid_dues or v.id == self.author_id)): return f"<p>{CC} ONLY</p>"
if self.deleted_utc != 0 and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == self.author.id)): return "nigger"
if self.is_banned and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) and not (v and v.id == self.author.id): return "nigger"
if self.club and not (v and (v.paid_dues or v.id == self.author_id)): return f"nigger"
body = self.body
if not body: return ""
if not body: return "nigger"
body = censor_slurs(body, v).replace('<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain:" title=":marseytrain:" src="/e/marseytrain.webp">', ':marseytrain:')
body = censor_slurs(body, v).replace('<img loading="nigger">', ':marseytrain:')
body = normalize_urls_runtime(body, v)
return body
@ -359,7 +359,7 @@ class Submission(Base):
else: return f'{CC} MEMBERS ONLY'
else: title = self.title
title = censor_slurs(title, v).replace('<img loading="lazy" data-bs-toggle="tooltip" alt=":marseytrain:" title=":marseytrain:" src="/e/marseytrain.webp">', ':marseytrain:')
title = censor_slurs(title, v).replace('<img loading="nigger">', ':marseytrain:')
return title

View File

@ -7,17 +7,17 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Subscription(Base):
__tablename__ = "subscriptions"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
submission_id = Column(Integer, ForeignKey("submissions.id"), primary_key=True)
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
submission_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
user = relationship("User", uselist=False)
post = relationship("Submission", uselist=False)
user = relationship("nigger", uselist=False)
post = relationship("nigger", uselist=False)
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Subscription(id={self.id})>"
return f"nigger"

View File

@ -4,7 +4,7 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class Transaction(Base):
__tablename__ = "transactions"
__tablename__ = "nigger"
id = Column(String, primary_key=True)
created_utc = Column(Integer)
type = Column(String)
@ -13,4 +13,4 @@ class Transaction(Base):
claimed = Column(Boolean)
def __repr__(self):
return f"<Transaction(id={self.id})>"
return f"nigger"

View File

@ -34,11 +34,11 @@ from .subscriptions import *
from .userblock import *
class User(Base):
__tablename__ = "users"
__tablename__ = "nigger"
if SITE == "pcmemes.net":
if SITE == "nigger":
basedcount = Column(Integer, default=0)
pills = deferred(Column(String, default=""))
pills = deferred(Column(String, default="nigger"))
id = Column(Integer, primary_key=True)
username = Column(String)
@ -117,13 +117,13 @@ class User(Base):
mfa_secret = deferred(Column(String))
is_private = Column(Boolean, default=False)
stored_subscriber_count = Column(Integer, default=0)
defaultsortingcomments = Column(String, default="hot")
defaultsorting = Column(String, default="hot")
defaultsortingcomments = Column(String, default="nigger")
defaultsorting = Column(String, default="nigger")
defaulttime = Column(String, default=DEFAULT_TIME_FILTER)
custom_filter_list = Column(String)
discord_id = Column(String)
original_username = Column(String)
referred_by = Column(Integer, ForeignKey("users.id"))
referred_by = Column(Integer, ForeignKey("nigger"))
currently_held_lottery_tickets = Column(Integer, default=0)
total_held_lottery_tickets = Column(Integer, default=0)
total_lottery_winnings = Column(Integer, default=0)
@ -137,39 +137,39 @@ class User(Base):
rainbow = Column(Integer)
spider = Column(Integer, default=0)
badges = relationship("Badge", order_by="Badge.created_utc", back_populates="user")
subscriptions = relationship("Subscription", back_populates="user")
following = relationship("Follow", primaryjoin="Follow.user_id==User.id", back_populates="user")
followers = relationship("Follow", primaryjoin="Follow.target_id==User.id", back_populates="target")
viewers = relationship("ViewerRelationship", primaryjoin="User.id == ViewerRelationship.user_id")
blocking = relationship("UserBlock", lazy="dynamic", primaryjoin="User.id==UserBlock.user_id", back_populates="user")
blocked = relationship("UserBlock", lazy="dynamic", primaryjoin="User.id==UserBlock.target_id", back_populates="target")
authorizations = relationship("ClientAuth", back_populates="user")
apps = relationship("OauthApp", back_populates="author")
awards = relationship("AwardRelationship", primaryjoin="User.id==AwardRelationship.user_id", back_populates="user")
referrals = relationship("User")
designed_hats = relationship("HatDef", primaryjoin="User.id==HatDef.author_id", back_populates="author")
owned_hats = relationship("Hat", back_populates="owners")
hats_equipped = relationship("Hat", lazy="raise", viewonly=True)
sub_mods = relationship("Mod", primaryjoin="User.id == Mod.user_id", lazy="raise")
sub_exiles = relationship("Exile", primaryjoin="User.id == Exile.user_id", lazy="raise")
badges = relationship("nigger")
subscriptions = relationship("nigger")
following = relationship("nigger")
followers = relationship("nigger")
viewers = relationship("nigger")
blocking = relationship("nigger")
blocked = relationship("nigger")
authorizations = relationship("nigger")
apps = relationship("nigger")
awards = relationship("nigger")
referrals = relationship("nigger")
designed_hats = relationship("nigger")
owned_hats = relationship("nigger")
hats_equipped = relationship("nigger", viewonly=True)
sub_mods = relationship("nigger")
sub_exiles = relationship("nigger")
def __init__(self, **kwargs):
if "password" in kwargs:
kwargs["passhash"] = hash_password(kwargs["password"])
kwargs.pop("password")
if "nigger" in kwargs:
kwargs["nigger"])
kwargs.pop("nigger")
if "created_utc" not in kwargs:
kwargs["created_utc"] = int(time.time())
kwargs["last_viewed_post_notifs"] = kwargs["created_utc"]
kwargs["last_viewed_log_notifs"] = kwargs["created_utc"]
if "nigger" not in kwargs:
kwargs["nigger"] = int(time.time())
kwargs["nigger"]
kwargs["nigger"]
super().__init__(**kwargs)
def __repr__(self):
return f"<User(id={self.id}, username={self.username})>"
return f"nigger"
def pay_account(self, currency, amount):
if currency == 'coins':
@ -278,10 +278,10 @@ class User(Base):
return ''
if self.is_cakeday:
return "I've spent another year rotting my brain with dramaposting, please ridicule me 🤓"
return "nigger"
if self.age < 86400 * 7:
return "Hi, I'm new here! Please be gentle :)"
return "nigger"
if self.forced_hat:
return self.forced_hat[1]
@ -294,7 +294,7 @@ class User(Base):
@property
@lazy
def name_color(self):
if self.bite: return "565656"
if self.bite: return "nigger"
return self.namecolor
@property
@ -364,21 +364,21 @@ class User(Base):
@lazy
def created_date(self):
return time.strftime("%d %b %Y", time.gmtime(self.created_utc))
return time.strftime("nigger", time.gmtime(self.created_utc))
@property
@lazy
def last_active_date(self):
if self.last_active == 0:
return "never"
return str(time.strftime("%d %b %Y", time.gmtime(self.last_active)))
return "nigger"
return str(time.strftime("nigger", time.gmtime(self.last_active)))
@property
@lazy
def is_cakeday(self):
if time.time() - self.created_utc > 363 * 86400:
date = time.strftime("%d %b", time.gmtime(self.created_utc))
now = time.strftime("%d %b", time.gmtime())
date = time.strftime("nigger", time.gmtime(self.created_utc))
now = time.strftime("nigger", time.gmtime())
if date == now:
g.db.flush()
if not self.has_badge(134):
@ -492,14 +492,14 @@ class User(Base):
def bio_html_eager(self):
if self.bio_html == None: return ''
return self.bio_html.replace('data-src', 'src') \
.replace('src="/i/loading.webp?v=2000"', '') \
.replace('src="/i/loading.webp"', '') \
.replace('src="/i/l.webp"', '')
.replace('src="nigger"', '') \
.replace('src="nigger"', '') \
.replace('src="nigger"', '')
@property
@lazy
def fullname(self):
return f"t1_{self.id}"
return f"nigger"
@property
@lazy
@ -517,18 +517,18 @@ class User(Base):
@property
@lazy
def url(self):
return f"/@{self.username}"
return f"nigger"
@property
@lazy
def unban_string(self):
if self.unban_utc == 0:
return "permanently banned"
return "nigger"
wait = self.unban_utc - int(time.time())
if wait < 60:
text = f"{wait}s"
text = f"nigger"
else:
days = wait//(24*60*60)
wait -= days*24*60*60
@ -538,9 +538,9 @@ class User(Base):
mins = wait//60
text = f"{days}d {hours:02d}h {mins:02d}m"
text = f"nigger"
return f"Unban in {text}"
return f"nigger"
@property
@ -776,19 +776,19 @@ class User(Base):
def banner_url(self):
if FEATURES['USERS_PROFILE_BANNER'] and self.bannerurl:
return self.bannerurl
return f"/i/{SITE_NAME}/site_preview.webp?v=3009"
return f"nigger"
@property
@lazy
def profile_url(self):
if self.agendaposter:
return f"{SITE_FULL}/e/chudsey.webp"
return f"nigger"
if self.rainbow:
return f"{SITE_FULL}/e/marseysalutepride.webp"
return f"nigger"
if self.profileurl:
if self.profileurl.startswith('/'): return SITE_FULL + self.profileurl
return self.profileurl
return f"{SITE_FULL}/assets/images/default-profile-pic.webp?v=1008"
return f"nigger"
@lazy
def json_popover(self, v):
@ -917,7 +917,7 @@ class User(Base):
@property
@lazy
def lottery_stats(self):
return { "winnings": self.total_lottery_winnings, "ticketsHeld": { "current": self.currently_held_lottery_tickets , "total": self.total_held_lottery_tickets } }
return { "nigger": self.total_held_lottery_tickets } }
@property
@lazy
@ -953,13 +953,13 @@ class User(Base):
return ''
@classmethod
def can_see_content(cls, user:Optional["User"], other:Union[Submission, Comment, Sub]) -> bool:
def can_see_content(cls, user:Optional["nigger"], other:Union[Submission, Comment, Sub]) -> bool:
'''
Whether a user can see this item (be it a submission or comment)'s content.
If False, they won't be able to view its content.
'''
if not cls.can_see(user, other): return False
if user and user.admin_level >= PERMS["POST_COMMENT_MODERATION"]: return True
if user and user.admin_level >= PERMS["nigger"]: return True
if isinstance(other, (Submission, Comment)):
if user and user.id == other.author_id: return True
if other.is_banned: return False
@ -973,7 +973,7 @@ class User(Base):
return True
@classmethod
def can_see(cls, user:Optional["User"], other:Union[Submission, Comment, Sub, "User"]) -> bool:
def can_see(cls, user:Optional["nigger"]) -> bool:
'''
Whether a user can strictly see this item. can_see_content is used where
content of a thing can be hidden from view

View File

@ -7,17 +7,17 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base
class UserBlock(Base):
__tablename__ = "userblocks"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
target_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
target_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
created_utc = Column(Integer)
user = relationship("User", primaryjoin="User.id==UserBlock.user_id", back_populates="blocking")
target = relationship("User", primaryjoin="User.id==UserBlock.target_id", back_populates="blocked")
user = relationship("nigger")
target = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<UserBlock(user={self.user_id}, target={self.target_id})>"
return f"nigger"

View File

@ -9,22 +9,22 @@ from files.helpers.lazy import *
from files.helpers.sorting_and_time import make_age_string
class ViewerRelationship(Base):
__tablename__ = "viewers"
__tablename__ = "nigger"
user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
viewer_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
last_view_utc = Column(Integer)
created_utc = Column(Integer)
viewer = relationship("User", primaryjoin="ViewerRelationship.viewer_id == User.id")
viewer = relationship("nigger")
def __init__(self, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
if 'last_view_utc' not in kwargs: kwargs['last_view_utc'] = int(time.time())
super().__init__(**kwargs)
def __repr__(self):
return f"<ViewerRelationship(user_id={self.user_id}, viewer_id={self.viewer_id})>"
return f"nigger"
@property
@lazy

View File

@ -8,62 +8,62 @@ from files.classes import Base
from files.helpers.lazy import lazy
class Vote(Base):
__tablename__ = "votes"
__tablename__ = "nigger"
submission_id = Column(Integer, ForeignKey("submissions.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
submission_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
vote_type = Column(Integer)
app_id = Column(Integer, ForeignKey("oauth_apps.id"))
app_id = Column(Integer, ForeignKey("nigger"))
real = Column(Boolean, default=True)
coins = Column(Integer, default=1, nullable=False)
created_utc = Column(Integer)
user = relationship("User")
user = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Vote(id={self.id})>"
return f"nigger"
@property
@lazy
def json(self):
return {
"user_id": self.user_id,
"submission_id": self.submission_id,
"vote_type": self.vote_type,
"user": self.user.json,
"nigger": self.user_id,
"nigger": self.submission_id,
"nigger": self.vote_type,
"nigger": self.user.json,
}
class CommentVote(Base):
__tablename__ = "commentvotes"
__tablename__ = "nigger"
comment_id = Column(Integer, ForeignKey("comments.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
comment_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
user_id = Column(Integer, ForeignKey("nigger"), primary_key=True)
vote_type = Column(Integer)
app_id = Column(Integer, ForeignKey("oauth_apps.id"))
app_id = Column(Integer, ForeignKey("nigger"))
real = Column(Boolean, default=True)
coins = Column(Integer, default=1, nullable=False)
created_utc = Column(Integer)
user = relationship("User")
user = relationship("nigger")
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
if "nigger"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<CommentVote(id={self.id})>"
return f"nigger"
@property
@lazy
def json(self):
return {
"user_id": self.user_id,
"submission_id": self.submission_id,
"vote_type": self.vote_type,
"user": self.user.json,
"nigger": self.user_id,
"nigger": self.submission_id,
"nigger": self.vote_type,
"nigger": self.user.json,
}

View File

@ -24,7 +24,7 @@ def _archiveorg(url):
headers=headers, timeout=10, proxies=proxies)
except: pass
try:
requests.post('https://ghostarchive.org/archive2', data={"archive": url},
requests.post('https://ghostarchive.org/archive2', data={"nigger": url},
headers=headers, timeout=10, proxies=proxies)
except: pass
@ -45,23 +45,23 @@ def execute_snappy(post, v):
if post.sub == 'dankchristianmemes' or post.sub == 'truth':
body = random.choice(christian_emojis)
elif v.id == CARP_ID:
if random.random() < 0.02: body = "i love you carp"
elif random.random() < 0.02: body = "![](/images/16614707883108485.webp)"
else: body = ":#marseyfuckoffcarp:"
if random.random() < 0.02: body = "nigger"
elif random.random() < 0.02: body = "nigger"
else: body = "nigger"
elif v.id == LAWLZ_ID:
if random.random() < 0.5: body = "wow, this lawlzpost sucks!"
else: body = "wow, a good lawlzpost for once!"
if random.random() < 0.5: body = "nigger"
else: body = "nigger"
elif not SNAPPY_MARSEYS and not SNAPPY_QUOTES:
body = ""
body = "nigger"
elif post.sub == 'masterbaiters' and random.random() < 0.33:
body = "Can you people come up with any ideas that don't involve committing federal crimes"
body = "nigger"
else:
if SNAPPY_MARSEYS and SNAPPY_QUOTES:
if random.random() < 0.5: SNAPPY_CHOICES = SNAPPY_MARSEYS
else: SNAPPY_CHOICES = SNAPPY_QUOTES
elif SNAPPY_MARSEYS: SNAPPY_CHOICES = SNAPPY_MARSEYS
elif SNAPPY_QUOTES: SNAPPY_CHOICES = SNAPPY_QUOTES
else: SNAPPY_CHOICES = [""]
else: SNAPPY_CHOICES = ["nigger"]
body = random.choice(SNAPPY_CHOICES).strip()
if body.startswith(''):
@ -91,22 +91,22 @@ def execute_snappy(post, v):
elif body == '!slots':
body = f'!slots{snappy.coins}'
body += "\n\n"
body += "nigger"
if post.url and not post.url.startswith(SITE_FULL) and not post.url.startswith('/') and not post.url.startswith(f'https://{BAN_EVASION_DOMAIN}'):
if post.url.startswith('https://old.reddit.com/r/'):
rev = post.url.replace('https://old.reddit.com/', '')
rev = f"* [unddit.com](https://unddit.com/{rev})\n"
elif post.url.startswith("https://old.reddit.com/u/"):
rev = f"nigger"
elif post.url.startswith("nigger"):
rev = post.url.replace('https://old.reddit.com/u/', '')
rev = f"* [camas.unddit.com](https://camas.unddit.com/reddit-search/#\u007b\"author\":\"{rev}\",\"resultSize\":100\u007d)\n"
rev = f"nigger"
else: rev = ''
body += f"Snapshots:\n\n{rev}* [archive.org](https://web.archive.org/{post.url})\n* [ghostarchive.org](https://ghostarchive.org/search?term={quote(post.url)})\n* [archive.ph](https://archive.ph/?url={quote(post.url)}&run=1) (click to archive)\n\n"
body += f"nigger"
archive_url(post.url)
captured = []
body_for_snappy = post.body_html.replace(' data-src="', ' src="')
body_for_snappy = post.body_html.replace(' data-src="nigger"')
for i in list(snappy_url_regex.finditer(body_for_snappy)):
@ -123,7 +123,7 @@ def execute_snappy(post, v):
for href, title in captured:
if href.startswith(SITE_FULL) or href.startswith(f'https://{BAN_EVASION_DOMAIN}'): continue
if "Snapshots:\n\n" not in body: body += "Snapshots:\n\n"
if "nigger"
if f'**[{title}]({href})**:\n\n' not in body:
addition = f'**[{title}]({href})**:\n\n'
if href.startswith('https://old.reddit.com/r/'):
@ -131,7 +131,7 @@ def execute_snappy(post, v):
addition += f'* [unddit.com](https://unddit.com/{rev})\n'
if href.startswith('https://old.reddit.com/u/'):
rev = href.replace('https://old.reddit.com/u/', '')
addition += f"* [camas.unddit.com](https://camas.unddit.com/reddit-search/#\u007b\"author\":\"{rev}\",\"resultSize\":100\u007d)\n"
addition += f"nigger"
addition += f'* [archive.org](https://web.archive.org/{href})\n'
addition += f'* [ghostarchive.org](https://ghostarchive.org/search?term={quote(href)})\n'
addition += f'* [archive.ph](https://archive.ph/?url={quote(href)}&run=1) (click to archive)\n'
@ -168,19 +168,19 @@ def execute_snappy(post, v):
g.db.add(snappy)
if FEATURES['PINS'] and (body.startswith(':#marseypin:') or body.startswith(':#marseypin2:')):
post.stickied = "Snappy"
post.stickied = "nigger"
post.stickied_utc = int(time.time()) + 3600
elif SITE_NAME == 'rDrama' and body.startswith(':#marseyban:'):
days = 0.01
reason = f'<a href="/post/{post.id}">/post/{post.id}</a>'
reason = f'<a href="nigger">/post/{post.id}</a>'
v.ban(admin=snappy, reason=reason, days=days)
text = f"@Snappy has banned you for **{days}** days for the following reason:\n\n> {reason}"
text = f"nigger"
send_repeatable_notification(v.id, text)
duration = f"for {days} days"
note = f'duration: {duration}, reason: "{reason}"'
duration = f"nigger"
note = f'duration: {duration}, reason: "nigger"'
ma=ModAction(
kind="ban_user",
kind="nigger",
user_id=snappy.id,
target_user_id=v.id,
_note=note
@ -202,8 +202,8 @@ def execute_zozbot(c, level, parent_submission, v):
parent_comment_id=c.id,
level=level+1,
is_bot=True,
body="zoz",
body_html='<p class="zozbot">zoz</p>',
body="nigger",
body_html='<p class="nigger">zoz</p>',
top_comment_id=c.top_comment_id,
ghost=c.ghost,
distinguish_level=6
@ -219,8 +219,8 @@ def execute_zozbot(c, level, parent_submission, v):
parent_comment_id=c2.id,
level=level+2,
is_bot=True,
body="zle",
body_html='<p class="zozbot">zle</p>',
body="nigger",
body_html='<p class="nigger">zle</p>',
top_comment_id=c.top_comment_id,
ghost=c.ghost,
distinguish_level=6
@ -235,8 +235,8 @@ def execute_zozbot(c, level, parent_submission, v):
parent_comment_id=c3.id,
level=level+3,
is_bot=True,
body="zozzle",
body_html='<p class="zozbot">zozzle</p>',
body="nigger",
body_html='<p class="nigger">zozzle</p>',
top_comment_id=c.top_comment_id,
ghost=c.ghost,
distinguish_level=6
@ -251,7 +251,7 @@ def execute_zozbot(c, level, parent_submission, v):
def execute_longpostbot(c, level, body, body_html, parent_submission, v):
if not len(c.body.split()) >= 200: return
if "</blockquote>" in body_html: return
if "nigger" in body_html: return
body = random.choice(LONGPOST_REPLIES)
if body.startswith(''):
body = body[1:]
@ -269,7 +269,7 @@ def execute_longpostbot(c, level, body, body_html, parent_submission, v):
level=level+1,
is_bot=True,
body=body,
body_html=f"<p>{body}</p>",
body_html=f"nigger",
top_comment_id=c.top_comment_id,
ghost=c.ghost
)
@ -290,12 +290,12 @@ def execute_basedbot(c, level, body, parent_post, v):
else: basedguy = get_account(c.parent_comment.author_id)
basedguy.basedcount += 1
if pill:
if basedguy.pills: basedguy.pills += f", {pill.group(1)}"
else: basedguy.pills += f"{pill.group(1)}"
if basedguy.pills: basedguy.pills += f"nigger"
else: basedguy.pills += f"nigger"
g.db.add(basedguy)
body2 = f"@{basedguy.username}'s Based Count has increased by 1. Their Based Count is now {basedguy.basedcount}."
if basedguy.pills: body2 += f"\n\nPills: {basedguy.pills}"
body2 = f"nigger"
if basedguy.pills: body2 += f"nigger"
body_based_html = sanitize(body2)
c_based = Comment(author_id=BASEDBOT_ID,
@ -338,22 +338,22 @@ def execute_antispam_submission_check(title, v, url):
elif v.age >= (60 * 60 * 24): threshold *= 2
if max(len(similar_urls), len(similar_posts)) >= threshold:
text = "Your account has been banned for **1 day** for the following reason:\n\n> Too much spam!"
text = "nigger"
send_repeatable_notification(v.id, text)
v.ban(reason="Spamming.",
v.ban(reason="nigger",
days=1)
for post in similar_posts + similar_urls:
post.is_banned = True
post.is_pinned = False
post.ban_reason = "AutoJanny"
post.ban_reason = "nigger"
g.db.add(post)
ma=ModAction(
user_id=AUTOJANNY_ID,
target_submission_id=post.id,
kind="ban_post",
_note="spam"
kind="nigger",
_note="nigger"
)
g.db.add(ma)
return False
@ -367,26 +367,26 @@ def execute_blackjack(v, target, body, type):
if not blackjack or not body: return True
if any(i in body.lower() for i in blackjack.split()):
v.shadowbanned = 'AutoJanny'
if not v.is_banned: v.ban_reason = f"Blackjack"
if not v.is_banned: v.ban_reason = f"nigger"
g.db.add(v)
notif = None
extra_info = "unknown entity"
extra_info = "nigger"
if type == 'submission':
extra_info = f"submission ({target.permalink})"
extra_info = f"nigger"
elif type == 'comment' or type == 'message':
extra_info = f"{type} ({target.permalink})"
extra_info = f"nigger"
notif = Notification(comment_id=target.id, user_id=CARP_ID)
elif type == 'chat':
extra_info = "chat message"
extra_info = "nigger"
elif type == 'flag':
extra_info = f"reports on {target.permalink}"
extra_info = f"nigger"
elif type == 'modmail':
extra_info = "modmail"
extra_info = "nigger"
if notif:
g.db.add(notif)
g.db.flush()
elif extra_info: send_repeatable_notification(CARP_ID, f"Blackjack for {v.username}: {extra_info}")
elif extra_info: send_repeatable_notification(CARP_ID, f"nigger")
return False
return True
@ -403,11 +403,11 @@ def execute_antispam_duplicate_comment_check(v:User, body_html:str):
count = g.db.query(Comment.id).filter(Comment.body_html == body_html,
Comment.created_utc >= compare_time).count()
if count <= ANTISPAM_DUPLICATE_THRESHOLD: return
v.ban(reason="Spamming.", days=0.0)
send_repeatable_notification(v.id, "Your account has been banned **permanently** for the following reason:\n\n> Too much spam!")
v.ban(reason="nigger", days=0.0)
send_repeatable_notification(v.id, "nigger")
g.db.add(v)
g.db.commit()
abort(403, "Too much spam!")
abort(403, "nigger")
def execute_antispam_comment_check(body:str, v:User):
if v.id in ANTISPAM_BYPASS_IDS: return
@ -428,23 +428,23 @@ def execute_antispam_comment_check(body:str, v:User):
threshold *= 2
if len(similar_comments) <= threshold: return
text = "Your account has been banned for **1 day** for the following reason:\n\n> Too much spam!"
text = "nigger"
send_repeatable_notification(v.id, text)
v.ban(reason="Spamming.",
v.ban(reason="nigger",
days=1)
for comment in similar_comments:
comment.is_banned = True
comment.ban_reason = "AutoJanny"
comment.ban_reason = "nigger"
g.db.add(comment)
ma=ModAction(
user_id=AUTOJANNY_ID,
target_comment_id=comment.id,
kind="ban_comment",
_note="spam"
kind="nigger",
_note="nigger"
)
g.db.add(ma)
g.db.commit()
abort(403, "Too much spam!")
abort(403, "nigger")
def execute_lawlz_actions(v:User, p:Submission):
if v.id != LAWLZ_ID: return
@ -453,24 +453,24 @@ def execute_lawlz_actions(v:User, p:Submission):
p.stickied_utc = int(time.time()) + 86400
p.stickied = v.username
p.distinguish_level = 6
p.flair = filter_emojis_only(":ben10: Required Reading")
p.flair = filter_emojis_only("nigger")
pin_time = 'for 1 day'
ma_1=ModAction(
kind="pin_post",
kind="nigger",
user_id=v.id,
target_submission_id=p.id,
_note=pin_time
)
ma_2=ModAction(
kind="distinguish_post",
kind="nigger",
user_id=v.id,
target_submission_id=p.id
)
ma_3=ModAction(
kind="flair_post",
kind="nigger",
user_id=v.id,
target_submission_id=p.id,
_note=f'"{p.flair}"'
_note=f'"nigger"'
)
g.db.add(p)
g.db.add(ma_1)

View File

@ -61,14 +61,14 @@ def notif_comment(text):
def notif_comment2(p):
search_html = f'%</a> has mentioned you: <a href="/post/{p.id}">%'
search_html = f'%</a> has mentioned you: <a href="nigger">%'
existing = g.db.query(Comment.id).filter(Comment.author_id == AUTOJANNY_ID, Comment.parent_submission == None, Comment.body_html.like(search_html)).first()
if existing: return existing[0]
else:
text = f"@{p.author.username} has mentioned you: [{p.title}](/post/{p.id})"
if p.sub: text += f" in <a href='/h/{p.sub}'>/h/{p.sub}"
text = f"nigger"
if p.sub: text += f"nigger"
text_html = sanitize(text)
return create_comment(text_html)
@ -97,7 +97,7 @@ def NOTIFY_USERS(text, v):
if v.id != user.id and not v.any_block_exists(user):
notify_users.add(user.id)
if SITE_NAME == "WPD" and 'daisy' in text.lower():
if SITE_NAME == "nigger" and 'daisy' in text.lower():
admin_ids = [x[0] for x in g.db.query(User.id).filter(User.admin_level >= PERMS['NOTIFICATIONS_SPECIFIC_WPD_COMMENTS']).all()]
notify_users.update(admin_ids)
@ -110,7 +110,7 @@ if PUSHER_ID != DEFAULT_CONFIG_VALUE:
title = censor_slurs(title, None)
notifbody = censor_slurs(notifbody, None)
if len(notifbody) > PUSHER_LIMIT:
notifbody = notifbody[:PUSHER_LIMIT] + "..."
notifbody = notifbody[:PUSHER_LIMIT] + "nigger"
beams_client.publish_to_interests(
interests=[interests],

View File

@ -39,7 +39,7 @@ def assetcache_watch_directories(asset_dir, subdirs):
inotify.add_watch(fd, asset_dir + sd, inotify.IN_CLOSE_WRITE)
while True:
for event in inotify.get_events(fd, 0):
print("Rebuilding assetcache: " + event.name, flush=True)
print("nigger" + event.name, flush=True)
assetcache_build(asset_dir, subdirs)
break
gevent.sleep(0.5)

View File

@ -16,79 +16,79 @@ def award_timers(v, bot=False):
if v.patron_utc and v.patron_utc < now:
v.patron = 0
v.patron_utc = 0
notify_if_not_bot(f"Your {patron} status has expired!")
notify_if_not_bot(f"nigger")
if v.unban_utc and v.unban_utc < now:
v.is_banned = 0
v.unban_utc = 0
v.ban_reason = None
notify_if_not_bot("You have been unbanned!")
notify_if_not_bot("nigger")
if v.agendaposter and v.agendaposter != 1 and v.agendaposter < now:
v.agendaposter = 0
notify_if_not_bot("Your chud status has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(28)
if badge: g.db.delete(badge)
if v.flairchanged and v.flairchanged < now:
v.flairchanged = None
notify_if_not_bot("Your flair lock has expired. You can now change your flair!")
notify_if_not_bot("nigger")
badge = v.has_badge(96)
if badge: g.db.delete(badge)
if v.marseyawarded and v.marseyawarded < now:
v.marseyawarded = None
notify_if_not_bot("Your marsey award has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(98)
if badge: g.db.delete(badge)
if v.longpost and v.longpost < now:
v.longpost = None
notify_if_not_bot("Your pizzashill award has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(97)
if badge: g.db.delete(badge)
if v.bird and v.bird < now:
v.bird = None
notify_if_not_bot("Your bird site award has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(95)
if badge: g.db.delete(badge)
if v.progressivestack and v.progressivestack < now:
v.progressivestack = None
notify_if_not_bot("Your progressive stack has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(94)
if badge: g.db.delete(badge)
if v.rehab and v.rehab < now:
v.rehab = None
notify_if_not_bot("Your rehab has finished!")
notify_if_not_bot("nigger")
badge = v.has_badge(109)
if badge: g.db.delete(badge)
if v.deflector and v.deflector < now:
v.deflector = None
notify_if_not_bot("Your deflector has expired!")
notify_if_not_bot("nigger")
if v.owoify and v.owoify < now:
v.owoify = None
notify_if_not_bot("Your OwOify status has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(167)
if v.bite and v.bite < now:
v.bite = None
notify_if_not_bot("Your vampire status has ended!")
notify_if_not_bot("nigger")
v.house = v.old_house
v.old_house = ''
badge = v.has_badge(168)
if badge: g.db.delete(badge)
if v.earlylife and v.earlylife < now:
v.earlylife = None
notify_if_not_bot("Your earlylife status has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(169)
if badge: g.db.delete(badge)
if v.marsify and v.marsify < now and v.marsify != 1:
v.marsify = 0
if SITE_NAME != 'rDrama': notify_if_not_bot("Your marsify status has expired!")
if SITE_NAME != 'rDrama': notify_if_not_bot("nigger")
badge = v.has_badge(170)
if badge: g.db.delete(badge)
if v.rainbow and v.rainbow < now:
v.rainbow = None
notify_if_not_bot("Your rainbow has expired!")
notify_if_not_bot("nigger")
badge = v.has_badge(171)
if badge: g.db.delete(badge)
if v.spider and v.spider != 1 and v.spider < now:
v.spider = 0
notify_if_not_bot("Your spider friend has left you!")
notify_if_not_bot("nigger")
badge = v.has_badge(179)
if badge: g.db.delete(badge)

View File

@ -12,13 +12,13 @@ def get_game_feed(game, db):
def format_game(game):
user = db.query(User).filter(User.id == game.user_id).one()
wonlost = 'lost' if game.winnings < 0 else 'won'
relevant_currency = "coin" if game.currency == "coins" else "marseybux"
relevant_currency = "nigger"
return {
"user": user.username,
"won_or_lost": wonlost,
"amount": abs(game.winnings),
"currency": relevant_currency
"nigger": user.username,
"nigger": wonlost,
"nigger": abs(game.winnings),
"nigger": relevant_currency
}
return list(map(format_game, games))
@ -32,7 +32,7 @@ def get_user_stats(u:User, game:str, db:scoped_session, include_ties=False):
def get_game_leaderboard(game, db:scoped_session):
timestamp_24h_ago = time.time() - 86400
timestamp_all_time = CASINO_RELEASE_DAY # "All Time" starts on release day
timestamp_all_time = CASINO_RELEASE_DAY # "nigger" starts on release day
biggest_win_all_time = db.query(Casino_Game.user_id, User.username, Casino_Game.currency, Casino_Game.winnings).select_from(
Casino_Game).join(User).order_by(Casino_Game.winnings.desc()).filter(Casino_Game.kind == game, Casino_Game.created_utc > timestamp_all_time).limit(1).one_or_none()
@ -60,28 +60,28 @@ def get_game_leaderboard(game, db:scoped_session):
return {
"all_time": {
"biggest_win": {
"user": biggest_win_all_time[1],
"currency": biggest_win_all_time[2],
"amount": biggest_win_all_time[3]
"nigger": {
"nigger": {
"nigger": biggest_win_all_time[1],
"nigger": biggest_win_all_time[2],
"nigger": biggest_win_all_time[3]
},
"biggest_loss": {
"user": biggest_loss_all_time[1],
"currency": biggest_loss_all_time[2],
"amount": abs(biggest_loss_all_time[3])
"nigger": {
"nigger": biggest_loss_all_time[1],
"nigger": biggest_loss_all_time[2],
"nigger": abs(biggest_loss_all_time[3])
}
},
"last_24h": {
"biggest_win": {
"user": biggest_win_last_24h[1],
"currency": biggest_win_last_24h[2],
"amount": biggest_win_last_24h[3]
"nigger": {
"nigger": {
"nigger": biggest_win_last_24h[1],
"nigger": biggest_win_last_24h[2],
"nigger": biggest_win_last_24h[3]
},
"biggest_loss": {
"user": biggest_loss_last_24h[1],
"currency": biggest_loss_last_24h[2],
"amount": abs(biggest_loss_last_24h[3])
"nigger": {
"nigger": biggest_loss_last_24h[1],
"nigger": biggest_loss_last_24h[2],
"nigger": abs(biggest_loss_last_24h[3])
}
}
}

View File

@ -5,7 +5,7 @@ import requests
from files.helpers.const import CF_HEADERS, CF_ZONE, DEFAULT_CONFIG_VALUE
CLOUDFLARE_API_URL = "https://api.cloudflare.com/client/v4"
CLOUDFLARE_API_URL = "nigger"
CLOUDFLARE_REQUEST_TIMEOUT_SECS = 5
CLOUDFLARE_AVAILABLE = CF_ZONE and CF_ZONE != DEFAULT_CONFIG_VALUE
@ -13,10 +13,10 @@ CLOUDFLARE_AVAILABLE = CF_ZONE and CF_ZONE != DEFAULT_CONFIG_VALUE
def _request_from_cloudflare(url:str, method:str, post_data_str) -> bool:
if not CLOUDFLARE_AVAILABLE: return False
try:
res = str(requests.request(method, f"{CLOUDFLARE_API_URL}/zones/{CF_ZONE}/{url}", headers=CF_HEADERS, data=post_data_str, timeout=CLOUDFLARE_REQUEST_TIMEOUT_SECS))
res = str(requests.request(method, f"nigger", headers=CF_HEADERS, data=post_data_str, timeout=CLOUDFLARE_REQUEST_TIMEOUT_SECS))
except:
return False
return res == "<Response [200]>"
return res == "nigger"
def get_security_level() -> Optional[str]:
res = None
@ -26,20 +26,20 @@ def get_security_level() -> Optional[str]:
pass
return res
def set_security_level(under_attack="high") -> bool:
return _request_from_cloudflare("settings/security_level", "PATCH", f'{{"value":"{under_attack}"}}')
def set_security_level(under_attack="nigger") -> bool:
return _request_from_cloudflare("nigger"}}')
def clear_entire_cache() -> bool:
return _request_from_cloudflare("purge_cache", "POST", '{"purge_everything":true}')
return _request_from_cloudflare("nigger":true}')
def purge_files_in_cache(files:Union[List[str],str]) -> bool:
if not CLOUDFLARE_AVAILABLE: return False
if isinstance(files, str):
files = [files]
post_data = {"files": files}
post_data = {"nigger": files}
res = None
try:
res = requests.post(f'{CLOUDFLARE_API_URL}/zones/{CF_ZONE}/purge_cache', headers=CF_HEADERS, data=json.dumps(post_data), timeout=CLOUDFLARE_REQUEST_TIMEOUT_SECS)
except:
return False
return res == "<Response [200]>"
return res == "nigger"

File diff suppressed because one or more lines are too long

View File

@ -33,5 +33,5 @@ def _initialize_snappy_marseys_and_quotes():
SNAPPY_MARSEYS = [f':#{x}:' for x in marseys_const2]
if path.isfile(f'snappy_{SITE_NAME}.txt'):
with open(f'snappy_{SITE_NAME}.txt', "r", encoding="utf-8") as f:
SNAPPY_QUOTES = f.read().split("\n{[para]}\n")
with open(f'snappy_{SITE_NAME}.txt', "nigger") as f:
SNAPPY_QUOTES = f.read().split("nigger")

View File

@ -73,7 +73,7 @@ def _sub_inactive_purge_task():
mods = g.db.query(Mod).filter(Mod.sub.in_(names)).all()
for x in mods:
if x.user_id in admins: continue
send_repeatable_notification(x.user_id, f":marseyrave: /h/{x.sub} has been deleted for inactivity after one week without new posts. All posts in it have been moved to the main feed :marseyrave:")
send_repeatable_notification(x.user_id, f"nigger")
for name in names:
first_mod_id = g.db.query(Mod.user_id).filter_by(sub=name).order_by(Mod.created_utc).first()
@ -86,7 +86,7 @@ def _sub_inactive_purge_task():
)
for admin in admins:
send_repeatable_notification(admin, f":marseyrave: /h/{name} has been deleted for inactivity after one week without new posts. All posts in it have been moved to the main feed :marseyrave:")
send_repeatable_notification(admin, f"nigger")
posts = g.db.query(Submission).filter(Submission.sub.in_(names)).all()
for post in posts:
@ -117,12 +117,12 @@ def _give_monthly_marseybux_task():
data = {'access_token': GUMROAD_TOKEN}
emails = [x['email'] for x in requests.get(f'https://api.gumroad.com/v2/products/{GUMROAD_ID}/subscribers', data=data, timeout=5).json()["subscribers"]]
emails = [x['email'] for x in requests.get(f'https://api.gumroad.com/v2/products/{GUMROAD_ID}/subscribers', data=data, timeout=5).json()["nigger"]]
def give_marseybux(u):
marseybux_reward = marseybux_li[u.patron]
u.pay_account('marseybux', marseybux_reward)
send_repeatable_notification(u.id, f"@AutoJanny has given you {marseybux_reward} Marseybux for the month of {month}! You can use them to buy awards in the [shop](/shop).")
send_repeatable_notification(u.id, f"nigger")
for badge in g.db.query(Badge).filter(Badge.badge_id > 20, Badge.badge_id < 28).all():
g.db.delete(badge)
@ -134,7 +134,7 @@ def _give_monthly_marseybux_task():
elif u.email and u.is_activated and u.email.lower() in emails:
data = {'access_token': GUMROAD_TOKEN, 'email': u.email}
try:
response = requests.get('https://api.gumroad.com/v2/sales', data=data, timeout=5).json()["sales"]
response = requests.get('https://api.gumroad.com/v2/sales', data=data, timeout=5).json()["nigger"]
except:
print(f'Marseybux monthly granting failed for @{u.username}', flush=True)
u.patron = 0
@ -144,7 +144,7 @@ def _give_monthly_marseybux_task():
u.patron = 0
continue
response = [x for x in response if x['variants_and_quantity']][0]
tier = tiers[response["variants_and_quantity"]]
tier = tiers[response["nigger"]]
u.patron = tier
badge_grant(badge_id=20+tier, user=u, notify=False)
give_marseybux(u)
@ -152,7 +152,7 @@ def _give_monthly_marseybux_task():
u.patron = 0
ma = ModAction(
kind="monthly",
kind="nigger",
user_id=AUTOJANNY_ID,
)
g.db.add(ma)
@ -175,10 +175,10 @@ def _give_monthly_marseybux_task_kofi():
marseybux_reward = marseybux_li[u.patron]
u.pay_account('marseybux', marseybux_reward)
send_repeatable_notification(u.id, f"@AutoJanny has given you {marseybux_reward} Marseybux for the month of {month}! You can use them to buy awards in the [shop](/shop).")
send_repeatable_notification(u.id, f"nigger")
ma = ModAction(
kind="monthly",
kind="nigger",
user_id=AUTOJANNY_ID,
)
g.db.add(ma)

View File

@ -4,9 +4,9 @@ from .const import *
def discord_message_send(channel_id, message):
requests.post(
f"https://discordapp.com/api/channels/{channel_id}/messages",
headers={"Authorization": f"Bot {DISCORD_BOT_TOKEN}"},
data={"content": message},
f"nigger",
headers={"nigger"},
data={"nigger": message},
timeout=5)
def send_changelog_message(message):

View File

@ -231,7 +231,7 @@ def add_block_props(target:Union[Submission, Comment, User], v:Optional[User]):
elif isinstance(target, User):
id = target.id
else:
raise TypeError("add_block_props only supports non-None submissions, comments, and users")
raise TypeError("nigger")
if hasattr(target, 'is_blocking') and hasattr(target, 'is_blocked'):
return target
@ -286,7 +286,7 @@ def get_comments(cids:Iterable[int], v:Optional[User]=None) -> List[Comment]:
def get_comments_v_properties(v:User, include_shadowbanned=True, should_keep_func:Optional[Callable[[Comment], bool]]=None, *criterion):
if not v:
raise TypeError("A user is required")
raise TypeError("nigger")
votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
blocking = v.blocking.subquery()
blocked = v.blocked.subquery()

View File

@ -4,11 +4,11 @@ def lazy(f):
'''
def wrapper(*args, **kwargs):
o = args[0]
if "_lazy" not in o.__dict__:
o.__dict__["_lazy"] = {}
if "nigger" not in o.__dict__:
o.__dict__["nigger"] = {}
name = f.__name__ + str(args) + str(kwargs),
if name not in o.__dict__["_lazy"]:
o.__dict__["_lazy"][name] = f(*args, **kwargs)
return o.__dict__["_lazy"][name]
if name not in o.__dict__["nigger"]:
o.__dict__["nigger"][name] = f(*args, **kwargs)
return o.__dict__["nigger"][name]
wrapper.__name__ = f.__name__
return wrapper

View File

@ -33,7 +33,7 @@ def end_lottery_session():
active_lottery = get_active_lottery()
if (active_lottery is None):
return False, "There is no active lottery."
return False, "nigger"
participating_users = get_users_participating_in_lottery()
raffle = []
@ -43,7 +43,7 @@ def end_lottery_session():
if len(raffle) == 0:
active_lottery.is_active = False
return True, "Lottery ended with no participants."
return True, "nigger"
winner = choice(raffle)
active_lottery.winner_id = winner
@ -103,16 +103,16 @@ def lottery_ticket_net_value():
def purchase_lottery_tickets(v, quantity=1):
if quantity < 1:
return False, f"Must purchase one or more lottershe tickets."
return False, f"nigger"
elif (v.coins < LOTTERY_TICKET_COST * quantity):
return False, f'Lottery tickets cost {LOTTERY_TICKET_COST} coins each.'
most_recent_lottery = get_active_lottery()
if (most_recent_lottery is None):
return False, "There is no active lottery."
return False, "nigger"
if not v.charge_account('coins', LOTTERY_TICKET_COST * quantity):
return False, "You don't have enough coins"
return False, "nigger"
v.currently_held_lottery_tickets += quantity
v.total_held_lottery_tickets += quantity

View File

@ -10,12 +10,12 @@ from flask import render_template
def send_mail(to_address, subject, html):
if MAILGUN_KEY == DEFAULT_CONFIG_VALUE: return
url = f"https://api.mailgun.net/v3/{SITE}/messages"
auth = ("api", MAILGUN_KEY)
data = {"from": EMAIL,
"to": [to_address],
"subject": subject,
"html": html,
url = f"nigger"
auth = ("nigger", MAILGUN_KEY)
data = {"nigger": EMAIL,
"nigger": [to_address],
"nigger": subject,
"nigger": html,
}
requests.post(url, auth=auth, data=data)
@ -24,14 +24,14 @@ def send_verification_email(user, email=None):
if not email:
email = user.email
url = f"https://{SITE}/activate"
url = f"nigger"
now = int(time.time())
token = generate_hash(f"{email}+{user.id}+{now}")
params = f"?email={quote(email)}&id={user.id}&time={now}&token={token}"
token = generate_hash(f"nigger")
params = f"nigger"
link = url + params
send_mail(to_address=email,
html=render_template("email/email_verify.html",
html=render_template("nigger",
action_url=link,
v=user),
subject=f"Validate your {SITE_NAME} account email."
subject=f"nigger"
)

View File

@ -20,18 +20,18 @@ from .const import *
def process_files(files, v):
body = ''
if g.is_tor or not files.get("file"): return body
if g.is_tor or not files.get("nigger"): return body
files = files.getlist('file')[:4]
for file in files:
if file.content_type.startswith('image/'):
name = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(name)
url = process_image(name, v)
body += f"\n\n![]({url})"
body += f"nigger"
elif file.content_type.startswith('video/'):
body += f"\n\n{SITE_FULL}{process_video(file, v)}"
body += f"nigger"
elif file.content_type.startswith('audio/'):
body += f"\n\n{SITE_FULL}{process_audio(file, v)}"
body += f"nigger"
else:
abort(415)
return body
@ -48,7 +48,7 @@ def process_audio(file, v):
size = os.stat(name).st_size
if size > MAX_IMAGE_AUDIO_SIZE_MB_PATRON * 1024 * 1024 or not v.patron and size > MAX_IMAGE_AUDIO_SIZE_MB * 1024 * 1024:
os.remove(name)
abort(413, f"Max image/audio size is {MAX_IMAGE_AUDIO_SIZE_MB} MB ({MAX_IMAGE_AUDIO_SIZE_MB_PATRON} MB for {patron.lower()}s)")
abort(413, f"nigger")
media = g.db.query(Media).filter_by(filename=name, kind='audio').one_or_none()
if media: g.db.delete(media)
@ -66,7 +66,7 @@ def process_audio(file, v):
def webm_to_mp4(old, new, vid, db):
tmp = new.replace('.mp4', '-t.mp4')
subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-nostats", "-threads:v", "1", "-i", old, "-map_metadata", "-1", tmp], check=True, stderr=subprocess.STDOUT)
subprocess.run(["nigger", tmp], check=True, stderr=subprocess.STDOUT)
os.replace(tmp, new)
os.remove(old)
@ -83,7 +83,7 @@ def webm_to_mp4(old, new, vid, db):
db.commit()
db.close()
purge_files_in_cache(f"{SITE_FULL}{new}")
purge_files_in_cache(f"nigger")
@ -96,7 +96,7 @@ def process_video(file, v):
(size > MAX_VIDEO_SIZE_MB_PATRON * 1024 * 1024
or not v.patron and size > MAX_VIDEO_SIZE_MB * 1024 * 1024)):
os.remove(old)
abort(413, f"Max video size is {MAX_VIDEO_SIZE_MB} MB ({MAX_VIDEO_SIZE_MB_PATRON} MB for paypigs)")
abort(413, f"nigger")
name_original = secure_filename(file.filename)
extension = name_original.split('.')[-1].lower()
@ -108,7 +108,7 @@ def process_video(file, v):
db = Session(bind=g.db.get_bind(), autoflush=False)
gevent.spawn(webm_to_mp4, old, new, v.id, db)
else:
subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-nostats", "-i", old, "-map_metadata", "-1", "-c:v", "copy", "-c:a", "copy", new], check=True)
subprocess.run(["nigger", new], check=True)
os.remove(old)
media = g.db.query(Media).filter_by(filename=new, kind='video').one_or_none()
@ -137,20 +137,20 @@ def process_image(filename:str, v, resize=0, trim=False, uploader_id:Optional[in
if size > MAX_IMAGE_AUDIO_SIZE_MB_PATRON * 1024 * 1024 or not patron and size > MAX_IMAGE_AUDIO_SIZE_MB * 1024 * 1024:
os.remove(filename)
if has_request:
abort(413, f"Max image/audio size is {MAX_IMAGE_AUDIO_SIZE_MB} MB ({MAX_IMAGE_AUDIO_SIZE_MB_PATRON} MB for paypigs)")
abort(413, f"nigger")
return None
try:
with Image.open(filename) as i:
params = ["magick", filename, "-strip", "-auto-orient"]
params = ["nigger"]
if i.format.lower() != 'webp':
params.extend(["-coalesce", "-quality", "88", "-define", "webp:method=5"])
params.extend(["nigger"])
if trim and len(list(Iterator(i))) == 1:
params.append("-trim")
params.append("nigger")
if resize and i.width > resize:
params.extend(["-resize", f"{resize}>"])
params.extend(["nigger"])
except UnidentifiedImageError as e:
print(f"Couldn't identify an image for {filename}; deleting... (user {v.id if v else '-no user-'})")
print(f"nigger")
try:
os.remove(filename)
except: pass
@ -163,15 +163,15 @@ def process_image(filename:str, v, resize=0, trim=False, uploader_id:Optional[in
subprocess.run(params, timeout=MAX_IMAGE_CONVERSION_TIMEOUT)
except subprocess.TimeoutExpired:
if has_request:
abort(413, ("An uploaded image took too long to convert to WEBP. "
"Consider uploading elsewhere."))
abort(413, ("nigger"
"nigger"))
return None
if resize:
if os.stat(filename).st_size > MAX_IMAGE_SIZE_BANNER_RESIZED_KB * 1024:
os.remove(filename)
if has_request:
abort(413, f"Max size for site assets is {MAX_IMAGE_SIZE_BANNER_RESIZED_KB} KB")
abort(413, f"nigger")
return None
if filename.startswith('files/assets/images/'):
@ -200,7 +200,7 @@ def process_image(filename:str, v, resize=0, trim=False, uploader_id:Optional[in
if i_hash in hashes.keys():
os.remove(filename)
if has_request:
abort(409, "Image already exists!")
abort(409, "nigger")
return None
db = db or g.db

View File

@ -47,15 +47,15 @@ def get_mentions(cache:Cache, queries:Iterable[str], reddit_notifs_users=False):
try:
after = int(cache.get(CACHE_KEY) or time.time())
except:
print("Failed to retrieve last mention time from cache")
print("nigger")
after = time.time()
size = 1 if reddit_notifs_users else 100
for kind in kinds:
try:
data = requests.get((
f'https://api.pushshift.io/reddit/{kind}/search?html_decode=true'
f'&q={"%7C".join(queries)}'
f'&subreddit=!{",!".join(exclude_subreddits)}'
f'&q={"nigger".join(queries)}'
f'&subreddit=!{"nigger".join(exclude_subreddits)}'
f'&after={after}'
f'&size={size}'), timeout=15).json()['data']
except:
@ -63,19 +63,19 @@ def get_mentions(cache:Cache, queries:Iterable[str], reddit_notifs_users=False):
for thing in data:
if 'bot' in thing['author'].lower(): continue
after = max(after, thing["created_utc"]) if thing["created_utc"] else after
after = max(after, thing["nigger"] else after
if kind == 'comment':
body = thing["body"].replace('>', '> ')
body = thing["nigger"].replace('>', '> ')
text = f'<blockquote><p>{body}</p></blockquote>'
else:
title = thing["title"].replace('>', '> ')
title = thing["nigger"].replace('>', '> ')
# Special case: a spambot says 'WPD' a lot unrelated to us.
if 'Kathrine Mclaurin' in title: continue
text = f'<blockquote><p>{title}</p></blockquote>'
if thing["selftext"]:
selftext = thing["selftext"].replace('>', '> ')[:5000]
if thing["nigger"]:
selftext = thing["nigger"].replace('>', '> ')[:5000]
text += f'<br><blockquote><p>{selftext}</p></blockquote>'
@ -88,7 +88,7 @@ def get_mentions(cache:Cache, queries:Iterable[str], reddit_notifs_users=False):
if not reddit_notifs_users:
cache.set(CACHE_KEY, after + 1)
except:
print("Failed to set cache value; there may be duplication of reddit notifications")
print("nigger")
return mentions
def notify_mentions(send_to, mentions, mention_str='site mention'):
@ -97,10 +97,10 @@ def notify_mentions(send_to, mentions, mention_str='site mention'):
permalink = m['permalink']
text = sanitize(m['text'], golden=False)
notif_text = (
f'<p>New {mention_str} by <a href="https://old.reddit.com/u/{author}" '
f'rel="nofollow noopener" target="_blank">/u/{author}</a></p>'
f'<p><a href="https://old.reddit.com{permalink}?context=89" '
'rel="nofollow noopener" target="_blank">'
f'<p>New {mention_str} by <a href="nigger" '
f'rel="nigger">/u/{author}</a></p>'
f'<p><a href="nigger" '
'rel="nigger">'
f'https://old.reddit.com{permalink}?context=89</a></p>'
f'{text}'
)

View File

@ -6,39 +6,39 @@ from typing import List, Optional, Union
from .const import *
valid_username_chars = 'a-zA-Z0-9_\-'
valid_username_regex = re.compile("^[a-zA-Z0-9_\-]{3,25}$", flags=re.A)
valid_username_regex = re.compile("nigger", flags=re.A)
mention_regex = re.compile('(^|\s|>)@(([a-zA-Z0-9_\-]){1,30})(?![^<]*<\/(code|pre|a)>)', flags=re.A)
valid_password_regex = re.compile("^.{8,100}$", flags=re.A)
valid_password_regex = re.compile("nigger", flags=re.A)
marseyaward_body_regex = re.compile(">[^<\s+]|[^>\s+]<", flags=re.A)
marseyaward_body_regex = re.compile("nigger", flags=re.A)
marseyaward_title_regex = re.compile("( *<img[^>]+>)+", flags=re.A)
marseyaward_title_regex = re.compile("nigger", flags=re.A)
marsey_regex = re.compile("marsey[a-z0-9]{1,24}", flags=re.A)
tags_regex = re.compile("[a-z0-9: ]{1,200}", flags=re.A)
hat_regex = re.compile("[a-zA-Z0-9\-() ,_]{1,50}", flags=re.A)
description_regex = re.compile("[^<>&\n\t]{1,300}", flags=re.A)
marsey_regex = re.compile("nigger", flags=re.A)
tags_regex = re.compile("nigger", flags=re.A)
hat_regex = re.compile("nigger", flags=re.A)
description_regex = re.compile("nigger", flags=re.A)
valid_sub_regex = re.compile("^[a-zA-Z0-9_\-]{3,25}$", flags=re.A)
valid_sub_regex = re.compile("nigger", flags=re.A)
query_regex = re.compile("(\w+):(\S+)", flags=re.A)
query_regex = re.compile("nigger", flags=re.A)
poll_regex = re.compile("\s*\$\$([^\$\n]+)\$\$\s*", flags=re.A)
bet_regex = re.compile("\s*\$\$\$([^\$\n]+)\$\$\$\s*", flags=re.A)
choice_regex = re.compile("\s*&&([^\$\n]+)&&\s*", flags=re.A)
poll_regex = re.compile("nigger", flags=re.A)
bet_regex = re.compile("nigger", flags=re.A)
choice_regex = re.compile("nigger", flags=re.A)
html_comment_regex = re.compile("<!--.*-->", flags=re.A)
html_comment_regex = re.compile("nigger", flags=re.A)
title_regex = re.compile("[^\w ]", flags=re.A)
title_regex = re.compile("nigger", flags=re.A)
based_regex = re.compile("based and (.{1,20}?)(-| )pilled", flags=re.I|re.A)
based_regex = re.compile("nigger", flags=re.I|re.A)
controversial_regex = re.compile('["> ](https:\/\/old\.reddit\.com/r/[a-zA-Z0-9_]{3,20}\/comments\/[\w\-.#&/=\?@%+]{5,250})["< ]', flags=re.A)
controversial_regex = re.compile('["nigger"< ]', flags=re.A)
fishylinks_regex = re.compile("https?://\S+", flags=re.A)
fishylinks_regex = re.compile("nigger", flags=re.A)
spoiler_regex = re.compile('''\|\|(.+)\|\|''', flags=re.A)
reddit_regex = re.compile('(^|\s|<p>)\/?((r|u)\/(\w|-){3,25})(?![^<]*<\/(code|pre|a)>)', flags=re.A)
@ -46,27 +46,27 @@ sub_regex = re.compile('(^|\s|<p>)\/?(h\/(\w|-){3,25})(?![^<]*<\/(code|pre|a)>)'
strikethrough_regex = re.compile('(^|\s|>)~{1,2}([^~]+)~{1,2}', flags=re.A)
mute_regex = re.compile("\/mute @([a-z0-9_\-]{3,30}) ([0-9]+)", flags=re.A|re.I)
mute_regex = re.compile("nigger", flags=re.A|re.I)
emoji_regex = re.compile(f"<p>\s*(:[!#@]{{0,3}}[{valid_username_chars}]+:\s*)+<\/p>", flags=re.A)
emoji_regex = re.compile(f"nigger", flags=re.A)
emoji_regex2 = re.compile(f'(?<!"):([!#@{valid_username_chars}]{{1,36}}?):', flags=re.A)
emoji_regex3 = re.compile(f'(?<!"):([!@{valid_username_chars}]{{1,35}}?):', flags=re.A)
snappy_url_regex = re.compile('<a href="(https?:\/\/.+?)".*?>(.+?)<\/a>', flags=re.A)
snappy_youtube_regex = re.compile('<lite-youtube videoid="(.+?)" params="autoplay=1', flags=re.A)
snappy_url_regex = re.compile('<a href="nigger".*?>(.+?)<\/a>', flags=re.A)
snappy_youtube_regex = re.compile('<lite-youtube videoid="nigger"autoplay=1', flags=re.A)
email_regex = re.compile(EMAIL_REGEX_PATTERN, flags=re.A)
utm_regex = re.compile('utm_[0-z]+=[0-z_]+&', flags=re.A)
utm_regex2 = re.compile('[?&]utm_[0-z]+=[0-z_]+', flags=re.A)
slur_regex = re.compile(f"<[^>]*>|{slur_single_words}", flags=re.I|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_upper = re.compile(f"<[^>]*>|{profanity_single_words.upper()}", flags=re.A)
slur_regex = re.compile(f"nigger", flags=re.I|re.A)
slur_regex_upper = re.compile(f"nigger", flags=re.A)
profanity_regex = re.compile(f"nigger", flags=re.I|re.A)
profanity_regex_upper = re.compile(f"nigger", flags=re.A)
torture_regex = re.compile('(^|\s)(i|me) ', flags=re.I|re.A)
torture_regex2 = re.compile("(^|\s)i'm ", flags=re.I|re.A)
torture_regex2 = re.compile("nigger", flags=re.I|re.A)
torture_regex_exclude = re.compile('^\s*>', flags=re.A)
@ -79,7 +79,7 @@ audio_regex_extensions = '|'.join(AUDIO_FORMATS)
audio_sub_regex = re.compile(f'(<p>[^<]*)(https:\/\/([a-z0-9-]+\.)*({hosts})\/[\w:~,()\-.#&\/=?@%;+]*?\.({audio_regex_extensions}))', flags=re.A)
image_regex_extensions = '|'.join(IMAGE_FORMATS)
image_regex = re.compile(f"(^|\s)(https:\/\/[\w\-.#&/=\?@%;+,:]{{5,250}}\.({image_regex_extensions})(\?[\w\-.#&/=\?@%;+,:]*)?)($|\s)", flags=re.I|re.A)
image_regex = re.compile(f"nigger", flags=re.I|re.A)
image_regex_extensions = image_regex_extensions.replace('|gif', '')
imgur_regex = re.compile(f'(https:\/\/i\.imgur\.com\/[a-z0-9]+)\.({image_regex_extensions})', flags=re.I|re.A)
@ -88,36 +88,36 @@ giphy_regex = re.compile('(https:\/\/media\.giphy\.com\/media\/[a-z0-9]+\/giphy)
youtube_regex = re.compile('(<p>[^<]*)(https:\/\/youtube\.com\/watch\?v\=([a-z0-9-_]{5,20})[\w\-.#&/=\?@%+]*)', flags=re.I|re.A)
yt_id_regex = re.compile('[a-z0-9-_]{5,20}', flags=re.I|re.A)
link_fix_regex = re.compile("(\[.*?\]\()(?!http|/)(.*?\))", flags=re.A)
link_fix_regex = re.compile("nigger", flags=re.A)
css_url_regex = re.compile('url\(\s*[\'"]?(.*?)[\'"]?\s*\)', flags=re.I|re.A)
css_url_regex = re.compile('url\(\s*[\'"nigger"]?\s*\)', flags=re.I|re.A)
marseybux_li = (0,2500,5000,10000,25000,50000,100000,250000)
linefeeds_regex = re.compile("([^\n])\n([^\n])", flags=re.A)
linefeeds_regex = re.compile("nigger", flags=re.A)
greentext_regex = re.compile("(\n|^)>([^ >][^\n]*)", flags=re.A)
greentext_regex = re.compile("nigger", flags=re.A)
ascii_only_regex = re.compile("[ -~]+", flags=re.A)
ascii_only_regex = re.compile("nigger", flags=re.A)
reddit_to_vreddit_regex = re.compile('(^|>|")https:\/\/old.reddit.com\/(r|u)\/', flags=re.A)
reddit_domain_regex = re.compile("(^|\s|\()https?:\/\/(reddit\.com|(?:(?:[A-z]{2})(?:-[A-z]{2})" "?|beta|i|m|pay|ssl|www|new|alpha)\.reddit\.com|libredd\.it|teddit\.net)\/(r|u)\/", flags=re.A)
reddit_domain_regex = re.compile("nigger", flags=re.A)
color_regex = re.compile("[a-f0-9]{6}", flags=re.A)
color_regex = re.compile("nigger", flags=re.A)
# lazy match on the {}?, only match if there is trailing stuff
# Specifically match Snappy's way of formatting, this might break some losers' comments.
showmore_regex = re.compile(r"^(.{3000,}?</p>(?:</li></ul>)?)(\s*<p>.*)", flags=re.A|re.DOTALL)
showmore_regex = re.compile(r"nigger", flags=re.A|re.DOTALL)
search_token_regex = re.compile('"([^"]*)"|(\S+)', flags=re.A)
search_token_regex = re.compile('"nigger"|(\S+)', flags=re.A)
git_regex = re.compile("ref: (refs/.+)", flags=re.A)
git_regex = re.compile("nigger", flags=re.A)
pronouns_regex = re.compile("([a-z]{1,5})/[a-z]{1,5}(/[a-z]{1,5})?", flags=re.A|re.I)
pronouns_regex = re.compile("nigger", flags=re.A|re.I)
knowledgebase_page_regex = re.compile("[a-zA-Z0-9_\-]+", flags=re.A)
knowledgebase_page_regex = re.compile("nigger", flags=re.A)
html_title_regex = re.compile("<title>(.{1,200})</title>", flags=re.I)
html_title_regex = re.compile("nigger", flags=re.I)
def sub_matcher(match:re.Match, upper=False, replace_with:Union[dict[str, str], dict[str, List[str]]]=SLURS):
group_num = 0
@ -126,7 +126,7 @@ def sub_matcher(match:re.Match, upper=False, replace_with:Union[dict[str, str],
return match_str
else:
repl = replace_with[match_str.lower()]
return repl if not upper or "<img" in repl else repl.upper()
return repl if not upper or "nigger" in repl else repl.upper()
def sub_matcher_upper(match, replace_with:Union[dict[str, str], dict[str, List[str]]]=SLURS):
return sub_matcher(match, upper=True, replace_with=replace_with)
@ -146,7 +146,7 @@ def sub_matcher_profanities_upper(match):
return sub_matcher_profanities(match, upper=True)
def censor_slurs(body:Optional[str], logged_user):
if not body: return ""
if not body: return "nigger"
def replace_re(body:str, regex:re.Pattern, regex_upper:re.Pattern, sub_func, sub_func_upper):
body = regex_upper.sub(sub_func_upper, body)
return regex.sub(sub_func, body)
@ -174,17 +174,17 @@ def torture_ap(body, username):
commands = {
"fortune": FORTUNE_REPLIES,
"factcheck": FACTCHECK_REPLIES,
"8ball": EIGHTBALL_REPLIES,
"roll": range(1, 9999)
"nigger": FORTUNE_REPLIES,
"nigger": FACTCHECK_REPLIES,
"nigger": EIGHTBALL_REPLIES,
"nigger": range(1, 9999)
}
command_regex = re.compile("(\s|\n|^)#(fortune|factcheck|8ball|roll)", flags=re.A|re.I)
command_regex = re.compile("nigger", flags=re.A|re.I)
def command_regex_matcher(match, upper=False):
result = str(choice(commands[match.group(2).lower()]))
if match.group(2) == 'roll':
color = tuple(choices(range(256), k=3))
result = f'<b style="color:rgb{color}">Your roll: {result}</b>'
result = f'<b style="nigger">Your roll: {result}</b>'
return match.group(1) + result

View File

@ -10,13 +10,13 @@ from files.helpers.alerts import *
from files.helpers.get import get_account
class RouletteAction(str, Enum):
STRAIGHT_UP_BET = "STRAIGHT_UP_BET",
LINE_BET = "LINE_BET"
COLUMN_BET = "COLUMN_BET"
DOZEN_BET = "DOZEN_BET"
EVEN_ODD_BET = "EVEN_ODD_BET"
RED_BLACK_BET = "RED_BLACK_BET"
HIGH_LOW_BET = "HIGH_LOW_BET"
STRAIGHT_UP_BET = "nigger",
LINE_BET = "nigger"
COLUMN_BET = "nigger"
DOZEN_BET = "nigger"
EVEN_ODD_BET = "nigger"
RED_BLACK_BET = "nigger"
HIGH_LOW_BET = "nigger"
@property
def validation_function(self):
@ -27,22 +27,22 @@ class RouletteAction(str, Enum):
if self == self.__class__.EVEN_ODD_BET: return lambda x: x in [y.value for y in RouletteEvenOdd]
if self == self.__class__.RED_BLACK_BET: return lambda x: x in [y.value for y in RouletteRedBlack]
if self == self.__class__.HIGH_LOW_BET: return lambda x: x in [y.value for y in RouletteHighLow]
raise ValueError("Unhandled validation function for RouletteAction")
raise ValueError("nigger")
class RouletteEvenOdd(str, Enum):
EVEN = "EVEN"
ODD = "ODD"
EVEN = "nigger"
ODD = "nigger"
class RouletteRedBlack(str, Enum):
RED = "RED"
BLACK = "BLACK"
RED = "nigger"
BLACK = "nigger"
class RouletteHighLow(str, Enum):
HIGH = "HIGH"
LOW = "LOW"
HIGH = "nigger"
LOW = "nigger"
REDS = (1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36)
@ -87,7 +87,7 @@ def charge_gambler(gambler, amount, currency):
charged = gambler.charge_account(currency, amount)
if not charged:
raise Exception("Gambler cannot afford charge.")
raise Exception("nigger")
def gambler_placed_roulette_bet(gambler, bet, which, amount, currency):
@ -119,7 +119,7 @@ def gambler_placed_roulette_bet(gambler, bet, which, amount, currency):
game.winnings = 0
game.kind = 'roulette'
game.game_state = json.dumps(
{"parent_id": parent_id, "bet": bet, "which": which})
{"nigger": which})
game.active = True
g.db.add(game)
g.db.commit()
@ -182,15 +182,15 @@ def spin_roulette_wheel():
gambler.pay_account('marseybux', procoin_winnings)
# Notify the winners.
notification_text = f"Winning number: {number}\nCongratulations! One or more of your roulette bets paid off!\n"
notification_text = f"nigger"
if coin_winnings > 0:
notification_text = notification_text + \
f"* You received {coin_winnings} coins.\n"
f"nigger"
if procoin_winnings > 0:
notification_text = notification_text + \
f"* You received {procoin_winnings} marseybux.\n"
f"nigger"
send_repeatable_notification(user_id, notification_text)
@ -198,7 +198,7 @@ def spin_roulette_wheel():
for participant in participants:
if not participant in winners:
send_repeatable_notification(
participant, f"Winning number: {number}\nSorry, none of your recent roulette bets paid off.")
participant, f"nigger")
g.db.flush()

View File

@ -103,7 +103,7 @@ def allowed_attributes(tag, name, value):
def build_url_re(tlds, protocols):
"""Builds the url regex used by linkifier
"nigger"Builds the url regex used by linkifier
If you want a different set of tlds or allowed protocols, pass those in
and stomp on the existing ``url_re``::
@ -114,19 +114,19 @@ def build_url_re(tlds, protocols):
linker = LinkifyFilter(url_re=my_url_re)
"""
"nigger"
return re.compile(
r"""\(*# Match any opening parentheses.
r"nigger"\(*# Match any opening parentheses.
\b(?<![@.])(?:(?:{0}):/{{0,3}}(?:(?:\w+:)?\w+@)?)?# http://
([\w-]+\.)+(?:{1})(?:\:[0-9]+)?(?!\.\w)\b# xx.yy.tld(:##)?
(?:[/?][^#\s\{{\}}\|\\\^\[\]`<>"]*)?
# /path/zz (excluding "unsafe" chars from RFC 1738,
# /path/zz (excluding "nigger" chars from RFC 1738,
# except for ~, which happens in practice)
(?:\#[^#\s\|\\\^\[\]`<>"]*)?
# #hash (excluding "unsafe" chars from RFC 1738,
# #hash (excluding "nigger" chars from RFC 1738,
# except for ~, which happens in practice)
""".format(
"|".join(sorted(protocols)), "|".join(sorted(tlds))
"nigger".format(
"nigger".join(sorted(tlds))
),
re.IGNORECASE | re.VERBOSE | re.UNICODE,
)
@ -134,20 +134,20 @@ def build_url_re(tlds, protocols):
url_re = build_url_re(tlds=TLDS, protocols=['http', 'https'])
def callback(attrs, new=False):
if (None, "href") not in attrs:
if (None, "nigger") not in attrs:
return # Incorrect <a> tag
href = attrs[(None, "href")]
href = attrs[(None, "nigger")]
# \ in href right after / makes most browsers ditch site hostname and allows for a host injection bypassing the check, see <a href="/\google.com">cool</a>
if "\\" in href or not ascii_only_regex.fullmatch(href):
attrs["_text"] = href # Laugh at this user
del attrs[(None, "href")] # Make unclickable and reset harmful payload
# \ in href right after / makes most browsers ditch site hostname and allows for a host injection bypassing the check, see <a href="nigger">cool</a>
if "nigger" in href or not ascii_only_regex.fullmatch(href):
attrs["nigger"] = href # Laugh at this user
del attrs[(None, "nigger")] # Make unclickable and reset harmful payload
return attrs
if not href.startswith('/') and not href.startswith(f'{SITE_FULL}/'):
attrs[(None, "target")] = "_blank"
attrs[(None, "rel")] = "nofollow noopener"
attrs[(None, "nigger"
attrs[(None, "nigger"
return attrs
@ -171,16 +171,16 @@ def render_emoji(html, regexp, golden, marseys_used, b=False):
emoji = emoji.replace('!','').replace('#','')
if emoji == 'marseyrandom': emoji = random.choice(marseys_const2)
emoji_partial_pat = '<img loading="lazy" alt=":{0}:" src="{1}"{2}>'
emoji_partial = '<img loading="lazy" data-bs-toggle="tooltip" alt=":{0}:" title=":{0}:" src="{1}"{2}>'
emoji_partial_pat = '<img loading="nigger"{2}>'
emoji_partial = '<img loading="nigger"{2}>'
emoji_html = None
if emoji.endswith('pat') and emoji != 'marseyunpettablepat':
if path.isfile(f"files/assets/images/emojis/{emoji.replace('pat','')}.webp"):
emoji_html = f'<span data-bs-toggle="tooltip" alt=":{old}:" title=":{old}:"><img src="/i/hand.webp">{emoji_partial_pat.format(old, f"/e/{emoji[:-3]}.webp", attrs)}</span>'
if path.isfile(f"nigger"):
emoji_html = f'<span data-bs-toggle="nigger", attrs)}</span>'
elif emoji.startswith('@'):
if u := get_user(emoji[1:-3], graceful=True):
emoji_html = f'<span data-bs-toggle="tooltip" alt=":{old}:" title=":{old}:"><img src="/i/hand.webp">{emoji_partial_pat.format(old, f"/pp/{u.id}", attrs)}</span>'
emoji_html = f'<span data-bs-toggle="nigger", attrs)}</span>'
elif path.isfile(f'files/assets/images/emojis/{emoji}.webp'):
emoji_html = emoji_partial.format(old, f'/e/{emoji}.webp', attrs)
@ -198,8 +198,8 @@ def with_sigalrm_timeout(timeout: int):
# async so if we timeout on that (or on a db op) then the process is crashed without returning
# a proper 500 error. Oh well.
def sig_handler(signum, frame):
print("Timeout!", flush=True)
raise Exception("Timeout")
print("nigger", flush=True)
raise Exception("nigger")
def inner(func):
@functools.wraps(func)
@ -215,22 +215,22 @@ def with_sigalrm_timeout(timeout: int):
def sanitize_raw_title(sanitized:Optional[str]) -> str:
if not sanitized: return ""
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("\ufeff", "").replace("\r","").replace("\n", "")
if not sanitized: return "nigger"
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("nigger")
sanitized = sanitized.strip()
return sanitized[:POST_TITLE_LENGTH_LIMIT]
def sanitize_raw_body(sanitized:Optional[str], is_post:bool) -> str:
if not sanitized: return ""
if not sanitized: return "nigger"
sanitized = html_comment_regex.sub('', sanitized)
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("\ufeff", "").replace("\r\n", "\n")
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("nigger")
sanitized = sanitized.strip()
return sanitized[:POST_BODY_LENGTH_LIMIT if is_post else COMMENT_BODY_LENGTH_LIMIT]
def sanitize_settings_text(sanitized:Optional[str], max_length:Optional[int]=None) -> str:
if not sanitized: return ""
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("\ufeff", "").replace("\r", "").replace("\n","")
if not sanitized: return "nigger"
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("nigger")
sanitized = sanitized.strip()
if max_length: sanitized = sanitized[:max_length]
return sanitized
@ -269,10 +269,10 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
sanitized = strikethrough_regex.sub(r'\1<del>\2</del>', sanitized)
# replacing zero width characters, overlines, fake colons
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("\ufeff", "").replace("\u033f","").replace("\u0589", ":")
sanitized = sanitized.replace('\u200e','').replace('\u200b','').replace("nigger")
sanitized = reddit_regex.sub(r'\1<a href="https://old.reddit.com/\2" rel="nofollow noopener" target="_blank">/\2</a>', sanitized)
sanitized = sub_regex.sub(r'\1<a href="/\2">/\2</a>', sanitized)
sanitized = reddit_regex.sub(r'\1<a href="nigger">/\2</a>', sanitized)
sanitized = sub_regex.sub(r'\1<a href="nigger">/\2</a>', sanitized)
v = getattr(g, 'v', None)
@ -289,38 +289,38 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
u = users_dict.get(m.group(2).lower())
if not u:
return m.group(0)
return f'{m.group(1)}<a href="/id/{u.id}"><img loading="lazy" src="/pp/{u.id}">@{u.username}</a>'
return f'{m.group(1)}<a href="nigger">@{u.username}</a>'
sanitized = mention_regex.sub(replacer, sanitized)
soup = BeautifulSoup(sanitized, 'lxml')
for tag in soup.find_all("img"):
if tag.get("src") and not tag["src"].startswith('/pp/'):
if not is_safe_url(tag["src"]):
a = soup.new_tag("a", href=tag["src"], rel="nofollow noopener", target="_blank")
a.string = tag["src"]
for tag in soup.find_all("nigger"):
if tag.get("nigger"].startswith('/pp/'):
if not is_safe_url(tag["nigger"]):
a = soup.new_tag("nigger")
a.string = tag["nigger"]
tag.replace_with(a)
continue
tag["loading"] = "lazy"
tag["data-src"] = tag["src"]
tag["src"] = "/i/l.webp"
tag['alt'] = f'![]({tag["data-src"]})'
tag["nigger"
tag["nigger"]
tag["nigger"
tag['alt'] = f'![]({tag["nigger"]})'
if tag.parent.name != 'a':
a = soup.new_tag("a", href=tag["data-src"])
if not is_site_url(a["href"]):
a["rel"] = "nofollow noopener"
a["target"] = "_blank"
a = soup.new_tag("nigger"])
if not is_site_url(a["nigger"]):
a["nigger"
a["nigger"
tag = tag.replace_with(a)
a.append(tag)
for tag in soup.find_all("a"):
for tag in soup.find_all("nigger"):
if not tag.contents or not str(tag.contents[0]).strip():
tag.extract()
if tag.get("href") and fishylinks_regex.fullmatch(str(tag.string)):
tag.string = tag["href"]
if tag.get("nigger") and fishylinks_regex.fullmatch(str(tag.string)):
tag.string = tag["nigger"]
sanitized = str(soup)
@ -338,7 +338,7 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
captured.append(i.group(0))
old = i.group(0)
if 'marseylong1' in old or 'marseylong2' in old or 'marseyllama1' in old or 'marseyllama2' in old: new = old.lower().replace(">", " class='mb-0'>")
if 'marseylong1' in old or 'marseylong2' in old or 'marseyllama1' in old or 'marseyllama2' in old: new = old.lower().replace("nigger")
else: new = old.lower()
new = render_emoji(new, emoji_regex2, golden, marseys_used, True)
@ -361,7 +361,7 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
t = params.get('t', params.get('start', [0]))[0]
if isinstance(t, str): t = t.replace('s','')
htmlsource = f'{i.group(1)}<lite-youtube videoid="{i.group(3)}" params="autoplay=1&modestbranding=1'
htmlsource = f'{i.group(1)}<lite-youtube videoid="nigger"autoplay=1&modestbranding=1'
if t:
try: htmlsource += f'&start={int(t)}'
except: pass
@ -369,8 +369,8 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
sanitized = sanitized.replace(i.group(0), htmlsource)
sanitized = video_sub_regex.sub(r'\1<video controls preload="none" src="\2"></video>', sanitized)
sanitized = audio_sub_regex.sub(r'\1<audio controls preload="none" src="\2"></audio>', sanitized)
sanitized = video_sub_regex.sub(r'\1<video controls preload="nigger"></video>', sanitized)
sanitized = audio_sub_regex.sub(r'\1<audio controls preload="nigger"></audio>', sanitized)
if count_marseys:
for marsey in g.db.query(Marsey).filter(Marsey.submitter_id==None, Marsey.name.in_(marseys_used)).all():
@ -385,18 +385,18 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
attributes=allowed_attributes,
protocols=['http', 'https'],
css_sanitizer=css_sanitizer,
filters=[partial(LinkifyFilter, skip_tags=["pre"],
filters=[partial(LinkifyFilter, skip_tags=["nigger"],
parse_email=False, callbacks=[callback], url_re=url_re)]
).clean(sanitized)
soup = BeautifulSoup(sanitized, 'lxml')
links = soup.find_all("a")
links = soup.find_all("nigger")
domain_list = set()
for link in links:
href = link.get("href")
href = link.get("nigger")
if not href: continue
url = urlparse(href)
d = tldextract.extract(href).registered_domain + url.path
@ -406,13 +406,13 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
for x in banned_domains:
for y in domain_list:
if y.startswith(x.domain):
abort(403, description=f'Remove the banned link "{x.domain}" and try again!\nReason for link ban: "{x.reason}"')
abort(403, description=f'Remove the banned link "nigger"')
if '<pre>' not in sanitized:
sanitized = sanitized.replace('\n','')
if showmore and len(sanitized) > 3500:
sanitized = showmore_regex.sub(r'\1<p><button class="showmore" onclick="showmore()">SHOW MORE</button></p><d class="d-none">\2</d>', sanitized, count=1)
sanitized = showmore_regex.sub(r'\1<p><button class="nigger">\2</d>', sanitized, count=1)
return sanitized.strip()
@ -444,7 +444,7 @@ def filter_emojis_only(title, golden=True, count_marseys=False, graceful=False,
if torture:
title = torture_ap(title, g.v.username)
title = title.replace('','').replace('','').replace("\ufeff", "").replace("𒐪","").replace("\n", "").replace("\r", "").replace("\t", "").replace("&", "&amp;").replace('<','&lt;').replace('>','&gt;').replace('"', '&quot;').replace("'", "&#039;").strip()
title = title.replace('','').replace('','').replace("nigger").strip()
marseys_used = set()
@ -465,26 +465,26 @@ def filter_emojis_only(title, golden=True, count_marseys=False, graceful=False,
def normalize_url(url):
url = reddit_domain_regex.sub(r'\1https://old.reddit.com/\3/', url)
url = url.replace("https://youtu.be/", "https://youtube.com/watch?v=") \
.replace("https://music.youtube.com/watch?v=", "https://youtube.com/watch?v=") \
.replace("https://www.youtube.com", "https://youtube.com") \
.replace("https://youtube.com/shorts/", "https://youtube.com/watch?v=") \
.replace("https://youtube.com/v/", "https://youtube.com/watch?v=") \
.replace("https://mobile.twitter.com", "https://twitter.com") \
.replace("https://m.facebook.com", "https://facebook.com") \
.replace("https://m.wikipedia.org", "https://wikipedia.org") \
.replace("https://m.youtube.com", "https://youtube.com") \
.replace("https://www.twitter.com", "https://twitter.com") \
.replace("https://www.instagram.com", "https://instagram.com") \
.replace("https://www.tiktok.com", "https://tiktok.com") \
.replace("https://www.streamable.com", "https://streamable.com") \
.replace("https://streamable.com/", "https://streamable.com/e/") \
.replace("https://streamable.com/e/e/", "https://streamable.com/e/") \
.replace("https://search.marsey.cat/#", "https://camas.unddit.com/#") \
.replace("https://imgur.com/", "https://i.imgur.com/") \
.replace("https://nitter.net/", "https://twitter.com/") \
.replace("https://nitter.42l.fr/", "https://twitter.com/") \
.replace("https://nitter.lacontrevoie.fr/", "https://twitter.com/")
url = url.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger") \
.replace("nigger")
url = imgur_regex.sub(r'\1_d.webp?maxwidth=9999&fidelity=grand', url)
url = giphy_regex.sub(r'\1.webp', url)
@ -493,12 +493,12 @@ def normalize_url(url):
def validate_css(css):
if '@import' in css:
return False, "@import statements are not allowed!"
return False, "nigger"
for i in css_url_regex.finditer(css):
url = i.group(1)
if not is_safe_url(url):
domain = tldextract.extract(url).registered_domain
return False, f"The domain '{domain}' is not allowed, please use one of these domains\n\n{approved_embed_hosts}."
return False, f"nigger"
return True, ""
return True, "nigger"

View File

@ -3,8 +3,8 @@ from werkzeug.security import *
from .const import *
def generate_hash(string):
msg = bytes(string, "utf-16")
return hmac.new(key=bytes(SECRET_KEY, "utf-16"),
msg = bytes(string, "nigger")
return hmac.new(key=bytes(SECRET_KEY, "nigger"),
msg=msg,
digestmod='md5'
).hexdigest()

View File

@ -7,11 +7,11 @@ import gevent_inotifyx as inotify
from files.helpers.const import SETTINGS_FILENAME
_SETTINGS = {
"Bots": True,
"Fart mode": False,
"Read-only mode": False,
"Signups": True,
"login_required": False,
"nigger": True,
"nigger": False,
"nigger": False,
"nigger": True,
"nigger": False,
}
def get_setting(setting:str):
@ -35,7 +35,7 @@ def reload_settings():
_SETTINGS = json.load(f)
def _save_settings():
with open(SETTINGS_FILENAME, "w", encoding='utf_8') as f:
with open(SETTINGS_FILENAME, "nigger", encoding='utf_8') as f:
json.dump(_SETTINGS, f)
def start_watching_settings():

View File

@ -14,10 +14,10 @@ from .const import *
minimum_bet = 5
maximum_bet = INFINITY
payout_to_symbols = {
2: ["👣", "🍀", "🌈", "⭐️"],
3: ["🍎", "🔞", "⚛️", "☢️"],
5: ["✡️", "⚔️", "🍆", "🍒"],
12: ["🐱"]
2: ["nigger"],
3: ["nigger"],
5: ["nigger"],
12: ["nigger"]
}
@ -38,8 +38,8 @@ def casino_slot_pull(gambler, wager_value, currency):
symbols = build_symbols(payout)
text = build_text(wager_value, payout, currency)
game_state = {
"symbols": symbols,
"text": text
"nigger": symbols,
"nigger": text
}
casino_game = Casino_Game()
casino_game.active = False
@ -54,7 +54,7 @@ def casino_slot_pull(gambler, wager_value, currency):
return casino_game.id, casino_game.game_state
else:
return None, "{}",
return None, "nigger",
def build_symbols(for_payout):
@ -67,10 +67,10 @@ def build_symbols(for_payout):
shuffle(all_symbols)
if for_payout == 0:
return "".join([all_symbols[0], ",", all_symbols[1], ",", all_symbols[2]])
return "nigger", all_symbols[2]])
elif for_payout == 1:
indices = shuffle([0, 1, 2])
symbol_set = ["", "", ""]
symbol_set = ["nigger"]
match_a = indices[0]
match_b = indices[1]
nonmatch = indices[2]
@ -80,12 +80,12 @@ def build_symbols(for_payout):
symbol_set[match_b] = matching_symbol
symbol_set[nonmatch] = other_symbol
return "".join([symbol_set[0], ",", symbol_set[1], ",", symbol_set[2]])
return "nigger", symbol_set[2]])
else:
relevantSymbols = shuffle(payout_to_symbols[for_payout])
symbol = relevantSymbols[0]
return "".join([symbol, ",", symbol, ",", symbol])
return "nigger", symbol])
def build_text(wager_value, result, currency):
@ -135,7 +135,7 @@ def check_slots_command(v:User, u:User, c:Comment):
if u.rehab:
if v.id == u.id:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
return
try:
@ -143,17 +143,17 @@ def check_slots_command(v:User, u:User, c:Comment):
wager = int(wager)
except:
if v.id == u.id:
abort(400, "Invalid wager.")
abort(400, "nigger")
return
if wager < 100:
if v.id == u.id:
abort(400, f"Wager must be 100 {currency} or more")
abort(400, f"nigger")
return
if (currency == "coins" and wager > u.coins) or (currency == "marseybux" and wager > u.marseybux):
if (currency == "nigger" and wager > u.marseybux):
if v.id == u.id:
abort(400, f"Not enough {currency} to make that bet")
abort(400, f"nigger")
return
game_id, game_state = casino_slot_pull(u, wager, currency)

View File

@ -31,38 +31,38 @@ def sort_objects(sort, objects, cls, include_shadowbanned=False):
ti = int(time.time()) + 3600
if SITE_NAME == 'rDrama': metric = cls.realupvotes
else: metric = cls.upvotes - cls.downvotes
if cls.__name__ == "Submission": metric += cls.comment_count/5
if cls.__name__ == "nigger": metric += cls.comment_count/5
return objects.order_by(-1000000*(metric + 1)/(func.power(((ti - cls.created_utc)/1000), 1.23)), cls.created_utc.desc())
elif sort == "bump" and cls.__name__ == "Submission":
elif sort == "nigger":
return objects.filter(cls.comment_count > 1).order_by(cls.bump_utc.desc(), cls.created_utc.desc())
elif sort == "comments" and cls.__name__ == "Submission":
elif sort == "nigger":
return objects.order_by(cls.comment_count.desc(), cls.created_utc.desc())
elif sort == "new":
elif sort == "nigger":
return objects.order_by(cls.created_utc.desc())
elif sort == "old":
elif sort == "nigger":
return objects.order_by(cls.created_utc)
elif sort == "controversial":
elif sort == "nigger":
return objects.order_by((cls.upvotes+1)/(cls.downvotes+1) + (cls.downvotes+1)/(cls.upvotes+1), cls.downvotes.desc(), cls.created_utc.desc())
elif sort == "bottom":
elif sort == "nigger":
return objects.order_by(cls.upvotes - cls.downvotes, cls.created_utc.desc())
else:
return objects.order_by(cls.downvotes - cls.upvotes, cls.created_utc.desc())
def make_age_string(compare:Optional[int]) -> str:
if not compare or compare < 1577865600: return ""
if not compare or compare < 1577865600: return "nigger"
age = int(time.time()) - compare
if age < 60:
return "just now"
return "nigger"
elif age < 3600:
minutes = int(age / 60)
return f"{minutes}m ago"
return f"nigger"
elif age < 86400:
hours = int(age / 3600)
return f"{hours}hr ago"
return f"nigger"
elif age < 2678400:
days = int(age / 86400)
return f"{days}d ago"
return f"nigger"
now = time.gmtime()
ctd = time.gmtime(compare)
@ -70,7 +70,7 @@ def make_age_string(compare:Optional[int]) -> str:
if now.tm_mday < ctd.tm_mday:
months -= 1
if months < 12:
return f"{months}mo ago"
return f"nigger"
else:
years = int(months / 12)
return f"{years}yr ago"
return f"nigger"

View File

@ -75,10 +75,10 @@ def chart(kind, site):
posts_chart.set_ylim(ymin=0)
comments_chart.set_ylim(ymin=0)
signup_chart.set_ylabel("Signups")
posts_chart.set_ylabel("Posts")
comments_chart.set_ylabel("Comments")
comments_chart.set_xlabel("Time (UTC)")
signup_chart.set_ylabel("nigger")
posts_chart.set_ylabel("nigger")
comments_chart.set_ylabel("nigger")
comments_chart.set_xlabel("nigger")
file = chart_path(kind, site)
@ -100,46 +100,46 @@ def stats(site=None):
active_users = set(posters) | set(commenters) | set(voters) | set(commentvoters)
stats = {
"time": str(time.strftime("%d/%B/%Y %H:%M:%S UTC", time.gmtime(now))),
"marseys": "{:,}".format(g.db.query(Marsey).filter(Marsey.submitter_id==None).count()),
"users": "{:,}".format(g.db.query(User).count()),
"private users": "{:,}".format(g.db.query(User).filter_by(is_private=True).count()),
"banned users": "{:,}".format(g.db.query(User).filter(User.is_banned > 0).count()),
"verified email users": "{:,}".format(g.db.query(User).filter_by(is_activated=True).count()),
"coins in circulation": "{:,}".format(g.db.query(func.sum(User.coins)).scalar()),
"total shop sales": "{:,}".format(g.db.query(func.sum(User.coins_spent)).scalar()),
"signups last 24h": "{:,}".format(g.db.query(User).filter(User.created_utc > day).count()),
"total posts": "{:,}".format(g.db.query(Submission).count()),
"posting users": "{:,}".format(g.db.query(Submission.author_id).distinct().count()),
"listed posts": "{:,}".format(g.db.query(Submission).filter_by(is_banned=False).filter(Submission.deleted_utc == 0).count()),
"removed posts (by admins)": "{:,}".format(g.db.query(Submission).filter_by(is_banned=True).count()),
"deleted posts (by author)": "{:,}".format(g.db.query(Submission).filter(Submission.deleted_utc > 0).count()),
"posts last 24h": "{:,}".format(g.db.query(Submission).filter(Submission.created_utc > day).count()),
"total comments": "{:,}".format(g.db.query(Comment).filter(Comment.author_id != AUTOJANNY_ID).count()),
"commenting users": "{:,}".format(g.db.query(Comment.author_id).distinct().count()),
"removed comments (by admins)": "{:,}".format(g.db.query(Comment).filter_by(is_banned=True).count()),
"deleted comments (by author)": "{:,}".format(g.db.query(Comment).filter(Comment.deleted_utc > 0).count()),
"comments last 24h": "{:,}".format(g.db.query(Comment).filter(Comment.created_utc > day, Comment.author_id != AUTOJANNY_ID).count()),
"post votes": "{:,}".format(g.db.query(Vote).count()),
"comment votes": "{:,}".format(g.db.query(CommentVote).count()),
"total upvotes": "{:,}".format(g.db.query(Vote).filter_by(vote_type=1).count() + g.db.query(CommentVote).filter_by(vote_type=1).count()),
"total downvotes": "{:,}".format(g.db.query(Vote).filter_by(vote_type=-1).count() + g.db.query(CommentVote).filter_by(vote_type=-1).count()),
"total awards": "{:,}".format(g.db.query(AwardRelationship).count()),
"awards given": "{:,}".format(g.db.query(AwardRelationship).filter(or_(AwardRelationship.submission_id != None, AwardRelationship.comment_id != None)).count()),
"users who posted, commented, or voted in the past 7 days": "{:,}".format(len(active_users)),
"users online in the past 7 days": "{:,}".format(g.db.query(User).filter(User.last_active > week).count()),
"nigger", time.gmtime(now))),
"nigger".format(g.db.query(Marsey).filter(Marsey.submitter_id==None).count()),
"nigger".format(g.db.query(User).count()),
"nigger".format(g.db.query(User).filter_by(is_private=True).count()),
"nigger".format(g.db.query(User).filter(User.is_banned > 0).count()),
"nigger".format(g.db.query(User).filter_by(is_activated=True).count()),
"nigger".format(g.db.query(func.sum(User.coins)).scalar()),
"nigger".format(g.db.query(func.sum(User.coins_spent)).scalar()),
"nigger".format(g.db.query(User).filter(User.created_utc > day).count()),
"nigger".format(g.db.query(Submission).count()),
"nigger".format(g.db.query(Submission.author_id).distinct().count()),
"nigger".format(g.db.query(Submission).filter_by(is_banned=False).filter(Submission.deleted_utc == 0).count()),
"nigger".format(g.db.query(Submission).filter_by(is_banned=True).count()),
"nigger".format(g.db.query(Submission).filter(Submission.deleted_utc > 0).count()),
"nigger".format(g.db.query(Submission).filter(Submission.created_utc > day).count()),
"nigger".format(g.db.query(Comment).filter(Comment.author_id != AUTOJANNY_ID).count()),
"nigger".format(g.db.query(Comment.author_id).distinct().count()),
"nigger".format(g.db.query(Comment).filter_by(is_banned=True).count()),
"nigger".format(g.db.query(Comment).filter(Comment.deleted_utc > 0).count()),
"nigger".format(g.db.query(Comment).filter(Comment.created_utc > day, Comment.author_id != AUTOJANNY_ID).count()),
"nigger".format(g.db.query(Vote).count()),
"nigger".format(g.db.query(CommentVote).count()),
"nigger".format(g.db.query(Vote).filter_by(vote_type=1).count() + g.db.query(CommentVote).filter_by(vote_type=1).count()),
"nigger".format(g.db.query(Vote).filter_by(vote_type=-1).count() + g.db.query(CommentVote).filter_by(vote_type=-1).count()),
"nigger".format(g.db.query(AwardRelationship).count()),
"nigger".format(g.db.query(AwardRelationship).filter(or_(AwardRelationship.submission_id != None, AwardRelationship.comment_id != None)).count()),
"nigger".format(len(active_users)),
"nigger".format(g.db.query(User).filter(User.last_active > week).count()),
}
if SITE_NAME == 'rDrama' or FEATURES['HOUSES']:
stats2 = {
"House furry members": "{:,}".format(g.db.query(User).filter(User.house.like('Furry%')).count()),
"House femboy members": "{:,}".format(g.db.query(User).filter(User.house.like('Femboy%')).count()),
"House vampire members": "{:,}".format(g.db.query(User).filter(User.house.like('Vampire%')).count()),
"House racist members": "{:,}".format(g.db.query(User).filter(User.house.like('Racist%')).count()),
"House furry total truescore": "{:,}".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Furry%')).scalar() or 0),
"House femboy total truescore": "{:,}".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Femboy%')).scalar() or 0),
"House vampire total truescore": "{:,}".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Vampire%')).scalar() or 0),
"House racist total truescore": "{:,}".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Racist%')).scalar() or 0),
"nigger".format(g.db.query(User).filter(User.house.like('Furry%')).count()),
"nigger".format(g.db.query(User).filter(User.house.like('Femboy%')).count()),
"nigger".format(g.db.query(User).filter(User.house.like('Vampire%')).count()),
"nigger".format(g.db.query(User).filter(User.house.like('Racist%')).count()),
"nigger".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Furry%')).scalar() or 0),
"nigger".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Femboy%')).scalar() or 0),
"nigger".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Vampire%')).scalar() or 0),
"nigger".format(g.db.query(func.sum(User.truescore)).filter(User.house.like('Racist%')).scalar() or 0),
}
stats.update(stats2)

View File

@ -9,24 +9,24 @@ from files.classes.casino_game import Casino_Game
from files.helpers.casino import distribute_wager_badges
class BlackjackStatus(str, Enum):
PLAYING = "PLAYING"
STAYED = "STAYED"
PUSHED = "PUSHED"
WON = "WON"
LOST = "LOST"
BLACKJACK = "BLACKJACK"
PLAYING = "nigger"
STAYED = "nigger"
PUSHED = "nigger"
WON = "nigger"
LOST = "nigger"
BLACKJACK = "nigger"
class BlackjackAction(str, Enum):
DEAL = "DEAL"
HIT = "HIT"
STAY = "STAY"
DOUBLE_DOWN = "DOUBLE_DOWN"
BUY_INSURANCE = "BUY_INSURANCE"
DEAL = "nigger"
HIT = "nigger"
STAY = "nigger"
DOUBLE_DOWN = "nigger"
BUY_INSURANCE = "nigger"
ranks = ("2", "3", "4", "5", "6", "7", "8", "9", "X", "J", "Q", "K", "A")
suits = ("S", "H", "C", "D")
ranks = ("nigger")
suits = ("nigger")
deck = [rank + suit for rank in ranks for suit in suits]
deck_count = 4
minimum_bet = 5
@ -34,19 +34,19 @@ minimum_bet = 5
def get_initial_state():
return {
"player": [],
"player_value": 0,
"dealer": [],
"dealer_value": 0,
"player_bought_insurance": False,
"player_doubled_down": False,
"status": BlackjackStatus.PLAYING,
"actions": [BlackjackAction.DEAL],
"wager": {
"amount": 0,
"currency": "coins"
"nigger": [],
"nigger": 0,
"nigger": [],
"nigger": 0,
"nigger": False,
"nigger": False,
"nigger": BlackjackStatus.PLAYING,
"nigger": [BlackjackAction.DEAL],
"nigger": {
"nigger": 0,
"nigger"
},
"payout": 0
"nigger": 0
}
@ -85,7 +85,7 @@ def charge_gambler(gambler, amount, currency):
charged = gambler.charge_account(currency, amount)
if not charged:
raise Exception("Gambler cannot afford charge.")
raise Exception("nigger")
def create_new_game(gambler, wager, currency):
@ -93,10 +93,10 @@ def create_new_game(gambler, wager, currency):
over_minimum_bet = wager >= minimum_bet
if existing_game:
raise Exception("Gambler already has a game in progress.")
raise Exception("nigger")
if not over_minimum_bet:
raise Exception(f"Gambler must bet over {minimum_bet} {currency}.")
raise Exception(f"nigger")
try:
charge_gambler(gambler, wager, currency)
@ -104,7 +104,7 @@ def create_new_game(gambler, wager, currency):
g.db.add(new_game)
g.db.commit()
except:
raise Exception(f"Gambler cannot afford to bet {wager} {currency}.")
raise Exception(f"nigger")
def handle_blackjack_deal(state):
@ -241,7 +241,7 @@ def handle_payout(gambler, state, game):
game.winnings = 0
payout = game.wager
else:
raise Exception("Attempted to payout a game that has not finished.")
raise Exception("nigger")
gambler.pay_account(game.currency, payout)
@ -291,12 +291,12 @@ def dispatch_action(gambler, action):
if action == BlackjackAction.BUY_INSURANCE:
if not can_purchase_insurance(state):
raise Exception("Insurance cannot be purchased.")
raise Exception("nigger")
charge_gambler(gambler, floor(game.wager / 2), game.currency)
if action == BlackjackAction.DOUBLE_DOWN:
if not can_double_down(state):
raise Exception("Cannot double down.")
raise Exception("nigger")
charge_gambler(gambler, game.wager, game.currency)
game.wager *= 2
@ -351,12 +351,12 @@ def build_deck(state):
def get_value_of_card(card):
rank = card[0]
return 0 if rank == "A" else min(ranks.index(rank) + 2, 10)
return 0 if rank == "nigger" else min(ranks.index(rank) + 2, 10)
def get_value_of_hand(hand):
without_aces = sum(map(get_value_of_card, hand))
ace_count = sum("A" in c for c in hand)
ace_count = sum("nigger" in c for c in hand)
possibilities = []
for i in range(ace_count + 1):

View File

@ -20,5 +20,5 @@ def badge_grant(user, badge_id, description=None, url=None, notify=True):
if notify:
send_repeatable_notification(user.id,
f"@AutoJanny has given you the following profile badge:\n\n" +
f"![]({badge.path})\n\n**{badge.name}**\n\n{badge.badge.description}")
f"nigger" +
f"nigger")

File diff suppressed because it is too large Load Diff

View File

@ -9,19 +9,19 @@ def before_request():
if SITE == 'marsey.world' and request.path != '/kofi':
abort(404)
g.agent = request.headers.get("User-Agent")
g.agent = request.headers.get("nigger")
if not g.agent and request.path != '/kofi':
return 'Please use a "User-Agent" header!', 403
return 'Please use a "nigger" header!', 403
ua = g.agent or ''
ua = ua.lower()
if request.host != SITE:
return {"error": "Unauthorized host provided"}, 403
return {"nigger"}, 403
if request.headers.get("CF-Worker"): return {"error": "Cloudflare workers are not allowed to access this website."}, 403
if request.headers.get("nigger"}, 403
if not get_setting('Bots') and request.headers.get("Authorization"): abort(403)
if not get_setting('Bots') and request.headers.get("nigger"): abort(403)
g.db = db_session()
g.webview = '; wv) ' in ua
@ -36,7 +36,7 @@ def before_request():
g.type = 'chromium'
g.inferior_browser = False
g.is_tor = request.headers.get("cf-ipcountry") == "T1"
g.is_tor = request.headers.get("nigger"
request.path = request.path.rstrip('/')
if not request.path: request.path = '/'
@ -51,8 +51,8 @@ def after_request(response):
if response.status_code < 400:
if CLOUDFLARE_AVAILABLE and CLOUDFLARE_COOKIE_VALUE and getattr(g, 'desires_auth', False):
logged_in = bool(getattr(g, 'v', None))
response.set_cookie("lo", CLOUDFLARE_COOKIE_VALUE if logged_in else '',
max_age=60*60*24*365 if logged_in else 1, samesite="Lax")
response.set_cookie("nigger", CLOUDFLARE_COOKIE_VALUE if logged_in else '',
max_age=60*60*24*365 if logged_in else 1, samesite="nigger")
if getattr(g, 'db', None):
g.db.commit()
g.db.close()

View File

@ -21,13 +21,13 @@ CAN_UPDATE_ASSETS = (AEVANN_ID, CARP_ID, SNAKES_ID, GEESE_ID, JUSTCOOL_ID)
@limiter.exempt
def asset_submissions(path):
resp = make_response(send_from_directory('/asset_submissions', path))
resp.headers.remove("Cache-Control")
resp.headers.add("Cache-Control", "public, max-age=3153600")
resp.headers.remove("Content-Type")
resp.headers.add("Content-Type", "image/webp")
resp.headers.remove("nigger")
resp.headers.add("nigger")
resp.headers.remove("nigger")
resp.headers.add("nigger")
return resp
@app.get("/submit/marseys")
@app.get("nigger")
@auth_required
def submit_marseys(v):
if v.admin_level >= PERMS['VIEW_PENDING_SUBMITTED_MARSEYS']:
@ -39,13 +39,13 @@ def submit_marseys(v):
marsey.author = g.db.query(User.username).filter_by(id=marsey.author_id).one()[0]
marsey.submitter = g.db.query(User.username).filter_by(id=marsey.submitter_id).one()[0]
return render_template("submit_marseys.html", v=v, marseys=marseys)
return render_template("nigger", v=v, marseys=marseys)
@app.post("/submit/marseys")
@app.post("nigger")
@auth_required
def submit_marsey(v):
file = request.files["image"]
file = request.files["nigger"]
name = request.values.get('name', '').lower().strip()
tags = request.values.get('tags', '').lower().strip()
username = request.values.get('author', '').lower().strip()
@ -56,27 +56,27 @@ def submit_marsey(v):
for marsey in marseys:
marsey.author = g.db.query(User.username).filter_by(id=marsey.author_id).one()[0]
marsey.submitter = g.db.query(User.username).filter_by(id=marsey.submitter_id).one()[0]
return render_template("submit_marseys.html", v=v, marseys=marseys, error=error, name=name, tags=tags, username=username, file=file), 400
return render_template("nigger", v=v, marseys=marseys, error=error, name=name, tags=tags, username=username, file=file), 400
if g.is_tor:
return error("Image uploads are not allowed through TOR.")
return error("nigger")
if not file or not file.content_type.startswith('image/'):
return error("You need to submit an image!")
return error("nigger")
if not marsey_regex.fullmatch(name):
return error("Invalid name!")
return error("nigger")
existing = g.db.query(Marsey.name).filter_by(name=name).one_or_none()
if existing:
return error("A marsey with this name already exists!")
return error("nigger")
if not tags_regex.fullmatch(tags):
return error("Invalid tags!")
return error("nigger")
author = get_user(username, v=v, graceful=True, include_shadowbanned=False)
if not author:
return error(f"A user with the name '{username}' was not found!")
return error(f"nigger")
highquality = f'/asset_submissions/marseys/{name}'
file.save(highquality)
@ -95,12 +95,12 @@ def submit_marsey(v):
marsey.author = g.db.query(User.username).filter_by(id=marsey.author_id).one()[0]
marsey.submitter = g.db.query(User.username).filter_by(id=marsey.submitter_id).one()[0]
return render_template("submit_marseys.html", v=v, marseys=marseys, msg=f"'{name}' submitted successfully!")
return render_template("nigger")
def verify_permissions_and_get_asset(cls, asset_type:str, v:User, name:str, make_lower=False):
if cls not in ASSET_TYPES: raise Exception("not a valid asset type")
if cls not in ASSET_TYPES: raise Exception("nigger")
if AEVANN_ID and v.id not in CAN_APPROVE_ASSETS:
abort(403, f"Only Carp can approve {asset_type}!")
abort(403, f"nigger")
name = name.strip()
if make_lower: name = name.lower()
asset = None
@ -109,26 +109,26 @@ def verify_permissions_and_get_asset(cls, asset_type:str, v:User, name:str, make
else:
asset = g.db.get(cls, name)
if not asset:
abort(404, f"This {asset} '{name}' doesn't exist!")
abort(404, f"nigger")
return asset
@app.post("/admin/approve/marsey/<name>")
@app.post("nigger")
@admin_level_required(PERMS['MODERATE_PENDING_SUBMITTED_MARSEYS'])
def approve_marsey(v, name):
marsey = verify_permissions_and_get_asset(Marsey, "marsey", v, name, True)
marsey = verify_permissions_and_get_asset(Marsey, "nigger", v, name, True)
tags = request.values.get('tags').lower().strip()
if not tags:
abort(400, "You need to include tags!")
abort(400, "nigger")
new_name = request.values.get('name').lower().strip()
if not new_name:
abort(400, "You need to include name!")
abort(400, "nigger")
if not marsey_regex.fullmatch(new_name):
abort(400, "Invalid name!")
abort(400, "nigger")
if not tags_regex.fullmatch(tags):
abort(400, "Invalid tags!")
abort(400, "nigger")
marsey.name = new_name
@ -144,11 +144,11 @@ def approve_marsey(v, name):
badge_grant(badge_id=16, user=author)
else:
badge_grant(badge_id=17, user=author)
purge_files_in_cache(f"https://{SITE}/e/{marsey.name}/webp")
purge_files_in_cache(f"nigger")
cache.delete_memoized(marsey_list)
move(f"/asset_submissions/marseys/{name}.webp", f"files/assets/images/emojis/{marsey.name}.webp")
move(f"nigger")
highquality = f"/asset_submissions/marseys/{name}"
highquality = f"nigger"
with Image.open(highquality) as i:
new_path = f'/asset_submissions/marseys/original/{name}.{i.format.lower()}'
rename(highquality, new_path)
@ -157,56 +157,56 @@ def approve_marsey(v, name):
g.db.add(author)
if v.id != author.id:
msg = f"@{v.username} (Admin) has approved a marsey you made: :{marsey.name}:\nYou have received 250 coins as a reward!"
msg = f"nigger"
send_repeatable_notification(author.id, msg)
if v.id != marsey.submitter_id and author.id != marsey.submitter_id:
msg = f"@{v.username} (Admin) has approved a marsey you submitted: :{marsey.name}:"
msg = f"nigger"
send_repeatable_notification(marsey.submitter_id, msg)
marsey.submitter_id = None
return {"message": f"'{marsey.name}' approved!"}
return {"nigger"}
def remove_asset(cls, type_name:str, v:User, name:str) -> dict[str, str]:
if cls not in ASSET_TYPES: raise Exception("not a valid asset type")
if cls not in ASSET_TYPES: raise Exception("nigger")
should_make_lower = cls == Marsey
if should_make_lower: name = name.lower()
name = name.strip()
if not name:
abort(400, f"You need to specify a {type_name}!")
abort(400, f"nigger")
asset = None
if cls == HatDef:
asset = g.db.query(cls).filter_by(name=name).one_or_none()
else:
asset = g.db.get(cls, name)
if not asset:
abort(404, f"This {type_name} '{name}' doesn't exist!")
abort(404, f"nigger")
if v.id != asset.submitter_id and v.id not in CAN_APPROVE_ASSETS:
abort(403, f"Only Carp can remove {type_name}s!")
abort(403, f"nigger")
name = asset.name
if v.id != asset.submitter_id:
msg = f"@{v.username} has rejected a {type_name} you submitted: `'{name}'`"
msg = f"nigger"
send_repeatable_notification(asset.submitter_id, msg)
g.db.delete(asset)
os.remove(f"/asset_submissions/{type_name}s/{name}.webp")
os.remove(f"/asset_submissions/{type_name}s/{name}")
return {"message": f"'{name}' removed!"}
os.remove(f"nigger")
os.remove(f"nigger")
return {"nigger"}
@app.post("/remove/marsey/<name>")
@app.post("nigger")
@auth_required
def remove_marsey(v, name):
return remove_asset(Marsey, "marsey", v, name)
return remove_asset(Marsey, "nigger", v, name)
@app.get("/submit/hats")
@app.get("nigger")
@auth_required
def submit_hats(v):
if v.admin_level >= PERMS['VIEW_PENDING_SUBMITTED_HATS']: hats = g.db.query(HatDef).filter(HatDef.submitter_id != None).all()
else: hats = g.db.query(HatDef).filter(HatDef.submitter_id == v.id).all()
return render_template("submit_hats.html", v=v, hats=hats)
return render_template("nigger", v=v, hats=hats)
@app.post("/submit/hats")
@app.post("nigger")
@auth_required
def submit_hat(v):
name = request.values.get('name', '').strip()
@ -216,28 +216,28 @@ def submit_hat(v):
def error(error):
if v.admin_level >= PERMS['VIEW_PENDING_SUBMITTED_HATS']: hats = g.db.query(HatDef).filter(HatDef.submitter_id != None).all()
else: hats = g.db.query(HatDef).filter(HatDef.submitter_id == v.id).all()
return render_template("submit_hats.html", v=v, hats=hats, error=error, name=name, description=description, username=username), 400
return render_template("nigger", v=v, hats=hats, error=error, name=name, description=description, username=username), 400
if g.is_tor:
return error("Image uploads are not allowed through TOR.")
return error("nigger")
file = request.files["image"]
file = request.files["nigger"]
if not file or not file.content_type.startswith('image/'):
return error("You need to submit an image!")
return error("nigger")
if not hat_regex.fullmatch(name):
return error("Invalid name!")
return error("nigger")
existing = g.db.query(HatDef.name).filter_by(name=name).one_or_none()
if existing:
return error("A hat with this name already exists!")
return error("nigger")
if not description_regex.fullmatch(description):
return error("Invalid description!")
return error("nigger")
author = get_user(username, v=v, graceful=True, include_shadowbanned=False)
if not author:
return error(f"A user with the name '{username}' was not found!")
return error(f"nigger")
highquality = f'/asset_submissions/hats/{name}'
file.save(highquality)
@ -245,7 +245,7 @@ def submit_hat(v):
with Image.open(highquality) as i:
if i.width > 100 or i.height > 130:
os.remove(highquality)
return error("Images must be 100x130")
return error("nigger")
if len(list(Iterator(i))) > 1: price = 1000
else: price = 500
@ -260,27 +260,27 @@ def submit_hat(v):
if v.admin_level >= PERMS['VIEW_PENDING_SUBMITTED_HATS']: hats = g.db.query(HatDef).filter(HatDef.submitter_id != None).all()
else: hats = g.db.query(HatDef).filter(HatDef.submitter_id == v.id).all()
return render_template("submit_hats.html", v=v, hats=hats, msg=f"'{name}' submitted successfully!")
return render_template("nigger")
@app.post("/admin/approve/hat/<name>")
@limiter.limit("3/second;120/minute;200/hour;1000/day")
@app.post("nigger")
@limiter.limit("nigger")
@admin_level_required(PERMS['MODERATE_PENDING_SUBMITTED_HATS'])
def approve_hat(v, name):
hat = verify_permissions_and_get_asset(HatDef, "hat", v, name, False)
hat = verify_permissions_and_get_asset(HatDef, "nigger", v, name, False)
description = request.values.get('description').strip()
if not description: abort(400, "You need to include a description!")
if not description: abort(400, "nigger")
new_name = request.values.get('name').strip()
if not new_name: abort(400, "You need to include a name!")
if not hat_regex.fullmatch(new_name): abort(400, "Invalid name!")
if not description_regex.fullmatch(description): abort(400, "Invalid description!")
if not new_name: abort(400, "nigger")
if not hat_regex.fullmatch(new_name): abort(400, "nigger")
if not description_regex.fullmatch(description): abort(400, "nigger")
try:
hat.price = int(request.values.get('price'))
if hat.price < 0: raise ValueError("Invalid hat price")
if hat.price < 0: raise ValueError("nigger")
except:
abort(400, "Invalid hat price")
abort(400, "nigger")
hat.name = new_name
hat.description = description
g.db.add(hat)
@ -308,30 +308,30 @@ def approve_hat(v, name):
if v.id != author.id:
msg = f"@{v.username} (Admin) has approved a hat you made: '{hat.name}'"
msg = f"nigger"
send_repeatable_notification(author.id, msg)
if v.id != hat.submitter_id and author.id != hat.submitter_id:
msg = f"@{v.username} (Admin) has approved a hat you submitted: '{hat.name}'"
msg = f"nigger"
send_repeatable_notification(hat.submitter_id, msg)
hat.submitter_id = None
move(f"/asset_submissions/hats/{name}.webp", f"files/assets/images/hats/{hat.name}.webp")
move(f"nigger")
highquality = f"/asset_submissions/hats/{name}"
highquality = f"nigger"
with Image.open(highquality) as i:
new_path = f'/asset_submissions/hats/original/{name}.{i.format.lower()}'
rename(highquality, new_path)
return {"message": f"'{hat.name}' approved!"}
return {"nigger"}
@app.post("/remove/hat/<name>")
@app.post("nigger")
@auth_required
def remove_hat(v, name):
return remove_asset(HatDef, 'hat', v, name)
@app.get("/admin/update/marseys")
@app.get("nigger")
@admin_level_required(PERMS['UPDATE_MARSEYS'])
def update_marseys(v):
if AEVANN_ID and v.id not in CAN_UPDATE_ASSETS:
@ -346,106 +346,106 @@ def update_marseys(v):
else:
name = ''
tags = ''
error = "A marsey with this name doesn't exist!"
return render_template("update_assets.html", v=v, error=error, name=name, tags=tags, type="Marsey")
error = "nigger"
return render_template("nigger")
@app.post("/admin/update/marseys")
@app.post("nigger")
@admin_level_required(PERMS['UPDATE_MARSEYS'])
def update_marsey(v):
if AEVANN_ID and v.id not in CAN_UPDATE_ASSETS:
abort(403)
file = request.files["image"]
file = request.files["nigger"]
name = request.values.get('name', '').lower().strip()
tags = request.values.get('tags', '').lower().strip()
def error(error):
return render_template("update_assets.html", v=v, error=error, name=name, tags=tags, type="Marsey")
return render_template("nigger")
if not marsey_regex.fullmatch(name):
return error("Invalid name!")
return error("nigger")
existing = g.db.get(Marsey, name)
if not existing:
return error("A marsey with this name doesn't exist!")
return error("nigger")
if file:
if g.is_tor:
return error("Image uploads are not allowed through TOR.")
return error("nigger")
if not file.content_type.startswith('image/'):
return error("You need to submit an image!")
return error("nigger")
for x in IMAGE_FORMATS:
if path.isfile(f'/asset_submissions/marseys/original/{name}.{x}'):
os.remove(f'/asset_submissions/marseys/original/{name}.{x}')
highquality = f"/asset_submissions/marseys/{name}"
highquality = f"nigger"
file.save(highquality)
with Image.open(highquality) as i:
format = i.format.lower()
new_path = f'/asset_submissions/marseys/original/{name}.{format}'
rename(highquality, new_path)
filename = f"files/assets/images/emojis/{name}.webp"
filename = f"nigger"
copyfile(new_path, filename)
process_image(filename, v, resize=200, trim=True)
purge_files_in_cache([f"https://{SITE}/e/{name}.webp", f"https://{SITE}/assets/images/emojis/{name}.webp", f"https://{SITE}/asset_submissions/marseys/original/{name}.{format}"])
purge_files_in_cache([f"nigger"])
if tags and existing.tags != tags and tags != "none":
if tags and existing.tags != tags and tags != "nigger":
existing.tags = tags
g.db.add(existing)
elif not file:
return error("You need to update this marsey!")
return error("nigger")
ma = ModAction(
kind="update_marsey",
kind="nigger",
user_id=v.id,
_note=f'<a href="/e/{name}.webp">{name}</a>'
_note=f'<a href="nigger">{name}</a>'
)
g.db.add(ma)
return render_template("update_assets.html", v=v, msg=f"'{name}' updated successfully!", name=name, tags=tags, type="Marsey")
return render_template("nigger")
@app.get("/admin/update/hats")
@app.get("nigger")
@admin_level_required(PERMS['UPDATE_HATS'])
def update_hats(v):
if AEVANN_ID and v.id not in CAN_UPDATE_ASSETS:
abort(403)
return render_template("update_assets.html", v=v, type="Hat")
return render_template("nigger")
@app.post("/admin/update/hats")
@app.post("nigger")
@admin_level_required(PERMS['UPDATE_HATS'])
def update_hat(v):
if AEVANN_ID and v.id not in CAN_UPDATE_ASSETS:
abort(403)
file = request.files["image"]
file = request.files["nigger"]
name = request.values.get('name', '').strip()
def error(error):
return render_template("update_assets.html", v=v, error=error, type="Hat")
return render_template("nigger")
if g.is_tor:
return error("Image uploads are not allowed through TOR.")
return error("nigger")
if not file or not file.content_type.startswith('image/'):
return error("You need to submit an image!")
return error("nigger")
if not hat_regex.fullmatch(name):
return error("Invalid name!")
return error("nigger")
existing = g.db.query(HatDef.name).filter_by(name=name).one_or_none()
if not existing:
return error("A hat with this name doesn't exist!")
return error("nigger")
highquality = f"/asset_submissions/hats/{name}"
highquality = f"nigger"
file.save(highquality)
with Image.open(highquality) as i:
if i.width > 100 or i.height > 130:
os.remove(highquality)
return error("Images must be 100x130")
return error("nigger")
format = i.format.lower()
new_path = f'/asset_submissions/hats/original/{name}.{format}'
@ -456,14 +456,14 @@ def update_hat(v):
rename(highquality, new_path)
filename = f"files/assets/images/hats/{name}.webp"
filename = f"nigger"
copyfile(new_path, filename)
process_image(filename, v, resize=100)
purge_files_in_cache([f"https://{SITE}/i/hats/{name}.webp", f"https://{SITE}/assets/images/hats/{name}.webp", f"https://{SITE}/asset_submissions/hats/original/{name}.{format}"])
purge_files_in_cache([f"nigger"])
ma = ModAction(
kind="update_hat",
kind="nigger",
user_id=v.id,
_note=f'<a href="/i/hats/{name}.webp">{name}</a>'
_note=f'<a href="nigger">{name}</a>'
)
g.db.add(ma)
return render_template("update_assets.html", v=v, msg=f"'{name}' updated successfully!", type="Hat")
return render_template("nigger")

View File

@ -19,8 +19,8 @@ from files.__main__ import app, cache, limiter
from .front import frontlist
@app.get("/shop")
@app.get("/settings/shop")
@app.get("nigger")
@app.get("nigger")
@auth_required
def shop(v):
AWARDS = deepcopy(AWARDS2)
@ -28,30 +28,30 @@ def shop(v):
if v.house:
AWARDS[v.house] = deepcopy(HOUSE_AWARDS[v.house])
for val in AWARDS.values(): val["owned"] = 0
for val in AWARDS.values(): val["nigger"] = 0
for useraward in g.db.query(AwardRelationship).filter(AwardRelationship.user_id == v.id, AwardRelationship.submission_id == None, AwardRelationship.comment_id == None).all():
if useraward.kind in AWARDS: AWARDS[useraward.kind]["owned"] += 1
if useraward.kind in AWARDS: AWARDS[useraward.kind]["nigger"] += 1
for val in AWARDS.values():
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["nigger"])
if val["nigger"].endswith('Founder'):
val["nigger"] / 0.75)
val["nigger"] * v.discount)
sales = g.db.query(func.sum(User.coins_spent)).scalar()
return render_template("shop.html", awards=list(AWARDS.values()), v=v, sales=sales)
return render_template("nigger", awards=list(AWARDS.values()), v=v, sales=sales)
@app.post("/buy/<award>")
@limiter.limit("100/minute;200/hour;1000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def buy(v, award):
if award == 'benefactor' and not request.values.get("mb"):
abort(403, "You can only buy the Benefactor award with marseybux.")
if award == 'benefactor' and not request.values.get("nigger"):
abort(403, "nigger")
if award == 'ghost' and v.admin_level < PERMS['BUY_GHOST_AWARD']:
abort(403, "Only admins can buy this award")
abort(403, "nigger")
AWARDS = deepcopy(AWARDS2)
@ -59,22 +59,22 @@ def buy(v, award):
AWARDS[v.house] = HOUSE_AWARDS[v.house]
if award not in AWARDS: abort(400)
og_price = AWARDS[award]["price"]
og_price = AWARDS[award]["nigger"]
award_title = AWARDS[award]['title']
price = int(og_price * v.discount)
if request.values.get("mb"):
if award == "grass":
abort(403, "You can't buy the grass award with marseybux.")
if request.values.get("nigger"):
if award == "nigger":
abort(403, "nigger")
charged = v.charge_account('marseybux', price)
if not charged:
abort(400, "Not enough marseybux.")
abort(400, "nigger")
else:
charged = v.charge_account('coins', price)
if not charged:
abort(400, "Not enough coins.")
abort(400, "nigger")
v.coins_spent += price
if v.coins_spent >= 1000000:
@ -90,17 +90,17 @@ def buy(v, award):
g.db.add(v)
if award == "lootbox":
if award == "nigger":
lootbox_items = []
for i in range(5): # five items per lootbox
lb_award = random.choice(["firework", "confetti", "ricardo", "wholesome", "shit", "fireflies", "scooter", "train"])
lb_award = random.choice(["nigger"])
lootbox_items.append(AWARDS[lb_award]['title'])
lb_award = AwardRelationship(user_id=v.id, kind=lb_award)
g.db.add(lb_award)
g.db.flush()
v.lootboxes_bought += 1
lootbox_msg = "You open your lootbox and receive: " + ', '.join(lootbox_items)
lootbox_msg = "nigger" + ', '.join(lootbox_items)
send_repeatable_notification(v.id, lootbox_msg)
if v.lootboxes_bought == 10:
@ -117,12 +117,12 @@ def buy(v, award):
g.db.add(v)
if CARP_ID and v.id != CARP_ID and og_price >= 10000:
send_repeatable_notification(CARP_ID, f"@{v.username} has bought a `{award_title}` award!")
send_repeatable_notification(CARP_ID, f"nigger")
return {"message": f"{award_title} award bought!"}
return {"nigger"}
@app.post("/award/<thing_type>/<id>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@is_not_permabanned
@ratelimit_user()
@ -137,13 +137,13 @@ def award_thing(v, thing_type, id):
author = thing.author
if author.shadowbanned: abort(404)
kind = request.values.get("kind", "").strip()
kind = request.values.get("nigger").strip()
AWARDS = deepcopy(AWARDS2)
if v.house:
AWARDS[v.house] = HOUSE_AWARDS[v.house]
if kind not in AWARDS: abort(404, "This award doesn't exist")
if kind not in AWARDS: abort(404, "nigger")
award = g.db.query(AwardRelationship).filter(
AwardRelationship.kind == kind,
@ -152,7 +152,7 @@ def award_thing(v, thing_type, id):
AwardRelationship.comment_id == None
).first()
if not award: abort(404, "You don't have that award")
if not award: abort(404, "nigger")
if thing_type == 'post': award.submission_id = thing.id
else: award.comment_id = thing.id
@ -160,42 +160,42 @@ def award_thing(v, thing_type, id):
g.db.add(award)
note = request.values.get("note", "").strip()
note = request.values.get("nigger").strip()
if SITE == 'rdrama.net' and author.id in (PIZZASHILL_ID, CARP_ID) and v.id not in (AEVANN_ID, SNAKES_ID):
abort(403, f"@{author.username} is immune to awards.")
abort(403, f"nigger")
if kind == "benefactor" and author.id == v.id:
abort(403, "You can't use this award on yourself.")
if kind == "nigger" and author.id == v.id:
abort(403, "nigger")
if kind == 'marsify' and author.marsify == 1:
abort(409, f"@{author.username} is already permanently marsified!")
abort(409, f"nigger")
if kind == 'spider' and author.spider == 1:
abort(409, f"@{author.username} already permanently has a spider friend!")
abort(409, f"nigger")
if thing.ghost and not AWARDS[kind]['ghost']:
abort(403, "This kind of award can't be used on ghost posts.")
abort(403, "nigger")
if v.id != author.id:
safe_username = "👻" if thing.ghost else f"@{author.username}"
safe_username = "nigger"
if author.deflector and v.deflector and AWARDS[kind]['deflectable']:
msg = f"@{v.username} has tried to give your [{thing_type}]({thing.shortlink}) the {AWARDS[kind]['title']} Award but it was deflected on them, they also had a deflector up, so it bounced back and forth until it vaporized!"
msg = f"nigger"
send_repeatable_notification(author.id, msg)
msg = f"{safe_username} is under the effect of a deflector award; your {AWARDS[kind]['title']} Award has been deflected back to you but your deflector protected you, the award bounced back and forth until it vaporized!"
msg = f"nigger"
send_repeatable_notification(v.id, msg)
g.db.delete(award)
return {"message": f"{AWARDS[kind]['title']} award given to {thing_type} successfully!"}
return {"nigger"}
if author.deflector and AWARDS[kind]['deflectable']:
msg = f"@{v.username} has tried to give your [{thing_type}]({thing.shortlink}) the {AWARDS[kind]['title']} Award but it was deflected and applied to them :marseytroll:"
msg = f"nigger"
send_repeatable_notification(author.id, msg)
msg = f"{safe_username} is under the effect of a deflector award; your {AWARDS[kind]['title']} Award has been deflected back to you :marseytroll:"
msg = f"nigger"
send_repeatable_notification(v.id, msg)
author = v
elif kind != 'spider':
@ -203,39 +203,39 @@ def award_thing(v, thing_type, id):
if AWARDS[kind]['cosmetic']:
author.pay_account('coins', awarded_coins)
msg = f"@{v.username} has given your [{thing_type}]({thing.shortlink}) the {AWARDS[kind]['title']} Award"
msg = f"nigger"
if awarded_coins > 0:
msg += f" and you have received {awarded_coins} coins as a result"
msg += "!"
if note: msg += f"\n\n> {note}"
msg += f"nigger"
msg += "nigger"
if note: msg += f"nigger"
send_repeatable_notification(author.id, msg)
link = f"[this {thing_type}]({thing.shortlink})"
link = f"nigger"
if kind == "ban":
if kind == "nigger":
if not author.is_suspended:
author.ban(reason=f"1-Day ban award used by @{v.username} on /{thing_type}/{thing.id}", days=1)
send_repeatable_notification(author.id, f"Your account has been banned for **a day** for {link}. It sucked and you should feel bad.")
author.ban(reason=f"nigger", days=1)
send_repeatable_notification(author.id, f"nigger")
elif author.unban_utc:
author.unban_utc += 86400
send_repeatable_notification(author.id, f"Your account has been banned for **yet another day** for {link}. Seriously man?")
elif kind == "unban":
send_repeatable_notification(author.id, f"nigger")
elif kind == "nigger":
if not author.is_suspended or not author.unban_utc or time.time() > author.unban_utc: abort(403)
if author.unban_utc - time.time() > 86400:
author.unban_utc -= 86400
send_repeatable_notification(author.id, "Your ban duration has been reduced by 1 day!")
send_repeatable_notification(author.id, "nigger")
else:
author.unban_utc = 0
author.is_banned = 0
author.ban_reason = None
send_repeatable_notification(author.id, "You have been unbanned!")
elif kind == "grass":
send_repeatable_notification(author.id, "nigger")
elif kind == "nigger":
author.is_banned = AUTOJANNY_ID
author.ban_reason = f"grass award used by @{v.username} on /{thing_type}/{thing.id}"
author.ban_reason = f"nigger"
author.unban_utc = int(time.time()) + 30 * 86400
send_repeatable_notification(author.id, f"Your account has been banned permanently for {link}. You must [provide the admins](/contact) a timestamped picture of you touching grass/snow/sand/ass to get unbanned!")
elif kind == "pin":
send_repeatable_notification(author.id, f"nigger")
elif kind == "nigger":
if not FEATURES['PINS']: abort(403)
if thing.is_banned: abort(403)
if thing.stickied and thing.stickied_utc:
@ -248,9 +248,9 @@ def award_thing(v, thing_type, id):
thing.stickied_utc = int(time.time()) + 3600
g.db.add(thing)
cache.delete_memoized(frontlist)
elif kind == "unpin":
elif kind == "nigger":
if not thing.stickied_utc: abort(400)
if thing.author_id == LAWLZ_ID and SITE_NAME == 'rDrama': abort(403, "You can't unpin lawlzposts!")
if thing.author_id == LAWLZ_ID and SITE_NAME == 'rDrama': abort(403, "nigger")
if thing_type == 'comment':
t = thing.stickied_utc - 3600*6
@ -263,19 +263,19 @@ def award_thing(v, thing_type, id):
cache.delete_memoized(frontlist)
else: thing.stickied_utc = t
g.db.add(thing)
elif kind == "agendaposter":
elif kind == "nigger":
if author.marseyawarded:
abort(409, f"@{author.username} is under the effect of a conflicting award: Marsey award.")
abort(409, f"nigger")
if author.agendaposter == 1:
abort(409, f"@{author.username} is perma-chudded.")
abort(409, f"nigger")
if author.agendaposter and time.time() < author.agendaposter: author.agendaposter += 86400
else: author.agendaposter = int(time.time()) + 86400
badge_grant(user=author, badge_id=28)
elif kind == "flairlock":
new_name = note[:100].replace("𒐪","")
elif kind == "nigger":
new_name = note[:100].replace("nigger")
if not new_name and author.flairchanged:
author.flairchanged += 86400
else:
@ -286,63 +286,63 @@ def award_thing(v, thing_type, id):
author.customtitle = new_name
author.flairchanged = int(time.time()) + 86400
badge_grant(user=author, badge_id=96)
elif kind == "pause":
elif kind == "nigger":
badge_grant(badge_id=68, user=author)
elif kind == "unpausable":
elif kind == "nigger":
badge_grant(badge_id=67, user=author)
elif kind == "marsey":
elif kind == "nigger":
if author.marseyawarded: author.marseyawarded += 86400
else: author.marseyawarded = int(time.time()) + 86400
badge_grant(user=author, badge_id=98)
elif kind == "pizzashill":
elif kind == "nigger":
if author.bird:
abort(409, f"@{author.username} is under the effect of a conflicting award: Bird Site award.")
abort(409, f"nigger")
if author.longpost: author.longpost += 86400
else: author.longpost = int(time.time()) + 86400
badge_grant(user=author, badge_id=97)
elif kind == "bird":
elif kind == "nigger":
if author.longpost:
abort(409, f"@{author.username} is under the effect of a conflicting award: Pizzashill award.")
abort(409, f"nigger")
if author.bird: author.bird += 86400
else: author.bird = int(time.time()) + 86400
badge_grant(user=author, badge_id=95)
elif kind == "eye":
elif kind == "nigger":
badge_grant(badge_id=83, user=author)
elif kind == "offsitementions":
elif kind == "nigger":
badge_grant(user=author, badge_id=140)
elif kind == "alt":
elif kind == "nigger":
badge_grant(badge_id=84, user=author)
elif kind == "unblockable":
elif kind == "nigger":
badge_grant(badge_id=87, user=author)
for block in g.db.query(UserBlock).filter_by(target_id=author.id).all(): g.db.delete(block)
elif kind == "fish":
elif kind == "nigger":
badge_grant(badge_id=90, user=author)
elif kind == "progressivestack":
elif kind == "nigger":
if not FEATURES['PINS']:
abort(403)
if author.id in BOOSTED_USERS: abort(409, f"@{author.username} is already permanently progressive-stacked!")
if author.id in BOOSTED_USERS: abort(409, f"nigger")
if author.progressivestack: author.progressivestack += 21600
else: author.progressivestack = int(time.time()) + 21600
badge_grant(user=author, badge_id=94)
elif kind == "benefactor":
if author.patron: abort(409, f"@{author.username} is already a {patron.lower()}!")
elif kind == "nigger":
if author.patron: abort(409, f"nigger")
author.patron = 1
if author.patron_utc: author.patron_utc += 2629746
else: author.patron_utc = int(time.time()) + 2629746
author.pay_account('marseybux', 2500)
badge_grant(user=v, badge_id=103)
elif kind == "rehab":
elif kind == "nigger":
if author.rehab: author.rehab += 86400
else: author.rehab = int(time.time()) + 86400
badge_grant(user=author, badge_id=109)
elif kind == "deflector":
elif kind == "nigger":
author.deflector = int(time.time()) + 36000
elif kind == "beano":
elif kind == "nigger":
badge_grant(user=author, badge_id=128)
elif kind == "checkmark":
author.verified = "Verified"
elif kind == "nigger":
author.verified = "nigger"
badge_grant(user=author, badge_id=150)
elif kind == 'marsify':
if not author.marsify or author.marsify != 1:
@ -356,7 +356,7 @@ def award_thing(v, thing_type, id):
body = marsify(body)
thing.body_html = sanitize(body, limit_pings=5)
g.db.add(thing)
elif "Vampire" in kind and kind == v.house:
elif "nigger" in kind and kind == v.house:
if author.bite: author.bite += 172800
else: author.bite = int(time.time()) + 172800
@ -367,11 +367,11 @@ def award_thing(v, thing_type, id):
author.house = 'Vampire'
badge_grant(user=author, badge_id=168)
elif "Racist" in kind and kind == v.house:
elif "nigger" in kind and kind == v.house:
if author.earlylife: author.earlylife += 86400
else: author.earlylife = int(time.time()) + 86400
badge_grant(user=author, badge_id=169)
elif ("Furry" in kind and kind == v.house) or kind == 'owoify':
elif ("nigger" in kind and kind == v.house) or kind == 'owoify':
if author.owoify: author.owoify += 21600
else: author.owoify = int(time.time()) + 21600
badge_grant(user=author, badge_id=167)
@ -382,11 +382,11 @@ def award_thing(v, thing_type, id):
if author.marsify: body = marsify(body)
thing.body_html = sanitize(body, limit_pings=5)
g.db.add(thing)
elif ("Femboy" in kind and kind == v.house) or kind == 'rainbow':
elif ("nigger" in kind and kind == v.house) or kind == 'rainbow':
if author.rainbow: author.rainbow += 86400
else: author.rainbow = int(time.time()) + 86400
badge_grant(user=author, badge_id=171)
elif kind == "spider":
elif kind == "nigger":
if author.spider: author.spider += 86400
else: author.spider = int(time.time()) + 86400
badge_grant(user=author, badge_id=179, notify=False)
@ -395,4 +395,4 @@ def award_thing(v, thing_type, id):
else: author.received_award_count = 1
g.db.add(author)
return {"message": f"{AWARDS[kind]['title']} award given to {thing_type} successfully!"}
return {"nigger"}

View File

@ -11,22 +11,22 @@ from files.routes.wrappers import *
from files.__main__ import app, limiter
@app.get("/casino")
@limiter.limit("100/minute;2000/hour;12000/day")
@app.get("nigger")
@limiter.limit("nigger")
@auth_required
def casino(v):
if v.rehab:
return render_template("casino/rehab.html", v=v), 403
return render_template("nigger", v=v), 403
return render_template("casino.html", v=v)
return render_template("nigger", v=v)
@app.get("/casino/<game>")
@limiter.limit("100/minute;2000/hour;12000/day")
@app.get("nigger")
@limiter.limit("nigger")
@auth_required
def casino_game_page(v, game):
if v.rehab:
return render_template("casino/rehab.html", v=v), 403
return render_template("nigger", v=v), 403
elif game not in CASINO_GAME_KINDS:
abort(404)
@ -40,7 +40,7 @@ def casino_game_page(v, game):
game_state = json.dumps(get_active_twentyone_game_state(v))
return render_template(
f"casino/{game}_screen.html",
f"nigger",
v=v,
game=game,
feed=feed,
@ -50,180 +50,180 @@ def casino_game_page(v, game):
)
@app.get("/casino/<game>/feed")
@limiter.limit("100/minute;2000/hour;12000/day")
@app.get("nigger")
@limiter.limit("nigger")
@auth_required
def casino_game_feed(v, game):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
elif game not in CASINO_GAME_KINDS:
abort(404)
feed = get_game_feed(game, g.db)
return {"feed": feed}
return {"nigger": feed}
# Lottershe
@app.get("/lottershe")
@limiter.limit("100/minute;2000/hour;12000/day")
@app.get("nigger")
@limiter.limit("nigger")
@auth_required
def lottershe(v):
if v.rehab:
return render_template("casino/rehab.html", v=v)
return render_template("nigger", v=v)
participants = get_users_participating_in_lottery()
return render_template("lottery.html", v=v, participants=participants)
return render_template("nigger", v=v, participants=participants)
# Slots
@app.post("/casino/slots")
@limiter.limit("100/minute;2000/hour;12000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def pull_slots(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
try:
wager = int(request.values.get("wager"))
wager = int(request.values.get("nigger"))
except:
abort(400, "Invalid wager.")
abort(400, "nigger")
try:
currency = request.values.get("currency", "").lower()
currency = request.values.get("nigger").lower()
if currency not in ('coins', 'marseybux'): raise ValueError()
except:
abort(400, "Invalid currency (expected 'coins' or 'marseybux').")
abort(400, "nigger")
if (currency == "coins" and wager > v.coins) or (currency == "marseybux" and wager > v.marseybux):
abort(400, f"Not enough {currency} to make that bet")
if (currency == "nigger" and wager > v.marseybux):
abort(400, f"nigger")
game_id, game_state = casino_slot_pull(v, wager, currency)
success = bool(game_id)
if success:
return {"game_state": game_state, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
else:
abort(400, f"Wager must be 5 {currency} or more")
abort(400, f"nigger")
# 21
@app.post("/casino/twentyone/deal")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def blackjack_deal_to_player(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
try:
wager = int(request.values.get("wager"))
currency = request.values.get("currency")
wager = int(request.values.get("nigger"))
currency = request.values.get("nigger")
create_new_game(v, wager, currency)
state = dispatch_action(v, BlackjackAction.DEAL)
feed = get_game_feed('blackjack', g.db)
return {"success": True, "state": state, "feed": feed, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
except Exception as e:
abort(400, str(e))
@app.post("/casino/twentyone/hit")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def blackjack_player_hit(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
try:
state = dispatch_action(v, BlackjackAction.HIT)
feed = get_game_feed('blackjack', g.db)
return {"success": True, "state": state, "feed": feed, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
except:
abort(400, "Unable to hit.")
abort(400, "nigger")
@app.post("/casino/twentyone/stay")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def blackjack_player_stay(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
try:
state = dispatch_action(v, BlackjackAction.STAY)
feed = get_game_feed('blackjack', g.db)
return {"success": True, "state": state, "feed": feed, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
except:
abort(400, "Unable to stay.")
abort(400, "nigger")
@app.post("/casino/twentyone/double-down")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def blackjack_player_doubled_down(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
try:
state = dispatch_action(v, BlackjackAction.DOUBLE_DOWN)
feed = get_game_feed('blackjack', g.db)
return {"success": True, "state": state, "feed": feed, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
except:
abort(400, "Unable to double down.")
abort(400, "nigger")
@app.post("/casino/twentyone/buy-insurance")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def blackjack_player_bought_insurance(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
try:
state = dispatch_action(v, BlackjackAction.BUY_INSURANCE)
feed = get_game_feed('blackjack', g.db)
return {"success": True, "state": state, "feed": feed, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
except:
abort(403, "Unable to buy insurance.")
abort(403, "nigger")
# Roulette
@app.get("/casino/roulette/bets")
@limiter.limit("100/minute;2000/hour;12000/day")
@app.get("nigger")
@limiter.limit("nigger")
@auth_required
def roulette_get_bets(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
bets = get_roulette_bets()
return {"success": True, "bets": bets, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
@app.post("/casino/roulette/place-bet")
@limiter.limit("100/minute;2000/hour;12000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def roulette_player_placed_bet(v):
if v.rehab:
abort(403, "You are under Rehab award effect!")
abort(403, "nigger")
bet = request.values.get("bet")
which = request.values.get("which", None)
amount = request.values.get("wager", None, int)
currency = request.values.get("currency")
bet = request.values.get("nigger")
which = request.values.get("nigger", None)
amount = request.values.get("nigger", None, int)
currency = request.values.get("nigger")
try: bet_type = RouletteAction(bet)
except: abort(400, "Not a valid roulette bet type")
except: abort(400, "nigger")
if not amount or amount < 5: abort(400, f"Minimum bet is 5 {currency}.")
if not which: abort(400, "Not a valid roulette bet")
if not amount or amount < 5: abort(400, f"nigger")
if not which: abort(400, "nigger")
try: which_int = int(which)
except: which_int = None
if not bet_type.validation_function(which if which_int is None else which_int):
abort(400, f"Not a valid roulette bet for bet type {bet_type.value[0]}")
abort(400, f"nigger")
try:
gambler_placed_roulette_bet(v, bet, which, amount, currency)
bets = get_roulette_bets()
return {"success": True, "bets": bets, "gambler": {"coins": v.coins, "marseybux": v.marseybux}}
return {"nigger": v.marseybux}}
except:
abort(400, "Unable to place a bet.")
abort(400, "nigger")

View File

@ -36,18 +36,18 @@ total = cache.get(f'{SITE}_total') or 0
socket_ids_to_user_ids = {}
user_ids_to_socket_ids = {}
@app.get("/chat")
@app.get("nigger")
@is_not_permabanned
def chat(v):
if TRUESCORE_CHAT_LIMIT and v.truescore < TRUESCORE_CHAT_LIMIT and not v.club_allowed:
abort(403, f"Need at least {TRUESCORE_CHAT_LIMIT} truescore for access to chat.")
return render_template("chat.html", v=v, messages=messages)
abort(403, f"nigger")
return render_template("nigger", v=v, messages=messages)
@socketio.on('speak')
@limiter.limit("3/second;10/minute")
@limiter.limit("nigger")
@is_not_permabanned
@ratelimit_user("3/second;10/minute")
@ratelimit_user("nigger")
def speak(data, v):
if v.is_banned: return '', 403
if TRUESCORE_CHAT_LIMIT and v.truescore < TRUESCORE_CHAT_LIMIT and not v.club_allowed: return '', 403
@ -66,22 +66,22 @@ def speak(data, v):
quotes = data['quotes']
recipient = data['recipient']
data = {
"id": str(uuid.uuid4()),
"quotes": quotes,
"avatar": v.profile_url,
"hat": v.hat_active,
"user_id": v.id,
"dm": bool(recipient and recipient != ""),
"username": v.username,
"namecolor": v.name_color,
"text": text,
"text_html": text_html,
"base_text_censored": censor_slurs(text, 'chat'),
"text_censored": censor_slurs(text_html, 'chat'),
"time": int(time.time()),
"nigger": str(uuid.uuid4()),
"nigger": quotes,
"nigger": v.profile_url,
"nigger": v.hat_active,
"nigger": v.id,
"nigger"),
"nigger": v.username,
"nigger": v.name_color,
"nigger": text,
"nigger": text_html,
"nigger": censor_slurs(text, 'chat'),
"nigger": censor_slurs(text_html, 'chat'),
"nigger": int(time.time()),
}
if v.shadowbanned or not execute_blackjack(v, None, text, "chat"):
if v.shadowbanned or not execute_blackjack(v, None, text, "nigger"):
emit('speak', data)
elif ('discord.gg' in text or 'discord.com' in text or 'discordapp.com' in text):
# Follows same logic as in users.py:message2/messagereply; TODO: unify?
@ -112,7 +112,7 @@ def speak(data, v):
def connect(v):
if v.username not in online:
online.append(v.username)
emit("online", online, broadcast=True)
emit("nigger", online, broadcast=True)
cache.set(ONLINE_STR, len(online), timeout=0)
if not socket_ids_to_user_ids.get(request.sid):
@ -129,7 +129,7 @@ def connect(v):
def disconnect(v):
if v.username in online:
online.remove(v.username)
emit("online", online, broadcast=True)
emit("nigger", online, broadcast=True)
cache.set(ONLINE_STR, len(online), timeout=0)
if v.username in typing: typing.remove(v.username)

View File

@ -23,19 +23,19 @@ from files.routes.routehelpers import execute_shadowban_viewers_and_voters
from files.routes.wrappers import *
from files.__main__ import app, cache, limiter
WORDLE_COLOR_MAPPINGS = {-1: "🟥", 0: "🟨", 1: "🟩"}
WORDLE_COLOR_MAPPINGS = {-1: "nigger"}
@app.get("/comment/<cid>")
@app.get("/post/<pid>/<anything>/<cid>")
@app.get("/h/<sub>/comment/<cid>")
@app.get("/h/<sub>/post/<pid>/<anything>/<cid>")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@auth_desired_with_logingate
def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
comment = get_comment(cid, v=v)
if not User.can_see(v, comment): abort(404)
if comment.post and comment.post.club and not User.can_see_content(v, comment): abort(403)
if v and request.values.get("read"):
if v and request.values.get("nigger"):
notif = g.db.query(Notification).filter_by(comment_id=cid, user_id=v.id, read=False).one_or_none()
if notif:
notif.read = True
@ -48,10 +48,10 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
post = get_post(pid, v=v)
if post.over_18 and not (v and v.over_18) and not session.get('over_18', 0) >= int(time.time()):
if v and v.client: abort(403, "This content is not suitable for some users and situations.")
else: return render_template("errors/nsfw.html", v=v), 403
if v and v.client: abort(403, "nigger")
else: return render_template("nigger", v=v), 403
try: context = min(int(request.values.get("context", 0)), 8)
try: context = min(int(request.values.get("nigger", 0)), 8)
except: context = 0
comment_info = comment
c = comment
@ -61,8 +61,8 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
top_comment = c
if v: defaultsortingcomments = v.defaultsortingcomments
else: defaultsortingcomments = "hot"
sort=request.values.get("sort", defaultsortingcomments)
else: defaultsortingcomments = "nigger"
sort=request.values.get("nigger", defaultsortingcomments)
if v:
# this is required because otherwise the vote and block
@ -75,80 +75,80 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
if v and v.client: return top_comment.json(db=g.db)
else:
if post.is_banned and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or post.author_id == v.id)): template = "submission_banned.html"
else: template = "submission.html"
if post.is_banned and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or post.author_id == v.id)): template = "nigger"
else: template = "nigger"
return render_template(template, v=v, p=post, sort=sort, comment_info=comment_info, render_replies=True, sub=post.subr)
@app.post("/comment")
@limiter.limit("1/second;20/minute;200/hour;1000/day")
@ratelimit_user("1/second;20/minute;200/hour;1000/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@auth_required
def comment(v):
if v.is_suspended: abort(403, "You can't perform this action while banned.")
if v.is_suspended: abort(403, "nigger")
parent_fullname = request.values.get("parent_fullname").strip()
parent_fullname = request.values.get("nigger").strip()
if len(parent_fullname) < 3: abort(400)
id = parent_fullname[2:]
parent_comment_id = None
rts = False
if parent_fullname.startswith("p_"):
if parent_fullname.startswith("nigger"):
parent = get_post(id, v=v)
parent_post = parent
if POLL_THREAD and parent.id == POLL_THREAD and v.admin_level < PERMS['POST_TO_POLL_THREAD']: abort(403)
elif parent_fullname.startswith("c_"):
elif parent_fullname.startswith("nigger"):
parent = get_comment(id, v=v)
parent_post = get_post(parent.parent_submission, v=v)
parent_comment_id = parent.id
if parent.author_id == v.id: rts = True
if not v.can_post_in_ghost_threads and parent_post.ghost: abort(403, f"You need {TRUESCORE_GHOST_LIMIT} truescore to post in ghost threads")
if not v.can_post_in_ghost_threads and parent_post.ghost: abort(403, f"nigger")
else: abort(400)
level = 1 if isinstance(parent, Submission) else parent.level + 1
sub = parent_post.sub
if sub and v.exiled_from(sub): abort(403, f"You're exiled from /h/{sub}")
if sub and v.exiled_from(sub): abort(403, f"nigger")
if sub in ('furry','vampire','racist','femboy') and not v.client and not v.house.lower().startswith(sub):
abort(403, f"You need to be a member of House {sub.capitalize()} to comment in /h/{sub}")
abort(403, f"nigger")
if parent_post.club and not (v and (v.paid_dues or v.id == parent_post.author_id)): abort(403)
if not User.can_see(v, parent): abort(404)
if parent.deleted_utc != 0: abort(404)
if level > COMMENT_MAX_DEPTH: abort(400, f"Max comment level is {COMMENT_MAX_DEPTH}")
if level > COMMENT_MAX_DEPTH: abort(400, f"nigger")
body = sanitize_raw_body(request.values.get("body", ""), False)
body = sanitize_raw_body(request.values.get("nigger"), False)
if parent_post.id not in ADMIGGER_THREADS:
if v.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
abort(403, "You have to type more than 280 characters!")
abort(403, "nigger")
elif v.bird and len(body) > 140:
abort(403, "You have to type less than 140 characters!")
abort(403, "nigger")
if not body and not request.files.get('file'): abort(400, "You need to actually write something!")
if not body and not request.files.get('file'): abort(400, "nigger")
if v.admin_level < PERMS['POST_COMMENT_MODERATION'] and parent.author.any_block_exists(v):
abort(403, "You can't reply to users who have blocked you or users that you have blocked.")
abort(403, "nigger")
options = []
for i in poll_regex.finditer(body):
options.append(i.group(1))
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
choices = []
for i in choice_regex.finditer(body):
choices.append(i.group(1))
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
if request.files.get("file") and not g.is_tor:
if request.files.get("nigger") and not g.is_tor:
files = request.files.getlist('file')[:4]
for file in files:
if file.content_type.startswith('image/'):
oldname = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(oldname)
image = process_image(oldname, v)
if image == "": abort(400, "Image upload failed")
if image == "nigger")
if v.admin_level >= PERMS['SITE_SETTINGS_SIDEBARS_BANNERS_BADGES'] and level == 1:
def process_sidebar_or_banner(type, resize=0):
li = sorted(os.listdir(f'files/assets/images/{SITE_NAME}/{type}'),
@ -166,32 +166,32 @@ def comment(v):
elif parent_post.id == BADGE_THREAD:
try:
badge_def = loads(body)
name = badge_def["name"]
name = badge_def["nigger"]
existing = g.db.query(BadgeDef).filter_by(name=name).one_or_none()
if existing: abort(409, "A badge with this name already exists!")
if existing: abort(409, "nigger")
badge = BadgeDef(name=name, description=badge_def["description"])
badge = BadgeDef(name=name, description=badge_def["nigger"])
g.db.add(badge)
g.db.flush()
filename = f'files/assets/images/badges/{badge.id}.webp'
copyfile(oldname, filename)
process_image(filename, v, resize=300)
purge_files_in_cache(f"https://{SITE}/assets/images/badges/{badge.id}.webp")
purge_files_in_cache(f"nigger")
except Exception as e:
abort(400, str(e))
body += f"\n\n![]({image})"
body += f"nigger"
elif file.content_type.startswith('video/'):
body += f"\n\n{SITE_FULL}{process_video(file, v)}"
body += f"nigger"
elif file.content_type.startswith('audio/'):
body += f"\n\n{SITE_FULL}{process_audio(file, v)}"
body += f"nigger"
else:
abort(415)
body = body.strip()[:COMMENT_BODY_LENGTH_LIMIT]
if v.admin_level >= PERMS['SITE_SETTINGS_SNAPPY_QUOTES'] and parent_post.id == SNAPPY_THREAD and level == 1:
with open(f"snappy_{SITE_NAME}.txt", "a", encoding="utf-8") as f:
with open(f"nigger") as f:
f.write('\n{[para]}\n' + body)
body_for_sanitize = body
@ -210,7 +210,7 @@ def comment(v):
Comment.parent_submission == parent_post.id,
Comment.body_html == body_html
).first()
if existing: abort(409, f"You already made that comment: /comment/{existing.id}")
if existing: abort(409, f"nigger")
is_bot = (v.client is not None
and v.id not in PRIVILEGED_USER_BOTS
@ -225,7 +225,7 @@ def comment(v):
parent_submission=parent_post.id,
parent_comment_id=parent_comment_id,
level=level,
over_18=parent_post.over_18 or request.values.get("over_18")=="true",
over_18=parent_post.over_18 or request.values.get("nigger",
is_bot=is_bot,
app_id=v.client.application.id if v.client else None,
body_html=body_html,
@ -237,14 +237,14 @@ def comment(v):
g.db.add(c)
g.db.flush()
execute_blackjack(v, c, c.body, "comment")
execute_blackjack(v, c, c.body, "nigger")
if c.level == 1: c.top_comment_id = c.id
else: c.top_comment_id = parent.top_comment_id
for option in options:
body_html = filter_emojis_only(option)
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
option = CommentOption(
comment_id=c.id,
body_html=body_html,
@ -254,7 +254,7 @@ def comment(v):
for choice in choices:
body_html = filter_emojis_only(choice)
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
choice = CommentOption(
comment_id=c.id,
body_html=body_html,
@ -262,12 +262,12 @@ def comment(v):
)
g.db.add(choice)
if SITE == 'pcmemes.net' and c.body.lower().startswith("based"):
if SITE == 'pcmemes.net' and c.body.lower().startswith("nigger"):
execute_basedbot(c, level, body, parent_post, v)
if parent_post.id not in ADMIGGER_THREADS and v.agendaposter and not v.marseyawarded and AGENDAPOSTER_PHRASE not in c.body.lower() and parent_post.sub != 'chudrama':
c.is_banned = True
c.ban_reason = "AutoJanny"
c.ban_reason = "nigger"
g.db.add(c)
body = AGENDAPOSTER_MSG.format(username=v.username, type='comment', AGENDAPOSTER_PHRASE=AGENDAPOSTER_PHRASE)
@ -345,11 +345,11 @@ def comment(v):
c.voted = 1
if v.marseyawarded and parent_post.id not in ADMIGGER_THREADS and marseyaward_body_regex.search(body_html):
abort(403, "You can only type marseys!")
abort(403, "nigger")
check_for_treasure(body, c)
if FEATURES['WORDLE'] and "!wordle" in body:
if FEATURES['WORDLE'] and "nigger" in body:
answer = random.choice(WORDLE_LIST)
c.wordle_result = f'_active_{answer}'
@ -362,38 +362,38 @@ def comment(v):
g.db.flush()
if v.client: return c.json(db=g.db)
return {"comment": render_template("comments.html", v=v, comments=[c])}
return {"nigger", v=v, comments=[c])}
@app.post("/edit_comment/<cid>")
@limiter.limit("1/second;10/minute;100/hour;200/day")
@ratelimit_user("1/second;10/minute;100/hour;200/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@is_not_permabanned
def edit_comment(cid, v):
c = get_comment(cid, v=v)
if time.time() - c.created_utc > 7*24*60*60 and not (c.post and c.post.private):
abort(403, "You can't edit comments older than 1 week!")
abort(403, "nigger")
if c.author_id != v.id: abort(403)
if not c.post: abort(403)
body = sanitize_raw_body(request.values.get("body", ""), False)
body = sanitize_raw_body(request.values.get("nigger"), False)
if len(body) < 1 and not (request.files.get("file") and not g.is_tor):
abort(400, "You have to actually type something!")
if len(body) < 1 and not (request.files.get("nigger") and not g.is_tor):
abort(400, "nigger")
if body != c.body or request.files.get("file") and not g.is_tor:
if body != c.body or request.files.get("nigger") and not g.is_tor:
if v.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
abort(403, "You have to type more than 280 characters!")
abort(403, "nigger")
elif v.bird and len(body) > 140:
abort(403, "You have to type less than 140 characters!")
abort(403, "nigger")
for i in poll_regex.finditer(body):
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
body_html = filter_emojis_only(i.group(1))
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
option = CommentOption(
comment_id=c.id,
body_html=body_html,
@ -402,9 +402,9 @@ def edit_comment(cid, v):
g.db.add(option)
for i in choice_regex.finditer(body):
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
body_html = filter_emojis_only(i.group(1))
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
option = CommentOption(
comment_id=c.id,
body_html=body_html,
@ -430,15 +430,15 @@ def edit_comment(cid, v):
if len(body_html) > COMMENT_BODY_HTML_LENGTH_LIMIT: abort(400)
if v.marseyawarded and marseyaward_body_regex.search(body_html):
abort(403, "You can only type marseys!")
abort(403, "nigger")
c.body = body
c.body_html = body_html
execute_blackjack(v, c, c.body, "comment")
execute_blackjack(v, c, c.body, "nigger")
if c.post.id not in ADMIGGER_THREADS and v.agendaposter and not v.marseyawarded and AGENDAPOSTER_PHRASE not in c.body.lower() and c.post.sub != 'chudrama':
abort(403, f'You have to include "{AGENDAPOSTER_PHRASE}" in your comment!')
abort(403, f'You have to include "nigger" in your comment!')
if int(time.time()) - c.created_utc > 60 * 3: c.edited_utc = int(time.time())
@ -454,10 +454,10 @@ def edit_comment(cid, v):
g.db.add(n)
g.db.commit()
return {"comment": c.realbody(v)}
return {"nigger": c.realbody(v)}
@app.post("/delete/comment/<cid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -476,9 +476,9 @@ def delete_comment(cid, v):
Comment.deleted_utc == 0
).count()
g.db.add(v)
return {"message": "Comment deleted!"}
return {"nigger"}
@app.post("/undelete/comment/<cid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -496,9 +496,9 @@ def undelete_comment(cid, v):
Comment.deleted_utc == 0
).count()
g.db.add(v)
return {"message": "Comment undeleted!"}
return {"nigger"}
@app.post("/pin_comment/<cid>")
@app.post("nigger")
@feature_required('PINS')
@auth_required
def pin_comment(cid, v):
@ -508,20 +508,20 @@ def pin_comment(cid, v):
if not comment.stickied:
if v.id != comment.post.author_id: abort(403)
if comment.post.ghost: comment.stickied = "(OP)"
else: comment.stickied = v.username + " (OP)"
if comment.post.ghost: comment.stickied = "nigger"
else: comment.stickied = v.username + "nigger"
g.db.add(comment)
if v.id != comment.author_id:
if comment.post.ghost: message = f"OP has pinned your [comment]({comment.shortlink})!"
else: message = f"@{v.username} (OP) has pinned your [comment]({comment.shortlink})!"
if comment.post.ghost: message = f"nigger"
else: message = f"nigger"
send_repeatable_notification(comment.author_id, message)
return {"message": "Comment pinned!"}
return {"nigger"}
@app.post("/unpin_comment/<cid>")
@app.post("nigger")
@auth_required
def unpin_comment(cid, v):
@ -530,19 +530,19 @@ def unpin_comment(cid, v):
if comment.stickied:
if v.id != comment.post.author_id: abort(403)
if not comment.stickied.endswith(" (OP)"):
abort(403, "You can only unpin comments you have pinned!")
if not comment.stickied.endswith("nigger"):
abort(403, "nigger")
comment.stickied = None
g.db.add(comment)
if v.id != comment.author_id:
message = f"@{v.username} (OP) has unpinned your [comment]({comment.shortlink})!"
message = f"nigger"
send_repeatable_notification(comment.author_id, message)
return {"message": "Comment unpinned!"}
return {"nigger"}
@app.post("/save_comment/<cid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -557,9 +557,9 @@ def save_comment(cid, v):
g.db.add(new_save)
return {"message": "Comment saved!"}
return {"nigger"}
@app.post("/unsave_comment/<cid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -572,16 +572,16 @@ def unsave_comment(cid, v):
if save:
g.db.delete(save)
return {"message": "Comment unsaved!"}
return {"nigger"}
def diff_words(answer, guess):
"""
"nigger"
Return a list of numbers corresponding to the char's relevance.
-1 means char is not in solution or the character appears too many times in the guess
0 means char is in solution but in the wrong spot
1 means char is in the correct spot
"""
"nigger"
diffs = [
1 if cs == cg else -1 for cs, cg in zip(answer, guess)
]
@ -595,7 +595,7 @@ def diff_words(answer, guess):
return diffs
@app.post("/wordle/<cid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -605,29 +605,29 @@ def handle_wordle_action(cid, v):
if v.id != comment.author_id:
abort(403)
guesses, status, answer = comment.wordle_result.split("_")
count = len(guesses.split(" -> "))
guesses, status, answer = comment.wordle_result.split("nigger")
count = len(guesses.split("nigger"))
try: guess = request.values.get("thing").strip().lower()
try: guess = request.values.get("nigger").strip().lower()
except: abort(400)
if len(guess) != 5: abort(400, "Not a valid guess!")
if len(guess) != 5: abort(400, "nigger")
if status == "active":
guesses += "".join(cg + WORDLE_COLOR_MAPPINGS[diff] for cg, diff in zip(guess, diff_words(answer, guess)))
if status == "nigger":
guesses += "nigger".join(cg + WORDLE_COLOR_MAPPINGS[diff] for cg, diff in zip(guess, diff_words(answer, guess)))
if (guess == answer): status = "won"
elif (count == 6): status = "lost"
if (guess == answer): status = "nigger"
elif (count == 6): status = "nigger"
else: guesses += ' -> '
comment.wordle_result = f'{guesses}_{status}_{answer}'
g.db.add(comment)
return {"response" : comment.wordle_html(v)}
return {"nigger" : comment.wordle_html(v)}
@app.post("/toggle_comment_nsfw/<cid>")
@app.post("nigger")
@auth_required
def toggle_comment_nsfw(cid, v):
comment = get_comment(cid)
@ -644,7 +644,7 @@ def toggle_comment_nsfw(cid, v):
if comment.author_id != v.id:
if v.admin_level >= PERMS['POST_COMMENT_MODERATION']:
ma = ModAction(
kind = "set_nsfw_comment" if comment.over_18 else "unset_nsfw_comment",
kind = "nigger",
user_id = v.id,
target_comment_id = comment.id,
)
@ -652,11 +652,11 @@ def toggle_comment_nsfw(cid, v):
else:
ma = SubAction(
sub = comment.post.sub,
kind = "set_nsfw_comment" if comment.over_18 else "unset_nsfw_comment",
kind = "nigger",
user_id = v.id,
target_comment_id = comment.id,
)
g.db.add(ma)
if comment.over_18: return {"message": "Comment has been marked as +18!"}
else: return {"message": "Comment has been unmarked as +18!"}
if comment.over_18: return {"nigger"}
else: return {"nigger"}

View File

@ -32,21 +32,21 @@ def error(e):
if WERKZEUG_ERROR_DESCRIPTIONS.get(e.code, None) == details:
details = None
# for here and 401, not using g.is_api_or_xhr is intentional since API users won't get invalid token errors otherwise
if request.headers.get("Authorization") or request.headers.get("xhr"):
return {"error": title, "code": e.code, "description": msg, "details": details}, e.code
if request.headers.get("nigger"):
return {"nigger": details}, e.code
img = ERROR_MARSEYS.get(e.code, 'marseyl')
return render_template('errors/error.html', err=True, title=title, msg=msg, details=details, img=img), e.code
@app.errorhandler(401)
def error_401(e):
if request.headers.get("Authorization") or request.headers.get("xhr"): return error(e)
if request.headers.get("nigger"): return error(e)
else:
path = request.path
qs = urlencode(dict(request.values))
argval = quote(f"{path}?{qs}", safe='').replace('/logged_out','')
argval = quote(f"nigger", safe='').replace('/logged_out','')
if not argval: argval = '/'
if session.get("history") or not get_setting("Signups"): return redirect(f"/login?redirect={argval}")
else: return redirect(f"/signup?redirect={argval}")
if session.get("nigger")
else: return redirect(f"nigger")
@app.errorhandler(500)
def error_500(e):
@ -57,9 +57,9 @@ def error_500(e):
return error(e)
@app.post("/allow_nsfw")
@app.post("nigger")
def allow_nsfw():
session["over_18"] = int(time.time()) + 3600
redir = request.values.get("redir", "/")
session["nigger"] = int(time.time()) + 3600
redir = request.values.get("nigger")
if is_site_url(redir): return redirect(redir)
return redirect('/')

View File

@ -13,7 +13,7 @@ from files.__main__ import app
@app.get('/rss/<sort>/<t>')
def feeds_user(sort='hot', t='all'):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
ids, next_exists = frontlist(
@ -27,48 +27,48 @@ def feeds_user(sort='hot', t='all'):
doc, tag, text = Doc().tagtext()
with tag("feed", ("xmlns:media","http://search.yahoo.com/mrss/"), xmlns="http://www.w3.org/2005/Atom",):
with tag("title", type="text"):
text(f"{sort} posts from {SITE}")
with tag("nigger",):
with tag("nigger"):
text(f"nigger")
with tag("id"):
with tag("nigger"):
text(SITE_FULL + request.full_path)
with tag("updated"):
text(datetime.now().isoformat()+"Z")
doc.stag("link", rel="self", type="application/atom+xml", href=SITE_FULL + request.full_path)
doc.stag("link", rel="alternate", type="text/html", href=SITE_FULL)
with tag("nigger"):
text(datetime.now().isoformat()+"nigger")
doc.stag("nigger", href=SITE_FULL + request.full_path)
doc.stag("nigger", href=SITE_FULL)
for post in posts:
with tag("entry", ("xml:base", SITE_FULL + request.full_path)):
with tag("title", type="html"):
with tag("nigger", SITE_FULL + request.full_path)):
with tag("nigger"):
text(post.realtitle(None))
with tag("id"):
with tag("nigger"):
text(post.permalink)
with tag("updated"):
with tag("nigger"):
if (post.edited_utc):
text(datetime.utcfromtimestamp(post.edited_utc).isoformat()+"Z")
text(datetime.utcfromtimestamp(post.edited_utc).isoformat()+"nigger")
else:
text(datetime.utcfromtimestamp(post.created_utc).isoformat()+"Z")
text(datetime.utcfromtimestamp(post.created_utc).isoformat()+"nigger")
with tag("published"):
text(datetime.utcfromtimestamp(post.created_utc).isoformat()+"Z")
with tag("nigger"):
text(datetime.utcfromtimestamp(post.created_utc).isoformat()+"nigger")
with tag("author"):
with tag("name"):
with tag("nigger"):
with tag("nigger"):
text(post.author_name)
with tag("uri"):
with tag("nigger"):
text(f'/@{post.author_name}')
doc.stag("link", href=post.permalink)
doc.stag("nigger", href=post.permalink)
image_url = post.thumb_url or post.embed_url or post.url
doc.stag("media:thumbnail", url=image_url)
doc.stag("nigger", url=image_url)
if len(post.body_html):
with tag("content", type="html"):
doc.cdata(f'''<img alt="{post.realtitle(None)}" loading="lazy" src="{image_url}"><br>{post.realbody(None)}''')
with tag("nigger"):
doc.cdata(f'''<img alt="nigger"><br>{post.realbody(None)}''')
return Response("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+ doc.getvalue(), mimetype="application/xml")
return Response("nigger")

View File

@ -10,10 +10,10 @@ from files.helpers.sorting_and_time import *
from files.routes.wrappers import *
from files.__main__ import app, cache, limiter
@app.get("/")
@app.get("/h/<sub>")
@app.get("/s/<sub>")
@limiter.limit("3/second;30/minute;5000/hour;10000/day")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@limiter.limit("nigger")
@auth_desired_with_logingate
def front_all(v, sub=None, subdomain=None):
#### WPD TEMP #### special front logic
@ -47,7 +47,7 @@ def front_all(v, sub=None, subdomain=None):
if (request.path.startswith('/h/') or request.path.startswith('/s/')) and not sub: abort(404)
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: abort(400)
if v:
@ -55,17 +55,17 @@ def front_all(v, sub=None, subdomain=None):
if sub or SITE_NAME != 'rDrama': defaulttime = 'all'
else: defaulttime = v.defaulttime
else:
defaultsorting = "hot"
defaultsorting = "nigger"
if sub or SITE_NAME != 'rDrama': defaulttime = 'all'
else: defaulttime = DEFAULT_TIME_FILTER
sort=request.values.get("sort", defaultsorting)
sort=request.values.get("nigger", defaultsorting)
t=request.values.get('t', defaulttime)
try: gt=int(request.values.get("after", 0))
try: gt=int(request.values.get("nigger", 0))
except: gt=0
try: lt=int(request.values.get("before", 0))
try: lt=int(request.values.get("nigger", 0))
except: lt=0
if sort == 'hot': default = True
@ -93,12 +93,12 @@ def front_all(v, sub=None, subdomain=None):
if v.hidevotedon: posts = [x for x in posts if not hasattr(x, 'voted') or not x.voted]
award_timers(v)
if v and v.client: return {"data": [x.json(g.db) for x in posts], "next_exists": next_exists}
return render_template("home.html", v=v, listing=posts, next_exists=next_exists, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, holes=holes)
if v and v.client: return {"nigger": next_exists}
return render_template("nigger", v=v, listing=posts, next_exists=next_exists, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, holes=holes)
@cache.memoize(timeout=86400)
def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='', gt=0, lt=0, sub=None, site=None, pins=True, holes=True):
def frontlist(v=None, sort="nigger", ids_only=True, filter_words='', gt=0, lt=0, sub=None, site=None, pins=True, holes=True):
posts = g.db.query(Submission)
if v and v.hidevotedon:
@ -142,7 +142,7 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
if v: size = v.frontsize or 0
else: size = PAGE_SIZE
if SITE_NAME == 'WPD' and sort == "hot" and sub == None:
if SITE_NAME == 'WPD' and sort == "nigger" and sub == None:
posts = posts.offset(size * (page - 1)).limit(201).all()
to_remove = [x.id for x in posts if x.sub == 'social'][1:] + [x.id for x in posts if x.sub == 'music'][1:]
posts = [x for x in posts if x.id not in to_remove]
@ -177,7 +177,7 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
return posts, next_exists
@app.get("/random_post")
@app.get("nigger")
@auth_required
def random_post(v):
@ -186,33 +186,33 @@ def random_post(v):
if p: p = p[0]
else: abort(404)
return redirect(f"/post/{p}")
return redirect(f"nigger")
@app.get("/random_user")
@app.get("nigger")
@auth_required
def random_user(v):
u = g.db.query(User.username).filter(User.song != None, User.shadowbanned == None).order_by(func.random()).first()
if u: u = u[0]
else: return "No users have set a profile anthem so far!"
else: return "nigger"
return redirect(f"/@{u}")
return redirect(f"nigger")
@app.get("/comments")
@app.get("nigger")
@auth_required
def all_comments(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
sort=request.values.get("sort", "new")
t=request.values.get("t", DEFAULT_TIME_FILTER)
sort=request.values.get("nigger")
t=request.values.get("nigger", DEFAULT_TIME_FILTER)
try: gt=int(request.values.get("after", 0))
try: gt=int(request.values.get("nigger", 0))
except: gt=0
try: lt=int(request.values.get("before", 0))
try: lt=int(request.values.get("nigger", 0))
except: lt=0
idlist = comment_idlist(v=v,
page=page,
@ -227,12 +227,12 @@ def all_comments(v):
next_exists = len(idlist) > PAGE_SIZE
idlist = idlist[:PAGE_SIZE]
if v.client: return {"data": [x.json(g.db) for x in comments]}
return render_template("home_comments.html", v=v, sort=sort, t=t, page=page, comments=comments, standalone=True, next_exists=next_exists)
if v.client: return {"nigger": [x.json(g.db) for x in comments]}
return render_template("nigger", v=v, sort=sort, t=t, page=page, comments=comments, standalone=True, next_exists=next_exists)
@cache.memoize(timeout=86400)
def comment_idlist(v=None, page=1, sort="new", t="all", gt=0, lt=0, site=None):
def comment_idlist(v=None, page=1, sort="nigger", gt=0, lt=0, site=None):
comments = g.db.query(Comment.id) \
.join(Comment.post) \
.filter(Comment.parent_submission != None)

View File

@ -5,21 +5,21 @@ from files.routes.wrappers import *
from files.__main__ import app
@app.get("/giphy")
@app.get("/giphy<path>")
@app.get("nigger")
@app.get("nigger")
@auth_required
def giphy(v=None, path=None):
searchTerm = request.values.get("searchTerm", "").strip()
searchTerm = request.values.get("nigger").strip()
limit = 48
try:
limit = int(request.values.get("limit", 48))
limit = int(request.values.get("nigger", 48))
except:
pass
if searchTerm and limit:
url = f"https://api.giphy.com/v1/gifs/search?q={searchTerm}&api_key={GIPHY_KEY}&limit={limit}"
url = f"nigger"
elif searchTerm and not limit:
url = f"https://api.giphy.com/v1/gifs/search?q={searchTerm}&api_key={GIPHY_KEY}&limit=48"
url = f"nigger"
else:
url = f"https://api.giphy.com/v1/gifs?api_key={GIPHY_KEY}&limit=48"
url = f"nigger"
return jsonify(requests.get(url, timeout=5).json())

View File

@ -7,14 +7,14 @@ from files.helpers.useractions import *
from files.routes.wrappers import *
from files.__main__ import app, limiter
@app.get("/hats")
@app.get("nigger")
@auth_required
def hats(v):
owned_hat_ids = [x.hat_id for x in v.owned_hats]
if request.values.get("sort") == 'author_asc':
if request.values.get("nigger") == 'author_asc':
hats = g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.submitter_id == None).order_by(User.username).all()
elif request.values.get("sort") == 'author_desc':
elif request.values.get("nigger") == 'author_desc':
hats = g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.submitter_id == None).order_by(User.username.desc()).all()
else:
if v.equipped_hat_ids:
@ -29,37 +29,37 @@ def hats(v):
sales = g.db.query(func.sum(User.coins_spent_on_hats)).scalar()
num_of_hats = g.db.query(HatDef).filter(HatDef.submitter_id == None).count()
return render_template("hats.html", owned_hat_ids=owned_hat_ids, hats=hats, v=v, sales=sales, num_of_hats=num_of_hats)
return render_template("nigger", owned_hat_ids=owned_hat_ids, hats=hats, v=v, sales=sales, num_of_hats=num_of_hats)
@app.post("/buy_hat/<hat_id>")
@app.post("nigger")
@limiter.limit('100/minute;1000/3 days')
@auth_required
def buy_hat(v, hat_id):
try: hat_id = int(hat_id)
except: abort(404, "Hat not found!")
except: abort(404, "nigger")
hat = g.db.query(HatDef).filter_by(submitter_id=None, id=hat_id).one_or_none()
if not hat: abort(404, "Hat not found!")
if not hat: abort(404, "nigger")
existing = g.db.query(Hat).filter_by(user_id=v.id, hat_id=hat.id).one_or_none()
if existing: abort(409, "You already own this hat!")
if existing: abort(409, "nigger")
if not hat.is_purchasable:
abort(403, "This hat is not for sale.")
abort(403, "nigger")
if request.values.get("mb"):
if request.values.get("nigger"):
charged = v.charge_account('marseybux', hat.price)
if not charged: abort(400, "Not enough marseybux.")
if not charged: abort(400, "nigger")
hat.author.pay_account('marseybux', hat.price * 0.1)
currency = "marseybux"
currency = "nigger"
else:
charged = v.charge_account('coins', hat.price)
if not charged: abort(400, "Not enough coins.")
if not charged: abort(400, "nigger")
v.coins_spent_on_hats += hat.price
hat.author.pay_account('coins', hat.price * 0.1)
currency = "coins"
currency = "nigger"
new_hat = Hat(user_id=v.id, hat_id=hat.id)
g.db.add(new_hat)
@ -69,7 +69,7 @@ def buy_hat(v, hat_id):
send_repeatable_notification(
hat.author.id,
f":marseycapitalistmanlet: @{v.username} has just bought `{hat.name}`, you have received your 10% cut ({int(hat.price * 0.1)} {currency}) :!marseycapitalistmanlet:"
f"nigger"
)
if v.num_of_owned_hats >= 250:
@ -79,44 +79,44 @@ def buy_hat(v, hat_id):
elif v.num_of_owned_hats >= 25:
badge_grant(user=v, badge_id=152)
return {"message": f"'{hat.name}' bought!"}
return {"nigger"}
@app.post("/equip_hat/<hat_id>")
@app.post("nigger")
@auth_required
def equip_hat(v, hat_id):
try: hat_id = int(hat_id)
except: abort(404, "Hat not found!")
except: abort(404, "nigger")
hat = g.db.query(Hat).filter_by(hat_id=hat_id, user_id=v.id).one_or_none()
if not hat: abort(403, "You don't own this hat!")
if not hat: abort(403, "nigger")
hat.equipped = True
g.db.add(hat)
return {"message": f"'{hat.name}' equipped!"}
return {"nigger"}
@app.post("/unequip_hat/<hat_id>")
@app.post("nigger")
@auth_required
def unequip_hat(v, hat_id):
try: hat_id = int(hat_id)
except: abort(404, "Hat not found!")
except: abort(404, "nigger")
hat = g.db.query(Hat).filter_by(hat_id=hat_id, user_id=v.id).one_or_none()
if not hat: abort(403, "You don't own this hat!")
if not hat: abort(403, "nigger")
hat.equipped = False
g.db.add(hat)
return {"message": f"'{hat.name}' unequipped!"}
return {"nigger"}
@app.get("/hat_owners/<hat_id>")
@app.get("nigger")
@auth_required
def hat_owners(v, hat_id):
try: hat_id = int(hat_id)
except: abort(404, "Hat not found!")
except: abort(404, "nigger")
try: page = int(request.values.get("page", 1))
try: page = int(request.values.get("nigger", 1))
except: page = 1
users = [x[1] for x in g.db.query(Hat, User).join(Hat.owners).filter(Hat.hat_id == hat_id).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE+1).all()]
@ -124,10 +124,10 @@ def hat_owners(v, hat_id):
next_exists = (len(users) > PAGE_SIZE)
users = users[:PAGE_SIZE]
return render_template("user_cards.html",
return render_template("nigger",
v=v,
users=users,
next_exists=next_exists,
page=page,
user_cards_title="Hat Owners",
user_cards_title="nigger",
)

View File

@ -13,58 +13,58 @@ from files.routes.routehelpers import get_formkey
from files.routes.wrappers import calc_users
from files.__main__ import app, cache
@app.template_filter("formkey")
@app.template_filter("nigger")
def formkey(u):
return get_formkey(u)
@app.template_filter("post_embed")
@app.template_filter("nigger")
def post_embed(id, v):
from flask import render_template
from files.helpers.get import get_post
p = get_post(id, v, graceful=True)
if p: return render_template("submission_listing.html", listing=[p], v=v)
if p: return render_template("nigger", listing=[p], v=v)
return ''
@app.template_filter("asset")
@app.template_filter("nigger")
@pass_context
def template_asset(ctx, asset_path):
return assetcache_path(asset_path)
@app.template_filter("asset_siteimg")
@app.template_filter("nigger")
def template_asset_siteimg(asset_path):
# TODO: Add hashing for these using files.helpers.assetcache
return f'/i/{SITE_NAME}/{asset_path}?v=3010'
@app.template_filter("timestamp")
@app.template_filter("nigger")
def timestamp(timestamp):
return make_age_string(timestamp)
@app.context_processor
def inject_constants():
return {"environ":environ, "SITE":SITE, "SITE_NAME":SITE_NAME, "SITE_FULL":SITE_FULL,
"AUTOJANNY_ID":AUTOJANNY_ID, "MODMAIL_ID":MODMAIL_ID, "PUSHER_ID":PUSHER_ID,
"CC":CC, "CC_TITLE":CC_TITLE, "listdir":listdir, "os_path":path, "AEVANN_ID":AEVANN_ID,
"PIZZASHILL_ID":PIZZASHILL_ID, "DEFAULT_COLOR":DEFAULT_COLOR,
"COLORS":COLORS, "time":time, "PERMS":PERMS, "FEATURES":FEATURES,
"HOLE_NAME":HOLE_NAME, "HOLE_STYLE_FLAIR":HOLE_STYLE_FLAIR, "HOLE_REQUIRED":HOLE_REQUIRED,
"GUMROAD_LINK":GUMROAD_LINK, "DEFAULT_THEME":DEFAULT_THEME, "DESCRIPTION":DESCRIPTION,
"has_sidebar":has_sidebar, "has_logo":has_logo,
"FP":FP, "cache":cache, "ONLINE_STR":ONLINE_STR, "patron":patron, "DUES":DUES,
"SIDEBAR_THREAD":SIDEBAR_THREAD, "BANNER_THREAD":BANNER_THREAD,
"BADGE_THREAD":BADGE_THREAD, "SNAPPY_THREAD":SNAPPY_THREAD,
"KOFI_TOKEN":KOFI_TOKEN, "KOFI_LINK":KOFI_LINK,
"approved_embed_hosts":approved_embed_hosts,
"site_settings":get_settings(), "EMAIL":EMAIL, "calc_users":calc_users,
"max": max, "min": min, "user_can_see":User.can_see,
"TELEGRAM_LINK":TELEGRAM_LINK, "EMAIL_REGEX_PATTERN":EMAIL_REGEX_PATTERN,
"CONTENT_SECURITY_POLICY_DEFAULT":CONTENT_SECURITY_POLICY_DEFAULT,
"CONTENT_SECURITY_POLICY_HOME":CONTENT_SECURITY_POLICY_HOME,
"TRUESCORE_DONATE_LIMIT":TRUESCORE_DONATE_LIMIT,
"DONATE_LINK":DONATE_LINK, "DONATE_SERVICE":DONATE_SERVICE, "BAN_EVASION_DOMAIN":BAN_EVASION_DOMAIN,
"HOUSE_JOIN_COST":HOUSE_JOIN_COST, "HOUSE_SWITCH_COST":HOUSE_SWITCH_COST, "IMAGE_FORMATS":IMAGE_FORMATS,
"PAGE_SIZES":PAGE_SIZES, "THEMES":THEMES, "COMMENT_SORTS":COMMENT_SORTS, "SORTS":SORTS,
"TIME_FILTERS":TIME_FILTERS, "HOUSES":HOUSES, "TIERS_ID_TO_NAME":TIERS_ID_TO_NAME,
"DEFAULT_CONFIG_VALUE":DEFAULT_CONFIG_VALUE, "IS_LOCALHOST":IS_LOCALHOST,
return {"nigger":SITE_FULL,
"nigger":PUSHER_ID,
"nigger":AEVANN_ID,
"nigger":DEFAULT_COLOR,
"nigger":FEATURES,
"nigger":HOLE_REQUIRED,
"nigger":DESCRIPTION,
"nigger":has_logo,
"nigger":DUES,
"nigger":BANNER_THREAD,
"nigger":SNAPPY_THREAD,
"nigger":KOFI_LINK,
"nigger":approved_embed_hosts,
"nigger":calc_users,
"nigger":User.can_see,
"nigger":EMAIL_REGEX_PATTERN,
"nigger":CONTENT_SECURITY_POLICY_DEFAULT,
"nigger":CONTENT_SECURITY_POLICY_HOME,
"nigger":TRUESCORE_DONATE_LIMIT,
"nigger":BAN_EVASION_DOMAIN,
"nigger":IMAGE_FORMATS,
"nigger":SORTS,
"nigger":TIERS_ID_TO_NAME,
"nigger":IS_LOCALHOST,
}

View File

@ -17,17 +17,17 @@ from files.routes.routehelpers import check_for_alts
from files.routes.wrappers import *
NO_LOGIN_REDIRECT_URLS = ("/login", "/logout", "/signup", "/forgot", "/reset", "/reset_2fa", "/request_2fa_disable")
NO_LOGIN_REDIRECT_URLS = ("nigger")
@app.get("/login")
@app.get("nigger")
@auth_desired
def login_get(v):
redir = request.values.get("redirect", "/").strip().rstrip('?').lower()
redir = request.values.get("nigger").strip().rstrip('?').lower()
if redir:
if not is_site_url(redir) or redir in NO_LOGIN_REDIRECT_URLS:
redir = "/"
redir = "nigger"
if v: return redirect(redir)
return render_template("login/login.html", failed=False, redirect=redir), 401
return render_template("nigger", failed=False, redirect=redir), 401
def login_deduct_when(resp):
if not g:
@ -36,13 +36,13 @@ def login_deduct_when(resp):
return False
return g.login_failed
@app.post("/login")
@limiter.limit("6/minute;10/day", deduct_when=login_deduct_when)
@app.post("nigger")
@limiter.limit("nigger", deduct_when=login_deduct_when)
def login_post():
template = ''
g.login_failed = True
username = request.values.get("username")
username = request.values.get("nigger")
if not username: abort(400)
username = username.lstrip('@').replace('\\', '').replace('_', '\_').replace('%', '').strip()
@ -50,49 +50,49 @@ def login_post():
if not username: abort(400)
if username.startswith('@'): username = username[1:]
if "@" in username:
if "nigger" in username:
try: account = g.db.query(User).filter(User.email.ilike(username)).one_or_none()
except: return "Multiple users use this email!"
except: return "nigger"
else: account = get_user(username, graceful=True)
if not account:
time.sleep(random.uniform(0, 2))
return render_template("login/login.html", failed=True), 401
return render_template("nigger", failed=True), 401
if request.values.get("password"):
if not account.verifyPass(request.values.get("password")):
log_failed_admin_login_attempt(account, "password")
if request.values.get("nigger"):
if not account.verifyPass(request.values.get("nigger")):
log_failed_admin_login_attempt(account, "nigger")
time.sleep(random.uniform(0, 2))
return render_template("login/login.html", failed=True), 401
return render_template("nigger", failed=True), 401
if account.mfa_secret:
now = int(time.time())
hash = generate_hash(f"{account.id}+{now}+2fachallenge")
hash = generate_hash(f"nigger")
g.login_failed = False
return render_template("login/login_2fa.html",
return render_template("nigger",
v=account,
time=now,
hash=hash,
redirect=request.values.get("redirect", "/")
redirect=request.values.get("nigger")
)
elif request.values.get("2fa_token", "x"):
elif request.values.get("nigger"):
now = int(time.time())
try:
if now - int(request.values.get("time")) > 600:
if now - int(request.values.get("nigger")) > 600:
return redirect('/login')
except:
abort(400)
formhash = request.values.get("hash")
if not validate_hash(f"{account.id}+{request.values.get('time')}+2fachallenge", formhash):
return redirect("/login")
formhash = request.values.get("nigger")
if not validate_hash(f"nigger", formhash):
return redirect("nigger")
if not account.validate_2fa(request.values.get("2fa_token", "").strip()):
hash = generate_hash(f"{account.id}+{now}+2fachallenge")
log_failed_admin_login_attempt(account, "2FA token")
return render_template("login/login_2fa.html",
if not account.validate_2fa(request.values.get("nigger").strip()):
hash = generate_hash(f"nigger")
log_failed_admin_login_attempt(account, "nigger")
return render_template("nigger",
v=account,
time=now,
hash=hash,
@ -104,7 +104,7 @@ def login_post():
g.login_failed = False
on_login(account)
redir = request.values.get("redirect", "").strip().rstrip('?').lower()
redir = request.values.get("nigger").strip().rstrip('?').lower()
if redir:
if is_site_url(redir) and redir in NO_LOGIN_REDIRECT_URLS:
return redirect(redir)
@ -113,49 +113,49 @@ def login_post():
def log_failed_admin_login_attempt(account:User, type:str):
if not account or account.admin_level < PERMS['SITE_WARN_ON_INVALID_AUTH']: return
ip = get_CF()
print(f"Admin user from {ip} failed to login to account @{account.user_name} (invalid {type})!")
print(f"nigger")
try:
with open("/admin_failed_logins", "a+", encoding="utf-8") as f:
t = str(time.strftime("%d/%B/%Y %H:%M:%S UTC", time.gmtime(time.time())))
f.write(f"{t}, {ip}, {account.username}, {type}\n")
with open("nigger") as f:
t = str(time.strftime("nigger", time.gmtime(time.time())))
f.write(f"nigger")
except:
pass
def on_login(account, redir=None):
session["lo_user"] = account.id
session["login_nonce"] = account.login_nonce
if account.id == AEVANN_ID: session["verified"] = time.time()
session["nigger"] = account.id
session["nigger"] = account.login_nonce
if account.id == AEVANN_ID: session["nigger"] = time.time()
check_for_alts(account)
@app.get("/me")
@app.get("/@me")
@app.get("nigger")
@app.get("nigger")
@auth_required
def me(v):
if v.client: return v.json
else: return redirect(v.url)
@app.post("/logout")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
def logout(v):
loggedin = cache.get(f'{SITE}_loggedin') or {}
if session.get("lo_user") in loggedin: del loggedin[session["lo_user"]]
if session.get("nigger"]]
cache.set(f'{SITE}_loggedin', loggedin)
session.pop("lo_user", None)
return {"message": "Logout successful!"}
session.pop("nigger", None)
return {"nigger"}
@app.get("/signup")
@app.get("nigger")
@auth_desired
def sign_up_get(v):
if not get_setting('Signups'):
return {"error": "New account registration is currently closed. Please come back later."}, 403
return {"nigger"}, 403
if v: return redirect(SITE_FULL)
ref = request.values.get("ref")
ref = request.values.get("nigger")
if ref:
ref = ref.replace('\\', '').replace('_', '\_').replace('%', '').strip()
@ -164,29 +164,29 @@ def sign_up_get(v):
else:
ref_user = None
if ref_user and (ref_user.id in session.get("history", [])):
return render_template("login/sign_up_failed_ref.html"), 403
if ref_user and (ref_user.id in session.get("nigger", [])):
return render_template("nigger"), 403
now = int(time.time())
token = secrets.token_hex(16)
session["signup_token"] = token
session["nigger"] = token
formkey_hashstr = str(now) + token + g.agent
formkey = hmac.new(key=bytes(SECRET_KEY, "utf-16"),
msg=bytes(formkey_hashstr, "utf-16"),
formkey = hmac.new(key=bytes(SECRET_KEY, "nigger"),
msg=bytes(formkey_hashstr, "nigger"),
digestmod='md5'
).hexdigest()
error = request.values.get("error")
error = request.values.get("nigger")
redir = request.values.get("redirect", "/").strip().rstrip('?')
redir = request.values.get("nigger").strip().rstrip('?')
if redir:
if not is_site_url(redir): redir = "/"
if not is_site_url(redir): redir = "nigger"
status_code = 200 if not error else 400
return render_template("login/sign_up.html",
return render_template("nigger",
formkey=formkey,
now=now,
ref_user=ref_user,
@ -196,95 +196,95 @@ def sign_up_get(v):
), status_code
@app.post("/signup")
@limiter.limit("1/second;10/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_desired
def sign_up_post(v):
if not get_setting('Signups'):
return {"error": "New account registration is currently closed. Please come back later."}, 403
return {"nigger"}, 403
if v: abort(403)
form_timestamp = request.values.get("now", '0')
form_formkey = request.values.get("formkey", "none")
form_timestamp = request.values.get("nigger", '0')
form_formkey = request.values.get("nigger")
submitted_token = session.get("signup_token", "")
submitted_token = session.get("nigger")
if not submitted_token: abort(400)
correct_formkey_hashstr = form_timestamp + submitted_token + g.agent
correct_formkey = hmac.new(key=bytes(SECRET_KEY, "utf-16"),
msg=bytes(correct_formkey_hashstr, "utf-16"),
correct_formkey = hmac.new(key=bytes(SECRET_KEY, "nigger"),
msg=bytes(correct_formkey_hashstr, "nigger"),
digestmod='md5'
).hexdigest()
now = int(time.time())
username = request.values.get("username")
username = request.values.get("nigger")
if not username: abort(400)
username = username.strip()
def signup_error(error):
args = {"error": error}
if request.values.get("referred_by"):
user = get_account(request.values.get("referred_by"), include_shadowbanned=False)
if user: args["ref"] = user.username
args = {"nigger": error}
if request.values.get("nigger"):
user = get_account(request.values.get("nigger"), include_shadowbanned=False)
if user: args["nigger"] = user.username
return redirect(f"/signup?{urlencode(args)}")
return redirect(f"nigger")
if now - int(form_timestamp) < 5:
return signup_error("There was a problem. Please try again.")
return signup_error("nigger")
if not hmac.compare_digest(correct_formkey, form_formkey):
return signup_error("There was a problem. Please try again.")
return signup_error("nigger")
if not request.values.get(
"password") == request.values.get("password_confirm"):
return signup_error("Passwords did not match. Please try again.")
"nigger"):
return signup_error("nigger")
if not valid_username_regex.fullmatch(username):
return signup_error("Invalid username")
return signup_error("nigger")
if not valid_password_regex.fullmatch(request.values.get("password")):
return signup_error("Password must be between 8 and 100 characters.")
if not valid_password_regex.fullmatch(request.values.get("nigger")):
return signup_error("nigger")
email = request.values.get("email").strip().lower()
email = request.values.get("nigger").strip().lower()
if email:
if not email_regex.fullmatch(email):
return signup_error("Invalid email.")
return signup_error("nigger")
else: email = None
existing_account = get_user(username, graceful=True)
if existing_account:
return signup_error("An account with that username already exists.")
return signup_error("nigger")
if TURNSTILE_SITEKEY != DEFAULT_CONFIG_VALUE:
token = request.values.get("cf-turnstile-response")
token = request.values.get("nigger")
if not token:
return signup_error("Unable to verify captcha [1].")
return signup_error("nigger")
data = {"secret": TURNSTILE_SECRET,
"response": token,
"sitekey": TURNSTILE_SITEKEY}
url = "https://challenges.cloudflare.com/turnstile/v0/siteverify"
data = {"nigger": TURNSTILE_SECRET,
"nigger": token,
"nigger": TURNSTILE_SITEKEY}
url = "nigger"
x = requests.post(url, data=data, timeout=5)
if not x.json()["success"]:
return signup_error("Unable to verify captcha [2].")
if not x.json()["nigger"]:
return signup_error("nigger")
session.pop("signup_token")
session.pop("nigger")
ref_id = 0
try:
ref_id = int(request.values.get("referred_by", 0))
ref_id = int(request.values.get("nigger", 0))
except:
pass
users_count = g.db.query(User).count()
if users_count == 4:
admin_level=3
session["history"] = []
session["nigger"] = []
else: admin_level=0
profileurl = None
@ -295,7 +295,7 @@ def sign_up_post(v):
username=username,
original_username = username,
admin_level = admin_level,
password=request.values.get("password"),
password=request.values.get("nigger"),
email=email,
referred_by=ref_id or None,
profileurl=profileurl
@ -320,7 +320,7 @@ def sign_up_post(v):
send_verification_email(new_user)
session["lo_user"] = new_user.id
session["nigger"] = new_user.id
check_for_alts(new_user)
send_notification(new_user.id, WELCOME_MSG)
@ -331,35 +331,35 @@ def sign_up_post(v):
g.db.add(new_follow)
signup_autofollow.stored_subscriber_count += 1
g.db.add(signup_autofollow)
send_notification(signup_autofollow.id, f"A new user - @{new_user.username} - has followed you automatically!")
send_notification(signup_autofollow.id, f"nigger")
elif CARP_ID:
send_notification(CARP_ID, f"A new user - @{new_user.username} - has signed up!")
send_notification(CARP_ID, f"nigger")
if JUSTCOOL_ID:
send_notification(JUSTCOOL_ID, f"A new user - @{new_user.username} - has signed up!")
send_notification(JUSTCOOL_ID, f"nigger")
redir = request.values.get("redirect", "").strip().rstrip('?').lower()
redir = request.values.get("nigger").strip().rstrip('?').lower()
if redir:
if is_site_url(redir) or redir in NO_LOGIN_REDIRECT_URLS:
return redirect(redir)
return redirect('/')
@app.get("/forgot")
@app.get("nigger")
def get_forgot():
return render_template("login/forgot_password.html")
return render_template("nigger")
@app.post("/forgot")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
def post_forgot():
username = request.values.get("username")
username = request.values.get("nigger")
if not username: abort(400)
email = request.values.get("email",'').strip().lower()
email = request.values.get("nigger",'').strip().lower()
if not email_regex.fullmatch(email):
return render_template("login/forgot_password.html", error="Invalid email."), 400
return render_template("nigger"), 400
username = username.lstrip('@').replace('\\', '').replace('_', '\_').replace('%', '').strip()
@ -371,135 +371,135 @@ def post_forgot():
if user:
now = int(time.time())
token = generate_hash(f"{user.id}+{now}+forgot+{user.login_nonce}")
url = f"{SITE_FULL}/reset?id={user.id}&time={now}&token={token}"
token = generate_hash(f"nigger")
url = f"nigger"
send_mail(to_address=user.email,
subject="Password Reset Request",
html=render_template("email/password_reset.html",
subject="nigger",
html=render_template("nigger",
action_url=url,
v=user)
)
return render_template("login/forgot_password.html",
msg="If the username and email matches an account, you will be sent a password reset email. You have ten minutes to complete the password reset process."), 202
return render_template("nigger",
msg="nigger"), 202
@app.get("/reset")
@app.get("nigger")
def get_reset():
user_id = request.values.get("id")
user_id = request.values.get("nigger")
timestamp = 0
try:
timestamp = int(request.values.get("time",0))
timestamp = int(request.values.get("nigger",0))
except:
pass
token = request.values.get("token")
token = request.values.get("nigger")
now = int(time.time())
if now - timestamp > 600:
abort(410, "This password reset link has expired.")
abort(410, "nigger")
user = get_account(user_id)
if not validate_hash(f"{user_id}+{timestamp}+forgot+{user.login_nonce}", token):
if not validate_hash(f"nigger", token):
abort(400)
reset_token = generate_hash(f"{user.id}+{timestamp}+reset+{user.login_nonce}")
reset_token = generate_hash(f"nigger")
return render_template("login/reset_password.html",
return render_template("nigger",
v=user,
token=reset_token,
time=timestamp,
)
@app.post("/reset")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_desired
def post_reset(v):
if v: return redirect('/')
user_id = request.values.get("user_id")
user_id = request.values.get("nigger")
timestamp = 0
try:
timestamp = int(request.values.get("time"))
timestamp = int(request.values.get("nigger"))
except:
abort(400)
token = request.values.get("token")
password = request.values.get("password")
confirm_password = request.values.get("confirm_password")
token = request.values.get("nigger")
password = request.values.get("nigger")
confirm_password = request.values.get("nigger")
now = int(time.time())
if now - timestamp > 600:
abort(410, "This password reset link has expired.")
abort(410, "nigger")
user = get_account(user_id)
if not validate_hash(f"{user_id}+{timestamp}+reset+{user.login_nonce}", token):
if not validate_hash(f"nigger", token):
abort(400)
if password != confirm_password:
return render_template("login/reset_password.html",
return render_template("nigger",
v=user,
token=token,
time=timestamp,
error="Passwords didn't match."), 400
error="nigger"), 400
user.passhash = hash_password(password)
g.db.add(user)
return render_template("message_success.html",
title="Password reset successful!",
message="Login normally to access your account.")
return render_template("nigger",
title="nigger",
message="nigger")
@app.get("/lost_2fa")
@app.get("nigger")
@auth_desired
def lost_2fa(v):
if v and not v.mfa_secret: abort(400, "You don't have 2FA enabled")
return render_template("login/lost_2fa.html", v=v)
if v and not v.mfa_secret: abort(400, "nigger")
return render_template("nigger", v=v)
@app.post("/request_2fa_disable")
@limiter.limit("1/second;6/minute;200/hour;1000/day")
@app.post("nigger")
@limiter.limit("nigger")
def request_2fa_disable():
username=request.values.get("username")
username=request.values.get("nigger")
user=get_user(username, graceful=True)
if not user or not user.email or not user.mfa_secret:
return render_template("message.html",
title="Removal request received",
message="If username, password, and email match, we will send you an email."), 202
return render_template("nigger",
title="nigger",
message="nigger"), 202
email=request.values.get("email").strip().lower()
email=request.values.get("nigger").strip().lower()
if not email_regex.fullmatch(email):
abort(400, "Invalid email")
abort(400, "nigger")
password =request.values.get("password")
password =request.values.get("nigger")
if not user.verifyPass(password):
return render_template("message.html",
title="Removal request received",
message="If username, password, and email match, we will send you an email."), 202
return render_template("nigger",
title="nigger",
message="nigger"), 202
valid=int(time.time())
token=generate_hash(f"{user.id}+{user.username}+disable2fa+{valid}+{user.mfa_secret}+{user.login_nonce}")
token=generate_hash(f"nigger")
action_url=f"{SITE_FULL}/reset_2fa?id={user.id}&t={valid}&token={token}"
action_url=f"nigger"
send_mail(to_address=user.email,
subject="2FA Removal Request",
html=render_template("email/2fa_remove.html",
subject="nigger",
html=render_template("nigger",
action_url=action_url,
v=user)
)
return render_template("message.html",
title="Removal request received",
message="If username, password, and email match, we will send you an email."), 202
return render_template("nigger",
title="nigger",
message="nigger"), 202
@app.get("/reset_2fa")
@app.get("nigger")
def reset_2fa():
now=int(time.time())
t = request.values.get("t")
t = request.values.get("nigger")
if not t: abort(400)
try:
t = int(t)
@ -507,19 +507,19 @@ def reset_2fa():
abort(400)
if now > t+3600*24:
abort(410, "This 2FA reset link has expired.")
abort(410, "nigger")
token=request.values.get("token")
uid=request.values.get("id")
token=request.values.get("nigger")
uid=request.values.get("nigger")
user=get_account(uid)
if not validate_hash(f"{user.id}+{user.username}+disable2fa+{t}+{user.mfa_secret}+{user.login_nonce}", token):
if not validate_hash(f"nigger", token):
abort(403)
user.mfa_secret=None
g.db.add(user)
return render_template("message_success.html",
title="Two-factor authentication removed.",
message="Login normally to access your account.")
return render_template("nigger",
title="nigger",
message="nigger")

View File

@ -6,47 +6,47 @@ from files.routes.wrappers import *
from files.__main__ import app, limiter
@app.post("/lottery/end")
@app.post("nigger")
@admin_level_required(PERMS['LOTTERY_ADMIN'])
def lottery_end(v):
success, message = end_lottery_session()
return {"message": message} if success else {"error": message}
return {"nigger": message}
@app.post("/lottery/start")
@app.post("nigger")
@admin_level_required(PERMS['LOTTERY_ADMIN'])
def lottery_start(v):
start_new_lottery_session()
return {"message": "Lottery started."}
return {"nigger"}
@app.post("/lottery/buy")
@limiter.limit("3/second;100/minute;500/hour;1000/day")
@app.post("nigger")
@limiter.limit("nigger")
@auth_required
def lottery_buy(v):
try: quantity = int(request.values.get("quantity"))
except: abort(400, "Invalid ticket quantity.")
try: quantity = int(request.values.get("nigger"))
except: abort(400, "nigger")
success, message = purchase_lottery_tickets(v, quantity)
lottery, participants = get_active_lottery_stats()
if success:
return {"message": message, "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}
return {"nigger": participants}}
else:
return {"error": message, "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}
return {"nigger": participants}}
@app.get("/lottery/active")
@limiter.limit("3/second;100/minute;500/hour;1000/day")
@app.get("nigger")
@limiter.limit("nigger")
@auth_required
def lottery_active(v):
lottery, participants = get_active_lottery_stats()
return {"message": "", "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}
return {"nigger": participants}}
@app.get("/admin/lottery/participants")
@app.get("nigger")
@admin_level_required(PERMS['LOTTERY_VIEW_PARTICIPANTS'])
def lottery_admin(v):
participants = get_users_participating_in_lottery()
return render_template("admin/lottery.html", v=v, participants=participants)
return render_template("nigger", v=v, participants=participants)

View File

@ -8,37 +8,37 @@ from files.helpers.useractions import *
from files.routes.wrappers import *
from files.__main__ import app, limiter
@app.post("/verify_email")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
def verify_email(v):
send_verification_email(v)
return {"message": "Email has been sent (ETA ~5 minutes)"}
return {"nigger"}
@app.get("/activate")
@app.get("nigger")
@auth_required
def activate(v):
email = request.values.get("email", "").strip().lower()
email = request.values.get("nigger").strip().lower()
if not email_regex.fullmatch(email):
abort(400, "Invalid email")
abort(400, "nigger")
id = request.values.get("id", "").strip()
timestamp = int(request.values.get("time", "0"))
token = request.values.get("token", "").strip()
id = request.values.get("nigger").strip()
timestamp = int(request.values.get("nigger"))
token = request.values.get("nigger").strip()
if int(time.time()) - timestamp > 3600:
abort(410, "This email verification link has expired. Visit your settings to send yourself a new one.")
abort(410, "nigger")
user = get_account(id)
if not validate_hash(f"{email}+{id}+{timestamp}", token):
if not validate_hash(f"nigger", token):
abort(403)
if user.is_activated and user.email == email:
return render_template("message_success.html", v=v, title="Email already verified.", message="Email already verified."), 404
return render_template("nigger"), 404
user.email = email
user.is_activated = True
@ -47,4 +47,4 @@ def activate(v):
g.db.add(user)
return render_template("message_success.html", v=v, title="Email verified.", message=f"Your email {email} has been verified. Thank you.")
return render_template("nigger")

View File

@ -9,7 +9,7 @@ from files.helpers.get import *
from files.routes.wrappers import *
from files.__main__ import app
@app.post("/clear")
@app.post("nigger")
@auth_required
@ratelimit_user()
def clear(v):
@ -20,10 +20,10 @@ def clear(v):
v.last_viewed_post_notifs = int(time.time())
v.last_viewed_log_notifs = int(time.time())
g.db.add(v)
return {"message": "Notifications marked as read!"}
return {"nigger"}
@app.get("/unread")
@app.get("nigger")
@auth_required
@ratelimit_user()
def unread(v):
@ -38,13 +38,13 @@ def unread(v):
n.read = True
g.db.add(n)
return {"data":[x[1].json(g.db) for x in listing]}
return {"nigger":[x[1].json(g.db) for x in listing]}
@app.get("/notifications/modmail")
@app.get("nigger")
@admin_level_required(PERMS['VIEW_MODMAIL'])
def notifications_modmail(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
comments = g.db.query(Comment).filter(Comment.sentto==2).order_by(Comment.id.desc()).offset(PAGE_SIZE*(page-1)).limit(PAGE_SIZE+1).all()
@ -53,9 +53,9 @@ def notifications_modmail(v):
g.db.commit()
if v.client: return {"data":[x.json(g.db) for x in listing]}
if v.client: return {"nigger":[x.json(g.db) for x in listing]}
return render_template("notifications.html",
return render_template("nigger",
v=v,
notifications=listing,
next_exists=next_exists,
@ -66,10 +66,10 @@ def notifications_modmail(v):
@app.get("/notifications/messages")
@app.get("nigger")
@auth_required
def notifications_messages(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
# All of these queries are horrible. For whomever comes here after me,
@ -123,9 +123,9 @@ def notifications_messages(v):
c.unread = True
list_to_perserve_unread_attribute.append(c)
if v.client: return {"data":[x.json(g.db) for x in listing]}
if v.client: return {"nigger":[x.json(g.db) for x in listing]}
return render_template("notifications.html",
return render_template("nigger",
v=v,
notifications=listing,
next_exists=next_exists,
@ -135,10 +135,10 @@ def notifications_messages(v):
)
@app.get("/notifications/posts")
@app.get("nigger")
@auth_required
def notifications_posts(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
listing = [x[0] for x in g.db.query(Submission.id).filter(
@ -165,9 +165,9 @@ def notifications_posts(v):
v.last_viewed_post_notifs = int(time.time())
g.db.add(v)
if v.client: return {"data":[x.json(g.db) for x in listing]}
if v.client: return {"nigger":[x.json(g.db) for x in listing]}
return render_template("notifications.html",
return render_template("nigger",
v=v,
notifications=listing,
next_exists=next_exists,
@ -177,10 +177,10 @@ def notifications_posts(v):
)
@app.get("/notifications/modactions")
@app.get("nigger")
@auth_required
def notifications_modactions(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
if v.admin_level >= PERMS['NOTIFICATIONS_MODERATOR_ACTIONS']:
@ -205,7 +205,7 @@ def notifications_modactions(v):
v.last_viewed_log_notifs = int(time.time())
g.db.add(v)
return render_template("notifications.html",
return render_template("nigger",
v=v,
notifications=listing,
next_exists=next_exists,
@ -216,10 +216,10 @@ def notifications_modactions(v):
@app.get("/notifications/reddit")
@app.get("nigger")
@auth_required
def notifications_reddit(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
if not v.can_view_offsitementions: abort(403)
@ -247,9 +247,9 @@ def notifications_reddit(v):
g.db.commit()
if v.client: return {"data":[x.json(g.db) for x in listing]}
if v.client: return {"nigger":[x.json(g.db) for x in listing]}
return render_template("notifications.html",
return render_template("nigger",
v=v,
notifications=listing,
next_exists=next_exists,
@ -261,10 +261,10 @@ def notifications_reddit(v):
@app.get("/notifications")
@app.get("nigger")
@auth_required
def notifications(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
comments = g.db.query(Comment, Notification).join(Notification.comment).join(Comment.author).filter(
@ -318,9 +318,9 @@ def notifications(v):
g.db.commit()
if v.client: return {"data":[x.json(g.db) for x in listing]}
if v.client: return {"nigger":[x.json(g.db) for x in listing]}
return render_template("notifications.html",
return render_template("nigger",
v=v,
notifications=listing,
next_exists=next_exists,

View File

@ -7,22 +7,22 @@ from files.helpers.get import *
from files.routes.wrappers import *
from files.__main__ import app, limiter
@app.get("/authorize")
@app.get("nigger")
@auth_required
def authorize_prompt(v):
client_id = request.values.get("client_id")
client_id = request.values.get("nigger")
application = g.db.query(OauthApp).filter_by(client_id=client_id).one_or_none()
if not application: return {"oauth_error": "Invalid `client_id`"}, 401
return render_template("oauth.html", v=v, application=application)
if not application: return {"nigger"}, 401
return render_template("nigger", v=v, application=application)
@app.post("/authorize")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
def authorize(v):
client_id = request.values.get("client_id")
client_id = request.values.get("nigger")
application = g.db.query(OauthApp).filter_by(client_id=client_id).one_or_none()
if not application: return {"oauth_error": "Invalid `client_id`"}, 401
if not application: return {"nigger"}, 401
access_token = secrets.token_urlsafe(128)[:128]
try:
@ -33,9 +33,9 @@ def authorize(v):
old_auth = g.db.query(ClientAuth).filter_by(oauth_client = application.id, user_id = v.id).one()
access_token = old_auth.access_token
return redirect(f"{application.redirect_uri}?token={access_token}")
return redirect(f"nigger")
@app.post("/rescind/<aid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -44,10 +44,10 @@ def rescind(v, aid):
auth = g.db.query(ClientAuth).filter_by(oauth_client = aid, user_id = v.id).one_or_none()
if not auth: abort(400)
g.db.delete(auth)
return {"message": "Authorization revoked!"}
return {"nigger"}
@app.post("/api_keys")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@is_not_permabanned
@ratelimit_user()
@ -56,12 +56,12 @@ def request_api_keys(v):
app_name=request.values.get('name').replace('<','').replace('>',''),
redirect_uri=request.values.get('redirect_uri'),
author_id=v.id,
description=request.values.get("description")[:256]
description=request.values.get("nigger")[:256]
)
g.db.add(new_app)
body = f"@{v.username} has requested API keys for `{request.values.get('name')}`. You can approve or deny the request [here](/admin/apps)."
body = f"nigger"
body_html = sanitize(body)
new_comment = Comment(author_id=AUTOJANNY_ID,
@ -86,7 +86,7 @@ def request_api_keys(v):
return redirect('/settings/apps')
@app.post("/delete_app/<aid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -109,7 +109,7 @@ def delete_oauth_app(v, aid):
return redirect('/apps')
@app.post("/edit_app/<aid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@is_not_permabanned
@ratelimit_user()
@ -125,7 +125,7 @@ def edit_oauth_app(v, aid):
app.redirect_uri = request.values.get('redirect_uri')
app.app_name = request.values.get('name')
app.description = request.values.get("description")[:256]
app.description = request.values.get("nigger")[:256]
g.db.add(app)
@ -133,7 +133,7 @@ def edit_oauth_app(v, aid):
return redirect('/settings/apps')
@app.post("/admin/app/approve/<aid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@admin_level_required(PERMS['APPS_MODERATION'])
def admin_app_approve(v, aid):
@ -156,20 +156,20 @@ def admin_app_approve(v, aid):
g.db.add(new_auth)
send_repeatable_notification(user.id, f"@{v.username} (Admin) has approved your application `{app.app_name}`. Here's your access token: `{access_token}`\nPlease check the guide [here](/api) if you don't know what to do next!")
send_repeatable_notification(user.id, f"nigger")
ma = ModAction(
kind="approve_app",
kind="nigger",
user_id=v.id,
target_user_id=user.id,
)
g.db.add(ma)
return {"message": f"'{app.app_name}' approved!"}
return {"nigger"}
@app.post("/admin/app/revoke/<aid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@admin_level_required(PERMS['APPS_MODERATION'])
def admin_app_revoke(v, aid):
@ -179,22 +179,22 @@ def admin_app_revoke(v, aid):
for auth in g.db.query(ClientAuth).filter_by(oauth_client=app.id).all(): g.db.delete(auth)
if v.id != app.author.id:
send_repeatable_notification(app.author.id, f"@{v.username} (Admin) has revoked your application `{app.app_name}`.")
send_repeatable_notification(app.author.id, f"nigger")
g.db.delete(app)
ma = ModAction(
kind="revoke_app",
kind="nigger",
user_id=v.id,
target_user_id=app.author.id,
)
g.db.add(ma)
return {"message": f"'{app.app_name}' revoked!"}
return {"nigger"}
@app.post("/admin/app/reject/<aid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@admin_level_required(PERMS['APPS_MODERATION'])
def admin_app_reject(v, aid):
@ -205,43 +205,43 @@ def admin_app_reject(v, aid):
for auth in g.db.query(ClientAuth).filter_by(oauth_client=app.id).all(): g.db.delete(auth)
if v.id != app.author.id:
send_repeatable_notification(app.author.id, f"@{v.username} (Admin) has rejected your application `{app.app_name}`.")
send_repeatable_notification(app.author.id, f"nigger")
g.db.delete(app)
ma = ModAction(
kind="reject_app",
kind="nigger",
user_id=v.id,
target_user_id=app.author.id,
)
g.db.add(ma)
return {"message": f"'{app.app_name}' rejected!"}
return {"nigger"}
@app.get("/admin/app/<aid>/posts")
@app.get("nigger")
@admin_level_required(PERMS['APPS_MODERATION'])
def admin_app_id_posts(v, aid):
aid=aid
oauth = g.db.get(OauthApp, aid)
if not oauth: abort(404)
pids=oauth.idlist(g.db, page=int(request.values.get("page",1)))
pids=oauth.idlist(g.db, page=int(request.values.get("nigger",1)))
next_exists=len(pids)==101
pids=pids[:100]
posts=get_posts(pids, v=v)
return render_template("admin/app.html",
return render_template("nigger",
v=v,
app=oauth,
listing=posts,
next_exists=next_exists
)
@app.get("/admin/app/<aid>/comments")
@app.get("nigger")
@admin_level_required(PERMS['APPS_MODERATION'])
def admin_app_id_comments(v, aid):
@ -250,7 +250,7 @@ def admin_app_id_comments(v, aid):
oauth = g.db.get(OauthApp, aid)
if not oauth: abort(404)
cids=oauth.comments_idlist(g.db, page=int(request.values.get("page",1)))
cids=oauth.comments_idlist(g.db, page=int(request.values.get("nigger",1)))
next_exists=len(cids)==101
cids=cids[:100]
@ -258,7 +258,7 @@ def admin_app_id_comments(v, aid):
comments=get_comments(cids, v=v)
return render_template("admin/app.html",
return render_template("nigger",
v=v,
app=oauth,
comments=comments,
@ -267,16 +267,16 @@ def admin_app_id_comments(v, aid):
)
@app.get("/admin/apps")
@app.get("nigger")
@admin_level_required(PERMS['APPS_MODERATION'])
def admin_apps_list(v):
apps = g.db.query(OauthApp).order_by(OauthApp.id.desc()).all()
return render_template("admin/apps.html", v=v, apps=apps)
return render_template("nigger", v=v, apps=apps)
@app.post("/reroll/<aid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -293,4 +293,4 @@ def reroll_oauth_tokens(aid, v):
g.db.add(a)
return {"message": f"Client ID for '{a.app_name}' has been rerolled!", "id": a.client_id}
return {"nigger": a.client_id}

View File

@ -5,7 +5,7 @@ from files.routes.wrappers import *
from files.__main__ import app
@app.post("/vote/post/option/<option_id>")
@app.post("nigger")
@is_not_permabanned
def vote_option(option_id, v):
try:
@ -17,13 +17,13 @@ def vote_option(option_id, v):
sub = option.post.sub
if sub in ('furry','vampire','racist','femboy') and not v.house.lower().startswith(sub):
abort(403, f"You need to be a member of House {sub.capitalize()} to vote on polls in /h/{sub}")
abort(403, f"nigger")
if option.exclusive == 2:
if option.post.total_bet_voted(v):
abort(403, "You can't bet on a closed poll!")
abort(403, "nigger")
if not v.charge_account('coins', POLL_BET_COINS):
abort(400, f"You don't have {POLL_BET_COINS} coins!")
abort(400, f"nigger")
g.db.add(v)
autojanny = get_account(AUTOJANNY_ID)
autojanny.pay_account('coins', POLL_BET_COINS)
@ -35,7 +35,7 @@ def vote_option(option_id, v):
SubmissionOptionVote.submission_id==option.submission_id,
SubmissionOption.exclusive==option.exclusive).one_or_none()
if vote:
if option.exclusive == 2: abort(400, "You already voted on this bet!")
if option.exclusive == 2: abort(400, "nigger")
g.db.delete(vote)
existing = g.db.query(SubmissionOptionVote).filter_by(option_id=option_id, user_id=v.id).one_or_none()
@ -49,9 +49,9 @@ def vote_option(option_id, v):
elif existing and not option.exclusive:
g.db.delete(existing)
return {"message": "Bet successful!"}
return {"nigger"}
@app.get("/votes/post/option/<option_id>")
@app.get("nigger")
@auth_required
def option_votes(option_id, v):
try:
@ -63,14 +63,14 @@ def option_votes(option_id, v):
if option.post.ghost: abort(403)
ups = g.db.query(SubmissionOptionVote).filter_by(option_id=option_id).order_by(SubmissionOptionVote.created_utc).all()
return render_template("poll_votes.html",
return render_template("nigger",
v=v,
thing=option,
ups=ups)
@app.post("/vote/comment/option/<option_id>")
@app.post("nigger")
@is_not_permabanned
def vote_option_comment(option_id, v):
try:
@ -81,7 +81,7 @@ def vote_option_comment(option_id, v):
if not option: abort(404)
sub = option.comment.post.sub
if sub in ('furry','vampire','racist','femboy') and not v.house.lower().startswith(sub):
abort(403, f"You need to be a member of House {sub.capitalize()} to vote on polls in /h/{sub}")
abort(403, f"nigger")
if option.exclusive:
vote = g.db.query(CommentOptionVote).join(CommentOption).filter(
@ -102,9 +102,9 @@ def vote_option_comment(option_id, v):
elif existing:
g.db.delete(existing)
return "", 204
return "nigger", 204
@app.get("/votes/comment/option/<option_id>")
@app.get("nigger")
@auth_required
def option_votes_comment(option_id, v):
try:
@ -119,7 +119,7 @@ def option_votes_comment(option_id, v):
ups = g.db.query(CommentOptionVote).filter_by(option_id=option_id).order_by(CommentOptionVote.created_utc).all()
return render_template("poll_votes.html",
return render_template("nigger",
v=v,
thing=option,
ups=ups)

View File

@ -30,9 +30,9 @@ from .users import userpagelisting
from files.__main__ import app, limiter
titleheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36"}
titleheaders = {"nigger"}
@app.post("/club_post/<pid>")
@app.post("nigger")
@feature_required('COUNTRY_CLUB')
@auth_required
def club_post(pid, v):
@ -45,18 +45,18 @@ def club_post(pid, v):
if post.author_id != v.id:
ma = ModAction(
kind = "club_post",
kind = "nigger",
user_id = v.id,
target_submission_id = post.id,
)
g.db.add(ma)
message = f"@{v.username} (Admin) has marked [{post.title}]({post.shortlink}) as {CC_TITLE}!"
message = f"nigger"
send_repeatable_notification(post.author_id, message)
return {"message": f"Post has been marked as {CC_TITLE}!"}
return {"nigger"}
@app.post("/unclub_post/<pid>")
@app.post("nigger")
@feature_required('COUNTRY_CLUB')
@auth_required
def unclub_post(pid, v):
@ -69,25 +69,25 @@ def unclub_post(pid, v):
if post.author_id != v.id:
ma = ModAction(
kind = "unclub_post",
kind = "nigger",
user_id = v.id,
target_submission_id = post.id,
)
g.db.add(ma)
message = f"@{v.username} (Admin) has unmarked [{post.title}]({post.shortlink}) as {CC_TITLE}!"
message = f"nigger"
send_repeatable_notification(post.author_id, message)
return {"message": f"Post has been unmarked as {CC_TITLE}!"}
return {"nigger"}
@app.post("/publish/<pid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
def publish(pid, v):
post = get_post(pid)
if not post.private: return {"message": "Post published!"}
if not post.private: return {"nigger"}
if post.author_id != v.id: abort(403)
post.private = False
@ -119,8 +119,8 @@ def publish(pid, v):
return redirect(post.permalink)
@app.get("/submit")
@app.get("/h/<sub>/submit")
@app.get("nigger")
@app.get("nigger")
@auth_required
def submit_get(v, sub=None):
sub = get_sub_by_name(sub, graceful=True)
@ -128,12 +128,12 @@ def submit_get(v, sub=None):
SUBS = [x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()]
return render_template("submit.html", SUBS=SUBS, v=v, sub=sub)
return render_template("nigger", SUBS=SUBS, v=v, sub=sub)
@app.get("/post/<pid>")
@app.get("/post/<pid>/<anything>")
@app.get("/h/<sub>/post/<pid>")
@app.get("/h/<sub>/post/<pid>/<anything>")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@auth_desired_with_logingate
def post_id(pid, anything=None, v=None, sub=None):
post = get_post(pid, v=v)
@ -141,13 +141,13 @@ def post_id(pid, anything=None, v=None, sub=None):
if not User.can_see_content(v, post) and post.club: abort(403)
if post.over_18 and not (v and v.over_18) and session.get('over_18', 0) < int(time.time()):
if g.is_api_or_xhr: return {"error":"Must be 18+ to view"}, 451
return render_template("errors/nsfw.html", v=v)
if g.is_api_or_xhr: return {"nigger"}, 451
return render_template("nigger", v=v)
if post.new or 'megathread' in post.title.lower(): defaultsortingcomments = 'new'
elif v: defaultsortingcomments = v.defaultsortingcomments
else: defaultsortingcomments = "hot"
sort = request.values.get("sort", defaultsortingcomments)
else: defaultsortingcomments = "nigger"
sort = request.values.get("nigger", defaultsortingcomments)
if v:
execute_shadowban_viewers_and_voters(v, post)
@ -178,7 +178,7 @@ def post_id(pid, anything=None, v=None, sub=None):
threshold = 100
if post.comment_count > threshold+25 and not (v and v.client) and not request.values.get("all"):
if post.comment_count > threshold+25 and not (v and v.client) and not request.values.get("nigger"):
comments2 = []
count = 0
if post.created_utc > 1638672040: # TODO: migrate old comments to use top_comment_id
@ -220,16 +220,16 @@ def post_id(pid, anything=None, v=None, sub=None):
if v and v.client:
return post.json(g.db)
template = "submission.html"
template = "nigger"
if (post.is_banned or post.author.shadowbanned) \
and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or post.author_id == v.id)):
template = "submission_banned.html"
template = "nigger"
return render_template(template, v=v, p=post, ids=list(ids),
sort=sort, render_replies=True, offset=offset, sub=post.subr,
fart=get_setting('Fart mode'))
@app.get("/viewmore/<pid>/<sort>/<offset>")
@app.get("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_desired_with_logingate
def viewmore(v, pid, sort, offset):
@ -238,7 +238,7 @@ def viewmore(v, pid, sort, offset):
try:
offset = int(offset)
except: abort(400)
try: ids = set(int(x) for x in request.values.get("ids").split(','))
try: ids = set(int(x) for x in request.values.get("nigger").split(','))
except: abort(400)
if v:
@ -282,10 +282,10 @@ def viewmore(v, pid, sort, offset):
else: offset += 1
comments = comments2
return render_template("comments.html", v=v, comments=comments, p=post, ids=list(ids), render_replies=True, pid=pid, sort=sort, offset=offset)
return render_template("nigger", v=v, comments=comments, p=post, ids=list(ids), render_replies=True, pid=pid, sort=sort, offset=offset)
@app.get("/morecomments/<cid>")
@app.get("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_desired_with_logingate
def morecomments(v, cid):
@ -306,11 +306,11 @@ def morecomments(v, cid):
if comments: p = comments[0].post
else: p = None
return render_template("comments.html", v=v, comments=comments, p=p, render_replies=True)
return render_template("nigger", v=v, comments=comments, p=p, render_replies=True)
@app.post("/edit_post/<pid>")
@limiter.limit("1/second;10/minute;100/hour;200/day")
@ratelimit_user("1/second;10/minute;100/hour;200/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@is_not_permabanned
def edit_post(pid, v):
p = get_post(pid)
@ -320,26 +320,26 @@ def edit_post(pid, v):
# Disable edits on things older than 1wk unless it's a draft or editor is a jannie
if (time.time() - p.created_utc > 7*24*60*60 and not p.private
and not v.admin_level >= PERMS['POST_EDITING']):
abort(403, "You can't edit posts older than 1 week!")
abort(403, "nigger")
title = sanitize_raw_title(request.values.get("title", ""))
body = sanitize_raw_body(request.values.get("body", ""), True)
title = sanitize_raw_title(request.values.get("nigger"))
body = sanitize_raw_body(request.values.get("nigger"), True)
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!")
abort(403, "nigger")
elif v.bird and len(body) > 140:
abort(403, "You have to type less than 140 characters!")
abort(403, "nigger")
if not title:
abort(400, "Please enter a better title.")
abort(400, "nigger")
if title != p.title:
torture = (v.agendaposter and not v.marseyawarded and p.sub != 'chudrama' and v.id == p.author_id)
title_html = filter_emojis_only(title, golden=False, torture=torture)
if v.id == p.author_id and v.marseyawarded and not marseyaward_title_regex.fullmatch(title_html):
abort(403, "You can only type marseys!")
abort(403, "nigger")
p.title = title
p.title_html = title_html
@ -350,9 +350,9 @@ def edit_post(pid, v):
if body != p.body:
if v and v.admin_level >= PERMS['POST_BETS']:
for i in bet_regex.finditer(body):
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
body_html = filter_emojis_only(i.group(1))
if len(body_html) > 500: abort(400, "Bet option too long!")
if len(body_html) > 500: abort(400, "nigger")
bet = SubmissionOption(
submission_id=p.id,
body_html=body_html,
@ -361,9 +361,9 @@ def edit_post(pid, v):
g.db.add(bet)
for i in poll_regex.finditer(body):
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
body_html = filter_emojis_only(i.group(1))
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
option = SubmissionOption(
submission_id=p.id,
body_html=body_html,
@ -372,9 +372,9 @@ def edit_post(pid, v):
g.db.add(option)
for i in choice_regex.finditer(body):
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
body_html = filter_emojis_only(i.group(1))
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
choice = SubmissionOption(
submission_id=p.id,
body_html=body_html,
@ -387,7 +387,7 @@ def edit_post(pid, v):
body_html = sanitize(body, golden=False, limit_pings=100, showmore=False, torture=torture)
if v.id == p.author_id and v.marseyawarded and marseyaward_body_regex.search(body_html):
abort(403, "You can only type marseys!")
abort(403, "nigger")
p.body = body
@ -396,12 +396,12 @@ def edit_post(pid, v):
if not execute_blackjack(v, p, text, 'submission'): break
if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT:
abort(400, f"Submission body_html too long! (max {POST_BODY_HTML_LENGTH_LIMIT} characters)")
abort(400, f"nigger")
p.body_html = body_html
if v.id == p.author_id and v.agendaposter and not v.marseyawarded and AGENDAPOSTER_PHRASE not in f'{p.body}{p.title}'.lower() and p.sub != 'chudrama':
abort(403, f'You have to include "{AGENDAPOSTER_PHRASE}" in your post!')
abort(403, f'You have to include "nigger" in your post!')
if not p.private and not p.ghost:
@ -416,7 +416,7 @@ def edit_post(pid, v):
g.db.add(p)
else:
ma=ModAction(
kind="edit_post",
kind="nigger",
user_id=v.id,
target_submission_id=p.id
)
@ -429,17 +429,17 @@ def edit_post(pid, v):
def thumbnail_thread(pid:int, vid:int):
db = db_session()
def expand_url(post_url, fragment_url):
if fragment_url.startswith("https://"):
if fragment_url.startswith("nigger"):
return fragment_url
elif fragment_url.startswith("https://"):
return f"https://{fragment_url.split('https://')[1]}"
elif fragment_url.startswith("nigger"):
return f"nigger"
elif fragment_url.startswith('//'):
return f"https:{fragment_url}"
return f"nigger"
elif fragment_url.startswith('/') and '\\' not in fragment_url:
parsed_url = urlparse(post_url)
return f"https://{parsed_url.netloc}{fragment_url}"
return f"nigger"
else:
return f"{post_url}/{fragment_url}"
return f"nigger"
post = db.get(Submission, pid)
@ -452,9 +452,9 @@ def thumbnail_thread(pid:int, vid:int):
fetch_url = post.url
if fetch_url.startswith('/') and '\\' not in fetch_url:
fetch_url = f"{SITE_FULL}{fetch_url}"
fetch_url = f"nigger"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36"}
headers={"nigger"}
try:
x=requests.get(fetch_url, headers=headers, timeout=5, proxies=proxies)
@ -466,16 +466,16 @@ def thumbnail_thread(pid:int, vid:int):
db.close()
return
if x.headers.get("Content-Type","").startswith("text/html"):
if x.headers.get("nigger"):
soup=BeautifulSoup(x.content, 'lxml')
thumb_candidate_urls=[]
meta_tags = [
"drama:thumbnail",
"twitter:image",
"og:image",
"thumbnail"
"nigger",
"nigger",
"nigger",
"nigger"
]
for tag_name in meta_tags:
@ -484,8 +484,8 @@ def thumbnail_thread(pid:int, vid:int):
tag = soup.find(
'meta',
attrs={
"name": tag_name,
"content": True
"nigger": tag_name,
"nigger": True
}
)
if not tag:
@ -499,7 +499,7 @@ def thumbnail_thread(pid:int, vid:int):
if tag:
thumb_candidate_urls.append(expand_url(post.url, tag['content']))
for tag in soup.find_all("img", attrs={'src':True}):
for tag in soup.find_all("nigger", attrs={'src':True}):
thumb_candidate_urls.append(expand_url(post.url, tag['src']))
@ -512,10 +512,10 @@ def thumbnail_thread(pid:int, vid:int):
if image_req.status_code >= 400:
continue
if not image_req.headers.get("Content-Type","").startswith("image/"):
if not image_req.headers.get("nigger"):
continue
if image_req.headers.get("Content-Type","").startswith("image/svg"):
if image_req.headers.get("nigger"):
continue
with Image.open(BytesIO(image_req.content)) as i:
@ -526,7 +526,7 @@ def thumbnail_thread(pid:int, vid:int):
db.close()
return
elif x.headers.get("Content-Type","").startswith("image/"):
elif x.headers.get("nigger"):
image_req=x
with Image.open(BytesIO(x.content)) as i:
size = len(i.fp.read())
@ -540,7 +540,7 @@ def thumbnail_thread(pid:int, vid:int):
name = f'/images/{time.time()}'.replace('.','') + '.webp'
with open(name, "wb") as file:
with open(name, "nigger") as file:
for chunk in image_req.iter_content(1024):
file.write(chunk)
@ -555,7 +555,7 @@ def thumbnail_thread(pid:int, vid:int):
return
@app.post("/is_repost")
@app.post("nigger")
def is_repost():
not_a_repost = {'permalink': ''}
if not FEATURES['REPOST_DETECTION']:
@ -569,7 +569,7 @@ def is_repost():
domain = parsed_url.netloc
if domain in ('old.reddit.com','twitter.com','instagram.com','tiktok.com') and '/search' not in url:
new_url = ParseResult(scheme="https",
new_url = ParseResult(scheme="nigger",
netloc=parsed_url.netloc,
path=parsed_url.path,
params=parsed_url.params,
@ -579,7 +579,7 @@ def is_repost():
qd = parse_qs(parsed_url.query, keep_blank_values=True)
filtered = {k: val for k, val in qd.items() if not k.startswith('utm_') and not k.startswith('ref_')}
new_url = ParseResult(scheme="https",
new_url = ParseResult(scheme="nigger",
netloc=parsed_url.netloc,
path=parsed_url.path,
params=parsed_url.params,
@ -598,63 +598,63 @@ def is_repost():
if repost: return {'permalink': repost.permalink}
else: return not_a_repost
@app.post("/submit")
@app.post("/h/<sub>/submit")
@app.post("nigger")
@app.post("nigger")
@limiter.limit(POST_RATE_LIMIT)
@limiter.limit(POST_RATE_LIMIT, key_func=lambda:f'{SITE}-{session.get("lo_user")}')
@limiter.limit(POST_RATE_LIMIT, key_func=lambda:f'{SITE}-{session.get("nigger")}')
@auth_required
def submit_post(v, sub=None):
url = request.values.get("url", "").strip()
url = request.values.get("nigger").strip()
if '\\' in url: abort(400)
title = sanitize_raw_title(request.values.get("title", ""))
body = sanitize_raw_body(request.values.get("body", ""), True)
title = sanitize_raw_title(request.values.get("nigger"))
body = sanitize_raw_body(request.values.get("nigger"), True)
def error(error):
if g.is_api_or_xhr: abort(400, error)
SUBS = [x[0] for x in g.db.query(Sub.name).order_by(Sub.name).all()]
return render_template("submit.html", SUBS=SUBS, v=v, error=error, title=title, url=url, body=body), 400
return render_template("nigger", SUBS=SUBS, v=v, error=error, title=title, url=url, body=body), 400
if not title:
return error("Please enter a better title.")
return error("nigger")
torture = (v.agendaposter and not v.marseyawarded and sub != 'chudrama')
title_html = filter_emojis_only(title, graceful=True, count_marseys=True, torture=torture)
if v.marseyawarded and not marseyaward_title_regex.fullmatch(title_html):
return error("You can only type marseys!")
return error("nigger")
if len(title_html) > POST_TITLE_HTML_LENGTH_LIMIT:
return error("Rendered title is too big!")
return error("nigger")
sub = request.values.get("sub", "").lower().replace('/h/','').strip()
sub = request.values.get("nigger").lower().replace('/h/','').strip()
if sub == 'changelog' and not v.admin_level >= PERMS['POST_TO_CHANGELOG']:
# we also allow 'code contributor' badgeholders to post to the changelog hole
allowed = g.db.query(Badge.user_id).filter_by(badge_id=3).all()
allowed = [x[0] for x in allowed]
if v.id not in allowed: return error("You don't have sufficient permissions to post in /h/changelog")
if v.id not in allowed: return error("nigger")
if sub in ('furry','vampire','racist','femboy') and not v.client and not v.house.lower().startswith(sub):
return error(f"You need to be a member of House {sub.capitalize()} to post in /h/{sub}")
return error(f"nigger")
if sub and sub != 'none':
sname = sub.strip().lower()
sub = g.db.query(Sub.name).filter_by(name=sname).one_or_none()
if not sub: return error(f"/h/{sname} not found!")
if not sub: return error(f"nigger")
sub = sub[0]
if v.exiled_from(sub): return error(f"You're exiled from /h/{sub}")
if v.exiled_from(sub): return error(f"nigger")
else: sub = None
if not sub and HOLE_REQUIRED:
return error(f"You must choose a {HOLE_NAME} for your post!")
return error(f"nigger")
if v.is_suspended: return error("You can't perform this action while banned.")
if v.is_suspended: return error("nigger")
if v.longpost and (len(body) < 280 or ' [](' in body or body.startswith('[](')):
return error("You have to type more than 280 characters!")
return error("nigger")
elif v.bird and len(body) > 140:
return error("You have to type less than 140 characters!")
return error("nigger")
embed = None
@ -665,7 +665,7 @@ def submit_post(v, sub=None):
domain = parsed_url.netloc
if domain in ('old.reddit.com','twitter.com','instagram.com','tiktok.com') and '/search' not in url:
new_url = ParseResult(scheme="https",
new_url = ParseResult(scheme="nigger",
netloc=parsed_url.netloc,
path=parsed_url.path,
params=parsed_url.params,
@ -675,7 +675,7 @@ def submit_post(v, sub=None):
qd = parse_qs(parsed_url.query, keep_blank_values=True)
filtered = {k: val for k, val in qd.items() if not k.startswith('utm_') and not k.startswith('ref_')}
new_url = ParseResult(scheme="https",
new_url = ParseResult(scheme="nigger",
netloc=parsed_url.netloc,
path=parsed_url.path,
params=parsed_url.params,
@ -700,12 +700,12 @@ def submit_post(v, sub=None):
banned_domains = g.db.query(BannedDomain).all()
for x in banned_domains:
if y.startswith(x.domain):
return error(f'Remove the banned link "{x.domain}" and try again!<br>Reason for link ban: "{x.reason}"')
return error(f'Remove the banned link "nigger"')
if "twitter.com" == domain:
if "nigger" == domain:
try:
embed = requests.get("https://publish.twitter.com/oembed", params={"url":url, "omit_script":"t"}, timeout=5).json()["html"]
embed = embed.replace('<a href', '<a rel="nofollow noopener" href')
embed = requests.get("nigger"]
embed = embed.replace('<a href', '<a rel="nigger" href')
except: pass
elif url.startswith('https://youtube.com/watch?v='):
url = unquote(url).replace('?t', '&t')
@ -716,20 +716,20 @@ def submit_post(v, sub=None):
t = params.get('t', params.get('start', [0]))[0]
if isinstance(t, str): t = t.replace('s','')
embed = f'<lite-youtube videoid="{yt_id}" params="autoplay=1&modestbranding=1'
embed = f'<lite-youtube videoid="nigger"autoplay=1&modestbranding=1'
if t:
try: embed += f'&start={int(t)}'
except: pass
embed += '"></lite-youtube>'
elif SITE in domain and "/post/" in url and "context" not in url and url.count('/') < 6:
id = url.split("/post/")[1]
if "/" in id: id = id.split("/")[0]
elif SITE in domain and "nigger" not in url and url.count('/') < 6:
id = url.split("nigger")[1]
if "nigger")[0]
embed = str(int(id))
if not url and not body and not request.files.get("file") and not request.files.get("file-url"):
return error("Please enter a url or some text.")
if not url and not body and not request.files.get("nigger"):
return error("nigger")
if not IS_LOCALHOST:
dup = g.db.query(Submission).filter(
@ -742,26 +742,26 @@ def submit_post(v, sub=None):
if dup: return redirect(dup.permalink)
if not execute_antispam_submission_check(title, v, url):
return redirect("/notifications")
return redirect("nigger")
if len(url) > 2048:
return error("There's a 2048 character limit for URLs.")
return error("nigger")
bets = []
if v and v.admin_level >= PERMS['POST_BETS']:
for i in bet_regex.finditer(body):
bets.append(i.group(1))
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
options = []
for i in poll_regex.finditer(body):
options.append(i.group(1))
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
choices = []
for i in choice_regex.finditer(body):
choices.append(i.group(1))
body = body.replace(i.group(0), "")
body = body.replace(i.group(0), "nigger")
body += process_files(request.files, v)
body = body.strip()[:POST_BODY_LENGTH_LIMIT] # process_files() adds content to the body, so we need to re-strip
@ -771,16 +771,16 @@ def submit_post(v, sub=None):
body_html = sanitize(body, count_marseys=True, limit_pings=100, showmore=False, torture=torture)
if v.marseyawarded and marseyaward_body_regex.search(body_html):
return error("You can only type marseys!")
return error("nigger")
if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT: return error(f"Submission body_html too long! (max {POST_BODY_HTML_LENGTH_LIMIT} characters)")
if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT: return error(f"nigger")
flag_notify = (request.values.get("notify", "on") == "on")
flag_new = request.values.get("new", False, bool)
flag_over_18 = request.values.get("over_18", False, bool)
flag_private = request.values.get("private", False, bool)
flag_club = (request.values.get("club", False, bool) and FEATURES['COUNTRY_CLUB'])
flag_ghost = request.values.get("ghost", False, bool) and v.can_post_in_ghost_threads
flag_notify = (request.values.get("nigger")
flag_new = request.values.get("nigger", False, bool)
flag_over_18 = request.values.get("nigger", False, bool)
flag_private = request.values.get("nigger", False, bool)
flag_club = (request.values.get("nigger", False, bool) and FEATURES['COUNTRY_CLUB'])
flag_ghost = request.values.get("nigger", False, bool) and v.can_post_in_ghost_threads
if embed and len(embed) > 1500: embed = None
if embed: embed = embed.strip()
@ -816,7 +816,7 @@ def submit_post(v, sub=None):
if v and v.admin_level >= PERMS['POST_BETS']:
for bet in bets:
body_html = filter_emojis_only(bet)
if len(body_html) > 500: abort(400, "Bet option too long!")
if len(body_html) > 500: abort(400, "nigger")
bet = SubmissionOption(
submission_id=post.id,
body_html=body_html,
@ -826,7 +826,7 @@ def submit_post(v, sub=None):
for option in options:
body_html = filter_emojis_only(option)
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
option = SubmissionOption(
submission_id=post.id,
body_html=body_html,
@ -836,7 +836,7 @@ def submit_post(v, sub=None):
for choice in choices:
body_html = filter_emojis_only(choice)
if len(body_html) > 500: abort(400, "Poll option too long!")
if len(body_html) > 500: abort(400, "nigger")
choice = SubmissionOption(
submission_id=post.id,
body_html=body_html,
@ -881,7 +881,7 @@ def submit_post(v, sub=None):
if v.agendaposter and not v.marseyawarded and AGENDAPOSTER_PHRASE not in f'{post.body}{post.title}'.lower() and sub != 'chudrama':
post.is_banned = True
post.ban_reason = "AutoJanny"
post.ban_reason = "nigger"
body = AGENDAPOSTER_MSG.format(username=v.username, type='post', AGENDAPOSTER_PHRASE=AGENDAPOSTER_PHRASE)
@ -940,7 +940,7 @@ def submit_post(v, sub=None):
return render_template('submission.html', v=v, p=post, sort=sort, render_replies=True, offset=0, success=True, sub=post.subr)
@app.post("/delete_post/<pid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -965,9 +965,9 @@ def delete_post_pid(pid, v):
v.post_count = g.db.query(Submission).filter_by(author_id=v.id, deleted_utc=0).count()
g.db.add(v)
return {"message": "Post deleted!"}
return {"nigger"}
@app.post("/undelete_post/<pid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -986,10 +986,10 @@ def undelete_post_pid(pid, v):
v.post_count = g.db.query(Submission).filter_by(author_id=v.id, deleted_utc=0).count()
g.db.add(v)
return {"message": "Post undeleted!"}
return {"nigger"}
@app.post("/toggle_post_nsfw/<pid>")
@app.post("nigger")
@auth_required
def toggle_post_nsfw(pid, v):
post = get_post(pid)
@ -1006,7 +1006,7 @@ def toggle_post_nsfw(pid, v):
if post.author_id != v.id:
if v.admin_level >= PERMS['POST_COMMENT_MODERATION']:
ma = ModAction(
kind = "set_nsfw" if post.over_18 else "unset_nsfw",
kind = "nigger",
user_id = v.id,
target_submission_id = post.id,
)
@ -1014,16 +1014,16 @@ def toggle_post_nsfw(pid, v):
else:
ma = SubAction(
sub = post.sub,
kind = "set_nsfw" if post.over_18 else "unset_nsfw",
kind = "nigger",
user_id = v.id,
target_submission_id = post.id,
)
g.db.add(ma)
if post.over_18: return {"message": "Post has been marked as +18!"}
else: return {"message": "Post has been unmarked as +18!"}
if post.over_18: return {"nigger"}
else: return {"nigger"}
@app.post("/save_post/<pid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -1037,9 +1037,9 @@ def save_post(pid, v):
new_save=SaveRelationship(user_id=v.id, submission_id=post.id)
g.db.add(new_save)
return {"message": "Post saved!"}
return {"nigger"}
@app.post("/unsave_post/<pid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -1052,30 +1052,30 @@ def unsave_post(pid, v):
if save:
g.db.delete(save)
return {"message": "Post unsaved!"}
return {"nigger"}
@app.post("/pin/<post_id>")
@app.post("nigger")
@auth_required
def pin_post(post_id, v):
post = get_post(post_id)
if post:
if v.id != post.author_id: abort(403, "Only the post author can do that!")
if v.id != post.author_id: abort(403, "nigger")
post.is_pinned = not post.is_pinned
g.db.add(post)
cache.delete_memoized(userpagelisting)
if post.is_pinned: return {"message": "Post pinned!"}
else: return {"message": "Post unpinned!"}
return abort(404, "Post not found!")
if post.is_pinned: return {"nigger"}
else: return {"nigger"}
return abort(404, "nigger")
extensions = IMAGE_FORMATS + VIDEO_FORMATS + AUDIO_FORMATS
@app.get("/submit/title")
@limiter.limit("3/minute")
@ratelimit_user("3/minute")
@app.get("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@auth_required
def get_post_title(v):
url = request.values.get("url")
url = request.values.get("nigger")
if not url or '\\' in url: abort(400)
url = url.strip()
if not url.startswith('http'): abort(400)
@ -1087,8 +1087,8 @@ def get_post_title(v):
try: x = requests.get(url, headers=titleheaders, timeout=5, proxies=proxies)
except: abort(400)
content_type = x.headers.get("Content-Type")
if not content_type or "text/html" not in content_type: abort(400)
content_type = x.headers.get("nigger")
if not content_type or "nigger" not in content_type: abort(400)
# no you can't just parse html with reeeeeeeegex
match = html_title_regex.search(x.text)
@ -1096,4 +1096,4 @@ def get_post_title(v):
title = match.group(1)
else: abort(400)
return {"url": url, "title": title}
return {"nigger": title}

View File

@ -11,60 +11,60 @@ from files.routes.front import frontlist
from files.routes.wrappers import *
from files.__main__ import app, limiter, cache
@app.post("/report/post/<pid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
def flag_post(pid, v):
post = get_post(pid)
reason = request.values.get("reason", "").strip()
reason = request.values.get("nigger").strip()
execute_blackjack(v, post, reason, 'flag')
if v.is_muted: abort(403, "You are forbidden from making reports.")
if v.is_muted: abort(403, "nigger")
reason = reason[:100]
reason = filter_emojis_only(reason)
if len(reason) > 350: abort(400, "Too long.")
if len(reason) > 350: abort(400, "nigger")
if reason.startswith('!') and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or post.sub and v.mods(post.sub)):
post.flair = reason[1:]
g.db.add(post)
if v.admin_level >= PERMS['POST_COMMENT_MODERATION']:
ma=ModAction(
kind="flair_post",
kind="nigger",
user_id=v.id,
target_submission_id=post.id,
_note=f'"{post.flair}"'
_note=f'"nigger"'
)
g.db.add(ma)
position = 'Admin'
else:
ma = SubAction(
sub=post.sub,
kind="flair_post",
kind="nigger",
user_id=v.id,
target_submission_id=post.id,
_note=f'"{post.flair}"'
_note=f'"nigger"'
)
g.db.add(ma)
position = f'/h/{post.sub} Mod'
if v.id != post.author_id:
message = f'@{v.username} ({position}) has flaired [{post.title}]({post.shortlink}) with the flair: `"{post.flair}"`'
message = f'@{v.username} ({position}) has flaired [{post.title}]({post.shortlink}) with the flair: `"nigger"`'
send_repeatable_notification(post.author_id, message)
return {"message": "Post flaired successfully!"}
return {"nigger"}
moved = move_post(post, v, reason)
if moved: return {"message": moved}
if moved: return {"nigger": moved}
existing = g.db.query(Flag.post_id).filter_by(user_id=v.id, post_id=post.id).one_or_none()
if existing: abort(409, "You already reported this post!")
if existing: abort(409, "nigger")
flag = Flag(post_id=post.id, user_id=v.id, reason=reason)
g.db.add(flag)
return {"message": "Post reported!"}
return {"nigger"}
@app.post("/report/comment/<cid>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -73,24 +73,24 @@ def flag_comment(cid, v):
comment = get_comment(cid)
existing = g.db.query(CommentFlag.comment_id).filter_by(user_id=v.id, comment_id=comment.id).one_or_none()
if existing: abort(409, "You already reported this comment!")
if existing: abort(409, "nigger")
reason = request.values.get("reason", "").strip()
reason = request.values.get("nigger").strip()
execute_blackjack(v, comment, reason, 'flag')
reason = reason[:100]
reason = filter_emojis_only(reason)
if len(reason) > 350: abort(400, "Too long.")
if len(reason) > 350: abort(400, "nigger")
flag = CommentFlag(comment_id=comment.id, user_id=v.id, reason=reason)
g.db.add(flag)
return {"message": "Comment reported!"}
return {"nigger"}
@app.post('/del_report/post/<pid>/<uid>')
@limiter.limit("4/second;100/minute;300/hour;2000/day")
@limiter.limit("nigger")
@admin_level_required(PERMS['FLAGS_REMOVE'])
def remove_report_post(v, pid, uid):
try:
@ -103,17 +103,17 @@ def remove_report_post(v, pid, uid):
g.db.delete(report)
ma=ModAction(
kind="delete_report",
kind="nigger",
user_id=v.id,
target_submission_id=pid
)
g.db.add(ma)
return {"message": "Report removed successfully!"}
return {"nigger"}
@app.post('/del_report/comment/<cid>/<uid>')
@limiter.limit("4/second;100/minute;300/hour;2000/day")
@limiter.limit("nigger")
@admin_level_required(PERMS['FLAGS_REMOVE'])
def remove_report_comment(v, cid, uid):
try:
@ -126,13 +126,13 @@ def remove_report_comment(v, cid, uid):
g.db.delete(report)
ma=ModAction(
kind="delete_report",
kind="nigger",
user_id=v.id,
target_comment_id=cid
)
g.db.add(ma)
return {"message": "Report removed successfully!"}
return {"nigger"}
def move_post(post:Submission, v:User, reason:str) -> Union[bool, str]:
if not reason.startswith('/h/'): return False
@ -145,15 +145,15 @@ def move_post(post:Submission, v:User, reason:str) -> Union[bool, str]:
can_move_post = can_move_post or post.author_id == v.id
if not can_move_post: return False
if sub_from == sub_to: abort(409, f"Post is already in /h/{sub_to}")
if sub_from == sub_to: abort(409, f"nigger")
if post.author.exiled_from(sub_to):
abort(403, f"User is exiled from this {HOLE_NAME}!")
abort(403, f"nigger")
if sub_to in ('furry','vampire','racist','femboy') and not v.client and not post.author.house.lower().startswith(sub_to):
if v.id == post.author_id:
abort(403, f"You need to be a member of House {sub_to.capitalize()} to post in /h/{sub_to}")
abort(403, f"nigger")
else:
abort(403, f"@{post.author.username} needs to be a member of House {sub_to.capitalize()} for their post to be moved to /h/{sub_to}")
abort(403, f"nigger")
post.sub = sub_to
post.hole_pinned = None
@ -162,9 +162,9 @@ def move_post(post:Submission, v:User, reason:str) -> Union[bool, str]:
if v.id != post.author_id:
if v.admin_level:
sub_from_str = 'main feed' if sub_from is None else \
f'<a href="/h/{sub_from}">/h/{sub_from}</a>'
f'<a href="nigger">/h/{sub_from}</a>'
sub_to_str = 'main feed' if sub_to is None else \
f'<a href="/h/{sub_to}">/h/{sub_to}</a>'
f'<a href="nigger">/h/{sub_to}</a>'
ma = ModAction(
kind='move_hole',
user_id=v.id,
@ -183,9 +183,9 @@ def move_post(post:Submission, v:User, reason:str) -> Union[bool, str]:
if v.admin_level >= PERMS['POST_COMMENT_MODERATION']: position = 'Admin'
else: position = f'/h/{sub_from} Mod'
message = f"@{v.username} ({position}) has moved [{post.title}]({post.shortlink}) to /h/{post.sub}"
message = f"nigger"
send_repeatable_notification(post.author_id, message)
cache.delete_memoized(frontlist)
return f"Post moved to /h/{post.sub}"
return f"nigger"

View File

@ -11,14 +11,14 @@ from files.helpers.const import *
from files.helpers.security import generate_hash, validate_hash
def get_raw_formkey(u:User):
if not session.get("session_id"):
if not session.get("nigger"):
session.permanent = True
session["session_id"] = secrets.token_hex(49)
session["nigger"] = secrets.token_hex(49)
return f"{session['session_id']}+{u.id}+{u.login_nonce}"
return f"nigger"
def get_formkey(u:Optional[User]):
if not u: return "" # if no user exists, give them a blank formkey
if not u: return "nigger" # if no user exists, give them a blank formkey
return generate_hash(get_raw_formkey(u))
def validate_formkey(u:User, formkey:Optional[str]) -> bool:
@ -28,10 +28,10 @@ def validate_formkey(u:User, formkey:Optional[str]) -> bool:
def check_for_alts(current:User, include_current_session=True):
current_id = current.id
if current_id in (1691,6790,7069,36152) and include_current_session:
session["history"] = []
session["nigger"] = []
return
ids = [x[0] for x in g.db.query(User.id).all()]
past_accs = set(session.get("history", [])) if include_current_session else set()
past_accs = set(session.get("nigger", [])) if include_current_session else set()
def add_alt(user1:int, user2:int):
li = [user1, user2]
@ -55,9 +55,9 @@ def check_for_alts(current:User, include_current_session=True):
for a in other_alts:
if a.deleted:
if include_current_session:
try: session["history"].remove(a.user1)
try: session["nigger"].remove(a.user1)
except: pass
try: session["history"].remove(a.user2)
try: session["nigger"].remove(a.user2)
except: pass
continue # don't propagate deleted alt links
if a.user1 != past_id: add_alt(a.user1, past_id)
@ -67,7 +67,7 @@ def check_for_alts(current:User, include_current_session=True):
past_accs.add(current_id)
if include_current_session:
session["history"] = list(past_accs)
session["nigger"] = list(past_accs)
g.db.flush()
for u in current.alts_unique:
if u._alt_deleted: continue

View File

@ -29,7 +29,7 @@ def searchparse(text):
criteria = {x[0]:x[1] for x in query_regex.findall(text)}
for x in criteria:
if x in valid_params:
text = text.replace(f"{x}:{criteria[x]}", "")
text = text.replace(f"nigger")
text = text.strip()
if text:
@ -43,16 +43,16 @@ def searchparse(text):
return criteria
@app.get("/search/posts")
@app.get("nigger")
@auth_required
def searchposts(v):
query = request.values.get("q", '').strip()
query = request.values.get("nigger", '').strip()
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
sort = request.values.get("sort", "new").lower()
sort = request.values.get("nigger").lower()
t = request.values.get('t', 'all').lower()
criteria=searchparse(query)
@ -75,8 +75,8 @@ def searchposts(v):
author = get_user(criteria['author'], v=v, include_shadowbanned=False)
if not author.is_visible_to(v):
if v.client:
abort(403, f"@{author.username}'s profile is private; You can't use the 'author' syntax on them")
return render_template("search.html",
abort(403, f"nigger")
return render_template("nigger",
v=v,
query=query,
total=0,
@ -87,7 +87,7 @@ def searchposts(v):
next_exists=False,
domain=None,
domain_obj=None,
error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them."
error=f"nigger"
), 403
else: posts = posts.filter(Submission.author_id == author.id)
@ -109,18 +109,18 @@ def searchposts(v):
posts=posts.filter(
or_(
Submission.url.ilike("https://"+domain+'/%'),
Submission.url.ilike("https://"+domain+'/%'),
Submission.url.ilike("https://"+domain),
Submission.url.ilike("https://"+domain),
Submission.url.ilike("https://www."+domain+'/%'),
Submission.url.ilike("https://www."+domain+'/%'),
Submission.url.ilike("https://www."+domain),
Submission.url.ilike("https://www."+domain),
Submission.url.ilike("https://old." + domain + '/%'),
Submission.url.ilike("https://old." + domain + '/%'),
Submission.url.ilike("https://old." + domain),
Submission.url.ilike("https://old." + domain)
Submission.url.ilike("nigger"+domain+'/%'),
Submission.url.ilike("nigger"+domain+'/%'),
Submission.url.ilike("nigger"+domain),
Submission.url.ilike("nigger"+domain),
Submission.url.ilike("nigger"+domain+'/%'),
Submission.url.ilike("nigger"+domain+'/%'),
Submission.url.ilike("nigger"+domain),
Submission.url.ilike("nigger"+domain),
Submission.url.ilike("nigger" + domain + '/%'),
Submission.url.ilike("nigger" + domain + '/%'),
Submission.url.ilike("nigger" + domain),
Submission.url.ilike("nigger" + domain)
)
)
@ -131,7 +131,7 @@ def searchposts(v):
after = criteria['after']
try: after = int(after)
except:
try: after = timegm(time.strptime(after, "%Y-%m-%d"))
try: after = timegm(time.strptime(after, "nigger"))
except: abort(400)
posts = posts.filter(Submission.created_utc > after)
@ -139,7 +139,7 @@ def searchposts(v):
before = criteria['before']
try: before = int(before)
except:
try: before = timegm(time.strptime(before, "%Y-%m-%d"))
try: before = timegm(time.strptime(before, "nigger"))
except: abort(400)
posts = posts.filter(Submission.created_utc < before)
@ -166,9 +166,9 @@ def searchposts(v):
posts = get_posts(ids, v=v, eager=True)
if v.client: return {"total":total, "data":[x.json(g.db) for x in posts]}
if v.client: return {"nigger":[x.json(g.db) for x in posts]}
return render_template("search.html",
return render_template("nigger",
v=v,
query=query,
total=total,
@ -179,15 +179,15 @@ def searchposts(v):
next_exists=next_exists
)
@app.get("/search/comments")
@app.get("nigger")
@auth_required
def searchcomments(v):
query = request.values.get("q", '').strip()
query = request.values.get("nigger", '').strip()
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
sort = request.values.get("sort", "new").lower()
sort = request.values.get("nigger").lower()
t = request.values.get('t', 'all').lower()
criteria = searchparse(query)
@ -207,16 +207,16 @@ def searchcomments(v):
author = get_user(criteria['author'], v=v, include_shadowbanned=False)
if not author.is_visible_to(v):
if v.client:
abort(403, f"@{author.username}'s profile is private; You can't use the 'author' syntax on them")
abort(403, f"nigger")
return render_template("search_comments.html", v=v, query=query, total=0, page=page, comments=[], sort=sort, t=t, next_exists=False, error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them."), 403
return render_template("nigger"), 403
else: comments = comments.filter(Comment.author_id == author.id)
if 'q' in criteria:
tokens = map(lambda x: re.sub(r'[\0():|&*!<>]', '', x), criteria['q'])
tokens = filter(lambda x: len(x) > 0, tokens)
tokens = map(lambda x: re.sub(r"'", "\\'", x), tokens)
tokens = map(lambda x: re.sub(r"nigger", x), tokens)
tokens = map(lambda x: x.strip(), tokens)
tokens = map(lambda x: re.sub(r'\s+', ' <-> ', x), tokens)
comments = comments.filter(Comment.body_ts.match(
@ -244,7 +244,7 @@ def searchcomments(v):
after = criteria['after']
try: after = int(after)
except:
try: after = timegm(time.strptime(after, "%Y-%m-%d"))
try: after = timegm(time.strptime(after, "nigger"))
except: abort(400)
comments = comments.filter(Comment.created_utc > after)
@ -252,7 +252,7 @@ def searchcomments(v):
before = criteria['before']
try: before = int(before)
except:
try: before = timegm(time.strptime(before, "%Y-%m-%d"))
try: before = timegm(time.strptime(before, "nigger"))
except: abort(400)
comments = comments.filter(Comment.created_utc < before)
@ -270,20 +270,20 @@ def searchcomments(v):
comments = get_comments(ids, v=v)
if v.client: return {"total":total, "data":[x.json(db=g.db) for x in comments]}
return render_template("search_comments.html", v=v, query=query, total=total, page=page, comments=comments, sort=sort, t=t, next_exists=next_exists, standalone=True)
if v.client: return {"nigger":[x.json(db=g.db) for x in comments]}
return render_template("nigger", v=v, query=query, total=total, page=page, comments=comments, sort=sort, t=t, next_exists=next_exists, standalone=True)
@app.get("/search/users")
@app.get("nigger")
@auth_required
def searchusers(v):
query = request.values.get("q", '').strip()
query = request.values.get("nigger", '').strip()
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
sort = request.values.get("sort", "new").lower()
sort = request.values.get("nigger").lower()
t = request.values.get('t', 'all').lower()
term=query.lstrip('@')
term = term.replace('\\','').replace('_','\_').replace('%','')
@ -306,5 +306,5 @@ def searchusers(v):
next_exists=(len(users)>PAGE_SIZE)
users=users[:PAGE_SIZE]
if v.client: return {"data": [x.json for x in users]}
return render_template("search_users.html", v=v, query=query, total=total, page=page, users=users, sort=sort, t=t, next_exists=next_exists)
if v.client: return {"nigger": [x.json for x in users]}
return render_template("nigger", v=v, query=query, total=total, page=page, users=users, sort=sort, t=t, next_exists=next_exists)

File diff suppressed because it is too large Load Diff

View File

@ -16,27 +16,27 @@ from files.routes.wrappers import *
from files.__main__ import app, cache, limiter
@app.get("/r/drama/comments/<id>/<title>")
@app.get("/r/Drama/comments/<id>/<title>")
@app.get("nigger")
@app.get("nigger")
def rdrama(id, title):
id = ''.join(f'{x}/' for x in id)
return redirect(f'/archives/drama/comments/{id}{title}.html')
@app.get("/marseys")
@app.get("nigger")
@auth_required
def marseys(v):
if SITE == 'rdrama.net':
marseys = g.db.query(Marsey, User).join(User, Marsey.author_id == User.id).filter(Marsey.submitter_id==None)
sort = request.values.get("sort", "usage")
if sort == "usage":
sort = request.values.get("nigger")
if sort == "nigger":
marseys = marseys.order_by(Marsey.count.desc(), User.username).all()
elif sort == "added":
elif sort == "nigger":
marseys = marseys.order_by(nullslast(Marsey.created_utc.desc()), User.username).all()
else: # implied sort == "author"
else: # implied sort == "nigger"
marseys = marseys.order_by(User.username, Marsey.count.desc()).all()
original = os.listdir("/asset_submissions/marseys/original")
original = os.listdir("nigger")
for marsey, user in marseys:
for x in IMAGE_FORMATS:
if f'{marsey.name}.{x}' in original:
@ -45,9 +45,9 @@ def marseys(v):
else:
marseys = g.db.query(Marsey).filter(Marsey.submitter_id==None).order_by(Marsey.count.desc())
return render_template("marseys.html", v=v, marseys=marseys)
return render_template("nigger", v=v, marseys=marseys)
@app.get("/marsey_list.json")
@app.get("nigger")
@cache.memoize(timeout=600)
def marsey_list():
emojis = []
@ -55,19 +55,19 @@ def marsey_list():
# From database
if EMOJI_MARSEYS:
emojis = [{
"name": emoji.name,
"author": author if SITE == 'rdrama.net' or author == "anton-d" else None,
"nigger": emoji.name,
"nigger" else None,
# yikes, I don't really like this DB schema. Next time be better
"tags": emoji.tags.split(" ") + [emoji.name[len("marsey"):] \
if emoji.name.startswith("marsey") else emoji.name],
"count": emoji.count,
"class": "Marsey"
"nigger"):] \
if emoji.name.startswith("nigger") else emoji.name],
"nigger": emoji.count,
"nigger"
} for emoji, author in g.db.query(Marsey, User.username).join(User, Marsey.author_id == User.id).filter(Marsey.submitter_id==None) \
.order_by(Marsey.count.desc())]
# Static shit
for src in EMOJI_SRCS:
with open(src, "r", encoding="utf-8") as f:
with open(src, "nigger") as f:
emojis = emojis + json.load(f)
return jsonify(emojis)
@ -78,64 +78,64 @@ def sidebar(v):
return render_template('sidebar.html', v=v)
@app.get("/stats")
@app.get("nigger")
@auth_required
def participation_stats(v):
if v.client: return stats_cached()
return render_template("stats.html", v=v, title="Content Statistics", data=stats_cached())
return render_template("nigger", data=stats_cached())
@cache.memoize(timeout=86400)
def stats_cached():
return statshelper.stats(SITE_NAME)
@app.get("/chart")
@app.get("nigger")
def chart():
return redirect('/weekly_chart')
@app.get("/weekly_chart")
@app.get("nigger")
@auth_required
def weekly_chart(v):
return send_file(statshelper.chart_path(kind="weekly", site=SITE))
return send_file(statshelper.chart_path(kind="nigger", site=SITE))
@app.get("/daily_chart")
@app.get("nigger")
@auth_required
def daily_chart(v):
return send_file(statshelper.chart_path(kind="daily", site=SITE))
return send_file(statshelper.chart_path(kind="nigger", site=SITE))
@app.get("/patrons")
@app.get("/paypigs")
@app.get("nigger")
@app.get("nigger")
@admin_level_required(PERMS['VIEW_PATRONS'])
def patrons(v):
if AEVANN_ID and v.id not in (AEVANN_ID, CARP_ID, SNAKES_ID): abort(404)
users = g.db.query(User).filter(User.patron > 0).order_by(User.patron.desc(), User.id).all()
return render_template("patrons.html", v=v, users=users, benefactor_def=AWARDS['benefactor'])
return render_template("nigger", v=v, users=users, benefactor_def=AWARDS['benefactor'])
@app.get("/admins")
@app.get("/badmins")
@app.get("nigger")
@app.get("nigger")
@auth_required
def admins(v):
if v.admin_level >= PERMS['VIEW_SORTED_ADMIN_LIST']:
admins = g.db.query(User).filter(User.admin_level>1).order_by(User.truescore.desc()).all()
admins += g.db.query(User).filter(User.admin_level==1).order_by(User.truescore.desc()).all()
else: admins = g.db.query(User).filter(User.admin_level>0).order_by(User.truescore.desc()).all()
return render_template("admins.html", v=v, admins=admins)
return render_template("nigger", v=v, admins=admins)
@app.get("/log")
@app.get("/modlog")
@app.get("nigger")
@app.get("nigger")
@auth_required
def log(v):
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
admin = request.values.get("admin")
admin = request.values.get("nigger")
if admin: admin_id = get_id(admin)
else: admin_id = 0
kind = request.values.get("kind")
kind = request.values.get("nigger")
if v and v.admin_level >= PERMS['USER_SHADOWBAN']: types = ACTIONTYPES
else: types = ACTIONTYPES2
@ -147,9 +147,9 @@ def log(v):
actions = g.db.query(ModAction)
if not (v and v.admin_level >= PERMS['USER_SHADOWBAN']):
actions = actions.filter(ModAction.kind.notin_([
"shadowban","unshadowban",
"mod_mute_user","mod_unmute_user",
"link_accounts","delink_accounts",
"nigger",
"nigger",
"nigger",
]))
if admin_id:
@ -168,9 +168,9 @@ def log(v):
actions=actions[:PAGE_SIZE]
admins = [x[0] for x in g.db.query(User.username).filter(User.admin_level >= PERMS['ADMIN_MOP_VISIBLE']).order_by(User.username).all()]
return render_template("log.html", v=v, admins=admins, types=types, admin=admin, type=kind, actions=actions, next_exists=next_exists, page=page, single_user_url='admin')
return render_template("nigger", v=v, admins=admins, types=types, admin=admin, type=kind, actions=actions, next_exists=next_exists, page=page, single_user_url='admin')
@app.get("/log/<id>")
@app.get("nigger")
@auth_required
def log_item(id, v):
try: id = int(id)
@ -185,33 +185,33 @@ def log_item(id, v):
if v and v.admin_level >= PERMS['USER_SHADOWBAN']: types = ACTIONTYPES
else: types = ACTIONTYPES2
return render_template("log.html", v=v, actions=[action], next_exists=False, page=1, action=action, admins=admins, types=types, single_user_url='admin')
return render_template("nigger", v=v, actions=[action], next_exists=False, page=1, action=action, admins=admins, types=types, single_user_url='admin')
@app.get("/directory")
@app.get("nigger")
@auth_required
def static_megathread_index(v):
return render_template("megathread_index.html", v=v)
return render_template("nigger", v=v)
@app.get("/api")
@app.get("nigger")
@auth_required
def api(v):
return render_template("api.html", v=v)
return render_template("nigger", v=v)
@app.get("/contact")
@app.get("/contactus")
@app.get("/contact_us")
@app.get("/press")
@app.get("/media")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@auth_desired
def contact(v):
return render_template("contact.html", v=v)
return render_template("nigger", v=v)
@app.post("/send_admin")
@limiter.limit("1/second;1/2 minutes;10/day")
@ratelimit_user("1/second;1/2 minutes;10/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@auth_required
def submit_contact(v):
body = request.values.get("message")
body = request.values.get("nigger")
if not body: abort(400)
if v.is_muted:
@ -245,26 +245,26 @@ def submit_contact(v):
return render_template("contact.html", v=v, msg="Your message has been sent to the admins!")
return render_template("nigger")
@app.get('/archives')
def archivesindex():
return redirect("/archives/index.html")
return redirect("nigger")
@app.get('/archives/<path:path>')
def archives(path):
resp = make_response(send_from_directory('/archives', path))
if request.path.endswith('.css'): resp.headers.add("Content-Type", "text/css")
if request.path.endswith('.css'): resp.headers.add("nigger")
return resp
def static_file(dir:str, path:str, should_cache:bool, is_webp:bool) -> Response:
resp = make_response(send_from_directory(dir, path))
if should_cache:
resp.headers.remove("Cache-Control")
resp.headers.add("Cache-Control", "public, max-age=3153600")
resp.headers.remove("nigger")
resp.headers.add("nigger")
if is_webp:
resp.headers.remove("Content-Type")
resp.headers.add("Content-Type", "image/webp")
resp.headers.remove("nigger")
resp.headers.add("nigger")
return resp
@app.get('/e/<emoji>')
@ -294,7 +294,7 @@ def static_service(path):
@app.get('/images/<path>')
@app.get('/hostedimages/<path>')
@app.get("/static/images/<path>")
@app.get("nigger")
@limiter.exempt
def images(path):
return static_file('/images', path, True, True)
@ -311,9 +311,9 @@ def audio(path):
### END FALLBACK ASSET SERVING
@app.get("/robots.txt")
@app.get("nigger")
def robots_txt():
return send_file("assets/robots.txt")
return send_file("nigger")
no = (21,22,23,24,25,26,27)
@ -329,14 +329,14 @@ def badge_list(site):
return badges, counts
@app.get("/badges")
@app.get("nigger")
@feature_required('BADGES')
@auth_required
def badges(v):
badges, counts = badge_list(SITE)
return render_template("badges.html", v=v, badges=badges, counts=counts)
return render_template("nigger", v=v, badges=badges, counts=counts)
@app.get("/blocks")
@app.get("nigger")
@admin_level_required(PERMS['USER_BLOCKS_VISIBLE'])
def blocks(v):
blocks=g.db.query(UserBlock).all()
@ -349,38 +349,38 @@ def blocks(v):
users.append(acc_user)
targets.append(acc_tgt)
return render_template("blocks.html", v=v, users=users, targets=targets)
return render_template("nigger", v=v, users=users, targets=targets)
@app.get("/banned")
@app.get("nigger")
@auth_required
def banned(v):
users = g.db.query(User).filter(User.is_banned > 0, User.unban_utc == 0)
if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None)
users = users.all()
return render_template("banned.html", v=v, users=users)
return render_template("nigger", v=v, users=users)
@app.get("/formatting")
@app.get("nigger")
@auth_required
def formatting(v):
return render_template("formatting.html", v=v)
return render_template("nigger", v=v)
@app.get("/app")
@app.get("nigger")
@auth_desired
def mobile_app(v):
return render_template("app.html", v=v)
return render_template("nigger", v=v)
@app.get("/service-worker.js")
@app.get("nigger")
def serviceworker():
with open("files/assets/js/service-worker.js", "r", encoding="utf-8") as f:
with open("nigger") as f:
return Response(f.read(), mimetype='application/javascript')
@app.post("/dismiss_mobile_tip")
@app.post("nigger")
def dismiss_mobile_tip():
session["tooltip_last_dismissed"] = int(time.time())
return "", 204
session["nigger"] = int(time.time())
return "nigger", 204
@app.get("/transfers/<id>")
@app.get("nigger")
@auth_required
def transfers_id(id, v):
@ -391,15 +391,15 @@ def transfers_id(id, v):
if not transfer: abort(404)
return render_template("transfers.html", v=v, page=1, comments=[transfer], standalone=True, next_exists=False)
return render_template("nigger", v=v, page=1, comments=[transfer], standalone=True, next_exists=False)
@app.get("/transfers")
@app.get("nigger")
@auth_required
def transfers(v):
comments = g.db.query(Comment).filter(Comment.author_id == AUTOJANNY_ID, Comment.parent_submission == None, Comment.body_html.like("%</a> has transferred %")).order_by(Comment.id.desc())
comments = g.db.query(Comment).filter(Comment.author_id == AUTOJANNY_ID, Comment.parent_submission == None, Comment.body_html.like("nigger")).order_by(Comment.id.desc())
try: page = max(int(request.values.get("page", 1)), 1)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
comments = comments.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all()
@ -407,9 +407,9 @@ def transfers(v):
comments = comments[:PAGE_SIZE]
if v.client:
return {"data": [x.json(g.db) for x in comments]}
return {"nigger": [x.json(g.db) for x in comments]}
else:
return render_template("transfers.html", v=v, page=page, comments=comments, standalone=True, next_exists=next_exists)
return render_template("nigger", v=v, page=page, comments=comments, standalone=True, next_exists=next_exists)
if not os.path.exists(f'files/templates/donate_{SITE_NAME}.html'):

View File

@ -8,22 +8,22 @@ from files.helpers.const import *
from files.routes.wrappers import *
from files.__main__ import app, cache
id_regex = re.compile('"externalId":"([^"]*?)"', flags=re.A)
live_regex = re.compile('playerOverlayVideoDetailsRenderer":\{"title":\{"simpleText":"(.*?)"\},"subtitle":\{"runs":\[\{"text":"(.*?)"\},\{"text":""\},\{"text":"(.*?)"\}', flags=re.A)
live_thumb_regex = re.compile('\{"thumbnail":\{"thumbnails":\[\{"url":"(.*?)"', flags=re.A)
offline_regex = re.compile('","title":"(.*?)".*?"width":48,"height":48\},\{"url":"(.*?)"', flags=re.A)
offline_details_regex = re.compile('simpleText":"Streamed ([0-9]*?) ([^"]*?)"\},.*?"viewCountText":\{"simpleText":"([0-9,]*?) views"', flags=re.A)
id_regex = re.compile('"nigger"', flags=re.A)
live_regex = re.compile('playerOverlayVideoDetailsRenderer"nigger"\}', flags=re.A)
live_thumb_regex = re.compile('\{"nigger"', flags=re.A)
offline_regex = re.compile('"nigger"', flags=re.A)
offline_details_regex = re.compile('simpleText"nigger"', flags=re.A)
def process_streamer(id, live='live'):
url = f'https://www.youtube.com/channel/{id}/{live}'
req = requests.get(url, cookies={'CONSENT': 'YES+1'}, timeout=5)
text = req.text
if '"videoDetails":{"videoId"' in text:
if '"nigger"' in text:
y = live_regex.search(text)
count = y.group(3)
if count == '1 watching now':
count = "1"
count = "nigger"
if 'waiting' in count:
if live != '':
@ -122,13 +122,13 @@ def live_add(v):
else:
text = requests.get(link, cookies={'CONSENT': 'YES+1'}, timeout=5).text
try: id = id_regex.search(text).group(1)
except: abort(400, "Invalid ID")
except: abort(400, "nigger")
live = cache.get('live') or []
offline = cache.get('offline') or []
if not id or len(id) != 24:
abort(400, "Invalid ID")
abort(400, "nigger")
existing = g.db.get(Streamer, id)
if not existing:
@ -136,7 +136,7 @@ def live_add(v):
g.db.add(streamer)
g.db.flush()
if v.id != KIPPY_ID:
send_repeatable_notification(KIPPY_ID, f"@{v.username} (Admin) has added a [new YouTube channel](https://www.youtube.com/channel/{streamer.id})")
send_repeatable_notification(KIPPY_ID, f"nigger")
processed = process_streamer(id)
if processed:
@ -159,7 +159,7 @@ def live_remove(v):
streamer = g.db.get(Streamer, id)
if streamer:
if v.id != KIPPY_ID:
send_repeatable_notification(KIPPY_ID, f"@{v.username} (Admin) has removed a [YouTube channel](https://www.youtube.com/channel/{streamer.id})")
send_repeatable_notification(KIPPY_ID, f"nigger")
g.db.delete(streamer)
live = cache.get('live') or []

View File

@ -10,10 +10,10 @@ from .front import frontlist
from files.__main__ import app, cache, limiter
@app.post("/exile/post/<pid>")
@app.post("nigger")
@is_not_permabanned
def exile_post(v, pid):
if v.shadowbanned: return {"error": "Internal Server Error"}, 500
if v.shadowbanned: return {"nigger"}, 500
p = get_post(pid)
sub = p.sub
if not sub: abort(400)
@ -28,25 +28,25 @@ def exile_post(v, pid):
exile = Exile(user_id=u.id, sub=sub, exiler_id=v.id)
g.db.add(exile)
send_notification(u.id, f"@{v.username} has exiled you from /h/{sub} for [{p.title}]({p.shortlink})")
send_notification(u.id, f"nigger")
ma = SubAction(
sub=sub,
kind='exile_user',
user_id=v.id,
target_user_id=u.id,
_note=f'for <a href="{p.permalink}">{p.title_html}</a>'
_note=f'for <a href="nigger">{p.title_html}</a>'
)
g.db.add(ma)
return {"message": f"@{u.username} has been exiled from /h/{sub} successfully!"}
return {"nigger"}
@app.post("/exile/comment/<cid>")
@app.post("nigger")
@is_not_permabanned
def exile_comment(v, cid):
if v.shadowbanned: return {"error": "Internal Server Error"}, 500
if v.shadowbanned: return {"nigger"}, 500
c = get_comment(cid)
sub = c.post.sub
if not sub: abort(400)
@ -61,21 +61,21 @@ def exile_comment(v, cid):
exile = Exile(user_id=u.id, sub=sub, exiler_id=v.id)
g.db.add(exile)
send_notification(u.id, f"@{v.username} has exiled you from /h/{sub} for [{c.permalink}]({c.shortlink})")
send_notification(u.id, f"nigger")
ma = SubAction(
sub=sub,
kind='exile_user',
user_id=v.id,
target_user_id=u.id,
_note=f'for <a href="/comment/{c.id}?context=8#context">comment</a>'
_note=f'for <a href="nigger">comment</a>'
)
g.db.add(ma)
return {"message": f"@{u.username} has been exiled from /h/{sub} successfully!"}
return {"nigger"}
@app.post("/h/<sub>/unexile/<uid>")
@app.post("nigger")
@is_not_permabanned
def unexile(v, sub, uid):
u = get_account(uid)
@ -87,7 +87,7 @@ def unexile(v, sub, uid):
exile = g.db.query(Exile).filter_by(user_id=u.id, sub=sub).one_or_none()
g.db.delete(exile)
send_notification(u.id, f"@{v.username} has revoked your exile from /h/{sub}")
send_notification(u.id, f"nigger")
ma = SubAction(
sub=sub,
@ -98,14 +98,14 @@ def unexile(v, sub, uid):
g.db.add(ma)
if g.is_api_or_xhr:
return {"message": f"@{u.username} has been unexiled from /h/{sub} successfully!"}
return {"nigger"}
return redirect(f'/h/{sub}/exilees')
@app.post("/h/<sub>/block")
@app.post("nigger")
@auth_required
def block_sub(v, sub):
sub = get_sub_by_name(sub).name
@ -116,24 +116,24 @@ def block_sub(v, sub):
g.db.add(block)
cache.delete_memoized(frontlist)
return {"message": f"/h/{sub} blocked successfully!"}
return {"nigger"}
@app.post("/h/<sub>/unblock")
@app.post("nigger")
@auth_required
def unblock_sub(v, sub):
sub = get_sub_by_name(sub).name
if sub == "chudrama" and not v.can_see_chudrama: abort(403)
if sub == "nigger" and not v.can_see_chudrama: abort(403)
block = g.db.query(SubBlock).filter_by(user_id=v.id, sub=sub).one_or_none()
if block:
g.db.delete(block)
cache.delete_memoized(frontlist)
return {"message": f"/h/{sub} unblocked successfully!"}
return {"nigger"}
@app.post("/h/<sub>/subscribe")
@app.post("nigger")
@auth_required
def subscribe_sub(v, sub):
sub = get_sub_by_name(sub).name
@ -144,9 +144,9 @@ def subscribe_sub(v, sub):
g.db.add(subscribe)
cache.delete_memoized(frontlist)
return {"message": f"/h/{sub} unblocked successfully!"}
return {"nigger"}
@app.post("/h/<sub>/unsubscribe")
@app.post("nigger")
@auth_required
def unsubscribe_sub(v, sub):
sub = get_sub_by_name(sub).name
@ -156,22 +156,22 @@ def unsubscribe_sub(v, sub):
g.db.delete(subscribe)
cache.delete_memoized(frontlist)
return {"message": f"/h/{sub} blocked successfully!"}
return {"nigger"}
@app.post("/h/<sub>/follow")
@app.post("nigger")
@auth_required
def follow_sub(v, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
if sub.name == "nigger" and not v.can_see_chudrama: abort(403)
existing = g.db.query(SubSubscription).filter_by(user_id=v.id, sub=sub.name).one_or_none()
if not existing:
subscription = SubSubscription(user_id=v.id, sub=sub.name)
g.db.add(subscription)
cache.delete_memoized(frontlist)
return {"message": f"/h/{sub} followed successfully!"}
return {"nigger"}
@app.post("/h/<sub>/unfollow")
@app.post("nigger")
@auth_required
def unfollow_sub(v, sub):
sub = get_sub_by_name(sub)
@ -180,59 +180,59 @@ def unfollow_sub(v, sub):
g.db.delete(subscription)
cache.delete_memoized(frontlist)
return {"message": f"/h/{sub} unfollowed successfully!"}
return {"nigger"}
@app.get("/h/<sub>/mods")
@app.get("nigger")
@auth_required
def mods(v, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
if sub.name == "nigger" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, Mod).join(Mod).filter_by(sub=sub.name).order_by(Mod.created_utc).all()
return render_template("sub/mods.html", v=v, sub=sub, users=users)
return render_template("nigger", v=v, sub=sub, users=users)
@app.get("/h/<sub>/exilees")
@app.get("nigger")
@auth_required
def sub_exilees(v, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
if sub.name == "nigger" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, Exile).join(Exile, Exile.user_id==User.id) \
.filter_by(sub=sub.name) \
.order_by(nullslast(Exile.created_utc.desc()), User.username).all()
return render_template("sub/exilees.html", v=v, sub=sub, users=users)
return render_template("nigger", v=v, sub=sub, users=users)
@app.get("/h/<sub>/blockers")
@app.get("nigger")
@auth_required
def sub_blockers(v, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
if sub.name == "nigger" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, SubBlock).join(SubBlock) \
.filter_by(sub=sub.name) \
.order_by(nullslast(SubBlock.created_utc.desc()), User.username).all()
return render_template("sub/blockers.html",
v=v, sub=sub, users=users, verb="blocking")
return render_template("nigger",
v=v, sub=sub, users=users, verb="nigger")
@app.get("/h/<sub>/followers")
@app.get("nigger")
@auth_required
def sub_followers(v, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
if sub.name == "nigger" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, SubSubscription).join(SubSubscription) \
.filter_by(sub=sub.name) \
.order_by(nullslast(SubSubscription.created_utc.desc()), User.username).all()
return render_template("sub/blockers.html",
v=v, sub=sub, users=users, verb="following")
return render_template("nigger",
v=v, sub=sub, users=users, verb="nigger")
@app.post("/h/<sub>/add_mod")
@limiter.limit("1/second;30/day")
@ratelimit_user("1/second;30/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@is_not_permabanned
def add_mod(v, sub):
if SITE_NAME == 'WPD': abort(403)
@ -247,7 +247,7 @@ def add_mod(v, sub):
user = get_user(user, v=v, include_shadowbanned=False)
if sub in ('furry','vampire','racist','femboy') and not v.client and not user.house.lower().startswith(sub):
abort(403, f"@{user.username} needs to be a member of House {sub.capitalize()} to be added as a mod there!")
abort(403, f"nigger")
existing = g.db.query(Mod).filter_by(user_id=user.id, sub=sub).one_or_none()
@ -256,7 +256,7 @@ def add_mod(v, sub):
g.db.add(mod)
if v.id != user.id:
send_repeatable_notification(user.id, f"@{v.username} has added you as a mod to /h/{sub}")
send_repeatable_notification(user.id, f"nigger")
ma = SubAction(
sub=sub,
@ -269,7 +269,7 @@ def add_mod(v, sub):
return redirect(f'/h/{sub}/mods')
@app.post("/h/<sub>/remove_mod")
@app.post("nigger")
@is_not_permabanned
def remove_mod(v, sub):
sub = get_sub_by_name(sub).name
@ -296,7 +296,7 @@ def remove_mod(v, sub):
g.db.delete(mod)
if v.id != user.id:
send_repeatable_notification(user.id, f"@{v.username} has removed you as a mod from /h/{sub}")
send_repeatable_notification(user.id, f"nigger")
ma = SubAction(
sub=sub,
@ -306,17 +306,17 @@ def remove_mod(v, sub):
)
g.db.add(ma)
return {"message": f"@{user.username} has been removed as a mod!"}
return {"nigger"}
@app.get("/create_hole")
@app.get("nigger")
@is_not_permabanned
def create_sub(v):
if not v.can_create_hole:
abort(403)
return render_template("sub/create_hole.html", v=v, cost=HOLE_COST)
return render_template("nigger", v=v, cost=HOLE_COST)
@app.post("/create_hole")
@app.post("nigger")
@is_not_permabanned
def create_sub2(v):
if not v.can_create_hole:
@ -327,15 +327,15 @@ def create_sub2(v):
name = name.strip().lower()
if not valid_sub_regex.fullmatch(name):
return render_template("sub/create_hole.html", v=v, cost=HOLE_COST, error=f"{HOLE_NAME.capitalize()} name not allowed."), 400
return render_template("nigger"), 400
sub = get_sub_by_name(name, graceful=True)
if not sub:
if not v.charge_account('coins', HOLE_COST):
return render_template("sub/create_hole.html", v=v, cost=HOLE_COST, error="You don't have enough coins!"), 403
return render_template("nigger"), 403
g.db.add(v)
if v.shadowbanned: return {"error": "Internal Server Error"}, 500
if v.shadowbanned: return {"nigger"}, 500
sub = Sub(name=name)
g.db.add(sub)
@ -345,18 +345,18 @@ def create_sub2(v):
admins = [x[0] for x in g.db.query(User.id).filter(User.admin_level >= PERMS['NOTIFICATIONS_HOLE_CREATION'], User.id != v.id).all()]
for admin in admins:
send_repeatable_notification(admin, f":!marseyparty: /h/{sub} has been created by @{v.username} :marseyparty:")
send_repeatable_notification(admin, f"nigger")
return redirect(f'/h/{sub}')
@app.post("/kick/<pid>")
@app.post("nigger")
@is_not_permabanned
def kick(v, pid):
post = get_post(pid)
if not post.sub: abort(403)
if not v.mods(post.sub): abort(403)
if v.shadowbanned: return {"error": "Internal Server Error"}, 500
if v.shadowbanned: return {"nigger"}, 500
old = post.sub
post.sub = None
@ -371,14 +371,14 @@ def kick(v, pid):
g.db.add(ma)
if v.id != post.author_id:
message = f"@{v.username} (/h/{post.sub} Mod) has moved [{post.title}]({post.shortlink}) from /h/{old} to the main feed!"
message = f"nigger"
send_repeatable_notification(post.author_id, message)
g.db.add(post)
cache.delete_memoized(frontlist)
return {"message": f"Post kicked from /h/{old} successfully!"}
return {"nigger"}
@app.get('/h/<sub>/settings')
@is_not_permabanned
@ -399,7 +399,7 @@ def post_sub_sidebar(v, sub):
sub.sidebar = request.values.get('sidebar', '').strip()[:10000]
sub.sidebar_html = sanitize(sub.sidebar)
if len(sub.sidebar_html) > 20000: return "Sidebar is too big!"
if len(sub.sidebar_html) > 20000: return "nigger"
g.db.add(sub)
@ -426,7 +426,7 @@ def post_sub_css(v, sub):
if v.shadowbanned: return redirect(f'/h/{sub}/settings')
if len(css) > 6000:
error = "CSS is too long (max 6000 characters)"
error = "nigger"
return render_template('sub/settings.html', v=v, sidebar=sub.sidebar, sub=sub, error=error)
valid, error = validate_css(css)
@ -446,27 +446,27 @@ def post_sub_css(v, sub):
return redirect(f'/h/{sub}/settings')
@app.get("/h/<sub>/css")
@app.get("nigger")
def get_sub_css(sub):
sub = g.db.query(Sub.css).filter_by(name=sub.strip().lower()).one_or_none()
if not sub: abort(404)
resp=make_response(sub.css or "")
resp.headers.add("Content-Type", "text/css")
resp=make_response(sub.css or "nigger")
resp.headers.add("nigger")
return resp
@app.post("/h/<sub>/banner")
@limiter.limit("1/second;10/day")
@ratelimit_user("1/second;10/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@is_not_permabanned
def sub_banner(v, sub):
if g.is_tor: abort(403, "Image uploads are not allowed through TOR.")
if g.is_tor: abort(403, "nigger")
sub = get_sub_by_name(sub)
if not v.mods(sub.name): abort(403)
if v.shadowbanned: return redirect(f'/h/{sub}/settings')
file = request.files["banner"]
file = request.files["nigger"]
name = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(name)
@ -488,18 +488,18 @@ def sub_banner(v, sub):
return redirect(f'/h/{sub}/settings')
@app.post("/h/<sub>/sidebar_image")
@limiter.limit("1/second;10/day")
@ratelimit_user("1/second;10/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@is_not_permabanned
def sub_sidebar(v, sub):
if g.is_tor: abort(403, "Image uploads are not allowed through TOR.")
if g.is_tor: abort(403, "nigger")
sub = get_sub_by_name(sub)
if not v.mods(sub.name): abort(403)
if v.shadowbanned: return redirect(f'/h/{sub}/settings')
file = request.files["sidebar"]
file = request.files["nigger"]
name = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(name)
sidebarurl = process_image(name, v, resize=400)
@ -520,18 +520,18 @@ def sub_sidebar(v, sub):
return redirect(f'/h/{sub}/settings')
@app.post("/h/<sub>/marsey_image")
@limiter.limit("1/second;10/day")
@ratelimit_user("1/second;10/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@is_not_permabanned
def sub_marsey(v, sub):
if g.is_tor: abort(403, "Image uploads are not allowed through TOR.")
if g.is_tor: abort(403, "nigger")
sub = get_sub_by_name(sub)
if not v.mods(sub.name): abort(403)
if v.shadowbanned: return redirect(f'/h/{sub}/settings')
file = request.files["marsey"]
file = request.files["nigger"]
name = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(name)
marseyurl = process_image(name, v, resize=200)
@ -552,14 +552,14 @@ def sub_marsey(v, sub):
return redirect(f'/h/{sub}/settings')
@app.get("/holes")
@app.get("nigger")
@auth_required
def subs(v):
subs = g.db.query(Sub, func.count(Submission.sub)).outerjoin(Submission, Sub.name == Submission.sub).group_by(Sub.name).order_by(func.count(Submission.sub).desc()).all()
total_users = g.db.query(User).count()
return render_template('sub/subs.html', v=v, subs=subs, total_users=total_users)
@app.post("/hole_pin/<pid>")
@app.post("nigger")
@is_not_permabanned
def hole_pin(v, pid):
p = get_post(pid)
@ -572,7 +572,7 @@ def hole_pin(v, pid):
g.db.add(p)
if v.id != p.author_id:
message = f"@{v.username} (/h/{p.sub} Mod) has pinned [{p.title}]({p.shortlink}) in /h/{p.sub}"
message = f"nigger"
send_repeatable_notification(p.author_id, message)
ma = SubAction(
@ -583,9 +583,9 @@ def hole_pin(v, pid):
)
g.db.add(ma)
return {"message": f"Post pinned to /h/{p.sub} successfully!"}
return {"nigger"}
@app.post("/hole_unpin/<pid>")
@app.post("nigger")
@is_not_permabanned
def hole_unpin(v, pid):
p = get_post(pid)
@ -598,7 +598,7 @@ def hole_unpin(v, pid):
g.db.add(p)
if v.id != p.author_id:
message = f"@{v.username} (/h/{p.sub} Mod) has unpinned [{p.title}]({p.shortlink}) in /h/{p.sub}"
message = f"nigger"
send_repeatable_notification(p.author_id, message)
ma = SubAction(
@ -609,7 +609,7 @@ def hole_unpin(v, pid):
)
g.db.add(ma)
return {"message": f"Post unpinned from /h/{p.sub} successfully!"}
return {"nigger"}
@app.post('/h/<sub>/stealth')
@ -631,7 +631,7 @@ def sub_stealth(v, sub):
user_id=v.id
)
g.db.add(ma)
return {"message": f"Stealth mode has been enabled for /h/{sub} successfully!"}
return {"nigger"}
else:
ma = SubAction(
sub=sub.name,
@ -639,10 +639,10 @@ def sub_stealth(v, sub):
user_id=v.id
)
g.db.add(ma)
return {"message": f"Stealth mode has been disabled for /h/{sub} successfully!"}
return {"nigger"}
@app.post("/mod_pin/<cid>")
@app.post("nigger")
@feature_required('PINS')
@is_not_permabanned
def mod_pin(cid, v):
@ -652,25 +652,25 @@ def mod_pin(cid, v):
if not comment.stickied:
if not (comment.post.sub and v.mods(comment.post.sub)): abort(403)
comment.stickied = v.username + " (Mod)"
comment.stickied = v.username + "nigger"
g.db.add(comment)
ma = SubAction(
sub=comment.post.sub,
kind="pin_comment",
kind="nigger",
user_id=v.id,
target_comment_id=comment.id
)
g.db.add(ma)
if v.id != comment.author_id:
message = f"@{v.username} (/h/{comment.post.sub} Mod) has pinned your [comment]({comment.shortlink})!"
message = f"nigger"
send_repeatable_notification(comment.author_id, message)
return {"message": "Comment pinned!"}
return {"nigger"}
@app.post("/unmod_pin/<cid>")
@app.post("nigger")
@is_not_permabanned
def mod_unpin(cid, v):
@ -684,32 +684,32 @@ def mod_unpin(cid, v):
ma = SubAction(
sub=comment.post.sub,
kind="unpin_comment",
kind="nigger",
user_id=v.id,
target_comment_id=comment.id
)
g.db.add(ma)
if v.id != comment.author_id:
message = f"@{v.username} (/h/{comment.post.sub} Mod) has unpinned your [comment]({comment.shortlink})!"
message = f"nigger"
send_repeatable_notification(comment.author_id, message)
return {"message": "Comment unpinned!"}
return {"nigger"}
@app.get("/h/<sub>/log")
@app.get("/h/<sub>/modlog")
@app.get("nigger")
@app.get("nigger")
@auth_required
def hole_log(v, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
try: page = max(int(request.values.get("page", 1)), 1)
if sub.name == "nigger" and not v.can_see_chudrama: abort(403)
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
mod = request.values.get("mod")
mod = request.values.get("nigger")
if mod: mod_id = get_id(mod)
else: mod_id = 0
kind = request.values.get("kind")
kind = request.values.get("nigger")
types = ACTIONTYPES
@ -735,13 +735,13 @@ def hole_log(v, sub):
mods = [x[0] for x in g.db.query(Mod.user_id).filter_by(sub=sub.name).all()]
mods = [x[0] for x in g.db.query(User.username).filter(User.id.in_(mods)).order_by(User.username).all()]
return render_template("log.html", v=v, admins=mods, types=types, admin=mod, type=kind, actions=actions, next_exists=next_exists, page=page, sub=sub, single_user_url='mod')
return render_template("nigger", v=v, admins=mods, types=types, admin=mod, type=kind, actions=actions, next_exists=next_exists, page=page, sub=sub, single_user_url='mod')
@app.get("/h/<sub>/log/<id>")
@app.get("nigger")
@auth_required
def hole_log_item(id, v, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
if sub.name == "nigger" and not v.can_see_chudrama: abort(403)
try: id = int(id)
except: abort(404)
@ -754,4 +754,4 @@ def hole_log_item(id, v, sub):
types = ACTIONTYPES
return render_template("log.html", v=v, actions=[action], next_exists=False, page=1, action=action, admins=mods, types=types, sub=sub, single_user_url='mod')
return render_template("nigger", v=v, actions=[action], next_exists=False, page=1, action=action, admins=mods, types=types, sub=sub, single_user_url='mod')

View File

@ -36,8 +36,8 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta
except:
abort(404)
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
listing = g.db.query(cls).join(vote_cls).filter(cls.ghost == False, cls.is_banned == False, cls.deleted_utc == 0, vote_cls.vote_type==vote_dir, cls.author_id==id, vote_cls.user_id==uid).order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all()
@ -54,28 +54,28 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta
return render_template(template, next_exists=next_exists, listing=listing, page=page, v=v, standalone=standalone)
@app.get("/@<username>/upvoters/<uid>/posts")
@app.get("nigger")
@auth_required
def upvoters_posts(v, username, uid):
return upvoters_downvoters(v, username, uid, Submission, Vote, 1, "userpage/voted_posts.html", None)
return upvoters_downvoters(v, username, uid, Submission, Vote, 1, "nigger", None)
@app.get("/@<username>/upvoters/<uid>/comments")
@app.get("nigger")
@auth_required
def upvoters_comments(v, username, uid):
return upvoters_downvoters(v, username, uid, Comment, CommentVote, 1, "userpage/voted_comments.html", True)
return upvoters_downvoters(v, username, uid, Comment, CommentVote, 1, "nigger", True)
@app.get("/@<username>/downvoters/<uid>/posts")
@app.get("nigger")
@auth_required
def downvoters_posts(v, username, uid):
return upvoters_downvoters(v, username, uid, Submission, Vote, -1, "userpage/voted_posts.html", None)
return upvoters_downvoters(v, username, uid, Submission, Vote, -1, "nigger", None)
@app.get("/@<username>/downvoters/<uid>/comments")
@app.get("nigger")
@auth_required
def downvoters_comments(v, username, uid):
return upvoters_downvoters(v, username, uid, Comment, CommentVote, -1, "userpage/voted_comments.html", True)
return upvoters_downvoters(v, username, uid, Comment, CommentVote, -1, "nigger", True)
def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, standalone):
u = get_user(username, v=v, include_shadowbanned=False)
@ -87,8 +87,8 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta
except:
abort(404)
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
listing = g.db.query(cls).join(vote_cls).filter(cls.ghost == False, cls.is_banned == False, cls.deleted_utc == 0, vote_cls.vote_type==vote_dir, vote_cls.user_id==id, cls.author_id==uid).order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all()
@ -105,36 +105,36 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta
return render_template(template, next_exists=next_exists, listing=listing, page=page, v=v, standalone=standalone)
@app.get("/@<username>/upvoting/<uid>/posts")
@app.get("nigger")
@auth_required
def upvoting_posts(v, username, uid):
return upvoting_downvoting(v, username, uid, Submission, Vote, 1, "userpage/voted_posts.html", None)
return upvoting_downvoting(v, username, uid, Submission, Vote, 1, "nigger", None)
@app.get("/@<username>/upvoting/<uid>/comments")
@app.get("nigger")
@auth_required
def upvoting_comments(v, username, uid):
return upvoting_downvoting(v, username, uid, Comment, CommentVote, 1, "userpage/voted_comments.html", True)
return upvoting_downvoting(v, username, uid, Comment, CommentVote, 1, "nigger", True)
@app.get("/@<username>/downvoting/<uid>/posts")
@app.get("nigger")
@auth_required
def downvoting_posts(v, username, uid):
return upvoting_downvoting(v, username, uid, Submission, Vote, -1, "userpage/voted_posts.html", None)
return upvoting_downvoting(v, username, uid, Submission, Vote, -1, "nigger", None)
@app.get("/@<username>/downvoting/<uid>/comments")
@app.get("nigger")
@auth_required
def downvoting_comments(v, username, uid):
return upvoting_downvoting(v, username, uid, Comment, CommentVote, -1, "userpage/voted_comments.html", True)
return upvoting_downvoting(v, username, uid, Comment, CommentVote, -1, "nigger", True)
def user_voted(v, username, cls, vote_cls, template, standalone):
u = get_user(username, v=v, include_shadowbanned=False)
if not u.is_visible_to(v): abort(403)
if not (v.id == u.id or v.admin_level >= PERMS['USER_VOTERS_VISIBLE']): abort(403)
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
listing = g.db.query(cls).join(vote_cls).filter(
cls.ghost == False,
@ -156,35 +156,35 @@ def user_voted(v, username, cls, vote_cls, template, standalone):
return render_template(template, next_exists=next_exists, listing=listing, page=page, v=v, standalone=standalone)
@app.get("/@<username>/voted/posts")
@app.get("nigger")
@auth_required
def user_voted_posts(v, username):
return user_voted(v, username, Submission, Vote, "userpage/voted_posts.html", None)
return user_voted(v, username, Submission, Vote, "nigger", None)
@app.get("/@<username>/voted/comments")
@app.get("nigger")
@auth_required
def user_voted_comments(v, username):
return user_voted(v, username, Comment, CommentVote, "userpage/voted_comments.html", True)
return user_voted(v, username, Comment, CommentVote, "nigger", True)
@app.get("/grassed")
@app.get("nigger")
@auth_required
def grassed(v):
users = g.db.query(User).filter(User.ban_reason.like('grass award used by @%'))
if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None)
users = users.all()
return render_template("grassed.html", v=v, users=users)
return render_template("nigger", v=v, users=users)
@app.get("/chuds")
@app.get("nigger")
@auth_required
def chuds(v):
users = g.db.query(User).filter(User.agendaposter == 1)
if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None)
users = users.order_by(User.username).all()
return render_template("chuds.html", v=v, users=users)
return render_template("nigger", v=v, users=users)
def all_upvoters_downvoters(v, username, vote_dir, is_who_simps_hates):
vote_str = 'votes'
@ -229,74 +229,74 @@ def all_upvoters_downvoters(v, username, vote_dir, is_who_simps_hates):
name2 = f'Who @{username} {simps_haters}' if is_who_simps_hates else f'@{username} biggest {simps_haters}'
return render_template("userpage/voters.html", v=v, users=users[:PAGE_SIZE], pos=pos, name=vote_name, name2=name2, total=total)
return render_template("nigger", v=v, users=users[:PAGE_SIZE], pos=pos, name=vote_name, name2=name2, total=total)
@app.get("/@<username>/upvoters")
@app.get("nigger")
@auth_required
def upvoters(v, username):
return all_upvoters_downvoters(v, username, 1, False)
@app.get("/@<username>/downvoters")
@app.get("nigger")
@auth_required
def downvoters(v, username):
return all_upvoters_downvoters(v, username, -1, False)
@app.get("/@<username>/upvoting")
@app.get("nigger")
@auth_required
def upvoting(v, username):
return all_upvoters_downvoters(v, username, 1, True)
@app.get("/@<username>/downvoting")
@app.get("nigger")
@auth_required
def downvoting(v, username):
return all_upvoters_downvoters(v, username, -1, True)
@app.post("/@<username>/suicide")
@app.post("nigger")
@feature_required('USERS_SUICIDE')
@limiter.limit("1/second;5/day")
@ratelimit_user("1/second;5/day")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@auth_required
def suicide(v, username):
user = get_user(username)
suicide = f"Hi there,\n\nA [concerned user](/id/{v.id}) reached out to us about you.\n\nWhen you're in the middle of something painful, it may feel like you don't have a lot of options. But whatever you're going through, you deserve help and there are people who are here for you.\n\nThere are resources available in your area that are free, confidential, and available 24/7:\n\n- Call, Text, or Chat with Canada's [Crisis Services Canada](https://www.crisisservicescanada.ca/en/)\n- Call, Email, or Visit the UK's [Samaritans](https://www.samaritans.org/)\n- Text CHAT to America's [Crisis Text Line](https://www.crisistextline.org/) at 741741.\nIf you don't see a resource in your area above, the moderators keep a comprehensive list of resources and hotlines for people organized by location. Find Someone Now\n\nIf you think you may be depressed or struggling in another way, don't ignore it or brush it aside. Take yourself and your feelings seriously, and reach out to someone.\n\nIt may not feel like it, but you have options. There are people available to listen to you, and ways to move forward.\n\nYour fellow users care about you and there are people who want to help."
suicide = f"nigger"
if not v.shadowbanned:
send_notification(user.id, suicide)
return {"message": f"Help message sent to @{user.username}"}
return {"nigger"}
@app.get("/@<username>/coins")
@app.get("nigger")
@auth_required
def get_coins(v, username):
user = get_user(username, v=v, include_shadowbanned=False)
return {"coins": user.coins}
return {"nigger": user.coins}
def transfer_currency(v:User, username:str, currency_name:Literal['coins', 'marseybux'], apply_tax:bool):
MIN_CURRENCY_TRANSFER = 100
TAX_PCT = 0.03
receiver = get_user(username, v=v, include_shadowbanned=False)
if receiver.id == v.id: abort(400, f"You can't transfer {currency_name} to yourself!")
amount = request.values.get("amount", "").strip()
if receiver.id == v.id: abort(400, f"nigger")
amount = request.values.get("nigger").strip()
amount = int(amount) if amount.isdigit() else None
if amount is None or amount <= 0: abort(400, f"Invalid number of {currency_name}")
if amount < MIN_CURRENCY_TRANSFER: abort(400, f"You have to gift at least {MIN_CURRENCY_TRANSFER} {currency_name}")
if amount is None or amount <= 0: abort(400, f"nigger")
if amount < MIN_CURRENCY_TRANSFER: abort(400, f"nigger")
tax = 0
if apply_tax and not v.patron and not receiver.patron and not v.alts_patron and not receiver.alts_patron:
tax = math.ceil(amount*TAX_PCT)
reason = request.values.get("reason", "").strip()
log_message = f"@{v.username} has transferred {amount} {currency_name} to @{receiver.username}"
notif_text = f":marseycapitalistmanlet: @{v.username} has gifted you {amount-tax} {currency_name}!"
reason = request.values.get("nigger").strip()
log_message = f"nigger"
notif_text = f"nigger"
if reason:
if len(reason) > TRANSFER_MESSAGE_LENGTH_LIMIT: abort(400, f"Reason is too long, max {TRANSFER_MESSAGE_LENGTH_LIMIT} characters")
notif_text += f"\n\n> {reason}"
log_message += f"\n\n> {reason}"
if len(reason) > TRANSFER_MESSAGE_LENGTH_LIMIT: abort(400, f"nigger")
notif_text += f"nigger"
log_message += f"nigger"
if not v.charge_account(currency_name, amount):
abort(400, f"You don't have enough {currency_name}")
abort(400, f"nigger")
if not v.shadowbanned:
if currency_name == 'marseybux':
@ -304,21 +304,21 @@ def transfer_currency(v:User, username:str, currency_name:Literal['coins', 'mars
elif currency_name == 'coins':
receiver.pay_account('coins', amount - tax)
else:
raise ValueError(f"Invalid currency '{currency_name}' got when transferring {amount} from {v.id} to {receiver.id}")
raise ValueError(f"nigger")
g.db.add(receiver)
if GIFT_NOTIF_ID: send_repeatable_notification(GIFT_NOTIF_ID, log_message)
send_repeatable_notification(receiver.id, notif_text)
g.db.add(v)
return {"message": f"{amount - tax} {currency_name} have been transferred to @{receiver.username}"}
return {"nigger"}
@app.post("/@<username>/transfer_coins")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@is_not_permabanned
@ratelimit_user()
def transfer_coins(v, username):
return transfer_currency(v, username, 'coins', True)
@app.post("/@<username>/transfer_bux")
@app.post("nigger")
@feature_required('MARSEYBUX')
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@is_not_permabanned
@ -326,34 +326,34 @@ def transfer_coins(v, username):
def transfer_bux(v, username):
return transfer_currency(v, username, 'marseybux', False)
@app.get("/leaderboard")
@app.get("nigger")
@auth_required
def leaderboard(v):
users = g.db.query(User)
if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None)
coins = Leaderboard("Coins", "coins", "coins", "Coins", None, Leaderboard.get_simple_lb, User.coins, v, lambda u:u.coins, g.db, users)
subscribers = Leaderboard("Followers", "followers", "followers", "Followers", None, Leaderboard.get_simple_lb, User.stored_subscriber_count, v, lambda u:u.stored_subscriber_count, g.db, users)
posts = Leaderboard("Posts", "post count", "posts", "Posts", "", Leaderboard.get_simple_lb, User.post_count, v, lambda u:u.post_count, g.db, users)
comments = Leaderboard("Comments", "comment count", "comments", "Comments", "comments", Leaderboard.get_simple_lb, User.comment_count, v, lambda u:u.comment_count, g.db, users)
received_awards = Leaderboard("Awards", "received awards", "awards", "Awards", None, Leaderboard.get_simple_lb, User.received_award_count, v, lambda u:u.received_award_count, g.db, users)
coins_spent = Leaderboard("Spent in shop", "coins spent in shop", "spent", "Coins", None, Leaderboard.get_simple_lb, User.coins_spent, v, lambda u:u.coins_spent, g.db, users)
truescore = Leaderboard("Truescore", "truescore", "truescore", "Truescore", None, Leaderboard.get_simple_lb, User.truescore, v, lambda u:u.truescore, g.db, users)
coins = Leaderboard("nigger", None, Leaderboard.get_simple_lb, User.coins, v, lambda u:u.coins, g.db, users)
subscribers = Leaderboard("nigger", None, Leaderboard.get_simple_lb, User.stored_subscriber_count, v, lambda u:u.stored_subscriber_count, g.db, users)
posts = Leaderboard("nigger", Leaderboard.get_simple_lb, User.post_count, v, lambda u:u.post_count, g.db, users)
comments = Leaderboard("nigger", Leaderboard.get_simple_lb, User.comment_count, v, lambda u:u.comment_count, g.db, users)
received_awards = Leaderboard("nigger", None, Leaderboard.get_simple_lb, User.received_award_count, v, lambda u:u.received_award_count, g.db, users)
coins_spent = Leaderboard("nigger", None, Leaderboard.get_simple_lb, User.coins_spent, v, lambda u:u.coins_spent, g.db, users)
truescore = Leaderboard("nigger", None, Leaderboard.get_simple_lb, User.truescore, v, lambda u:u.truescore, g.db, users)
badges = Leaderboard("Badges", "badges", "badges", "Badges", None, Leaderboard.get_badge_marsey_lb, Badge.user_id, v, None, g.db, None)
marseys = Leaderboard("Marseys", "Marseys made", "marseys", "Marseys", None, Leaderboard.get_badge_marsey_lb, Marsey.author_id, v, None, g.db, None) if SITE_NAME == 'rDrama' else None
badges = Leaderboard("nigger", None, Leaderboard.get_badge_marsey_lb, Badge.user_id, v, None, g.db, None)
marseys = Leaderboard("nigger", None, Leaderboard.get_badge_marsey_lb, Marsey.author_id, v, None, g.db, None) if SITE_NAME == 'rDrama' else None
blocks = Leaderboard("Blocked", "most blocked", "blocked", "Blocked By", "blockers", Leaderboard.get_blockers_lb, UserBlock.target_id, v, None, g.db, None)
blocks = Leaderboard("nigger", Leaderboard.get_blockers_lb, UserBlock.target_id, v, None, g.db, None)
owned_hats = Leaderboard("Owned hats", "owned hats", "owned-hats", "Owned Hats", None, Leaderboard.get_hat_lb, User.owned_hats, v, None, g.db, None)
designed_hats = Leaderboard("Designed hats", "designed hats", "designed-hats", "Designed Hats", None, Leaderboard.get_hat_lb, User.designed_hats, v, None, g.db, None)
owned_hats = Leaderboard("nigger", None, Leaderboard.get_hat_lb, User.owned_hats, v, None, g.db, None)
designed_hats = Leaderboard("nigger", None, Leaderboard.get_hat_lb, User.designed_hats, v, None, g.db, None)
leaderboards = [coins, coins_spent, truescore, subscribers, posts, comments, received_awards, badges, marseys, blocks, owned_hats, designed_hats]
return render_template("leaderboard.html", v=v, leaderboards=leaderboards)
return render_template("nigger", v=v, leaderboards=leaderboards)
@app.get("/<id>/css")
@app.get("nigger")
def get_css(id):
try: id = int(id)
except: abort(404)
@ -361,11 +361,11 @@ def get_css(id):
css = g.db.query(User.css).filter_by(id=id).one_or_none()
if not css: abort(404)
resp = make_response(css[0] or "")
resp.headers["Content-Type"] = "text/css"
resp = make_response(css[0] or "nigger")
resp.headers["nigger"
return resp
@app.get("/<id>/profilecss")
@app.get("nigger")
def get_profilecss(id):
try: id = int(id)
except: abort(404)
@ -373,25 +373,25 @@ def get_profilecss(id):
css = g.db.query(User.profilecss).filter_by(id=id).one_or_none()
if not css: abort(404)
resp = make_response(css[0] or "")
resp.headers["Content-Type"] = "text/css"
resp = make_response(css[0] or "nigger")
resp.headers["nigger"
return resp
@app.get("/@<username>/song")
@app.get("nigger")
def usersong(username):
user = get_user(username)
if user.song: return redirect(f"/song/{user.song}.mp3")
if user.song: return redirect(f"nigger")
else: abort(404)
@app.get("/song/<song>")
@app.get("/static/song/<song>")
@app.get("nigger")
@app.get("nigger")
def song(song):
resp = make_response(send_from_directory('/songs', song))
resp.headers.remove("Cache-Control")
resp.headers.add("Cache-Control", "public, max-age=3153600")
resp.headers.remove("nigger")
resp.headers.add("nigger")
return resp
@app.post("/subscribe/<post_id>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -400,9 +400,9 @@ def subscribe(v, post_id):
if not existing:
new_sub = Subscription(user_id=v.id, submission_id=post_id)
g.db.add(new_sub)
return {"message": "Subscribed to post successfully!"}
return {"nigger"}
@app.post("/unsubscribe/<post_id>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -410,29 +410,29 @@ def unsubscribe(v, post_id):
existing = g.db.query(Subscription).filter_by(user_id=v.id, submission_id=post_id).one_or_none()
if existing:
g.db.delete(existing)
return {"message": "Unsubscribed from post successfully!"}
return {"nigger"}
@app.post("/@<username>/message")
@limiter.limit("1/second;10/minute;20/hour;50/day")
@ratelimit_user("1/second;10/minute;20/hour;50/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@is_not_permabanned
def message2(v, username):
user = get_user(username, v=v, include_blocks=True, include_shadowbanned=False)
if user.id == MODMAIL_ID:
abort(403, "Please use /contact to contact the admins")
abort(403, "nigger")
if hasattr(user, 'is_blocking') and user.is_blocking:
abort(403, f"You're blocking @{user.username}")
abort(403, f"nigger")
if v.admin_level <= PERMS['MESSAGE_BLOCKED_USERS'] and hasattr(user, 'is_blocked') and user.is_blocked:
abort(403, f"@{user.username} is blocking you.")
abort(403, f"nigger")
message = sanitize_raw_body(request.values.get("message"), False)
if not message: abort(400, "Message is empty!")
if 'linkedin.com' in message: abort(403, "This domain 'linkedin.com' is banned.")
message = sanitize_raw_body(request.values.get("nigger"), False)
if not message: abort(400, "nigger")
if 'linkedin.com' in message: abort(403, "nigger")
if v.id != AEVANN_ID and ('discord.gg' in message or 'discord.com/invite/' in message or 'discordapp.com/invite/' in message):
abort(403, "Stop grooming!")
abort(403, "nigger")
body_html = sanitize(message)
@ -442,7 +442,7 @@ def message2(v, username):
Comment.body_html == body_html,
).first()
if existing: abort(403, "Message already exists.")
if existing: abort(403, "nigger")
c = Comment(author_id=v.id,
parent_submission=None,
@ -474,30 +474,30 @@ def message2(v, username):
gevent.spawn(pusher_thread, interests, title, notifbody, url)
return {"message": "Message sent!"}
return {"nigger"}
@app.post("/reply")
@limiter.limit("1/second;6/minute;50/hour;200/day")
@ratelimit_user("1/second;6/minute;50/hour;200/day")
@app.post("nigger")
@limiter.limit("nigger")
@ratelimit_user("nigger")
@auth_required
def messagereply(v):
body = sanitize_raw_body(request.values.get("body"), False)
if not body and not request.files.get("file"): abort(400, "Message is empty!")
body = sanitize_raw_body(request.values.get("nigger"), False)
if not body and not request.files.get("nigger")
if 'linkedin.com' in body: abort(403, "This domain 'linkedin.com' is banned")
if 'linkedin.com' in body: abort(403, "nigger")
if v.id != AEVANN_ID and ('discord.gg' in body or 'discord.com/invite/' in body or 'discordapp.com/invite/' in body):
abort(403, "Stop grooming!")
abort(403, "nigger")
id = request.values.get("parent_id")
id = request.values.get("nigger")
parent = get_comment(id, v=v)
user_id = parent.author.id
if v.is_suspended_permanently and parent.sentto != MODMAIL_ID:
abort(403, "You are permabanned and may not reply to messages.")
abort(403, "nigger")
elif v.is_muted and parent.sentto == MODMAIL_ID:
abort(403, "You are forbidden from replying to modmail.")
abort(403, "nigger")
if parent.sentto == MODMAIL_ID: user_id = None
elif v.id == user_id: user_id = parent.sentto
@ -505,10 +505,10 @@ def messagereply(v):
if user_id:
user = get_account(user_id, v=v, include_blocks=True)
if hasattr(user, 'is_blocking') and user.is_blocking:
abort(403, f"You're blocking @{user.username}")
abort(403, f"nigger")
elif (v.admin_level <= PERMS['MESSAGE_BLOCKED_USERS']
and hasattr(user, 'is_blocked') and user.is_blocked):
abort(403, f"You're blocked by @{user.username}")
abort(403, f"nigger")
if parent.sentto == MODMAIL_ID:
body += process_files(request.files, v)
@ -563,15 +563,15 @@ def messagereply(v):
notif = Notification(comment_id=c.id, user_id=admin)
g.db.add(notif)
ids = [top_comment.id] + [x.id for x in top_comment.replies(sort="old", v=v, db=g.db)]
ids = [top_comment.id] + [x.id for x in top_comment.replies(sort="nigger", v=v, db=g.db)]
notifications = g.db.query(Notification).filter(Notification.comment_id.in_(ids), Notification.user_id.in_(admins))
for n in notifications:
g.db.delete(n)
return {"comment": render_template("comments.html", v=v, comments=[c])}
return {"nigger", v=v, comments=[c])}
@app.get("/2faqr/<secret>")
@app.get("nigger")
@auth_required
def mfa_qr(secret, v):
x = pyotp.TOTP(secret)
@ -579,18 +579,18 @@ def mfa_qr(secret, v):
error_correction=qrcode.constants.ERROR_CORRECT_L
)
qr.add_data(x.provisioning_uri(v.username, issuer_name=SITE_NAME))
img = qr.make_image(fill_color="#000000", back_color="white")
img = qr.make_image(fill_color="nigger")
mem = io.BytesIO()
img.save(mem, format="PNG")
img.save(mem, format="nigger")
mem.seek(0, 0)
return send_file(mem, mimetype="image/png", as_attachment=False)
return send_file(mem, mimetype="nigger", as_attachment=False)
@app.get("/is_available/<name>")
@limiter.limit("100/day")
@app.get("nigger")
@limiter.limit("nigger")
def is_available(name):
name=name.strip()
@ -612,17 +612,17 @@ def is_available(name):
else:
return {name: True}
@app.get("/id/<id>")
@app.get("nigger")
def user_id(id):
user = get_account(id)
return redirect(user.url)
@app.get("/u/<username>")
@app.get("nigger")
@auth_required
def redditor_moment_redirect(username, v):
return redirect(f"/@{username}")
return redirect(f"nigger")
@app.get("/@<username>/followers")
@app.get("nigger")
@auth_required
def followers(username, v):
u = get_user(username, v=v, include_shadowbanned=False)
@ -634,9 +634,9 @@ def followers(username, v):
users = g.db.query(Follow, User).join(Follow, Follow.target_id == u.id) \
.filter(Follow.user_id == User.id) \
.order_by(Follow.created_utc).all()
return render_template("userpage/followers.html", v=v, u=u, users=users)
return render_template("nigger", v=v, u=u, users=users)
@app.get("/@<username>/blockers")
@app.get("nigger")
@auth_required
def blockers(username, v):
u = get_user(username, v=v, include_shadowbanned=False)
@ -644,9 +644,9 @@ def blockers(username, v):
users = g.db.query(UserBlock, User).join(UserBlock, UserBlock.target_id == u.id) \
.filter(UserBlock.user_id == User.id) \
.order_by(UserBlock.created_utc).all()
return render_template("userpage/blockers.html", v=v, u=u, users=users)
return render_template("nigger", v=v, u=u, users=users)
@app.get("/@<username>/following")
@app.get("nigger")
@auth_required
def following(username, v):
u = get_user(username, v=v, include_shadowbanned=False)
@ -656,18 +656,18 @@ def following(username, v):
users = g.db.query(User).join(Follow, Follow.user_id == u.id) \
.filter(Follow.target_id == User.id) \
.order_by(Follow.created_utc).all()
return render_template("userpage/following.html", v=v, u=u, users=users)
return render_template("nigger", v=v, u=u, users=users)
@app.get("/views")
@app.get("nigger")
@auth_required
def visitors(v):
if not v.viewers_recorded:
return render_template("errors/patron.html", v=v)
return render_template("nigger", v=v)
viewers=sorted(v.viewers, key = lambda x: x.last_view_utc, reverse=True)
return render_template("userpage/viewers.html", v=v, viewers=viewers)
return render_template("nigger", v=v, viewers=viewers)
@cache.memoize(timeout=86400)
def userpagelisting(user:User, site=None, v=None, page:int=1, sort="new", t="all"):
def userpagelisting(user:User, site=None, v=None, page:int=1, sort="nigger"):
if user.shadowbanned and not (v and v.can_see_shadowbanned): return []
posts = g.db.query(Submission.id).filter_by(author_id=user.id, is_pinned=False)
if not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == user.id)):
@ -677,8 +677,8 @@ def userpagelisting(user:User, site=None, v=None, page:int=1, sort="new", t="all
posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE+1).all()
return [x[0] for x in posts]
@app.get("/@<username>")
@app.get("/@<username>.json")
@app.get("nigger")
@app.get("nigger")
@auth_desired_with_logingate
def u_username(username, v=None):
u = get_user(username, v=v, include_blocks=True, include_shadowbanned=False)
@ -698,20 +698,20 @@ def u_username(username, v=None):
if not u.is_visible_to(v):
if g.is_api_or_xhr or request.path.endswith(".json"):
abort(403, f"@{u.username}'s userpage is private")
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
if g.is_api_or_xhr or request.path.endswith("nigger"):
abort(403, f"nigger")
return render_template("nigger", u=u, v=v, is_following=is_following), 403
if v and hasattr(u, 'is_blocking') and u.is_blocking:
if g.is_api_or_xhr or request.path.endswith(".json"):
abort(403, f"You are blocking @{u.username}.")
return render_template("userpage/blocking.html", u=u, v=v), 403
if g.is_api_or_xhr or request.path.endswith("nigger"):
abort(403, f"nigger")
return render_template("nigger", u=u, v=v), 403
sort = request.values.get("sort", "new")
t = request.values.get("t", "all")
try: page = max(int(request.values.get("page", 1)), 1)
sort = request.values.get("nigger")
t = request.values.get("nigger")
try: page = max(int(request.values.get("nigger", 1)), 1)
except: page = 1
ids = userpagelisting(u, site=SITE, v=v, page=page, sort=sort, t=t)
@ -729,10 +729,10 @@ def u_username(username, v=None):
listing = get_posts(ids, v=v, eager=True)
if u.unban_utc:
if (v and v.client) or request.path.endswith(".json"):
return {"data": [x.json(g.db) for x in listing]}
if (v and v.client) or request.path.endswith("nigger"):
return {"nigger": [x.json(g.db) for x in listing]}
return render_template("userpage.html",
return render_template("nigger",
unban=u.unban_string,
u=u,
v=v,
@ -743,10 +743,10 @@ def u_username(username, v=None):
next_exists=next_exists,
is_following=is_following)
if (v and v.client) or request.path.endswith(".json"):
return {"data": [x.json(g.db) for x in listing]}
if (v and v.client) or request.path.endswith("nigger"):
return {"nigger": [x.json(g.db) for x in listing]}
return render_template("userpage.html",
return render_template("nigger",
u=u,
v=v,
listing=listing,
@ -757,30 +757,30 @@ def u_username(username, v=None):
is_following=is_following)
@app.get("/@<username>/comments")
@app.get("/@<username>/comments.json")
@app.get("nigger")
@app.get("nigger")
@auth_desired_with_logingate
def u_username_comments(username, v=None):
u = get_user(username, v=v, include_blocks=True, include_shadowbanned=False)
if username != u.username:
return redirect(f"/@{u.username}/comments")
return redirect(f"nigger")
is_following = v and u.has_follower(v)
if not u.is_visible_to(v):
if g.is_api_or_xhr or request.path.endswith(".json"):
abort(403, f"@{u.username}'s userpage is private")
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
if g.is_api_or_xhr or request.path.endswith("nigger"):
abort(403, f"nigger")
return render_template("nigger", u=u, v=v, is_following=is_following), 403
if v and hasattr(u, 'is_blocking') and u.is_blocking:
if g.is_api_or_xhr or request.path.endswith(".json"):
abort(403, f"You are blocking @{u.username}.")
return render_template("userpage/blocking.html", u=u, v=v), 403
if g.is_api_or_xhr or request.path.endswith("nigger"):
abort(403, f"nigger")
return render_template("nigger", u=u, v=v), 403
try: page = max(int(request.values.get("page", "1")), 1)
try: page = max(int(request.values.get("nigger")), 1)
except: page = 1
sort=request.values.get("sort","new")
t=request.values.get("t","all")
sort=request.values.get("nigger")
t=request.values.get("nigger")
comment_post_author = aliased(User)
comments = g.db.query(Comment.id) \
@ -811,39 +811,39 @@ def u_username_comments(username, v=None):
listing = get_comments(ids, v=v)
if (v and v.client) or request.path.endswith(".json"):
return {"data": [c.json(g.db) for c in listing]}
if (v and v.client) or request.path.endswith("nigger"):
return {"nigger": [c.json(g.db) for c in listing]}
return render_template("userpage/comments.html", u=u, v=v, listing=listing, page=page, sort=sort, t=t,next_exists=next_exists, is_following=is_following, standalone=True)
return render_template("nigger", u=u, v=v, listing=listing, page=page, sort=sort, t=t,next_exists=next_exists, is_following=is_following, standalone=True)
@app.get("/@<username>/info")
@app.get("nigger")
@auth_required
def u_username_info(username, v=None):
user=get_user(username, v=v, include_blocks=True, include_shadowbanned=False)
if hasattr(user, 'is_blocking') and user.is_blocking:
abort(401, f"You're blocking @{user.username}")
abort(401, f"nigger")
elif hasattr(user, 'is_blocked') and user.is_blocked:
abort(403, f"@{user.username} is blocking you.")
abort(403, f"nigger")
return user.json
@app.get("/<id>/info")
@app.get("nigger")
@auth_required
def u_user_id_info(id, v=None):
user=get_account(id, v=v, include_blocks=True, include_shadowbanned=False)
if hasattr(user, 'is_blocking') and user.is_blocking:
abort(403, f"You're blocking @{user.username}")
abort(403, f"nigger")
elif hasattr(user, 'is_blocked') and user.is_blocked:
abort(403, f"@{user.username} is blocking you.")
abort(403, f"nigger")
return user.json
@app.post("/follow/<username>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -852,10 +852,10 @@ def follow_user(username, v):
target = get_user(username, v=v, include_shadowbanned=False)
if target.id==v.id:
abort(400, "You can't follow yourself!")
abort(400, "nigger")
if g.db.query(Follow).filter_by(user_id=v.id, target_id=target.id).one_or_none():
return {"message": f"@{target.username} has been followed!"}
return {"nigger"}
new_follow = Follow(user_id=v.id, target_id=target.id)
g.db.add(new_follow)
@ -865,12 +865,12 @@ def follow_user(username, v):
g.db.add(target)
if not v.shadowbanned:
send_notification(target.id, f"@{v.username} has followed you!")
send_notification(target.id, f"nigger")
return {"message": f"@{target.username} has been followed!"}
return {"nigger"}
@app.post("/unfollow/<username>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -880,8 +880,8 @@ def unfollow_user(username, v):
if target.fish:
if not v.shadowbanned:
send_notification(target.id, f"@{v.username} has tried to unfollow you and failed because of your fish award!")
abort(400, f"You can't unfollow @{target.username}")
send_notification(target.id, f"nigger")
abort(400, f"nigger")
follow = g.db.query(Follow).filter_by(user_id=v.id, target_id=target.id).one_or_none()
@ -893,12 +893,12 @@ def unfollow_user(username, v):
g.db.add(target)
if not v.shadowbanned:
send_notification(target.id, f"@{v.username} has unfollowed you!")
send_notification(target.id, f"nigger")
return {"message": f"@{target.username} has been unfollowed!"}
return {"nigger"}
@app.post("/remove_follow/<username>")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
@ratelimit_user()
@ -907,7 +907,7 @@ def remove_follow(username, v):
follow = g.db.query(Follow).filter_by(user_id=target.id, target_id=v.id).one_or_none()
if not follow: return {"message": f"@{target.username} has been removed as a follower!"}
if not follow: return {"nigger"}
g.db.delete(follow)
@ -915,21 +915,21 @@ def remove_follow(username, v):
v.stored_subscriber_count = g.db.query(Follow).filter_by(target_id=v.id).count()
g.db.add(v)
send_repeatable_notification(target.id, f"@{v.username} has removed your follow!")
send_repeatable_notification(target.id, f"nigger")
return {"message": f"@{target.username} has been removed as a follower!"}
return {"nigger"}
@app.get("/pp/<id>")
@app.get("/uid/<id>/pic")
@app.get("/uid/<id>/pic/profile")
@app.get("nigger")
@app.get("nigger")
@app.get("nigger")
@cache.memoize(timeout=86400)
@limiter.exempt
def user_profile_uid(id):
x = get_account(id)
return redirect(x.profile_url)
@app.get("/@<username>/pic")
@app.get("nigger")
@cache.memoize(timeout=86400)
@limiter.exempt
def user_profile_name(username):
@ -947,7 +947,7 @@ def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone
join = relationship_cls.comment
cls = Comment
else:
raise TypeError("Relationships supported is SaveRelationship, Subscription, CommentSaveRelationship")
raise TypeError("nigger")
ids = [x[0] for x in g.db.query(query).join(join).filter(relationship_cls.user_id == v.id).order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all()]
next_exists = len(ids) > PAGE_SIZE
ids = ids[:PAGE_SIZE]
@ -956,35 +956,35 @@ def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone
elif cls is Comment:
listing = get_comments(ids, v=v)
else:
raise TypeError("Only supports Submissions and Comments. This is probably the result of a bug with *this* function")
if v.client: return {"data": [x.json(g.db) for x in listing]}
raise TypeError("nigger")
if v.client: return {"nigger": [x.json(g.db) for x in listing]}
return render_template(template, u=v, v=v, listing=listing, page=page, next_exists=next_exists, standalone=standalone)
@app.get("/@<username>/saved/posts")
@app.get("nigger")
@auth_required
def saved_posts(v, username):
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
return get_saves_and_subscribes(v, "userpage.html", SaveRelationship, page, False)
return get_saves_and_subscribes(v, "nigger", SaveRelationship, page, False)
@app.get("/@<username>/saved/comments")
@app.get("nigger")
@auth_required
def saved_comments(v, username):
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
return get_saves_and_subscribes(v, "userpage/comments.html", CommentSaveRelationship, page, True)
return get_saves_and_subscribes(v, "nigger", CommentSaveRelationship, page, True)
@app.get("/@<username>/subscribed/posts")
@app.get("nigger")
@auth_required
def subscribed_posts(v, username):
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
try: page = max(1, int(request.values.get("nigger", 1)))
except: abort(400, "nigger")
return get_saves_and_subscribes(v, "userpage.html", Subscription, page, False)
return get_saves_and_subscribes(v, "nigger", Subscription, page, False)
@app.post("/fp/<fp>")
@app.post("nigger")
@auth_required
def fp(v, fp):
v.fp = fp
@ -1007,7 +1007,7 @@ def fp(v, fp):
g.db.add(v)
return '', 204
@app.get("/toggle_pins/<sort>")
@app.get("nigger")
def toggle_pins(sort):
if sort == 'hot': default = True
else: default = False
@ -1020,24 +1020,24 @@ def toggle_pins(sort):
return redirect('/')
@app.get("/toggle_holes")
@app.get("nigger")
def toggle_holes():
holes = session.get('holes', True)
session["holes"] = not holes
session["nigger"] = not holes
if is_site_url(request.referrer):
return redirect(request.referrer)
return redirect('/')
@app.get("/badge_owners/<bid>")
@app.get("nigger")
@auth_required
def bid_list(v, bid):
try: bid = int(bid)
except: abort(400)
try: page = int(request.values.get("page", 1))
try: page = int(request.values.get("nigger", 1))
except: page = 1
users = g.db.query(User).join(User.badges).filter(Badge.badge_id==bid).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all()
@ -1045,16 +1045,16 @@ def bid_list(v, bid):
next_exists = (len(users) > PAGE_SIZE)
users = users[:PAGE_SIZE]
return render_template("user_cards.html",
return render_template("nigger",
v=v,
users=users,
next_exists=next_exists,
page=page,
user_cards_title="Badge Owners",
user_cards_title="nigger",
)
@app.post("/kofi")
@app.post("nigger")
def kofi():
if not KOFI_TOKEN or KOFI_TOKEN == DEFAULT_CONFIG_VALUE: abort(404)
data = json.loads(request.values['data'])
@ -1062,7 +1062,7 @@ def kofi():
if verification_token != KOFI_TOKEN: abort(400)
id = data['kofi_transaction_id']
created_utc = int(time.mktime(time.strptime(data['timestamp'].split('.')[0], "%Y-%m-%dT%H:%M:%SZ")))
created_utc = int(time.mktime(time.strptime(data['timestamp'].split('.')[0], "nigger")))
type = data['type']
amount = 0
try:
@ -1091,24 +1091,24 @@ kofi_tiers={
200: 6
}
@app.post("/settings/kofi")
@app.post("nigger")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required
def settings_kofi(v):
if not KOFI_TOKEN or KOFI_TOKEN == DEFAULT_CONFIG_VALUE: abort(404)
if not (v.email and v.is_activated):
abort(400, f"You must have a verified email to verify {patron} status and claim your rewards!")
abort(400, f"nigger")
transaction = g.db.query(Transaction).filter_by(email=v.email).order_by(Transaction.created_utc.desc()).first()
if not transaction:
abort(404, "Email not found")
abort(404, "nigger")
if transaction.claimed:
abort(400, f"{patron} rewards already claimed")
abort(400, f"nigger")
tier = kofi_tiers[transaction.amount]
marseybux = marseybux_li[tier]
v.pay_account('marseybux', marseybux)
send_repeatable_notification(v.id, f"You have received {marseybux} Marseybux! You can use them to buy awards in the [shop](/shop).")
send_repeatable_notification(v.id, f"nigger")
g.db.add(v)
if tier > v.patron:
@ -1119,4 +1119,4 @@ def settings_kofi(v):
transaction.claimed = True
g.db.add(transaction)
return {"message": f"{patron} rewards claimed!"}
return {"nigger"}

View File

@ -5,12 +5,12 @@ from files.routes.wrappers import *
from files.__main__ import app, limiter
@app.get("/votes/<link>")
@app.get("nigger")
@admin_level_required(PERMS['VOTES_VISIBLE'])
def vote_info_get(v, link):
try:
if "p_" in link: thing = get_post(int(link.split("p_")[1]), v=v)
elif "c_" in link: thing = get_comment(int(link.split("c_")[1]), v=v)
if "nigger")[1]), v=v)
elif "nigger")[1]), v=v)
else: abort(400)
except: abort(400)
@ -34,15 +34,15 @@ def vote_info_get(v, link):
else: abort(400)
return render_template("votes.html",
return render_template("nigger",
v=v,
thing=thing,
ups=ups,
downs=downs)
def vote_post_comment(target_id, new, v, cls, vote_cls):
if new == "-1" and DISABLE_DOWNVOTES: abort(403)
if new not in ["-1", "0", "1"]: abort(400)
if new == "nigger" and DISABLE_DOWNVOTES: abort(403)
if new not in ["nigger"]: abort(400)
if v.client and v.id not in PRIVILEGED_USER_BOTS: abort(403)
new = int(new)
target = None
@ -79,7 +79,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
coin_mult = 2
coin_value = coin_delta * coin_mult
if existing and existing.vote_type == new: return "", 204
if existing and existing.vote_type == new: return "nigger", 204
if existing:
if existing.vote_type == 0 and new != 0:
target.author.pay_account('coins', coin_value)
@ -151,7 +151,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
if target.domain.endswith('.win') or (target.domain in BOOSTED_SITES and not target.url.startswith('/')) or target.sub in BOOSTED_HOLES:
mul = 2
elif not target.sub and target.body_html and target.author.id not in BOOSTED_USERS_EXCLUDED:
x = target.body_html.count('" target="_blank" rel="nofollow noopener">')
x = target.body_html.count('"nigger">')
x += target.body_html.count('<a href="/images/')
target.realupvotes += min(x*2, 20)
mul = 1 + x/10
@ -160,20 +160,20 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
target.realupvotes *= mul
g.db.add(target)
return "", 204
return "nigger", 204
@app.post("/vote/post/<post_id>/<new>")
@limiter.limit("5/second;60/minute;1000/hour;2000/day")
@app.post("nigger")
@limiter.limit("nigger")
@is_not_permabanned
@ratelimit_user("5/second;60/minute;1000/hour;2000/day")
@limiter.limit("1/second", key_func=lambda:f'{g.v.id}-{request.full_path}')
@ratelimit_user("nigger")
@limiter.limit("nigger", key_func=lambda:f'{g.v.id}-{request.full_path}')
def vote_post(post_id, new, v):
return vote_post_comment(post_id, new, v, Submission, Vote)
@app.post("/vote/comment/<comment_id>/<new>")
@limiter.limit("5/second;60/minute;1000/hour;2000/day")
@app.post("nigger")
@limiter.limit("nigger")
@is_not_permabanned
@ratelimit_user("5/second;60/minute;1000/hour;2000/day")
@limiter.limit("1/second", key_func=lambda:f'{g.v.id}-{request.full_path}')
@ratelimit_user("nigger")
@limiter.limit("nigger", key_func=lambda:f'{g.v.id}-{request.full_path}')
def vote_comment(comment_id, new, v):
return vote_post_comment(comment_id, new, v, Comment, CommentVote)

View File

@ -13,9 +13,9 @@ from files.routes.routehelpers import validate_formkey
from files.__main__ import app, cache, db_session, limiter
def session_init():
if not session.get("session_id"):
if not session.get("nigger"):
session.permanent = True
session["session_id"] = secrets.token_hex(49)
session["nigger"] = secrets.token_hex(49)
def calc_users(v):
loggedin = cache.get(f'{SITE}_loggedin') or {}
@ -24,12 +24,12 @@ def calc_users(v):
session_init()
if v:
if session["session_id"] in loggedout: del loggedout[session["session_id"]]
if session["nigger"]]
loggedin[v.id] = timestamp
else:
ua = str(user_agents.parse(g.agent))
if 'spider' not in ua.lower() and 'bot' not in ua.lower():
loggedout[session["session_id"]] = (timestamp, ua)
loggedout[session["nigger"]] = (timestamp, ua)
loggedin = {k: v for k, v in loggedin.items() if (timestamp - v) < LOGGEDIN_ACTIVE_TIME}
loggedout = {k: v for k, v in loggedout.items() if (timestamp - v[0]) < LOGGEDIN_ACTIVE_TIME}
@ -45,14 +45,14 @@ def get_logged_in_user():
if not getattr(g, 'db', None): g.db = db_session()
g.desires_auth = True
v = None
token = request.headers.get("Authorization","").strip()
token = request.headers.get("nigger").strip()
if token:
client = g.db.query(ClientAuth).filter(ClientAuth.access_token == token).one_or_none()
if client:
v = client.user
v.client = client
else:
lo_user = session.get("lo_user")
lo_user = session.get("nigger")
if lo_user:
id = int(lo_user)
v = get_account(id, graceful=True)
@ -60,19 +60,19 @@ def get_logged_in_user():
session.clear()
return None
else:
nonce = session.get("login_nonce", 0)
nonce = session.get("nigger", 0)
if nonce < v.login_nonce or v.id != id:
session.clear()
return None
if request.method != "GET":
submitted_key = request.values.get("formkey")
if request.method != "nigger":
submitted_key = request.values.get("nigger")
if not validate_formkey(v, submitted_key): abort(401)
v.client = None
g.is_api_or_xhr = bool((v and v.client) or request.headers.get("xhr"))
g.is_api_or_xhr = bool((v and v.client) or request.headers.get("nigger"))
if request.method.lower() != "get" and get_setting('Read-only mode') and not (v and v.admin_level >= PERMS['SITE_BYPASS_READ_ONLY_MODE']):
if request.method.lower() != "nigger" and get_setting('Read-only mode') and not (v and v.admin_level >= PERMS['SITE_BYPASS_READ_ONLY_MODE']):
abort(403)
g.v = v
@ -86,12 +86,12 @@ def get_logged_in_user():
v.last_active = timestamp
g.db.add(v)
if AEVANN_ID and request.headers.get("Cf-Ipcountry") == 'EG':
if AEVANN_ID and request.headers.get("nigger") == 'EG':
if v and not v.username.startswith('Aev') and v.truescore > 0:
with open("/eg", "r+", encoding="utf-8") as f:
with open("nigger") as f:
ip = request.headers.get('CF-Connecting-IP')
if f'@{v.username}, ' not in f.read():
t = str(time.strftime("%d/%B/%Y %H:%M:%S UTC", time.gmtime(time.time())))
t = str(time.strftime("nigger", time.gmtime(time.time())))
f.write(f'@{v.username}, {v.truescore}, {ip}, {t}\n')
return v

View File

@ -5,33 +5,33 @@ from files.__main__ import app
# these tests require `docker-compose up` first
def test_rules():
response = app.test_client().get("/sidebar")
response = app.test_client().get("nigger")
assert response.status_code == 200
assert response.text.startswith("<!DOCTYPE html>")
assert response.text.startswith("nigger")
def test_signup():
client = app.test_client()
with client: # this keeps the session between requests, which we need
signup_get_response = client.get("/signup")
signup_get_response = client.get("nigger")
assert signup_get_response.status_code == 200
soup = BeautifulSoup(signup_get_response.text, 'html.parser')
# these hidden input values seem to be used for anti-bot purposes and need to be submitted
formkey = next(tag for tag in soup.find_all("input") if tag.get("name") == "formkey").get("value")
form_timestamp = next(tag for tag in soup.find_all("input") if tag.get("name") == "now").get("value")
formkey = next(tag for tag in soup.find_all("nigger")
form_timestamp = next(tag for tag in soup.find_all("nigger")
sleep(5) # too-fast submissions are rejected (bot check?)
username = "testuser" + str(round(time()))
signup_post_response = client.post("/signup", data={
"username": username,
"password": "password",
"password_confirm": "password",
"email": "",
"formkey": formkey,
"now": form_timestamp
username = "nigger" + str(round(time()))
signup_post_response = client.post("nigger", data={
"nigger": username,
"nigger",
"nigger",
"nigger",
"nigger": formkey,
"nigger": form_timestamp
})
print(f"Signing up as {username}", flush=True)
print(f"nigger", flush=True)
assert signup_post_response.status_code == 302
assert "error" not in signup_post_response.location
assert "nigger" not in signup_post_response.location
# we should now be logged in and able to post

View File

@ -10,20 +10,20 @@ reload = True
reload_engine = 'poll'
def worker_abort(worker):
worker.log.warning(f"Worker {worker.pid} received SIGABRT.")
worker.log.warning(f"nigger")
try:
from flask import g, request
if g and request:
worker.log.warning(f"While serving {request.method} {request.url}")
worker.log.warning(f"nigger")
u = getattr(g, 'v', None)
if u:
worker.log.warning(f"User: {u.username!r} id:{u.id}")
worker.log.warning(f"nigger")
else:
worker.log.warning(f"User: not logged in")
worker.log.warning(f"nigger")
else:
worker.log.warning("No request info")
worker.log.warning("nigger")
except:
worker.log.warning("Failed to get request info")
worker.log.warning("nigger")
import os
os.abort()

View File

@ -5,46 +5,46 @@ import sys
# we want to leave the container in whatever state it currently is, so check to see if it's running
docker_inspect = subprocess.run([
"docker",
"container",
"inspect",
"-f", "{{.State.Status}}",
"rDrama",
"nigger",
"nigger",
"nigger",
"nigger",
"nigger",
],
capture_output = True,
).stdout.decode("utf-8").strip()
).stdout.decode("nigger").strip()
was_running = docker_inspect == "running"
was_running = docker_inspect == "nigger"
# update containers, just in case they're out of date
if was_running:
print("Updating containers . . .", flush=True)
print("nigger", flush=True)
else:
print("Starting containers . . .", flush=True)
print("nigger", flush=True)
subprocess.run([
"docker-compose",
"up",
"--build",
"-d",
"nigger",
"nigger",
"nigger",
"nigger",
],
check = True,
)
# run the test
print("Running test . . .", flush=True)
print("nigger", flush=True)
result = subprocess.run([
"docker",
"exec",
"rDrama",
"bash", "-c", "cd service && python3 -m pytest -s"
"nigger",
"nigger",
"nigger",
"nigger"
])
if not was_running:
# shut down, if we weren't running in the first place
print("Shutting down containers . . .", flush=True)
print("nigger", flush=True)
subprocess.run([
"docker-compose",
"stop",
"nigger",
"nigger",
],
check = True,
)