Права доступа
Боты получают права в виде 53-битного целочисленного битового поля в формате Discord. Биты и их значения совпадают с Discord; значения берутся из собственных таблиц прав групп и каналов GameVox. Биты без аналога в GameVox возвращают 0.
Сопоставление: GameVox → Discord
| Бит Discord | Hex | Источник в GameVox |
|---|---|---|
| ADMINISTRATOR | 0x8 | groups.group_type IN ('owner', 'admin') |
| VIEW_CHANNEL | 0x400 | channel_permissions.view_channel / group_permissions.view_channels |
| READ_MESSAGE_HISTORY | 0x10000 | То же, что VIEW_CHANNEL (отдельного переключателя истории нет) |
| SEND_MESSAGES | 0x800 | send_messages |
| MANAGE_MESSAGES | 0x2000 | manage_messages |
| EMBED_LINKS | 0x4000 | can_post_links |
| ATTACH_FILES | 0x8000 | send_files |
| ADD_REACTIONS | 0x40 | add_reactions |
| MENTION_EVERYONE | 0x20000 | В v1 только для администраторов |
| CONNECT (voice) | 0x100000 | join_voice |
| SPEAK | 0x200000 | speak_in_voice |
| STREAM (screen share) | 0x200 | screen_share |
| USE_VAD | 0x2000000 | use_vad (по умолчанию true; false принудительно включает режим рации) |
| KICK_MEMBERS | 0x2 | kick_users != 'deny' |
| BAN_MEMBERS | 0x4 | ban_users != 'deny' |
| MUTE_MEMBERS | 0x400000 | mute_users != 'deny' |
| MOVE_MEMBERS | 0x1000000 | move_users != 'deny' |
| MANAGE_CHANNELS | 0x10 | create_channels / edit_channels / delete_channels, все не равны 'deny' |
| MANAGE_GUILD | 0x20 | edit_server != 'deny' |
| MANAGE_ROLES | 0x10000000 | manage_members |
| MANAGE_NICKNAMES | 0x8000000 | manage_members (в связке с MANAGE_ROLES) |
| CHANGE_NICKNAME | 0x4000000 | Всегда разрешено (как по умолчанию в Discord) |
| MANAGE_WEBHOOKS | 0x20000000 | В v1 владелец / администратор |
| VIEW_AUDIT_LOG | 0x80 | В v1 владелец / администратор |
| PRIORITY_SPEAKER | 0x100 | priority_speaker |
| MANAGE_EVENTS | 0x200000000 | manage_events != 'deny' |
| CREATE_EVENTS | 0x100000000000 | manage_events != 'deny' (в связке с MANAGE_EVENTS) |
| MANAGE_GUILD_EXPRESSIONS | 0x40000000 | manage_emojis != 'deny' |
| CREATE_GUILD_EXPRESSIONS | 0x80000000000 | manage_emojis != 'deny' (в связке) |
| DEAFEN_MEMBERS | 0x800000 | deafen_users != 'deny' |
| SEND_MESSAGES_IN_THREADS | 0x4000000000 | send_messages (в связке с SEND_MESSAGES) |
Биты, включённые по умолчанию
Они установлены у каждого участника без запрета, как у роли по умолчанию в Discord. Если логика вашего бота их проверяет, они всегда будут выданы (если только участник не забанен):
CREATE_INSTANT_INVITE(0x1)USE_APPLICATION_COMMANDS(0x80000000)USE_EXTERNAL_EMOJIS(0x40000)USE_EXTERNAL_STICKERS(0x2000000000)
Биты, которые всегда равны нулю
У них пока нет аналога в GameVox, и они возвращаются неустановленными. Ботам, которые от них зависят, стоит корректно обходиться без них (большинство библиотек и так считают запрещённый бит признаком «функция здесь не поддерживается»).
MANAGE_THREADS,USE_PUBLIC_THREADS,USE_PRIVATE_THREADS: в v1 темы (threads) это заглушка.MODERATE_MEMBERS(тайм-аут): собственного аналога нет.USE_EMBEDDED_ACTIVITIES: функции активностей нет.USE_SOUNDBOARD,SEND_VOICE_MESSAGES: не реализованы.- Биты монетизации: Premium Apps нет.
Вычисление прав
Такой же алгоритм из 7 шагов, как в Discord:
- Начните с прав
@everyoneдля сервера. - Объедините по OR все роли участника.
- Если результат содержит ADMINISTRATOR, остановитесь: у участника есть всё.
- Примените перезаписи канала для
@everyone(сначала allow, затем deny). - Примените перезаписи канала для каждой роли (сначала allow, затем deny).
- Примените перезаписи канала для пользователя (сначала allow, затем deny).
- Если канал находится в категории, её перезаписи тоже применяются на шаге ролей / пользователя.
Именно на шаге 2 проявляется отличие, описанное ниже: участник GameVox состоит в одной группе, поэтому объединять по OR нужно одну роль. См. Одна группа на участника.
Одна группа на участника
Самое большое поведенческое отличие от Discord. Участник GameVox состоит ровно в одной группе на сервере, тогда как участник Discord может иметь сразу много ролей. Назначение группы заменяет ту группу, в которой участник был раньше.
Эндпоинты ролей по-прежнему работают, и привычные вам библиотеки по-прежнему их вызывают, просто всё сводится к этой одной группе:
| Вызов | Что происходит |
|---|---|
PUT .../members/{id}/roles/{rid} | Участник оказывается в этой группе. Предыдущая группа заменяется, а не сохраняется рядом. |
DELETE .../members/{id}/roles/{rid} | Убирает группу. Если это была его единственная группа, участник возвращается в группу сервера по умолчанию, а не остаётся без группы. |
PATCH .../members/{id} с roles: [...] | Принимается, после чего сводится к группе с наивысшим рангом из списка. Пустой список означает группу по умолчанию. |
Список сводится, а не отклоняется, чтобы обычный member.roles.set([...]) продолжал работать. Побеждает наивысший ранг, потому что именно ранг определяет положение: если даны группа модераторов и группа цвета, участник будет модератором.
У групп есть лимиты на загрузку, голос, камеру и демонстрацию экрана, и участник получает самый щедрый лимит среди своих групп. С одной группой это просто лимит его группы. Это вторая причина, по которой приложение не может держать кого-то в двух группах: так можно было бы обойти ограничение, установленное оператором.
Собственная группа приложения, созданная при его установке, всё это не затрагивает. Членство в ней принадлежит установке, и никакое приложение не может добавить себя в неё или убрать из неё другое приложение.
Иерархия ролей
Собственный groups.rank соответствует role.position в Discord. Бот может управлять только ролями строго ниже позиции своей высшей роли, как по правилам Discord. Вызовы PATCH .../members/{id}/roles/{rid} с ролью на уровне высшей роли бота или выше возвращают 403.
Тайм-ауты
У поля Discord communication_disabled_until в v1 нет аналога в GameVox. PATCH участника с этим полем возвращает 400 с понятной ошибкой. Вместо этого используйте кик, отключение микрофона или бан.