move award timers to cron

pull/148/head
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)
verified = Column(String)
verifiedcolor = Column(String)
marseyawarded = Column(Integer)
rehab = Column(Integer)
longpost = Column(Integer)
bird = Column(Integer)
marseyawarded = Column(Integer, default=0)
rehab = Column(Integer, default=0)
longpost = Column(Integer, default=0)
bird = Column(Integer, default=0)
email = deferred(Column(String))
css = Column(String)
profilecss = deferred(Column(String))
@ -104,7 +104,7 @@ class User(Base):
hidevotedon = Column(Boolean, default=False)
slurreplacer = Column(Integer, default=1)
profanityreplacer = Column(Integer, default=1)
flairchanged = Column(Integer)
flairchanged = Column(Integer, default=0)
newtab = Column(Boolean, default=False)
newtabexternal = Column(Boolean, default=True)
reddit = Column(String, default='old.reddit.com')
@ -118,8 +118,8 @@ class User(Base):
sig_html = Column(String)
fp = Column(String)
sigs_disabled = Column(Boolean)
progressivestack = Column(Integer)
deflector = Column(Integer)
progressivestack = Column(Integer, default=0)
deflector = Column(Integer, default=0)
friends = deferred(Column(String))
friends_html = deferred(Column(String))
enemies = deferred(Column(String))
@ -148,11 +148,11 @@ class User(Base):
last_viewed_log_notifs = Column(Integer, default=0)
last_viewed_reddit_notifs = Column(Integer, default=0)
pronouns = Column(String, default='they/them')
bite = Column(Integer)
earlylife = Column(Integer)
owoify = Column(Integer)
bite = Column(Integer, default=0)
earlylife = Column(Integer, default=0)
owoify = Column(Integer, default=0)
marsify = Column(Integer, default=0)
rainbow = Column(Integer)
rainbow = Column(Integer, default=0)
spider = Column(Integer, default=0)
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 hashlib import md5
from collections import Counter
from sqlalchemy.orm import load_only
import click
import requests
import files.helpers.awards as awards
import files.helpers.offsitementions as offsitementions
import files.helpers.stats as stats
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.v = None
#I put commit under each task to release database locks and prevent main flask app crashing
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']:
t = time.time()
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()
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:
awards.award_timers_bots_task()
t = time.time()
_generate_emojis_zip()
g.db.commit()
print(f'_generate_emojis_zip: {time.time() - t}', flush=True)
t = time.time()
_leaderboard_task()
g.db.commit()
print(f'_leaderboard_task: {time.time() - t}', flush=True)
if every_1d:
t = time.time()
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()
g.db.commit()
print(f'_sub_inactive_purge_task: {time.time() - t}', flush=True)
t = time.time()
cache.set('stats', stats.stats())
g.db.commit()
print(f'stats: {time.time() - t}', flush=True)
g.db.commit()
g.db.close()
@ -160,3 +190,55 @@ def _leaderboard_task():
cache.set("users9", list(users9))
cache.set("users9_1", list(users9_1))
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.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
if user.has_badge(badge_id):
if check_if_exists and user.has_badge(badge_id):
return
if description and len(description) > 256:

View File

@ -905,7 +905,7 @@ def admin_title_change(user_id, v):
user.customtitle=new_name
if request.values.get("locked"): user.flairchanged = int(time.time()) + 2629746
else:
user.flairchanged = None
user.flairchanged = 0
badge = user.has_badge(96)
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.votes import Vote
from files.helpers.awards import award_timers
from files.helpers.config.const import *
from files.helpers.get 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)
if v:
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.hidevotedon:
posts = [x for x in posts if not hasattr(x, 'voted') or not x.voted]
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)
@ -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()
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]
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);