diff --git a/files/routes/__init__.py b/files/routes/__init__.py index 3f4e0a948..9176d6322 100644 --- a/files/routes/__init__.py +++ b/files/routes/__init__.py @@ -31,6 +31,7 @@ from .search import * from .settings import * from .static import * from .users import * +from .leaderboard import * from .votes import * from .feeds import * if FEATURES['AWARDS']: diff --git a/files/routes/leaderboard.py b/files/routes/leaderboard.py new file mode 100644 index 000000000..9c8474a2d --- /dev/null +++ b/files/routes/leaderboard.py @@ -0,0 +1,161 @@ +from files.classes import * +from files.classes.leaderboard import Leaderboard +from files.helpers.config.const import * +from files.routes.wrappers import * + +from files.__main__ import app, limiter + +@app.get("/leaderboard") +@app.get("/leaderboard/coins") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_coins(v): + leaderboard = Leaderboard("Coins", "coins", "coins", "Coins", None, Leaderboard.get_simple_lb, User.coins, v, lambda u:u.coins, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/marseybux") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_marseybux(v): + leaderboard = Leaderboard("Marseybux", "marseybux", "marseybux", "Marseybux", None, Leaderboard.get_simple_lb, User.marseybux, v, lambda u:u.marseybux, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/spent") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_spent(v): + leaderboard = Leaderboard("Coins spent on awards", "coins spent on awards", "spent", "Coins", None, Leaderboard.get_simple_lb, User.coins_spent, v, lambda u:u.coins_spent, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/truescore") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_truescore(v): + leaderboard = Leaderboard("Truescore", "truescore", "truescore", "Truescore", None, Leaderboard.get_simple_lb, User.truescore, v, lambda u:u.truescore, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/followers") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_followers(v): + leaderboard = Leaderboard("Followers", "followers", "followers", "Followers", "followers", Leaderboard.get_simple_lb, User.stored_subscriber_count, v, lambda u:u.stored_subscriber_count, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/posts") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_posts(v): + leaderboard = Leaderboard("Posts", "post count", "posts", "Posts", "posts", Leaderboard.get_simple_lb, User.post_count, v, lambda u:u.post_count, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/comments") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_comments(v): + leaderboard = Leaderboard("Comments", "comment count", "comments", "Comments", "comments", Leaderboard.get_simple_lb, User.comment_count, v, lambda u:u.comment_count, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/received_awards") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_received_awards(v): + leaderboard = Leaderboard("Received awards", "received awards", "received-awards", "Received Awards", None, Leaderboard.get_simple_lb, User.received_award_count, v, lambda u:u.received_award_count, g.db.query(User)) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/badges") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_badges(v): + leaderboard = Leaderboard("Badges", "badges", "badges", "Badges", None, Leaderboard.get_badge_emoji_lb, Badge.user_id, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/most_blocked") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_most_blocked(v): + leaderboard = Leaderboard("Most blocked", "most blocked", "most-blocked", "Blocked By", "blockers", Leaderboard.get_blockers_lb, UserBlock.target_id, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/owned_hats") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_owned_hats(v): + leaderboard = Leaderboard("Owned hats", "owned hats", "owned-hats", "Owned Hats", None, Leaderboard.get_hat_lb, User.owned_hats, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/designed_hats") +@feature_required('HAT_SUBMISSIONS') +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_designed_hats(v): + leaderboard = Leaderboard("Designed hats", "designed hats", "designed-hats", "Designed Hats", None, Leaderboard.get_hat_lb, User.designed_hats, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/emojis_made") +@feature_required('EMOJI_SUBMISSIONS') +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_emojis_made(v): + leaderboard = Leaderboard("Emojis made", "emojis made", "emojis-made", "Emojis Made", None, Leaderboard.get_badge_emoji_lb, Emoji.author_id, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/upvotes_given") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_upvotes_given(v): + leaderboard = Leaderboard("Upvotes given", "upvotes given", "upvotes-given", "Upvotes Given", "upvoting", Leaderboard.get_upvotes_lb, None, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/downvotes_received") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_downvotes_received(v): + leaderboard = Leaderboard("Downvotes received", "downvotes received", "downvotes-received", "Downvotes Received", "downvoters", Leaderboard.get_downvotes_lb, None, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/casino_winnings_top") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_casino_winnings_top(v): + leaderboard = Leaderboard("Casino winnings (top)", "casino winnings", "casino-winnings-top", "Casino Winnings", None, Leaderboard.get_winnings_lb, CasinoGame.winnings, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/casino_winnings_bottom") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_casino_winnings_bottom(v): + leaderboard = Leaderboard("Casino winnings (bottom)", "casino winnings", "casino-winnings-bottom", "Casino Winnings", None, Leaderboard.get_winnings_lb, CasinoGame.winnings, v, None, None, 25, False) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/average_upvotes_per_post") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_average_upvotes_per_post(v): + leaderboard = Leaderboard("Average upvotes per post", "average upvotes per post", "average-upvotes-per-post", "Average Upvotes per Post", "posts", Leaderboard.get_avg_upvotes_lb, Post, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) + +@app.get("/leaderboard/average_upvotes_per_comment") +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) +@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) +@auth_required +def leaderboard_average_upvotes_per_comment(v): + leaderboard = Leaderboard("Average upvotes per comment", "average upvotes per comment", "average-upvotes-per-comment", "Average Upvotes per Comment", "comments", Leaderboard.get_avg_upvotes_lb, Comment, v, None, None) + return render_template("leaderboard.html", v=v, leaderboard=leaderboard) diff --git a/files/routes/users.py b/files/routes/users.py index de56ce3bf..15c1bbfd7 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -10,7 +10,6 @@ from sqlalchemy.orm import aliased, load_only from sqlalchemy.exc import IntegrityError from files.classes import * -from files.classes.leaderboard import Leaderboard from files.classes.transactions import * from files.classes.views import * from files.helpers.actions import execute_under_siege @@ -481,54 +480,6 @@ def transfer_coins(v, username): def transfer_bux(v, username): return transfer_currency(v, username, 'marseybux', False) -@cache.memoize() -def leaderboard_cached(v): - users = g.db.query(User) - - coins = Leaderboard("Coins", "coins", "coins", "Coins", None, Leaderboard.get_simple_lb, User.coins, v, lambda u:u.coins, users) - marseybux = Leaderboard("Marseybux", "marseybux", "marseybux", "Marseybux", None, Leaderboard.get_simple_lb, User.marseybux, v, lambda u:u.marseybux, users) - subscribers = Leaderboard("Followers", "followers", "followers", "Followers", "followers", Leaderboard.get_simple_lb, User.stored_subscriber_count, v, lambda u:u.stored_subscriber_count, users) - posts = Leaderboard("Posts", "post count", "posts", "Posts", "posts", Leaderboard.get_simple_lb, User.post_count, v, lambda u:u.post_count, users) - comments = Leaderboard("Comments", "comment count", "comments", "Comments", "comments", Leaderboard.get_simple_lb, User.comment_count, v, lambda u:u.comment_count, users) - received_awards = Leaderboard("Received awards", "received awards", "received-awards", "Received Awards", None, Leaderboard.get_simple_lb, User.received_award_count, v, lambda u:u.received_award_count, users) - coins_spent = Leaderboard("Coins spent on awards", "coins spent on awards", "spent", "Coins", None, Leaderboard.get_simple_lb, User.coins_spent, v, lambda u:u.coins_spent, users) - truescore = Leaderboard("Truescore", "truescore", "truescore", "Truescore", None, Leaderboard.get_simple_lb, User.truescore, v, lambda u:u.truescore, users) - - badges = Leaderboard("Badges", "badges", "badges", "Badges", None, Leaderboard.get_badge_emoji_lb, Badge.user_id, v, None, None) - - blocks = Leaderboard("Most blocked", "most blocked", "most-blocked", "Blocked By", "blockers", Leaderboard.get_blockers_lb, UserBlock.target_id, v, None, None) - - owned_hats = Leaderboard("Owned hats", "owned hats", "owned-hats", "Owned Hats", None, Leaderboard.get_hat_lb, User.owned_hats, v, None, None) - - leaderboards = [coins, marseybux, coins_spent, truescore, subscribers, posts, comments, received_awards, badges, blocks, owned_hats] - - if FEATURES["HAT_SUBMISSIONS"]: - leaderboards.append(Leaderboard("Designed hats", "designed hats", "designed-hats", "Designed Hats", None, Leaderboard.get_hat_lb, User.designed_hats, v, None, None)) - - if FEATURES["EMOJI_SUBMISSIONS"]: - leaderboards.append(Leaderboard("Emojis made", "emojis made", "emojis-made", "Emojis Made", None, Leaderboard.get_badge_emoji_lb, Emoji.author_id, v, None, None)) - - leaderboards.append(Leaderboard("Upvotes given", "upvotes given", "upvotes-given", "Upvotes Given", "upvoting", Leaderboard.get_upvotes_lb, None, v, None, None)) - - leaderboards.append(Leaderboard("Downvotes received", "downvotes received", "downvotes-received", "Downvotes Received", "downvoters", Leaderboard.get_downvotes_lb, None, v, None, None)) - - leaderboards.append(Leaderboard("Casino winnings (top)", "casino winnings", "casino-winnings-top", "Casino Winnings", None, Leaderboard.get_winnings_lb, CasinoGame.winnings, v, None, None)) - leaderboards.append(Leaderboard("Casino winnings (bottom)", "casino winnings", "casino-winnings-bottom", "Casino Winnings", None, Leaderboard.get_winnings_lb, CasinoGame.winnings, v, None, None, 25, False)) - - leaderboards.append(Leaderboard("Average upvotes per post", "average upvotes per post", "average-upvotes-per-post", "Average Upvotes per Post", "posts", Leaderboard.get_avg_upvotes_lb, Post, v, None, None)) - leaderboards.append(Leaderboard("Average upvotes per comment", "average upvotes per comment", "average-upvotes-per-comment", "Average Upvotes per Comment", "comments", Leaderboard.get_avg_upvotes_lb, Comment, v, None, None)) - - return render_template("leaderboard_cached.html", v=v, leaderboards=leaderboards) - -@app.get("/leaderboard") -@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) -@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID) -@auth_required -def leaderboard(v): - if SITE == 'watchpeopledie.tv': - abort(403, "Leaderboard is temporarily disabled!") - return render_template("leaderboard.html", v=v, leaderboard_cached=leaderboard_cached(v)) - @app.get("/@/css") @limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400) def get_css(username): diff --git a/files/templates/leaderboard.html b/files/templates/leaderboard.html index e0740a27b..a6211bc0a 100644 --- a/files/templates/leaderboard.html +++ b/files/templates/leaderboard.html @@ -1,5 +1,76 @@ {% extends "settings2.html" %} {% block pagetitle %}Leaderboard{% endblock %} {% block content %} - {{leaderboard_cached | safe}} +
+ leaderboard banner +
+ +
+ Coins • + Marseybux • + Coins spent on awards • + Truescore • + Followers • + Posts • + Comments • + Received awards • + Badges • + Most blocked • + Owned hats • + {% if FEATURES["HAT_SUBMISSIONS"] %} + Designed hats • + {% endif %} + {% if FEATURES["EMOJI_SUBMISSIONS"] %} + Emojis made • + {% endif %} + Upvotes given • + Downvotes received • + Casino winnings (top) • + Casino winnings (bottom) • + Average upvotes per post • + Average upvotes per comment +
+ + {% macro format_user_in_table(user, style, position_no, value, user_relative_url) %} + {% set value = value | int %} + + {{position_no}} + {% include "user_in_table.html" %} + {% if user_relative_url is not none %} + {{"{:,}".format(value)}} + {% else %} + {{"{:,}".format(value)}} + {% endif %} + + {% endmacro %} + +
{% if leaderboard.desc %}Top{% else %}Bottom{% endif %} {{leaderboard.limit}} {% if leaderboard.table_header_name != 'most blocked' %}by{% endif %} {{leaderboard.table_header_name}}
+
+ + + + + + + + + + {% for user in leaderboard.all_users %} + {% set user2 = leaderboard.user_func(user) %} + {% if v.id == user2.id %} + {% set style="class=\"self\"" %} + {% endif %} + {{format_user_in_table(user2, style, loop.index, leaderboard.value_func(user), leaderboard.user_relative_url)}} + {% endfor %} + {% if leaderboard.v_position and not leaderboard.v_appears_in_ranking %} + {{format_user_in_table(v, "style=\"border-top:2px solid var(--primary)\"", leaderboard.v_position, leaderboard.v_value, leaderboard.user_relative_url)}} + {% endif %} + +
#Name{{leaderboard.table_column_name}}
+
+ + + + {% endblock %} diff --git a/files/templates/leaderboard_cached.html b/files/templates/leaderboard_cached.html deleted file mode 100644 index 894eacb2a..000000000 --- a/files/templates/leaderboard_cached.html +++ /dev/null @@ -1,62 +0,0 @@ -
- leaderboard banner -
- -
- {% for lb in leaderboards %} - {% if lb %} - {{lb.header_name}}{% if not loop.last %} •{% endif %} - {% endif %} - {% endfor %} -
- -{% macro format_user_in_table(user, style, position_no, value, user_relative_url) %} - {% set value = value | int %} - - {{position_no}} - {% include "user_in_table.html" %} - {% if user_relative_url is not none %} - {{"{:,}".format(value)}} - {% else %} - {{"{:,}".format(value)}} - {% endif %} - -{% endmacro %} - -{% macro leaderboard_table(lb) %} -
{% if lb.desc %}Top{% else %}Bottom{% endif %} {{lb.limit}} {% if lb.table_header_name != 'most blocked' %}by{% endif %} {{lb.table_header_name}}
-
- - - - - - - - - - {% for user in lb.all_users %} - {% set user2 = lb.user_func(user) %} - {% if v.id == user2.id %} - {% set style="class=\"self\"" %} - {% endif %} - {{format_user_in_table(user2, style, loop.index, lb.value_func(user), lb.user_relative_url)}} - {% endfor %} - {% if lb.v_position and not lb.v_appears_in_ranking %} - {{format_user_in_table(v, "style=\"border-top:2px solid var(--primary)\"", lb.v_position, lb.v_value, lb.user_relative_url)}} - {% endif %} - -
#Name{{lb.table_column_name}}
-
-{% endmacro %} - -{% for lb in leaderboards %} - {% if lb %} - {{leaderboard_table(lb)}} - {% endif %} -{% endfor %} - - - - diff --git a/files/templates/settings2.html b/files/templates/settings2.html index cd5a09c0e..ad6d8d389 100644 --- a/files/templates/settings2.html +++ b/files/templates/settings2.html @@ -15,7 +15,7 @@