From cd7dd126833af7529554fa1de210e77a3a210e36 Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sat, 3 Feb 2024 03:26:06 +0300 Subject: [PATCH 1/5] move N memes watched notif to another file. Fix bug with spamming "do you want to be mod" thing --- src/localizer.py | 5 ++-- src/tgbot/senders/achievements.py | 27 +++++++++---------- .../senders/meme_watched_achievements.py | 26 ++++++++++++++++++ src/tgbot/senders/next_message.py | 4 +-- static/localization/moderator.yml | 11 ++++++++ 5 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 src/tgbot/senders/meme_watched_achievements.py create mode 100644 static/localization/moderator.yml diff --git a/src/localizer.py b/src/localizer.py index bb1a02d6..f34641a0 100644 --- a/src/localizer.py +++ b/src/localizer.py @@ -1,7 +1,8 @@ -import yaml import logging from pathlib import Path +import yaml + # not sure where to put this const DEFAULT_LANG = "en" @@ -23,7 +24,7 @@ def load(): def t( - key: str, + key: str, lang: str | None ) -> str: if lang is None or lang not in localizations[key]: diff --git a/src/tgbot/senders/achievements.py b/src/tgbot/senders/achievements.py index 2b117f90..b8c87285 100644 --- a/src/tgbot/senders/achievements.py +++ b/src/tgbot/senders/achievements.py @@ -1,31 +1,30 @@ import asyncio + from telegram.constants import ParseMode from src import localizer from src.tgbot.bot import bot from src.tgbot.constants import UserType +from src.tgbot.senders.meme_watched_achievements import ( + send_meme_watched_achievement_if_needed, +) from src.tgbot.user_info import get_user_info +SECONDS_TO_SLEEP_AFTER_NOTIFICATION = 3 + async def send_achievement_if_needed(user_id: int) -> None: user_info = await get_user_info(user_id) - if user_info["type"] == UserType.USER and user_info["nmemes_sent"] > 1000: - await bot.send_message( - chat_id=user_id, - text="Do you wanna be a Moderator? 👀", - parse_mode=ParseMode.HTML, - ) - await asyncio.sleep(3) - return - - if user_info["nmemes_sent"] == 100: + if user_info["type"] == UserType.USER and user_info["nmemes_sent"] == 1000: await bot.send_message( chat_id=user_id, - text=localizer.t("achievement_100_meme_sent", user_info["interface_lang"]), + text=localizer.t("ask_if_user_wants_to_be_moderator", user_info["interface_lang"]), parse_mode=ParseMode.HTML, ) - await asyncio.sleep(3) + await asyncio.sleep(SECONDS_TO_SLEEP_AFTER_NOTIFICATION) return - - \ No newline at end of file + is_sent = await send_meme_watched_achievement_if_needed(user_id, user_info) + if is_sent: + await asyncio.sleep(SECONDS_TO_SLEEP_AFTER_NOTIFICATION) + diff --git a/src/tgbot/senders/meme_watched_achievements.py b/src/tgbot/senders/meme_watched_achievements.py new file mode 100644 index 00000000..c2b64b73 --- /dev/null +++ b/src/tgbot/senders/meme_watched_achievements.py @@ -0,0 +1,26 @@ +import asyncio + +from telegram.constants import ParseMode + +from src import localizer +from src.tgbot.bot import bot + + +async def send_meme_watched_achievement_if_needed(user_id: int, user_info: dict) -> bool: + """Send achievement about watching a certain amount of memes if needed and return True if sent""" + memes_sent_count = user_info["nmemes_sent"] + text_localizer_name = None + if memes_sent_count == 100: + text_localizer_name = "achievement_100_meme_sent" + # elif memes_sent_count == 1000: + # text_localizer_name = "achievement_1000_meme_sent" + + if text_localizer_name is None: + return False + + await bot.send_message( + chat_id=user_id, + text=localizer.t(text_localizer_name, user_info["interface_lang"]), + parse_mode=ParseMode.HTML, + ) + return True diff --git a/src/tgbot/senders/next_message.py b/src/tgbot/senders/next_message.py index 52a0e583..38dbc5e7 100644 --- a/src/tgbot/senders/next_message.py +++ b/src/tgbot/senders/next_message.py @@ -31,14 +31,14 @@ async def next_message( # TODO: if watched > 30 memes / day show paywall / tasks / donate await send_achievement_if_needed(user_id) - + while True: meme = await get_next_meme_for_user(user_id) if not meme: asyncio.create_task(check_queue(user_id)) # TODO: also edit / delete return await send_queue_preparing_alert(user_id) - + exists = await user_meme_reaction_exists(user_id, meme.id) if not exists: # this meme wasn't sent yet break diff --git a/static/localization/moderator.yml b/static/localization/moderator.yml new file mode 100644 index 00000000..d85f518b --- /dev/null +++ b/static/localization/moderator.yml @@ -0,0 +1,11 @@ +ask_if_user_wants_to_be_moderator: + en: |- + Do you wanna be a Moderator? 👀 + ru: |- + Хочешь быть Модератором? 👀 + es: |- + ¿Quieres ser Moderador? 👀 + de: |- + Willst du Moderator sein? 👀 + uk: |- + Хочеш бути Модератором? 👀 \ No newline at end of file From 25317289d7660da1a066f22532434abb9a93cccf Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sat, 3 Feb 2024 03:45:24 +0300 Subject: [PATCH 2/5] more achievements --- .../senders/meme_watched_achievements.py | 9 +-- static/localization/achievements.yml | 74 ++++++++++++++++++- 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/tgbot/senders/meme_watched_achievements.py b/src/tgbot/senders/meme_watched_achievements.py index c2b64b73..a325828f 100644 --- a/src/tgbot/senders/meme_watched_achievements.py +++ b/src/tgbot/senders/meme_watched_achievements.py @@ -9,15 +9,12 @@ async def send_meme_watched_achievement_if_needed(user_id: int, user_info: dict) -> bool: """Send achievement about watching a certain amount of memes if needed and return True if sent""" memes_sent_count = user_info["nmemes_sent"] - text_localizer_name = None - if memes_sent_count == 100: - text_localizer_name = "achievement_100_meme_sent" - # elif memes_sent_count == 1000: - # text_localizer_name = "achievement_1000_meme_sent" + meme_count_alerts = (100, 500, 1000, 5000, 10000, 50000, 100000) - if text_localizer_name is None: + if memes_sent_count not in meme_count_alerts: return False + text_localizer_name = f"achievement_{memes_sent_count}_meme_sent" await bot.send_message( chat_id=user_id, text=localizer.t(text_localizer_name, user_info["interface_lang"]), diff --git a/static/localization/achievements.yml b/static/localization/achievements.yml index 003e0447..0d70a9cf 100644 --- a/static/localization/achievements.yml +++ b/static/localization/achievements.yml @@ -8,4 +8,76 @@ achievement_100_meme_sent: de: |- 🚀 Du hast gerade 100 Memes gesehen! Schau dir MEHR an 🍔 uk: |- - 🚀 Ви щойно переглянули 100 мемів! Дивіться БІЛЬШЕ 🍔 \ No newline at end of file + 🚀 Ви щойно переглянули 100 мемів! Дивіться БІЛЬШЕ 🍔 + +achievement_500_meme_sent: + en: |- + 🚀 You've just devoured 500 memes, emerging as the Meme Gladiator! The arena echoes with your laughter. Ready for the next meme battle? 🍔 + ru: |- + 🚀 Ты только что поглотил 500 мемов, став Гладиатором Мемов! Арена отзывается твоим смехом. Готов к новым битвам в мемной арене? 🍔 + es: |- + 🚀 ¡Acabas de devorar 500 memes y te has coronado como el Gladiador de Memes! El eco de tu risa resuena en la arena. ¿Listo para la próxima batalla de memes? 🍔 + de: |- + 🚀 Du hast gerade 500 Memes verschlungen und bist nun der Meme-Gladiator! 🍔 + uk: |- + 🚀 Ти тільки що поглинув 500 мемів і став Мем Гладіатором! Арена відгукується твоїм сміхом. Готовий до наступної битви мемів? 🍔 + +achievement_1000_meme_sent: + en: |- + 🚀 Yo, champ, you just surfed through a wave of a thousand memes and didn’t sink! 🌊🏄 You’re like... a meme magnate, yeah? Scrolling like a boss, with each meme a checkpoint on your path to legendary status. Dude, you turned procrastination into an art form! 🎨👑 Keep it up, and remember: each like and share you drop is like energy for the meme universe. Let’s go for more victories, just remember to occasionally emerge from under the blanket, lest you get sucked in. Ha, onward, meme master, conquer those internets further! 🍔💥 + ru: |- + 🚀 Эй, чемпион, ты только что прокатился на волне из тысячи мемов и не утонул! 🌊🏄 Ты типа... мемный магнат, да? Листаешь как босс, и каждый мем – это чек-поинт на твоём пути к легендарности. Братан, ты превратил таймкиллинг в искусство! 🎨👑 Так держать, и помни: каждый твой лайк и репост – это как энергия для мемной вселенной. Пошли за новыми победами, только не забудь иногда вылезать из-под одеяла, а то засосёт. Ха, давай, мемный мастер, захватывай интернеты дальше! 🍔💥 + es: |- + 🚀 ¡Epa, campeón, acabas de surfear una ola de mil memes sin hundirte! 🌊🏄 Eres como... un magnate de los memes, ¿verdad? Desplazándote como un jefe, con cada meme un punto de control en tu camino hacia el estatus de leyenda. Tío, has convertido la procrastinación en una forma de arte! 🎨👑 Sigue así, y recuerda: cada like y compartida que das es como energía para el universo meme. Vamos a por más victorias, solo recuerda salir ocasionalmente de debajo de la manta, para que no te absorba. Ja, adelante, maestro de los memes, ¡conquista más internets! 🍔💥 + de: |- + 🚀 Hey, Champion, du hast gerade eine Welle von tausend Memes gemeistert und bist nicht untergegangen! 🌊🏄 Du bist quasi... ein Meme-Magnat, richtig? Scrollst wie ein Boss, und jedes Meme ist ein Checkpoint auf deinem Weg zur Legende. Alter, du hast das Aufschieben in eine Kunstform verwandelt! 🎨👑 Weiter so, und denk dran: Jedes Like und jeder Share von dir ist wie Energie für das Meme-Universum. Auf zu neuen Siegen, vergiss nur nicht, ab und zu unter der Decke hervorzukommen, sonst wirst du eingesogen. Ha, auf geht’s, Meme-Meister, erobere weiter die Weiten des Internets! 🍔💥 + uk: |- + 🚀 Ой, чемпіоне, ти щойно проїхався на хвилі з тисячі мемів і не втопився! 🌊🏄 Ти як... мемний магнат, чи не так? Пролиставши як бос, і кожен мем – це чек-поінт на твоєму шляху до легендарності. Брате, ти перетворив таймкіллинг на мистецтво! 🎨👑 Так тримати, і пам'ятай: кожен твій лайк і репост – це як енергія для мемного всесвіту. Починай нові перемоги, лише не забувай час від часу вилізати з-під ковдри, інакше засмокче. Ха, давай, мемний майстер, захоплюй інтернети далі! 🍔💥 + +achievement_5000_meme_sent: + en: |- + "FIVE GRAND MEMES!!! What even? YOU'RE A MACHINE." + ru: |- + "ПЯТЬ КОСАРЕЙ МЕМОВ!!! Это как вообще? ТЫ МАШИНА." + es: |- + "¡CINCO MIL MEMES!!! ¿Qué demonios? ERES UNA MÁQUINA." + de: |- + "FÜNF TAUSEND MEMES!!! Was zum Teufel? DU BIST EINE MASCHINE." + uk: |- + "П'ЯТЬ ТИСЯЧ МЕМІВ!!! Це як взагалі? ТИ МАШИНА." + +achievement_10000_meme_sent: + en: |- + "Dude. You're a MEME-CONSUMING MACHINE. Thanks a ton for using us. You've already viewed 10,000 memes. I'M PROUD OF YOU." + ru: |- + "Чувак. Ты МАШИНА по просмотру мемов. Спасибо тебе огромное, что пользуешься нами. Ты уже посмотрел(а) 10 000 мемов. Я ГОРЖУСЬ ТОБОЙ." + es: |- + "Amigo. Eres una MÁQUINA DEVORAMEMES. Gracias mil por utilizar nuestro servicio. Ya has visto 10,000 memes. ESTOY ORGULLOSO DE TI." + de: |- + "Alter. Du bist eine MEME-VERSCHLINGENDE MASCHINE. Vielen Dank für die Nutzung unserer Dienste. Du hast bereits 10.000 Memes angesehen. ICH BIN STOLZ AUF DICH." + uk: |- + "Чувак. Ти МАШИНА з перегляду мемів. Дякую тобі величезне, що використовуєш нас. Ти вже переглянув(ла) 10 000 мемів. Я ГОРДЖУСЬ ТОБОЮ." + +achievement_50000_meme_sent: + en: |- + "Fifty. Thousand. Memes. That's something unimaginable... Thanks for using our bot! You're in the top 0.01% of our users in terms of activity!" + ru: |- + "Пятьдесят. Тысяч. Мемов. Это что-то невообразимое... Спасибо что пользуешься нашим ботом!) Ты в топ 0.01% наших пользователей по активности!" + es: |- + "Cincuenta. Mil. Memes. Eso es algo inimaginable... ¡Gracias por usar nuestro bot! ¡Estás en el top 0.01% de nuestros usuarios en términos de actividad!" + de: |- + "Fünfzig. Tausend. Memes. Das ist etwas Unvorstellbares... Danke, dass du unseren Bot nutzt! Du gehörst zu den Top 0,01% unserer Benutzer in Bezug auf Aktivität!" + uk: |- + "П'ятдесят. Тисяч. Мемів. Це щось неймовірне... Дякую, що використовуєш нашого бота! Ти в топ 0.01% наших користувачів за активністю!" + +achievement_100000_meme_sent: + en: |- + "You've viewed 10% of a million memes. If you were a machine at 10k, now you're just a rocket 🚀🚀🚀" + ru: |- + "Ты посмотрел(а) 10% от миллиона мемов. Если на 10к ты был машиной, то сейчас ты просто ракета 🚀🚀🚀" + es: |- + "Has visto el 10% de un millón de memes. Si eras una máquina a los 10k, ahora eres simplemente un cohete 🚀🚀🚀" + de: |- + "Du hast 10% von einer Million Memes angesehen. Wenn du bei 10k eine Maschine warst, bist du jetzt einfach eine Rakete 🚀🚀🚀" + uk: |- + "Ти переглянув(ла) 10% від мільйона мемів. Якщо на 10к ти був(ла) машиною, то зараз ти просто ракета 🚀🚀🚀" From 352a733bb7b5c7575a8f7b5c57357d56d5e8eb40 Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sat, 3 Feb 2024 03:45:46 +0300 Subject: [PATCH 3/5] remove unused import --- src/tgbot/senders/meme_watched_achievements.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tgbot/senders/meme_watched_achievements.py b/src/tgbot/senders/meme_watched_achievements.py index a325828f..8c2917e2 100644 --- a/src/tgbot/senders/meme_watched_achievements.py +++ b/src/tgbot/senders/meme_watched_achievements.py @@ -1,5 +1,3 @@ -import asyncio - from telegram.constants import ParseMode from src import localizer From 167b3f1c6e24140b20a456013d21bde0a3994f0e Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sun, 4 Feb 2024 18:08:29 +0300 Subject: [PATCH 4/5] fix linter errors --- src/tgbot/senders/achievements.py | 6 +++++- src/tgbot/senders/meme_watched_achievements.py | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/tgbot/senders/achievements.py b/src/tgbot/senders/achievements.py index 6a6e6141..c44c5db2 100644 --- a/src/tgbot/senders/achievements.py +++ b/src/tgbot/senders/achievements.py @@ -16,9 +16,13 @@ async def send_achievement_if_needed(user_id: int) -> None: user_info = await get_user_info(user_id) if user_info["type"] == UserType.USER and user_info["nmemes_sent"] == 1000: + wants_to_be_mod_text = localizer.t( + "ask_if_user_wants_to_be_moderator", + user_info["interface_lang"] + ) await bot.send_message( chat_id=user_id, - text=localizer.t("ask_if_user_wants_to_be_moderator", user_info["interface_lang"]), + text=wants_to_be_mod_text, parse_mode=ParseMode.HTML, ) await asyncio.sleep(SECONDS_TO_SLEEP_AFTER_NOTIFICATION) diff --git a/src/tgbot/senders/meme_watched_achievements.py b/src/tgbot/senders/meme_watched_achievements.py index 8c2917e2..36b91fdb 100644 --- a/src/tgbot/senders/meme_watched_achievements.py +++ b/src/tgbot/senders/meme_watched_achievements.py @@ -4,8 +4,13 @@ from src.tgbot.bot import bot -async def send_meme_watched_achievement_if_needed(user_id: int, user_info: dict) -> bool: - """Send achievement about watching a certain amount of memes if needed and return True if sent""" +async def send_meme_watched_achievement_if_needed( + user_id: int, user_info: dict +) -> bool: + """Send achievement about watching a certain amount of memes if needed + + returns: True if achievement was sent, False otherwise + """ memes_sent_count = user_info["nmemes_sent"] meme_count_alerts = (100, 500, 1000, 5000, 10000, 50000, 100000) From 21dd111337b22c0ec7f04d85f79f96ea07980254 Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sun, 4 Feb 2024 18:13:04 +0300 Subject: [PATCH 5/5] fix linters --- src/tgbot/senders/achievements.py | 3 +-- src/tgbot/senders/meme_watched_achievements.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/tgbot/senders/achievements.py b/src/tgbot/senders/achievements.py index c44c5db2..0a044b59 100644 --- a/src/tgbot/senders/achievements.py +++ b/src/tgbot/senders/achievements.py @@ -17,8 +17,7 @@ async def send_achievement_if_needed(user_id: int) -> None: user_info = await get_user_info(user_id) if user_info["type"] == UserType.USER and user_info["nmemes_sent"] == 1000: wants_to_be_mod_text = localizer.t( - "ask_if_user_wants_to_be_moderator", - user_info["interface_lang"] + "ask_if_user_wants_to_be_moderator", user_info["interface_lang"] ) await bot.send_message( chat_id=user_id, diff --git a/src/tgbot/senders/meme_watched_achievements.py b/src/tgbot/senders/meme_watched_achievements.py index 36b91fdb..63271113 100644 --- a/src/tgbot/senders/meme_watched_achievements.py +++ b/src/tgbot/senders/meme_watched_achievements.py @@ -5,7 +5,7 @@ async def send_meme_watched_achievement_if_needed( - user_id: int, user_info: dict + user_id: int, user_info: dict ) -> bool: """Send achievement about watching a certain amount of memes if needed