# Delning, vänner och inbjudningar i PlayDrop-spel

Dela ett spel med en bild eller ett klipp, läs startdata, välj vänner, skicka inbjudnings- och utmaningskort i PlayDrop Chat och rekommendera andra spel.

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

PlayDrop hanterar delningsvyn, vänlistan och chatten; ditt spel ber om dem vid rätt tillfälle. Spelarna tar med sina vänner, och vännerna hamnar i ditt spel.

## Dela spelet

Anropa `sdk.host.share()` från ett tryck eller klick. Det delar spelets offentliga sida med valfri text, en bild eller en kort video och valfri startdata.

```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`: en Blob i formatet GIF, JPEG, PNG eller WebP på upp till 8 MiB. Värdar som inte kan bifoga bilder delar bara länken.
- `video`: en MP4-Blob på högst 15 sekunder och 20 000 000 byte, i stället för en bild. H.264/AAC i 1080p i 16:9, 9:16 eller 1:1 fungerar bäst. Värdar utan stöd för video avvisar anropet med `host_share_video_unsupported` i stället för att dela en vanlig länk.
- Förbered Bloben före trycket; att generera den efter trycket kan göra att webbläsaren inte längre tillåter delningen.
- Du kan inte dela en egen URL eller andra filer. Länken är alltid spelets sida.

Bildfelen är `invalid_host_share_image`, `host_share_image_type` och `host_share_image_too_large`.

## Läs startdata

`payload` är upp till 256 base64url-tecken. En spelare som öppnar den delade länken startar spelet med `sdk.host.launchPayload` satt till det värdet, eller `null`. Behandla det som opålitlig indata: validera det och kontrollera på din server att spelaren får gå med i ett rum som det anger. Lägg aldrig inloggningsuppgifter i det.

## Välj vänner och skicka spelkort

`sdk.social.selectFriends({ max })` öppnar PlayDrops vänväljare (1 till 10, standard 1) och returnerar bara de vänner som spelaren valde, eller `[]` om spelaren avbryter. Skicka sedan ett kort som visas i PlayDrop Chat:

```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` är `invite`, `request`, `gift`, `challenge` eller `turn`.
- `title` har upp till 80 tecken och `subtitle` upp till 160.
- `expiresInSeconds` är från 60 sekunder till 30 dagar (standard).
- `clientMessageId` gör ett nytt försök säkert: om du återanvänder det returneras det ursprungliga meddelandet.
- Du kan skicka meddelanden till vänner som spelaren har valt, vänner som spelar det här spelet och spelare som spelaren redan utbyter spelmeddelanden med. Främlingar från matchningen kan inte få meddelanden.

Läs inkommande kort med `getMessages({ limit })`, äldst först, och markera sedan varje kort som hanterat med `consumeMessage(message.id)`. Avsändaren är `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);
}
```

Fortsätt med `cursor: page.nextCursor` tills det är `null`.

## Vänner som spelar det här spelet

`sdk.social.listGameFriends()` returnerar vänner med en nylig session i det här spelet: en bra lista för knappar som ”spela med”. Den visar inte hela vänlistan eller närvaro. `openProfile(userId)` öppnar en spelares profil och `openChat({ recipientUserId, draftMessage })` öppnar Chatt med ett redigerbart utkast som spelaren skickar själv.

En ny spelare som kom via en vän kan ha `sdk.host.launchFriend` satt. Erbjud att spela med vännen och bekräfta med `selectFriends({ max: 1 })`; starta aldrig något automatiskt.

## Rekommendera andra spel

Vid en naturlig paus, som när spelet är slut, visar `sdk.host.showGames({ games: ["@creator/name"] })` PlayDrop-kort för ett till tre andra offentliga spel och pausar ditt. Anropet slutförs med `played` (PlayDrop byter då spel) eller `dismissed`. `sdk.host.preloadGame(ref)` tipsar om spelet som spelaren kanske öppnar härnäst.

## Krav

Delning och sociala anrop kräver ett [paket](https://www.playdrop.ai/sv/create/learn/packaging) som använder SDK:t. Vänfunktioner kräver en inloggad spelare. Fönster som värden äger pausar spelet; hantera [paus och återupptagning](https://www.playdrop.ai/sv/create/learn/lifecycle).

## Relaterade guider

- [Onlinegrupper och röst](https://www.playdrop.ai/sv/create/learn/online-party): Låt vänner spela ihop online: deklarera gruppstorlekar, öppna PlayDrops gruppfönster, gå med i reserverade rum med sdk.multiplayer.join och styr rumsröst.
- [Synlighet och räckvidd](https://www.playdrop.ai/sv/create/learn/distribution): Välj vem som kan öppna ett PlayDrop-spel, hur kontots standard och versionspublicering fungerar och hur Boost, Spelutbyte, Instant och sök ger nya spelare.
- [Topplistor](https://www.playdrop.ai/sv/create/learn/leaderboards): Deklarera topplistor i catalogue.json, skicka poäng med sdk.leaderboards och visa toppen och spelarens grannar. Poängtyper, gränser och uppdateringsregler.
