""" Utility functions and decorators for the bot. """ import os import functools import logging from telegram import Update from telegram.ext import ContextTypes logger = logging.getLogger(__name__) def get_admin_ids(): """Get the list of admin user IDs from environment variable.""" admin_ids_str = os.getenv("ADMIN_IDS", "") if not admin_ids_str: logger.warning("ADMIN_IDS not set in .env file. No admins configured.") return set() try: # Parse comma-separated list of IDs admin_ids = set(int(id.strip()) for id in admin_ids_str.split(",") if id.strip()) return admin_ids except ValueError as e: logger.error(f"Error parsing ADMIN_IDS: {e}") return set() def admin_only(func): """ Decorator that restricts command to admin users only. Usage: @admin_only async def my_admin_command(update: Update, context: ContextTypes.DEFAULT_TYPE): ... """ @functools.wraps(func) async def wrapper(update: Update, context: ContextTypes.DEFAULT_TYPE, *args, **kwargs): user_id = update.effective_user.id admin_ids = get_admin_ids() if user_id not in admin_ids: await update.message.reply_html( "🚫 Access Denied\n\n" "This command is restricted to administrators only." ) logger.warning(f"User {user_id} attempted to use admin command: {func.__name__}") return # User is admin, execute the command return await func(update, context, *args, **kwargs) return wrapper def is_admin(user_id: int) -> bool: """Check if a user ID is an admin.""" admin_ids = get_admin_ids() return user_id in admin_ids