# Berbagi, teman, dan undangan di game PlayDrop

Bagikan game dengan gambar atau klip, baca payload peluncuran, pilih teman, kirim kartu undangan dan tantangan di PlayDrop Chat, serta rekomendasikan game lain.

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

PlayDrop menangani lembar berbagi, daftar teman, dan chat; game Anda memintanya pada saat yang tepat. Pemain mengajak teman mereka, dan teman-teman itu langsung masuk ke game Anda.

## Bagikan game

Panggil `sdk.host.share()` dari ketukan atau klik. Panggilan ini membagikan halaman publik game dengan teks opsional, gambar atau video pendek, serta payload peluncuran opsional.

```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`: Blob GIF, JPEG, PNG, atau WebP berukuran hingga 8 MiB. Host yang tidak bisa melampirkan gambar hanya membagikan tautannya.
- `video`: Blob MP4 berdurasi maksimal 15 detik dan berukuran maksimal 20.000.000 byte, sebagai pengganti gambar. H.264/AAC pada 1080p dengan rasio 16:9, 9:16, atau 1:1 memberikan hasil terbaik. Host yang tidak mendukung video menolak dengan `host_share_video_unsupported` alih-alih membagikan tautan biasa.
- Siapkan Blob sebelum ketukan; membuatnya setelah ketukan bisa membuat browser mencabut izin untuk berbagi.
- Anda tidak bisa membagikan URL kustom atau berkas lain. Tautannya selalu halaman game.

Kesalahan gambar adalah `invalid_host_share_image`, `host_share_image_type`, dan `host_share_image_too_large`.

## Baca payload peluncuran

`payload` berisi hingga 256 karakter base64url. Pemain yang membuka tautan yang dibagikan memulai game dengan `sdk.host.launchPayload` berisi nilai itu, atau `null`. Perlakukan sebagai input yang tidak tepercaya: validasi, dan periksa di server Anda bahwa pemain boleh bergabung ke room yang disebutkannya. Jangan pernah memasukkan kredensial ke dalamnya.

## Pilih teman dan kirim kartu game

`sdk.social.selectFriends({ max })` membuka pemilih teman PlayDrop (1 sampai 10, default 1) dan hanya mengembalikan teman yang dipilih pemain, atau `[]` jika mereka membatalkan. Lalu kirim kartu yang muncul di 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` bernilai `invite`, `request`, `gift`, `challenge`, atau `turn`.
- `title` berisi hingga 80 karakter dan `subtitle` hingga 160.
- `expiresInSeconds` berkisar dari 60 detik hingga 30 hari (default).
- `clientMessageId` membuat percobaan ulang aman: memakainya lagi akan mengembalikan pesan aslinya.
- Anda bisa mengirim pesan kepada teman yang dipilih pemain, teman yang memainkan game ini, dan pemain yang sudah bertukar pesan game dengannya. Orang asing yang ditemui lewat matchmaking tidak bisa dikirimi pesan.

Baca kartu yang masuk dengan `getMessages({ limit })`, mulai dari yang terlama, lalu tandai masing-masing sebagai sudah ditangani dengan `consumeMessage(message.id)`. Pengirimnya adalah `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);
}
```

Lanjutkan dengan `cursor: page.nextCursor` sampai nilainya `null`.

## Teman yang memainkan game ini

`sdk.social.listGameFriends()` mengembalikan teman yang baru-baru ini punya sesi di game ini: daftar yang cocok untuk tombol "main bersama". Panggilan ini tidak menampilkan daftar teman lengkap atau status kehadiran. `openProfile(userId)` membuka profil pemain dan `openChat({ recipientUserId, draftMessage })` membuka Chat dengan draf yang bisa diedit dan dikirim sendiri oleh pemain.

Pemain baru yang datang dari seorang teman mungkin memiliki `sdk.host.launchFriend`. Tawarkan untuk bermain bersama teman itu dan konfirmasikan dengan `selectFriends({ max: 1 })`; jangan pernah memulai apa pun secara otomatis.

## Rekomendasikan game lain

Pada jeda alami, seperti saat game over, `sdk.host.showGames({ games: ["@creator/name"] })` menampilkan kartu PlayDrop untuk satu sampai tiga game publik lain dan menjeda game Anda. Panggilan ini selesai dengan `played` (PlayDrop lalu berpindah game) atau `dismissed`. `sdk.host.preloadGame(ref)` memberi petunjuk tentang game yang mungkin dibuka pemain berikutnya.

## Persyaratan

Panggilan berbagi dan sosial memerlukan [paket](https://www.playdrop.ai/id/create/learn/packaging) yang memakai SDK. Fitur teman memerlukan pemain yang sudah masuk. Jendela milik host menjeda game; tangani [jeda dan lanjut](https://www.playdrop.ai/id/create/learn/lifecycle).

## Panduan terkait

- [Grup online dan suara](https://www.playdrop.ai/id/create/learn/online-party): Ajak teman bermain online bersama: deklarasikan ukuran grup, buka jendela grup PlayDrop, gabung ke room lewat sdk.multiplayer.join, dan atur suara ruang.
- [Visibilitas dan jangkauan](https://www.playdrop.ai/id/create/learn/distribution): Pilih siapa yang bisa membuka game PlayDrop, cara kerja default akun dan penerbitan versi, serta cara Boost, Tukar main, Instan, dan pencarian menarik pemain.
- [Papan peringkat](https://www.playdrop.ai/id/create/learn/leaderboards): Deklarasikan papan peringkat di catalogue.json, kirim skor lewat sdk.leaderboards, tampilkan peringkat teratas dan sekitar pemain. Jenis skor, batas, aturan.
