forked from rDrama/rDrama
1
0
Fork 0

move award timers to cron

master
Aevann 2023-05-13 05:00:54 +03:00
parent a971858e05
commit 50b23a064a
7 changed files with 141 additions and 137 deletions

View File

@ -78,10 +78,10 @@ class User(Base):
patron_utc = Column(Integer, default=0) patron_utc = Column(Integer, default=0)
verified = Column(String) verified = Column(String)
verifiedcolor = Column(String) verifiedcolor = Column(String)
marseyawarded = Column(Integer) marseyawarded = Column(Integer, default=0)
rehab = Column(Integer) rehab = Column(Integer, default=0)
longpost = Column(Integer) longpost = Column(Integer, default=0)
bird = Column(Integer) bird = Column(Integer, default=0)
email = deferred(Column(String)) email = deferred(Column(String))
css = Column(String) css = Column(String)
profilecss = deferred(Column(String)) profilecss = deferred(Column(String))
@ -104,7 +104,7 @@ class User(Base):
hidevotedon = Column(Boolean, default=False) hidevotedon = Column(Boolean, default=False)
slurreplacer = Column(Integer, default=1) slurreplacer = Column(Integer, default=1)
profanityreplacer = Column(Integer, default=1) profanityreplacer = Column(Integer, default=1)
flairchanged = Column(Integer) flairchanged = Column(Integer, default=0)
newtab = Column(Boolean, default=False) newtab = Column(Boolean, default=False)
newtabexternal = Column(Boolean, default=True) newtabexternal = Column(Boolean, default=True)
reddit = Column(String, default='old.reddit.com') reddit = Column(String, default='old.reddit.com')
@ -118,8 +118,8 @@ class User(Base):
sig_html = Column(String) sig_html = Column(String)
fp = Column(String) fp = Column(String)
sigs_disabled = Column(Boolean) sigs_disabled = Column(Boolean)
progressivestack = Column(Integer) progressivestack = Column(Integer, default=0)
deflector = Column(Integer) deflector = Column(Integer, default=0)
friends = deferred(Column(String)) friends = deferred(Column(String))
friends_html = deferred(Column(String)) friends_html = deferred(Column(String))
enemies = deferred(Column(String)) enemies = deferred(Column(String))
@ -148,11 +148,11 @@ class User(Base):
last_viewed_log_notifs = Column(Integer, default=0) last_viewed_log_notifs = Column(Integer, default=0)
last_viewed_reddit_notifs = Column(Integer, default=0) last_viewed_reddit_notifs = Column(Integer, default=0)
pronouns = Column(String, default='they/them') pronouns = Column(String, default='they/them')
bite = Column(Integer) bite = Column(Integer, default=0)
earlylife = Column(Integer) earlylife = Column(Integer, default=0)
owoify = Column(Integer) owoify = Column(Integer, default=0)
marsify = Column(Integer, default=0) marsify = Column(Integer, default=0)
rainbow = Column(Integer) rainbow = Column(Integer, default=0)
spider = Column(Integer, default=0) spider = Column(Integer, default=0)
blacklisted_by = Column(Integer, ForeignKey("users.id")) blacklisted_by = Column(Integer, ForeignKey("users.id"))

View File

@ -1,116 +0,0 @@
import time
from flask import g
from files.classes.user import User
from files.helpers.alerts import send_repeatable_notification
from files.helpers.config.const import *
from files.helpers.useractions import *
def award_timers(v, bot=False):
now = time.time()
def notify_if_not_bot(msg):
if not bot:
send_repeatable_notification(v.id, msg)
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!")
for i in (22,23,24,25,26,27,28):
badge = v.has_badge(i)
if badge: g.db.delete(badge)
if v.unban_utc and v.unban_utc < now:
v.is_banned = None
v.unban_utc = 0
v.ban_reason = None
notify_if_not_bot("You have been unbanned!")
if v.agendaposter and v.agendaposter != 1 and v.agendaposter < now:
v.agendaposter = 0
v.agendaposter_phrase = None
v.chudded_by = None
notify_if_not_bot("Your chud status has expired!")
badge = v.has_badge(58)
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!")
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!")
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!")
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!")
badge = v.has_badge(95)
if badge: g.db.delete(badge)
if v.progressivestack and v.progressivestack != 1 and v.progressivestack < now:
v.progressivestack = None
notify_if_not_bot("Your progressive stack has expired!")
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!")
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!")
if v.owoify and v.owoify < now:
v.owoify = None
notify_if_not_bot("Your OwOify status has expired!")
badge = v.has_badge(167)
if badge: g.db.delete(badge)
if v.bite and v.bite < now:
v.bite = None
badge = v.has_badge(168)
if badge: g.db.delete(badge)
v.house = v.old_house
notify_if_not_bot(f"Your vampire status has ended. You're now back in House {v.old_house.replace(' Founder', '')}!")
v.old_house = ''
if v.earlylife and v.earlylife < now:
v.earlylife = None
notify_if_not_bot("Your earlylife status has expired!")
badge = v.has_badge(169)
if badge: g.db.delete(badge)
if v.marsify and v.marsify != 1 and v.marsify < now:
v.marsify = 0
if SITE_NAME != 'rDrama': notify_if_not_bot("Your marsify status has expired!")
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!")
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!")
badge = v.has_badge(179)
if badge: g.db.delete(badge)
if time.time() - v.created_utc > 365 * 86400:
badge_grant(user=v, badge_id=134)
if time.time() - v.created_utc > 365 * 86400 * 2:
badge_grant(user=v, badge_id=237)
g.db.add(v)
def award_timers_bots_task():
accs = g.db.query(User).filter(User.id.in_(bots))
for u in accs:
award_timers(u, bot=True)

View File

@ -5,11 +5,11 @@ from sys import stdout
from shutil import make_archive from shutil import make_archive
from hashlib import md5 from hashlib import md5
from collections import Counter from collections import Counter
from sqlalchemy.orm import load_only
import click import click
import requests import requests
import files.helpers.awards as awards
import files.helpers.offsitementions as offsitementions import files.helpers.offsitementions as offsitementions
import files.helpers.stats as stats import files.helpers.stats as stats
import files.routes.static as route_static import files.routes.static as route_static
@ -32,21 +32,51 @@ def cron(every_5m, every_1h, every_1d, every_1mo):
g.db = db_session() g.db = db_session()
g.v = None g.v = None
#I put commit under each task to release database locks and prevent main flask app crashing
if every_5m: if every_5m:
t = time.time()
_award_timers_task()
g.db.commit()
print(f'_award_timers_task: {time.time() - t}', flush=True)
if FEATURES['GAMBLING']: if FEATURES['GAMBLING']:
t = time.time()
check_if_end_lottery_task() check_if_end_lottery_task()
g.db.commit()
print(f'check_if_end_lottery_task: {time.time() - t}', flush=True)
t = time.time()
spin_roulette_wheel() spin_roulette_wheel()
offsitementions.offsite_mentions_task(cache) g.db.commit()
print(f'spin_roulette_wheel: {time.time() - t}', flush=True)
#offsitementions.offsite_mentions_task(cache)
if every_1h: if every_1h:
awards.award_timers_bots_task() t = time.time()
_generate_emojis_zip() _generate_emojis_zip()
g.db.commit()
print(f'_generate_emojis_zip: {time.time() - t}', flush=True)
t = time.time()
_leaderboard_task() _leaderboard_task()
g.db.commit()
print(f'_leaderboard_task: {time.time() - t}', flush=True)
if every_1d: if every_1d:
t = time.time()
stats.generate_charts_task(SITE) stats.generate_charts_task(SITE)
g.db.commit()
print(f'generate_charts_task: {time.time() - t}', flush=True)
t = time.time()
_sub_inactive_purge_task() _sub_inactive_purge_task()
g.db.commit()
print(f'_sub_inactive_purge_task: {time.time() - t}', flush=True)
t = time.time()
cache.set('stats', stats.stats()) cache.set('stats', stats.stats())
g.db.commit()
print(f'stats: {time.time() - t}', flush=True)
g.db.commit() g.db.commit()
g.db.close() g.db.close()
@ -160,3 +190,55 @@ def _leaderboard_task():
cache.set("users9", list(users9)) cache.set("users9", list(users9))
cache.set("users9_1", list(users9_1)) cache.set("users9_1", list(users9_1))
cache.set("users9_2", list(users9_2)) cache.set("users9_2", list(users9_2))
def _process_timer(attr, badge_ids, text, extra_attrs={}):
now = time.time()
users = g.db.query(User).options(load_only(User.id)).filter(1 < attr, attr < now)
uids = set([x.id for x in users])
#set user attributes
attr_dict = {attr: 0} | extra_attrs
users.update(attr_dict)
#remove corresponding badges
if badge_ids:
g.db.query(Badge).options(load_only(Badge.badge_id)).filter(Badge.badge_id.in_(badge_ids), Badge.user_id.in_(uids)).delete()
#notify users
for uid in uids:
send_repeatable_notification(uid, text)
g.db.commit()
def _award_timers_task():
#only awards
_process_timer(User.deflector, [], "The deflector award you received has expired!")
_process_timer(User.progressivestack, [94], "The progressive stack award you received has expired!")
_process_timer(User.bird, [95], "The bird site award you received has expired!")
_process_timer(User.longpost, [97], "The pizzashill award you received has expired!")
_process_timer(User.marseyawarded, [98], "The marsey award you received has expired!")
_process_timer(User.rehab, [109], "The rehab award you received has expired!")
_process_timer(User.owoify, [167], "The OwOify award you received has expired!")
_process_timer(User.bite, [168], "Your vampire status has ended. You're now back in your original house!", {
User.house: User.old_house,
User.old_house: '',
})
_process_timer(User.earlylife, [169], "The earlylife award you received has expired!")
_process_timer(User.marsify, [170], "The marsify award you received has expired!")
_process_timer(User.rainbow, [171], "The rainbow award you received has expired!")
_process_timer(User.spider, [179], "The spider award you received has expired!")
#both awards and janny powers
_process_timer(User.unban_utc, [], "Your temporary ban has expired!", {
User.is_banned: None,
User.ban_reason: None,
})
_process_timer(User.patron_utc, [22,23,24,25,26,27,28], f"Your {patron} status has expired!", {
User.patron: 0,
})
_process_timer(User.agendaposter, [58], "Your temporary chud status has expired!", {
User.agendaposter_phrase: None,
User.chudded_by: None,
})
_process_timer(User.flairchanged, [96], "Your temporary flair-lock has expired. You can now change your flair!")

View File

@ -3,9 +3,10 @@ from flask import g
from files.classes.badges import Badge from files.classes.badges import Badge
from files.helpers.alerts import send_repeatable_notification from files.helpers.alerts import send_repeatable_notification
def badge_grant(user, badge_id, description=None, url=None, notify=True): def badge_grant(user, badge_id, description=None, url=None, notify=True, check_if_exists=True):
assert user != None assert user != None
if user.has_badge(badge_id):
if check_if_exists and user.has_badge(badge_id):
return return
if description and len(description) > 256: if description and len(description) > 256:

View File

@ -905,7 +905,7 @@ def admin_title_change(user_id, v):
user.customtitle=new_name user.customtitle=new_name
if request.values.get("locked"): user.flairchanged = int(time.time()) + 2629746 if request.values.get("locked"): user.flairchanged = int(time.time()) + 2629746
else: else:
user.flairchanged = None user.flairchanged = 0
badge = user.has_badge(96) badge = user.has_badge(96)
if badge: g.db.delete(badge) if badge: g.db.delete(badge)

View File

@ -4,7 +4,6 @@ from sqlalchemy.orm import load_only
from files.classes.submission import Submission from files.classes.submission import Submission
from files.classes.votes import Vote from files.classes.votes import Vote
from files.helpers.awards import award_timers
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.get import * from files.helpers.get import *
from files.helpers.sorting_and_time import * from files.helpers.sorting_and_time import *
@ -61,9 +60,8 @@ def front_all(v, sub=None, subdomain=None):
posts = get_posts(ids, v=v, eager=True) posts = get_posts(ids, v=v, eager=True)
if v: if v and v.hidevotedon:
if v.hidevotedon: posts = [x for x in posts if not hasattr(x, 'voted') or not x.voted] 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], "total": total} if v and v.client: return {"data": [x.json(g.db) for x in posts], "total": total}
return render_template("home.html", v=v, listing=posts, total=total, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, size=size) return render_template("home.html", v=v, listing=posts, total=total, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, size=size)
@ -148,6 +146,12 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
pins = pins.order_by(Submission.created_utc.desc()).all() pins = pins.order_by(Submission.created_utc.desc()).all()
posts = pins + posts posts = pins + posts
if time.time() - v.created_utc > 365 * 86400:
badge_grant(user=v, badge_id=134)
if time.time() - v.created_utc > 365 * 86400 * 2:
badge_grant(user=v, badge_id=237)
if ids_only: posts = [x.id for x in posts] if ids_only: posts = [x.id for x in posts]
return posts, total, size return posts, total, size

View File

@ -0,0 +1,33 @@
update users set deflector=0 where deflector is null;
update users set progressivestack=0 where progressivestack is null;
update users set bird=0 where bird is null;
update users set longpost=0 where longpost is null;
update users set marseyawarded=0 where marseyawarded is null;
update users set rehab=0 where rehab is null;
update users set owoify=0 where owoify is null;
update users set bite=0 where bite is null;
update users set earlylife=0 where earlylife is null;
update users set marsify=0 where marsify is null;
update users set rainbow=0 where rainbow is null;
update users set spider=0 where spider is null;
update users set unban_utc=0 where unban_utc is null;
update users set agendaposter=0 where agendaposter is null;
update users set flairchanged=0 where flairchanged is null;
update users set patron_utc=0 where patron_utc is null;
create index users_deflector_idx on users using btree(deflector);
create index users_progressivestack_idx on users using btree(progressivestack);
create index users_bird_idx on users using btree(bird);
create index users_longpost_idx on users using btree(longpost);
create index users_marseyawarded_idx on users using btree(marseyawarded);
create index users_rehab_idx on users using btree(rehab);
create index users_owoify_idx on users using btree(owoify);
create index users_bite_idx on users using btree(bite);
create index users_earlylife_idx on users using btree(earlylife);
create index users_marsify_idx on users using btree(marsify);
create index users_rainbow_idx on users using btree(rainbow);
create index users_spider_idx on users using btree(spider);
create index users_unban_utc_idx on users using btree(unban_utc);
create index users_agendaposter_idx on users using btree(agendaposter);
create index users_flairchanged_idx on users using btree(flairchanged);
create index users_patron_utc_idx on users using btree(patron_utc);