61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
"""
|
|
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(
|
|
"🚫 <b>Access Denied</b>\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
|