"""Puppy Bot entry point. Run with: python bot.py""" import logging import sys from telegram.ext import ( ApplicationBuilder, CommandHandler, InlineQueryHandler, MessageHandler, filters, ) from config import TELEGRAM_TOKEN import services.auth as auth from services import settings as settings_store from handlers import chat, inline from handlers import admin from handlers.help import cmd_help from utils import context as runtime_context logging.basicConfig( format="%(asctime)s | %(name)s | %(levelname)s | %(message)s", level=logging.INFO, stream=sys.stdout, ) logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("telegram").setLevel(logging.WARNING) logger = logging.getLogger("puppy") async def _error_handler(update, ctx): err = getattr(ctx, "error", None) logger.exception("Unhandled bot error: %s", err) runtime_context.record_error(f"Unhandled bot error: {err}") def _register_handlers(app): # ── General / all-auth ───────────────────────────────── app.add_handler(CommandHandler("start", admin.cmd_start)) app.add_handler(CommandHandler("help", cmd_help)) app.add_handler(CommandHandler("ping", admin.cmd_ping)) app.add_handler(CommandHandler("clear", admin.cmd_clear)) app.add_handler(CommandHandler("myhistory", admin.cmd_myhistory)) app.add_handler(CommandHandler("setmaxtoken", admin.cmd_setmaxtoken)) app.add_handler(CommandHandler("getmaxtoken", admin.cmd_getmaxtoken)) app.add_handler(CommandHandler("resettoken", admin.cmd_resettoken)) app.add_handler(CommandHandler("setlang", admin.cmd_setlang)) app.add_handler(CommandHandler("status", admin.cmd_status)) app.add_handler(CommandHandler("model", admin.cmd_model)) app.add_handler(CommandHandler("togglesearch", admin.cmd_togglesearch)) app.add_handler(CommandHandler("search", admin.cmd_search)) app.add_handler(CommandHandler("ocr", admin.cmd_ocr)) app.add_handler(CommandHandler("imagine", admin.cmd_imagine)) app.add_handler(CommandHandler("myid", admin.cmd_myid)) # ── Owner-only ───────────────────────────────────────── app.add_handler(CommandHandler("stats", admin.cmd_stats)) app.add_handler(CommandHandler("dashboard", admin.cmd_stats)) app.add_handler(CommandHandler("uptime", admin.cmd_uptime)) app.add_handler(CommandHandler("version", admin.cmd_version)) app.add_handler(CommandHandler("addauth", admin.cmd_addauth)) app.add_handler(CommandHandler("removeauth", admin.cmd_removeauth)) app.add_handler(CommandHandler("listauth", admin.cmd_listauth)) app.add_handler(CommandHandler("ban", admin.cmd_ban)) app.add_handler(CommandHandler("unban", admin.cmd_unban)) app.add_handler(CommandHandler("listban", admin.cmd_listban)) app.add_handler(CommandHandler("userinfo", admin.cmd_userinfo)) app.add_handler(CommandHandler("broadcast", admin.cmd_broadcast)) app.add_handler(CommandHandler("clearall", admin.cmd_clearall)) app.add_handler(CommandHandler("setpersonality", admin.cmd_setpersonality)) app.add_handler(CommandHandler("resetpersonality",admin.cmd_resetpersonality)) app.add_handler(CommandHandler("setmodel", admin.cmd_setmodel)) app.add_handler(CommandHandler("setprovider", admin.cmd_setprovider)) app.add_handler(CommandHandler("models", admin.cmd_models)) app.add_handler(CommandHandler("unlock", admin.cmd_unlock)) app.add_handler(CommandHandler("lock", admin.cmd_lock)) app.add_handler(CommandHandler("reload", admin.cmd_reload)) # ── Message handlers ─────────────────────────────────── app.add_handler(MessageHandler(filters.PHOTO & ~filters.COMMAND, chat.message_handler)) app.add_handler(MessageHandler(filters.Document.IMAGE & ~filters.COMMAND, chat.message_handler)) app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, chat.message_handler)) # ── Inline mode ──────────────────────────────────────── app.add_handler(InlineQueryHandler(inline.inline_handler)) def main(): if not TELEGRAM_TOKEN: logger.error("TELEGRAM_TOKEN is not set.") sys.exit(1) auth.load() settings_store.load() logger.info("Auth loaded — %d authorized, %d banned", len(auth.get_authorized()), len(auth.get_banned())) app = ( ApplicationBuilder() .token(TELEGRAM_TOKEN) .build() ) _register_handlers(app) app.add_error_handler(_error_handler) logger.info("Puppy is starting…") app.run_polling(drop_pending_updates=True) if __name__ == "__main__": main()