# Jakaminen, ystävät ja kutsut PlayDrop-peleissä

Jaa peli kuvan tai leikkeen kera, lue käynnistysdata, valitse ystäviä, lähetä kutsu- ja haastekortteja PlayDrop Chatissa ja suosittele muita pelejä.

Source: https://www.playdrop.ai/fi/create/learn/social

PlayDrop hoitaa jakovalikon, ystävälistan ja chatin; pelisi pyytää niitä oikealla hetkellä. Pelaajat tuovat ystävänsä, ja ystävät päätyvät suoraan peliisi.

## Jaa peli

Kutsu `sdk.host.share()` napautuksesta tai klikkauksesta. Se jakaa pelin julkisen sivun valinnaisen tekstin, kuvan tai lyhyen videon sekä valinnaisen käynnistysdatan kera.

```js
shareButton.addEventListener("click", async () => {
  try {
    await sdk.host.share({ text: `I reached level ${level} in Moon Jump`, image: scoreCardBlob, payload: "level-7" });
  } catch (error) {
    console.warn("Share failed", error);
  }
});
```

- `image`: GIF-, JPEG-, PNG- tai WebP-muotoinen Blob, enintään 8 MiB. Isännät, jotka eivät voi liittää kuvia, jakavat pelkän linkin.
- `video`: kuvan sijaan MP4-muotoinen Blob, enintään 15 sekuntia ja 20 000 000 tavua. H.264/AAC 1080p-tarkkuudella kuvasuhteessa 16:9, 9:16 tai 1:1 toimii parhaiten. Isännät ilman videotukea hylkäävät jakamisen virheellä `host_share_video_unsupported` sen sijaan, että jakaisivat pelkän linkin.
- Valmistele Blob ennen napautusta; jos luot sen vasta napautuksen jälkeen, selaimen lupa jakaa voi raueta.
- Et voi jakaa omaa URL-osoitetta tai muita tiedostoja. Linkki on aina pelin sivu.

Kuvavirheet ovat `invalid_host_share_image`, `host_share_image_type` ja `host_share_image_too_large`.

## Lue käynnistysdata

`payload` on enintään 256 base64url-merkkiä. Kun pelaaja avaa jaetun linkin, peli käynnistyy niin, että `sdk.host.launchPayload` sisältää tämän datan; muuten arvo on `null`. Käsittele sitä epäluotettavana syötteenä: tarkista se ja varmista palvelimellasi, että pelaaja saa liittyä sen nimeämään huoneeseen. Älä koskaan laita siihen tunnistetietoja.

## Valitse ystäviä ja lähetä pelikortteja

`sdk.social.selectFriends({ max })` avaa PlayDropin ystävävalitsimen (1–10, oletus 1) ja palauttaa vain pelaajan valitsemat ystävät tai `[]`, jos pelaaja peruuttaa. Lähetä sitten kortti, joka näkyy PlayDrop Chatissa:

```js
const [friend] = await sdk.social.selectFriends({ max: 1 });
if (friend) {
  await sdk.social.sendMessage({
    recipientUserId: friend.id,
    type: "challenge",
    title: "Beat my time: 42.3 s",
    subtitle: "Moon Jump, level 7",
    payload: "level-7",
    clientMessageId: `challenge-${runId}-${friend.id}`,
  });
}
```

- `type` on `invite`, `request`, `gift`, `challenge` tai `turn`.
- `title` on enintään 80 merkkiä ja `subtitle` enintään 160.
- `expiresInSeconds` on 60 sekunnista 30 päivään (oletus).
- `clientMessageId` tekee uudelleenyrityksestä turvallisen: sen uudelleenkäyttö palauttaa alkuperäisen viestin.
- Voit lähettää viestejä pelaajan valitsemille ystäville, tätä peliä pelaaville ystäville ja pelaajille, joiden kanssa hän jo vaihtaa peliviestejä. Ottelunhaussa tavatuille tuntemattomille ei voi lähettää viestejä.

Lue saapuvat kortit kutsulla `getMessages({ limit })` vanhimmasta alkaen ja merkitse kukin käsitellyksi kutsulla `consumeMessage(message.id)`. Lähettäjä on `message.from.id`.

```js
const page = await sdk.social.getMessages({ limit: 20 });
for (const message of page.messages) {
  await applyCard(message.type, message.from.id, message.payload);
  await sdk.social.consumeMessage(message.id);
}
```

Jatka arvolla `cursor: page.nextCursor`, kunnes se on `null`.

## Tätä peliä pelaavat ystävät

`sdk.social.listGameFriends()` palauttaa ystävät, joilla on tuore istunto tässä pelissä: hyvä luettelo ”pelaa yhdessä” -painikkeille. Se ei paljasta koko ystävälistaa eikä paikallaolotietoja. `openProfile(userId)` avaa pelaajan profiilin, ja `openChat({ recipientUserId, draftMessage })` avaa Chatin muokattavalla luonnoksella, jonka pelaaja lähettää itse.

Uudella pelaajalla, joka saapui ystävän kautta, voi olla asetettuna `sdk.host.launchFriend`. Tarjoa mahdollisuutta pelata tämän ystävän kanssa ja vahvista kutsulla `selectFriends({ max: 1 })`; älä koskaan käynnistä mitään automaattisesti.

## Suosittele muita pelejä

Luonnollisessa tauossa, kuten pelin päättyessä, `sdk.host.showGames({ games: ["@creator/name"] })` näyttää PlayDrop-kortit yhdestä kolmeen muusta julkisesta pelistä ja keskeyttää oman pelisi. Se palauttaa arvon `played` (PlayDrop vaihtaa silloin peliä) tai `dismissed`. `sdk.host.preloadGame(ref)` vihjaa pelistä, jonka pelaaja saattaa avata seuraavaksi.

## Vaatimukset

Jakaminen ja sosiaalisten toimintojen SDK-kutsut vaativat [paketin](https://www.playdrop.ai/fi/create/learn/packaging), joka käyttää SDK:ta. Ystäväominaisuudet vaativat kirjautuneen pelaajan. Isännän omat ikkunat keskeyttävät pelin; huolehdi [tauosta ja jatkamisesta](https://www.playdrop.ai/fi/create/learn/lifecycle).

## Liittyvät oppaat

- [Verkkoryhmät ja puhe](https://www.playdrop.ai/fi/create/learn/online-party): Anna ystävien pelata yhdessä: ilmoita ryhmäkoot, avaa ryhmäikkuna, liity varattuihin huoneisiin sdk.multiplayer.join-kutsulla ja hallitse huoneen puhetta.
- [Näkyvyys ja tavoittavuus](https://www.playdrop.ai/fi/create/learn/distribution): Valitse, kuka voi avata PlayDrop-pelin, miten tilin oletus ja versioiden julkaisu toimivat ja miten Boost, Pelivaihto, Instant ja haku tuovat uusia pelaajia.
- [Tulostaulut](https://www.playdrop.ai/fi/create/learn/leaderboards): Määrittele tulostaulut catalogue.jsonissa, lähetä pisteet sdk.leaderboards-rajapinnalla ja näytä kärki ja pelaajan naapurit. Pistetyypit, rajat ja päivityssäännöt.
