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

View File

@ -22,7 +22,7 @@ from .front import frontlist
@app.get("/shop")
@app.get("/settings/shop")
@auth_required
def shop(v):
def shop(v:User):
AWARDS = deepcopy(AWARDS2)
if v.house:
@ -46,7 +46,7 @@ def shop(v):
@app.post("/buy/<award>")
@limiter.limit("100/minute;200/hour;1000/day")
@auth_required
def buy(v, award):
def buy(v:User, award):
if award == 'benefactor' and not request.values.get("mb"):
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")
@limiter.limit("100/minute;2000/hour;12000/day")
@auth_required
def casino(v):
def casino(v:User):
if v.rehab:
return render_template("casino/rehab.html", v=v), 403
@ -24,7 +24,7 @@ def casino(v):
@app.get("/casino/<game>")
@limiter.limit("100/minute;2000/hour;12000/day")
@auth_required
def casino_game_page(v, game):
def casino_game_page(v:User, game):
if v.rehab:
return render_template("casino/rehab.html", v=v), 403
elif game not in CASINO_GAME_KINDS:
@ -53,7 +53,7 @@ def casino_game_page(v, game):
@app.get("/casino/<game>/feed")
@limiter.limit("100/minute;2000/hour;12000/day")
@auth_required
def casino_game_feed(v, game):
def casino_game_feed(v:User, game):
if v.rehab:
abort(403, "You are under Rehab award effect!")
elif game not in CASINO_GAME_KINDS:
@ -67,7 +67,7 @@ def casino_game_feed(v, game):
@app.get("/lottershe")
@limiter.limit("100/minute;2000/hour;12000/day")
@auth_required
def lottershe(v):
def lottershe(v:User):
if v.rehab:
return render_template("casino/rehab.html", v=v)
@ -78,7 +78,7 @@ def lottershe(v):
@app.post("/casino/slots")
@limiter.limit("100/minute;2000/hour;12000/day")
@auth_required
def pull_slots(v):
def pull_slots(v:User):
if v.rehab:
abort(403, "You are under Rehab award effect!")
@ -109,7 +109,7 @@ def pull_slots(v):
@app.post("/casino/twentyone/deal")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required
def blackjack_deal_to_player(v):
def blackjack_deal_to_player(v:User):
if v.rehab:
abort(403, "You are under Rehab award effect!")
@ -128,7 +128,7 @@ def blackjack_deal_to_player(v):
@app.post("/casino/twentyone/hit")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required
def blackjack_player_hit(v):
def blackjack_player_hit(v:User):
if v.rehab:
abort(403, "You are under Rehab award effect!")
@ -143,7 +143,7 @@ def blackjack_player_hit(v):
@app.post("/casino/twentyone/stay")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required
def blackjack_player_stay(v):
def blackjack_player_stay(v:User):
if v.rehab:
abort(403, "You are under Rehab award effect!")
@ -158,7 +158,7 @@ def blackjack_player_stay(v):
@app.post("/casino/twentyone/double-down")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required
def blackjack_player_doubled_down(v):
def blackjack_player_doubled_down(v:User):
if v.rehab:
abort(403, "You are under Rehab award effect!")
@ -173,7 +173,7 @@ def blackjack_player_doubled_down(v):
@app.post("/casino/twentyone/buy-insurance")
@limiter.limit("1/second;100/minute;2000/hour;12000/day")
@auth_required
def blackjack_player_bought_insurance(v):
def blackjack_player_bought_insurance(v:User):
if v.rehab:
abort(403, "You are under Rehab award effect!")
@ -188,7 +188,7 @@ def blackjack_player_bought_insurance(v):
@app.get("/casino/roulette/bets")
@limiter.limit("100/minute;2000/hour;12000/day")
@auth_required
def roulette_get_bets(v):
def roulette_get_bets(v:User):
if v.rehab:
abort(403, "You are under Rehab award effect!")
@ -200,7 +200,7 @@ def roulette_get_bets(v):
@app.post("/casino/roulette/place-bet")
@limiter.limit("100/minute;2000/hour;12000/day")
@auth_required
def roulette_player_placed_bet(v):
def roulette_player_placed_bet(v:User):
if v.rehab:
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")
@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()
@ -191,7 +191,7 @@ def random_post(v):
@app.get("/random_user")
@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()
if u: u = u[0]
@ -202,7 +202,7 @@ def random_user(v):
@app.get("/comments")
@auth_required
def all_comments(v):
def all_comments(v:User):
try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1

View File

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

View File

@ -21,7 +21,7 @@ NO_LOGIN_REDIRECT_URLS = ("/login", "/logout", "/signup", "/forgot", "/reset", "
@app.get("/login")
@auth_desired
def login_get(v):
def login_get(v:Optional[User]):
redir = request.values.get("redirect", "/").strip().rstrip('?').lower()
if redir:
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")
@auth_required
def me(v):
def me(v:User):
if v.client: return v.json
else: return redirect(v.url)
@ -149,7 +149,7 @@ def logout(v):
@app.get("/signup")
@auth_desired
def sign_up_get(v):
def sign_up_get(v:Optional[User]):
if not get_setting('Signups'):
abort(403, "New account registration is currently closed. Please come back later.")
@ -199,7 +199,7 @@ def sign_up_get(v):
@app.post("/signup")
@limiter.limit("1/second;10/day")
@auth_desired
def sign_up_post(v):
def sign_up_post(v:Optional[User]):
if not get_setting('Signups'):
abort(403, "New account registration is currently closed. Please come back later.")
@ -416,7 +416,7 @@ def get_reset():
@app.post("/reset")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@auth_desired
def post_reset(v):
def post_reset(v:Optional[User]):
if v: return redirect('/')
user_id = request.values.get("user_id")
timestamp = 0
@ -454,7 +454,7 @@ def post_reset(v):
@app.get("/lost_2fa")
@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")
return render_template("login/lost_2fa.html", v=v)

View File

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

View File

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

View File

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

View File

@ -9,7 +9,7 @@ from files.__main__ import app, limiter
@app.get("/authorize")
@auth_required
def authorize_prompt(v):
def authorize_prompt(v:User):
client_id = request.values.get("client_id")
application = g.db.query(OauthApp).filter_by(client_id=client_id).one_or_none()
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("/h/<sub>/submit")
@auth_required
def submit_get(v, sub=None):
def submit_get(v:User, sub=None):
sub = get_sub_by_name(sub, graceful=True)
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, key_func=lambda:f'{SITE}-{session.get("lo_user")}')
@auth_required
def submit_post(v, sub=None):
def submit_post(v:User, sub=None):
url = request.values.get("url", "").strip()

View File

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

View File

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

View File

@ -25,7 +25,7 @@ def rdrama(id, title):
@app.get("/marseys")
@auth_required
def marseys(v):
def marseys(v:User):
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")
@ -74,13 +74,13 @@ def marsey_list():
@app.get('/sidebar')
@auth_desired
def sidebar(v):
def sidebar(v:Optional[User]):
return render_template('sidebar.html', v=v)
@app.get("/stats")
@auth_required
def participation_stats(v):
def participation_stats(v:User):
if v.client: return 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")
@auth_required
def weekly_chart(v):
def weekly_chart(v:User):
return send_file(statshelper.chart_path(kind="weekly", site=SITE))
@app.get("/daily_chart")
@auth_required
def daily_chart(v):
def daily_chart(v:User):
return send_file(statshelper.chart_path(kind="daily", site=SITE))
@app.get("/patrons")
@ -115,14 +115,14 @@ def patrons(v):
@app.get("/admins")
@app.get("/badmins")
@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()
return render_template("admins.html", v=v, admins=admins)
@app.get("/log")
@app.get("/modlog")
@auth_required
def log(v):
def log(v:User):
try: page = max(int(request.values.get("page", 1)), 1)
except: page = 1
@ -185,7 +185,7 @@ def log_item(id, v):
@app.get("/directory")
@auth_required
def static_megathread_index(v):
def static_megathread_index(v:User):
return render_template("megathread_index.html", v=v)
@app.get("/contact")
@ -194,7 +194,7 @@ def static_megathread_index(v):
@app.get("/press")
@app.get("/media")
@auth_desired
def contact(v):
def contact(v:Optional[User]):
return render_template("contact.html", v=v)
@app.post("/send_admin")
@ -321,7 +321,7 @@ def badge_list(site):
@app.get("/badges")
@feature_required('BADGES')
@auth_required
def badges(v):
def badges(v:User):
badges, counts = badge_list(SITE)
return render_template("badges.html", v=v, badges=badges, counts=counts)
@ -342,7 +342,7 @@ def blocks(v):
@app.get("/banned")
@auth_required
def banned(v):
def banned(v:User):
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)
@ -351,12 +351,12 @@ def banned(v):
@app.get("/formatting")
@auth_required
def formatting(v):
def formatting(v:User):
return render_template("formatting.html", v=v)
@app.get("/app")
@auth_desired
def mobile_app(v):
def mobile_app(v:Optional[User]):
return render_template("app.html", v=v)
@app.get("/service-worker.js")
@ -384,7 +384,7 @@ def transfers_id(id, v):
@app.get("/transfers")
@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())

View File

@ -107,7 +107,7 @@ def unexile(v, sub, uid):
@app.post("/h/<sub>/block")
@auth_required
def block_sub(v, sub):
def block_sub(v:User, sub):
sub = get_sub_by_name(sub).name
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")
@auth_required
def unblock_sub(v, sub):
def unblock_sub(v:User, sub):
sub = get_sub_by_name(sub).name
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()
@ -135,7 +135,7 @@ def unblock_sub(v, sub):
@app.post("/h/<sub>/subscribe")
@auth_required
def subscribe_sub(v, sub):
def subscribe_sub(v:User, sub):
sub = get_sub_by_name(sub).name
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")
@auth_required
def unsubscribe_sub(v, sub):
def unsubscribe_sub(v:User, sub):
sub = get_sub_by_name(sub).name
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")
@auth_required
def follow_sub(v, sub):
def follow_sub(v:User, sub):
sub = get_sub_by_name(sub)
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()
@ -173,7 +173,7 @@ def follow_sub(v, sub):
@app.post("/h/<sub>/unfollow")
@auth_required
def unfollow_sub(v, sub):
def unfollow_sub(v:User, sub):
sub = get_sub_by_name(sub)
subscription = g.db.query(SubSubscription).filter_by(user_id=v.id, sub=sub.name).one_or_none()
if subscription:
@ -184,7 +184,7 @@ def unfollow_sub(v, sub):
@app.get("/h/<sub>/mods")
@auth_required
def mods(v, sub):
def mods(v:User, sub):
sub = get_sub_by_name(sub)
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()
@ -194,7 +194,7 @@ def mods(v, sub):
@app.get("/h/<sub>/exilees")
@auth_required
def sub_exilees(v, sub):
def sub_exilees(v:User, sub):
sub = get_sub_by_name(sub)
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) \
@ -206,7 +206,7 @@ def sub_exilees(v, sub):
@app.get("/h/<sub>/blockers")
@auth_required
def sub_blockers(v, sub):
def sub_blockers(v:User, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, SubBlock).join(SubBlock) \
@ -219,7 +219,7 @@ def sub_blockers(v, sub):
@app.get("/h/<sub>/followers")
@auth_required
def sub_followers(v, sub):
def sub_followers(v:User, sub):
sub = get_sub_by_name(sub)
if sub.name == "chudrama" and not v.can_see_chudrama: abort(403)
users = g.db.query(User, SubSubscription).join(SubSubscription) \
@ -554,7 +554,7 @@ def sub_marsey(v, sub):
@app.get("/holes")
@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()
total_users = g.db.query(User).count()
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>/modlog")
@auth_required
def hole_log(v, sub):
def hole_log(v:User, 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)

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")
@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)
@app.get("/@<username>/upvoters/<uid>/comments")
@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)
@app.get("/@<username>/downvoters/<uid>/posts")
@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)
@app.get("/@<username>/downvoters/<uid>/comments")
@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)
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")
@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)
@app.get("/@<username>/upvoting/<uid>/comments")
@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)
@app.get("/@<username>/downvoting/<uid>/posts")
@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)
@app.get("/@<username>/downvoting/<uid>/comments")
@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)
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")
@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)
@app.get("/@<username>/voted/comments")
@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)
@app.get("/grassed")
@auth_required
def grassed(v):
def grassed(v:User):
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)
@ -179,7 +179,7 @@ def grassed(v):
@app.get("/chuds")
@auth_required
def chuds(v):
def chuds(v:User):
users = g.db.query(User).filter(User.agendaposter == 1)
if not v.can_see_shadowbanned:
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")
@auth_required
def upvoters(v, username):
def upvoters(v:User, username):
return all_upvoters_downvoters(v, username, 1, False)
@app.get("/@<username>/downvoters")
@auth_required
def downvoters(v, username):
def downvoters(v:User, username):
return all_upvoters_downvoters(v, username, -1, False)
@app.get("/@<username>/upvoting")
@auth_required
def upvoting(v, username):
def upvoting(v:User, username):
return all_upvoters_downvoters(v, username, 1, True)
@app.get("/@<username>/downvoting")
@auth_required
def downvoting(v, username):
def downvoting(v:User, username):
return all_upvoters_downvoters(v, username, -1, True)
@app.post("/@<username>/suicide")
@ -266,7 +266,7 @@ def suicide(v, username):
@app.get("/@<username>/coins")
@auth_required
def get_coins(v, username):
def get_coins(v:User, username):
user = get_user(username, v=v, include_shadowbanned=False)
return {"coins": user.coins}
@ -326,7 +326,7 @@ def transfer_bux(v, username):
@app.get("/leaderboard")
@auth_required
def leaderboard(v):
def leaderboard(v:User):
users = g.db.query(User)
if not v.can_see_shadowbanned:
users = users.filter(User.shadowbanned == None)
@ -656,7 +656,7 @@ def following(username, v):
@app.get("/views")
@auth_required
def visitors(v):
def visitors(v:User):
if not v.viewers_recorded:
return render_template("errors/patron.html", v=v)
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")
@auth_required
def saved_posts(v, username):
def saved_posts(v:User, username):
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
@ -971,7 +971,7 @@ def saved_posts(v, username):
@app.get("/@<username>/saved/comments")
@auth_required
def saved_comments(v, username):
def saved_comments(v:User, username):
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
@ -979,7 +979,7 @@ def saved_comments(v, username):
@app.get("/@<username>/subscribed/posts")
@auth_required
def subscribed_posts(v, username):
def subscribed_posts(v:User, username):
try: page = max(1, int(request.values.get("page", 1)))
except: abort(400, "Invalid page input!")
@ -987,7 +987,7 @@ def subscribed_posts(v, username):
@app.post("/fp/<fp>")
@auth_required
def fp(v, fp):
def fp(v:User, fp):
v.fp = fp
users = g.db.query(User).filter(User.fp == fp, User.id != v.id).all()
if users: print(f'{v.username}: fp', flush=True)
@ -1033,7 +1033,7 @@ def toggle_holes():
@app.get("/badge_owners/<bid>")
@auth_required
def bid_list(v, bid):
def bid_list(v:User, bid):
try: bid = int(bid)
except: abort(400)
@ -1095,7 +1095,7 @@ kofi_tiers={
@app.post("/settings/kofi")
@limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@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 (v.email and v.is_activated):
abort(400, f"You must have a verified email to verify {patron} status and claim your rewards!")