Skip to content

Commit

Permalink
add uploaded memes stats page
Browse files Browse the repository at this point in the history
  • Loading branch information
ohld committed Jun 9, 2024
1 parent c972396 commit 398f94d
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/tgbot/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
handle_show_kitchen,
handle_show_leaderbaord,
)
from src.tgbot.handlers.upload import moderation, upload_meme
from src.tgbot.handlers.upload import moderation, stats, upload_meme

application: Application = None # type: ignore

Expand Down Expand Up @@ -279,6 +279,14 @@ def add_handlers(application: Application) -> None:
)
)

application.add_handler(
CommandHandler(
"uploads",
stats.handle_uploaded_memes_stats,
filters=filters.ChatType.PRIVATE & filters.UpdateType.MESSAGE,
)
)

# meme source management
application.add_handler(
MessageHandler(
Expand Down
23 changes: 23 additions & 0 deletions src/tgbot/handlers/upload/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from src.database import (
execute,
fetch_all,
fetch_one,
meme,
meme_raw_upload,
Expand Down Expand Up @@ -113,3 +114,25 @@ async def count_24h_uploaded_not_approved_memes(user_id: int) -> int:
"""
res = await execute(text(query))
return res.scalar()


async def get_uploaded_memes_of_user_id(user_id: int) -> list[dict[str, Any]]:
query = f"""
SELECT
M.id meme_id,
M.status,
MS.nmemes_sent,
MS.nlikes,
MS.ndislikes
FROM meme M
LEFT JOIN meme_source S
ON M.meme_source_id = S.id
LEFT JOIN meme_stats MS
ON M.id = MS.meme_id
WHERE 1=1
AND S.added_by = {user_id}
AND S.type = 'user upload'
AND M.status IN ('ok', 'published')
ORDER BY M.created_at DESC
"""
return await fetch_all(text(query))
66 changes: 66 additions & 0 deletions src/tgbot/handlers/upload/stats.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""
a command /uploads shows latest uploaded memes with stats:
- views, likes, like%
and total stats across all uploaded memes
"""


from telegram import Update
from telegram.constants import ParseMode
from telegram.ext import ContextTypes

from src.tgbot.handlers.upload.service import get_uploaded_memes_of_user_id


async def handle_uploaded_memes_stats(
update: Update, context: ContextTypes.DEFAULT_TYPE
) -> None:
"""Shows stats for uploaded memes"""
# user_info = await get_user_info(update.effective_user.id)

uploaded_memes = await get_uploaded_memes_of_user_id(update.effective_user.id)
if len(uploaded_memes) == 0:
await update.message.reply(
"""
📭 <b>You haven't uploaded any memes yet!</b>
Just forward a meme to our bot to upload it. Only pics are supported yet.
<i>read more:</i> /kitchen
""",
parse_mode=ParseMode.HTML,
)
return

total_views = sum(m["nmemes_sent"] for m in uploaded_memes)
total_likes = sum(m["nlikes"] for m in uploaded_memes)
total_dislikes = sum(m["ndislikes"] for m in uploaded_memes)
total_like_prc = round(total_likes * 100.0 / (total_likes + total_dislikes))

STATS_TEXT = f"""
<b>YOUR UPLOADED MEMES</b>
📥 You uploaded <b>{len(uploaded_memes)}</b> memes
👁️ Views: {total_views}
👍 Likes: {total_likes}
♥️ Like %: {total_like_prc}%
<b>Latest uploads</b>
views - likes - like %
"""

# show stats for last 5 uploads:
for uploaded_meme in uploaded_memes[-5:]:
views = uploaded_meme["nmemes_sent"]
likes = uploaded_meme["nlikes"]
dislikes = uploaded_meme["ndislikes"]
like_prc = round(likes * 100.0 / (likes + dislikes))

STATS_TEXT += f"\n{views} - {likes} - {like_prc}%"

await update.message.reply(
STATS_TEXT,
parse_mode=ParseMode.HTML,
)

0 comments on commit 398f94d

Please sign in to comment.