From 9d1f7fa3dd1e4c6b5620fb99e8ae16fe234bfd97 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 29 Oct 2026 23:10:38 +0200 Subject: [PATCH] fix(admin): accept /stats with bot mention --- VERSION | 2 +- bot.py | 5 ++++- tests/test_admin_stats.py | 27 +++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 tests/test_admin_stats.py diff --git a/VERSION b/VERSION index 4070802..7b96df7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0+77 +0.1.0+78 diff --git a/bot.py b/bot.py index 72dbf44..1417be9 100644 --- a/bot.py +++ b/bot.py @@ -1621,7 +1621,10 @@ async def send_owner_stats(bot: Bot, period: str = "day") -> None: await bot.send_rich_message(chat_id=ANALYTICS_CHAT_ID, message_thread_id=ANALYTICS_TOPIC_ID, rich_message=InputRichMessage(html=report)) -@admin_router.message(F.text.regexp(r"^/stats(?:\s+(day|week|month|all))?$") ) +STATS_COMMAND_PATTERN = r"^/stats(?:@\w+)?(?:\s+(day|week|month|all))?$" + + +@admin_router.message(F.text.regexp(STATS_COMMAND_PATTERN)) async def stats_command(message: Message, state: FSMContext) -> None: if message.chat.id != ANALYTICS_CHAT_ID or message.message_thread_id != ANALYTICS_TOPIC_ID: return diff --git a/tests/test_admin_stats.py b/tests/test_admin_stats.py new file mode 100644 index 0000000..8304de9 --- /dev/null +++ b/tests/test_admin_stats.py @@ -0,0 +1,27 @@ +import re +import unittest + +from bot import STATS_COMMAND_PATTERN + + +class StatsCommandPatternTests(unittest.TestCase): + def test_matches_plain_and_mentioned_forms(self): + # В группе команду часто отправляют с явным обращением к боту. + for text in ("/stats", "/stats@pisatel_posts_bot", "/stats all", "/stats@pisatel_posts_bot week"): + with self.subTest(text=text): + self.assertIsNotNone(re.match(STATS_COMMAND_PATTERN, text)) + + def test_rejects_unknown_arguments(self): + for text in ("/stats yearly", "/stats@bot unknown", "stats", "/statsical"): + with self.subTest(text=text): + self.assertIsNone(re.match(STATS_COMMAND_PATTERN, text)) + + def test_period_argument_is_extractable(self): + match = re.match(STATS_COMMAND_PATTERN, "/stats@pisatel_posts_bot month") + self.assertIsNotNone(match) + assert match is not None + self.assertEqual(match.group(1), "month") + + +if __name__ == "__main__": + unittest.main()