Gabble Voice SDK
Gabble Voice SDK

Oyununuza sesli sohbet
birkaç satırda.

Sunucu, ses altyapısı ve ölçekleme bizden. Siz sadece oyuncunuz için bir bilet alın ve odaya bağlayın.

Partiden 100+ kişilik loncalara kadar oda ve grup yapısı
Düşük gecikmeli ses, bas-konuş ve sunucu taraflı konuşma göstergesi
Bağlantı koparsa otomatik yeniden bağlanma
Tek kullanımlık, imzalı biletler ve IP kısıtlaması
Gabble tanıtımı karşılığında 10 eşzamanlı kullanıcıya kadar ücretsiz
Dokümantasyon
Geliştirici Girişi
Girişte e-postanıza bir doğrulama kodu gönderilir.
Hesap Oluştur
Bilet istekleri sadece bu IP'den kabul edilir. Panelden sonradan değiştirebilirsiniz.
Dokümantasyon

Hızlı Başlangıç

Entegrasyon iki parçadan oluşur: sunucunuz oyuncu adına bir bilet alır, oyun istemciniz bu biletle sese bağlanır. SecretKey asla oyun istemcisine konmaz.

1Sunucunuzda bilet alın

POST https://gabble.tr/API/Auth.ashx adresine form verisi olarak gönderin:

AlanAçıklama
appKey, secretKeyPanelinizdeki anahtarlar
userIdOyuncunun sizin sisteminizdeki kimliği
roomCodeOda (sunucu, harita, lonca vb.)
groupCodeİsteğe bağlı parti/grup. Aynı odadaki farklı gruplar birbirini duymaz

Başarılı yanıttaki ticket değerini oyuncuya iletin. Bilet 5 dakika içinde ve tek seferlik kullanılır.

Node.js
app.post('/voice-ticket', requireLogin, async (req, res) => {
  const r = await fetch('https://gabble.tr/API/Auth.ashx', {
    method: 'POST',
    body: new URLSearchParams({
      appKey: process.env.GABBLE_APP_KEY,
      secretKey: process.env.GABBLE_SECRET_KEY,
      userId: String(req.user.id),
      roomCode: req.body.roomCode,
      groupCode: req.body.partyId || 'default'
    })
  });
  const data = await r.json();
  if (data.status !== 'success') return res.status(400).json(data);
  res.json({ ticket: data.ticket });
});
PHP
$ch = curl_init('https://gabble.tr/API/Auth.ashx');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'appKey'    => getenv('GABBLE_APP_KEY'),
        'secretKey' => getenv('GABBLE_SECRET_KEY'),
        'userId'    => $_SESSION['user_id'],
        'roomCode'  => $_POST['roomCode'],
        'groupCode' => $_POST['partyId'] ?? 'default',
    ]),
]);
$data = json_decode(curl_exec($ch), true);
echo json_encode($data['status'] === 'success' ? ['ticket' => $data['ticket']] : $data);
C# (.NET)
using (var http = new HttpClient())
{
    var res = await http.PostAsync("https://gabble.tr/API/Auth.ashx", new FormUrlEncodedContent(new Dictionary<string, string> {
        ["appKey"] = appKey, ["secretKey"] = secretKey,
        ["userId"] = userId, ["roomCode"] = roomCode, ["groupCode"] = partyId ?? "default"
    }));
    var json = await res.Content.ReadAsStringAsync();   // { "status": "success", "ticket": "..." }
}

2İstemcide bağlanın

HTML / JavaScript
<script src="https://gabble.tr/sdk/v1/gabble-voice.js"></script>
<script>
  const voice = new GabbleVoice({
    // SDK yeni bilete ihtiyaç duyduğunda (ilk giriş, bağlantı kopması) bunu çağırır
    getToken: async () => {
      const r = await fetch('/voice-ticket', { method: 'POST' });
      return (await r.json()).ticket;
    }
  });

  voice.on('speaking', e => showSpeaker(e.userId, e.speaking));

  // join() mikrofon izni ister: bir kullanıcı tıklamasının içinde çağırın
  joinButton.onclick = async () => {
    try {
      await voice.join();
    } catch (err) {
      console.error('Sese bağlanılamadı:', err.code);
    }
  };

  pttButton.onpointerdown = () => voice.talk(true);    // bas-konuş
  pttButton.onpointerup   = () => voice.talk(false);
</script>

API

MetotAçıklama
join()Odaya katılır
leave()Odadan ayrılır, mikrofonu kapatır
talk(bool)Bas-konuş
setMuted(bool)Mikrofonu tamamen susturur
setUserVolume(userId, 0..1)Bir oyuncunun ses seviyesi
getPeers()Odadaki diğer oyuncular
OlayVeri
joined, leftleft: { reason }
peerJoined, peerLeft{ userId }
speaking{ userId, speaking, isLocal }
reconnecting, reconnectedBağlantı koptu / geri geldi
error{ code, message }

Hata Kodları

KodAnlamı
ERR_AUTHAnahtar hatalı ya da hesap doğrulanmamış
ERR_IPİstek atan sunucunun IP'si izin listesinde değil
ERR_PARAMEksik alan
ERR_RATEÇok fazla hatalı istek, kısa süreli engel
ERR_APP_LIMITEşzamanlı kullanıcı kapasitesi doldu
ERR_TICKET_EXPIRED, ERR_TICKET_USEDBilet süresi doldu ya da daha önce kullanıldı. SDK getToken ile otomatik yenisini alır