Intent'ler
Bot, sunucularında olan biten her şeyi duymak zorunda değil. Yalnızca !ping'e yanıt veren bir botun, kimin hangi ses kanalına girdiğini bilmesine gerek yok. Intent, botun hangi olay gruplarını almak istediğini söylediği seçimdir. İstemediğin olaylar sana hiç gönderilmez, programın da onlarla boşuna uğraşmaz.
Intent'leri identify çerçevesinde bir sayı olarak gönderirsin. Bu alan zorunludur.
Intent'ler ve değerleri
| Intent | Bit | Değer | Ne açar | Ayrıcalıklı |
|---|---|---|---|---|
GUILDS | 0 | 1 | Sunucular, roller, kanallar, sabitlemeler | |
GUILD_MEMBERS | 1 | 2 | Üye katılma, değişme, ayrılma; op 8 ve GET /guilds/{guild_id}/members ile tam liste | Evet |
GUILD_MODERATION | 2 | 4 | Yasaklar | |
GUILD_EXPRESSIONS | 3 | 8 | Emoji, çıkartma, ses paneli | |
GUILD_WEBHOOKS | 5 | 32 | Webhook değişiklikleri | |
GUILD_INVITES | 6 | 64 | Davetler | |
GUILD_VOICE_STATES | 7 | 128 | Seste kimlerin olduğu, orada çalınan sesler | |
GUILD_PRESENCES | 8 | 256 | Üyelerin çevrimiçi durumu ve etkinlikleri | Evet |
GUILD_MESSAGES | 9 | 512 | Sunucu kanallarındaki mesajlar | |
GUILD_MESSAGE_REACTIONS | 10 | 1024 | Sunucu kanallarındaki tepkiler | |
GUILD_MESSAGE_TYPING | 11 | 2048 | Sunucu kanallarında yazıyor bilgisi | |
DIRECT_MESSAGES | 12 | 4096 | Kişilerin botunla açtığı DM'lerdeki mesajlar; içerik MESSAGE_CONTENT olmadan da tam gelir | |
DIRECT_MESSAGE_REACTIONS | 13 | 8192 | DM'lerdeki tepkiler | |
DIRECT_MESSAGE_TYPING | 14 | 16384 | DM'lerde yazıyor bilgisi | |
MESSAGE_CONTENT | 15 | 32768 | Mesajların içeriği | Evet |
GUILD_SCHEDULED_EVENTS | 16 | 65536 | Zamanlanmış etkinlikler | |
AUTO_MODERATION_CONFIGURATION | 20 | 1048576 | Otomatik moderasyon kuralları |
Hangi olayın hangi intent'e bağlı olduğu Olaylar sayfasında, her olayın altında yazar.
Bazı olaylar intent istemez, her oturuma gider: READY, RESUMED, RATE_LIMITED, GUILD_MEMBERS_CHUNK ve botun kendi profilini anlatan USER_UPDATE. Botun kendi üyeliğiyle ilgili üye olayları da GUILD_MEMBERS olmadan gelir.
Değeri hesaplamak
İstediğin intent'lerin değerlerini topla ya da bitlerini | ile birleştir:
const GUILDS = 1 << 0;
const GUILD_MESSAGES = 1 << 9;
const MESSAGE_CONTENT = 1 << 15;
const intents = GUILDS | GUILD_MESSAGES | MESSAGE_CONTENT; // 33281
Değer sayı olarak gönderilir, metin olarak değil. Yoksa, sayı değilse ya da listede olmayan bir bit içeriyorsa bağlantı 4013 ile kapanır. 0 geçerlidir: bot o zaman yalnızca intent istemeyen olayları alır.
Ayrıcalıklı intent'ler
Üç intent hassas veri açar: GUILD_MEMBERS, GUILD_PRESENCES ve MESSAGE_CONTENT. Bunları istemeden önce portalda uygulama sayfasının Ayrıcalıklı intent'ler bölümünden açman gerekir. Portaldaki adları Sunucu üyeleri, Presence ve Mesaj içeriği'dir.
Açmadığın bir ayrıcalıklı intent'i identify'da istersen bağlantı 4014 ile kapanır.
REST'te üye listesi. GET /guilds/{guild_id}/members aynı kurala uyar; bir bağlantı olmadığı için portalın o anki haline bakar. GUILD_MEMBERS yoksa 403 member_list_intent_required döner. Tek üye istemek, GET /guilds/{guild_id}/members/{user_id}, intent istemez.
100 sınırı. Bot 100'den az sunucudaysa bu seçim senindir, açman yeter. Bot 100 ya da daha çok sunucudaysa yalnızca onaylanmış ayrıcalıklı intent'ler geçerlidir: açık ama onaysız bir intent'i istersen yine 4014 gelir, onaysız yeni bir intent'i açmak ise 400 intent_approval_required döner. Onay başvurusu ve gerekçe örnekleri Doğrulama sayfasındadır.
Açık bir oturum, identify ettiği intent'lerle sürer. Portaldaki değişiklik canlı oturumu şöyle etkiler:
- Bir intent'i açarsan çalışan oturum bunu kendiliğinden kazanmaz. Yeni intent'i kullanmak için programını yeniden başlat ve yeniden identify et; resume yetmez, çünkü resume aynı oturumu sürdürür.
- Bir intent'i kapatırsan botun bağlantıları hemen düşer ve oturumlar sürdürülemez. Kapattığın intent'i artık istemeden yeniden identify et, yoksa
4014alırsın.
Mesaj içeriği kuralı
GUILD_MESSAGES, mesajların yazıldığını haber verir. Ne yazdığını okumak ise ayrı bir intent ister: MESSAGE_CONTENT. Bu intent olmayan bir bot MESSAGE_CREATE ve MESSAGE_UPDATE olaylarını yine alır, ama içeriği süzülmüş olarak.
İki istisnada mesaj tam gelir:
- Mesajı botun kendisi yazdıysa.
- Mesaj botu adıyla etiketliyorsa, yani bot mesajın
mentionslistesindeyse. Rol etiketi ve@everyonebu sayılmaz.
Süzülmüş bir mesajda content boş metin, attachments boş liste olur. Şu alanlar kalır, diğerlerinin hepsi çıkarılır:
id, type, channel_id, guild_id, author, timestamp, edited_timestamp, mentions, mention_roles, mention_everyone, message_reference, pinned, nonce, webhook_id, reactions, activity
Çıkarılanlar arasında çıkartmalar (sticker_items), anketler (poll), iletilen mesajlar (forward) ve mesajın başka tüm içerik alanları vardır. Boş content hata değildir: "içerik görme iznin yok" demektir.
REST okumaları da aynı kurala uyar
Gateway'de kapalı olan içeriği REST'ten okuyamazsın. Sunucu kanallarında mesaj listesi, tek mesaj ve sabitlenenler aynı süzmeyi uygular, aynı iki istisnayla.
Tek fark şudur: REST isteğinde intent göndermezsin, bu yüzden uygulamanın portaldaki ayarına bakılır, oturumun identify ettiği intent'lere değil. Yani Mesaj içeriği açıksa (ve bot 100 ya da daha çok sunucudaysa onaylıysa) REST tam içerik döner; identify'da MESSAGE_CONTENT istememiş olsan bile.
İletme de aynı kurala uyar
Okuyamadığın mesajı iletemezsin, yoksa iletilen kopyayı okuyarak kuralı aşmış olurdun. Mesaj içeriği kapalı bir bot, kendisinin yazmadığı ve kendisini etiketlemeyen bir mesajı forward ile göndermeye çalışırsa 400 validation_failed alır: {"forward":"invalid"}.
Etkileşim intent istemez
INTERACTION_CREATE hiçbir intent'e bağlı değildir: bir kişi botunun bileşenine bastıysa bot bunu intents: 0 ile de alır. Olayın taşıdığı message botun kendi mesajı olduğu için MESSAGE_CONTENT kuralına da takılmaz, seçilen üye GUILD_MEMBERS olmadan da resolved içinde gelir. Ayrıntı Bileşenler sayfasında.