Skip to content

Commit 398f94d

Browse files
committed
add uploaded memes stats page
1 parent c972396 commit 398f94d

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

src/tgbot/app.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
handle_show_kitchen,
6161
handle_show_leaderbaord,
6262
)
63-
from src.tgbot.handlers.upload import moderation, upload_meme
63+
from src.tgbot.handlers.upload import moderation, stats, upload_meme
6464

6565
application: Application = None # type: ignore
6666

@@ -279,6 +279,14 @@ def add_handlers(application: Application) -> None:
279279
)
280280
)
281281

282+
application.add_handler(
283+
CommandHandler(
284+
"uploads",
285+
stats.handle_uploaded_memes_stats,
286+
filters=filters.ChatType.PRIVATE & filters.UpdateType.MESSAGE,
287+
)
288+
)
289+
282290
# meme source management
283291
application.add_handler(
284292
MessageHandler(

src/tgbot/handlers/upload/service.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from src.database import (
99
execute,
10+
fetch_all,
1011
fetch_one,
1112
meme,
1213
meme_raw_upload,
@@ -113,3 +114,25 @@ async def count_24h_uploaded_not_approved_memes(user_id: int) -> int:
113114
"""
114115
res = await execute(text(query))
115116
return res.scalar()
117+
118+
119+
async def get_uploaded_memes_of_user_id(user_id: int) -> list[dict[str, Any]]:
120+
query = f"""
121+
SELECT
122+
M.id meme_id,
123+
M.status,
124+
MS.nmemes_sent,
125+
MS.nlikes,
126+
MS.ndislikes
127+
FROM meme M
128+
LEFT JOIN meme_source S
129+
ON M.meme_source_id = S.id
130+
LEFT JOIN meme_stats MS
131+
ON M.id = MS.meme_id
132+
WHERE 1=1
133+
AND S.added_by = {user_id}
134+
AND S.type = 'user upload'
135+
AND M.status IN ('ok', 'published')
136+
ORDER BY M.created_at DESC
137+
"""
138+
return await fetch_all(text(query))

src/tgbot/handlers/upload/stats.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
"""
2+
a command /uploads shows latest uploaded memes with stats:
3+
- views, likes, like%
4+
5+
and total stats across all uploaded memes
6+
"""
7+
8+
9+
from telegram import Update
10+
from telegram.constants import ParseMode
11+
from telegram.ext import ContextTypes
12+
13+
from src.tgbot.handlers.upload.service import get_uploaded_memes_of_user_id
14+
15+
16+
async def handle_uploaded_memes_stats(
17+
update: Update, context: ContextTypes.DEFAULT_TYPE
18+
) -> None:
19+
"""Shows stats for uploaded memes"""
20+
# user_info = await get_user_info(update.effective_user.id)
21+
22+
uploaded_memes = await get_uploaded_memes_of_user_id(update.effective_user.id)
23+
if len(uploaded_memes) == 0:
24+
await update.message.reply(
25+
"""
26+
📭 <b>You haven't uploaded any memes yet!</b>
27+
28+
Just forward a meme to our bot to upload it. Only pics are supported yet.
29+
30+
<i>read more:</i> /kitchen
31+
""",
32+
parse_mode=ParseMode.HTML,
33+
)
34+
return
35+
36+
total_views = sum(m["nmemes_sent"] for m in uploaded_memes)
37+
total_likes = sum(m["nlikes"] for m in uploaded_memes)
38+
total_dislikes = sum(m["ndislikes"] for m in uploaded_memes)
39+
total_like_prc = round(total_likes * 100.0 / (total_likes + total_dislikes))
40+
41+
STATS_TEXT = f"""
42+
<b>YOUR UPLOADED MEMES</b>
43+
44+
📥 You uploaded <b>{len(uploaded_memes)}</b> memes
45+
👁️ Views: {total_views}
46+
👍 Likes: {total_likes}
47+
♥️ Like %: {total_like_prc}%
48+
49+
50+
<b>Latest uploads</b>
51+
views - likes - like %
52+
"""
53+
54+
# show stats for last 5 uploads:
55+
for uploaded_meme in uploaded_memes[-5:]:
56+
views = uploaded_meme["nmemes_sent"]
57+
likes = uploaded_meme["nlikes"]
58+
dislikes = uploaded_meme["ndislikes"]
59+
like_prc = round(likes * 100.0 / (likes + dislikes))
60+
61+
STATS_TEXT += f"\n{views} - {likes} - {like_prc}%"
62+
63+
await update.message.reply(
64+
STATS_TEXT,
65+
parse_mode=ParseMode.HTML,
66+
)

0 commit comments

Comments
 (0)