コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
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)
コード例 #5
0
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)
コード例 #6
0
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)
コード例 #7
0
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)
コード例 #8
0
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)
コード例 #9
0
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)
コード例 #10
0
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)
コード例 #11
0
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)
コード例 #12
0
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")
コード例 #13
0
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)
コード例 #14
0
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)
コード例 #15
0
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)
コード例 #16
0
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)
コード例 #17
0
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)
コード例 #18
0
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)