From f14fdc20f7cb137176d4d70b74066c036b8fda14 Mon Sep 17 00:00:00 2001 From: Momo Tahmasbi Date: Sun, 26 Jul 2026 18:14:24 +0200 Subject: [PATCH] Register Telegram command menu --- README.md | 5 ++++- bot.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fefa900..af2c9f1 100644 --- a/README.md +++ b/README.md @@ -54,14 +54,17 @@ The database will be saved in `./bot_db/media.db`. **Searching inline** — in any chat type `@yourbotusername keyword` to search and send. +Telegram suggests these commands as you type `/`, with a short description beside each suggestion. + **Commands** | Command | Description | |---|---| +| `/start` | Start the bot and show usage instructions | | `/menu` | Show the available commands | | `/list` | Show all saved media | | `/edit [search]` | Select a meme and edit its keywords (admin only) | -| `/delete ` | Remove an entry (get ID from `/list`) | +| `/delete ` | Remove an entry (get ID from `/list`; admin only) | | `/cancel` | Cancel current add operation | ### Moving to another server diff --git a/bot.py b/bot.py index 3b1518e..6eace38 100644 --- a/bot.py +++ b/bot.py @@ -9,6 +9,8 @@ from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.storage.memory import MemoryStorage from aiogram.types import ( + BotCommand, + BotCommandScopeChat, CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup, @@ -40,6 +42,18 @@ ADMIN_USERS: set[int] = { bot = Bot(token=BOT_TOKEN) dp = Dispatcher(storage=MemoryStorage()) +USER_COMMANDS = [ + BotCommand(command="start", description="Start the bot"), + BotCommand(command="menu", description="Show available commands"), + BotCommand(command="list", description="Browse saved memes"), + BotCommand(command="cancel", description="Cancel current operation"), +] +ADMIN_COMMANDS = [ + *USER_COMMANDS, + BotCommand(command="edit", description="Edit meme keywords"), + BotCommand(command="delete", description="Remove a meme by ID"), +] + def is_allowed(user_id: int) -> bool: if user_id in ADMIN_USERS: @@ -54,6 +68,20 @@ def is_admin(user_id: int) -> bool: return not ALLOWED_USERS or user_id in ALLOWED_USERS +async def register_commands() -> None: + """Publish Telegram's command menu with role-appropriate suggestions.""" + if not ADMIN_USERS: + await bot.set_my_commands(ADMIN_COMMANDS) + return + + await bot.set_my_commands(USER_COMMANDS) + for admin_id in ADMIN_USERS: + await bot.set_my_commands( + ADMIN_COMMANDS, + scope=BotCommandScopeChat(chat_id=admin_id), + ) + + class AddMedia(StatesGroup): waiting_for_keywords = State() @@ -374,6 +402,7 @@ async def inline_handler(query: InlineQuery): async def main(): await db.init_db() + await register_commands() log.info("Bot starting…") await dp.start_polling(bot)