Esempio n. 1
0
def get_forward_message_time(mes):
    try:
        value = utc.localize(
            mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    except ValueError:
        value = mes.forward_date.astimezone(tz=moscow_tz).replace(tzinfo=None)
    return value
def add_class_from_player(bot, update):
    mes = update.message
    player = Player.get_player(mes.from_user.id)
    if player is None:
        bot.send_message(
            chat_id=mes.from_user.id,
            text="Сначала необходимо зарегистрироваться. Для этого необходимо "
            "прислать ответ @ChatWarsBot на команду /hero")
        return
    forward_message_date = utc.localize(
        mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    if datetime.datetime.now() - forward_message_date > datetime.timedelta(
            seconds=30):
        bot.send_message(chat_id=mes.chat_id,
                         text="Это устаревший профиль.",
                         reply_to_message_id=mes.message_id)
        return
    game_class = re.search(
        "🖤{} (\\w+) Скалы".format(re.escape(player.nickname)), mes.text)
    if game_class is None:
        bot.send_message(chat_id=mes.chat_id,
                         text="Произошла ошибка.",
                         reply_to_message_id=mes.message_id)
        return
    game_class = game_class.group(1)
    player.game_class = game_class
    player.update_to_database()
    bot.send_message(
        chat_id=mes.from_user.id,
        text="Информация о классе обновлена, <b>{}</b>! Теперь ты "
        "<b>{}</b>!".format(player.nickname, player.game_class),
        parse_mode='HTML')
Esempio n. 3
0
def fight_club(bot, update):
    mes = update.message
    link = re.search("/fight_(.*)$", mes.text)
    if link is None:
        bot.send_message(chat_id=mes.chat_id, text="Ошибка.")
        return
    link = link.group(1)
    player = Player.get_player(mes.from_user.id)
    try:
        forward_message_date = utc.localize(mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    except Exception:
        forward_message_date = datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None)
    request = "select mob_lvls, helpers from mobs where link = %s"
    cursor.execute(request, (link,))
    row = cursor.fetchone()
    helpers = []
    lvl = player.lvl
    if row is not None:
        lvls, helpers = row
        lvl = lvls[0]
    response = get_fight_club_txt(link, lvl, helpers, forward_message_date)
    buttons = [[InlineKeyboardButton(text="⚔ {}-{}🏅".format(int(lvl - 5), int(lvl + 10)),
                                     url=u"https://t.me/share/url?url=/fight_{}".format(link)),
                InlineKeyboardButton(text="🤝Помогаю!", callback_data="fight_club_partify_{}".format(link))]]
    guild = Guild.get_guild(chat_id=mes.chat_id)
    if guild is not None:
        ping = []
        for player_id in guild.members:
            cur_player = Player.get_player(player_id)
            if cur_player is None:
                continue
            if cur_player.settings.get("pretend") and cur_player.lvl in range(lvl - 5, lvl + 11) and \
                    player.username not in ping:
                ping.append(player.username)
            if len(ping) >= 4:
                text = "Подпольный бой!\n"
                for username in ping:
                    text += "@{} ".format(username)
                bot.send_message(chat_id=mes.chat_id, text=text)
                ping.clear()
        if ping:
            text = "Подпольный бой!\n"
            for username in ping:
                text += "@{} ".format(username)
            bot.send_message(chat_id=mes.chat_id, text=text)
    if guild is not None:
        response += "\n\n<em>Подписаться на уведомления о клубах в чате ги:</em> /pretend"
    bot.send_message(chat_id=mes.chat_id, text=response, reply_markup=InlineKeyboardMarkup(buttons), parse_mode='HTML')
    request = "insert into mobs(link, mob_names, mob_lvls, date_created, created_player) values (" \
              "%s, %s, %s, %s, %s)"
    try:
        cursor.execute(request, (link, ["Fight Club"], [lvl], forward_message_date, mes.from_user.id))
    except psycopg2.IntegrityError:
        pass
Esempio n. 4
0
def get_message_forward_time(message):
    try:
        forward_message_date = utc.localize(
            message.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    except ValueError:
        try:
            forward_message_date = message.forward_date
        except AttributeError:
            forward_message_date = local_tz.localize(
                message.date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    return forward_message_date
Esempio n. 5
0
def count_battle_id(message=None):
    first_battle = datetime.datetime(2018, 5, 27, 9, 0, 0, 0)
    interval = datetime.timedelta(hours=8)
    if message is None:
        forward_message_date = get_current_datetime()
    else:
        if message.forward_date is not None:
            try:
                forward_message_date = utc.localize(
                    message.forward_date).astimezone(tz=moscow_tz).replace(
                        tzinfo=None)
            except ValueError:
                forward_message_date = message.forward_date
        else:
            forward_message_date = utc.localize(
                message.date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    time_from_first_battle = forward_message_date - first_battle
    battle_id = 0
    while time_from_first_battle > interval:
        time_from_first_battle -= interval
        battle_id = battle_id + 1
    return battle_id
def notify_guild_attack(bot, update):
    mes = update.message
    remaining_time = get_time_remaining_to_battle()
    forward_message_date = utc.localize(
        mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    if forward_message_date - datetime.datetime.now() > datetime.timedelta(
            minutes=2):
        return 0
    if remaining_time > datetime.timedelta(minutes=30):
        pass
        return 0
    ready_to_battle = mes.text.count("[⚔]") + mes.text.count("[🛡]")
    sleeping = mes.text.count("[🛌]") + mes.text.count("[⚒]")
    response = "<b>{0}</b>\nГотово к битве: <b>{1}</b>\nНе готово к битве, но занято <b>{2}</b>\n" \
               "Спит: <b>{3}</b>\n\nВремя до битвы: {4}\n".format(mes.text.splitlines()[0], ready_to_battle,
                                                                  mes.text.count("\n") - ready_to_battle - sleeping,
                                                                  sleeping, ":".join(str(remaining_time).partition(".")[0].split(":")[0:3]))
    request = "select guild_id from guilds where chat_id = %s"
    cursor.execute(request, (mes.chat_id, ))
    row = cursor.fetchone()
    if row is None:
        return
    guild = Guild.get_guild(guild_id=row[0])
    set = guild.settings.get(
        "battle_notify") if guild.settings is not None else True
    if guild is None or set is False:
        return
    if mes.chat_id != guild.chat_id:
        return
    if mes.from_user.id not in get_admin_ids(
            bot, chat_id=mes.chat_id) and not check_access(mes.from_user.id):
        bot.send_message(chat_id=mes.chat_id,
                         text="Доступ только у админов",
                         parse_mode='HTML',
                         reply_to_message_id=mes.message_id)
        return
    do_not_ready = []
    sleeping = []
    for string in mes.text.splitlines()[1:]:
        if not ("[⚔]" in string or "[🛡]" in string):
            nickname = string.partition("]")[2][1:]
            do_not_ready.append(nickname)
            if "[🛌]" in string or "[⚒]" in string:
                sleeping.append(nickname)

    in_dict_do_not_ready = []
    in_dict_sleeping = []
    ping_dict = {
        "do not ready": in_dict_do_not_ready,
        "sleeping": in_dict_sleeping
    }
    for player_id in guild.members:
        player = Player.get_player(player_id, notify_on_error=False)
        if player is None:
            continue
        db_nickname = player.nickname.partition("]")[2]
        if db_nickname in do_not_ready:
            in_dict_do_not_ready.append(player.username)
            if db_nickname in sleeping:
                in_dict_sleeping.append(player.username)

    ping_by_chat_id.update({mes.chat_id: ping_dict})
    response += "Пингануть тех, кто спит: /notify_guild_sleeping\n" \
                "Пингануть всех, кто не готов: /notify_guild_not_ready"
    bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')
Esempio n. 7
0
def mob(bot, update):
    mes = update.message
    link = re.search("/fight_(.*)$", mes.text)
    if link is None:
        bot.send_message(chat_id=mes.chat_id, text="Ошибка.")
        return
    link = link.group(1)
    names, lvls, buffs = [], [], []
    for string in mes.text.splitlines():
        parse = re.search("(.+) lvl\\.(\\d+)", string)
        if parse is not None:
            name = parse.group(1)
            lvl = int(parse.group(2))
            names.append(name)
            lvls.append(lvl)
            buffs.append("")
        else:
            parse = re.search("  ╰ (.+)", string)
            if parse is not None:
                buff = parse.group(1)
                buffs.pop()
                buffs.append(buff)
    try:
        forward_message_date = utc.localize(mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    except Exception:
        forward_message_date = datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None)
    # forward_message_date = datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None) - datetime.timedelta(
    #     minutes=2, seconds=30)  # Test only
    request = "insert into mobs(link, mob_names, mob_lvls, date_created, created_player, on_channel, buffs, " \
              "minutes) values (" \
              "%s, %s, %s, %s, %s, %s, %s, %s)"
    is_pm = filter_is_pm(mes)
    minutes = AMBUSH_MINUTES if 'ambush' in mes.text else USUAL_MINUTES
    if "Вы нашли странное укрытие. Некоторые символы в дверном проёме выглядят знакомо" in mes.text:
        minutes = 7
    helpers = []
    try:
        cursor.execute(request, (link, names, lvls, forward_message_date, mes.from_user.id, is_pm, buffs, minutes))
    except psycopg2.IntegrityError:
        # logging.error(traceback.format_exc())
        request = "select on_channel, helpers from mobs where link = %s"
        cursor.execute(request, (link,))
        row = cursor.fetchone()
        helpers = row[1]
        if is_pm:
            if row[0]:
                bot.send_message(chat_id=mes.chat_id, text="Данный моб уже на канале",
                                 reply_to_message_id=mes.message_id)
                return
            request = "update mobs set on_channel = true where link = %s"
            cursor.execute(request, (link,))
    minutes = AMBUSH_MINUTES if 'ambush' in mes.text else USUAL_MINUTES
    response, buttons, avg_lvl, remaining_time = get_mobs_text_and_buttons(mes.chat_id, link, names, lvls, helpers,
                                                                           forward_message_date, buffs, minutes,
                                                                           mes.from_user.id)
    player: Player = Player.get_player(mes.from_user.id)
    if is_pm and (player is None or player.castle == '🖤'):
        if 'It\'s an ambush!'.lower() in mes.text.lower():
            bot.send_message(chat_id=mes.chat_id, text="Засады не отправляются на канал. "
                                                       "Зовите бойцов вашей гильдии на помощь!")
        elif remaining_time <= datetime.timedelta(0):
            bot.send_message(chat_id=mes.chat_id, text="Время истекло. На канал не отправлено.")
        # elif re.search("(boar|wolf|bear)", mes.text) is not None and 'resist' in mes.text:
        #     pass
        else:
            threading.Thread(target=send_mob_message_and_start_updating(bot, mes, player, response, buttons,
                                                                        is_pm, link, forward_message_date, [])).start()
            bot.send_message(chat_id=mes.chat_id, parse_mode='HTML',
                             text="Отправлено на <a href=\"https://t.me/mobs_skala_cw3\">канал</a>, а также в "
                                  "<a href=\"https://t.me/CwMobsNotifyBot\">бота</a>. Спасибо!")
            if player is not None and player.has_api_access:
                cwapi.update_player(player.id, player=player)
            try:
                # requests.post('http://127.0.0.1:5555/addMob',
                #               json=json.dumps({"castle": '🖤', "text": mes.text, "telegram_id": mes.from_user.id,
                #                                "forward_date": forward_message_date.timestamp()}, ensure_ascii=False),
                #               timeout=0.3)

                pass
                # Верно!
                requests.post('http://144.91.112.129:5555/addMob',
                              json=json.dumps({"castle": '🖤', "text": mes.text, "telegram_id": mes.from_user.id,
                                               "forward_date": forward_message_date.timestamp()}, ensure_ascii=False),
                              timeout=0.3)
            except Exception:
                logging.error(traceback.format_exc())
    else:
        ping, ping_list = [], []
        if remaining_time > datetime.timedelta(0):
            if not is_pm:
                minus, plus = get_suitable_lvls(mes.text)
                ping_list = get_chat_helpers(mes.chat_id, minus, plus, avg_lvl, player)
                if ping_list:
                    for pl in ping_list:
                        on = pl.settings.get("mobs_notify")
                        if on is None:
                            on = True
                        if on and pl.id != mes.from_user.id:
                            ping.append(pl.username)
                    if ping:
                        threading.Thread(target=send_notify, args=(link, mes.chat_id, ping)).start()

        guild = Guild.get_guild(player.guild)
        if guild is None or guild.settings.get("mobs_hunt", True) is True or mes.chat_id != guild.chat_id:
            threading.Thread(target=send_mob_message_and_start_updating,
                             args=(
                                 bot, mes, player, response, buttons, is_pm, link, forward_message_date, ping_list)
                             ).start()
    return
Esempio n. 8
0
def get_forward_message_time(mes):
    return utc.localize(
        mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
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()
Esempio n. 10
0
def add_report(bot, update, user_data):
    """
    Функция сохранения репорта от игрока
    """
    mes = update.message
    s = mes.text
    player = Player.get_player(mes.from_user.id)
    if player is None:
        return

    try:
        forward_message_date = utc.localize(
            mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    except ValueError:
        try:
            forward_message_date = mes.forward_date
        except AttributeError:
            forward_message_date = local_tz.localize(
                mes.date).astimezone(tz=moscow_tz).replace(tzinfo=None)

    line = re.search(
        "[🍆🍁☘️🌹🐢🦇🖤️]*(.*)\\s⚔:(\\d+)\\(?(.?\\d*)\\)?.*🛡:(\\d+)\\(?(.?\\d*)\\)?.*Lvl: (\\d+)\\s",
        s)
    """ 
    . - замок, (.*)\\s - никнейм в игре - от замка до эмодзи атаки. ⚔:(\\d+) - Парсинг атаки в конкретной битве
    \\(? - Возможно атака подверглась модификациям, тогда сразу после числа атаки будет открывающая скобка. 
    \\(?(.?\\d*)\\)? - Парсинг дополнительной атаки целиком. Группа будет равна ' ', то есть одному пробельному символу,
    если дополнительной атаки нет.
    .*🛡: - всё лишнее до дефа. Далее абсолютно аналогично атаке 🛡:(\\d+)\\(?(.?\\d*)\\)?
    .*Lvl: (\\d+)\\s - лишнее до уровня и парсинг уровня, в комментариях не нуждается
    """
    nickname = line.group(1)
    if nickname != player.nickname:
        bot.send_message(
            chat_id=mes.chat_id,
            text="Это не ваш репорт. В случае ошибок обновите профиль.",
            reply_to_message_id=mes.message_id)
        return
    attack = int(line.group(2))
    additional_attack = int(line.group(3)) if line.group(3) != " " else 0
    defense = int(line.group(4))
    additional_defense = int(line.group(5)) if line.group(5) != " " else 0
    lvl = int(line.group(6))
    exp = re.search("🔥Exp:\\s(-?\\d+)", s)
    exp = int(exp.group(1)) if exp is not None else 0
    gold = re.search("💰Gold:\\s+(-?\\d+)", s)
    gold = int(gold.group(1)) if gold is not None else 0
    stock = re.search("📦Stock:\\s+(-?\\d+)", s)
    stock = int(stock.group(1)) if stock is not None else 0
    battle_id = count_battle_id(mes)
    hp = re.search("❤️Hp: (-?\\d+)", s)
    hp = int(hp.group(1)) if hp is not None else 0
    outplay = re.search("You outplayed (.+) by ⚔️(\\d+)", s)
    outplay_dict = {}
    if outplay is not None:
        outplay_nickname = outplay.group(1)
        outplay_attack = int(outplay.group(2))
        outplay_dict.update({
            "nickname": outplay_nickname,
            "attack": outplay_attack
        })

    if 'Встреча:' in s or ('Твои удары' in s.lower()
                           and 'Атаки врагов' in s.lower()
                           and 'Ластхит' in s.lower()):
        # Репорт с мобов
        earned = re.search("Получено: (.+) \\((\\d+)\\)", s)
        if earned is not None:
            name = earned.group(1)
            count = earned.group(2)
            code = get_item_code_by_name(name)
            if code is None:
                code = name
            drop = player.mobs_info.get("drop")
            if drop is None:
                drop = {}
                player.mobs_info.update({"drop": drop})
            drop.update(
                {forward_message_date.timestamp(): {
                     "code": code,
                     "count": 1
                 }})
            player.update()
        names, lvls, buffs = [], [], []
        for string in mes.text.splitlines():
            parse = re.search("(.+) lvl\\.(\\d+)", string)
            if parse is not None:
                name = parse.group(1)
                lvl = int(parse.group(2))
                names.append(name)
                lvls.append(lvl)
                buffs.append("")
            else:
                parse = re.search("  ╰ (.+)", string)
                if parse is not None:
                    buff = parse.group(1)
                    buffs.pop()
                    buffs.append(buff)
        hit = re.search("Твои удары: (\\d+)", s)
        hit = int(hit.group(1)) if hit is not None else 0
        miss = re.search("Атаки врагов: (\\d+)", s)
        miss = int(miss.group(1)) if miss is not None else 0
        last_hit = re.search("Ластхит: (\\d+)", s)
        last_hit = int(last_hit.group(1)) if last_hit is not None else 0
        request = "select report_id from mob_reports where date_created = %s and player_id = %s"
        cursor.execute(request, (forward_message_date, player.id))
        row = cursor.fetchone()
        if row is not None:
            return
        request = "insert into mob_reports(player_id, date_created, attack, additional_attack, defense, " \
                  "additional_defense, lvl, exp, gold, stock, mob_names, mob_lvls, buffs, hp, hit, miss, last_hit) " \
                  "values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        cursor.execute(
            request,
            (player.id, forward_message_date, attack, additional_attack,
             defense, additional_defense, lvl, exp, gold, stock, names, lvls,
             buffs, hp, hit, miss, last_hit))
        return

    equip = re.search("Found: (.+) \\(from (.+)\\)", s)
    equip_change = None
    if equip is not None:
        name = equip.group(1)
        found_from = equip.group(2)
        equip_change = {"status": "Found", "name": name, "from": found_from}
    else:
        equip = re.search("Lost: (.+)", s)
        if equip is not None:
            name = equip.group(1)
            equip_change = {"status": "Lost", "name": name}

    request = "select report_id from reports where battle_id = %s and player_id = %s"
    cursor.execute(request, (battle_id, player.id))
    row = cursor.fetchone()
    if row is not None:
        bot.send_message(chat_id=mes.from_user.id,
                         text="Репорт за эту битву уже учтён!")
        return
    request = "insert into reports(player_id, battle_id, attack, additional_attack, defense, additional_defense, lvl, "\
              "exp, gold, stock, equip, outplay) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
    cursor.execute(
        request,
        (player.id, battle_id, attack, additional_attack, defense,
         additional_defense, lvl, exp, gold, stock,
         json.dumps(equip_change, ensure_ascii=False) if equip_change
         is not None else None, json.dumps(outplay_dict, ensure_ascii=False)
         if outplay_dict is not None else None))

    player.count_reports()
    reputation = REPORT_REPUTATION_COUNT

    if forward_message_date < datetime.datetime(
            year=2019, month=5, day=29, hour=12):
        reputation = 0

    player.reputation += reputation
    player.update()
    response = "Репорт учтён. Спасибо!\n" \
               "{}".format("Получено {}🔘!".format(reputation) if not user_data.get("rp_off") else "")
    bot.send_message(chat_id=mes.from_user.id,
                     text=response,
                     parse_mode='HTML')
    if exp != 0:
        on_add_report(player, forward_message_date)
    """
Esempio n. 11
0
def mob(bot, update):
    mes = update.message
    link = re.search("/fight_(.*)$", mes.text)
    if link is None:
        bot.send_message(chat_id=mes.chat_id, text="Ошибка.")
        return
    link = link.group(1)
    names, lvls, buffs = [], [], []
    for string in mes.text.splitlines():
        parse = re.search("(.+) lvl\\.(\\d+)", string)
        if parse is not None:
            name = parse.group(1)
            lvl = int(parse.group(2))
            names.append(name)
            lvls.append(lvl)
            buffs.append("")
        else:
            parse = re.search("  ╰ (.+)", string)
            if parse is not None:
                buff = parse.group(1)
                buffs.pop()
                buffs.append(buff)
    try:
        forward_message_date = utc.localize(mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None)
    except Exception:
        forward_message_date = datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None)
    request = "insert into mobs(link, mob_names, mob_lvls, date_created, created_player, on_channel, buffs, " \
              "minutes) values (" \
              "%s, %s, %s, %s, %s, %s, %s, %s)"
    is_pm = filter_is_pm(mes)
    minutes = 5 if 'ambush' in mes.text else 3
    helpers = []
    try:
        cursor.execute(request, (link, names, lvls, forward_message_date, mes.from_user.id, is_pm, buffs, minutes))
    except psycopg2.IntegrityError:
        # logging.error(traceback.format_exc())
        request = "select on_channel, helpers from mobs where link = %s"
        cursor.execute(request, (link,))
        row = cursor.fetchone()
        helpers = row[1]
        if is_pm:
            if row[0]:
                bot.send_message(chat_id=mes.chat_id, text="Данный моб уже на канале",
                                 reply_to_message_id=mes.message_id)
                return
            request = "update mobs set on_channel = true where link = %s"
            cursor.execute(request, (link,))
    minutes = 5 if 'ambush' in mes.text else 3
    response, buttons, avg_lvl, remaining_time = get_mobs_text_and_buttons(link, names, lvls, helpers,
                                                                           forward_message_date, buffs, minutes,
                                                                           mes.from_user.id)
    player = Player.get_player(mes.from_user.id)
    if is_pm and (player is None or player.castle == '🖤'):
        if 'It\'s an ambush!'.lower() in mes.text.lower():
            bot.send_message(chat_id=mes.chat_id, text="Засады не отправляются на канал. "
                                                       "Зовите бойцов вашей гильдии на помощь!")
        elif remaining_time <= datetime.timedelta(0):
            bot.send_message(chat_id=mes.chat_id, text="Время истекло. На канал не отправлено.")
        # elif re.search("(boar|wolf|bear)", mes.text) is not None and 'resist' in mes.text:
        #     pass
        else:
            threading.Thread(target=send_mob_message_and_start_updating(bot, mes, player, response, buttons,
                                                                        is_pm, link, forward_message_date)).start()
            bot.send_message(chat_id=mes.chat_id, parse_mode='HTML',
                             text="Отправлено на <a href=\"https://t.me/mobs_skala_cw3\">канал</a>, а также в "
                                  "<a href=\"https://t.me/CwMobsNotifyBot\">бота</a>. Спасибо!")
            try:
                # requests.post('http://127.0.0.1:5555/addMob',
                #               json=json.dumps({"castle": '🖤', "text": mes.text, "telegram_id": mes.from_user.id,
                #                                "forward_date": forward_message_date.timestamp()}, ensure_ascii=False),
                #               timeout=0.3)

                pass
                # Верно!
                requests.post('http://144.91.112.129:5555/addMob',
                              json=json.dumps({"castle": '🖤', "text": mes.text, "telegram_id": mes.from_user.id,
                                               "forward_date": forward_message_date.timestamp()}, ensure_ascii=False),
                              timeout=0.3)
            except Exception:
                logging.error(traceback.format_exc())
    else:
        if remaining_time > datetime.timedelta(0):
            ping_count = 0
            if not is_pm:
                barracks = Location.get_location(1)
                try:
                    ping_list = barracks.special_info.get("mobs_notify").get(str(mes.chat_id)).copy()
                except Exception:
                    ping_list = None
                if not ping_list:
                    ping_list = []
                if player.guild is not None or ping_list:
                    guild = Guild.get_guild(guild_id=player.guild)
                    if guild.is_academy() and mes.chat_id == guild.chat_id:
                        # Пинги для академки отключены
                        return
                    if guild is not None and guild.chat_id == mes.chat_id:
                        ping_list += guild.members
                    if ping_list:
                        minus, plus = get_suitable_lvls(mes.text)
                        ping = []
                        for pl_id in ping_list:
                            pl = Player.get_player(pl_id)
                            if avg_lvl - minus <= pl.lvl <= avg_lvl + plus:
                                on = pl.settings.get("mobs_notify")
                                if on is None:
                                    on = True
                                if on and pl.id != mes.from_user.id:
                                    ping.append(pl.username)
                        if ping:
                            text = "Мобы!\n"
                            for username in ping:
                                text += "@{} ".format(username)
                                ping_count += 1
                                if ping_count >= PING_LIMIT:
                                    bot.send_message(chat_id=mes.chat_id, text=text)
                                    text = "Мобы!\n"
                                    ping_count = 0
                            if text != "Мобы!\n":
                                bot.send_message(chat_id=mes.chat_id, text=text)
        threading.Thread(target=send_mob_message_and_start_updating(bot, mes, player, response, buttons, is_pm, link,
                                                                    forward_message_date)).start()
    return