diff --git a/apps/telegram-bot/bot.py b/apps/telegram-bot/bot.py index a8a1f38..3135252 100644 --- a/apps/telegram-bot/bot.py +++ b/apps/telegram-bot/bot.py @@ -47,6 +47,7 @@ def build_app() -> Application: app.add_handler(CommandHandler("show", cmd_show)) app.add_handler(CommandHandler("timezone", cmd_timezone)) app.add_handler(CommandHandler("admin", cmd_admin)) + app.add_handler(CommandHandler("admin", cmd_admin)) app.add_handler(MessageHandler(filters.COMMAND, cmd_help)) diff --git a/apps/telegram-bot/commands.py b/apps/telegram-bot/commands.py index ae66faa..ee699bd 100644 --- a/apps/telegram-bot/commands.py +++ b/apps/telegram-bot/commands.py @@ -392,6 +392,101 @@ async def cmd_untrack(update: Update, ctx: ContextTypes.DEFAULT_TYPE) -> None: await update.message.reply_text("Not tracking bounty #{bounty_id}.") +async def cmd_admin(update: Update, ctx: ContextTypes.DEFAULT_TYPE) -> None: + args = extract_args(update.message.text) + if not args: + await update.message.reply_text( + "Usage: /admin [@username]\n" + "/admin list — list admins\n" + "/admin add @username — add admin\n" + "/admin remove @username — remove admin" + ) + return + + subcommand = args[0].lower() + username = args[1] if len(args) > 1 else None + + requesting_user_id = get_user_id(update) + room_id = get_room_id(update) + + if subcommand == "list": + admins = BOUNTY_SERVICE.list_admins(room_id) + if not admins: + await update.message.reply_text("No admins in this room.") + return + admin_mentions = " ".join(f"admin_id:{uid}" for uid in admins) + await update.message.reply_text(f"Admins: {admin_mentions}") + return + + if subcommand == "remove": + if not username: + await update.message.reply_text("Usage: /admin remove @username") + return + + if not username.startswith("@"): + await update.message.reply_text( + f"⛔ {username} is not a valid username (must start with @)." + ) + return + + target_username = username[1:] + try: + chat = await ctx.bot.get_chat(target_username) + target_user_id = chat.id + except Exception: + await update.message.reply_text( + f"⛔ Could not find user @{target_username}." + ) + return + + try: + BOUNTY_SERVICE.remove_admin(room_id, target_user_id, requesting_user_id) + await update.message.reply_text( + f"✅ @{target_username} is no longer an admin." + ) + except PermissionError as e: + await update.message.reply_text(f"⛔ {e}") + except ValueError: + await update.message.reply_text(f"⛔ @{target_username} is not an admin.") + return + + if subcommand == "add": + if not username: + await update.message.reply_text("Usage: /admin add @username") + return + + if not username.startswith("@"): + await update.message.reply_text( + f"⛔ {username} is not a valid username (must start with @)." + ) + return + + target_username = username[1:] + try: + chat = await ctx.bot.get_chat(target_username) + target_user_id = chat.id + except Exception: + await update.message.reply_text( + f"⛔ Could not find user @{target_username}." + ) + return + + try: + BOUNTY_SERVICE.add_admin(room_id, target_user_id, requesting_user_id) + await update.message.reply_text(f"✅ @{target_username} is now an admin.") + except PermissionError as e: + await update.message.reply_text(f"⛔ {e}") + except ValueError: + await update.message.reply_text( + f"⛔ @{target_username} is already an admin." + ) + return + + await update.message.reply_text( + "Unknown subcommand. Use: /admin [@username]" + ) + + async def cmd_start(update: Update, ctx: ContextTypes.DEFAULT_TYPE) -> None: if is_group(update): await update.message.reply_text(