Пример #1
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')
Пример #2
0
def add_union_assistant(bot, update):
    mes = update.message
    union = TradeUnion.get_union(creator_id=update.message.from_user.id)
    if union is None:
        bot.send_message(
            chat_id=update.message.chat_id,
            text="Только создатель и замы профсоюза могут добавлять замов.")
        return
    new_id = re.search(" (\\d+)", mes.text)
    if new_id is None:
        bot.send_message(chat_id=update.message.chat_id,
                         text="Неверный синтаксис.")
        return
    new_id = int(new_id.group(1))
    if new_id not in union.players:
        bot.send_message(chat_id=update.message.chat_id,
                         text="Замом можно сделать только члена профсоюза.")
        return
    if new_id in union.assistants:
        bot.send_message(chat_id=update.message.chat_id,
                         text="Этот игрок уже является заместителем.")
        return
    union.assistants.append(new_id)
    union.update_to_database()
    bot.send_message(chat_id=mes.chat_id, text="Заместитель успешно добавлен!")
Пример #3
0
def add_to_union_user_id(bot, update):
    mes = update.message
    union = TradeUnion.get_union(creator_id=update.message.from_user.id)
    if union is None:
        bot.send_message(
            chat_id=update.message.chat_id,
            text="Только создатель и замы профсоюза могут вносить его состав.")
        return
    player_id = re.search(" (\\d+)", mes.text)
    if player_id is None:
        bot.send_message(chat_id=update.message.chat_id,
                         text="Неверный синтаксис.")
        return
    player_id = int(player_id.group(1))
    if player_id not in union.players:
        union.players.append(player_id)
        union.update_to_database()
        bot.send_message(
            chat_id=update.message.chat_id,
            text="Игрок успешно добавлен в профсоюз <b>{}</b>.".format(
                union.name),
            parse_mode='HTML')
    else:
        bot.send_message(chat_id=update.message.chat_id,
                         text="Игрок уже в профсоюзе <b>{}</b>.".format(
                             union.name),
                         parse_mode='HTML')
Пример #4
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')
Пример #5
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')
Пример #6
0
def add_union_chat_id(bot, update):
    mes = update.message
    if mes.from_user.id == SUPER_ADMIN_ID:
        union = TradeUnion.get_union(union_id=1)
    else:
        union = TradeUnion.get_union(creator_id=update.message.from_user.id)
    if union is None:
        bot.send_message(
            chat_id=update.message.chat_id,
            text=
            "Только создатель и замы профсоюза могут изменять чат профсоюза")
        return
    union.chat_id = mes.chat_id
    union.update_to_database()
    bot.send_message(
        chat_id=mes.chat_id,
        text="Этот чат теперь официальный чат профсоюза <b>{}</b>".format(
            union.name),
        parse_mode='HTML')
    fill_union_chats()
Пример #7
0
def check_and_kick(bot, update):
    if kick_players_from_union is False:
        return
    mes = update.message
    union = TradeUnion.get_union(chat_id=update.message.chat_id)
    if union is None:
        return
    if mes.from_user.id not in union.players and mes.from_user.id != CASTLE_BOT_ID:
        try:
            bot.kickChatMember(chat_id=mes.chat_id,
                               user_id=update.message.from_user.id)
            bot.send_message(
                chat_id=mes.chat_id,
                text="Только членам <b>{}</b> разрешено находиться в этом чате."
                "Возможно, стоит обновить состав".format(union.name),
                parse_mode='HTML')
        except TelegramError:
            return
Пример #8
0
def clear_union_list(bot, update):
    global kick_players_from_union
    mes = update.message
    union = TradeUnion.get_union(creator_id=update.message.from_user.id)
    if union is None:
        bot.send_message(
            chat_id=update.message.chat_id,
            text="Только создатель и замы профсоюза могут удалять состав.")
        return
    union.players = [union.creator_id]
    union.update_to_database()
    bot.send_message(chat_id=mes.chat_id,
                     text="Список <b>{}</b> успешно очищен. "
                     "Пришлите форварды состава профсоюза заного.".format(
                         union.name),
                     parse_mode='HTML')
    kick_players_from_union = False
    threading.Timer(function=set_kick_flag, interval=60).start()
Пример #9
0
def del_union_assistant(bot, update):
    mes = update.message
    union = TradeUnion.get_union(creator_id=update.message.from_user.id)
    if union is None:
        bot.send_message(
            chat_id=update.message.chat_id,
            text="Только создатель и замы профсоюза могут удалять замов.")
        return
    new_id = re.search(" (\\d+)", mes.text)
    if new_id is None:
        bot.send_message(chat_id=update.message.chat_id,
                         text="Неверный синтаксис.")
        return
    new_id = int(new_id.group(1))
    if new_id not in union.assistants:
        bot.send_message(chat_id=update.message.chat_id,
                         text="Этот игрок не является заместителем.")
        return
    union.assistants.remove(new_id)
    union.update_to_database()
    bot.send_message(chat_id=mes.chat_id, text="Заместитель успешно удалён!")
Пример #10
0
def union_list(bot, update):
    mes = update.message
    union = TradeUnion.get_union(creator_id=update.message.from_user.id)
    if union is None:
        bot.send_message(
            chat_id=update.message.chat_id,
            text="Только создатель и замы профсоюза могут вносить его состав.")
        return
    for string in update.message.text.splitlines():
        if string[0] in castles:
            request = "select id from players where nickname = %s"
            cursor.execute(request, (string[1:].partition(" /")[0], ))
            row = cursor.fetchone()
            if row is None:
                continue
            if row[0] not in union.players:
                union.players.append(row[0])
    union.update_to_database()
    bot.send_message(chat_id=mes.chat_id,
                     text="Список <b>{}</b> успешно обновлён!".format(
                         union.name),
                     parse_mode='HTML')
Пример #11
0
def print_union_players(bot, update):
    mes = update.message
    union = TradeUnion.get_union(creator_id=update.message.from_user.id)
    if union is None:
        bot.send_message(
            chat_id=update.message.chat_id,
            text="Только создатель и замы профсоюза могут просматривать состав."
        )
        return
    response = "Участники <b>{}</b>:\n".format(union.name)
    for player_id in union.players:
        player = Player.get_player(player_id, notify_on_error=False)
        if player is None:
            continue
        response_new = "{}<b>{}</b> — @{} <code>{}</code>\n".format(
            player.castle, player.nickname, player.username, player.id)
        if len(response + response_new) > MAX_MESSAGE_LENGTH:
            bot.send_message(chat_id=mes.chat_id,
                             text=response,
                             parse_mode='HTML')
            response = ""
        response += response_new
    bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')
Пример #12
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')
Пример #13
0
def split_union(bot, update):
    mes = update.message
    args = mes.text.split()[1:]
    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 = []
    total_stats = 0
    attr = "attack" if "attack" in mes.text else "defense"
    alt = "alt" in mes.text
    for player_id in union.players:
        player = Player.get_player(player_id, notify_on_error=False)
        if player is None:
            continue
        players.append(player)
        total_stats += player.__getattribute__(attr)
    try:
        ratios = args[0].split(":")
        need_stats = [
        ]  # Сколько статов в каждую часть ( уже в готовых числах )
        sum_parts = 0
        player_groups = []
        for part in ratios:
            sum_parts += int(part)
            player_groups.append([])
        for part in ratios:
            need_stats.append(int(part) * total_stats / sum_parts)
    except (ValueError, IndexError):
        bot.send_message(chat_id=mes.chat_id, text="Неверный синтаксис.")
        return
    players.sort(key=lambda pl: pl.__getattribute__(attr), reverse=True)
    for player in players:
        # Поиск минимального остатка необходимых статов в данной группе, > 0 после добавления этого игрока туда
        min_stats_remain = 10000000000 if not alt else -1
        min_stats_remain_num = -1
        max_under_zero_stats_remain = -10000000000
        max_under_zero_stats_remain_num = -1
        for i, stats in enumerate(need_stats):
            current_remain = stats - player.__getattribute__(attr)
            if (not alt and 0 < current_remain < min_stats_remain) or (
                    alt and 0 < current_remain > min_stats_remain):
                min_stats_remain_num = i
                min_stats_remain = current_remain
            elif max_under_zero_stats_remain < current_remain < 0:
                max_under_zero_stats_remain_num = i
                max_under_zero_stats_remain = current_remain
        if min_stats_remain_num >= 0:  # Нашлось свободное место под этого игрока
            player_groups[min_stats_remain_num].append(player)
            need_stats[min_stats_remain_num] -= player.__getattribute__(attr)
        else:
            # Закидываем в группу, добавление в которую вызовет минимальное отклонение от цели
            player_groups[max_under_zero_stats_remain_num].append(player)
            need_stats[
                max_under_zero_stats_remain_num] -= player.__getattribute__(
                    attr)
    response = "Рассчёт распределения статов подготовлен:\n"
    full = "full" in mes.text
    for i, group in enumerate(player_groups):
        response += "Группа {}:\n".format(i)
        sum_stats = 0
        for player in group:
            if full:
                response_new = "<b>{}</b> — @{} {}<code>{}</code>" \
                               "\n".format(player.nickname, player.username, "⚔️" if attr == "attack" else "🛡",
                                           player.__getattribute__(attr))
            else:
                response_new = "@{}\n".format(player.username)
            if len(response + response_new) > MAX_MESSAGE_LENGTH - 100:
                bot.send_message(chat_id=mes.chat_id,
                                 text=response,
                                 parse_mode='HTML')
                response = ""
            response += response_new
            sum_stats += player.__getattribute__(attr)
        if full:
            response += "Всего в группе {}: <code>{}</code>\n\n".format(
                "⚔️" if attr == "attack" else "🛡", sum_stats)
    bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')