Mga Pahintulot
Tumatanggap ang bots ng permissions bilang Discord-shape na 53-bit integer bitfield. Tugma sa Discord ang bits at ang kahulugan nila; galing ang values sa native na group + channel permission tables ng GameVox. Nagbabalik ng 0 ang bits na walang katapat sa GameVox.
Native → Discord mapping
| Discord bit | Hex | Source sa GameVox |
|---|---|---|
| ADMINISTRATOR | 0x8 | groups.group_type IN ('owner', 'admin') |
| VIEW_CHANNEL | 0x400 | channel_permissions.view_channel / group_permissions.view_channels |
| READ_MESSAGE_HISTORY | 0x10000 | Pareho sa VIEW_CHANNEL (walang hiwalay na history toggle) |
| 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 | Admin lang sa v1 |
| CONNECT (voice) | 0x100000 | join_voice |
| SPEAK | 0x200000 | speak_in_voice |
| STREAM (screen share) | 0x200 | screen_share |
| USE_VAD | 0x2000000 | use_vad (default true; kapag false, PTT ang pinipilit) |
| 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 na lahat ay hindi 'deny' |
| MANAGE_GUILD | 0x20 | edit_server != 'deny' |
| MANAGE_ROLES | 0x10000000 | manage_members |
| MANAGE_NICKNAMES | 0x8000000 | manage_members (kasama sa MANAGE_ROLES) |
| CHANGE_NICKNAME | 0x4000000 | Laging granted (tugma sa default ng Discord) |
| MANAGE_WEBHOOKS | 0x20000000 | Owner / admin sa v1 |
| VIEW_AUDIT_LOG | 0x80 | Owner / admin sa v1 |
| PRIORITY_SPEAKER | 0x100 | priority_speaker |
| MANAGE_EVENTS | 0x200000000 | manage_events != 'deny' |
| CREATE_EVENTS | 0x100000000000 | manage_events != 'deny' (kasama sa MANAGE_EVENTS) |
| MANAGE_GUILD_EXPRESSIONS | 0x40000000 | manage_emojis != 'deny' |
| CREATE_GUILD_EXPRESSIONS | 0x80000000000 | manage_emojis != 'deny' (kasama) |
| DEAFEN_MEMBERS | 0x800000 | deafen_users != 'deny' |
| SEND_MESSAGES_IN_THREADS | 0x4000000000 | send_messages (kasama sa SEND_MESSAGES) |
Default-on na bits
Naka-set ang mga ito para sa bawat member na hindi deny, tugma sa default role behavior ng Discord. Kung chine-check ito ng logic ng bot mo, lagi itong lalabas na granted (maliban kung banned ang member):
CREATE_INSTANT_INVITE(0x1)USE_APPLICATION_COMMANDS(0x80000000)USE_EXTERNAL_EMOJIS(0x40000)USE_EXTERNAL_STICKERS(0x2000000000)
Bits na laging zero
Wala pang katapat ang mga ito sa GameVox at nire-report bilang unset. Ang bots na umaasa sa mga ito ay dapat mag-degrade nang maayos (karamihan ng libraries ay tinatrato na ang denied bit bilang “hindi supported ang feature dito”).
MANAGE_THREADS,USE_PUBLIC_THREADS,USE_PRIVATE_THREADS: stub pa lang ang threads sa v1.MODERATE_MEMBERS(timeout): walang native na katapat.USE_EMBEDDED_ACTIVITIES: walang Activities feature.USE_SOUNDBOARD,SEND_VOICE_MESSAGES: hindi pa implemented.- Monetization bits: walang Premium Apps.
Pag-compute ng permissions
Kapareho ng 7-step algorithm ng Discord:
- Magsimula sa
@everyonepermissions para sa guild. - I-OR ang bawat role na hawak ng member.
- Kung may ADMINISTRATOR ang resulta, short-circuit: nasa kanila na ang lahat.
- I-apply ang
@everyonechannel overwrites (allow, tapos deny). - I-apply ang channel overwrites ng bawat role (allow, tapos deny).
- I-apply ang channel overwrites ng user (allow, tapos deny).
- Kung nasa isang category ang channel, applicable din ang overwrites ng category sa role / user step.
Sa step 2 lumalabas ang pagkakaibang nasa ibaba: nasa iisang grupo lang ang GameVox member, kaya iisang role lang ang io-OR. Tingnan ang Iisang grupo kada member.
Iisang grupo kada member
Ito ang pinakamalaking pagkakaiba sa behavior kumpara sa Discord. Ang GameVox member ay kabilang sa eksaktong isang grupo kada server, samantalang puwedeng humawak ng maraming role nang sabay ang Discord member. Kapag nag-assign ng grupo, papalitan nito ang grupong kinabibilangan ng member dati.
Gumagana pa rin ang role endpoints, at tinatawag pa rin ang mga ito ng libraries na gamit mo na. Nagre-resolve lang sila sa iisang grupong iyon:
| Call | Ano ang nangyayari |
|---|---|
PUT .../members/{id}/roles/{rid} | Mapupunta ang member sa grupong iyon. Papalitan ang dati niyang grupo, hindi ito pananatilihin kasabay. |
DELETE .../members/{id}/roles/{rid} | Tinatanggal ito. Kung iyon lang ang grupo niya, babalik siya sa default group ng server sa halip na mawalan ng grupo. |
PATCH .../members/{id} na may roles: [...] | Tinatanggap, tapos pinaliliit sa grupong may pinakamataas na rank sa listahan. Kapag empty ang listahan, default group ang ibig sabihin. |
Pinaliliit ang listahan sa halip na tanggihan para patuloy na gumana ang ordinaryong member.roles.set([...]). Ang pinakamataas na rank ang nananalo dahil rank ang nagtatakda ng posisyon: kung may moderator group at colour group, moderator ang member.
May upload, voice, camera, at screen-share ceilings ang mga grupo, at ang pinaka-generous na ceiling sa mga grupong kinabibilangan ng member ang nakukuha niya. Sa iisang grupo, ceiling lang ng grupo niya iyon. Iyon din ang isa pang dahilan kung bakit hindi puwedeng ilagay ng app ang isang tao sa dalawang grupo: magiging paraan iyon para lampasan ang cap na sinet ng operator.
Hindi apektado ng alinman dito ang sariling grupo ng application, iyong ginawa ng install nito. Sa install nakasalalay ang membership nito, at walang app na puwedeng magdagdag ng sarili nito o mag-alis ng ibang app doon.
Hierarchy ng roles
Nagma-map ang native na groups.rank sa Discord role.position. Puwedeng mag-manage ang bot ng roles na mahigpit na mas mababa sa posisyon ng pinakamataas nitong role, tugma sa rules ng Discord. Nagbabalik ng 403 ang calls sa PATCH .../members/{id}/roles/{rid} na may role na kapantay o mas mataas sa top role ng bot.
Timeouts
Walang katapat sa GameVox v1 ang communication_disabled_until field ng Discord. Ang PATCH sa isang member na may naka-set na field na iyon ay nagbabalik ng 400 na may malinaw na error. Gumamit ng kick / mute / ban sa halip.