Berechtigungen
Bots erhalten Berechtigungen als 53-Bit-Integer-Bitfeld in Discord-Form. Bits und Bedeutungen entsprechen Discord; die Werte stammen aus den nativen Gruppen- und Kanal-Berechtigungstabellen von GameVox. Bits ohne GameVox-Entsprechung liefern 0.
Zuordnung nativ → Discord
| Discord-Bit | Hex | GameVox-Quelle |
|---|---|---|
| ADMINISTRATOR | 0x8 | groups.group_type IN ('owner', 'admin') |
| VIEW_CHANNEL | 0x400 | channel_permissions.view_channel / group_permissions.view_channels |
| READ_MESSAGE_HISTORY | 0x10000 | Wie VIEW_CHANNEL (kein separater Verlaufsschalter) |
| 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 | In v1 nur für Admins |
| CONNECT (voice) | 0x100000 | join_voice |
| SPEAK | 0x200000 | speak_in_voice |
| STREAM (screen share) | 0x200 | screen_share |
| USE_VAD | 0x2000000 | use_vad (Standard: true; auf false erzwingt Push-to-Talk) |
| 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 alle ungleich 'deny' |
| MANAGE_GUILD | 0x20 | edit_server != 'deny' |
| MANAGE_ROLES | 0x10000000 | manage_members |
| MANAGE_NICKNAMES | 0x8000000 | manage_members (mit MANAGE_ROLES gebündelt) |
| CHANGE_NICKNAME | 0x4000000 | Immer gewährt (entspricht Discords Standard) |
| MANAGE_WEBHOOKS | 0x20000000 | In v1 Eigentümer / Admin |
| VIEW_AUDIT_LOG | 0x80 | In v1 Eigentümer / Admin |
| PRIORITY_SPEAKER | 0x100 | priority_speaker |
| MANAGE_EVENTS | 0x200000000 | manage_events != 'deny' |
| CREATE_EVENTS | 0x100000000000 | manage_events != 'deny' (mit MANAGE_EVENTS gebündelt) |
| MANAGE_GUILD_EXPRESSIONS | 0x40000000 | manage_emojis != 'deny' |
| CREATE_GUILD_EXPRESSIONS | 0x80000000000 | manage_emojis != 'deny' (gebündelt) |
| DEAFEN_MEMBERS | 0x800000 | deafen_users != 'deny' |
| SEND_MESSAGES_IN_THREADS | 0x4000000000 | send_messages (mit SEND_MESSAGES gebündelt) |
Standardmäßig aktive Bits
Diese sind für jedes nicht gesperrte Mitglied gesetzt und entsprechen Discords Standardrollenverhalten. Wenn die Logik deines Bots darauf prüft, erscheinen sie immer als gewährt (sofern das Mitglied nicht gebannt ist):
CREATE_INSTANT_INVITE(0x1)USE_APPLICATION_COMMANDS(0x80000000)USE_EXTERNAL_EMOJIS(0x40000)USE_EXTERNAL_STICKERS(0x2000000000)
Bits, die immer null liefern
Diese haben in GameVox noch keine Entsprechung und werden als nicht gesetzt gemeldet. Bots, die davon abhängen, sollten damit umgehen können (die meisten Bibliotheken behandeln ein verweigertes Bit ohnehin als „Funktion hier nicht unterstützt“).
MANAGE_THREADS,USE_PUBLIC_THREADS,USE_PRIVATE_THREADS: Threads sind in v1 nur Platzhalter.MODERATE_MEMBERS(Timeout): keine native Entsprechung.USE_EMBEDDED_ACTIVITIES: keine Aktivitäten-Funktion.USE_SOUNDBOARD,SEND_VOICE_MESSAGES: nicht implementiert.- Monetarisierungs-Bits: keine Premium-Apps.
Berechnung der Berechtigungen
Identisch zu Discords 7-Schritte-Algorithmus:
- Beginne mit den
@everyone-Berechtigungen der Guild. - Verodere jede Rolle, die das Mitglied hat.
- Enthält das Ergebnis ADMINISTRATOR, wird abgekürzt: Das Mitglied hat alles.
- Wende die
@everyone-Kanal-Overwrites an (erst allow, dann deny). - Wende die Kanal-Overwrites jeder Rolle an (erst allow, dann deny).
- Wende die Kanal-Overwrites der Person an (erst allow, dann deny).
- Liegt der Kanal in einer Kategorie, gelten deren Overwrites ebenfalls auf Rollen- und Personenebene.
In Schritt 2 zeigt sich der unten beschriebene Unterschied: Ein GameVox-Mitglied ist in einer Gruppe, es gibt also genau eine Rolle zu verodern. Siehe Eine Gruppe pro Mitglied.
Eine Gruppe pro Mitglied
Der größte Verhaltensunterschied zu Discord. Ein GameVox-Mitglied gehört genau einer Gruppe pro Server an, während ein Discord-Mitglied viele Rollen gleichzeitig haben kann. Das Zuweisen einer Gruppe ersetzt die bisherige Gruppe des Mitglieds.
Die Rollen-Endpunkte funktionieren weiterhin, und die Bibliotheken, die du ohnehin nutzt, rufen sie weiterhin auf — sie lösen sich lediglich auf diese eine Gruppe auf:
| Aufruf | Was passiert |
|---|---|
PUT .../members/{id}/roles/{rid} | Das Mitglied landet in dieser Gruppe. Die vorherige Gruppe wird ersetzt, nicht daneben behalten. |
DELETE .../members/{id}/roles/{rid} | Entfernt sie. War es die einzige Gruppe, fällt das Mitglied auf die Standardgruppe des Servers zurück, statt gruppenlos zu sein. |
PATCH .../members/{id} mit roles: [...] | Wird akzeptiert und dann auf die ranghöchste Gruppe der Liste reduziert. Eine leere Liste bedeutet die Standardgruppe. |
Eine Liste wird reduziert statt abgelehnt, damit ein gewöhnliches member.roles.set([...]) weiter funktioniert. Der höchste Rang gewinnt, weil der Rang die Stellung bestimmt: Bei einer Moderationsgruppe und einer Farbgruppe ist das Mitglied Moderatorin oder Moderator.
Gruppen tragen Obergrenzen für Uploads, Sprache, Kamera und Bildschirmfreigabe, und ein Mitglied erhält die großzügigste Obergrenze aller Gruppen, in denen es ist. Bei einer Gruppe ist das schlicht deren Obergrenze — was der zweite Grund dafür ist, dass eine App niemanden in zwei Gruppen halten kann, denn das wäre ein Weg, eine von der betreibenden Person gesetzte Grenze auszuhebeln.
Die eigene Gruppe einer Anwendung — die, die ihre Installation angelegt hat — ist davon nicht betroffen. Ihre Mitgliedschaft gehört zur Installation, und keine App kann sich selbst hinzufügen oder eine andere App daraus entfernen.
Rollenhierarchie
Das native groups.rank bildet auf Discords role.position ab. Ein Bot kann ausschließlich Rollen unterhalb der Position seiner eigenen höchsten Rolle verwalten, genau wie bei Discord. Aufrufe von PATCH .../members/{id}/roles/{rid} mit einer Rolle auf oder über der obersten Rolle des Bots geben 403 zurück.
Timeouts
Discords Feld communication_disabled_until hat in v1 keine GameVox-Entsprechung. Ein PATCH auf ein Mitglied mit gesetztem Feld gibt 400 mit einer klaren Fehlermeldung zurück. Nutze stattdessen Kick / Stummschalten / Bann.