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
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.
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.
{
"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.
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ä.
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.
{
"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:
{ "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 |
server | 4/100 pelaajaa | pelipalvelin (FiveM, yhteisöpalvelin) |
lobby | 4/100 pelaajaa | aula ennen ottelun alkua |
match | 4/100 pelaajaa | kä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:
{
"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.
-- 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)
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ä.
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ä:
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:
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:
{
"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=…" }
}
}
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ää:
{ "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.urlon annettu. Lohkoon merkitään palvelinpuolellavia: "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 UNAUTHORIZED | Token puuttuu tai on tuntematon; valtuuta ensin. |
403 MISSING_SCOPE | Pelaaja ei myöntänyt tätä lupaa. Hän on ehkä poistanut sen valinnan. |
403 ORIGIN_NOT_ALLOWED | Pyynnössä oli selaimen Origin. Katso "Vain natiivipelit" alempana. |
409 NOT_SIGNED_IN | mssgs on käynnissä, mutta kukaan ei ole kirjautunut. |
429 RATE_LIMITED | Yli 120 pyyntöä minuutissa yhdeltä peliltä. |
400 INVALID_GAME_ID | game_id saa sisältää vain kirjaimia, numeroita, pisteen, yhdysmerkin tai alaviivan. |
400 TOO_MANY_GUIDS | Enintää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_KEY | Tuntematon avain tai avain, joka vaihdettiin pois yli 24 tuntia sitten. |
403 SCOPE_NOT_GRANTED | Rekisteröinnilläsi ei ole reitin tarvitsemaa scopea. |
400 INVALID_PAYLOAD | Virheellinen runko, yli 100 batch-kohdetta tai join.url, jonka isäntä ei ole yksi rekisteröidyistä taustajärjestelmistäsi. |
400 INVALID_ACTIVITY | Normalisoinnin jälkeen käyttökelpoista nimeä ei jäänyt. |
410 LINK_REVOKED | Liitos päättyi, jommallakummalla puolella. Pudota se ja tarjoa taas "Yhdistä mssgs". |
429 SLOW_DOWN | Kyselit link/poll-päätepistettä interval-arvoa tiheämmin. |
429 RATE_LIMITED | Yhteen liitokseen tehtiin muutos alle 2 sekuntia edellisen jälkeen, tai avaimellasi tehtiin yli 600 pyyntöä minuutissa. |
503 LINK_STORE_UNAVAILABLE | Tilapä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ä.