示例#1
0
async def handler_call(message: types.Message):
    await check_access(message, grant=Grant.READ_ACCESS)
    match = constraints.REGEX_CMD_GROUP_MESSAGE.search(message.text)
    if not match:
        return await message.reply(md.text(md_style.bold("Пример вызова:"),
                                           md_style.code("/call group"),
                                           " ",
                                           md_style.bold("Ограничения:"),
                                           md.text(
                                               "group:",
                                               constraints.MESSAGE_FOR_GROUP),
                                           sep='\n'),
                                   parse_mode=ParseMode.MARKDOWN)
    group_name = match.group("group")

    with db.get_connection() as conn:
        group = db.select_group_by_alias_name(conn,
                                              chat_id=message.chat.id,
                                              alias_name=group_name)
        if not group:
            return await message.reply(md.text('Группа',
                                               md_style.code(group_name),
                                               'не найдена!'),
                                       parse_mode=ParseMode.MARKDOWN)
        logging.info(f"group: {group}")
        members = db.select_members(conn, group_id=group.group_id)

    if len(members) == 0:
        return await message.reply('Группа пользователей пуста!')

    mentions = convert_members_to_mentions(members)

    await message.reply(" ".join(mentions), parse_mode=ParseMode.MARKDOWN)
示例#2
0
async def handler_remove_members(message: types.Message):
    await check_access(message, Grant.WRITE_ACCESS)
    match = constraints.REGEX_CMD_GROUP_MEMBERS.search(message.text)
    if not match:
        return await message.reply(md.text(
            md_style.bold("Пример вызова:"),
            md_style.code("/remove_members group username1 username2"),
            " ",
            md_style.bold("Ограничения:"),
            md.text("group:", constraints.MESSAGE_FOR_GROUP),
            md.text("username:"******"group: {group}")

        mentions = [
            x.get_text(message.text) for x in message.entities
            if x.type == MessageEntityType.MENTION
        ]
        text_mentions = [
            f"[{x.user.full_name}]({x.user.url})" for x in message.entities
            if x.type == MessageEntityType.TEXT_MENTION
        ]
        all_members = mentions + text_mentions
        logging.info(f"members: {all_members}")

        if len(all_members) < 1:
            return await message.reply(
                'Нужно указать хотя бы одного пользователя!')

        for member in all_members:
            db.delete_member(conn, group_id=group.group_id, member_name=member)

    await message.reply(md.text(md.text("Пользователи удалённые из группы",
                                        md_style.code(group_name)),
                                md_style.code("\n".join(
                                    [f"- {x}" for x in all_members])),
                                sep='\n'),
                        parse_mode=ParseMode.MARKDOWN)
示例#3
0
async def handler_remove_group_alias(message: types.Message):
    await check_access(message, Grant.WRITE_ACCESS)
    match = constraints.REGEX_CMD_GROUP_ALIAS.search(message.text)
    if not match:
        return await message.reply(md.text(
            md_style.bold("Пример вызова:"),
            md_style.code("/remove_alias group alias"),
            " ",
            md_style.bold("Ограничения:"),
            md.text("group:", constraints.MESSAGE_FOR_GROUP),
            md.text("alias:", constraints.MESSAGE_FOR_GROUP),
            sep='\n'),
                                   parse_mode=ParseMode.MARKDOWN)
    group_name = match.group('group')
    alias_name = match.group('alias')

    with db.get_connection() as conn:
        db.select_chat_for_update(conn, chat_id=message.chat.id)
        group = db.select_group_by_alias_name(conn,
                                              chat_id=message.chat.id,
                                              alias_name=group_name)
        if not group:
            return await message.reply(md.text('Группа',
                                               md_style.code(group_name),
                                               'не найдена!'),
                                       parse_mode=ParseMode.MARKDOWN)
        logging.info(f"group: {group}")

        group_aliases: Dict[str, GroupAlias] = {
            x.alias_name: x
            for x in db.select_group_aliases_by_group_id(
                conn, group_id=group.group_id)
        }

        if alias_name not in group_aliases:
            return await message.reply(md.text('Алиас',
                                               md_style.code(alias_name),
                                               'не найден для группы',
                                               md_style.code(group_name)),
                                       parse_mode=ParseMode.MARKDOWN)
        group_alias = group_aliases[alias_name]

        if len(group_aliases) == 1:
            return await message.reply(
                md.text("Нельзя удалить единственное название группы!"),
                parse_mode=ParseMode.MARKDOWN)

        db.delete_group_alias(conn, alias_id=group_alias.alias_id)

    await message.reply(md.text("Алиас", md_style.code(alias_name),
                                "удалён из группы", md_style.code(group_name)),
                        parse_mode=ParseMode.MARKDOWN)
示例#4
0
async def handler_add_group_alias(message: types.Message):
    await check_access(message, Grant.WRITE_ACCESS)
    match = constraints.REGEX_CMD_GROUP_ALIAS.search(message.text)
    if not match:
        return await message.reply(md.text(
            md_style.bold("Пример вызова:"),
            md_style.code("/add_alias group alias"),
            " ",
            md_style.bold("Ограничения:"),
            md.text("group:", constraints.MESSAGE_FOR_GROUP),
            md.text("alias:", constraints.MESSAGE_FOR_GROUP),
            sep='\n'),
                                   parse_mode=ParseMode.MARKDOWN)
    group_name = match.group('group')
    group_alias = match.group('alias')

    if len(group_alias) > constraints.MAX_GROUP_NAME_LENGTH:
        return await message.reply('Слишком длинное название группы!')

    with db.get_connection() as conn:
        db.select_chat_for_update(conn, chat_id=message.chat.id)
        group = db.select_group_by_alias_name(conn,
                                              chat_id=message.chat.id,
                                              alias_name=group_name)
        if not group:
            return await message.reply(md.text('Группа',
                                               md_style.code(group_name),
                                               'не найдена!'),
                                       parse_mode=ParseMode.MARKDOWN)
        logging.info(f"group: {group}")

        aliases: List[GroupAlias] = db.select_group_aliases_by_chat_id(
            conn, chat_id=message.chat.id)

        if group_alias in set(x.alias_name for x in aliases):
            return await message.reply("Такой алиас уже используется!")

        if len([x for x in aliases if x.group_id == group.group_id
                ]) >= constraints.MAX_ALIASES_PER_GROUP:
            return await message.reply(
                f"Нельзя добавить так много алиасов!"
                f" Текущее ограничение для одной группы: {constraints.MAX_ALIASES_PER_GROUP}"
            )

        db.insert_group_alias(conn,
                              chat_id=message.chat.id,
                              group_id=group.group_id,
                              alias_name=group_alias)

    await message.reply(md.text("Для группы", md_style.code(group_name),
                                "добавлен алиас", md_style.code(group_alias)),
                        parse_mode=ParseMode.MARKDOWN)
示例#5
0
async def handler_list_members(message: types.Message):
    await check_access(message, grant=Grant.READ_ACCESS)
    match = constraints.REGEX_CMD_GROUP.search(message.text)
    if not match:
        return await message.reply(md.text(md_style.bold("Пример вызова:"),
                                           md_style.code("/members group"),
                                           " ",
                                           md_style.bold("Ограничения:"),
                                           md.text(
                                               "group:",
                                               constraints.MESSAGE_FOR_GROUP),
                                           sep='\n'),
                                   parse_mode=ParseMode.MARKDOWN)
    group_name = match.group("group")

    with db.get_connection() as conn:
        group = db.select_group_by_alias_name(conn,
                                              chat_id=message.chat.id,
                                              alias_name=group_name)
        if not group:
            return await message.reply(md.text('Группа',
                                               md_style.code(group_name),
                                               'не найдена!'),
                                       parse_mode=ParseMode.MARKDOWN)
        members = db.select_members(conn, group_id=group.group_id)

    members = sorted(convert_members_to_names(members))
    logging.info(f"members: {members}")

    if len(members) == 0:
        text = md.text(
            "В группе",
            md_style.code(group_name),
            "нет ни одного пользователя!",
        )
    else:
        text = md.text(md.text(md_style.bold("Участники группы"),
                               md_style.code(group_name)),
                       md_style.code("\n".join([f"- {x}" for x in members])),
                       sep='\n')

    await message.reply(text, parse_mode=ParseMode.MARKDOWN)
示例#6
0
async def handler_remove_group(message: types.Message):
    await check_access(message, Grant.WRITE_ACCESS)
    match = constraints.REGEX_CMD_GROUP.search(message.text)
    if not match:
        return await message.reply(md.text(
            md_style.bold("Пример вызова:"),
            md_style.code("/remove_group group"),
            " ",
            md_style.bold("Ограничения:"),
            md.text("group:", constraints.MESSAGE_FOR_GROUP),
            sep='\n'),
                                   parse_mode=ParseMode.MARKDOWN)
    group_name = match.group("group")

    with db.get_connection() as conn:
        db.select_chat_for_update(conn, chat_id=message.chat.id)
        group = db.select_group_by_alias_name(conn,
                                              chat_id=message.chat.id,
                                              alias_name=group_name)
        if not group:
            return await message.reply(md.text('Группа',
                                               md_style.code(group_name),
                                               'не найдена!'),
                                       parse_mode=ParseMode.MARKDOWN)
        logging.info(f"group: {group}")
        members = db.select_members(conn, group.group_id)
        if len(members) != 0:
            logging.info(f"members: {members}")
            return await message.reply(
                'Группу нельзя удалить, в ней есть пользователи!')

        group_aliases = db.select_group_aliases_by_group_id(
            conn, group_id=group.group_id)

        for a in group_aliases:
            db.delete_group_alias(conn, alias_id=a.alias_id)

        db.delete_group(conn, group_id=group.group_id)

    await message.reply(md.text("Группа", md_style.bold(group_name),
                                "удалена!"),
                        parse_mode=ParseMode.MARKDOWN)
示例#7
0
async def handler_add_members(message: types.Message):
    await check_access(message, Grant.WRITE_ACCESS)
    match = constraints.REGEX_CMD_GROUP_MEMBERS.search(message.text)
    if not match:
        return await message.reply(md.text(
            md_style.bold("Пример вызова:"),
            md_style.code("/add_members group username1 username2"),
            " ",
            md_style.bold("Ограничения:"),
            md.text("group:", constraints.MESSAGE_FOR_GROUP),
            md.text("username:"******"members: {all_members}")

    if len(all_members) < 1:
        return await message.reply('Нужно указать хотя бы одного пользователя!'
                                   )

    with db.get_connection() as conn:
        db.select_chat_for_update(conn, chat_id=message.chat.id)

        group = db.select_group_by_alias_name(conn,
                                              chat_id=message.chat.id,
                                              alias_name=group_name)
        if not group:
            return await message.reply(md.text('Группа',
                                               md_style.code(group_name),
                                               'не найдена!'),
                                       parse_mode=ParseMode.MARKDOWN)
        logging.info(f"group: {group}")

        existing_members: List[Member] = db.select_members(
            conn, group_id=group.group_id)

        if len(existing_members) + len(
                all_members) > constraints.MAX_MEMBERS_PER_GROUP:
            return await message.reply(
                f'Слишком много пользователей уже добавлено в группу!'
                f' Текущее ограничение для одной группы: {constraints.MAX_MEMBERS_PER_GROUP}'
            )

        for member in all_members:
            db.insert_member(conn, group_id=group.group_id, member=member)

    await message.reply(md.text(
        md.text(
            "Пользователи добавленные в группу",
            md_style.code(group_name),
        ),
        md_style.code("\n".join(
            [f"- {x}" for x in convert_members_to_names(all_members)])),
        sep='\n'),
                        parse_mode=ParseMode.MARKDOWN)