İzinler
Botlar izinleri Discord biçiminde 53 bitlik bir tam sayı bit alanı olarak alır. Bitler ve anlamları Discord ile eşleşir; değerler GameVox'un yerel grup ve kanal izin tablolarından gelir. GameVox'ta karşılığı olmayan bitler 0 döndürür.
Yerel → Discord eşlemesi
| Discord biti | Hex | GameVox kaynağı |
|---|---|---|
| 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 ile aynı (ayrı bir geçmiş anahtarı yok) |
| 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'de yalnızca yöneticiler |
| CONNECT (voice) | 0x100000 | join_voice |
| SPEAK | 0x200000 | speak_in_voice |
| STREAM (screen share) | 0x200 | screen_share |
| USE_VAD | 0x2000000 | use_vad (varsayılan true; false yapmak PTT'yi zorunlu kılar) |
| 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 değerlerinin hiçbiri 'deny' değil |
| MANAGE_GUILD | 0x20 | edit_server != 'deny' |
| MANAGE_ROLES | 0x10000000 | manage_members |
| MANAGE_NICKNAMES | 0x8000000 | manage_members (MANAGE_ROLES ile birlikte) |
| CHANGE_NICKNAME | 0x4000000 | Her zaman verilir (Discord varsayılanıyla eşleşir) |
| MANAGE_WEBHOOKS | 0x20000000 | v1'de sahip / yönetici |
| VIEW_AUDIT_LOG | 0x80 | v1'de sahip / yönetici |
| PRIORITY_SPEAKER | 0x100 | priority_speaker |
| MANAGE_EVENTS | 0x200000000 | manage_events != 'deny' |
| CREATE_EVENTS | 0x100000000000 | manage_events != 'deny' (MANAGE_EVENTS ile birlikte) |
| MANAGE_GUILD_EXPRESSIONS | 0x40000000 | manage_emojis != 'deny' |
| CREATE_GUILD_EXPRESSIONS | 0x80000000000 | manage_emojis != 'deny' (birlikte) |
| DEAFEN_MEMBERS | 0x800000 | deafen_users != 'deny' |
| SEND_MESSAGES_IN_THREADS | 0x4000000000 | send_messages (SEND_MESSAGES ile birlikte) |
Varsayılan olarak açık bitler
Bunlar, Discord'un varsayılan rol davranışıyla eşleşecek şekilde reddedilmemiş her üye için ayarlanır. Bot mantığın bunları kontrol ediyorsa her zaman verilmiş görünürler (üye yasaklı değilse):
CREATE_INSTANT_INVITE(0x1)USE_APPLICATION_COMMANDS(0x80000000)USE_EXTERNAL_EMOJIS(0x40000)USE_EXTERNAL_STICKERS(0x2000000000)
Her zaman sıfır dönen bitler
Bunların GameVox'ta henüz karşılığı yok ve ayarlanmamış olarak raporlanır. Bunlara bağlı botlar sorunsuz şekilde geri çekilmeli (çoğu kütüphane reddedilen bir biti zaten “bu özellik burada desteklenmiyor” olarak ele alır).
MANAGE_THREADS,USE_PUBLIC_THREADS,USE_PRIVATE_THREADS: konular (thread) v1'de yer tutucu olarak var.MODERATE_MEMBERS(zaman aşımı): yerel karşılığı yok.USE_EMBEDDED_ACTIVITIES: Aktiviteler özelliği yok.USE_SOUNDBOARD,SEND_VOICE_MESSAGES: uygulanmadı.- Para kazanma bitleri: Premium Apps yok.
İzin hesaplama
Discord'un 7 adımlı algoritmasıyla aynı:
- Guild için
@everyoneizinleriyle başla. - Üyenin sahip olduğu her rolü OR ile ekle.
- Sonuç ADMINISTRATOR içeriyorsa kısa devre yap: her şeye sahiptir.
@everyonekanal üzerine yazmalarını uygula (önce allow, sonra deny).- Her rolün kanal üzerine yazmalarını uygula (önce allow, sonra deny).
- Kullanıcının kanal üzerine yazmalarını uygula (önce allow, sonra deny).
- Kanal bir kategorideyse kategorinin üzerine yazmaları da rol / kullanıcı adımında uygulanır.
Aşağıdaki fark 2. adımda ortaya çıkar: bir GameVox üyesi tek bir gruptadır, yani OR ile eklenecek tek bir rol vardır. Bkz. Üye başına tek grup.
Üye başına tek grup
Discord'dan en büyük davranış farkı. Bir Discord üyesi aynı anda birçok role sahip olabilirken bir GameVox üyesi sunucu başına tam olarak bir gruba aittir. Bir grup atamak, üyenin önceki grubunun yerini alır.
Rol endpoint'leri yine çalışır ve zaten kullandığın kütüphaneler onları çağırmaya devam eder; yalnızca hepsi o tek gruba çözümlenir:
| Çağrı | Ne olur |
|---|---|
PUT .../members/{id}/roles/{rid} | Üye o gruba geçer. Önceki grubu yanında tutulmaz, onun yerini alır. |
DELETE .../members/{id}/roles/{rid} | Grubu kaldırır. Üyenin tek grubu buysa hiçbir grupta kalmak yerine sunucunun varsayılan grubuna düşer. |
roles: [...] ile PATCH .../members/{id} | Kabul edilir, sonra listedeki en yüksek rütbeli gruba indirgenir. Boş liste varsayılan grup demektir. |
Sıradan bir member.roles.set([...]) çağrısı çalışmaya devam etsin diye liste reddedilmek yerine indirgenir. En yüksek rütbe kazanır, çünkü konumu belirleyen şey rütbedir: bir moderatör grubu ve bir renk grubu verildiğinde üye bir moderatördür.
Gruplar yükleme, ses, kamera ve ekran paylaşımı tavanları taşır ve bir üye bulunduğu gruplar arasındaki en cömert tavanı alır. Tek grupla bu, doğrudan kendi grubunun tavanıdır. Bir uygulamanın birini iki grupta tutamamasının diğer nedeni de budur: bu, yöneticinin koyduğu bir sınırı kaldırmanın bir yolu olurdu.
Bir uygulamanın kendi grubu (kurulumunun oluşturduğu grup) bunların hiçbirinden etkilenmez. Üyeliği kuruluma aittir ve hiçbir uygulama kendini ona ekleyemez ya da başka bir uygulamayı ondan çıkaramaz.
Rol hiyerarşisi
Yerel groups.rank, Discord'daki role.position değerine eşlenir. Bir bot, Discord kurallarıyla eşleşecek şekilde yalnızca kendi en yüksek rolünün konumunun kesinlikle altındaki rolleri yönetebilir. Botun en üst rolünde veya üzerindeki bir rolle yapılan PATCH .../members/{id}/roles/{rid} çağrıları 403 döndürür.
Zaman aşımları
Discord'un communication_disabled_until alanının v1'de GameVox'ta karşılığı yok. Bu alan ayarlanmış bir üyeye yapılan PATCH, açık bir hata mesajıyla 400 döndürür. Bunun yerine atma / susturma / yasaklama kullan.