diff --git a/files/assets/images/rDrama/sidebar/824.webp b/files/assets/images/rDrama/sidebar/824.webp new file mode 100644 index 000000000..fec21a793 Binary files /dev/null and b/files/assets/images/rDrama/sidebar/824.webp differ diff --git a/files/classes/comment.py b/files/classes/comment.py index 85e2ad3a6..e7c2fcc6a 100644 --- a/files/classes/comment.py +++ b/files/classes/comment.py @@ -120,64 +120,12 @@ class Comment(Base): if notif_utc: timestamp = notif_utc elif self.created_utc: timestamp = self.created_utc else: return None - - age = int(time.time()) - timestamp - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(timestamp) - - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" + return make_age_string(timestamp) @property @lazy def edited_string(self): - - age = int(time.time()) - self.edited_utc - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(self.edited_utc) - - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" + return make_age_string(self.edited_utc) @property @lazy diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index 9a8bec5e4..e5f360508 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -6,6 +6,7 @@ from files.helpers.lazy import lazy from copy import deepcopy from files.helpers.const import * from files.helpers.regex import censor_slurs +from files.helpers.sorting_and_time import make_age_string class ModAction(Base): __tablename__ = "modactions" @@ -32,37 +33,10 @@ class ModAction(Base): @property @lazy def age_string(self): - - age = int(time.time()) - self.created_utc - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(self.created_utc) - - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" + return make_age_string(self.created_utc) @property def note(self): - if self.kind=="ban_user": if self.target_post: return f'for post' elif self.target_comment_id: return f'for comment' @@ -73,11 +47,8 @@ class ModAction(Base): @property @lazy def string(self): - output = ACTIONTYPES[self.kind]["str"].format(self=self, cc=CC_TITLE) - if self.note: output += f" ({self.note})" - return output @property diff --git a/files/classes/sub_logs.py b/files/classes/sub_logs.py index 0b3ddc8a4..51ecf2dae 100644 --- a/files/classes/sub_logs.py +++ b/files/classes/sub_logs.py @@ -5,6 +5,7 @@ import time from files.helpers.lazy import lazy from files.helpers.const import * from files.helpers.regex import censor_slurs +from files.helpers.sorting_and_time import make_age_string class SubAction(Base): __tablename__ = "subactions" @@ -32,42 +33,13 @@ class SubAction(Base): @property @lazy def age_string(self): - - age = int(time.time()) - self.created_utc - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(self.created_utc) - - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" + return make_age_string(self.created_utc) @property @lazy def string(self): - output = ACTIONTYPES[self.kind]["str"].format(self=self, cc=CC_TITLE) - if self._note: output += f" ({self._note})" - return output @property diff --git a/files/classes/submission.py b/files/classes/submission.py index 4b09fd004..90702b80c 100644 --- a/files/classes/submission.py +++ b/files/classes/submission.py @@ -9,6 +9,7 @@ from files.__main__ import Base from files.helpers.const import * from files.helpers.regex import * from files.helpers.lazy import lazy +from files.helpers.sorting_and_time import make_age_string from .flags import Flag from .comment import Comment, normalize_urls_runtime from .saves import SaveRelationship @@ -100,64 +101,12 @@ class Submission(Base): @property @lazy def age_string(self): - - age = int(time.time()) - self.created_utc - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(self.created_utc) - - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" + return make_age_string(self.created_utc) @property @lazy def edited_string(self): - - age = int(time.time()) - self.edited_utc - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(self.edited_utc) - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" - + return make_age_string(self.edited_utc) @property @lazy diff --git a/files/classes/user.py b/files/classes/user.py index ececb839f..478d372ab 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -815,7 +815,7 @@ class User(Base): - def ban(self, admin=None, reason=None, days=0): + def ban(self, admin=None, reason=None, days=0.0): if days: self.unban_utc = int(time.time()) + (days * 86400) g.db.add(self) diff --git a/files/classes/views.py b/files/classes/views.py index b3007003d..2d8d1fee3 100644 --- a/files/classes/views.py +++ b/files/classes/views.py @@ -4,6 +4,8 @@ from files.__main__ import Base from files.helpers.lazy import * import time +from files.helpers.sorting_and_time import make_age_string + class ViewerRelationship(Base): __tablename__ = "viewers" @@ -26,36 +28,9 @@ class ViewerRelationship(Base): @property @lazy def last_view_since(self): - return int(time.time()) - self.last_view_utc @property @lazy def last_view_string(self): - - age = self.last_view_since - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(self.last_view_utc) - - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" + return make_age_string(self.last_view_since) diff --git a/files/helpers/actions.py b/files/helpers/actions.py index ff98459c7..201984f6d 100644 --- a/files/helpers/actions.py +++ b/files/helpers/actions.py @@ -62,6 +62,7 @@ def execute_snappy(post, v): else: SNAPPY_CHOICES = SNAPPY_QUOTES elif SNAPPY_MARSEYS: SNAPPY_CHOICES = SNAPPY_MARSEYS elif SNAPPY_QUOTES: SNAPPY_CHOICES = SNAPPY_QUOTES + else: SNAPPY_CHOICES = [""] body = random.choice(SNAPPY_CHOICES).strip() if body.startswith('▼'): diff --git a/files/helpers/jinja2.py b/files/helpers/jinja2.py index deebac7aa..836b64ca8 100644 --- a/files/helpers/jinja2.py +++ b/files/helpers/jinja2.py @@ -29,34 +29,7 @@ def template_asset_siteimg(asset_path): @app.template_filter("timestamp") def timestamp(timestamp): - - age = int(time.time()) - timestamp - - if age < 60: - return "just now" - elif age < 3600: - minutes = int(age / 60) - return f"{minutes}m ago" - elif age < 86400: - hours = int(age / 3600) - return f"{hours}hr ago" - elif age < 2678400: - days = int(age / 86400) - return f"{days}d ago" - - now = time.gmtime() - ctd = time.gmtime(timestamp) - - months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) - if now.tm_mday < ctd.tm_mday: - months -= 1 - - if months < 12: - return f"{months}mo ago" - else: - years = int(months / 12) - return f"{years}yr ago" - + return make_age_string(timestamp) @app.context_processor def inject_constants(): diff --git a/files/helpers/sorting_and_time.py b/files/helpers/sorting_and_time.py index 0dc6691e3..2cefff115 100644 --- a/files/helpers/sorting_and_time.py +++ b/files/helpers/sorting_and_time.py @@ -1,4 +1,5 @@ import time +from typing import Optional from files.helpers.const import * from sqlalchemy.sql import func @@ -44,3 +45,30 @@ def sort_objects(sort, objects, cls, include_shadowbanned=False): 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 "" + age = int(time.time()) - compare + + if age < 60: + return "just now" + elif age < 3600: + minutes = int(age / 60) + return f"{minutes}m ago" + elif age < 86400: + hours = int(age / 3600) + return f"{hours}hr ago" + elif age < 2678400: + days = int(age / 86400) + return f"{days}d ago" + + now = time.gmtime() + ctd = time.gmtime(compare) + months = now.tm_mon - ctd.tm_mon + 12 * (now.tm_year - ctd.tm_year) + if now.tm_mday < ctd.tm_mday: + months -= 1 + if months < 12: + return f"{months}mo ago" + else: + years = int(months / 12) + return f"{years}yr ago" diff --git a/files/routes/admin.py b/files/routes/admin.py index 03faa40af..5d2b98b9c 100644 --- a/files/routes/admin.py +++ b/files/routes/admin.py @@ -993,7 +993,11 @@ def ban_user(user_id, v): if user.admin_level > v.admin_level: abort(403) - days = float(request.values.get("days")) if request.values.get('days') else 0 + days = 0.0 + try: + days = float(request.values.get("days")) + except: + pass reason = request.values.get("reason").strip()[:256] reason = filter_emojis_only(reason) @@ -1009,8 +1013,11 @@ def ban_user(user_id, v): continue x.ban(admin=v, reason=reason, days=days) + duration = "permanently" if days: days_txt = str(days).rstrip('.0') + duration = f"for {days_txt} day" + if days != 1: duration += "s" if reason: text = f"@{v.username} (Admin) has banned you for **{days_txt}** days for the following reason:\n\n> {reason}" else: text = f"@{v.username} (Admin) has banned you for **{days_txt}** days." else: @@ -1018,10 +1025,6 @@ def ban_user(user_id, v): else: text = f"@{v.username} (Admin) has banned you permanently." send_repeatable_notification(user.id, text) - - if days == 0: duration = "permanently" - elif days == 1: duration = "for 1 day" - else: duration = f"for {days_txt} days" note = f'reason: "{reason}", duration: {duration}' ma=ModAction( diff --git a/files/routes/login.py b/files/routes/login.py index 04ff71d2d..73ddc2766 100644 --- a/files/routes/login.py +++ b/files/routes/login.py @@ -21,7 +21,7 @@ def login_get(v): return render_template("login.html", failed=False, redirect=redir) -def check_for_alts(current): +def check_for_alts(current:User): current_id = current.id if current_id in (1691,6790,7069,36152): session["history"] = [] @@ -29,8 +29,15 @@ def check_for_alts(current): ids = [x[0] for x in g.db.query(User.id).all()] past_accs = set(session.get("history", [])) + def add_alt(user1:int, user2:int): + li = [user1, user2] + existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).one_or_none() + if not existing: + new_alt = Alt(user1=user1, user2=user2) + g.db.add(new_alt) + g.db.flush() + for past_id in list(past_accs): - if past_id not in ids: past_accs.remove(past_id) continue @@ -39,46 +46,17 @@ def check_for_alts(current): if past_id == current_id: continue li = [past_id, current_id] - existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).one_or_none() - - if not existing: - new_alt = Alt(user1=past_id, user2=current_id) - g.db.add(new_alt) - g.db.flush() - - otheralts = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).all() - for a in otheralts: + add_alt(past_id, current_id) + other_alts = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).all() + for a in other_alts: if a.user1 != past_id: - li = [a.user1, past_id] - existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).one_or_none() - if not existing: - new_alt = Alt(user1=a.user1, user2=past_id) - g.db.add(new_alt) - g.db.flush() - + add_alt(a.user1, past_id) if a.user1 != current_id: - li = [a.user1, current_id] - existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).one_or_none() - if not existing: - new_alt = Alt(user1=a.user1, user2=current_id) - g.db.add(new_alt) - g.db.flush() - + add_alt(a.user1, current_id) if a.user2 != past_id: - li = [a.user2, past_id] - existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).one_or_none() - if not existing: - new_alt = Alt(user1=a.user2, user2=past_id) - g.db.add(new_alt) - g.db.flush() - + add_alt(a.user2, past_id) if a.user2 != current_id: - li = [a.user2, current_id] - existing = g.db.query(Alt).filter(Alt.user1.in_(li), Alt.user2.in_(li)).one_or_none() - if not existing: - new_alt = Alt(user1=a.user2, user2=current_id) - g.db.add(new_alt) - g.db.flush() + add_alt(a.user2, current_id) past_accs.add(current_id) session["history"] = list(past_accs) diff --git a/files/routes/posts.py b/files/routes/posts.py index 2f3fdadf0..406861a41 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -843,8 +843,8 @@ def submit_post(v, sub=None): if len(url) > 2048: return error("There's a 2048 character limit for URLs.") + bets = [] if v and v.admin_level >= PERMS['POST_BETS']: - bets = [] for i in bet_regex.finditer(body): bets.append(i.group(1)) body = body.replace(i.group(0), "") diff --git a/files/routes/reporting.py b/files/routes/reporting.py index dc7d2baa3..509e84af8 100644 --- a/files/routes/reporting.py +++ b/files/routes/reporting.py @@ -11,9 +11,7 @@ from files.helpers.sanitize import filter_emojis_only @limiter.limit("1/second;30/minute;200/hour;1000/day", key_func=lambda:f'{SITE}-{session.get("lo_user")}') @auth_required def flag_post(pid, v): - post = get_post(pid) - reason = request.values.get("reason", "").strip() if blackjack and any(i in reason.lower() for i in blackjack.split()):