def count_union_stats(bot, update): mes = update.message if not filter_is_pm(mes): bot.send_message( chat_id=mes.chat_id, text="Команда разрешена только в лс, чтобы не пинговать людей.", reply_to_message_id=mes.message_id) return union = TradeUnion.get_union(creator_id=mes.from_user.id) if union is None: bot.send_message( chat_id=mes.chat_id, text="Только создатель и замы профсоюза могут вносить его состав.") return attack = 0 defense = 0 count = 0 for player_id in union.players: player = Player.get_player(player_id, notify_on_error=False) if player is None: continue attack += player.attack defense += player.defense count += 1 response = "Суммарные статы по <b>{}</b>:\n⚔️: <code>{}</code>, 🛡: <code>{}</code>\n" \ "Всего людей: <code>{}</code>".format(union.name, attack, defense, count) bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and message.text in ["Попросить аудиенции у 👑Короля", "Ask for an audience with 👑King"] and \ user_data.get("status") == 'throne_room'
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and message.text in ["🔭 Башня ТехМаг наук", "🔭TechMag Science Tower"] and \ user_data.get("status") == 'central_square'
def filter(self, message): if message.text: if message.forward_from is None: return False return "/tu_list_" in message.text and filter_is_chat_wars_forward(message) and \ filter_is_pm(message) return False
def filter(self, message): if message.text: if message.forward_from is None: return False return (message.text.startswith("🏚Trade Union:") or message.text.startswith("🏠Trade Union:")) and \ filter_is_chat_wars_forward(message) and filter_is_pm(message) return False
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and (message.text in ["🗂Архив объявлений", "🗂Announcements archive"] and user_data.get("status") == 'technical_tower') or \ message.text in ["🗂Обновления", "🗂Updates"]
def filter(self, message): return message.text.split(" ")[0] in [ "/split_union_attack", "/split_union_defense", "/split_union_attack_full", "/split_union_defense_full", "/split_union_attack_alt", "/split_union_defense_alt", "/split_union_attack_full_alt", "/split_union_defense_full_alt" ] and filter_is_pm(message)
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and message.text in ["↔️ Подойти к указателям", "↔️ View signs", "↔️ See the signs"] and \ user_data.get("status") == 'central_square'
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and message.text in ["📰Манускрипт", "📰Инструкция", "📰Manuscript", "📰Instruction"] and \ user_data.get("status") in ['technical_tower', DEFAULT_CASTLE_STATUS, "rp_off"]
def info_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return text = mes.text.partition(" ")[2].lower() list_triggers = triggers_in.get(mes.chat_id) chat_id = mes.chat_id if list_triggers is None: list_triggers = [] triggers_in.update({mes.chat_id: list_triggers}) if text not in list_triggers: if text not in global_triggers_in: bot.send_message(chat_id=mes.chat_id, text="Триггер не найден", reply_to_message_id=mes.message_id) return chat_id = 0 request = "select creator, date_created from triggers where text_in = %s and chat_id = %s" cursor.execute(request, (text, chat_id)) row = cursor.fetchone() response = "<code>{}</code> — создал <code>{}</code> {}".format( text, row[0], row[1].strftime("%d/%m/%y %H:%M:%S")) bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML', reply_to_message_id=mes.message_id)
def replace_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return text = mes.text.partition(" ")[2].lower() list_triggers = triggers_in.get(mes.chat_id) if list_triggers is None or text not in list_triggers: bot.send_message(chat_id=mes.chat_id, text="Триггер не найден", reply_to_message_id=mes.message_id) return request = "update triggers set type = %s, data_out = %s, creator = %s, date_created = %s where chat_id = %s and " \ "text_in = %s" trigger_type, data = get_message_type_and_data(mes.reply_to_message) cursor.execute(request, (trigger_type, data, mes.from_user.username or mes.from_user.id, datetime.datetime.now( tz=moscow_tz).replace(tzinfo=None), mes.chat_id, text)) bot.send_message(chat_id=mes.chat_id, text="Триггер успешно заменён!", reply_to_message_id=mes.message_id) return
def triggers(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return local = get_triggers_list(mes.chat_id) global_triggers = get_triggers_list(0) response = f"<b>Список триггеров</b>:\n<b>Локальные триггеры</b>:\n{local}\n\n" \ f"<b>Глобальные триггеры</b>:\n{global_triggers}" pattern = re.compile("(.*)\n([^\n]*$)", re.DOTALL) while len(response) > MAX_MESSAGE_LENGTH: # Если не влезает в одно сообщение # Отрезаем последнюю влезающую строку, отправляем сообщение без неё, склеиваем то, что не влезло, повторяем parse = re.match(pattern, response[:MAX_MESSAGE_LENGTH]) bot.group_send_message(chat_id=mes.chat_id, text=parse.group(1), parse_mode='HTML') response = parse.group(2) + response[MAX_MESSAGE_LENGTH:] bot.group_send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML') bot.send_message_group(mes.chat_id)
def remove_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return text = mes.text.partition(" ")[2].lower() chat_id = mes.chat_id trigger_list = triggers_in.get(mes.chat_id) if trigger_list is None or text not in trigger_list: chat_id = 0 if text in global_triggers_in: if not check_access(mes.from_user.id): bot.send_message( chat_id=mes.chat_id, text="Недостаточно прав для удаления глобального триггера", reply_to_message_id=mes.message_id) return else: bot.send_message(chat_id=mes.chat_id, text="Триггер не найден", reply_to_message_id=mes.message_id) return trigger_list = global_triggers_in trigger_list.remove(text) request = "delete from triggers where text_in = %s and chat_id = %s" cursor.execute(request, (text, chat_id)) bot.send_message(chat_id=mes.chat_id, text="Триггер успешно удалён!", reply_to_message_id=mes.message_id)
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False # Внимательность при копировании, отрицание return filter_is_pm(message) and not (message.text in ["↩️ Назад", "↩️ Back"]) and \ user_data.get("status") == 'construction_plate'
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and message.text in [ "💲Магазин статусов", "💲Status shop" ]
def view_guild_players_in_union(bot, update): mes = update.message if not filter_is_pm(mes): bot.send_message( chat_id=mes.chat_id, text="Команда разрешена только в лс, чтобы не пинговать людей.", reply_to_message_id=mes.message_id) return curr_player = Player.get_player(mes.from_user.id) if curr_player is None: return guild_id = curr_player.guild if guild_id is None: bot.send_message( chat_id=mes.chat_id, text= "Вы не состоите в гильдии. Вступите в гильдию в игре и попросите " "командира добавить вас в гильдейском чате.") return guild = Guild.get_guild(guild_id=guild_id) if guild is None: bot.send_message(chat_id=mes.chat_id, text="Гильдия не найдена.") return if not guild.check_high_access(curr_player.id): bot.send_message( chat_id=mes.chat_id, text="Только замы и гм могут использовать эту команду.") return union_name = re.search(" (.*)", mes.text) if union_name is None: bot.send_message( chat_id=mes.chat_id, text="Неверный синтаксис. Укажите название профсоюза после команды." ) return union_name = union_name.group(1) union = TradeUnion.get_union(union_name=union_name) if union is None: bot.send_message( chat_id=mes.chat_id, text="Профсоюз не найден. Проверьте правильность ввода его имени.") return not_in_union = [] response = "Список игроков в гильдии <b>{}</b> в профсоюзе <b>{}</b>\n".format( guild.tag, union.name) for player_id in guild.members: player = Player.get_player(player_id, notify_on_error=False) if player is None: continue if player_id in union.players: response += "<b>{}</b> — @{}\n".format(player.nickname, player.username) else: not_in_union.append(player) response += "\nВ других профсоюзах или без него:\n" for player in not_in_union: response += "<b>{}</b> — @{}\n".format(player.nickname, player.username) bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')
def view_guild_unions(bot, update): mes = update.message if not filter_is_pm(mes): bot.send_message( chat_id=mes.chat_id, text="Команда разрешена только в лс, чтобы не пинговать людей.", reply_to_message_id=mes.message_id) return curr_player = Player.get_player(mes.from_user.id) if curr_player is None: return guild_id = curr_player.guild if guild_id is None: bot.send_message( chat_id=mes.chat_id, text= "Вы не состоите в гильдии. Вступите в гильдию в игре и попросите " "командира добавить вас в гильдейском чате.") return guild = Guild.get_guild(guild_id=guild_id) if guild is None: bot.send_message(chat_id=mes.chat_id, text="Гильдия не найдена.") return if not guild.check_high_access(curr_player.id): bot.send_message( chat_id=mes.chat_id, text="Только замы и гм могут использовать эту команду.") return union_id = 1 union = TradeUnion.get_union(union_id=union_id) players_in_unions = {} while union is not None: union_players_list = [] players_in_unions.update({union.name: union_players_list}) for player_id in guild.members: player = Player.get_player(player_id, notify_on_error=False) if player is None: continue if player_id in union.players: union_players_list.append(player) union_id += 1 union = TradeUnion.get_union(union_id=union_id) response = "Список игроков в гильдии <b>{}</b> в профсоюзах\n".format( guild.tag) for player_id in guild.members: player = Player.get_player(player_id, notify_on_error=False) if player is None: continue found = False for un, lst in list(players_in_unions.items()): if player in lst: response += "<b>{}</b> — @{} — <b>{}</b>\n".format( player.nickname, player.username, un) found = True break if not found: response += "<b>{}</b> — @{} — НЕТ ПРОФСОЮЗА\n".format( player.nickname, player.username) bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and ((message.text in ["Обратиться к командному составу", "Contact the command staff"] and user_data.get("status") == 'throne_room') or message.text in ['🔖Связь с МИД', '🔖 Headquarters feedback'])
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False print(user_data) return filter_is_pm(message) and ( user_data.get("status") == 'requested_reward' or user_data.get("status") == "requested_additional_reward")
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and \ message.text in ["↔️Указатели", "👤Игроки", "👥Гильдии", "🖋Триггеры", "📦Сток", "🏠Профсоюзы", "↔️Signs", "👤Players", "👥Guilds", "🖋Triggers", "📦Stock", "📓Гайды", "📓Guides"] and \ user_data.get("status") == 'manuscript'
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and message.text in [ "⚔️Атака", "🛡Защита", "🔥Опыт", "🌲Дерево", "⛰Камень", "🏚Стройка", "⚔️Attack", "🛡Defence", "🔥Experience", "🌲Wood", "⛰Stone", "🏚Construction" ] and user_data.get("status") == 'tops'
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and \ message.text in ["/protyanut", "/shvatit", "/sgrupirovatsya", "/podsadit", "/spinakspine", "/podelitsya", "/oglyanutsya", "/ostanovispodumoi", "/chempahnet", "/smellsliketeenspirit", "/ktotam", "/datpyat", ] and \ user_data.get("status") == 'two_quest'
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)
def send_trigger(bot, update): mes = update.message if filter_is_pm(mes): return chat_id = mes.chat_id trigger_list = triggers_in.get(mes.chat_id) if trigger_list is None: trigger_list = [] triggers_in.update({mes.chat_id: trigger_list}) if mes.text.lower() not in trigger_list: chat_id = 0 request = "select type, data_out from triggers where text_in = %s and chat_id = %s limit 1" cursor.execute(request, (mes.text.lower(), chat_id)) row = cursor.fetchone() trigger_type, data = row send_trigger_with_type_and_data(bot, update.message.chat_id, trigger_type, data)
def add_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return trigger_in = mes.text.partition(" ")[2].lower() if not mes.text.startswith("/create_global_trigger"): chat_id = mes.chat_id trigger_list = triggers_in.get(mes.chat_id) if trigger_list is None: trigger_list = [] triggers_in.update({mes.chat_id: trigger_list}) else: if mes.from_user.id != SUPER_ADMIN_ID: return chat_id = 0 trigger_list = global_triggers_in list_triggers = triggers_in.get(chat_id) if chat_id else global_triggers_in if trigger_in in list_triggers: bot.send_message(chat_id=mes.chat_id, text="Триггер уже существует!", reply_to_message_id=mes.message_id) return if mes.reply_to_message is None: bot.send_message( chat_id=mes.chat_id, text="Сообщение должно быть ответом на другое сообщение.", reply_to_message_id=mes.message_id) return trigger_type, data = get_message_type_and_data(mes.reply_to_message) request = "insert into triggers(text_in, type, data_out, chat_id, creator, date_created) VALUES (%s, %s, %s, %s, " \ "%s, %s)" cursor.execute(request, (trigger_in, trigger_type, data, chat_id, mes.from_user.username or mes.from_user.id, datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None))) trigger_list.append(trigger_in) bot.send_message(chat_id=mes.chat_id, text="Триггер успешно создан!", reply_to_message_id=mes.message_id)
def add_alliance_location(bot, update): mes = update.message player, guild, alliance = get_player_and_guild_and_alliance(mes.from_user.id) try: parse = re.search("simple combination: (\\w+)", mes.text) link = parse.group(1) parse = re.search("You found hidden (location (.+) lvl.(\\d+)|headquarter (.+))", mes.text) if parse.group(4) is not None: return add_alliance_link(parse.group(4), link) name, lvl = parse.group(2), int(parse.group(3)) except Exception: logging.error(traceback.format_exc()) if filter_is_pm(mes): bot.send_message(chat_id=mes.chat_id, text="Произошла ошибка") return request = "select id from alliance_locations where link = %s and expired is false" cursor.execute(request, (link,)) row = cursor.fetchone() if row is not None: return request = "select id from alliance_locations where name = %s and lvl = %s and link is null " \ "and expired is false limit 1" cursor.execute(request, (name, lvl)) row = cursor.fetchone() if row is not None: location = AllianceLocation.get_location(row[0]) location.link = link location.update() else: location = AllianceLocation(None, link, name, None, lvl, None, 0, False, False) location.figure_type() location.insert_to_database() for alli in Alliance.get_all_alliances(): if alli.hq_chat_id is not None: bot.send_message(chat_id=alli.hq_chat_id, parse_mode='HTML', text="Новая локация: <b>{} Lvl.{}</b>\n{}".format(name, lvl, link)) bot.send_message(chat_id=mes.chat_id, text="Спасибо! Новая локация!", reply_to_message_id=mes.message_id)
def top_union_stats(bot, update): mes = update.message MAX_PLAYERS_PRINT = 20 if not filter_is_pm(mes): bot.send_message( chat_id=mes.chat_id, text="Команда разрешена только в лс, чтобы не пинговать людей.", reply_to_message_id=mes.message_id) return union = TradeUnion.get_union(creator_id=mes.from_user.id) if union is None: bot.send_message( chat_id=mes.chat_id, text="Только создатель и замы профсоюза могут вносить его состав.") return players = [] for player_id in union.players: player = Player.get_player(player_id, notify_on_error=False) if player is None: continue players.append(player) if "attack" in mes.text: players.sort(key=lambda x: x.attack, reverse=True) else: players.sort(key=lambda x: x.defense, reverse=True) count = 1 response = "Топы статов по <b>{}</b>:\n".format(union.name) for player in players: response += "{}: <b>{}</b> {}<code>{}</code> @{}" \ "\n".format(count, player.nickname, "⚔:" if "attack" in mes.text else "🛡:", player.attack if "attack" in mes.text else player.defense, player.username) if count >= MAX_PLAYERS_PRINT: break count += 1 bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')
def filter(self, message): return filter_is_pm(message) and message.text.startswith( "/vote_results")
def filter(self, message): return filter_is_pm(message) and message.text.startswith( "/start_vote_")
def filter(self, message): user_data = dispatcher.user_data.get(message.from_user.id) if user_data is None: return False return filter_is_pm(message) and user_data.get( "status") == 'editing_vote_duration'