add typing to a bunch of routes

pull/21/head
justcool393 2022-11-26 15:00:03 -06:00
parent adecacf9c7
commit 0ff034b01b
16 changed files with 106 additions and 106 deletions

View File

@ -29,7 +29,7 @@ def asset_submissions(path):
@app.get("/submit/marseys") @app.get("/submit/marseys")
@auth_required @auth_required
def submit_marseys(v): def submit_marseys(v:User):
if v.admin_level >= PERMS['VIEW_PENDING_SUBMITTED_MARSEYS']: if v.admin_level >= PERMS['VIEW_PENDING_SUBMITTED_MARSEYS']:
marseys = g.db.query(Marsey).filter(Marsey.submitter_id != None).all() marseys = g.db.query(Marsey).filter(Marsey.submitter_id != None).all()
else: else:
@ -44,7 +44,7 @@ def submit_marseys(v):
@app.post("/submit/marseys") @app.post("/submit/marseys")
@auth_required @auth_required
def submit_marsey(v): def submit_marsey(v:User):
file = request.files["image"] file = request.files["image"]
name = request.values.get('name', '').lower().strip() name = request.values.get('name', '').lower().strip()
tags = request.values.get('tags', '').lower().strip() tags = request.values.get('tags', '').lower().strip()
@ -195,12 +195,12 @@ def remove_asset(cls, type_name:str, v:User, name:str) -> dict[str, str]:
@app.post("/remove/marsey/<name>") @app.post("/remove/marsey/<name>")
@auth_required @auth_required
def remove_marsey(v, name): def remove_marsey(v:User, name):
return remove_asset(Marsey, "marsey", v, name) return remove_asset(Marsey, "marsey", v, name)
@app.get("/submit/hats") @app.get("/submit/hats")
@auth_required @auth_required
def submit_hats(v): def submit_hats(v:User):
if v.admin_level >= PERMS['VIEW_PENDING_SUBMITTED_HATS']: hats = g.db.query(HatDef).filter(HatDef.submitter_id != None).all() 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() 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("submit_hats.html", v=v, hats=hats)
@ -208,7 +208,7 @@ def submit_hats(v):
@app.post("/submit/hats") @app.post("/submit/hats")
@auth_required @auth_required
def submit_hat(v): def submit_hat(v:User):
name = request.values.get('name', '').strip() name = request.values.get('name', '').strip()
description = request.values.get('description', '').strip() description = request.values.get('description', '').strip()
username = request.values.get('author', '').strip() username = request.values.get('author', '').strip()
@ -328,7 +328,7 @@ def approve_hat(v, name):
@app.post("/remove/hat/<name>") @app.post("/remove/hat/<name>")
@auth_required @auth_required
def remove_hat(v, name): def remove_hat(v:User, name):
return remove_asset(HatDef, 'hat', v, name) return remove_asset(HatDef, 'hat', v, name)
@app.get("/admin/update/marseys") @app.get("/admin/update/marseys")

View File

@ -22,7 +22,7 @@ from .front import frontlist
@app.get("/shop") @app.get("/shop")
@app.get("/settings/shop") @app.get("/settings/shop")
@auth_required @auth_required
def shop(v): def shop(v:User):
AWARDS = deepcopy(AWARDS2) AWARDS = deepcopy(AWARDS2)
if v.house: if v.house:
@ -46,7 +46,7 @@ def shop(v):
@app.post("/buy/<award>") @app.post("/buy/<award>")
@limiter.limit("100/minute;200/hour;1000/day") @limiter.limit("100/minute;200/hour;1000/day")
@auth_required @auth_required
def buy(v, award): def buy(v:User, award):
if award == 'benefactor' and not request.values.get("mb"): if award == 'benefactor' and not request.values.get("mb"):
abort(403, "You can only buy the Benefactor award with marseybux.") abort(403, "You can only buy the Benefactor award with marseybux.")

View File

@ -14,7 +14,7 @@ from files.__main__ import app, limiter
@app.get("/casino") @app.get("/casino")
@limiter.limit("100/minute;2000/hour;12000/day") @limiter.limit("100/minute;2000/hour;12000/day")
@auth_required @auth_required
def casino(v): def casino(v:User):
if v.rehab: if v.rehab:
return render_template("casino/rehab.html", v=v), 403 return render_template("casino/rehab.html", v=v), 403
@ -24,7 +24,7 @@ def casino(v):
@app.get("/casino/<game>") @app.get("/casino/<game>")
@limiter.limit("100/minute;2000/hour;12000/day") @limiter.limit("100/minute;2000/hour;12000/day")
@auth_required @auth_required
def casino_game_page(v, game): def casino_game_page(v:User, game):
if v.rehab: if v.rehab:
return render_template("casino/rehab.html", v=v), 403 return render_template("casino/rehab.html", v=v), 403
elif game not in CASINO_GAME_KINDS: elif game not in CASINO_GAME_KINDS:
@ -53,7 +53,7 @@ def casino_game_page(v, game):
@app.get("/casino/<game>/feed") @app.get("/casino/<game>/feed")
@limiter.limit("100/minute;2000/hour;12000/day") @limiter.limit("100/minute;2000/hour;12000/day")
@auth_required @auth_required
def casino_game_feed(v, game): def casino_game_feed(v:User, game):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
elif game not in CASINO_GAME_KINDS: elif game not in CASINO_GAME_KINDS:
@ -67,7 +67,7 @@ def casino_game_feed(v, game):
@app.get("/lottershe") @app.get("/lottershe")
@limiter.limit("100/minute;2000/hour;12000/day") @limiter.limit("100/minute;2000/hour;12000/day")
@auth_required @auth_required
def lottershe(v): def lottershe(v:User):
if v.rehab: if v.rehab:
return render_template("casino/rehab.html", v=v) return render_template("casino/rehab.html", v=v)
@ -78,7 +78,7 @@ def lottershe(v):
@app.post("/casino/slots") @app.post("/casino/slots")
@limiter.limit("100/minute;2000/hour;12000/day") @limiter.limit("100/minute;2000/hour;12000/day")
@auth_required @auth_required
def pull_slots(v): def pull_slots(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
@ -109,7 +109,7 @@ def pull_slots(v):
@app.post("/casino/twentyone/deal") @app.post("/casino/twentyone/deal")
@limiter.limit("1/second;100/minute;2000/hour;12000/day") @limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required @auth_required
def blackjack_deal_to_player(v): def blackjack_deal_to_player(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
@ -128,7 +128,7 @@ def blackjack_deal_to_player(v):
@app.post("/casino/twentyone/hit") @app.post("/casino/twentyone/hit")
@limiter.limit("1/second;100/minute;2000/hour;12000/day") @limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required @auth_required
def blackjack_player_hit(v): def blackjack_player_hit(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
@ -143,7 +143,7 @@ def blackjack_player_hit(v):
@app.post("/casino/twentyone/stay") @app.post("/casino/twentyone/stay")
@limiter.limit("1/second;100/minute;2000/hour;12000/day") @limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required @auth_required
def blackjack_player_stay(v): def blackjack_player_stay(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
@ -158,7 +158,7 @@ def blackjack_player_stay(v):
@app.post("/casino/twentyone/double-down") @app.post("/casino/twentyone/double-down")
@limiter.limit("1/second;100/minute;2000/hour;12000/day") @limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required @auth_required
def blackjack_player_doubled_down(v): def blackjack_player_doubled_down(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
@ -173,7 +173,7 @@ def blackjack_player_doubled_down(v):
@app.post("/casino/twentyone/buy-insurance") @app.post("/casino/twentyone/buy-insurance")
@limiter.limit("1/second;100/minute;2000/hour;12000/day") @limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required @auth_required
def blackjack_player_bought_insurance(v): def blackjack_player_bought_insurance(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
@ -188,7 +188,7 @@ def blackjack_player_bought_insurance(v):
@app.get("/casino/roulette/bets") @app.get("/casino/roulette/bets")
@limiter.limit("100/minute;2000/hour;12000/day") @limiter.limit("100/minute;2000/hour;12000/day")
@auth_required @auth_required
def roulette_get_bets(v): def roulette_get_bets(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")
@ -200,7 +200,7 @@ def roulette_get_bets(v):
@app.post("/casino/roulette/place-bet") @app.post("/casino/roulette/place-bet")
@limiter.limit("100/minute;2000/hour;12000/day") @limiter.limit("100/minute;2000/hour;12000/day")
@auth_required @auth_required
def roulette_player_placed_bet(v): def roulette_player_placed_bet(v:User):
if v.rehab: if v.rehab:
abort(403, "You are under Rehab award effect!") abort(403, "You are under Rehab award effect!")

View File

@ -179,7 +179,7 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
@app.get("/random_post") @app.get("/random_post")
@auth_required @auth_required
def random_post(v): def random_post(v:User):
p = g.db.query(Submission.id).filter(Submission.deleted_utc == 0, Submission.is_banned == False, Submission.private == False).order_by(func.random()).first() p = g.db.query(Submission.id).filter(Submission.deleted_utc == 0, Submission.is_banned == False, Submission.private == False).order_by(func.random()).first()
@ -191,7 +191,7 @@ def random_post(v):
@app.get("/random_user") @app.get("/random_user")
@auth_required @auth_required
def random_user(v): def random_user(v:User):
u = g.db.query(User.username).filter(User.song != None, User.shadowbanned == None).order_by(func.random()).first() u = g.db.query(User.username).filter(User.song != None, User.shadowbanned == None).order_by(func.random()).first()
if u: u = u[0] if u: u = u[0]
@ -202,7 +202,7 @@ def random_user(v):
@app.get("/comments") @app.get("/comments")
@auth_required @auth_required
def all_comments(v): def all_comments(v:User):
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1 except: page = 1

View File

@ -9,7 +9,7 @@ from files.__main__ import app, limiter
@app.get("/hats") @app.get("/hats")
@auth_required @auth_required
def hats(v): def hats(v:User):
owned_hat_ids = [x.hat_id for x in v.owned_hats] owned_hat_ids = [x.hat_id for x in v.owned_hats]
if request.values.get("sort") == 'author_asc': if request.values.get("sort") == 'author_asc':
@ -34,7 +34,7 @@ def hats(v):
@app.post("/buy_hat/<hat_id>") @app.post("/buy_hat/<hat_id>")
@limiter.limit('100/minute;1000/3 days') @limiter.limit('100/minute;1000/3 days')
@auth_required @auth_required
def buy_hat(v, hat_id): def buy_hat(v:User, hat_id):
try: hat_id = int(hat_id) try: hat_id = int(hat_id)
except: abort(404, "Hat not found!") except: abort(404, "Hat not found!")
@ -84,7 +84,7 @@ def buy_hat(v, hat_id):
@app.post("/equip_hat/<hat_id>") @app.post("/equip_hat/<hat_id>")
@auth_required @auth_required
def equip_hat(v, hat_id): def equip_hat(v:User, hat_id):
try: hat_id = int(hat_id) try: hat_id = int(hat_id)
except: abort(404, "Hat not found!") except: abort(404, "Hat not found!")
@ -98,7 +98,7 @@ def equip_hat(v, hat_id):
@app.post("/unequip_hat/<hat_id>") @app.post("/unequip_hat/<hat_id>")
@auth_required @auth_required
def unequip_hat(v, hat_id): def unequip_hat(v:User, hat_id):
try: hat_id = int(hat_id) try: hat_id = int(hat_id)
except: abort(404, "Hat not found!") except: abort(404, "Hat not found!")
@ -112,7 +112,7 @@ def unequip_hat(v, hat_id):
@app.get("/hat_owners/<hat_id>") @app.get("/hat_owners/<hat_id>")
@auth_required @auth_required
def hat_owners(v, hat_id): def hat_owners(v:User, hat_id):
try: hat_id = int(hat_id) try: hat_id = int(hat_id)
except: abort(404, "Hat not found!") except: abort(404, "Hat not found!")

View File

@ -21,7 +21,7 @@ NO_LOGIN_REDIRECT_URLS = ("/login", "/logout", "/signup", "/forgot", "/reset", "
@app.get("/login") @app.get("/login")
@auth_desired @auth_desired
def login_get(v): def login_get(v:Optional[User]):
redir = request.values.get("redirect", "/").strip().rstrip('?').lower() redir = request.values.get("redirect", "/").strip().rstrip('?').lower()
if redir: if redir:
if not is_site_url(redir) or redir in NO_LOGIN_REDIRECT_URLS: if not is_site_url(redir) or redir in NO_LOGIN_REDIRECT_URLS:
@ -131,7 +131,7 @@ def on_login(account, redir=None):
@app.get("/me") @app.get("/me")
@app.get("/@me") @app.get("/@me")
@auth_required @auth_required
def me(v): def me(v:User):
if v.client: return v.json if v.client: return v.json
else: return redirect(v.url) else: return redirect(v.url)
@ -149,7 +149,7 @@ def logout(v):
@app.get("/signup") @app.get("/signup")
@auth_desired @auth_desired
def sign_up_get(v): def sign_up_get(v:Optional[User]):
if not get_setting('Signups'): if not get_setting('Signups'):
abort(403, "New account registration is currently closed. Please come back later.") abort(403, "New account registration is currently closed. Please come back later.")
@ -199,7 +199,7 @@ def sign_up_get(v):
@app.post("/signup") @app.post("/signup")
@limiter.limit("1/second;10/day") @limiter.limit("1/second;10/day")
@auth_desired @auth_desired
def sign_up_post(v): def sign_up_post(v:Optional[User]):
if not get_setting('Signups'): if not get_setting('Signups'):
abort(403, "New account registration is currently closed. Please come back later.") abort(403, "New account registration is currently closed. Please come back later.")
@ -416,7 +416,7 @@ def get_reset():
@app.post("/reset") @app.post("/reset")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER) @limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_desired @auth_desired
def post_reset(v): def post_reset(v:Optional[User]):
if v: return redirect('/') if v: return redirect('/')
user_id = request.values.get("user_id") user_id = request.values.get("user_id")
timestamp = 0 timestamp = 0
@ -454,7 +454,7 @@ def post_reset(v):
@app.get("/lost_2fa") @app.get("/lost_2fa")
@auth_desired @auth_desired
def lost_2fa(v): def lost_2fa(v:Optional[User]):
if v and not v.mfa_secret: abort(400, "You don't have 2FA enabled") if v and not v.mfa_secret: abort(400, "You don't have 2FA enabled")
return render_template("login/lost_2fa.html", v=v) return render_template("login/lost_2fa.html", v=v)

View File

@ -23,7 +23,7 @@ def lottery_start(v):
@app.post("/lottery/buy") @app.post("/lottery/buy")
@limiter.limit("3/second;100/minute;500/hour;1000/day") @limiter.limit("3/second;100/minute;500/hour;1000/day")
@auth_required @auth_required
def lottery_buy(v): def lottery_buy(v:User):
try: quantity = int(request.values.get("quantity")) try: quantity = int(request.values.get("quantity"))
except: abort(400, "Invalid ticket quantity.") except: abort(400, "Invalid ticket quantity.")
@ -40,7 +40,7 @@ def lottery_buy(v):
@app.get("/lottery/active") @app.get("/lottery/active")
@limiter.limit("3/second;100/minute;500/hour;1000/day") @limiter.limit("3/second;100/minute;500/hour;1000/day")
@auth_required @auth_required
def lottery_active(v): def lottery_active(v:User):
lottery, participants = get_active_lottery_stats() lottery, participants = get_active_lottery_stats()
return {"message": "", "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}} return {"message": "", "stats": {"user": v.lottery_stats, "lottery": lottery, "participants": participants}}

View File

@ -19,7 +19,7 @@ def verify_email(v):
@app.get("/activate") @app.get("/activate")
@auth_required @auth_required
def activate(v): def activate(v:User):
email = request.values.get("email", "").strip().lower() email = request.values.get("email", "").strip().lower()
if not email_regex.fullmatch(email): if not email_regex.fullmatch(email):

View File

@ -68,7 +68,7 @@ def notifications_modmail(v):
@app.get("/notifications/messages") @app.get("/notifications/messages")
@auth_required @auth_required
def notifications_messages(v): def notifications_messages(v:User):
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1 except: page = 1
@ -137,7 +137,7 @@ def notifications_messages(v):
@app.get("/notifications/posts") @app.get("/notifications/posts")
@auth_required @auth_required
def notifications_posts(v): def notifications_posts(v:User):
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1 except: page = 1
@ -179,7 +179,7 @@ def notifications_posts(v):
@app.get("/notifications/modactions") @app.get("/notifications/modactions")
@auth_required @auth_required
def notifications_modactions(v): def notifications_modactions(v:User):
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1 except: page = 1
@ -218,7 +218,7 @@ def notifications_modactions(v):
@app.get("/notifications/reddit") @app.get("/notifications/reddit")
@auth_required @auth_required
def notifications_reddit(v): def notifications_reddit(v:User):
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1 except: page = 1
@ -263,7 +263,7 @@ def notifications_reddit(v):
@app.get("/notifications") @app.get("/notifications")
@auth_required @auth_required
def notifications(v): def notifications(v:User):
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1 except: page = 1

View File

@ -9,7 +9,7 @@ from files.__main__ import app, limiter
@app.get("/authorize") @app.get("/authorize")
@auth_required @auth_required
def authorize_prompt(v): def authorize_prompt(v:User):
client_id = request.values.get("client_id") client_id = request.values.get("client_id")
application = g.db.query(OauthApp).filter_by(client_id=client_id).one_or_none() 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 {"oauth_error": "Invalid `client_id`"}, 401

View File

@ -123,7 +123,7 @@ def publish(pid, v):
@app.get("/submit") @app.get("/submit")
@app.get("/h/<sub>/submit") @app.get("/h/<sub>/submit")
@auth_required @auth_required
def submit_get(v, sub=None): def submit_get(v:User, sub=None):
sub = get_sub_by_name(sub, graceful=True) sub = get_sub_by_name(sub, graceful=True)
if request.path.startswith('/h/') and not sub: abort(404) if request.path.startswith('/h/') and not sub: abort(404)
@ -604,7 +604,7 @@ def is_repost():
@limiter.limit(POST_RATE_LIMIT) @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("lo_user")}')
@auth_required @auth_required
def submit_post(v, sub=None): def submit_post(v:User, sub=None):
url = request.values.get("url", "").strip() url = request.values.get("url", "").strip()

View File

@ -45,7 +45,7 @@ def searchparse(text):
@app.get("/search/posts") @app.get("/search/posts")
@auth_required @auth_required
def searchposts(v): def searchposts(v:User):
query = request.values.get("q", '').strip() query = request.values.get("q", '').strip()
@ -181,7 +181,7 @@ def searchposts(v):
@app.get("/search/comments") @app.get("/search/comments")
@auth_required @auth_required
def searchcomments(v): def searchcomments(v:User):
query = request.values.get("q", '').strip() query = request.values.get("q", '').strip()
try: page = max(1, int(request.values.get("page", 1))) try: page = max(1, int(request.values.get("page", 1)))
@ -276,7 +276,7 @@ def searchcomments(v):
@app.get("/search/users") @app.get("/search/users")
@auth_required @auth_required
def searchusers(v): def searchusers(v:User):
query = request.values.get("q", '').strip() query = request.values.get("q", '').strip()

View File

@ -26,12 +26,12 @@ from files.__main__ import app, cache, limiter
@app.get("/settings") @app.get("/settings")
@auth_required @auth_required
def settings(v): def settings(v:User):
return redirect("/settings/personal") return redirect("/settings/personal")
@app.get("/settings/personal") @app.get("/settings/personal")
@auth_required @auth_required
def settings_personal(v): def settings_personal(v:User):
return render_template("settings/personal.html", v=v) return render_template("settings/personal.html", v=v)
@app.delete('/settings/background') @app.delete('/settings/background')
@ -301,7 +301,7 @@ def settings_personal_post(v):
@app.post("/settings/filters") @app.post("/settings/filters")
@auth_required @auth_required
def filters(v): def filters(v:User):
filters=request.values.get("filters")[:1000].strip() filters=request.values.get("filters")[:1000].strip()
if filters == v.custom_filter_list: if filters == v.custom_filter_list:
@ -540,7 +540,7 @@ def settings_images_banner(v):
@app.get("/settings/css") @app.get("/settings/css")
@auth_required @auth_required
def settings_css_get(v): def settings_css_get(v:User):
return render_template("settings/css.html", v=v) return render_template("settings/css.html", v=v)
@app.post("/settings/css") @app.post("/settings/css")
@ -572,7 +572,7 @@ def settings_profilecss(v):
@app.get("/settings/security") @app.get("/settings/security")
@auth_required @auth_required
def settings_security(v): def settings_security(v:User):
return render_template("settings/security.html", return render_template("settings/security.html",
v=v, v=v,
mfa_secret=pyotp.random_base32() if not v.mfa_secret else None, mfa_secret=pyotp.random_base32() if not v.mfa_secret else None,
@ -622,12 +622,12 @@ def settings_unblock_user(v):
@app.get("/settings/apps") @app.get("/settings/apps")
@auth_required @auth_required
def settings_apps(v): def settings_apps(v:User):
return render_template("settings/apps.html", v=v) return render_template("settings/apps.html", v=v)
@app.get("/settings/advanced") @app.get("/settings/advanced")
@auth_required @auth_required
def settings_advanced_get(v): def settings_advanced_get(v:User):
return render_template("settings/advanced.html", v=v) return render_template("settings/advanced.html", v=v)
@app.post("/settings/name_change") @app.post("/settings/name_change")

View File

@ -25,7 +25,7 @@ def rdrama(id, title):
@app.get("/marseys") @app.get("/marseys")
@auth_required @auth_required
def marseys(v): def marseys(v:User):
if SITE == 'rdrama.net': if SITE == 'rdrama.net':
marseys = g.db.query(Marsey, User).join(User, Marsey.author_id == User.id).filter(Marsey.submitter_id==None) marseys = g.db.query(Marsey, User).join(User, Marsey.author_id == User.id).filter(Marsey.submitter_id==None)
sort = request.values.get("sort", "usage") sort = request.values.get("sort", "usage")
@ -74,13 +74,13 @@ def marsey_list():
@app.get('/sidebar') @app.get('/sidebar')
@auth_desired @auth_desired
def sidebar(v): def sidebar(v:Optional[User]):
return render_template('sidebar.html', v=v) return render_template('sidebar.html', v=v)
@app.get("/stats") @app.get("/stats")
@auth_required @auth_required
def participation_stats(v): def participation_stats(v:User):
if v.client: return stats_cached() if v.client: return stats_cached()
return render_template("stats.html", v=v, title="Content Statistics", data=stats_cached()) return render_template("stats.html", v=v, title="Content Statistics", data=stats_cached())
@ -94,12 +94,12 @@ def chart():
@app.get("/weekly_chart") @app.get("/weekly_chart")
@auth_required @auth_required
def weekly_chart(v): def weekly_chart(v:User):
return send_file(statshelper.chart_path(kind="weekly", site=SITE)) return send_file(statshelper.chart_path(kind="weekly", site=SITE))
@app.get("/daily_chart") @app.get("/daily_chart")
@auth_required @auth_required
def daily_chart(v): def daily_chart(v:User):
return send_file(statshelper.chart_path(kind="daily", site=SITE)) return send_file(statshelper.chart_path(kind="daily", site=SITE))
@app.get("/patrons") @app.get("/patrons")
@ -115,14 +115,14 @@ def patrons(v):
@app.get("/admins") @app.get("/admins")
@app.get("/badmins") @app.get("/badmins")
@auth_required @auth_required
def admins(v): def admins(v:User):
admins = g.db.query(User).filter(User.admin_level >= PERMS['ADMIN_MOP_VISIBLE']).order_by(User.truescore.desc()).all() admins = g.db.query(User).filter(User.admin_level >= PERMS['ADMIN_MOP_VISIBLE']).order_by(User.truescore.desc()).all()
return render_template("admins.html", v=v, admins=admins) return render_template("admins.html", v=v, admins=admins)
@app.get("/log") @app.get("/log")
@app.get("/modlog") @app.get("/modlog")
@auth_required @auth_required
def log(v): def log(v:User):
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1 except: page = 1
@ -185,7 +185,7 @@ def log_item(id, v):
@app.get("/directory") @app.get("/directory")
@auth_required @auth_required
def static_megathread_index(v): def static_megathread_index(v:User):
return render_template("megathread_index.html", v=v) return render_template("megathread_index.html", v=v)
@app.get("/contact") @app.get("/contact")
@ -194,7 +194,7 @@ def static_megathread_index(v):
@app.get("/press") @app.get("/press")
@app.get("/media") @app.get("/media")
@auth_desired @auth_desired
def contact(v): def contact(v:Optional[User]):
return render_template("contact.html", v=v) return render_template("contact.html", v=v)
@app.post("/send_admin") @app.post("/send_admin")
@ -321,7 +321,7 @@ def badge_list(site):
@app.get("/badges") @app.get("/badges")
@feature_required('BADGES') @feature_required('BADGES')
@auth_required @auth_required
def badges(v): def badges(v:User):
badges, counts = badge_list(SITE) badges, counts = badge_list(SITE)
return render_template("badges.html", v=v, badges=badges, counts=counts) return render_template("badges.html", v=v, badges=badges, counts=counts)
@ -342,7 +342,7 @@ def blocks(v):
@app.get("/banned") @app.get("/banned")
@auth_required @auth_required
def banned(v): def banned(v:User):
users = g.db.query(User).filter(User.is_banned > 0, User.unban_utc == 0) users = g.db.query(User).filter(User.is_banned > 0, User.unban_utc == 0)
if not v.can_see_shadowbanned: if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None) users = users.filter(User.shadowbanned == None)
@ -351,12 +351,12 @@ def banned(v):
@app.get("/formatting") @app.get("/formatting")
@auth_required @auth_required
def formatting(v): def formatting(v:User):
return render_template("formatting.html", v=v) return render_template("formatting.html", v=v)
@app.get("/app") @app.get("/app")
@auth_desired @auth_desired
def mobile_app(v): def mobile_app(v:Optional[User]):
return render_template("app.html", v=v) return render_template("app.html", v=v)
@app.get("/service-worker.js") @app.get("/service-worker.js")
@ -384,7 +384,7 @@ def transfers_id(id, v):
@app.get("/transfers") @app.get("/transfers")
@auth_required @auth_required
def transfers(v): def transfers(v:User):
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("%</a> has transferred %")).order_by(Comment.id.desc())

View File

@ -107,7 +107,7 @@ def unexile(v, sub, uid):
@app.post("/h/<sub>/block") @app.post("/h/<sub>/block")
@auth_required @auth_required
def block_sub(v, sub): def block_sub(v:User, sub):
sub = get_sub_by_name(sub).name sub = get_sub_by_name(sub).name
existing = g.db.query(SubBlock).filter_by(user_id=v.id, sub=sub).one_or_none() existing = g.db.query(SubBlock).filter_by(user_id=v.id, sub=sub).one_or_none()
@ -121,7 +121,7 @@ def block_sub(v, sub):
@app.post("/h/<sub>/unblock") @app.post("/h/<sub>/unblock")
@auth_required @auth_required
def unblock_sub(v, sub): def unblock_sub(v:User, sub):
sub = get_sub_by_name(sub).name sub = get_sub_by_name(sub).name
if sub == "chudrama" and not v.can_see_chudrama: abort(403) if sub == "chudrama" and not v.can_see_chudrama: abort(403)
block = g.db.query(SubBlock).filter_by(user_id=v.id, sub=sub).one_or_none() block = g.db.query(SubBlock).filter_by(user_id=v.id, sub=sub).one_or_none()
@ -135,7 +135,7 @@ def unblock_sub(v, sub):
@app.post("/h/<sub>/subscribe") @app.post("/h/<sub>/subscribe")
@auth_required @auth_required
def subscribe_sub(v, sub): def subscribe_sub(v:User, sub):
sub = get_sub_by_name(sub).name sub = get_sub_by_name(sub).name
existing = g.db.query(SubJoin).filter_by(user_id=v.id, sub=sub).one_or_none() existing = g.db.query(SubJoin).filter_by(user_id=v.id, sub=sub).one_or_none()
@ -148,7 +148,7 @@ def subscribe_sub(v, sub):
@app.post("/h/<sub>/unsubscribe") @app.post("/h/<sub>/unsubscribe")
@auth_required @auth_required
def unsubscribe_sub(v, sub): def unsubscribe_sub(v:User, sub):
sub = get_sub_by_name(sub).name sub = get_sub_by_name(sub).name
subscribe = g.db.query(SubJoin).filter_by(user_id=v.id, sub=sub).one_or_none() subscribe = g.db.query(SubJoin).filter_by(user_id=v.id, sub=sub).one_or_none()
@ -160,7 +160,7 @@ def unsubscribe_sub(v, sub):
@app.post("/h/<sub>/follow") @app.post("/h/<sub>/follow")
@auth_required @auth_required
def follow_sub(v, sub): def follow_sub(v:User, sub):
sub = get_sub_by_name(sub) sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403) if sub.name == "chudrama" 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() existing = g.db.query(SubSubscription).filter_by(user_id=v.id, sub=sub.name).one_or_none()
@ -173,7 +173,7 @@ def follow_sub(v, sub):
@app.post("/h/<sub>/unfollow") @app.post("/h/<sub>/unfollow")
@auth_required @auth_required
def unfollow_sub(v, sub): def unfollow_sub(v:User, sub):
sub = get_sub_by_name(sub) sub = get_sub_by_name(sub)
subscription = g.db.query(SubSubscription).filter_by(user_id=v.id, sub=sub.name).one_or_none() subscription = g.db.query(SubSubscription).filter_by(user_id=v.id, sub=sub.name).one_or_none()
if subscription: if subscription:
@ -184,7 +184,7 @@ def unfollow_sub(v, sub):
@app.get("/h/<sub>/mods") @app.get("/h/<sub>/mods")
@auth_required @auth_required
def mods(v, sub): def mods(v:User, sub):
sub = get_sub_by_name(sub) sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403) if sub.name == "chudrama" 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() users = g.db.query(User, Mod).join(Mod).filter_by(sub=sub.name).order_by(Mod.created_utc).all()
@ -194,7 +194,7 @@ def mods(v, sub):
@app.get("/h/<sub>/exilees") @app.get("/h/<sub>/exilees")
@auth_required @auth_required
def sub_exilees(v, sub): def sub_exilees(v:User, sub):
sub = get_sub_by_name(sub) sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403) if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, Exile).join(Exile, Exile.user_id==User.id) \ users = g.db.query(User, Exile).join(Exile, Exile.user_id==User.id) \
@ -206,7 +206,7 @@ def sub_exilees(v, sub):
@app.get("/h/<sub>/blockers") @app.get("/h/<sub>/blockers")
@auth_required @auth_required
def sub_blockers(v, sub): def sub_blockers(v:User, sub):
sub = get_sub_by_name(sub) sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403) if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, SubBlock).join(SubBlock) \ users = g.db.query(User, SubBlock).join(SubBlock) \
@ -219,7 +219,7 @@ def sub_blockers(v, sub):
@app.get("/h/<sub>/followers") @app.get("/h/<sub>/followers")
@auth_required @auth_required
def sub_followers(v, sub): def sub_followers(v:User, sub):
sub = get_sub_by_name(sub) sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403) if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, SubSubscription).join(SubSubscription) \ users = g.db.query(User, SubSubscription).join(SubSubscription) \
@ -554,7 +554,7 @@ def sub_marsey(v, sub):
@app.get("/holes") @app.get("/holes")
@auth_required @auth_required
def subs(v): def subs(v:User):
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() 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() total_users = g.db.query(User).count()
return render_template('sub/subs.html', v=v, subs=subs, total_users=total_users) return render_template('sub/subs.html', v=v, subs=subs, total_users=total_users)
@ -699,7 +699,7 @@ def mod_unpin(cid, v):
@app.get("/h/<sub>/log") @app.get("/h/<sub>/log")
@app.get("/h/<sub>/modlog") @app.get("/h/<sub>/modlog")
@auth_required @auth_required
def hole_log(v, sub): def hole_log(v:User, sub):
sub = get_sub_by_name(sub) sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403) if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
try: page = max(int(request.values.get("page", 1)), 1) try: page = max(int(request.values.get("page", 1)), 1)

View File

@ -56,25 +56,25 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta
@app.get("/@<username>/upvoters/<uid>/posts") @app.get("/@<username>/upvoters/<uid>/posts")
@auth_required @auth_required
def upvoters_posts(v, username, uid): def upvoters_posts(v:User, 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, "userpage/voted_posts.html", None)
@app.get("/@<username>/upvoters/<uid>/comments") @app.get("/@<username>/upvoters/<uid>/comments")
@auth_required @auth_required
def upvoters_comments(v, username, uid): def upvoters_comments(v:User, 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, "userpage/voted_comments.html", True)
@app.get("/@<username>/downvoters/<uid>/posts") @app.get("/@<username>/downvoters/<uid>/posts")
@auth_required @auth_required
def downvoters_posts(v, username, uid): def downvoters_posts(v:User, 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, "userpage/voted_posts.html", None)
@app.get("/@<username>/downvoters/<uid>/comments") @app.get("/@<username>/downvoters/<uid>/comments")
@auth_required @auth_required
def downvoters_comments(v, username, uid): def downvoters_comments(v:User, 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, "userpage/voted_comments.html", True)
def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, standalone): def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, standalone):
@ -107,25 +107,25 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta
@app.get("/@<username>/upvoting/<uid>/posts") @app.get("/@<username>/upvoting/<uid>/posts")
@auth_required @auth_required
def upvoting_posts(v, username, uid): def upvoting_posts(v:User, 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, "userpage/voted_posts.html", None)
@app.get("/@<username>/upvoting/<uid>/comments") @app.get("/@<username>/upvoting/<uid>/comments")
@auth_required @auth_required
def upvoting_comments(v, username, uid): def upvoting_comments(v:User, 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, "userpage/voted_comments.html", True)
@app.get("/@<username>/downvoting/<uid>/posts") @app.get("/@<username>/downvoting/<uid>/posts")
@auth_required @auth_required
def downvoting_posts(v, username, uid): def downvoting_posts(v:User, 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, "userpage/voted_posts.html", None)
@app.get("/@<username>/downvoting/<uid>/comments") @app.get("/@<username>/downvoting/<uid>/comments")
@auth_required @auth_required
def downvoting_comments(v, username, uid): def downvoting_comments(v:User, 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, "userpage/voted_comments.html", True)
def user_voted(v, username, cls, vote_cls, template, standalone): def user_voted(v, username, cls, vote_cls, template, standalone):
@ -158,19 +158,19 @@ def user_voted(v, username, cls, vote_cls, template, standalone):
@app.get("/@<username>/voted/posts") @app.get("/@<username>/voted/posts")
@auth_required @auth_required
def user_voted_posts(v, username): def user_voted_posts(v:User, username):
return user_voted(v, username, Submission, Vote, "userpage/voted_posts.html", None) return user_voted(v, username, Submission, Vote, "userpage/voted_posts.html", None)
@app.get("/@<username>/voted/comments") @app.get("/@<username>/voted/comments")
@auth_required @auth_required
def user_voted_comments(v, username): def user_voted_comments(v:User, username):
return user_voted(v, username, Comment, CommentVote, "userpage/voted_comments.html", True) return user_voted(v, username, Comment, CommentVote, "userpage/voted_comments.html", True)
@app.get("/grassed") @app.get("/grassed")
@auth_required @auth_required
def grassed(v): def grassed(v:User):
users = g.db.query(User).filter(User.ban_reason.like('grass award used by @%')) users = g.db.query(User).filter(User.ban_reason.like('grass award used by @%'))
if not v.can_see_shadowbanned: if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None) users = users.filter(User.shadowbanned == None)
@ -179,7 +179,7 @@ def grassed(v):
@app.get("/chuds") @app.get("/chuds")
@auth_required @auth_required
def chuds(v): def chuds(v:User):
users = g.db.query(User).filter(User.agendaposter == 1) users = g.db.query(User).filter(User.agendaposter == 1)
if not v.can_see_shadowbanned: if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None) users = users.filter(User.shadowbanned == None)
@ -233,22 +233,22 @@ def all_upvoters_downvoters(v, username, vote_dir, is_who_simps_hates):
@app.get("/@<username>/upvoters") @app.get("/@<username>/upvoters")
@auth_required @auth_required
def upvoters(v, username): def upvoters(v:User, username):
return all_upvoters_downvoters(v, username, 1, False) return all_upvoters_downvoters(v, username, 1, False)
@app.get("/@<username>/downvoters") @app.get("/@<username>/downvoters")
@auth_required @auth_required
def downvoters(v, username): def downvoters(v:User, username):
return all_upvoters_downvoters(v, username, -1, False) return all_upvoters_downvoters(v, username, -1, False)
@app.get("/@<username>/upvoting") @app.get("/@<username>/upvoting")
@auth_required @auth_required
def upvoting(v, username): def upvoting(v:User, username):
return all_upvoters_downvoters(v, username, 1, True) return all_upvoters_downvoters(v, username, 1, True)
@app.get("/@<username>/downvoting") @app.get("/@<username>/downvoting")
@auth_required @auth_required
def downvoting(v, username): def downvoting(v:User, username):
return all_upvoters_downvoters(v, username, -1, True) return all_upvoters_downvoters(v, username, -1, True)
@app.post("/@<username>/suicide") @app.post("/@<username>/suicide")
@ -266,7 +266,7 @@ def suicide(v, username):
@app.get("/@<username>/coins") @app.get("/@<username>/coins")
@auth_required @auth_required
def get_coins(v, username): def get_coins(v:User, username):
user = get_user(username, v=v, include_shadowbanned=False) user = get_user(username, v=v, include_shadowbanned=False)
return {"coins": user.coins} return {"coins": user.coins}
@ -326,7 +326,7 @@ def transfer_bux(v, username):
@app.get("/leaderboard") @app.get("/leaderboard")
@auth_required @auth_required
def leaderboard(v): def leaderboard(v:User):
users = g.db.query(User) users = g.db.query(User)
if not v.can_see_shadowbanned: if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None) users = users.filter(User.shadowbanned == None)
@ -656,7 +656,7 @@ def following(username, v):
@app.get("/views") @app.get("/views")
@auth_required @auth_required
def visitors(v): def visitors(v:User):
if not v.viewers_recorded: if not v.viewers_recorded:
return render_template("errors/patron.html", v=v) return render_template("errors/patron.html", v=v)
viewers=sorted(v.viewers, key = lambda x: x.last_view_utc, reverse=True) viewers=sorted(v.viewers, key = lambda x: x.last_view_utc, reverse=True)
@ -963,7 +963,7 @@ def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone
@app.get("/@<username>/saved/posts") @app.get("/@<username>/saved/posts")
@auth_required @auth_required
def saved_posts(v, username): def saved_posts(v:User, username):
try: page = max(1, int(request.values.get("page", 1))) try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!") except: abort(400, "Invalid page input!")
@ -971,7 +971,7 @@ def saved_posts(v, username):
@app.get("/@<username>/saved/comments") @app.get("/@<username>/saved/comments")
@auth_required @auth_required
def saved_comments(v, username): def saved_comments(v:User, username):
try: page = max(1, int(request.values.get("page", 1))) try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!") except: abort(400, "Invalid page input!")
@ -979,7 +979,7 @@ def saved_comments(v, username):
@app.get("/@<username>/subscribed/posts") @app.get("/@<username>/subscribed/posts")
@auth_required @auth_required
def subscribed_posts(v, username): def subscribed_posts(v:User, username):
try: page = max(1, int(request.values.get("page", 1))) try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!") except: abort(400, "Invalid page input!")
@ -987,7 +987,7 @@ def subscribed_posts(v, username):
@app.post("/fp/<fp>") @app.post("/fp/<fp>")
@auth_required @auth_required
def fp(v, fp): def fp(v:User, fp):
v.fp = fp v.fp = fp
users = g.db.query(User).filter(User.fp == fp, User.id != v.id).all() users = g.db.query(User).filter(User.fp == fp, User.id != v.id).all()
if users: print(f'{v.username}: fp', flush=True) if users: print(f'{v.username}: fp', flush=True)
@ -1033,7 +1033,7 @@ def toggle_holes():
@app.get("/badge_owners/<bid>") @app.get("/badge_owners/<bid>")
@auth_required @auth_required
def bid_list(v, bid): def bid_list(v:User, bid):
try: bid = int(bid) try: bid = int(bid)
except: abort(400) except: abort(400)
@ -1095,7 +1095,7 @@ kofi_tiers={
@app.post("/settings/kofi") @app.post("/settings/kofi")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER) @limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_required @auth_required
def settings_kofi(v): def settings_kofi(v:User):
if not KOFI_TOKEN or KOFI_TOKEN == DEFAULT_CONFIG_VALUE: abort(404) if not KOFI_TOKEN or KOFI_TOKEN == DEFAULT_CONFIG_VALUE: abort(404)
if not (v.email and v.is_activated): 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"You must have a verified email to verify {patron} status and claim your rewards!")