コード例 #1
0
def change_update_message(bot, update, user_data):
    user_data.update({"status": "technical_tower", "location_id": 5})
    tower = Location.get_location(5)
    format_values = tower.special_info.get("enter_text_format_values")
    format_values[
        0] = "Последнее обновление: {}.\nДля просмотра возьмите страничку сверху 🗂Архива".format(
            great_format_time(get_current_datetime()))
    tower.special_info.update({"enter_text_format_values": format_values})

    tower.update_location_to_database()
    last_update_id = tower.special_info.get("last_update_id")
    last_update_id += 1
    tower.special_info.update({"last_update_id": last_update_id})
    tower.update_location_to_database()

    request = "insert into bot_updates (text, date_created) VALUES (%s, %s)"
    cursor.execute(request,
                   (update.message.text,
                    datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None)))
    bot.send_message(
        chat_id=update.message.from_user.id,
        text=
        "Обновление успешно опубликовано. Вы спускаетесь, чтобы проверить, что всё выглядит "
        "хорошо.\n\n<em>В случае, если после этого не последует сообщение с обновлением, "
        "измените его</em>",
        parse_mode='HTML')
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
    bot.send_message(chat_id=MY_CHANNEL_ID,
                     text=update.message.text,
                     parse_mode='HTML')
コード例 #2
0
def construct(bot, update, user_data):
    mes = update.message
    location_id = None
    for loc in list(locations.values()):
        if loc.name == mes.text:
            location_id = loc.id
            break
    if mes.text == '/build_teaparty':
        location_id = 9
    if location_id is None:
        send_general_buttons(mes.from_user.id, user_data=user_data, bot=bot)
        return
    location = Location.get_location(location_id)
    if location is None:
        bot.send_message(chat_id=mes.chat_id, text="Локация не найдена.")
        return
    if location.state is True or location.building_process < 0:
        bot.send_message(chat_id=mes.chat_id, text="Локация уже построена или стройка не начиналась.")
        return

    context = [update.message.from_user.id, user_data]
    j = job.run_once(callback=construction_return, when=CONSTRUCTION_DURATION_SECONDS, context=context)
    old_j = construction_jobs.get(update.message.from_user.id)
    if old_j is not None:
        old_j.job.schedule_removal()
    construction_jobs.update({update.message.from_user.id: MyJob(j, CONSTRUCTION_DURATION_SECONDS)})
    user_data.update({"status": "construction", "construction_id": location.id})
    buttons = get_general_buttons(user_data)
    bot.send_message(chat_id=update.message.chat_id, text="Вы отправились на стройку. Это займёт 5 минут.",
                     reply_markup=buttons)
コード例 #3
0
def unknown_input(bot, update, user_data):
    """
    Функция ответа на неопознанный ввод в ЛС - присылает кнопки и текст текущей локации
    """
    if filter_is_pm(update.message):
        player = Player.get_player(update.message.from_user.id,
                                   notify_on_error=False)
        if player is None:
            return
        send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #4
0
def change_rp(bot, update, user_data):
    """
    Функция смены режима работы бота (команды /change_rp)
    """
    if update.message.from_user.id != update.message.chat_id:
        return
    user_data.update({"status": DEFAULT_CASTLE_STATUS})
    rp_off = user_data.get("rp_off")
    if rp_off:
        user_data.pop("rp_off")
        send_general_buttons(update.message.from_user.id, user_data, bot=bot)
        return
    user_data.update({"status": "rp_off", "rp_off": True})
    bot.send_message(
        chat_id=update.message.chat_id,
        text="Режим РП отключён. Если Вы захотите снова использовать "
        "все функции, нажмите /change_rp ещё раз.")
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #5
0
def change_debrief(bot, update, user_data):
    """
    Непосредственно смена дебрифа на новый
    """
    user_data.update({"status": "throne_room", "location_id": 2})
    throne = Location.get_location(2)
    format_values = throne.special_info.get("enter_text_format_values")
    format_values[1] = update.message.text
    throne.special_info.update({"enter_text_format_values": format_values})
    throne.update_location_to_database()
    bot.send_message(
        chat_id=update.message.from_user.id,
        text=
        "Дебриф успешно изменён. Вы выходите в тронный зал, чтобы проверить, что всё выглядит "
        "хорошо.\n\n<em>В случае, если после этого не последует сообщение с дебрифом, "
        "измените его</em>",
        parse_mode='HTML')
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #6
0
def headquarters(bot, update, user_data):
    """
    Штаб-квартира МИДа
    """
    user_data.update({"status": "headquarters", "location_id": 4})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #7
0
def throne_room(bot, update, user_data):
    """
    Функция, вызываемая при входе в тронный зал
    """
    user_data.update({"status": "throne_room", "location_id": 2})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #8
0
def barracks(bot, update, user_data):
    """
    Функция, вызываемая при входе в казарму
    """
    user_data.update({"status": "barracks", "location_id": 1})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #9
0
def central_square(bot, update, user_data):
    """
    Функция, вызываемая при входе на Центральную Площадь
    """
    user_data.update({"status": "central_square", "location_id": 0})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #10
0
def technical_tower(bot, update, user_data):
    user_data.update({"status": "technical_tower", "location_id": 5})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #11
0
def treasury(bot, update, user_data):
    user_data.update({"status": "treasury", "location_id": 6})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #12
0
def tea_party(bot, update, user_data):
    user_data.update({"status": "tea_party", "location_id": 9})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #13
0
def construction_plate(bot, update, user_data):
    user_data.update({"status": "construction_plate", "location_id": 7})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #14
0
def hero(bot, update, user_data):
    mes = update.message
    text = mes.text
    castle = re.search("([🍁☘️🖤🐢🦇🌹🍆🎖]+)(.+)", text)
    nickname = castle.group(2)
    castle = castle.group(1)
    if castle != '🖤':
        pass
        # Игрок не из Скалы
        # bot.send_message(chat_id=mes.from_user.id, text="Пользователям не из Скалы запрещена регистрация!")
        # return
    player = Player.get_player(mes.from_user.id, notify_on_error=False)
    if player is not None and player.id == 402027858 and player.castle != '🖤' and castle == '🖤':
        # Рыбак вернулся!
        bot.send_message(
            chat_id=player.id,
            text=
            "Стражи с гулким стуком ударяют копьями о землю. Врата медленно "
            "отворяются, открывая взору такие знакомые, но в то же время изменившиеся улицы.\n"
            "<b>С возвращением домой!</b>",
            parse_mode='HTML')
    if player is None and mes.chat_id != mes.from_user.id:
        # Добавление новых пользователей только в личке у бота
        return
    forward_message_date = utc.localize(
        mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    print(forward_message_date)
    if datetime.datetime.now() - forward_message_date > datetime.timedelta(seconds=30) and \
            mes.from_user.id not in urned_players:
        bot.send_message(chat_id=mes.chat_id,
                         text="Это устаревший профиль.",
                         reply_to_message_id=mes.message_id)
        return
    # Парсинг хиро
    guild_tag = re.search("[🍁☘🖤🐢🦇🌹🍆🎖]\\[(.+)\\]", text)
    if guild_tag:
        guild_tag = guild_tag.group(1)
    lvl = int(re.search("🏅Уровень: (\\d+)", text).group(1))
    attack = int(re.search("⚔Атака: (\\d+)", text).group(1))
    defense = int(re.search("🛡Защита: (\\d+)", text).group(1))
    stamina = int(re.search("🔋Выносливость: \\d+/(\\d+)", text).group(1))
    pet = re.search("Питомец:\n.(\\s.+\\(\\d+ lvl\\))", text)
    exp = int(re.search("🔥Опыт: (\\d+)", text).group(1))
    last_updated = datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None)
    if pet:
        pet = pet.group(1)
    # Парсинг экипировки
    print("parsing eq")
    player_equipment = {
        "main_hand": None,
        "second_hand": None,
        "head": None,
        "gloves": None,
        "armor": None,
        "boots": None,
        "cloaks": None
    }
    equip_strings = text.partition("🎽Экипировка")[2].splitlines()[1:]
    for string in equip_strings:
        # clear_name = re.search("\\+?\\d?\\s?(.+?)\\s\\+", string)
        clear_name = re.search(
            "(⚡?\\+?\\d*\\s?(.+?))\\s\\+((\\d*)⚔)?\\s*\\+?(\\d*)🛡?", string)
        if clear_name is None:
            # logging.warning("Error while parsing item_string\n{}".format(string))
            continue
        else:
            pass
            # logging.info("successful parsed {},, Got: {}".format(string, clear_name.group(1)))
        full_name = clear_name.group(1)
        eq_attack = int(clear_name.group(4)) if clear_name.group(
            4) is not None and clear_name.group(4) != "" else 0
        eq_defense = int(
            clear_name.group(5)) if clear_name.group(5) != "" else 0
        clear_name = clear_name.group(2)
        eq = get_equipment_by_name(clear_name)
        if eq is None:
            logging.warning(
                "Equipment with name {} is None".format(clear_name))
            continue
        eq.name = full_name
        eq.attack = eq_attack
        eq.defense = eq_defense
        player_equipment.update({eq.place: eq})
    if player is None:
        if mes.from_user.username is None:
            bot.send_message(
                chat_id=mes.chat_id,
                text=
                "Регистрация без имени пользователя невозможна. Пожалуйста, "
                "установите его в настройках аккаунта Telegram")
            return
        player = Player(mes.from_user.id,
                        mes.from_user.username,
                        nickname,
                        guild_tag,
                        None,
                        lvl,
                        attack,
                        defense,
                        stamina,
                        pet,
                        player_equipment,
                        castle=castle,
                        last_updated=last_updated,
                        created=last_updated,
                        exp=exp)
        # Добавляем игрока в бд
        player.insert_into_database()
        player = player.reload_from_database()

        user_data.update({"status": DEFAULT_CASTLE_STATUS, "location_id": 0})
        bot.send_message(
            chat_id=mes.chat_id,
            text=
            "Добро пожаловать в 🖤Скалу, <b>{}</b>!\n\n<a href=\"https://t.me/joinchat/DdKE7kUfsmDVIC2DJymw_A\">Чат центральной площади</a>\n\nДля добавления информации о классе "
            "необходимо прислать ответ @ChatWarsBot на кнопку \"🏅Герой\" (рекомендуется сделать для "
            "получения доступа к некоторых дополнительным фишкам, особенно стражникам).\n\n"
            "<em>Вы всегда можете отключить рп составляющую бота командой </em>/change_rp.<em> "
            "Обратите внимание, что это сделает недоступными некоторые функции "
            "бота.</em>".format(player.nickname),
            parse_mode='HTML')
        if filter_is_pm(mes):
            send_general_buttons(mes.from_user.id, user_data)
        auth(bot, update)

    else:
        # Обновляем существующую информацию
        player.username = mes.from_user.username
        player.nickname = nickname
        player.guild_tag = guild_tag
        player.lvl = lvl
        player.attack = attack
        player.defense = defense
        player.stamina = stamina
        player.pet = pet
        player.equipment = player_equipment
        player.castle = castle
        player.last_updated = last_updated
        player.exp = exp
        player.update()
        bot.send_message(chat_id=mes.chat_id,
                         text="Профиль успешно обновлён, <b>{}</b>!".format(
                             player.nickname),
                         parse_mode='HTML')
        if player.guild is not None:
            guild = Guild.get_guild(player.guild)
            guild.calculate_attack_and_defense()
            guild.sort_players_by_exp()
コード例 #15
0
def back(bot, update, user_data):
    """
    Функция обработки кнопки ↩️Назад (↩️Back) - возврат на предыдущую локацию, а также отмена текущего действия
    (Добыча ресурсов, квест, ...)
    """
    statuses_back = {
        "barracks": "central_square",
        "central_square": "central_square",
        "castle_gates": "central_square",
        "throne_room": "central_square",
        "mid_feedback": "throne_room",
        "duty_feedback": "castle_gates",
        "king_cabinet": "throne_room",
        "headquarters": "throne_room",
        "changing_castle_message": "king_cabinet",
        "sending_guild_message": "headquarters",
        "editing_debrief": "headquarters",
        "technical_tower": "central_square",
        "my_cabinet": "technical_tower",
        "sending_bot_guild_message": "technical_tower",
        "editing_update_message": "technical_tower",
        "sawmill": "castle_gates",
        "quarry": "castle_gates",
        "construction": "construction_plate",
        "construction_plate": "central_square",
        "treasury": "throne_room",
        "hall_of_fame": "central_square",
        # "tops": "hall_of_fame",
        "tops": "central_square",
        "manuscript": "technical_tower",
        "guides": "manuscript",
        "tea_party": "central_square",
        "exploration": "tea_party",
        "pit": "tea_party",
        "roulette": "tea_party",
        "awaiting_roulette_bet": "roulette",
        "add_autospend_rule": "barracks"
    }

    statuses_rp_off = {
        "tops": DEFAULT_CASTLE_STATUS,
        "mid_feedback": DEFAULT_CASTLE_STATUS,
        "manuscript": DEFAULT_CASTLE_STATUS,
    }

    status = user_data.get("status")
    if status is None:
        send_general_buttons(update.message.from_user.id, user_data, bot=bot)
        return
    if status in [
            "sawmill", "quarry", "construction", "exploration", "pit",
            "waiting_second_player_for_quest", "two_quest"
    ]:
        if "quest_name" in user_data:
            return_from_quest(update.message.from_user.id, user_data)
        bot.send_message(chat_id=update.message.from_user.id,
                         text="Операция отменена.")
    rp_off = user_data.get("rp_off") or False
    new_status = None
    if rp_off:
        new_status = statuses_rp_off.get(status)
    if new_status is None:
        new_status = statuses_back.get(status)
    new_location = Location.get_id_by_status(new_status)
    user_data.update({"status": new_status, "location_id": new_location})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #16
0
def roulette_main(bot, update, user_data):
    """
    Функция, вызывающаяся при входе в рулетку
    """
    user_data.update({"status": "roulette", "location_id": 10})
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)
コード例 #17
0
def welcome(bot, update, user_data):
    """
    Функция, вызываемая при успешной регистрации
    """
    send_general_buttons(update.message.from_user.id, user_data, bot=bot)