Ana içeriğe geç

Olay filtreleme

İstemci, Dispatch trafiğini Lazy Request abonelikleri ve Identify ignored_events listesiyle denetler. Sunucu kullanılabilirliği, izinler ve sharding de teslimatı kısıtlar.

TEBHOS'ta intents alanı, intent kapanış kodu ve ayrıcalıklı intent onayı yoktur. Intent kullanan bir protokolden taşınan istemci, intent maskesini bu sayfadaki mekanizmalarla değiştirir.

Kapılar

TEBHOS, sunucu kapsamlı bir Dispatch'i sırasıyla bu kapılardan geçirir.

Kapı Ad Neye karar verir
1 Sunucu kullanılabilirliği Sunucunun Guild Update dışında herhangi bir şey gönderip göndermeyeceği
2 İzin ve görünürlük Olayı hangi oturumların görebileceği
3 Sunucu abonelik durumu 250'den fazla üyesi olan bir sunucudaki pasif bir oturumun, Aktif ve pasif sunucular bölümündeki listeye göre olayı yine de alıp almayacağı
4 Oturum düzeyi filtreler Oturum içinde önce shard filtresinin, sonra ignored_events listesinin olayı düşürüp düşürmeyeceği

Bir örnek (instance) operatörünün kullanılamaz olarak işaretlediği bir sunucu (UNAVAILABLE_FOR_EVERYONE veya UNAVAILABLE_FOR_EVERYONE_BUT_STAFF sunucu özelliği) 1. kapıdan geçemez. UNAVAILABLE_FOR_EVERYONE_BUT_STAFF ile, bağlandığında personel oturumu sunucunun tam durumunu, diğer tüm oturumlar ise bir unavailable taslağı alır. 1. kapıda personel muafiyeti yoktur; bu yüzden özellik ayarlıyken personel oturumu da Guild Update dışında hiçbir şey almaz.

Hesap kapsamlı bir Dispatch 1–3. kapıları atlar ve yalnızca 4. kapıya tabidir. Doğrudan mesaj trafiği, ilişki değişiklikleri, hesap kaydı değişiklikleri ve aramalar bu yoldan gelir.

İzin ve görünürlük

Sunucu her olayı şu alıcı kümelerinden birine çözümler.

Olay sınıfı Olaylar Alıcılar
Kanal kapsamlı Channel Create, Channel Update, Channel Delete, Message Create, Message Delete Bulk, Typing Start, Channel Pins Update, Webhooks Update Kanalı görüntüleyebilen oturumlar
Mesaj erişimine göre filtrelenen Message Update, Message Delete, Message Reaction Add, Message Reaction Remove, Message Reaction Remove All, Message Reaction Remove Emoji Kanalı görüntüleyebilen ve o mesaja erişebilen oturumlar
Davet Invite Create, Invite Delete Davetin kanalında MANAGE_CHANNELS iznine sahip oturumlar
Denetim kaydı Guild Audit Log Entry Create Sunucuda VIEW_AUDIT_LOG iznine sahip oturumlar
Sunucu geneli Diğer her şey Sunucuya bağlı her oturum

Channel Delete, sunucunun silme öncesindeki durumuna göre filtrelenir; böylece kanalın gittiğini, onu görebilen oturumlar öğrenir. Her küme, sunucunun başlangıç durumunu henüz almamış oturumları hariç tutar.

Kanal görünürlüğü, kanaldaki VIEW_CHANNEL izni ve bazı eklerden oluşur. Bir kategori, alt kanallarından en az biri görünürse görünürdür. Bir kanalda canlı ses bağlantısı olan kullanıcı, kanal başka bir nedenle görünmez hâle gelse de ona sanal erişimini korur; örneğin bir rol veya izin geçersiz kılma değişikliği VIEW_CHANNEL iznini kaldırdığında ya da kullanıcı göremediği bir kanala taşındığında. Sanal erişim o kullanıcının her oturumuna uygulanır ve ses bağlantısıyla birlikte sona erer.

Mesaj erişimi, kanaldaki READ_MESSAGE_HISTORY iznidir. Bu izin olmadan da oturum, sunucunun message_history_cutoff değerinden daha yeni mesajlar için olayları alır. Sınır belirlemeyen bir sunucu böyle bir yedek yol sunmaz.

Channel Update Bulk yalnızca alıcının görüntüleyebildiği kanalları içerir. Hiçbiri görünür değilse olay gönderilmez.

Voice State Update kendi yolunu izler. Sunucu bunu doğrudan ses durumunun belirttiği kanalı görüntüleyebilen oturumlara gönderir; durum bir kanal belirtmiyorsa kullanıcının az önce ayrıldığı kanalı görüntüleyebilen oturumlara.

Bazı olayları API dağıtır

Birkaç özel veya kısıtlı durumda API, olayı Gateway'e vermeden önce alıcıları kendisi seçer. Özel olarak işaretlenmiş bir sunucu kanalındaki mesaj, sabitleme veya yazıyor olayı, orada VIEW_CHANNEL iznine sahip her üyeye gönderilir; PERMISSION_UPDATED gibi TEBHOS istemci olayları ise API'nin seçtiği kullanıcılara gider. Bu olaylar Gateway açısından hesap kapsamlıdır ve yalnızca 4. kapıdan geçer.

İşlemi yapan oturumu hariç tutma

Message Reaction Add ve Message Reaction Remove, kaynak HTTP isteğinde bir session_id sorgu parametresi kabul eder. Bir sunucu kanalında TEBHOS bu oturumu ortaya çıkan Dispatch'ten hariç tutar ve alanı yükten çıkarır. Diğer tüm değişiklikler, Dispatch'lerini işlemi yapan oturuma da diğer uygun oturumlar gibi teslim eder.

Aktif ve pasif sunucular

Bir kullanıcı oturumu, Lazy Request sunucuyu active: true olarak işaretleyene ya da Identify onu initial_guild_id olarak belirtene kadar her sunucuda pasiftir. Bot oturumu hiçbir zaman pasif değildir. 250 veya daha az üyesi olan bir sunucu her oturum için aktiftir; dolayısıyla aşağıdaki kural yalnızca 250'den fazla üyesi olan bir sunucudaki pasif kullanıcı oturumuna uygulanır.

Böyle bir oturum tam olarak şu kümeyi alır:

Sunucunun ürettiği diğer tüm Dispatch'ler bastırılır; buna Message Update, Message Delete, Message Delete Bulk, tüm tepki olayları, Invite Create ve Invite Delete, Channel Pins Update, Webhooks Update, Guild Member Add, Guild Role Create ve Guild Role Delete, Guild Ban Add ve Guild Ban Remove ile Guild Emojis Update ve Guild Stickers Update dahildir.

Voice State Update bu kapıya hiç ulaşmaz; bu yüzden büyük bir sunucudaki pasif oturum da görüntüleyebildiği her kanal için bu olayı almaya devam eder.

Bir mesaj, yük o kullanıcıyı mentions içinde belirttiğinde, kullanıcının rollerinden birini mention_roles içinde belirttiğinde, mention_here ayarladığında veya mention_everyone ayarladığında oturumun kullanıcısından bahsetmiş sayılır. Sunucu, mention_roles alanının yalnızca ilk 100 girdisini okur.

Pasif bir oturum her 30 saniyede bir, değişen kanal başına last_message_id değerlerini ve görüntüleyebildiği kanallardaki değişen ses durumlarını içeren Passive Updates olayını alır; böylece bastırılan mesaj olayları olmadan da okunmamış durumunu ve ses listelerini doğru tutar. Hiçbir değişiklik bulmayan bir döngü hiçbir şey göndermez.

Yazıyor bilgisi ayrı belirlenir

Typing Start yukarıdaki kurala uymaz. Oturum Lazy Request ile sunucu için typing ayarladıysa, teslimata yalnızca bu değer karar verir. Geçersiz kılma yoksa olay aktif durumu izler; bu yüzden büyük bir sunucudaki pasif oturum bu olayı almaz. Geçersiz kılma, bot oturumu dahil her oturuma uygulanır.

Üye listeleri

Guild Member List Update kendine ait bir aboneliğe sahiptir. Oturum bu olayı yalnızca member_list_channels içinde belirttiği bir kanal için ve yalnızca o kanalı görüntüleyebildiği ve kanalda VIEW_CHANNEL_MEMBERS iznine sahip olduğu sürece alır. Bir oturum sunucu başına en fazla bir üye listesi aboneliği tutar.

Durum (presence) abonelikleri

Sunucu Presence Update olayını yalnızca şu koşulları sağlayan bir oturuma gönderir: konuyu bir Lazy Request'in members dizisinde belirtmiş olmalı, konunun görebildiği en az bir kanalı görüntüleyebilmeli ve konuya ait olmamalıdır. Arkadaşlar ve grup doğrudan mesaj alıcıları durum bilgilerini hesap yolu üzerinden alır.

Konuyla artık görüntülenebilir bir kanalı paylaşmayan oturum, o konunun abone kümesinden çıkarılır; bu yüzden erişimi yeniden kazanan bir istemci members değerini yeniden göndermek ZORUNDADIR (MUST). Her members dizisi, oturumun o sunucu için önceki abonelik kümesinin yerine geçer.

Bot oturumu arkadaş veya grup doğrudan mesaj durum aboneliği tutmaz; bu yüzden bot durum bilgilerini yalnızca bu sunucu yolu üzerinden alır.

Yok sayılan olaylar

Identify, en fazla 256 Dispatch olay adından oluşan bir dizi olan ignored_events alanını kabul eder. TEBHOS adları büyük harfe çevirir ve tekrarları kaldırır. Alanın olmaması ve JSON null değeri, ikisi de boş liste anlamına gelir. Dize dizisi olmayan başka her değer ve 256'dan fazla girdili her dizi, bağlantıyı 4002 koduyla ve Invalid identify payload nedeniyle kapatır. t değeri listede bulunan bir Dispatch düşürülür ve hiçbir zaman yeniden oynatma arabelleğine girmez.

{
  "op": 2,
  "d": {
    "token": "...",
    "properties": {"os": "Linux", "browser": "my-bot", "device": "my-bot"},
    "ignored_events": ["TYPING_START", "PRESENCE_UPDATE", "PROFILE_UPDATE"]
  }
}

Tek istisna Message Create olayıdır. MESSAGE_CREATE yok sayılsa bile mesaj oturumun kullanıcısından bahsediyorsa TEBHOS olayı yine teslim eder; bunun için yukarıdaki pasif filtreyle aynı test kullanılır: doğrudan bahsetme, kullanıcının rollerinden birine bahsetme, mention_here veya mention_everyone.

Bastırılan bir Dispatch sıra numarası tüketmez; bu yüzden istemci, listenin bir olayı düşürdüğü yerde bir boşluk BEKLEMEMELİDİR (MUST NOT).

Liste oturum boyunca sabittir. Değiştirmek için yeni bir Identify gerekir. Liste TEBHOS istemci olaylarına da uygulanır; böylece bir bot bu olayları adlarıyla düşürebilir.

Shard filtresi

shard_id değeri 0 olmayan bir shard çiftiyle identify yapan oturum, bir sunucu belirtmeyen her Dispatch'i düşürür. Bir Dispatch, boş olmayan üst düzey bir guild_id ile ya da bir Guild Create, Guild Update, Guild Delete veya Guild Sync yükündeki boş olmayan id ile bir sunucu belirtir.

Dolayısıyla hesap düzeyi trafik, doğrudan mesaj trafiği, ilişki değişiklikleri ve aramalar hiçbir zaman 0 dışındaki bir shard'daki oturuma ulaşmaz. Rate Limited, Guild Counts Update ve Channel Member Counts Update da üst düzey guild_id taşımaz; bu yüzden sıfır olmayan bir shard bunları almaz. Bu komutları shard 0 üzerinden gönderin.

Shard 0'daki oturumlar ve shard çifti olmadan identify yapan oturumlar bu kapıda hiçbir şeyi filtrelemez. Gateway, Sharding bölümünde açıklandığı gibi Identify sırasında sunucuları shard'a göre yine de filtreler; bu yüzden shard 0 oturumu yalnızca kendi shard'ının sahip olduğu sunuculara bağlanır.

Bir botun ne göndermesi gerekir

Bot oturumu hiçbir zaman pasif değildir; bu yüzden active onun için hiçbir şeyi değiştirmez ve tipik bir botun hiç Lazy Request'e ihtiyacı yoktur. Bot, trafiği ignored_events ile şekillendirir ve üyeleri Request Guild Members ile çeker.

Yazıyor bilgisini veya tepkileri işlemeyen bir bot, en büyük tasarrufu TYPING_START, MESSAGE_REACTION_ADD ve MESSAGE_REACTION_REMOVE olaylarını yok sayarak sağlar. Kullanmadığı PROFILE_UPDATE, SERVER_UPDATED ve NOTIFICATION_UPDATE gibi TEBHOS istemci olaylarını yok saymak gürültüyü daha da azaltır. PRESENCE_UPDATE olayını yok saymak bota hiçbir tasarruf sağlamaz, çünkü bot bir duruma abone olana kadar hiç durum bilgisi almaz.