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:
| Alan | Açıklama |
appKey, secretKey | Panelinizdeki anahtarlar |
userId | Oyuncunun sizin sisteminizdeki kimliği |
roomCode | Oda (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
| Metot | Açı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 |
| Olay | Veri |
joined, left | left: { reason } |
peerJoined, peerLeft | { userId } |
speaking | { userId, speaking, isLocal } |
reconnecting, reconnected | Bağlantı koptu / geri geldi |
error | { code, message } |
Hata Kodları
| Kod | Anlamı |
ERR_AUTH | Anahtar hatalı ya da hesap doğrulanmamış |
ERR_IP | İstek atan sunucunun IP'si izin listesinde değil |
ERR_PARAM | Eksik alan |
ERR_RATE | Çok fazla hatalı istek, kısa süreli engel |
ERR_APP_LIMIT | Eşzamanlı kullanıcı kapasitesi doldu |
ERR_TICKET_EXPIRED, ERR_TICKET_USED | Bilet süresi doldu ya da daha önce kullanıldı. SDK getToken ile otomatik yenisini alır |