Задать вопрос
@Alexey004

Как сделать, чтобы бот ВК не мог кикать вышестоящую роль в беседах?

Бот выполняет роль чат-менеджера в беседах ВК. В боте есть роли "Модератор", "Главный модератор" и "Администратор", пользователь с ролью "Модератор" может исключить с беседы пользователей выше его роли (Главный модератор, администратор), также и пользователь с ролью "Главный модератор" может исключить другого пользователя выше его роли (Администратор). Нужно, чтобы пользователи с ролями не могли данной командой кикнуть с беседы другого пользователя с вышестоящей ролью.

spoiler

@bot.on.chat_message(text = ["/kick <args>",  "/kick"])
async def kick(message: Message, args: Optional[str] = None):
    cursor.execute(f"SELECT * FROM user WHERE vk_id = {message.from_id} AND chat_id = {message.peer_id}")
    info_user = cursor.fetchone()

    access_roles = ["Модератор",  "Главный Модератор",  "Администратор"]
    

    if info_user[4] not in access_roles:
        return


    if message.reply_message == None:
        user = args.split(' ')[0]
        args = args.replace(user, "")

        reason = args[1:]

        if reason == "":
            reason = "Не указана."

        if "[id" in user:
            user = int(user.split("|")[0].replace("[id", ""))


    if message.reply_message != None:
        user = message.reply_message.from_id

        reason = args

        if reason == "":
            reason = "Не указана."


    await bot.api.messages.remove_chat_user(chat_id=message.peer_id - 2000000000, user_id=user)


    await message.answer(f"[id{user}|Пользователь] был исключён из конференции.\n \nИсключил: [id{message.from_id}|{info_user[4]}]\n Причина: {reason}")

    cursor.execute(f"DELETE FROM user WHERE vk_id = {user} AND chat_id = {message.peer_id}")
    connection.commit()

  • Вопрос задан
  • 267 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега ВКонтакте
♬♬
так же, как вы получаете роль юзера info_user, нужно получить роль того user, кого собираются кикнуть.

Найти индекс роли каждого в массиве access_roles
Сравнить индексы.
Кикнуть можно только если индекс роли info_user равен или больше
индекса роли выбрасываемого user
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы