From 89b39ba3e8788321428e9c6b6d5fef8b4d2e8724 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Sat, 28 Jul 2018 19:58:23 +0200 Subject: [PATCH] better discord page --- query_discord_music.py | 120 +++++++++++++++++++++++++++++++++++ static/nryg.less | 12 +++- templates/minis/discord.html | 22 ++++--- webserver.py | 18 +----- wow.sql | 34 ---------- 5 files changed, 148 insertions(+), 58 deletions(-) create mode 100644 query_discord_music.py delete mode 100644 wow.sql diff --git a/query_discord_music.py b/query_discord_music.py new file mode 100644 index 00000000..aa3cf10a --- /dev/null +++ b/query_discord_music.py @@ -0,0 +1,120 @@ +all_query = """SELECT + discord.royal_id, + discord.discord_id, + discord.name, + discord.discriminator, + discord.avatar_hex, + fav_songs.fav_song, + fav_songs.max_plays, + last_songs.last_song, + last_songs.last_play_time +FROM discord +LEFT JOIN ( + SELECT DISTINCT ON (ma.discord_id) + ma.discord_id discord_id, + fs.fav_song fav_song, + ma.max_plays max_plays + FROM ( + SELECT + discord_id, + max(plays) max_plays + FROM + ( + SELECT + playedmusic.enqueuer_id discord_id, + playedmusic.filename fav_song, + count(*) plays + FROM playedmusic + GROUP BY playedmusic.filename, playedmusic.enqueuer_id + ORDER BY plays DESC + ) play_counts + GROUP BY discord_id + ) ma + INNER JOIN + ( + SELECT + playedmusic.enqueuer_id discord_id, + playedmusic.filename fav_song, + count(*) plays + FROM playedmusic + GROUP BY playedmusic.filename, playedmusic.enqueuer_id + ORDER BY plays DESC + ) fs ON fs.discord_id = ma.discord_id AND fs.plays = ma.max_plays +) fav_songs ON fav_songs.discord_id = discord.discord_id +LEFT JOIN +( + SELECT DISTINCT ON (playedmusic.enqueuer_id) + playedmusic.enqueuer_id discord_id, + playedmusic.filename last_song, + last_play_times.last_play_time + FROM playedmusic + JOIN ( + SELECT + playedmusic.enqueuer_id discord_id, + max(playedmusic.timestamp) last_play_time + FROM playedmusic + GROUP BY playedmusic.enqueuer_id + ) last_play_times ON playedmusic.timestamp = last_play_times.last_play_time +) last_songs ON last_songs.discord_id = discord.discord_id;""" + + +# TODO: can and should be optimized, but I'm too lazy for that +one_query = """SELECT + discord.royal_id, + discord.discord_id, + discord.name, + discord.discriminator, + discord.avatar_hex, + fav_songs.fav_song, + fav_songs.max_plays, + last_songs.last_song, + last_songs.last_play_time +FROM discord +LEFT JOIN ( + SELECT DISTINCT ON (ma.discord_id) + ma.discord_id discord_id, + fs.fav_song fav_song, + ma.max_plays max_plays + FROM ( + SELECT + discord_id, + max(plays) max_plays + FROM + ( + SELECT + playedmusic.enqueuer_id discord_id, + playedmusic.filename fav_song, + count(*) plays + FROM playedmusic + GROUP BY playedmusic.filename, playedmusic.enqueuer_id + ORDER BY plays DESC + ) play_counts + GROUP BY discord_id + ) ma + INNER JOIN + ( + SELECT + playedmusic.enqueuer_id discord_id, + playedmusic.filename fav_song, + count(*) plays + FROM playedmusic + GROUP BY playedmusic.filename, playedmusic.enqueuer_id + ORDER BY plays DESC + ) fs ON fs.discord_id = ma.discord_id AND fs.plays = ma.max_plays +) fav_songs ON fav_songs.discord_id = discord.discord_id +LEFT JOIN +( + SELECT DISTINCT ON (playedmusic.enqueuer_id) + playedmusic.enqueuer_id discord_id, + playedmusic.filename last_song, + last_play_times.last_play_time + FROM playedmusic + JOIN ( + SELECT + playedmusic.enqueuer_id discord_id, + max(playedmusic.timestamp) last_play_time + FROM playedmusic + GROUP BY playedmusic.enqueuer_id + ) last_play_times ON playedmusic.timestamp = last_play_times.last_play_time +) last_songs ON last_songs.discord_id = discord.discord_id +WHERE discord.royal_id = ?;""" \ No newline at end of file diff --git a/static/nryg.less b/static/nryg.less index 71aba555..59c1d29e 100644 --- a/static/nryg.less +++ b/static/nryg.less @@ -205,6 +205,11 @@ nav { grid-row: 3; } + .game-extra { + grid-row: 4; + font-size: smaller; + } + .player { grid-row: 1; font-size: large; @@ -614,6 +619,7 @@ nav { padding: 18px; color: white; font-family: "Whitney", sans-serif; + grid-template-columns: 50% 50%; a, a:hover, a:active, a:visited { color: white; @@ -623,6 +629,10 @@ nav { border-radius: 16px; } + .game-score { + overflow: hidden; + } + .last-video { grid-column: 1 } @@ -632,7 +642,7 @@ nav { } .none { - opacity: 0.3; + color: rgba(255, 255, 255, 0.3); } } diff --git a/templates/minis/discord.html b/templates/minis/discord.html index f40339c8..5d13b2e9 100644 --- a/templates/minis/discord.html +++ b/templates/minis/discord.html @@ -7,26 +7,32 @@
- - {{ record[0] }} + + {{ record["name"] }}#{{ record["discriminator"] }}
- {% if record[0].music_played %} + {% if record["last_song"] %}
Ultima canzone
-
- {{ (record[0].music_played|sort(attribute='timestamp'))[-1].filename }} +
+ {{ record["last_song"] }}
+
{{ record["last_play_time"] }}
{% else %}
Ultima canzone
Nessuna
{% endif %} - {% if record|length > 1 %} + {% if record["fav_song"] %}
Canzone preferita
-
{{ record[1] }}
+
+ {{ record["fav_song"] }} +
+
{{ record["max_plays"] }}x
{% else %}
Canzone preferita
- +
+ Nessuna +
{% endif %}
diff --git a/webserver.py b/webserver.py index ec4cb4a5..fa5d3b83 100644 --- a/webserver.py +++ b/webserver.py @@ -6,6 +6,7 @@ import configparser import markdown2 import datetime import telegram +import query_discord_music app = Flask(__name__) @@ -81,15 +82,7 @@ def page_profile(name: str): lol = db_session.query(db.LeagueOfLegends).filter_by(royal=user).one_or_none() ow = db_session.query(db.Overwatch).filter_by(royal=user).one_or_none() tg = db_session.query(db.Telegram).filter_by(royal=user).one_or_none() - fav_song = db_session.query(db.PlayedMusic.enqueuer_id, db.PlayedMusic.filename, db.func.count("*").label("plays")) \ - .group_by(db.PlayedMusic.filename, db.PlayedMusic.enqueuer_id) \ - .order_by(db.desc("plays")) \ - .subquery() - discord = db_session.query(db.Discord, db.PlayedMusic.filename) \ - .options(db.joinedload(db.Discord.music_played)) \ - .filter_by(royal=user) \ - .outerjoin(fav_song) \ - .first() + discord = [dict(row) for row in db_session.execute(query_discord_music.one_query, user.id)] db_session.close() return render_template("profile.html", ryg=user, css=css, osu=osu, rl=rl, dota=dota, lol=lol, steam=steam, ow=ow, tg=tg, discord=discord, config=config) @@ -183,8 +176,6 @@ def page_setcss(): @app.route("/game/") def page_game(name: str): db_session = db.Session() - fav_song = None - last_song = None if name == "rl": game_name = "Rocket League" query = db_session.query(db.RocketLeague).join(db.Steam).all() @@ -211,10 +202,7 @@ def page_game(name: str): query = db_session.query(db.Telegram).all() elif name == "discord": game_name = "Discord" - partial_query = db_session.query(db.Discord) \ - .options(db.joinedload(db.Discord.music_played)) \ - .all() - query = [[discord] for discord in partial_query] + query = [dict(row) for row in db_session.execute(query_discord_music.all_query)] else: abort(404) return diff --git a/wow.sql b/wow.sql deleted file mode 100644 index f2e51aca..00000000 --- a/wow.sql +++ /dev/null @@ -1,34 +0,0 @@ -SELECT * -FROM discord -LEFT JOIN ( - SELECT DISTINCT ON (ma.discord_id) - ma.discord_id discord_id2, - fs.fav_song fav_song2, - ma.max_plays max_plays2 - FROM ( - SELECT - discord_id, - max(plays) max_plays - FROM - ( - SELECT - playedmusic.enqueuer_id discord_id, - playedmusic.filename fav_song, - count(*) plays - FROM playedmusic - GROUP BY playedmusic.filename, playedmusic.enqueuer_id - ORDER BY plays DESC - ) play_counts - GROUP BY discord_id - ) ma - INNER JOIN - ( - SELECT - playedmusic.enqueuer_id discord_id, - playedmusic.filename fav_song, - count(*) plays - FROM playedmusic - GROUP BY playedmusic.filename, playedmusic.enqueuer_id - ORDER BY plays DESC - ) fs ON fs.discord_id = ma.discord_id AND fs.plays = ma.max_plays -) fav_songs ON fav_songs.discord_id2 = discord.discord_id; \ No newline at end of file