## ARENA BATTLE — SOHBET YÖNETİMİ / v15 R28

## Kapsam ve kimlik
Site panelindeki Sohbet yönetimi, o sitenin oyuncuları için oda sohbetini, tribünü ve tepkileri birlikte yönetir. Yeni sitelerde sohbet açıktır. Kapatıldığında o sitenin oyuncularına sohbet akışı gösterilmez; yeni mesaj ve tepkiler ortak odalarda da reddedilir. Diğer sitelerin ayarı değişmez. Mesajlarda kalıcı Arena Battle `publicId` kullanılır; operatörün özel kullanıcı adı sohbet adına dönüştürülmez. Personel işlemleri, panel API'sinin döndürdüğü `tenantId` + dahili `userId` ile yapılır.

Bu kısıtlamalar yalnız sohbet içindir. Oyun erişimi, koltuk, savaş, bakiye ve iade işlemleri değişmez. Kalıcı sohbet yasağı yetkili personel kaldırana kadar sürer. Kısıtlama, oyuncunun kaynak sitesini izleyerek yerel ve ortak odalarda, yeniden bağlantılarda korunur.

## Filtre ve yaptırım kademeleri
Sunucu filtresi yaygın Türkçe/İngilizce küfürleri, bağlantı ve alan adlarını, yaygın gizleme biçimlerini, reklam/iletişim yönlendirmelerini ve spamı denetler. Büyük-küçük harf, yaygın karakter değiştirme, görünmez karakter ve boşlukla ayırma normalleştirilir. Sonlu kurallar her dil veya yeni yazım biçimini kesin yakalayamaz; personel yanlış pozitifleri inceleyip kısıtlamaları değiştirebilir.
- İlk iki filtre ihlali: uyarı; reddedilen mesaj yayınlanmaz.
- Üçüncü ihlal: 10 dakika susturma.
- Süre dolduktan sonraki dördüncü ihlal: 60 dakika susturma.
- Süre dolduktan sonraki beşinci ihlal: kalıcı sohbet yasağı.
10 saniyelik kayan pencerede en fazla 5 mesaj veya 12 tepki denemesi yapılabilir. 30 saniye içindeki aynı normalleştirilmiş mesaj ve aşırı karakter tekrarı da spam sayılır. Kapalı/kısıtlı durumdaki denemeler ihlal sayısını artırmaz. Süreyi sunucu saati belirler. Otomatik susturma bitince uyarılar korunur; personelin kısıtlamayı kaldırması birikmiş uyarıları sıfırlar.

Ağ tekrarlarında aynı işlem anahtarı ve içerik kullanılmalıdır. Reddedilen işlem makbuzu aynı yeniden denemenin yeni ihlal yazmasını önler. Reddedilen mesajı yeni anahtarla otomatik yeniden göndermeyin. Aynı anahtar farklı içerikte kullanılırsa 409 döner. Yasak kaldırılınca eski reddedilmiş istek yayınlanmaz; yeni uygun mesaj için yeni anahtar gerekir.

## Oyuncu API’si ve bearer oturumu
```http API uçları
GET /play/:slug/api/social?room=:roomId&channel=room|tribune&after=:cursor
```

Yanıt alanları (gösterimdir, JSON yanıtı değildir):

```text Moderasyon alanları
moderation: {
  enabled, canSend, blocked, status, strikes, until, expiresAt,
  publicId, message, messageEn, serverTime
}
```

status: active|warned|timeout|banned|disabled. Zamanlar Unix milisaniyedir. Özel personel notu/adı oyuncuya gönderilmez. Mevcut oda görünürlüğü ve kanal yetkileri uygulanır.
```text Uç nokta sözleşmesi · gösterim, JSON değildir
POST /play/:slug/api/chat {key,roomId,channel:room|tribune,message}
POST /play/:slug/api/reactions {key,roomId,emoji}
```

Content-Type: application/json, oyuncu bearer oturumu ve izinli entegrasyon origin'i kullanılır. key, harf/rakam/alt çizgi/tire karakterlerinden 8..80 uzunluğundadır. Mesaj kırpıldıktan sonra boş olamaz ve en fazla 300 karakterdir. Tepki değerleri, reactions.allowed içindeki mevcut altı wire değeriyle uyumludur; yeni istemci bunları özel SVG çizimleriyle gösterir. Aynı anda en fazla altı güncel tepki görünür; fazlası sayaçtır.

Başarılı: 200. Geçersiz istek: 400. Oturum yok: 401. Kapalı/yasaklı: 403. İşlem anahtarı çakışması: 409. Filtre uyarısı: 422. Susturma/hız sınırı: 429. Mevcut hata gövdesini koruyun; güncel durum için sosyal akışı yenileyin. Merkezi moderasyonun ürettiği hatalarda CHAT_* kodu bulunur.

## Panel API’si ve ayrı çerez oturumu
```text Uç nokta sözleşmesi · gösterim, JSON değildir
GET  /control/api/chat?tenant=all|tenantId
GET  /operator-api/chat
POST /control/api/chat/settings  {tenantId,enabled:boolean}
POST /operator-api/chat/settings {enabled:boolean,tenantId?:kendiSiteId}
POST /control/api/chat/moderate  {tenantId,userId,action,reason,minutes?}
POST /operator-api/chat/moderate {userId,action,reason,minutes?,tenantId?:kendiSiteId}
```

action: ban|timeout|unban. reason: kırpıldıktan sonra 5..500 karakter. minutes yalnız timeout için zorunludur; 10, 60 veya 1440 olabilir. ban/unban için minutes gönderilmez. Tanınmayan alanlar reddedilir. Başarılı yazma yanıtı 200, `{ok:true,setting}` veya `{ok:true,restriction}` olur.

Mevcut genel admin/site paneli cookie oturumu gerekir. Yazmada yapılandırılmış panelle aynı Origin ve `X-CSRF-Token` gerekir. Okuma: `chat.read`. Yazma: `chat.manage` + `chat.read`. Sunucu güncel oturum ve yetkileri tekrar doğrular. API anahtarı ve oyuncu bearer oturumu sohbet yönetim yetkisi vermez. Operatör oturumu yalnız kendi sitesini yönetir; başka tenant reddedilir. Ortak odada mesaj kaynak sitesine yazılır, başka sitenin oyuncusuna operatör personeli müdahale edemez.

GET: settings[], policy, summary, messages[], restrictions[], events[], `serverTime`. Mesajlarda kaynak `tenantId`/`userId`, kalıcı `publicId`/name, `roomId`/channel/message/`createdAt` ve güncel kısıtlama bulunur. Personel kısıtlama/olay kayıtları gerekçe, kaynak, işlem yapan ve zamanları içerir. Dönen her akış en fazla 300 kayıttır. Özetler seçili sitelerin sınırlı okuma penceresini kapsar; tüm zaman toplamı değildir ve birleştirilmiş son akıştan fazla kayıt kapsayabilir. Arama/durum filtreleri yüklenen kayıtlarda çalışır. Genel admin 15, operatör 20 saniyede yenilenir; açık işlem penceresi, gizli sekme ve metin düzenleme sırasında arka plan yenilemesi durur.

## Personel ve saklama
İsimli personel Ekip / Ekip ve roller üzerinden oluşturulur. Sınırlı hesaplara `chat.read`/`chat.manage` açıkça verilmelidir; `chat.read` olmadan `chat.manage` geçersizdir. Mevcut tam yetkili site yöneticilerinin izinleri yükseltilir ve eski oturumları iptal edilir; sınırlı hesaplara ek yetki verilmez. İşlemler denetim günlüğüne yazılır. Susturulan/yasaklanan oyuncu açık sohbeti okuyabilir; site sohbeti kapalıysa oyuncuya boş akış döner.

Merkezi SQLite ayarları, kısıtlamaları, denemeleri, işlem makbuzlarını ve olayları saklar. Moderasyon etkinliğinde yapılan sınırlı temizlik makbuzları en fazla 30, denemeleri 7, olayları 90 gün tutar; site başına sınırlar sırasıyla 100.000 / 50.000 / 10.000 kayıttır. Kısıtlamalar personel değiştirene kadar tutulur; genel denetim günlüğü mevcut politikasını izler. Sohbet metninde oda/kanal başına mevcut son 1.000 kayıt sınırı korunur. Kanıtlar özel operasyon verisi olarak değerlendirilmelidir.

## Güncelleme ve doğrulama
Sağlayıcı ile dosyalı/modül istemciyi birlikte güncelleyin. Iframe, sağlayıcının güncel dosyalarını yükler. Dosyalı kurulumda `chat-reactions.js`, `chat-moderation-player.js` ve `chat-player.css` için yeni istemci ZIP'i dağıtılmalıdır. Genel admin ve operatör arayüzleri sağlayıcı güncelleme paketindedir. R28 cüzdan callback sözleşmesini veya operatör sunucu anahtarı kapsamlarını değiştirmez.

Teslim edilen testler izole gerçek HTTP/SQLite ve tarayıcıyla site kapsamı, doğrudan yasak/susturma/kaldırma, ortak oda, tekrar/idempotency, filtreler, TR/EN paneller ve mobil yerleşimi denetler. Süreler kontrollü saatle denenir; moderasyon testlerinde harici oyun satın alınmaz.

Aktif kısıtlamaları veya sohbet yetkilerini tanımayan sürüme geri dönmeyin. R28 otomatik rollback içermez. Kaynak değiştirmeden önce hizmet kapalıyken ayarları, kısıtlamaları, olayları ve personel izinlerini inceleyip koruyun; R28 ROLLBACK-GUARD.txt belgesini uygulayın.
