from __future__ import annotations from telegram import Update from telegram.ext import ( Application, CommandHandler, MessageHandler, ConversationHandler, CallbackQueryHandler, CallbackContext, filters, ) from app.core.config import settings from .states import States from .session import SessionStore from .wizard import EditorWizard def build_app() -> Application: sessions = SessionStore() wizard = EditorWizard(sessions) app = Application.builder().token(settings.editor_bot_token).build() # Мастер поста post_conv = ConversationHandler( entry_points=[CommandHandler("newpost", wizard.newpost)], states={ States.CHOOSE_CHANNEL: [CallbackQueryHandler(wizard.choose_channel, pattern=r"^channel:")], States.CHOOSE_TYPE: [CallbackQueryHandler(wizard.choose_type, pattern=r"^type:")], States.CHOOSE_FORMAT: [CallbackQueryHandler(wizard.choose_format, pattern=r"^fmt:")], States.ENTER_TEXT: [ MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.enter_text), CallbackQueryHandler(wizard.choose_template_open, pattern=r"^tpl:choose$"), ], States.SELECT_TEMPLATE: [ CallbackQueryHandler(wizard.choose_template_apply, pattern=r"^tpluse:"), CallbackQueryHandler(wizard.choose_template_preview, pattern=r"^tplprev:"), CallbackQueryHandler(wizard.choose_template_navigate, pattern=r"^tplpage:"), CallbackQueryHandler(wizard.choose_template_cancel, pattern=r"^tpl:cancel$"), ], States.PREVIEW_VARS: [MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.preview_collect_vars)], States.PREVIEW_CONFIRM: [ CallbackQueryHandler(wizard.preview_confirm, pattern=r"^pv:(use|edit)$"), CallbackQueryHandler(wizard.choose_template_cancel, pattern=r"^tpl:cancel$"), ], States.ENTER_MEDIA: [MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.enter_media)], States.EDIT_KEYBOARD: [MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.edit_keyboard)], States.CONFIRM_SEND: [CallbackQueryHandler(wizard.confirm_send, pattern=r"^send:")], States.ENTER_SCHEDULE: [MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.enter_schedule)], }, fallbacks=[CommandHandler("start", wizard.start)], ) # Мастер шаблонов tpl_conv = ConversationHandler( entry_points=[CommandHandler("tpl_new", wizard.tpl_new_start)], states={ States.TPL_NEW_NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.tpl_new_name)], States.TPL_NEW_TYPE: [CallbackQueryHandler(wizard.tpl_new_type, pattern=r"^tpltype:")], States.TPL_NEW_FORMAT: [CallbackQueryHandler(wizard.tpl_new_format, pattern=r"^tplfmt:")], States.TPL_NEW_CONTENT: [MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.tpl_new_content)], States.TPL_NEW_KB: [MessageHandler(filters.TEXT & ~filters.COMMAND, wizard.tpl_new_kb)], }, fallbacks=[CommandHandler("start", wizard.start)], ) app.add_handler(CommandHandler("start", wizard.start)) app.add_handler(post_conv) app.add_handler(tpl_conv) app.add_handler(CommandHandler("tpl_list", wizard.tpl_list)) app.add_handler(CallbackQueryHandler(wizard.tpl_delete_ok, pattern=r"^tpldelok:")) return app def main(): app = build_app() app.run_polling(allowed_updates=Update.ALL_TYPES) if __name__ == "__main__": main()