Liigu põhisisu juurde
Arendajad Game SDK

Näita, mida keegi mängib

Lase oma mängul öelda mssgs’ile, mida mängija parasjagu teeb. Sõbrad näevad tema nime all „Playing“, avavad üksikasjad ja vajutavad Join now, et samasse mängu hüpata. Sinu mäng saab ka kontrollida, kas mängija on sinu kogukonnas.

Mida saad teha

  • Avalda mänguolekMäng, mida mängija parasjagu teeb, tema roll ja kui täis grupp on.
  • Lisa nupp Join nowSõbrad liituvad ühe vajutusega sama mängu, serveri või lobbyga.
  • Kontrolli liikmesustKüsi, kas mängija on sinu kogukonnas ja millised rollid tal seal on.
  • Arvuti, brauser või telefonNatiivsed mängud kasutavad kohalikku silda; brauseri- ja telefonimängud käivad läbi sinu backendi.

Rakenduses

daniPlaying Space Raiders
Space RaidersPlayed by dani
Sector 7
Reidil
3 of 4 in the party · for 12 min
Laskur

Olek nime all ja üksikasjad, mis sellest avanevad. Mäng avaldas ühe JSON-ploki; ülejäänu teeb rakendus.

Ülevaade

mssgs’i arvutirakendus käitab väikest kohalikku HTTP-silda, millega samas arvutis olev mäng suhtleb. Sinu mäng ei suhtle kunagi meie serveritega, ei näe kunagi konto parooli ega tokenit ega saa kunagi mängija nimel postitada. See suhtleb selle mssgs’i koopiaga, kuhu mängija on juba sisse logitud, ja see koopia otsustab, mida vastata.

Mida sellega teha saab:

  • Tuvastada, et mssgs on paigaldatud ja keegi on sisse logitud.
  • Lugeda, kes mängija on: user_guid, username, avatar.
  • Küsida „kas see mängija on kogukonnas X?“ ja millist rolli ta seal kannab.
  • Avaldada teistele „Playing …“ olek nupuga Join now.
  • Võtta vastu liitumisandmed, kui keegi seda nuppu vajutab.

Kaks teed sisse

Natiivne arvutimäng suhtleb kohaliku sillaga; sellest räägivad järgmised jaotised. Brauseris või telefonis töötav mäng selle sillani ei ulatu. Nende puhul avaldab olekut sinu enda backend nende mängijate eest, kes on oma mssgs’i konto QR-koodi või kaheksamärgilise koodiga sidunud: vaata Brauseri- ja telefonimängud, esimese näitena CozyCity. Mänguolek ise on mõlemal juhul sama plokk.

Vaikimisi minimaalne avalikustamine

Ulatused on teadlikult ebavõrdsed. Kui sul on vaja teada ainult seda, „kas see inimene on meie kogukonnas“, küsid ulatust membership.query ja annad server_guid väärtuse ise: saad jah/ei ja tema rollid seal ega saa midagi teada tema ülejäänud kogukondade kohta. Täielik nimekiri on eraldi, kõrgema ulatuse taga, mille mängija peab omaette heaks kiitma.

Kliendi leidmine

Sild kuulab ainult aadressil 127.0.0.1, väikese vahemiku esimesel vabal pordil. Proovi neid järjest, kuni mõni vastab: 7440, 7441, 7442, 7443. mssgs’i arendusversioonid kuulavad selle asemel portidel 7540–7543, nii et testversioon ei vasta kunagi päris mängu päringutele.

GET http://127.0.0.1:7440/mssgs/v1/hello

Tokenit pole vaja ja vastus ei ütle mängija kohta midagi, ainult seda, et mssgs on olemas ja kas keegi on sisse logitud.

Vastus
{
  "product": "mssgs",
  "api": 1,
  "client": "desktop",
  "version": "14.2.20015",
  "platform": "darwin",
  "signed_in": true,
  "scopes": ["identity", "staff", "membership.query", "servers.list", "presence.write"]
}

Enne edasi minemist kontrolli product === "mssgs" ja api. Kui ükski neljast pordist ei vasta, mssgs ei tööta. Paku siis lihtsalt oma tavalist kogemust, selle asemel et mängijat ootama panna.

Loa küsimine

Kõik peale /hello vajab tokenit ja token tekib alles siis, kui mängija on sinu mängu rakenduse dialoogis heaks kiitnud. Küsi ainult neid ulatusi, mida tegelikult kasutad: mängija näeb igaüht eraldi koos selgitusega ja saab igaühelt eraldi linnukese ära võtta.

1. Küsi luba
curl -X POST http://127.0.0.1:7440/mssgs/v1/authorize \
  -H "Content-Type: application/json" \
  -d '{
    "game_id": "com.acme.spacegame",
    "name": "Space Raiders",
    "scopes": ["identity", "membership.query", "presence.write"]
  }'

Tagasi saad {"status":"pending","request_id":"…","poll_after_ms":1000} ja mängija näeb dialoogi. Seejärel küsitle, kuni ta vastab (päring aegub 3 minuti pärast):

2. Küsitle vastust
curl http://127.0.0.1:7440/mssgs/v1/authorize/<request_id>

# {"status":"approved","token":"…","scopes":["identity","presence.write"],"game_id":"com.acme.spacegame"}

Kontrolli alati, mida tegelikult said

Vastuses olev scopes võib olla lühem kui see, mida küsisid: mängija võib üksikutelt ulatustelt linnukese ära võtta. Ülaltoodud näites lükati membership.query tagasi. Lähtu sellest, mida vastus ütleb, mitte sellest, mida küsisid, muidu tabab sind 403 MISSING_SCOPE, mida sa ei osanud oodata.

Salvesta token ja saada see kujul Authorization: Bearer <token>. See püsib üle taaskäivituste, nii et mängija kiidab sinu mängu heaks ühe korra, mitte igal seansil. Kui hiljem autoriseerid uuesti juba antud ulatustega, saad sama tokeni kohe tagasi, ilma dialoogita.

Ulatused ja privaatsus

Viis ulatust annavad välja väga erineva hulga andmeid. See pole juhuslik, see ongi kogu disaini mõte. Küsi nii vähe kui võimalik, liikudes selles tabelis ülevalt alla.

Ulatus Mida see lubab Millest mängija loobub
presence.write Näitab, mida mängija mängib Mitte midagi. See ulatus ainult kirjutab; see ei loe üldse kontoandmeid.
identity Kes mängija on user_guid, username, kuvatav nimi, avatari URL.
staff Personali / moderaatori lipud Kaks tõeväärtust lisaks ulatusele identity. Eraldi, sest mängul, mis näitab nime, pole asja teada, et mängija modereerib kogukondi.
membership.query Kontrollib kogukonda, mida juba tead Sinu antud server_guid kohta: jah/ei, selle nimi ja rollid, mis mängijal seal on. Mitte midagi ühegi teise kogukonna kohta.
servers.list Kõik kogukonnad, kus mängija on Täielik nimekiri: guidid, nimed, ikoonid ja rollid. See on kallis ulatus: küsi seda ainult siis, kui sul on seda tõesti vaja.

Enamikule mängudest piisab kahest

identity ja presence.write katavad „kes sa oled“ ja „näita, mida sa mängid“, mis on peaaegu iga integratsioon. Lisa membership.query, kui tahad siduda auhinna oma kogukonna liikmesusega. Ulatust servers.list pole sul peaaegu kunagi vaja ja mängija näeb seda punasega esile tõstetuna.

Liikmesuse kontrollimine

See on alternatiiv palvele „anna mulle kogu nimekiri“. Annad oma kogukonna server_guid väärtuse (mida sa juba tead) ja saad vastuse ainult selle kohta.

Üks kogukond
curl -H "Authorization: Bearer $TOKEN" \
  "http://127.0.0.1:7440/mssgs/v1/membership?server_guid=ca94ecc…f4g02"

# liige:
# {"server_guid":"ca94ecc…","member":true,"name":"Acme Fans","is_owner":false,
#  "roles":[{"guid":"0aa32…","name":"Pro"}]}

# pole liige ja muud midagi:
# {"server_guid":"…","member":false}

„Ei“ tähendab täpselt seda ja mitte midagi enamat. Ühes päringus võid anda kuni 10 guidi (korda parameetrit server_guid või eralda need komadega), siis saad tagasi massiivi results. Gruppi @everyone pole kunagi loendis roles: see kehtib iga liikme kohta, nii et see ei ütle sulle midagi.

Mänguoleku avaldamine

Üks PUT-päring paneb „Playing …“ rea mängija nime alla kõikjal, kus tema kogukonnad teda näevad.

PUT /mssgs/v1/activity
{
  "name":    "Space Raiders",
  "details": "Sector 7",
  "state":   "In a raid",
  "role":    "Gunner",
  "started_at": 1755859200000,
  "party":   { "size": 3, "max": 4, "kind": "party" },
  "join":    { "secret": "raid-42" }
}

Kohustuslik on ainult name. Vastus ütleb, kui kaua olek kestab ja kui tihti heartbeati saata:

Vastus
{ "ok": true, "expires_in_ms": 90000, "heartbeat_every_ms": 30000 }

Heartbeat, muidu olek kaob

Olek, millest pole 90 sekundit elumärki tulnud, kustutatakse automaatselt. See on teadlik valik: kui sinu mäng kokku jookseb, ei jää mängija tundideks „mängima“. Saada iga 30 sekundi järel POST /mssgs/v1/activity/heartbeat ja korrektsel sulgemisel DELETE /mssgs/v1/activity.

Mängijate arv ja roll

party.kind otsustab, milline lause kuvatakse, sest samad kaks numbrit ei tähenda alati sama asja. Neljaliikmeline meeskond pole server, kus on neli mängijat.

kind Kuvatakse kui Milleks
party (vaikimisi)3 of 4 in the partymeeskond, salk või grupp
server4/100 playersmänguserver (FiveM, kogukonna server)
lobby4/100 playerslobby enne matši algust
match4/100 playerskäimasolev matš või raund

role (kuni 48 märki) on see, kellena mängija mängib: amet, klass või tegelane. Sellel on oma väli, mitte järjekordne lause väljal state, sest seda näidatakse sildina mängijate arvu kõrval.

details ja state on piiratud kumbki 128 märgiga, name 64 märgiga. Reavahetused ja juhtmärgid eemaldatakse. Ikooni URL-i teadlikult ei toetata: selle laadiks alla iga klient, mis rea kuvab, ja nii muutuks olek majakaks, mis raporteerib sinu serverile iga liikme igast kogukonnast, kus mängija on.

Nupp Join now

Pane oma tegevusse plokk join ja teised liikmed saavad oleku kõrvale nupu Join now. Selleks on kaks viisi ja neid võib kombineerida.

1. Saladus (natiivsetele mängudele)

Määra {"join":{"secret":"raid-42"}}. Kui keegi vajutab Join now, toimetatakse see saladus tema enda koopiale sinu mängust, tema enda arvutis, sobitatuna sama game_id järgi. Ühtegi URL-i ei avata ja ühtegi skeemi käsitlejat ei käivitata. Sinu mäng korjab selle üles nii:

GET /mssgs/v1/events
{
  "events": [
    { "seq": 1, "type": "join", "secret": "raid-42",
      "from": { "user_guid": "62e377…", "username": "mssgs-test-1" } }
  ],
  "cursor": 1
}

Küsitle parameetriga ?since=<cursor>, et näha iga sündmust ainult üks kord. Kui vajutaja mäng ei tööta, ei toimetata midagi kohale, ja see on hea põhjus pakkuda ka URL-i.

2. https-URL (veebimängudele ja lobby linkidele)

Määra {"join":{"url":"https://play.example.com/s/abc"}} ja nupp avab selle lingi. Lubatud on ainult https. Kohandatud skeem (steam://, mygame://, file://) lükatakse tagasi: see plokk jõuab iga liikme ekraanile ja selline URL on viis panna kellegi teise arvuti käivitama kohalikku käsitlejat sinu valitud argumentidega.

Kõik join-plokis on avalik

Join-plokk saadetakse kõigile, kes mängija olekut näevad; see ongi nupu Join now mõte. Käsitle seda seega nagu lobby koodi, mitte nagu sisselogimisandmeid. Ära pane sinna kunagi midagi, mis peab salajaseks jääma, ja lase oma koodidel aeguda.

FiveM

FiveM-i kliendipoolses Lua keskkonnas pole HTTP-d, nii et ressurss suhtleb sillaga NUI kaudu: see on CEF-vaade, mis saadab Origin päise. Sild aktsepteerib neid päritolusid selgesõnaliselt: https://cfx-nui-<resource> ja vanemat nui://<resource>. Tavalised veebilehed lükatakse endiselt tagasi ja avatud veebis olev leht ei saa seda päritolu enda omaks kuulutada; brauser määrab selle ise.

client.lua: palu NUI-l avaldada
-- NUI-leht teeb HTTP-päringu; Lua saadab sellele ainult andmed.
CreateThread(function()
  while true do
    SendNUIMessage({
      action  = 'mssgs:publish',
      players = GetActivePlayers and #GetActivePlayers() or 0,
      maxPlayers = GetConvarInt('sv_maxclients', 100),
      job     = exports['qb-core'] and 'Police' or nil
    })
    Wait(30000) -- heartbeat: olek aegub 90 s pärast
  end
end)
nui.js
const BASE = 'http://127.0.0.1:7440/mssgs/v1';   // proovi 7440-7443
let token = null;

async function authorize () {
  const res = await fetch(`${BASE}/authorize`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      game_id: 'fivem.lossantos.rp',
      name: 'Los Santos Roleplay',
      scopes: ['presence.write']          // rohkem pole siin vaja
    })
  });
  const started = await res.json();
  if (started.status === 'approved') { return started.token; }

  // Mängija näeb nüüd mssgs’is loa dialoogi.
  for (let i = 0; i < 180; i += 1) {
    await new Promise((r) => { setTimeout(r, 1000); });
    const poll = await (await fetch(`${BASE}/authorize/${started.request_id}`)).json();
    if (poll.status === 'approved') { return poll.token; }
    if (poll.status !== 'pending') { return null; }
  }
  return null;
}

window.addEventListener('message', async (event) => {
  if (event.data.action !== 'mssgs:publish') { return; }
  if (!token) { token = await authorize(); }
  if (!token) { return; }

  await fetch(`${BASE}/activity`, {
    method: 'PUT',
    headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
    body: JSON.stringify({
      name: 'FiveM',
      details: 'Los Santos Roleplay',
      role: event.data.job,                       // "Police"
      party: { size: event.data.players, max: event.data.maxPlayers, kind: 'server' },
      join: { url: 'https://cfx.re/join/abc123' } // sinu cfx.re link
    })
  });
});

Tulemus: Playing FiveM · Los Santos Roleplay · 4/100 players · Police, koos nupuga Join now, mis avab sinu cfx.re lingi.

Küsi ainult ulatust presence.write

Mänguolek ei vaja midagi muud: see ulatus ei loe üldse midagi. Kui tahad siduda mängusisese auhinna oma mssgs’i kogukonna liikmesusega, lisa membership.query ja anna oma server_guid; mängija teiste kogukondade kohta ei saa sa ikka midagi teada.

Server, kus mängid, pole automaatselt usaldusväärne

Iga FiveM-i server saab käitada kliendiressursse, nii et iga server, millega keegi liitub, saab luba küsida. Just seepärast on vahepeal dialoog, mis nimetab ressursi: otsustab mängija, mitte server.

Brauseri- ja telefonimängud: sidumine sinu backendi kaudu

Brauseri vahelehel või telefonis töötav mäng ei ulatu ülalkirjeldatud sillani. Sild töötab mängija arvutis ja vahel on kolm müüri: sild lükkab tagasi iga päringu, millel on brauseri Origin, Chrome näitab loaküsimust, enne kui avalik leht saab pöörduda aadressi 127.0.0.1 poole, ja Safari keeldub otse, ning telefonil pole arvuti loopbackini üldse teed.

Seega pöördub suund ümber. Sinu enda backend teab juba, kes mängib, ja annab sellest mssgs’ile teada nende mängijate puhul, kes on oma mssgs’i konto sinu mänguga sidunud. Sidumine kinnitatakse mssgs’i rakenduses, mitte kunagi sinu mängus, ja see loob seose, mitte kunagi seanssi: miski allpool ei saa kedagi sisse logida ega mängija nimel tegutseda. Sinu mängu klient ei näe kunagi võtit ega suhtle kunagi mss.gs-iga. Esimene mäng sellel teel on CozyCity, linnaehitusmäng, mis ilmub WebGL-lehena ja iPhone’i rakendusena ilma arvutiversioonita; allolevad näited on tema omad.

1. Registreeri oma mäng

Registreeri mäng Game SDK registreerimislehel: sinu game_id (näiteks com.deverence.cozycity), nimi ja ikoon, mida mängija kinnituslehel näeb, ning sinu backendi hostinimed. Vaatame selle seal üle ja kui see on heaks kiidetud, ootab samal lehel sinu backendi võti, mida näidatakse ühe korra; meie hoiame alles ainult selle räsi. Võti kuulub sinu serverisse ja mitte kuhugi mujale. Saad seda seal igal ajal vahetada ja vana jääb 24 tunniks kehtima, et juurutus jõuaks rahulikult läbi minna.

Registreeri oma mäng

Nimi ja ikoon kinnituslehel tulevad alati registreeringust, mitte kunagi päringust. Muidu saaks andmepüügilink sidumispäringu riietada ükskõik milliseks mänguks. Hostinimed piiravad, kuhu join.url tohib viidata, vaata allpool.

2. Seo mängija

Mängija valib sinu mängus Connect mssgs. Sinu mäng küsib sinu backendilt ja sinu backend küsib meilt:

POST /game-sdk/v1/link/start
curl -X POST https://ams1-gateway.mss.gs/game-sdk/v1/link/start \
  -H "Authorization: Bearer $BACKEND_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "player_ref": "player-8812", "player_name": "René\u2019s city" }'

# {"link_code":"K7PQ2XM4","device_code":"…","qr_url":"https://mss.gs/gl/K7PQ2XM4",
#  "deep_link":"mssgs://link-game/K7PQ2XM4","expires_in":600,"interval":5}

player_ref on sinu enda püsiv ID selle mängija jaoks (kuni 128 märki), mitte seansi või matši jaoks; player_name (kuni 64) on see, mida kinnitusleht näitab kujul „Player: …“. Anna oma mängukliendile ainult link_code, qr_url ja deep_link. device_code on sinu küsitlemise käepide ja jääb serverisse.

Seejärel näitab sinu mäng korraga kolme asja, sest mängija võib olla ükskõik kus:

  • QR-kood väärtusest qr_url. Telefon, kus on mssgs, avab selle otse rakenduse kinnituslehele. Ilma rakenduseta jõuab see lehele mss.gs-is, mis näitab koodi ja pakub allalaadimist.
  • Nupp „Open in mssgs“ lingiga deep_link, brauserile arvutis, kus töötab ka arvutirakendus. See on ainus väline URL, mida sinu mäng kunagi avama peab.
  • Kood ise, kahes neljases rühmas, sisestamiseks menüüs Settings → Game Activity → Link a game. Tähestikus pole 0/O ega 1/I, nii et sisestamisel läheb harva midagi valesti.

Mida mängija mssgs’is näeb; rakendus koostab selle registreeringu põhjal:

Connect CozyCity to your mssgs account?

CozyCity will be able to show what you are playing as your mssgs status. It will not see your messages, your friends or your servers, and it cannot post as you.
Player: René's city · Connect / Not now

Vahepeal küsitleb sinu backend iga interval sekundi järel (kiiremini küsides tuleb vastuseks 429 SLOW_DOWN), kuni olek muutub. Kood töötab ühe korra ja aegub kümne minuti pärast:

POST /game-sdk/v1/link/poll
curl -X POST https://ams1-gateway.mss.gs/game-sdk/v1/link/poll \
  -H "Authorization: Bearer $BACKEND_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "device_code": "…" }'

# {"status":"pending"}
# {"status":"denied"}      # mängija valis Not now
# {"status":"expired"}
# {"status":"linked","link_guid":"…","user":{"user_guid":"62e377…"}}

Salvesta link_guid oma mängija juurde; nüüdsest on see aadress, mille jaoks avaldad. Vastuses on ainult user_guid; username lisatakse ainult siis, kui sinu registreeringul on ulatus identity.link, ja rohkem pole midagi. Teine kinnitus sama player_ref jaoks asendab varasema seose, nii et üks sinu mängu mängija on üks mssgs’i konto. Sama mssgs’i konto võib olla seotud mitme mänguga ja ühe mängu mitme player_ref väärtusega (pere iPad).

3. Avalda mänguolek

Sama plokk nagu sillal, samade reeglite ja piirangutega, ainult nüüd iga seose kohta eraldi ja sinu backendi võtmega:

PUT /game-sdk/v1/links/{link_guid}/activity
{
  "activity": {
    "name":       "CozyCity",
    "details":    "Lantern Hollow",
    "state":      "Day 12 · 34 residents",
    "started_at": 1788901000000,
    "party":      { "size": 6, "max": 40, "kind": "server" },
    "join":       { "url": "https://cozycity.net/game/?share=…" }
  }
}
Vastused
200 {"published":true,"changed":true}     # plokk muutus ja saadeti laiali
200 {"published":true,"changed":false}    # sama mis salvestatud; värskendati ainult TTL-i
204                                        # salvestatud, aga mängija pole praegu mssgs’is võrgus
410 {"error":"LINK_REVOKED"}               # mängija katkestas seose: kustuta see

Käsitle vastuseid 200 ja 204 ühtemoodi: salvestatud. { "activity": null } tühjendab ploki, saada see, kui mängija lahkub. Üks erinevus sillast: join.url host peab olema üks sinu registreeritud backendidest (või selle alamdomeen), muidu saad 400 INVALID_PAYLOAD. Nii ei saa backend panna mängija olekule nuppu Join now, mis viib kuhugi, kus see mängija pole kunagi mänginud.

Heartbeat iga 60 sekundi järel, TTL 120

Avaldatud olek elab ilma uue sõnumita 120 sekundit ja kaob siis ise. Saada seega sama plokki uuesti iga 60 sekundi järel; muutmata plokk ei maksa midagi ja värskendab ainult TTL-i. Kui sinu heartbeat lakkab, kaob ka „Playing …“ rida, ja just see ongi mõte.

Kui võrgus on sadu mängijaid, saada heartbeat ühe päringuga, kuni 100 kirjet korraga. Iga kirje saab oma oleku, nii et üks mängija, kes mssgs’is seose katkestas, ei peata kunagi ülejäänud üheksakümmend üheksat:

POST /game-sdk/v1/activity/batch
{ "items": [ { "link_guid": "…", "activity": { "name": "CozyCity", "details": "Lantern Hollow" } },
             { "link_guid": "…", "activity": null } ] }

// → 200 { "results": [ { "link_guid": "…", "status": 200, "changed": false },
//                      { "link_guid": "…", "status": 410 } ] }

Kuidas olekut näidatakse

  • Täpselt nagu silla olek: Playing CozyCity · Lantern Hollow · 6/40 players, koos nupuga Join now, kui on olemas join.url. Server märgistab ploki kui via: "backend", nii et klient võib lisada „Shared by the game's server“.
  • Ainult siis, kui mängija on mssgs’is võrgus. Kui ükski mssgs’i klient pole avatud, on konto võrgust väljas ja jääb selleks; sinu backend ei saa panna kedagi kohalolevana paistma. See takistab ka seda, et sellest teest saaks „kas René on arvuti taga“ majakas.
  • Eelisjärjekord: rakendusesisene mäng > mäng sillal > sinu backend. Kui mängija istub mssgs’is male mängima, samal ajal kui sinu backend heartbeate saadab, võidab male, mitte see, kes viimasena kirjutas.

Seose katkestamine

Mängija näeb iga seost jaotises Settings → Game Activity → Linked games koos sinu ikooni ja nimega, sinu mängust pärit mängijanimega, sidumise ja viimase avaldamise ajaga ning nupuga Disconnect. Pärast seda vastab sinu järgmine avaldamine 410 LINK_REVOKED; nii saab sinu mäng sellest teada. Kustuta link_guid ja paku uuesti „Connect mssgs“. Enda poolt lõpetad seose päringuga DELETE /game-sdk/v1/links/{link_guid}.

Piirangud

Iga seose kohta loetakse muudatust kõige rohkem iga 2 sekundi järel; muutmata heartbeat on tasuta. Iga võtme kohta on 600 päringut minutis ja koondpäringu kirjed loetakse eraldi: 300 mängija heartbeat iga 60 sekundi järel kulutab 600-st 5.

Endpointide teatmik: sild

Baas-URL http://127.0.0.1:<port>. Kõik peale kolme esimese nõuavad päist Authorization: Bearer <token>.

Meetod Tee Scope Mida teeb
GET /mssgs/v1/hello puudub Kas mssgs on olemas, mida see toetab ja kas keegi on sisse logitud. Ainus marsruut, mis ei vaja tokenit, ja see ei ütle mängija kohta midagi.
POST /mssgs/v1/authorize puudub Küsi mängijalt luba. Avab rakenduses dialoogi ja tagastab request_id, mida küsitleda.
GET /mssgs/v1/authorize/:request_id puudub pending, approved (koos tokeniga), denied või expired.
GET /mssgs/v1/me identity Sisse logitud mängija. Lisab is_staff / is_moderator ainult ulatusega staff.
GET /mssgs/v1/membership membership.query Liikmesus kogukondades, mille server_guid väärtused annad (kuni 10, korduvalt või komadega eraldatult).
GET /mssgs/v1/servers servers.list Kõik kogukonnad, kus mängija on, koos tema rollidega. Otsesõnumeid ei kaasata kunagi.
PUT /mssgs/v1/activity presence.write Avalda „Playing …“ plokk. Tagastab TTL-i ja selle, kui tihti heartbeati saata.
POST /mssgs/v1/activity/heartbeat presence.write Hoia avaldatud tegevus elus ilma seda uuesti saatmata.
DELETE /mssgs/v1/activity presence.write Tühjenda see kohe, korrektseks sulgemiseks.
GET /mssgs/v1/events presence.write Sinu mängule suunatud liitumisandmed. Küsitle parameetriga ?since=<cursor>.
GET /mssgs/v1/session puudub Mida see token hoiab: game_id, antud ulatused, kas keegi on sisse logitud.
DELETE /mssgs/v1/session puudub Anna luba tagasi. Sama tulemus, kui mängija tühistab selle jaotises Settings.

Endpointide teatmik: seotud backendid

Baas-URL https://ams1-gateway.mss.gs. Iga marsruut nõuab päist Authorization: Bearer <backend key> ja sinu registreeringul ulatust activity.write; vastused saadetakse päisega Cache-Control: no-store. Kutsu neid välja oma serverist, mitte kunagi mängukliendist.

Meetod Tee Mida teeb
POST /game-sdk/v1/link/start Alusta seost ühe oma mängija jaoks ({ player_ref, player_name? }). Tagastab link_code, device_code, qr_url, deep_link, expires_in ja interval.
POST /game-sdk/v1/link/poll { device_code } → pending, denied, expired või linked koos link_guid ja user väärtusega.
DELETE /game-sdk/v1/links/{link_guid} Lõpeta seos enda poolt. Mängija saab sama teha jaotises Settings.
PUT /game-sdk/v1/links/{link_guid}/activity Avalda ühe mängija „Playing …“ plokk; { "activity": null } tühjendab selle.
POST /game-sdk/v1/activity/batch Sama kuni 100 mängija jaoks ühe päringuga. Iga kirje vastab eraldi.

Veakoodid

Vead tulevad tagasi kujul {"error":"CODE","message":"…"} koos vastava HTTP olekukoodiga.

Kood Tähendus
401 UNAUTHORIZEDToken puudub või on tundmatu; autoriseeri esmalt.
403 MISSING_SCOPEMängija ei andnud seda luba. Ta võis linnukese ära võtta.
403 ORIGIN_NOT_ALLOWEDPäringul oli brauseri Origin. Vaata allpool „Ainult natiivsed mängud“.
409 NOT_SIGNED_INmssgs töötab, aga keegi pole sisse logitud.
429 RATE_LIMITEDÜhelt mängult üle 120 päringu minutis.
400 INVALID_GAME_IDgame_id tohib sisaldada ainult tähti, numbreid, punkti, sidekriipsu või allkriipsu.
400 TOO_MANY_GUIDSÜhe membership-päringu kohta kõige rohkem 10 server_guid väärtust.

Seotud backendid

Backendi marsruudid kasutavad sama kuju. Koondpäringus tuleb olek tagasi iga kirje kohta eraldi väljal results, nii et üks lõppenud seos ei nurjata kunagi kogu päringut.

Kood Tähendus
401 INVALID_BACKEND_KEYTundmatu võti või võti, mis vahetati välja rohkem kui 24 tundi tagasi.
403 SCOPE_NOT_GRANTEDSinu registreeringul pole ulatust, mida see marsruut vajab.
400 INVALID_PAYLOADVigane päringu sisu, üle 100 kirje koondpäringus või join.url, mille host pole üks sinu registreeritud backendidest.
400 INVALID_ACTIVITYPärast normaliseerimist ei jäänud kasutatavat nime alles.
410 LINK_REVOKEDSeos lõppes, ükskõik kummal poolel. Kustuta see ja paku uuesti „Connect mssgs“.
429 SLOW_DOWNKüsitlesid marsruuti link/poll tihemini, kui interval lubab.
429 RATE_LIMITEDÜhe seose muudatus 2 sekundi jooksul eelmisest või sinu võtmel üle 600 päringu minutis.
503 LINK_STORE_UNAVAILABLEAjutine probleem meie poolel. Proovi uuesti järgmise heartbeatiga.

Turvalisus

Ainult natiivsed mängud

Päringud, millel on veebilehe Origin, lükatakse tagasi koodiga 403 ORIGIN_NOT_ALLOWED. Kui iga veebileht saaks tuvastada, et kasutad mssgs’i, ja avada loa dialoogi, oleks see sõrmejälgede kogumise ja andmepüügi pind, mitte funktsioon. Natiivne mäng ei saada üldse Origin päist, nii et teda see ei puuduta, ja mängu enda sisseehitatud brauser on nime järgi lubatud, vaata FiveM. Kui ehitad brauseri- või telefonimängu, sa sillaga ei suhtle: sinu enda backend avaldab seotud mängijate eest, vaata Brauseri- ja telefonimängud.

Mille üle mängija kontrolli säilitab

  • Mängija saab silla välja lülitada jaotises Settings → Game Activity, misjärel ükski mäng ei näe mssgs’i üldse.
  • Iga heakskiidetud mäng on seal loetletud täpselt nende õigustega, mis tal on, viimase aktiivsuse ajaga ja nupuga Remove. Eemaldamine on kohene: token sureb otsekohe.
  • Seotud brauseri- või telefonimäng on loetletud jaotises Linked games nupuga Disconnect. Ka seose katkestamine on kohene: selle backendi järgmine avaldamine saab vastuseks 410.
  • Sild kuulab ainult aadressil 127.0.0.1, mitte kunagi võrgus.
  • Otsesõnumeid ei avalikustata kunagi, isegi mitte ulatusega servers.list.
  • Iga mängu kohta on piirang 120 päringut minutis.

Hea tava

  • Küsi ulatusi siis, kui neid vajad, mitte kõiki korraga esimesel käivitamisel.
  • Tööta ka ilma mssgs’ita: mängijal ei pea seda olema.
  • Tühjenda oma olek, kui mängimine lõpeb, selle asemel et TTL-i oodata.
  • Käsitle tagasilükatud ulatust tavalise tulemusena, mitte veana.

Ehita edasi