From b3cc0fb73917204ebe32093242a72ea8097e404a Mon Sep 17 00:00:00 2001 From: arsam Date: Fri, 18 Sep 2026 22:41:21 +0330 Subject: [PATCH] Add Telegram bot entry point and handler registration --- bot.py | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 bot.py diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..a4d84be --- /dev/null +++ b/bot.py @@ -0,0 +1,111 @@ +"""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()