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')
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
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
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')
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
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()
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) """
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