Siirry pääsisältöön
Kehittäjät Game SDK

Näytä, mitä joku pelaa

Anna pelisi kertoa mssgs:lle, mitä pelaaja tekee. Kaverit näkevät hänen nimensä alla "Pelaa peliä …" -rivin, avaavat tiedot ja painavat Liity nyt hypätäkseen samaan peliin. Pelisi voi myös tarkistaa, kuuluuko pelaaja yhteisöösi.

Mitä voit tehdä

  • Julkaise pelaamistilaPeli, mitä pelaaja tekee, hänen roolinsa ja kuinka täynnä porukka on.
  • Lisää Liity nyt -painikeKaverit liittyvät samaan peliin, palvelimelle tai aulaan yhdellä painalluksella.
  • Tarkista jäsenyysKysy, kuuluuko pelaaja yhteisöösi ja millä rooleilla.
  • Työpöytä, selain tai puhelinNatiivipelit käyttävät paikallista siltaa; selain- ja puhelinpelit kulkevat taustajärjestelmäsi kautta.

Sovelluksessa

daniPelaa peliä Space Raiders
Space RaidersPelaajana dani
Sector 7
Raidissa
3 / 4 ryhmässä · 12 min
Tykkimies

Tila nimen alla ja tiedot, jotka se avaa. Peli julkaisi yhden JSON-lohkon; kaikki muu on sovelluksen omaa.

Yleiskatsaus

mssgs:n työpöytäsovellus ajaa pientä paikallista HTTP-siltaa, jonka kanssa samalla koneella oleva peli keskustelee. Pelisi ei koskaan keskustele palvelimiemme kanssa, ei koskaan näe tilin salasanaa tai tokenia eikä voi koskaan kirjoittaa pelaajan nimissä. Se keskustelee sen mssgs-sovelluksen kanssa, johon pelaaja on jo kirjautunut, ja sovellus päättää, mitä vastata.

Mitä voit tehdä sillä:

  • Havaita, että mssgs on asennettu ja joku on kirjautunut.
  • Lukea, kuka pelaaja on: user_guid, käyttäjänimi, avatar.
  • Kysyä "onko tämä pelaaja yhteisössä X?" ja mikä rooli hänellä siellä on.
  • Julkaista "Pelaa peliä …" -tilan, jossa on muille Liity nyt -painike.
  • Vastaanottaa liittymisen luovutuksen, kun joku painaa sitä painiketta.

Kaksi tietä sisään

Natiivi työpöytäpeli keskustelee paikallisen sillan kanssa; siitä kertovat seuraavat osiot. Selaimessa tai puhelimessa oleva peli ei tavoita siltaa. Niille oma taustajärjestelmäsi julkaisee tilan pelaajille, jotka liittivät mssgs-tilinsä QR-koodilla tai kahdeksan merkin koodilla: katso Selain- ja puhelinpelit, ensimmäisenä esimerkkinä CozyCity. Itse pelaamistila on sama lohko kummassakin tapauksessa.

Vähimmäistiedot oletuksena

Scopet ovat tarkoituksella erisuuruisia. Jos tarvitset vain tiedon "onko tämä henkilö yhteisössämme", pyydät membership.query-scopea ja nimeät server_guidin itse: saat kyllä/ei-vastauksen ja hänen roolinsa siellä, etkä saa tietää mitään hänen muista yhteisöistään. Koko luettelo on erillisen, korkeamman scopen takana, jonka pelaajan on hyväksyttävä erikseen.

Sovelluksen löytäminen

Silta kuuntelee vain osoitetta 127.0.0.1, pienen alueen ensimmäisessä vapaassa portissa. Kokeile niitä järjestyksessä, kunnes jokin vastaa: 7440, 7441, 7442, 7443. mssgs:n kehitysversiot kuuntelevat sen sijaan portteja 7540–7543, joten testiversio ei koskaan vastaa oikean pelin kutsuihin.

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

Tokenia ei tarvita, eikä vastaus kerro pelaajasta mitään, vain sen, että mssgs on täällä ja onko joku kirjautunut.

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

Tarkista product === "mssgs" ja api ennen kuin jatkat. Jos mikään neljästä portista ei vastaa, mssgs ei ole käynnissä. Tarjoa silloin tavallinen kokemuksesi sen sijaan, että pelaaja joutuisi odottamaan.

Luvan pyytäminen

Kaikki paitsi /hello vaatii tokenin, ja token syntyy vasta, kun pelaaja on hyväksynyt pelisi sovelluksen sisäisessä ikkunassa. Pyydä vain scopet, joita oikeasti käytät: pelaaja näkee jokaisen erikseen selitettynä ja voi poistaa niistä valinnan yksitellen.

1. Pyydä lupaa
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"]
  }'

Saat takaisin {"status":"pending","request_id":"…","poll_after_ms":1000}, ja pelaaja näkee ikkunan. Kysele sitten, kunnes hän vastaa (pyyntö vanhenee 3 minuutin kuluttua):

2. Kysele vastausta
curl http://127.0.0.1:7440/mssgs/v1/authorize/<request_id>

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

Tarkista aina, mitä oikeasti sait

Vastauksen scopes voi olla lyhyempi kuin pyytämäsi: pelaaja saa vapaasti poistaa valinnan yksittäisistä scopeista. Yllä olevassa esimerkissä membership.query evättiin. Haaraudu sen mukaan, mitä vastaus sanoo, äläkä sen mukaan, mitä pyysit, tai kohtaat 403 MISSING_SCOPE -virheen, jota et suunnitellut.

Tallenna token ja lähetä se muodossa Authorization: Bearer <token>. Se säilyy uudelleenkäynnistysten yli, joten pelaaja hyväksyy pelisi kerran eikä joka istunnossa. Jos valtuutat myöhemmin uudelleen jo myönnetyillä scopeilla, saat saman tokenin suoraan takaisin ilman ikkunaa.

Scopet ja yksityisyys

Viisi scopea luovuttavat hyvin eri määriä tietoa. Se ei ole sattumaa; se on koko suunnittelun ydin. Pyydä niin vähän kuin voit, tätä taulukkoa alaspäin edeten.

Scope Mitä se sallii Mitä pelaaja luovuttaa
presence.write Näytä, mitä hän pelaa Ei mitään. Tämä scope vain kirjoittaa; se ei lue tilitietoja lainkaan.
identity Kuka pelaaja on user_guid, käyttäjänimi, näyttönimi, avatarin URL.
staff Henkilökunta- ja moderaattoriliput Kaksi totuusarvoa identityn lisäksi. Erillinen, koska nimeä näyttävän pelin ei kuulu tietää, että pelaaja moderoi yhteisöjä.
membership.query Tarkista yhteisö, jonka jo tiedät Nimeämällesi server_guidille: kyllä/ei, sen nimi ja pelaajan roolit siellä. Ei mitään muista yhteisöistä.
servers.list Jokainen yhteisö, jossa hän on Koko luettelo: guidit, nimet, kuvakkeet ja roolit. Tämä on kallis: pyydä sitä vain, jos todella tarvitset sitä.

Useimmat pelit tarvitsevat kaksi niistä

identity ja presence.write kattavat kysymykset "kuka olet" ja "näytä, mitä pelaat", eli lähes jokaisen integraation. Lisää membership.query, jos haluat sitoa palkinnon jäsenyyteen yhteisössäsi. servers.list-scopea tarvitset tuskin koskaan, ja pelaaja näkee sen korostettuna punaisella.

Jäsenyyden tarkistaminen

Tämä on vaihtoehto pyynnölle "anna minulle koko luettelo". Nimeät oman yhteisösi server_guidin (jonka tiedät jo) ja saat vastauksen vain siitä.

Yksi yhteisö
curl -H "Authorization: Bearer $TOKEN" \
  "http://127.0.0.1:7440/mssgs/v1/membership?server_guid=ca94ecc…f4g02"

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

# ei jäsen, eikä mitään muuta:
# {"server_guid":"…","member":false}

"Ei" on täsmälleen sitä eikä mitään enempää. Voit antaa kutsua kohden enintään 10 guidia (toista server_guid tai erota pilkuilla), jolloin saat results-taulukon. @everyone-ryhmä ei ole koskaan roles-kentässä: se pätee jokaiseen jäseneen, joten se ei kerro mitään.

Pelaamistilan julkaiseminen

Yksi PUT tuo "Pelaa peliä …" -rivin pelaajan nimen alle kaikkialla, missä hänen yhteisönsä näkevät hänet.

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" }
}

Vain name on pakollinen. Vastaus kertoo, kuinka kauan tila on voimassa ja kuinka usein heartbeat lähetetään:

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

Heartbeat, tai tila katoaa

Tila, josta ei ole kuulunut elonmerkkiä 90 sekuntiin, poistetaan automaattisesti. Se on tarkoituksellista: jos pelisi kaatuu, pelaaja ei jää "pelaamaan" tunneiksi. Lähetä POST /mssgs/v1/activity/heartbeat 30 sekunnin välein ja DELETE /mssgs/v1/activity hallitussa sammutuksessa.

Pelaajamäärä ja rooli

party.kind ratkaisee, mikä lause näytetään, koska samat kaksi lukua eivät tarkoita samaa. Neljän hengen ryhmä ei ole palvelin, jolla on neljä pelaajaa.

kind Näkyy muodossa Käyttö
party (oletus)3 / 4 ryhmässäryhmä, porukka tai joukkue
server4/100 pelaajaapelipalvelin (FiveM, yhteisöpalvelin)
lobby4/100 pelaajaaaula ennen ottelun alkua
match4/100 pelaajaakäynnissä oleva ottelu tai kierros

role (enintään 48 merkkiä) on se, minä pelaaja pelaa: ammatti, luokka tai hahmo. Sillä on oma kenttänsä eikä se ole uusi lause state-kentässä, koska se näytetään tunnisteena pelaajamäärän vieressä.

details ja state on rajattu 128 merkkiin kumpikin, name 64 merkkiin. Rivinvaihdot ja ohjausmerkit poistetaan. Kuvakkeen URL:ää ei tueta tarkoituksella: jokainen riviä näyttävä sovellus hakisi sen, jolloin tilasta tulisi majakka, joka raportoi palvelimellesi jokaisen jäsenen jokaisesta yhteisöstä, jossa pelaaja on.

Liity nyt -painike

Lisää join-lohko aktiviteettiisi, niin muut jäsenet saavat tilan viereen Liity nyt -painikkeen. Tapoja on kaksi, ja voit yhdistää ne.

1. Salaisuus (natiivipeleille)

Aseta {"join":{"secret":"raid-42"}}. Kun joku painaa Liity nyt, salaisuus toimitetaan hänen omaan pelisi kopioonsa hänen omalla koneellaan, saman game_id:n perusteella. Mitään URL:ää ei avata eikä mitään skeemankäsittelijää kutsuta. Pelisi noutaa sen näin:

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

Kysele parametrilla ?since=<cursor>, niin näet jokaisen tapahtuman kerran. Jos painajan peli ei ole käynnissä, mitään ei toimiteta, mikä on hyvä syy tarjota myös URL.

2. https-URL (verkkopeleille ja aulalinkeille)

Aseta {"join":{"url":"https://play.example.com/s/abc"}}, niin painike avaa sen linkin. Vain https hyväksytään. Mukautettu skeema (steam://, mygame://, file://) evätään: lohko päätyy jokaisen jäsenen näytölle, ja sellainen URL on tapa saada jonkun toisen kone kutsumaan paikallista käsittelijää valitsemillasi argumenteilla.

Kaikki join-lohkossa on julkista

join-lohko lähetetään kaikille, jotka näkevät pelaajan tilan; juuri se on Liity nyt -painikkeen koko tarkoitus. Käsittele sitä siis aulakoodina, ei tunnistetietona. Älä koskaan laita siihen mitään, minkä täytyy pysyä salassa, ja anna koodiesi vanhentua.

FiveM

FiveM:n asiakaspuolen Lua-ajoympäristössä ei ole HTTP:tä, joten resurssi keskustelee sillan kanssa NUI:n kautta. NUI on CEF-näkymä, joka lähettää Origin-otsakkeen. Silta hyväksyy nämä originit nimenomaisesti: https://cfx-nui-<resource> ja vanhemman nui://<resource>. Tavalliset verkkosivut evätään edelleen, eikä avoimen verkon sivu voi väittää olevansa tuo origin; selain asettaa sen itse.

client.lua: pyydä NUI:ta julkaisemaan
-- NUI-sivu hoitaa HTTP:n; Lua vain lähettää sille tiedot.
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: tila vanhenee 90 s:n kuluttua
  end
end)
nui.js
const BASE = 'http://127.0.0.1:7440/mssgs/v1';   // kokeile 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']          // muuta ei tässä tarvita
    })
  });
  const started = await res.json();
  if (started.status === 'approved') { return started.token; }

  // Pelaaja näkee nyt lupaikkunan mssgs:ssä.
  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' } // cfx.re-linkkisi
    })
  });
});

Tulos: Pelaa peliä FiveM · Los Santos Roleplay · 4/100 pelaajaa · Police, ja Liity nyt -painike, joka avaa cfx.re-linkkisi.

Pyydä vain presence.write

Pelaamistila ei tarvitse muuta: se scope ei lue mitään. Jos haluat sitoa pelin sisäisen palkinnon jäsenyyteen mssgs-yhteisössäsi, lisää membership.query ja nimeä oma server_guidisi; et silti saa tietää mitään pelaajan muista yhteisöistä.

Palvelin, jolla pelaat, ei ole automaattisesti luotettu

Mikä tahansa FiveM-palvelin voi ajaa asiakasresursseja, joten mikä tahansa palvelin, jolle joku liittyy, voi pyytää lupaa. Juuri siksi välissä on ikkuna, joka nimeää resurssin: pelaaja päättää, ei palvelin.

Selain- ja puhelinpelit: liittäminen taustajärjestelmäsi kautta

Selainvälilehdellä tai puhelimessa oleva peli ei tavoita yllä kuvattua siltaa. Silta toimii pelaajan työpöytäkoneella, ja välissä on kolme muuria: silta hylkää jokaisen pyynnön, jossa on selaimen Origin, Chrome näyttää lupakehotteen ennen kuin julkinen sivu saa hakea osoitteesta 127.0.0.1 ja Safari kieltäytyy suoraan, eikä puhelimella ole mitään reittiä työpöytäkoneen loopbackiin.

Suunta siis kääntyy. Oma taustajärjestelmäsi tietää jo, kuka pelaa, ja se kertoo sen mssgs:lle niiden pelaajien osalta, jotka liittivät mssgs-tilinsä peliisi. Liitos hyväksytään mssgs-sovelluksessa, ei koskaan pelissäsi, ja se luo liitoksen, ei koskaan istuntoa: mikään alla oleva ei voi kirjata ketään sisään eikä toimia pelaajan nimissä. Pelisi asiakassovellus ei koskaan näe avainta eikä koskaan keskustele mss.gs:n kanssa. Ensimmäinen tätä reittiä käyttävä peli on CozyCity, kaupunkirakentelupeli, joka julkaistaan WebGL-sivuna ja iPhone-sovelluksena ilman työpöytäversiota; alla olevat esimerkit ovat sen omia.

1. Rekisteröi pelisi

Rekisteröi peli Game SDK:n rekisteröintisivulla: pelisi game_id (esimerkiksi com.deverence.cozycity), nimi ja kuvake, jotka pelaaja näkee hyväksyntäikkunassa, sekä taustajärjestelmäsi isäntänimet. Tarkistamme sen siellä, ja hyväksynnän jälkeen backend-avaimesi odottaa samalla sivulla, kerran näytettynä; me säilytämme siitä vain tiivisteen. Avain kuuluu palvelimellesi eikä minnekään muualle. Voit vaihtaa sen siellä milloin tahansa, ja vanha pysyy voimassa 24 tuntia, jotta julkaisu ehtii edetä.

Rekisteröi pelisi

Ikkunan nimi ja kuvake tulevat aina rekisteröinnistä, ei koskaan pyynnöstä. Muuten tietojenkalastelulinkki voisi pukea liitospyynnön miksi tahansa peliksi. Isäntänimet rajaavat, minne join.url saa osoittaa, katso alta.

2. Liitä pelaaja

Pelaaja valitsee pelissäsi Yhdistä mssgs. Pelisi kysyy taustajärjestelmältäsi, ja taustajärjestelmäsi kysyy 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 oma pysyvä tunnisteesi kyseiselle pelaajalle (enintään 128 merkkiä), ei istunnolle tai ottelulle; player_name (enintään 64) näkyy ikkunassa muodossa "Pelaaja: …". Anna pelisi asiakassovellukselle vain link_code, qr_url ja deep_link. device_code on kyselykahvasi ja pysyy palvelimella.

Pelisi näyttää sitten kolme asiaa yhtä aikaa, koska pelaaja voi olla missä tahansa:

  • QR-koodin osoitteesta qr_url. Puhelin, jossa on mssgs, avaa sen suoraan sovelluksen hyväksyntäikkunaan. Ilman sovellusta se päätyy mss.gs:n sivulle, joka näyttää koodin ja tarjoaa latausta.
  • "Avaa mssgs:ssä" -painikkeen, jossa on deep_link, työpöytäselaimelle, joka on työpöytäsovelluksen vieressä. Se on ainoa ulkoinen URL, jonka pelisi koskaan tarvitsee avata.
  • Itse koodin kahtena neljän merkin ryhmänä, kirjoitettavaksi kohdassa Asetukset → Pelitoiminta → Liitä peli. Merkistössä ei ole 0/O:ta eikä 1/I:tä, joten kirjoittaminen menee harvoin pieleen.

Mitä pelaaja näkee mssgs:ssä, sovelluksen rekisteröinnin perusteella piirtämänä:

Yhdistetäänkö CozyCity mssgs-tiliisi?

CozyCity voi näyttää mssgs-tilassasi, mitä pelaat. Se ei näe viestejäsi, kavereitasi tai palvelimiasi eikä voi kirjoittaa nimissäsi.
Pelaaja: Renén kaupunki · Yhdistä / Ei nyt

Sillä välin taustajärjestelmäsi kyselee interval sekunnin välein (nopeampaan vastataan 429 SLOW_DOWN), kunnes tila vaihtuu. Koodi toimii kerran ja vanhenee kymmenen minuutin kuluttua:

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"}      # pelaaja valitsi Ei nyt
# {"status":"expired"}
# {"status":"linked","link_guid":"…","user":{"user_guid":"62e377…"}}

Tallenna link_guid pelaajasi yhteyteen; tästä lähtien se on osoite, jolle julkaiset. Vastaus sisältää vain user_guid:n; username lisätään vain, kun rekisteröinnilläsi on identity.link-scope, eikä sen lisäksi ole mitään. Toinen hyväksyntä samalle player_ref:lle korvaa aiemman liitoksen, joten yksi pelisi pelaaja on yksi mssgs-tili. Sama mssgs-tili voi olla liitetty useaan peliin ja saman pelin useaan player_ref:iin (perheen iPad).

3. Julkaise pelaamistila

Sama lohko kuin sillassa, samoin säännöin ja samoin rajoin, nyt vain liitoskohtaisesti ja backend-avaimellasi:

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=…" }
  }
}
Vastaukset
200 {"published":true,"changed":true}     # lohko muuttui ja se lähetettiin
200 {"published":true,"changed":false}    # sama kuin tallennettu; vain TTL päivitettiin
204                                        # tallennettu, mutta pelaaja ei ole juuri nyt paikalla mssgs:ssä
410 {"error":"LINK_REVOKED"}               # pelaaja katkaisi yhteyden: pudota liitos

Käsittele 200 ja 204 samoin: tallennettu. { "activity": null } tyhjentää lohkon; lähetä se, kun pelaaja lopettaa. Yksi ero siltaan: join.url:n isännän on oltava jokin rekisteröidyistä taustajärjestelmistäsi (tai sen aliverkkotunnus), tai saat 400 INVALID_PAYLOAD. Taustajärjestelmä ei siis voi laittaa pelaajan tilaan Liity nyt -painiketta, joka vie paikkaan, jossa pelaaja ei ole koskaan pelannut.

Heartbeat 60 sekunnin välein, TTL 120

Julkaistu tila elää 120 sekuntia ilman uutta viestiä ja poistuu sitten itsestään. Lähetä siis sama lohko uudelleen 60 sekunnin välein; muuttumaton lohko ei maksa mitään ja vain päivittää TTL:n. Jos heartbeatisi lakkaa, "Pelaa peliä …" -rivi lakkaa, mikä on juuri tarkoitus.

Kun paikalla on satoja pelaajia, lähetä heartbeat yhdellä kutsulla, enintään 100 kohdetta kerrallaan. Jokainen kohde saa oman tilansa, joten yksi pelaaja, joka katkaisi yhteyden mssgs:ssä, ei koskaan pysäytä muita yhdeksääkymmentäyhdeksää:

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 } ] }

Miten tila näytetään

  • Samoin kuin sillan kautta tuleva tila: Pelaa peliä CozyCity · Lantern Hollow · 6/40 pelaajaa, ja Liity nyt, kun join.url on annettu. Lohkoon merkitään palvelinpuolella via: "backend", joten sovellus voi lisätä tekstin "Jakaa pelin palvelin".
  • Vain kun pelaaja on paikalla mssgs:ssä. Kun mikään mssgs-sovellus ei ole auki, tili on poissa ja pysyy poissa; taustajärjestelmäsi ei voi saada ketään näyttämään paikalla olevalta. Se estää myös tätä reittiä muuttumasta "onko René koneellaan" -majakaksi.
  • Etusijajärjestys: sovelluksen sisäinen peli > sillan kautta tuleva peli > taustajärjestelmäsi. Jos pelaaja istahtaa pelaamaan shakkia mssgs:ssä samalla kun taustajärjestelmäsi lähettää heartbeatia, shakki voittaa, ei viimeisin kirjoittaja.

Yhteyden katkaiseminen

Pelaaja näkee jokaisen liitoksen kohdassa Asetukset → Pelitoiminta → Liitetyt pelit kuvakkeesi ja nimesi, pelisi pelaajanimen, liittämisajan ja viimeisimmän julkaisun kera, sekä Katkaise yhteys -painikkeen. Sen jälkeen seuraava julkaisusi vastaa 410 LINK_REVOKED; siitä pelisi saa tietää. Pudota link_guid ja tarjoa taas "Yhdistä mssgs". Omalta puoleltasi lopetat liitoksen kutsulla DELETE /game-sdk/v1/links/{link_guid}.

Rajat

Liitosta kohden muutos lasketaan enintään 2 sekunnin välein; muuttumaton heartbeat on ilmainen. Avainta kohden sallitaan 600 pyyntöä minuutissa, ja batch-kohteet lasketaan yksitellen: 300 pelaajan heartbeat 60 sekunnin välein käyttää 5 pyyntöä 600:sta.

Päätepisteviite: silta

Perus-URL http://127.0.0.1:<port>. Kaikki paitsi kolme ensimmäistä vaativat otsakkeen Authorization: Bearer <token>.

Metodi Polku Scope Mitä se tekee
GET /mssgs/v1/hello ei mitään Onko mssgs täällä, mitä se puhuu ja onko joku kirjautunut. Ainoa reitti, joka ei tarvitse tokenia, eikä se kerro pelaajasta mitään.
POST /mssgs/v1/authorize ei mitään Pyydä pelaajalta lupaa. Avaa ikkunan sovelluksessa ja palauttaa request_id:n kyseltäväksi.
GET /mssgs/v1/authorize/:request_id ei mitään pending, approved (tokenin kera), denied tai expired.
GET /mssgs/v1/me identity Kirjautunut pelaaja. Lisää is_staff / is_moderator vain staff-scopella.
GET /mssgs/v1/membership membership.query Jäsenyys antamissasi server_guid-arvoissa (enintään 10, toistettuna tai pilkuilla eroteltuna).
GET /mssgs/v1/servers servers.list Jokainen yhteisö, jossa pelaaja on, rooleineen. Yksityisviestit eivät ole koskaan mukana.
PUT /mssgs/v1/activity presence.write Julkaise "Pelaa peliä …" -lohko. Palauttaa TTL:n ja sen, kuinka usein heartbeat lähetetään.
POST /mssgs/v1/activity/heartbeat presence.write Pidä julkaistu aktiviteetti hengissä lähettämättä sitä uudelleen.
DELETE /mssgs/v1/activity presence.write Tyhjennä se heti, hallittua sammutusta varten.
GET /mssgs/v1/events presence.write Peliisi kohdistetut liittymisen luovutukset. Kysele parametrilla ?since=<cursor>.
GET /mssgs/v1/session ei mitään Mitä tällä tokenilla on: game_id, myönnetyt scopet ja onko joku kirjautunut.
DELETE /mssgs/v1/session ei mitään Palauta lupa. Sama vaikutus kuin jos pelaaja peruisi sen asetuksista.

Päätepisteviite: liitetyt taustajärjestelmät

Perus-URL https://ams1-gateway.mss.gs. Jokainen reitti vaatii otsakkeen Authorization: Bearer <backend key> ja rekisteröinnillesi activity.write-scopen; vastaukset lähetetään otsakkeella Cache-Control: no-store. Kutsu näitä palvelimeltasi, älä koskaan pelin asiakassovelluksesta.

Metodi Polku Mitä se tekee
POST /game-sdk/v1/link/start Aloita liitos yhdelle pelaajistasi ({ player_ref, player_name? }). Palauttaa link_code-, device_code-, qr_url-, deep_link-, expires_in- ja interval-arvot.
POST /game-sdk/v1/link/poll { device_code } → pending, denied, expired tai linked, jolloin mukana ovat link_guid ja user.
DELETE /game-sdk/v1/links/{link_guid} Lopeta liitos omalta puoleltasi. Pelaaja voi tehdä saman asetuksista.
PUT /game-sdk/v1/links/{link_guid}/activity Julkaise "Pelaa peliä …" -lohko yhdelle pelaajalle; { "activity": null } tyhjentää sen.
POST /game-sdk/v1/activity/batch Sama enintään 100 pelaajalle yhdellä kutsulla. Jokainen kohde vastaa erikseen.

Virhekoodit

Virheet palautetaan muodossa {"error":"CODE","message":"…"} vastaavan HTTP-tilakoodin kanssa.

Koodi Merkitys
401 UNAUTHORIZEDToken puuttuu tai on tuntematon; valtuuta ensin.
403 MISSING_SCOPEPelaaja ei myöntänyt tätä lupaa. Hän on ehkä poistanut sen valinnan.
403 ORIGIN_NOT_ALLOWEDPyynnössä oli selaimen Origin. Katso "Vain natiivipelit" alempana.
409 NOT_SIGNED_INmssgs on käynnissä, mutta kukaan ei ole kirjautunut.
429 RATE_LIMITEDYli 120 pyyntöä minuutissa yhdeltä peliltä.
400 INVALID_GAME_IDgame_id saa sisältää vain kirjaimia, numeroita, pisteen, yhdysmerkin tai alaviivan.
400 TOO_MANY_GUIDSEnintään 10 server_guid-arvoa jäsenyyskutsua kohden.

Liitetyt taustajärjestelmät

Taustajärjestelmän reitit käyttävät samaa muotoa. Batchin sisällä tila palautetaan kohdekohtaisesti results-kentässä, joten yksi päättynyt liitos ei koskaan kaada koko kutsua.

Koodi Merkitys
401 INVALID_BACKEND_KEYTuntematon avain tai avain, joka vaihdettiin pois yli 24 tuntia sitten.
403 SCOPE_NOT_GRANTEDRekisteröinnilläsi ei ole reitin tarvitsemaa scopea.
400 INVALID_PAYLOADVirheellinen runko, yli 100 batch-kohdetta tai join.url, jonka isäntä ei ole yksi rekisteröidyistä taustajärjestelmistäsi.
400 INVALID_ACTIVITYNormalisoinnin jälkeen käyttökelpoista nimeä ei jäänyt.
410 LINK_REVOKEDLiitos päättyi, jommallakummalla puolella. Pudota se ja tarjoa taas "Yhdistä mssgs".
429 SLOW_DOWNKyselit link/poll-päätepistettä interval-arvoa tiheämmin.
429 RATE_LIMITEDYhteen liitokseen tehtiin muutos alle 2 sekuntia edellisen jälkeen, tai avaimellasi tehtiin yli 600 pyyntöä minuutissa.
503 LINK_STORE_UNAVAILABLETilapäinen vika meidän päässämme. Yritä uudelleen seuraavan heartbeatin yhteydessä.

Tietoturva

Vain natiivipelit

Pyynnöt, joissa on verkkosivun Origin, hylätään koodilla 403 ORIGIN_NOT_ALLOWED. Jos mikä tahansa verkkosivu voisi havaita, että käytät mssgs:ää, ja avata lupaikkunan, se olisi sormenjälkien keräämisen ja tietojenkalastelun väylä, ei ominaisuus. Natiivipeli ei lähetä Originia lainkaan, joten se ei vaikuta siihen, ja pelin oma upotettu selain sallitaan nimeltä, katso FiveM. Jos rakennat selain- tai puhelinpeliä, et keskustele sillan kanssa: oma taustajärjestelmäsi julkaisee liitetyille pelaajille, katso Selain- ja puhelinpelit.

Mitä pelaaja pitää hallussaan

  • Pelaaja voi kytkeä sillan pois kohdassa Asetukset → Pelitoiminta, minkä jälkeen yksikään peli ei näe mssgs:ää lainkaan.
  • Jokainen hyväksytty peli on listattu siellä täsmälleen niine oikeuksineen, jotka sillä on, viimeisimmän aktiivisuusajan ja Poista-painikkeen kera. Poisto on välitön: token kuolee heti.
  • Liitetty selain- tai puhelinpeli on listattu kohdassa Liitetyt pelit, ja siinä on Katkaise yhteys -painike. Yhteyden katkaisu on myös välitön: taustajärjestelmän seuraava julkaisu saa vastauksen 410.
  • Silta kuuntelee vain osoitetta 127.0.0.1, ei koskaan verkkoa.
  • Yksityisviestejä ei koskaan paljasteta, ei edes servers.list-scopella.
  • Jokaisella pelillä on 120 pyynnön minuuttikohtainen kiintiö.

Hyvät tavat

  • Pyydä scopeja silloin, kun tarvitset niitä, äläkä kaikkia kerralla ensimmäisellä käynnistyskerralla.
  • Toimi ilman mssgs:ää: pelaajalla ei tarvitse olla sitä.
  • Tyhjennä tilasi, kun pelaaminen loppuu, äläkä odota TTL:n umpeutumista.
  • Käsittele evättyä scopea tavallisena lopputuloksena, ei virheenä.

Jatka rakentamista