def scheduled_job_delete_handler(bot: DialogBot, params): job_id = int(params[0].value) job = Job.select().where(Job.id == job_id).get() # TODO Когда баг пофиксят, надо подтверждение удаления name = Guide.select().where(Guide.id == job.guide_id).get().name job.delete_instance() bot.messaging.send_message( bot.users.get_user_peer_by_id(params[0].uid), f"Гайд '{name}' был успешно удален из отложенных" ) jobs = {} for job in Job.select().order_by(Job.publication_time): jobs[str(job.get_id())] = f"{Guide.select().where(Guide.id == job.guide_id).get().name} " \ f" {job.publication_time.hour}:{job.publication_time.minute}" \ f" {job.publication_time.day}/{job.publication_time.month}/{job.publication_time.year}" if len(jobs): bot.messaging.update_message( params[0], "Удаление отсроченного гайда", utils.get_scheduled_jobs_list(jobs) ) else: utils.cancel_handler(bot, params)
def on_msg(*params): try: if not User.select().where(User.uid == params[0].sender_uid).exists(): new_user_handler(bot, params) return state = User.select().where(User.uid == params[0].sender_uid).get().state if params[0].message.textMessage.text == "/cancel" or params[0].message.textMessage.text == "/menu": utils.cancel_handler(bot, params) elif state == "MONTHLY_BALANCE_SET": balance_set_handler(bot, params) elif state == "NEW_SPEND_COST" or state == "NEW_SPEND_NAME": new_spend_handler(bot, params) elif state == "EDIT_SPEND_COST": edit_spend_cost_handler(bot, params) elif state == "EDIT_SPEND_NAME": edit_spend_name_handler(bot, params) else: unknown_message_handler(bot, params) except: error_handler(bot, params)
def on_msg(*params): try: if not User.select().where(User.uid == params[0].sender_uid).exists(): regular.new_user_handler(bot, params) return state = User.select().where( User.uid == params[0].sender_uid).get().state if params[0].message.textMessage.text == "/cancel" or params[ 0].message.textMessage.text == "/menu": utils.cancel_handler(bot, params) elif state == "GUIDE_DELETION": admin.guide_deletion_handler(bot, params) elif state == "GET_GUIDE_BY_NAME": regular.guide_getter_by_name_handler(bot, params) elif state == "NEW_GUIDE_NAME" or state == "NEW_GUIDE_TEXT": admin.guide_creation_handler(bot, params) elif state == "GUIDE_EDIT": admin.guide_edit_handler(bot, params) elif state == "GUIDE_SCHEDULE_ADD": admin.default_schedule_add_handler(bot, params) else: regular.unknown_message_handler(bot, params) except: regular.error_handler(bot, params)
def edit_spend_cost_handler(bot: DialogBot, params): peer = params[0].peer try: cost = int(params[0].message.textMessage.text) except ValueError: bot.messaging.send_message( peer, "Не могу тебя понять. Пожалуйста, отправь положительное число без дополнительных символов, только цифры" ) return if cost < 0: bot.messaging.send_message( peer, "Не могу тебя понять. Пожалуйста, отправь положительное число без дополнительных символов, только цифры" ) return balance_change = BalanceChange.select().where(BalanceChange.id == COST_EDIT_CACHE[params[0].sender_uid]).get() balance_change.cost = cost balance_change.save() bot.messaging.send_message( peer, "Данные обновлены" ) utils.cancel_handler(bot, params)
def guide_edit_handler(bot: DialogBot, params): """ Обработчик изменения гайда, "GUIDE_EDIT" """ if params[0].sender_uid not in DELETE_CACHE: guide_name = params[0].message.textMessage.text if not Guide.select().where(Guide.name == guide_name).exists(): bot.messaging.send_message( params[0].peer, "Такого гайда не существует. Попробуйте другое название или напишите /menu для возврата в главное меню" ) return utils.send_guide_by_name(bot, params, guide_name) bot.messaging.send_message( params[0].peer, "Напишите, на что мне заменить текущий текст:" ) DELETE_CACHE[params[0].sender_uid] = guide_name else: new_text = params[0].message.textMessage.text guide = Guide.select().where(Guide.name == DELETE_CACHE[params[0].sender_uid]).get() guide.text = new_text guide.save() bot.messaging.send_message( params[0].peer, "Текст успешно обновлен" ) del DELETE_CACHE[params[0].sender_uid] utils.cancel_handler(bot, params)
def balance_set_handler(bot: DialogBot, params): try: peer = params[0].peer except (AttributeError, KeyError): peer = bot.users.get_user_peer_by_id(params[0].uid) try: new_balance = int(params[0].message.textMessage.text) except ValueError: bot.messaging.send_message( peer, "Не могу тебя понять. Пожалуйста, отправь положительное число без дополнительных символов, только цифры" ) return if new_balance < 0: bot.messaging.send_message( peer, "Не могу тебя понять. Пожалуйста, отправь положительное число без дополнительных символов, только цифры" ) return user = User.select().where(User.uid == params[0].sender_uid).get() user.monthly_balance = new_balance user.save() bot.messaging.send_message( peer, "Баланс обновлен" ) utils.cancel_handler(bot, params)
def default_schedule_add_handler(bot: DialogBot, params): """ Обработчик шеулдера, "GUIDE_SCHEDULE_ADD" """ if params[0].sender_uid not in SCHEDULE_CACHE: guide_name = params[0].message.textMessage.text if not Guide.select().where(Guide.name == guide_name).exists(): bot.messaging.send_message( params[0].peer, "Такого гайда не существует. Попробуйте другое название или напишите /cancel для возврата в главное меню" ) return guide_id = Guide.select().where(Guide.name == guide_name).get().get_id() SCHEDULE_CACHE[params[0].sender_uid] = guide_id bot.messaging.send_message( params[0].peer, "Когда мне следует его опубликовать?" ) bot.messaging.send_message( params[0].peer, "Рекомендуемый формат даты: ДД/ММ/ГГ ЧЧ:ММ \nДругие возможные форматы:\n" "* Завтра в 12:01\n" "* послезавтра" ) else: date_from_user = params[0].message.textMessage.text date = dateparser.parse(date_from_user) if date is None: bot.messaging.send_message( params[0].peer, "Не могу понять дату, попробуйте другой формат" ) return bot.messaging.send_message( params[0].peer, f"Хорошо, я отправлю его всем пользователям {date.day}/{date.month}/{date.year} в {date.hour}:{date.minute}" ) # TODO: Сделать подтверждение, когда пофиксят баг new_job = Job.create( guide_id=SCHEDULE_CACHE[params[0].sender_uid], publication_time=date ) new_job.save() del SCHEDULE_CACHE[params[0].sender_uid] utils.cancel_handler(bot, params)
def error_handler(bot: DialogBot, params): try: peer = bot.users.get_user_peer_by_id(params[0].uid) except AttributeError: peer = params[0].peer bot.messaging.send_message( peer, "Кажется, что то сломалось. Возвращаемся в главное меню" ) utils.cancel_handler(bot, params)
def menu_handler(bot: DialogBot, params): peer = bot.users.get_user_peer_by_id(params[0].uid) if params[0].value == "update_budget": bot.messaging.send_message( peer, "Укажите новый бюджет" ) utils.set_state_by_uid(params[0].uid, "MONTHLY_BALANCE_SET") elif params[0].value == "create_spend": bot.messaging.send_message( peer, "Как назвать трату?" ) utils.set_state_by_uid(params[0].uid, "NEW_SPEND_NAME") elif params[0].value == "list_spends": bot.messaging.send_message( peer, "Список трат", utils.get_spends_list(params[0].uid) ) elif params[0].value == "export_xlsx": bot.messaging.send_message( peer, "Ваша таблица:" ) wb = Workbook() ws = wb.active ws.append(["Название", "Цена", "Дата добавления"]) for spend in BalanceChange.select().where(BalanceChange.owner == params[0].uid): ws.append([spend.name, spend.cost, spend.added]) wb.save(f"sheets/{params[0].uid}.xlsx") bot.messaging.send_file( peer, f"sheets/{params[0].uid}.xlsx" ) object = Path(f"sheets/{params[0].uid}.xlsx") object.unlink() utils.cancel_handler(bot, params)
def on_click(*params): try: if params[0].id == "main_menu": main_menu_handler(bot, params) elif params[0].id == "event_list": event_list_handler(bot, params) elif params[0].id == "cancel": utils.cancel_handler(bot, params) elif params[0].id == "event_action": event_action_handler(bot, params) except: utils.cancel_handler(bot, params)
def delete_all_handler(bot: DialogBot, params): peer = bot.users.get_user_peer_by_id(params[0].uid) for cost in BalanceChange.select().where(BalanceChange.owner == params[0].uid): cost.delete_instance() bot.messaging.send_message( peer, "Все траты были успешно удалены" ) bot.messaging.delete( params[0] ) utils.cancel_handler(bot, params)
def cost_manager_handler(bot: DialogBot, params): task, cost_id = params[0].value.split("_") cost_id = int(cost_id) peer = bot.users.get_user_peer_by_id(params[0].uid) if task == "delete": bot.messaging.delete( params[0] ) cost = BalanceChange.select().where(BalanceChange.id == cost_id).get() cost.delete_instance() if params[0].uid in EVENT_LIST_MESSAGE_CACHE: bot.messaging.update_message( EVENT_LIST_MESSAGE_CACHE[params[0].uid], "Список трат", utils.get_spends_list(params[0].uid) ) bot.messaging.send_message( peer, "Событие удалено" ) utils.cancel_handler(bot, params) elif task == "name": bot.messaging.send_message( peer, "Укажите новое имя траты" ) COST_EDIT_CACHE[params[0].uid] = cost_id utils.set_state_by_uid(params[0].uid, "EDIT_SPEND_NAME") elif task == "cost": bot.messaging.send_message( peer, "Укажите новую цену траты" ) COST_EDIT_CACHE[params[0].uid] = cost_id utils.set_state_by_uid(params[0].uid, "EDIT_SPEND_COST")
def on_click(*params): try: if params[0].id == "main_menu": menu_handler(bot, params) elif params[0].id == "cancel": utils.cancel_handler(bot, params) elif params[0].id == "cost_list": spend_list_handler(bot, params) elif params[0].id == "cost_manager": cost_manager_handler(bot, params) elif params[0].id == "delete_all": delete_all_handler(bot, params) except: error_handler(bot, params)
def guide_deletion_handler(bot: DialogBot, params): """ Обработчик статуса GUIDE_DELETION """ guide_name = params[0].message.textMessage.text if not Guide.select().where(Guide.name == guide_name).exists(): bot.messaging.send_message( params[0].peer, "Гайда с таким названием не существует" ) else: guide = Guide.select().where(Guide.name == guide_name).get() guide.delete_instance() # TODO: Замутить подтверждение удаления, когда баг пофиксят bot.messaging.send_message( params[0].peer, "Гайд успешно удален" ) utils.cancel_handler(bot, params)
def edit_spend_name_handler(bot: DialogBot, params): peer = params[0].peer new_name = params[0].message.textMessage.text balance_change = BalanceChange.select().where(BalanceChange.id == COST_EDIT_CACHE[params[0].sender_uid]).get() balance_change.name = new_name balance_change.save() bot.messaging.send_message( peer, "Данные обновлены" ) if params[0].sender_uid in EVENT_LIST_MESSAGE_CACHE: bot.messaging.update_message( EVENT_LIST_MESSAGE_CACHE[params[0].sender_uid], "Список трат", utils.get_spends_list(params[0].sender_uid) ) utils.cancel_handler(bot, params)
def on_msg(*params): try: if not User.select().where(User.uid == params[0].sender_uid).exists(): new_user_handler(bot, params) return state = User.select().where( User.uid == params[0].sender_uid).get().state if params[0].message.textMessage.text == "/cancel" or params[ 0].message.textMessage.text == "/menu": utils.cancel_handler(bot, params) elif state == "NEW_REVIEW": new_review_handler(bot, params) elif state == "NEW_EVENT": new_event_handler(bot, params) else: unknown_message_handler(bot, params) except: error_handler(bot, params)
def new_spend_handler(bot: DialogBot, params): peer = params[0].peer state = User.select().where(User.uid == params[0].sender_uid).get().state if state == "NEW_SPEND_NAME": name = params[0].message.textMessage.text SPEND_CACHE[params[0].sender_uid] = { "owner": params[0].sender_uid, "name": name, } bot.messaging.send_message( peer, "Укажите стоймость траты" ) utils.set_state_by_uid(params[0].sender_uid, "NEW_SPEND_COST") elif state == "NEW_SPEND_COST": try: cost = int(params[0].message.textMessage.text) except ValueError: bot.messaging.send_message( peer, "Не могу тебя понять. Пожалуйста, отправь положительное число без дополнительных символов, только цифры" ) return if cost < 0: bot.messaging.send_message( peer, "Не могу тебя понять. Пожалуйста, отправь положительное число без дополнительных символов, только цифры" ) return SPEND_CACHE[params[0].sender_uid]["cost"] = cost new_spend = BalanceChange.create( **SPEND_CACHE[params[0].sender_uid] ) new_spend.save() del SPEND_CACHE[params[0].sender_uid] bot.messaging.send_message( peer, "Трата успешно добавлена" ) spending = utils.get_spend_sum(params[0].sender_uid) user_budget = User.select().where(User.uid == params[0].sender_uid).get().monthly_balance if spending > user_budget: bot.messaging.send_message( peer, f"Предупреждение: вы превысили лимит трат на {spending - user_budget}" ) else: bot.messaging.send_message( peer, f"Остаток бюджета: {user_budget - spending}" ) utils.cancel_handler(bot, params)
def guide_creation_handler(bot: DialogBot, params): """ Обработчик создания гайда, "NEW_GUIDE_*", "new_guide_essential" """ try: state = User.select().where(User.uid == params[0].sender_uid).get().state except (AttributeError, KeyError): state = User.select().where(User.uid == params[0].uid).get().state if state == "NEW_GUIDE_NAME": name = params[0].message.textMessage.text if Guide.select().where(Guide.name == name).exists(): bot.messaging.send_message( params[0].peer, "Гайд с таким именем уже есть. Придумай другое." ) return GUIDE_CACHE[params[0].sender_uid] = { "name": name, "text": "", "essential": False } bot.messaging.send_message( params[0].peer, "Теперь напиши гайд. Что бы закончить, напиши /end" ) utils.set_state_by_uid(params[0].sender_uid, "NEW_GUIDE_TEXT") elif state == "NEW_GUIDE_TEXT": text = params[0].message.textMessage.text if text == "/end": bot.messaging.send_message( params[0].peer, "Мне следует показывать этот гайдов в списке гайдов по умолчанию для каждого пользователя? ", utils.get_essentialness() ) utils.set_state_by_uid(params[0].sender_uid, "NEW_GUIDE_ESSENTIAL") return try: GUIDE_CACHE[params[0].sender_uid]["text"] += "\n" GUIDE_CACHE[params[0].sender_uid]["text"] += text except (AttributeError, KeyError): bot.messaging.send_message( params[0].peer, "Кажется, бот перезагрузился и у него исчез кеш. Вам придется написать гайд еще раз :(" ) utils.cancel_handler(bot, params) return elif state == "NEW_GUIDE_ESSENTIAL": try: if params[0].value == "True": GUIDE_CACHE[params[0].uid]["essential"] = True else: GUIDE_CACHE[params[0].uid]["essential"] = False except (AttributeError, KeyError): bot.messaging.send_message( bot.users.get_user_peer_by_id(params[0].uid), "Кажется, бот перезагрузился и у него исчез кеш. Вам придется написать гайд еще раз :(" ) utils.cancel_handler(bot, params) return guide = Guide.create(**GUIDE_CACHE[params[0].uid]) guide.save() del GUIDE_CACHE[params[0].uid] bot.messaging.send_message( bot.users.get_user_peer_by_id(params[0].uid), "Гайд успешно создан!" ) utils.set_state_by_uid(params[0].uid, "START") utils.cancel_handler(bot, params)