Sohbet
Bu sayfa oyuncuların birbirine yazdığı kanal sohbetini (global, dünya, klan, parti ve birebir) anlatır. Oyuncu oturumuyla mesaj göndermek, geçmişi okumak ve canlı mesaj almak istiyorsanız okuyun.
Ne işe yarar
Sohbet modülü (chat) kanal tabanlı metin sohbeti sağlar. Mesajlar kalıcı arşive yazılır; canlı dağıtım ayrıca WebSocket ile yapılır. Aynı mesaj hem REST hem WebSocket üzerinden gönderilebilir ve ikisi de aynı kuralları (susturma, hız sınırı, küfür süzgeci, tekrar koruması) uygular.
Oyuncunun kendi oturumuyla çalışır. API anahtarıyla sohbet uçları çağrılamaz.
Modül kapalıysa uçlar 404 ve {"code":"module_disabled","module":"chat"} döner; sohbet soketi ise önce bir error çerçevesi (code: "module_disabled") gönderip kapanır. Modülü Oyun ayarları › Modüller sayfasından açın.
Panelde nerede
| Ne yapacaksınız | Panel sayfası |
|---|---|
| Modülü açmak ya da kapatmak | Oyun ayarları › Modüller |
| Şehir (sahne) eklentisinin sohbetini okumak, mesajı silmek, oyuncuyu susturmak | Şehir sohbeti |
Not
Panelin “Şehir sohbeti” ekranı sahne eklentisinin sohbetini yönetir; bu sayfadaki kanal sohbeti için panelde mesaj okuma, silme ya da susturma ekranı henüz yoktur.
Veri modeli (düz dille)
-
Kanal (channel):
kindile ayrılır:kindreference_idKim girebilir globalyok Ortamdaki herkes worldgerekli (dünya/harita UUID’si) Referansı bilen oyuncular clangerekli (klan UUID’si) Klanın üyeleri partygerekli (parti UUID’si) Partinin üyeleri directyok; direct_player_idgerekliYalnız iki oyuncu Aynı türde ve aynı referansta kanal bir kez kurulur; yeniden istemek var olan kanalı döndürür.
directkanalda diğer oyuncu kendiniz olamaz. -
Mesaj:
id,channel_id,sender_player_id,client_message_id,body,sent_at_ms. -
client_message_id: İstemcinin ürettiği tekrar anahtarı (boş olamaz, en çok 200 karakter). Aynı kanalda aynı değerle ikinci gönderim yeni mesaj üretmez; var olan mesajıduplicate: trueile geri döner. -
Susturma: Oyuncunun
all,global,world,clan,partyya dadirectkapsamında susturulması. Susturulmuş oyuncunun gönderimi403döner.
Oyunun yaptığı çağrılar
Bütün sohbet uçları oyuncu oturumuyla çağrılır: oturum çerezi ya da opak oturum belirteci (Authorization: Bearer <oturum belirteci>) ve ortam başlığı:
x-crx-env: <ortam uuid>
Bu uçlarda x-csrf-token çift gönderimi ve Origin denetimi uygulanmaz; oturum çerezi ya da oturum belirteci yeterlidir (mağaza satın alma ucundan farklı olarak). Oturum kuralları: Oturumlar ve CSRF.
| Yöntem ve yol | Ne yapar |
|---|---|
POST /v1/chat/channels | Kanal kurar ya da var olanı döndürür |
GET /v1/chat/channels | Oyuncunun yetkili olduğu kanalları listeler |
POST /v1/chat/channels/{channel_id}/messages | Mesaj gönderir |
GET /v1/chat/channels/{channel_id}/messages | Arşivi geriye doğru okur (before_ms, limit 1–100, varsayılan 50) |
GET /v1/chat/ws | Canlı sohbet WebSocket’i |
Not
TypeScript ve Unity SDK’larında sohbet için hazır istemci yoktur; uçlar ham REST ve WebSocket ile çağrılır. Bkz. TypeScript SDK.
Kanal kurmak
POST /v1/chat/channels
x-crx-env: <ortam uuid>
Content-Type: application/json
{ "kind": "clan", "reference_id": "0192f0aa-…" }
{ "channel": { "id": "0192f2bb-…", "environment_id": "…", "kind": "clan", "reference_id": "0192f0aa-…", "participant_a": null, "participant_b": null, "created_at_ms": 1790000000000 } }
Klan ya da parti üyesi olmayan oyuncunun o kanalı kurması ya da okuması reddedilir.
Mesaj göndermek
POST /v1/chat/channels/0192f2bb-…/messages
x-crx-env: <ortam uuid>
Content-Type: application/json
{ "client_message_id": "c-0001", "body": "Merhaba!" }
{ "message": { "id": "…", "channel_id": "0192f2bb-…", "sender_player_id": "…", "client_message_id": "c-0001", "body": "Merhaba!", "sent_at_ms": 1790000000123 }, "duplicate": false }
Kurallar, sırasıyla:
client_message_idboş ya da 200 karakterden uzunsa400.- Gövde 1–2000 Unicode karakter olmalı ve en az bir boşluk dışı karakter içermelidir; aksi
400. - Oyuncu o kanal için susturulmuşsa
403. - Hız sınırı: oyuncu başına 10 saniyede en çok 20 mesaj; aşımı
429döner. - Küfür süzgeci: mesajda yasaklı bir sözcük (boşlukla ayrılmış tam sözcük, büyük/küçük harf duyarsız) varsa
422döner. - Mesaj arşive yazılır, ardından canlı abonelere dağıtılır. Dağıtım başarısız olsa bile arşivlenmiş mesaj silinmez.
Arşivi okumak
GET /v1/chat/channels/{channel_id}/messages?before_ms=1790000000000&limit=50 yanıtı { "messages": [ … ] } döner. before_ms, bu Unix milisaniyesinden eski mesajları ister; bir sonraki sayfa için en eski mesajın sent_at_ms değerini verin.
Canlı sohbet (WebSocket)
GET /v1/chat/ws adresine bağlanırken x-crx-env ve oturum kimliği (çerez ya da Authorization: Bearer) başlık olarak gönderilir. Kimlik doğrulanmadan yükseltme yapılmaz (401); modül kapalıysa 404.
Uyarı
Tarayıcıdaki
WebSocketAPI’si özel başlık (x-crx-env) gönderemez; bu nedenle chat soketine tarayıcıdan doğrudan bağlanılamaz. Tarayıcı oyunları REST ile yoklayabilir; native istemciler (örneğin Unity masaüstü/mobil) başlık ekleyerek bağlanabilir. Başlık yerine sorgu parametresi ya da alt protokol henüz desteklenmez.
İstemci çerçeveleri (JSON; type alanı küçük camelCase, diğer alanlar snake_case):
type | Alanlar | Anlamı |
|---|---|---|
subscribe | channel_id | Kanalın canlı akışına abone ol |
unsubscribe | — | Aboneliği bırak |
send | channel_id, client_message_id, body | REST’teki gibi mesaj gönder |
ping | nonce | Canlılık yoklaması |
Sunucu çerçeveleri:
type | Alanlar |
|---|---|
subscribed | channel_id |
unsubscribed | — |
message | message, duplicate |
pong | nonce |
error | code (invalid_frame, invalid_payload, forbidden_channel, unavailable, message_rejected, module_disabled) |
Bir soket aynı anda tek kanala abonedir. Tanınmayan alan içeren çerçeve invalid_frame alır. Modül sonradan kapanırsa açık soket de kapatılır. Genel gerçek zamanlı yüzey için bkz. Gerçek zamanlı: genel bakış.
Sürümleme ve tekrar güvenliği
- Mesaj gönderiminde
Idempotency-Keybaşlığı yoktur; tekrar güvenliğiclient_message_idile sağlanır. Ağ hatasında aynı değerle yeniden gönderin: mesaj bir kez görünür (duplicate: true). If-Matchkullanılmaz.
Olaylar
Sohbet olayı webhook olarak gönderilmez; webhook olay türleri arasında sohbet yoktur. Canlı akış için WebSocket kullanın.
Sınırlar
- Mesaj gövdesi 1–2000 karakter;
client_message_iden çok 200 karakter. - Gönderim hızı: oyuncu başına 10 saniyede 20 mesaj.
- Arşiv sayfası 1–100 mesaj.
- Bir WebSocket aynı anda tek kanala abone olabilir.
Sık görülen hatalar
| Belirti | Neden | Çözüm |
|---|---|---|
401 | Oturum yok, süresi dolmuş ya da x-crx-env eksik | Oturumu yenileyin; başlığı ekleyin |
403 (gönderim) | Oyuncu susturulmuş ya da kanalda yetkisi yok | Kullanıcıya bilgi verin |
400 | Boş ya da çok uzun gövde / client_message_id | Girdiyi düzeltin |
422 | Küfür süzgeci mesajı reddetti | Mesajı değiştirin |
429 | 10 saniyede 20 mesaj aşıldı | Bekleyip yeniden deneyin |
error: forbidden_channel (WS) | Kanal için yetki yok | Kanalı önce REST ile kurun / yetkiyi doğrulayın |
Çalışan örnek
Oturum çerezi (cookies.txt) ile REST üzerinden bir kanala yazıp geçmişi okuma:
curl -X POST "$API/v1/chat/channels/$CHANNEL/messages" \
-H "x-crx-env: $ENV" \
-H "Content-Type: application/json" -b cookies.txt \
-d '{"client_message_id":"c-0001","body":"Merhaba!"}'
curl "$API/v1/chat/channels/$CHANNEL/messages?limit=20" \
-H "x-crx-env: $ENV" -b cookies.txt