Gateway bağlantısı¶
Bir bot, olayları TEBHOS gateway'ine kurduğu WebSocket bağlantısı üzerinden gerçek zamanlı alır. Bu sayfa botun kurduğu bağlantıyı adım adım anlatır; protokolün tamamı gateway başvuru belgesinde yer alır.
Gateway URL'sini alma¶
GET /gateway/bot
Bağlanılacak WebSocket URL'sini döndürür. Kimlik doğrulama bot token'ıyla yapılır; kullanıcı token'ı veya eksik token 401 döndürür. Hız sınırı: istemci başına dakikada 60.
{
"url": "wss://tebhos.com/ws",
"shards": 1,
"session_start_limit": {
"total": 1000,
"remaining": 999,
"reset_after": 14400000,
"max_concurrency": 1
}
}
| Alan | Tür | Açıklama |
|---|---|---|
| url | string | Gateway WebSocket URL'si. Aşağıdaki sorgu dizesi sonuna eklenir |
| shards | integer | Önerilen shard sayısı. Her zaman 1 |
| session_start_limit | object | Sabit, bilgilendirme amaçlı değerler. Canlı bir sayaç değildir; gerçek identify sınırları Sınırlar altında listelenir |
Bağlantı yaşam döngüsü¶
connect wss://tebhos.com/ws?v=1&encoding=json
<- Hello (op 10) { "heartbeat_interval": 41250 }
-> Identify (op 2) { "token": "...", "properties": { ... } }
<- READY (op 0) session_id, user, ...
<- GUILD_CREATE (op 0) one per guild the bot is in
-> Heartbeat (op 1) every heartbeat_interval ms
<- Heartbeat ACK (op 11)
<- MESSAGE_CREATE (op 0) ... and every other event
1. Bağlanma¶
/gateway/bot yanıtındaki url adresine şu sorgu parametreleriyle bir WebSocket açılır:
| Parametre | Değer | Açıklama |
|---|---|---|
| v | 1 |
Gateway sürümü. Zorunludur; başka bir değer veya değerin hiç verilmemesi bağlantıyı 4012 ile kapatır |
| encoding | json |
Yük kodlaması. Tek kodlama JSON'dur |
| compress? | none |
Aktarım sıkıştırması. Düz metin JSON çerçeveleri almak için atlanır veya none kullanılır |
Her iki yöndeki her çerçeve bir JSON nesnesidir:
| Alan | Tür | Açıklama |
|---|---|---|
| op | integer | İşlem kodu (opcode) |
| d | any | Yük. Gönderilen çerçeveler null olsa bile her zaman d içermelidir; d içermeyen bir çerçeve bağlantıyı 4001 ile kapatır |
| s | ?integer | Sıra numarası, yalnız gönderim (dispatch, op 0) çerçevelerinde |
| t | ?string | Olay adı, yalnız gönderim (dispatch, op 0) çerçevelerinde |
Gönderilen bir çerçeve en fazla 4096 bayt olabilir.
2. Hello alma¶
Gateway hemen milisaniye cinsinden heartbeat_interval içeren Hello (op 10) gönderir (şu an 41250).
3. Identify¶
Bot token'ıyla Identify (op 2) gönderilir. token alanına token yalın hâliyle konur. REST Authorization başlığındaki gibi baştaki bir Bot öneki de kabul edilir ve soyulur; böylece başlık değerini yeniden kullanan kütüphaneler değişiklik gerektirmeden çalışır. Bearer kabul edilmez.
{
"op": 2,
"d": {
"token": "1290847135893127168.q3JxY2V0...W5k",
"properties": { "os": "linux", "browser": "my-bot", "device": "my-bot" }
}
}
| Alan | Tür | Açıklama |
|---|---|---|
| token | string | Bot token'ı, {application_id}.{secret} |
| properties | object | Bağlantı özellikleri. os, browser ve device alanlarının hepsi zorunlu dizelerdir; her değer kabul edilir |
| presence? | object | Başlangıç durumu, örneğin {"status": "online"} |
| ignored_events? | dize dizisi | Gateway'in gönderilmemesi gereken olay adları (en fazla 256), bkz. Olay filtreleme |
| flags? | integer | Negatif olmayan gateway yetenek bayrakları. Botlar bunu 0 bırakabilir |
| shard? | array | [shard_id, shard_count]. Yalnızca bot 2.500'den fazla sunucudaysa gerekir, aşağıya bakın |
Eksik veya hatalı biçimli bir alan bağlantıyı 4002 ile kapatır. Geçersiz bir token bağlantıyı 4004 ile kapatır.
Bir bağlantı en fazla 2.500 sunucu taşıyabilir. Daha fazla sunucudaki bir bot shard kullanmak zorundadır: shard_count kadar bağlantı açılır ve her birine 0 ile shard_count - 1 arasında farklı bir shard_id gönderilir. Bir sunucu (guild_id >> 22) % shard_count numaralı shard'a düşer. shard dizisi yoksa ya da bir shard yine 2.500'den fazla sunucu tutacaksa gateway bağlantıyı 4011 (Sharding gerekli) ile kapatır. Hatalı biçimli bir çift bağlantıyı 4010 ile kapatır. /gateway/bot her zaman 1 shard önerir; bu yüzden shard_count değerini sunucu_sayısı / 2500 üzerinde pay bırakarak kendiniz seçin. Doğrudan mesaj ve bir sunucuya ait olmayan diğer olayları yalnızca shard 0 alır; bkz. Shard filtresi.
Intent yoktur: bot, görebildiği sunucular ve kanallar için tam mesaj içeriği dahil her olayı alır. Gerekmeyen trafiği azaltmak için ignored_events kullanılır.
4. READY ve GUILD_CREATE alma¶
Oturum hazır olduğunda gateway READY gönderir. Bir bot için READY boş bir guilds dizisi taşır; ardından her sunucu kendi GUILD_CREATE gönderimiyle gelir (bir sunucu geçici olarak kullanılamıyorsa unavailable: true ile GUILD_DELETE).
READY içinden şu alanlar saklanmalıdır:
| Alan | Kullanım |
|---|---|
| session_id | Resume için gerekir |
| user.id | Botun kendi kullanıcı kimliği; kendi mesajlarını yok saymak için |
Bot bağlıyken biri onu başka bir sunucuya eklerse gateway açık oturumu o sunucuya bağlar ve onun için bir GUILD_CREATE gönderir; yeniden bağlanmak gerekmez.
5. Heartbeat¶
Her heartbeat_interval milisaniyede bir, d alanı alınan son sıra numarası s olacak şekilde (ilk gönderimden önce null) Heartbeat (op 1) gönderilir. Gateway, Heartbeat ACK (op 11) ile yanıt verir.
- Gateway bota op 1 gönderirse hemen bir heartbeat geri gönderilmelidir. Gateway bunu, aralığın yaklaşık %90'ı boyunca bottan haber alamadığında yapar.
- Son onaylanan heartbeat'ten sonraki 45 saniye içinde heartbeat gelmezse gateway bağlantıyı 4009 ile kapatır.
- Oturumun hiç göndermediği bir sıra numarası içeren heartbeat bağlantıyı 4007 ile kapatır.
- Bir heartbeat gönderildikten sonra bir sonrakinin zamanı gelmeden ACK alınmazsa bağlantı ölü sayılmalıdır: bağlantı kapatılır ve resume yapılır.
Her gönderimdeki s izlenmelidir: her olayda bir artar ve heartbeat ile resume içinde gönderilen değer budur.
Bağlantı koptuktan sonra resume¶
Bağlantı düşerse yeni bir bağlantı açılır, Hello beklenir ve Identify yerine Resume (op 6) gönderilir:
{
"op": 6,
"d": {
"token": "1290847135893127168.q3JxY2V0...W5k",
"session_id": "the session_id from READY",
"seq": 42
}
}
Üç alanın hepsi zorunludur. token, Identify'da nasıl gönderildiyse (Bot önekiyle ya da öneksiz) aynen gönderilir: gateway onu oturumu açan token'la karşılaştırır. Başarılı olursa gateway kaçırılan olayları yeniden oynatır, ardından RESUMED gönderir. Bir oturum, bağlantı düştükten sonra 60 saniye boyunca sürdürülebilir.
Gateway Invalid Session (op 9, d: false) ile yanıt verirse oturum yok olmuştur: 1–5 saniye beklenir ve yeni bir Identify gönderilir. Reconnect (op 7) gönderirse bağlantı kapatılır ve yeni bir bağlantı üzerinde resume yapılır.
| Kapanış kodu | Anlamı | Yapılacak |
|---|---|---|
| 4000 | Bilinmeyen hata | Resume |
| 4001 | Bilinmeyen işlem kodu veya d içermeyen çerçeve |
Yük düzeltilir, ardından yeniden identify yapılır |
| 4002 | Kod çözme hatası veya geçersiz Identify/Resume yükü | Yük düzeltilir, ardından yeniden identify yapılır |
| 4003 | Identify'dan önce komut gönderildi | Önce identify yapılır |
| 4004 | Kimlik doğrulama başarısız | Durulur. Token geçersiz veya yeniden oluşturulmuş |
| 4005 | Identify veya Resume iki kez gönderildi | İstemci düzeltilir |
| 4007 | Geçersiz sıra | Yeniden identify yapılır |
| 4008 | Hız sınırına takıldı | Beklenir, ardından resume yapılır |
| 4009 | Heartbeat zaman aşımı | Resume |
| 4010 | Geçersiz shard | shard düzeltilir veya atlanır |
| 4011 | Sharding gerekli | Bir shard dizisiyle identify yapılır |
| 4012 | Geçersiz API sürümü | v=1 ile bağlanılır |
| 4013 | Onay geri basıncı (backpressure) | Resume |
Tablonun tamamı İşlem kodları ve kapanış kodları sayfasındadır.
Özel durum ayarlama¶
Bot, durumunu (presence) TEBHOS uygulamalarının kullandığı komutla, Presence Update (op 3) ile ayarlar. TEBHOS'ta "Oynuyor ..." veya "Dinliyor ..." gibi etkinlikler yoktur: activities alanı yok sayılır. Bot bir durum ve bir özel durum, yani isteğe bağlı emojili kısa bir metin gösterebilir.
{
"op": 3,
"d": {
"status": "online",
"custom_status": { "text": "Type !help", "emoji_name": "🎵" }
}
}
| Alan | Tür | Açıklama |
|---|---|---|
| status | string | Zorunlu. online, idle, dnd veya invisible. offline, invisible olarak işlenir. Eksik veya bilinmeyen bir değer bağlantıyı 4002 ile kapatır |
| afk? | boolean | Oturumun uzakta olup olmadığı |
| mobile? | boolean | Oturumun mobil olarak gösterilip gösterilmeyeceği |
| custom_status? | ?object | {text?, expires_at?, emoji_id?, emoji_name?}. null özel durumu temizler; anahtar gönderilmezse mevcut özel durum korunur |
READY'den sonra gönderilir. Identify'dakipresencealanı da aynı alanları kabul eder; bkz. Başlangıç durumu nesnesi.- Unicode emoji
emoji_namealanına yazılır ve olduğu gibi gösterilir. Özel emoji (emoji_id) yalnızca TEBHOS Pro'lu hesaplar için yayımlanır; bu yüzden bir botta genellikle çıkarılır, metin korunur. Hiçbir emojiyi belirtmeyen biremoji_idözel durumun tamamını reddettirir ve önceki özel durum yerinde kalır. expires_at, özel durumun temizleneceği ISO 8601 zamanıdır.- Durumu
invisibleolan bir bot herkese çevrim dışı ve özel durumsuz görünür. - Gateway tek bir bağlantıda 20 saniyede 5 durum güncellemesi kabul eder; fazlasını hata vermeden atar.
Kuralların tamamı Presence Update bölümündedir.
Sesli kanala katılma¶
Bot sese TEBHOS uygulamalarıyla aynı yoldan katılır: gateway'den kanalda yer ister, ardından gateway'in döndürdüğü kimlik bilgisiyle medya sunucusuna (LiveKit) bağlanır. Bunun için ayrı bir HTTP yolu yoktur.
- Sunucunun
GUILD_CREATEolayı beklenir. İçindekivoice_states, kimin hangi sesli kanalda olduğunu gösterir. -
connection_idolmadan Voice State Update (op 4) gönderilir; bu yeni bir bağlantı açar. Kimlikler string olarak gönderilir. -
Gateway Kanalı Görüntüle ve Bağlan izinlerini, kanalın kullanıcı sınırını ve botun zaman aşımında olup olmadığını denetler. Katılıma izin verilirse oturum
token,endpoint,channel_idveconnection_idiçeren birVOICE_SERVER_UPDATEalır.connection_idsaklanır. Kanalı görebilen her oturum bot için birVOICE_STATE_UPDATEalır. - Sunucuda çalışan bir LiveKit SDK'sı (Node.js için
@livekit/rtc-node) iletokenkullanılarakendpointadresine bağlanılır ve bir ses izi yayımlanır. Konuş izni yoksa botsuppress: trueile kabul edilir ve kimse onu duymaz. -
Ayrılmak için
channel_id: nullveconnection_idile op 4 gönderilir, ardından medya sunucusuyla bağlantı kesilir.connection_idolmadan ayrılma isteği reddedilir.
Bir ses botunun ele alması gerekenler:
- Reddedilen bir katılım (eksik izin, dolu kanal, zaman aşımındaki bot) hiçbir olay üretmez.
VOICE_SERVER_UPDATEbir zaman aşımıyla, örneğin 15 saniye, beklenir. - Aynı sunucu için sonradan gelen bir
VOICE_SERVER_UPDATE(bölge değişikliği veya taşınma sonrası) yeni birtokentaşır. Medya sunucusuna bu token'la yeniden bağlanılır. - Botun kendi kullanıcısı için
channel_id: nulltaşıyan birVOICE_STATE_UPDATE, bir moderatörün botu çıkardığı ya da kanalın silindiği anlamına gelir. Medya bağlantısı kapatılır; op 4 göndermeye gerek yoktur. - Kanalın uçtan uca şifreleme zorunluluğu botlara uygulanmaz.
- Saniyede yalnızca ilk iki ses güncellemesi hemen işlenir; sonrakiler gecikebilir veya birleştirilebilir.
Yerleşim, izinler ve kapasite Ses sayfasında, tüm alanlar Voice State Update bölümünde anlatılır.
Sınırlar¶
| Sınır | Değer |
|---|---|
| Aynı token ile Identify | Dakikada 20; fazladan denemeler gateway tarafından bekletilir ve yeniden denenir |
| Tek IP adresinden Identify veya Resume | Dakikada 300; fazladan denemeler yok sayılır |
| Tek bağlantıda gönderilen olaylar | Dakikada 600; aşılırsa 4008 ile kapatılır |
| Durum güncellemeleri (op 3) | 20 saniyede 5; fazladan güncellemeler düşürülür |
| Gelen çerçeve boyutu | 4096 bayt |
Ayrıntılar için bkz. Gateway sınırları ve hız sınırları.
Sonraki adım: mesajlara yanıt verme.