Sayılar ve kodlama
Bu sayfa, Open Play’in sayıları, parayı, zamanı ve kimlikleri JSON üzerinde nasıl taşıdığını anlatır. En sık yapılan hata, 64 bit tam sayıları JavaScript number’ına çevirip hassasiyet kaybetmektir; bu sayfayı o hatadan kaçınmak için okuyun.
Kısa kurallar
| Alan türü | Çekirdek REST | Eklenti ve realtime |
|---|---|---|
64 bit tam sayı (int64) | JSON sayısı ("amount": 250) | Ondalık metin ("amount": "250") |
| 32 bit tam sayı | JSON sayısı | JSON sayısı |
| Kayan nokta | Hiçbir yerde yok | Hiçbir yerde yok |
| Para | Küçük birim tam sayısı (amount, balance) | Küçük birim, ...Minor alanları, int64 |
| Yüzde | Baz puan (10000 = %100) | Baz puan |
| Zaman | RFC 3339 metni (created_at) | Unix milisaniye tam sayı (...Ms) |
| Kimlik | UUID metni | UUID metni |
| Enum | snake_case metin | snake_case (eklenti), PascalCase (realtime çerçeve türleri) |
64 bit tam sayılar
JavaScript’in JSON.parse işlevi sayıları double’a çevirir; 2^53 − 1 (9 007 199 254 740 991) üstü tam sayılar sessizce bozulur. Open Play bu yüzden iki profil kullanır:
- Çekirdek REST
int64alanları JSON sayısı olarak gönderir (version,balance,amount). Değerler pratikte güvenli aralıkta kalır, ama garantibigintile okuyan bir ayrıştırıcıdır. TypeScript SDK’sılossless-jsonile okur vebigintdöner. - Eklenti ve realtime (
plugin-v1-decimal-int64kodlama profili)int64alanları ondalık metin olarak gönderir ve bekler:{"expectedVersion":"3"},{"sessionEpoch":"7"}. Böylece her istemci dili kayıpsız taşır.
Kurallı ondalık metin
Eklentilerde işaretli int64 kurallı biçimde yazılmalıdır; sunucu başka biçimi reddeder (400 invalid_argument):
| Geçerli | Geçersiz | Neden |
|---|---|---|
"0", "42", "-7" | "+1" | Artı işareti yok |
"9223372036854775807" | "01", "007" | Baştaki sıfır yok |
"-9223372036854775808" | "-0" | Eksi sıfır yok |
" 5", "5 " | Boşluk yok | |
"1.5", "1e3" | Kesir ve üs yok | |
"9223372036854775808" | int64 sınırı aşıldı | |
5 (JSON sayısı) | Eklenti int64 alanı metin ister |
Realtime çerçevelerindeki sayaçlar (sessionEpoch, inputSeq, revision, sequence, expectedVersion, streamEpoch, barrierSequence) aynı metin biçimindedir ve negatif olamaz. protocolVersion, schemaVersion ve diğer küçük sayaçlar JSON sayısıdır.
Eklenti şema belgesinde int64 alanın sınırları da metin olarak yazılır ("minimum": "0", "maximum": "9223372036854775807"); bu normaldir.
İstemci dillerinde
| Dil | Eşleme |
|---|---|
| TypeScript SDK | int64 → bigint. Sayıya çevirmeyin; gösterim için value.toString() kullanın. JSON’u kendiniz JSON.parse ile okumayın |
| Unity (C#) | int64 → long; eklenti çıktılarında ham JSON JsonValue ondalık metin olarak kalır |
| Ham JSON (başka dil) | Eklenti alanlarını string olarak okuyup int64’e çevirin |
TypeScript’te JSON’u kendiniz ayrıştırıyorsanız lossless-json gibi bir kütüphane kullanın; aksi halde büyük değerler bozulur.
Para ve ölçekli değerler
- Para değerleri küçük birimli tam sayıdır (ör. kuruş):
250kaç ana birim ettiği, oyununuzun gösterim kararına bağlıdır (panelde para biriminin “kuruş hanesi” ayarı gösterimi belirler); API yalnız tam sayıyı taşır. Bakiye ve tutar alanlarıamount,balance, eklentilerde...Minoradıyla gelir. - Kayan nokta (
float/double) hiçbir yerde kullanılmaz: ne istek, ne yanıt, ne de hesaplama. Kendi tarafınızda da para içinfloatkullanmayın; tam sayıyla çalışıp yalnız gösterimde ondalığa çevirin. - İçerik gruplarındaki ölçekli değerler
tamsayı + ölçekçiftidir:4350ve ölçek2→43.50. TypeScript SDK’sındaformatScaled(değer: bigint, ölçek)bunu kayıpsız biçimlendirir (0 ile 18hane). Kendifloatbölmenizi yapmayın.
Yüzdeler: baz puan
Yüzde ve oran alanları baz puan (basis point) tam sayısıdır: 10000 = %100, 2500 = %25, 1 = %0,01. Örnek: grup ödül payı share_bp 0 ile 10000 arasında olmalıdır; dışı 400 alır.
Zaman
| Yer | Biçim | Örnek |
|---|---|---|
Çekirdek REST yanıtları (created_at, as_of) | RFC 3339 | 2026-11-03T10:15:30+00:00 |
Eklenti ve realtime (createdAtMs, sent_at_ms) | Unix epoch milisaniye, tam sayı | 1793700930000 |
Sohbet sorgusu before_ms | Unix epoch milisaniye | 1793700930000 |
Webhook imzasındaki t | Unix epoch saniye | 1793700930 |
Deprecation başlığı | @<unix saniye> (RFC 9745) | @1793491200 |
Eklenti kullanımdan kalkma (sinceUnixS) | Unix saniye | 1793577600 |
Sunucu saatlerini UTC olarak yorumlayın. İstemci saati sunucu kararında kullanılmaz: zaman ve rastgelelik sunucuda üretilir ve olaya yazılır.
Kimlikler ve anahtarlar
- UUID: küçük harfli, tireli metin (
0192a3b4-0000-7000-8000-000000000001). Çoğu kaynak kimliği zamana göre sıralanan UUID v7’dir; sıralama için kullanabilirsiniz, ama biçimden anlam çıkarmayın. keyalanları (tanım anahtarları, skor tablosu, görev): oyun geliştiricinin verdiği okunabilir kimlikler; oluşturduktan sonra aynen kullanın, büyük/küçük harf ya da boşluk değiştirmeyin.- Eklenti kimlikleri: küçük harf ve tire (
package-ride). Mesaj türleri: nokta ile ayrılmış, eklenti önekli (package-ride.delivery-trip.active.input). - İmleçler: opak metin; içeriğini ayrıştırmayın (sayfalama).
- API anahtarları:
crx_live_<önek>_<gizli>; önek yalnız tanımlama içindir, gizli kısım yalnız bir kez gösterilir (güvenlik).
Numaralandırma (enum) değerleri
Tüm numaralandırma değerleri sunucuda tek bir tanımdan gelir ve bilinmeyen değer reddedilir (sessizce yok sayılmaz):
- Çekirdek REST alanları
snake_casemetindir ("type": "set_flag","channel": "in_game","status": "pending"). - Realtime çerçeve
typevekinddeğerleriPascalCase’tir (Authenticate,PlayerSelf); alan adlarıcamelCase’tir. - Sohbet soketi çerçeve
typedeğerlericamelCase, alan adlarısnake_case’tir (channel_id). - Webhook olay türleri
snake_case’tir (webhook olayları). - Eklenti şema belgesinde
enumolarak listelenen değerler (ör."image/png") birebir kullanılır.
İstemcinizde bilinmeyen bir enum değeri gelirse (yeni sürümde eklenmiş olabilir) çökmek yerine güvenli bir varsayılana düşün; SDK’lar bilinmeyen değeri kimi yerde reddeder, kimi yerde atlar, bu yüzden sürüm yükseltmelerini değişiklik günlüğünden izleyin.
Metin
- Tüm metin UTF-8 JSON metnidir.
- Alanların uzunluk sınırları vardır (ör.
Idempotency-Key200 karakter, eklenti dize alanlarındaminLength/maxLength); sınır ihlali400alır. - Düz metin hata mesajları (çekirdek REST) İngilizce ya da Türkçe olabilir ve sürümler arasında değişir; makine kararı için kullanmayın (hatalar).