Package: bot-kit
Bot kitСоздание общего контекста без кнофигурационного файла:frombot_kit.kitimportBotContextfrombot_kit.dbimportDBManagerfromsqlalchemy.ext.declarativeimportdeclarative_basetoken:str='123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11'BaseModel=declarative_base()# базовый класс для моделей БДdb_manager=DBManager('sqlite:///mybase.db',BaseModel)bot_context=BotContext(token)bot_context.set_db_manager(db_manager)Создание общего контекста через конфигурационный файл:frombot_kit.kitimportBotContextfrombot_kit.commonimportConfigBot,INIConfigfromsqlalchemy.ext.declarativeimportdeclarative_baseBaseModel=declarative_base()# базовый класс для моделей БДconfig=ConfigBot(INIConfig('settings.ini'))bot_context=BotContext.init_form_config(config,BaseModel)Создание простого меню:Меню создается как класс на основе MenuReplyKeyboard и может быть зарегистрировано
через декоратор register_menu. При регистрации контекст для работы с ботом пробрасывается
в команды завязанные на кнопки меню. Правила для показа меню моно указать в декораторе, по такому же принципу
как и в aiogram или же определить метод check.frombot_kit.kitimportBotCommand,MenuReplyKeyboard,ReplyKeyboardButton,ShowMenuButtonfrombot_kit.dbimportDBManager,ModelManagerfromaiogramimporttypesclassFirstCommand(BotCommand):asyncdefexecute(self,tg_object:types.Message,*args,**kwargs):"""self.db_manager - управление моделями БДself.bc - общий контекстself.bot - объект бота"""user_manager:ModelManager=self.db_manager.manage(UserModel)user_manager.one(chat_id=tg_object.from_user.id)awaittg_object.answer('first command is finished')@bot_context.register_menu(text='Меню настройки')classConfigMenu(MenuReplyKeyboard):COMMAND1=ReplyKeyboardButton('Команда 1',FirstCommand)@classmethoddefcheck(cls,tg_object:types.Message)->bool:"""Альтернативный метод для проверки вывода меню (если логика довольно сложная для декоратора)"""returntg_object.text=='/config'@bot_context.register_menu(text='Приветствую',commands=['start'])classMainMenu(MenuReplyKeyboard):FIRST_BUTTON=ReplyKeyboardButton('Команда 1',FirstCommand)SECOND_BUTTON=ReplyKeyboardButton('Команда 2',FirstCommand)SHOW_CONFIG_MENU=ShowMenuButton('Настройки',ConfigMenu)@classmethodasyncdefbefore_show(cls,tg_object:types.Message,**kwargs):"""Метод выполняемый перед показом менюcls.bc - общий контекст"""db_manager:DBManager=cls.bc.get_db_manager()user_manager:ModelManager=db_manager.manage(UserModel)user:UserModel=user_manager.one(chat_id=tg_object.from_user.id)ifnotuser:user_manager.save(UserModel(name=tg_object.from_user.first_name,last_name=tg_object.from_user.last_name,chat_id=tg_object.from_user.id,))Создание Inline меню:Inline меню создается по такому же принципу что и основное меню, но родителем в данном случае выступает
класс MenuInlineKeyboard.frombot_kit.kitimportBotCommand,MenuInlineKeyboard,InlineButtonfromaiogramimporttypesclassSomeInlineCommand(BotCommand):asyncdefexecute(self,tg_object:types.CallbackQuery,*args,**kwargs):pass@bot_context.register_menu(text='Что делаем?')classContextMenu(MenuInlineKeyboard):FIRST_BUTTON=InlineButton('Кнопка 1','some_command_btn',SomeInlineCommand())@classmethoddefcheck(cls,tg_object:types.Message)->bool:returnTrueСоздание фоновой задачи выполняемой через определенный интервал:Периодические задачи можно оформлять как классы-наследники BotTask в этом случае внутри класса будет доступен
контекст бота. Или же как обычные функции завернутые в декоратор register_async_timerfrombot_kit.kitimportBotTask@bot_context.register_async_timer(60)# регистрируем выполнение функции каждую минутуasyncdefone_more_task():passclassSimpleTask(BotTask):asyncdefexecute(self,*args,**kwargs):"""self.db_manager - управление моделями БДself.bc - общий контекстself.bot - объект бота"""passbot_context.add_task(SimpleTask(),600)# запуск задачи раз в 10 минутЗапуск бота:На текущий момент бота можно запускать только в режиме long polling.bot_context.start_polling()