コード例 #1
0
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')
コード例 #2
0
 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'
コード例 #3
0
 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'
コード例 #4
0
 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
コード例 #5
0
 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
コード例 #6
0
 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"]
コード例 #7
0
 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)
コード例 #8
0
 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'
コード例 #9
0
 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"]
コード例 #10
0
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)
コード例 #11
0
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
コード例 #12
0
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)
コード例 #13
0
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)
コード例 #14
0
 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'
コード例 #15
0
 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"
     ]
コード例 #16
0
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')
コード例 #17
0
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')
コード例 #18
0
 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'])
コード例 #19
0
 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")
コード例 #20
0
 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'
コード例 #21
0
 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'
コード例 #22
0
 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'
コード例 #23
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)
コード例 #24
0
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)
コード例 #25
0
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)
コード例 #26
0
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)
コード例 #27
0
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')
コード例 #28
0
 def filter(self, message):
     return filter_is_pm(message) and message.text.startswith(
         "/vote_results")
コード例 #29
0
 def filter(self, message):
     return filter_is_pm(message) and message.text.startswith(
         "/start_vote_")
コード例 #30
0
 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'