Permissões
Os bots recebem as permissões como um campo de bits inteiro de 53 bits no formato do Discord. Os bits e seus significados batem com o Discord; os valores vêm das tabelas nativas de permissões de grupo e de canal do GameVox. Bits sem equivalente no GameVox devolvem 0.
Mapeamento nativo → Discord
| Bit do Discord | Hex | Origem no GameVox |
|---|---|---|
| ADMINISTRATOR | 0x8 | groups.group_type IN ('owner', 'admin') |
| VIEW_CHANNEL | 0x400 | channel_permissions.view_channel / group_permissions.view_channels |
| READ_MESSAGE_HISTORY | 0x10000 | Igual ao VIEW_CHANNEL (não há chave de histórico separada) |
| 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 | Só para admins na v1 |
| CONNECT (voice) | 0x100000 | join_voice |
| SPEAK | 0x200000 | speak_in_voice |
| STREAM (screen share) | 0x200 | screen_share |
| USE_VAD | 0x2000000 | use_vad (true por padrão; em false, força apertar para falar) |
| 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 todos diferentes de 'deny' |
| MANAGE_GUILD | 0x20 | edit_server != 'deny' |
| MANAGE_ROLES | 0x10000000 | manage_members |
| MANAGE_NICKNAMES | 0x8000000 | manage_members (agrupado com MANAGE_ROLES) |
| CHANGE_NICKNAME | 0x4000000 | Sempre concedido (igual ao padrão do Discord) |
| MANAGE_WEBHOOKS | 0x20000000 | Dono / admin na v1 |
| VIEW_AUDIT_LOG | 0x80 | Dono / admin na v1 |
| PRIORITY_SPEAKER | 0x100 | priority_speaker |
| MANAGE_EVENTS | 0x200000000 | manage_events != 'deny' |
| CREATE_EVENTS | 0x100000000000 | manage_events != 'deny' (agrupado com MANAGE_EVENTS) |
| MANAGE_GUILD_EXPRESSIONS | 0x40000000 | manage_emojis != 'deny' |
| CREATE_GUILD_EXPRESSIONS | 0x80000000000 | manage_emojis != 'deny' (agrupado) |
| DEAFEN_MEMBERS | 0x800000 | deafen_users != 'deny' |
| SEND_MESSAGES_IN_THREADS | 0x4000000000 | send_messages (agrupado com SEND_MESSAGES) |
Bits ativos por padrão
Ficam definidos para qualquer pessoa não negada, igual ao comportamento do cargo padrão do Discord. Se a lógica do seu bot os checa, eles sempre aparecerão concedidos (a menos que a pessoa esteja banida):
CREATE_INSTANT_INVITE(0x1)USE_APPLICATION_COMMANDS(0x80000000)USE_EXTERNAL_EMOJIS(0x40000)USE_EXTERNAL_STICKERS(0x2000000000)
Bits que sempre devolvem zero
Ainda não têm equivalente no GameVox e são reportados como não definidos. Bots que dependem deles devem degradar com elegância (a maioria das bibliotecas já trata um bit negado como “recurso indisponível aqui”).
MANAGE_THREADS,USE_PUBLIC_THREADS,USE_PRIVATE_THREADS: os tópicos são um esboço na v1.MODERATE_MEMBERS(timeout): sem equivalente nativo.USE_EMBEDDED_ACTIVITIES: não há recurso de Atividades.USE_SOUNDBOARD,SEND_VOICE_MESSAGES: não implementados.- Bits de monetização: não há Premium Apps.
Cálculo das permissões
Idêntico ao algoritmo de 7 passos do Discord:
- Comece com as permissões de
@everyoneda guild. - Aplique OR com cada cargo que a pessoa tem.
- Se o resultado incluir ADMINISTRATOR, encerra: ela tem tudo.
- Aplique as exceções de canal de
@everyone(primeiro allow, depois deny). - Aplique as exceções de canal de cada cargo (primeiro allow, depois deny).
- Aplique as exceções de canal da pessoa (primeiro allow, depois deny).
- Se o canal está em uma categoria, as exceções dela também valem nas etapas de cargo e de pessoa.
É no passo 2 que aparece a diferença descrita abaixo: uma pessoa no GameVox está em um único grupo, então há só um cargo para combinar. Veja Um grupo por pessoa.
Um grupo por pessoa
A maior diferença de comportamento em relação ao Discord. Uma pessoa no GameVox pertence a exatamente um grupo por servidor, enquanto no Discord ela pode ter vários cargos ao mesmo tempo. Atribuir um grupo substitui o grupo anterior.
Os endpoints de cargo continuam funcionando, e as bibliotecas que você já usa continuam chamando-os — eles apenas resolvem para esse único grupo:
| Chamada | O que acontece |
|---|---|
PUT .../members/{id}/roles/{rid} | A pessoa acaba nesse grupo. O grupo anterior é substituído, não mantido ao lado. |
DELETE .../members/{id}/roles/{rid} | Remove. Se era o único grupo dela, ela volta para o grupo padrão do servidor em vez de ficar sem nenhum. |
PATCH .../members/{id} com roles: [...] | Aceito e depois reduzido ao grupo de maior rank da lista. Uma lista vazia significa o grupo padrão. |
A lista é reduzida em vez de recusada para que um member.roles.set([...]) comum continue funcionando. O maior rank vence porque é o rank que define a posição: entre um grupo de moderação e um grupo de cor, a pessoa é moderadora.
Os grupos carregam tetos de upload, voz, câmera e compartilhamento de tela, e cada pessoa recebe o teto mais generoso entre os grupos de que participa. Com um único grupo, é simplesmente o teto do grupo dela — o que é a outra razão pela qual um app não pode manter alguém em dois: seria um jeito de furar um limite definido pela administração.
O grupo próprio de uma aplicação — aquele criado pela instalação dela — não é afetado por nada disso. A participação nele pertence à instalação, e nenhum app pode se adicionar nem remover outro dali.
Hierarquia de cargos
O groups.rank nativo mapeia para o role.position do Discord. Um bot só pode gerenciar cargos estritamente abaixo da posição do próprio cargo mais alto, igual ao Discord. Chamadas a PATCH .../members/{id}/roles/{rid} com um cargo igual ou acima do cargo mais alto do bot devolvem 403.
Timeouts
O campo communication_disabled_until do Discord não tem equivalente no GameVox na v1. Um PATCH em alguém com esse campo devolve 400 com um erro claro. Use expulsar / silenciar / banir no lugar.