# การแชร์ เพื่อน และคำเชิญในเกม PlayDrop

แชร์เกมพร้อมภาพหรือคลิป อ่านข้อมูลแนบตอนเปิดเกม เลือกเพื่อน ส่งการ์ดคำเชิญและการ์ดท้าแข่งใน PlayDrop Chat และแนะนำเกมอื่น

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

PlayDrop ดูแลหน้าต่างแชร์ รายชื่อเพื่อน และแชทให้ เกมของคุณเพียงเรียกใช้ในจังหวะที่เหมาะสม ผู้เล่นชวนเพื่อนมา และเพื่อนก็เข้ามาในเกมของคุณ

## แชร์เกม

เรียก `sdk.host.share()` จากการแตะหรือคลิก ฟังก์ชันนี้แชร์หน้าสาธารณะของเกมพร้อมข้อความ ภาพ หรือวิดีโอสั้นที่ไม่บังคับ และข้อมูลแนบตอนเปิดเกมที่ไม่บังคับ

```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 หรือ WebP ขนาดไม่เกิน 8 MiB โฮสต์ที่แนบภาพไม่ได้จะแชร์เฉพาะลิงก์
- `video`: Blob แบบ MP4 ยาวไม่เกิน 15 วินาทีและไม่เกิน 20,000,000 ไบต์ ใช้แทนภาพ H.264/AAC ที่ 1080p ในสัดส่วน 16:9, 9:16 หรือ 1:1 ใช้ได้ดีที่สุด โฮสต์ที่ไม่รองรับวิดีโอจะปฏิเสธด้วย `host_share_video_unsupported` แทนที่จะแชร์ลิงก์ธรรมดา
- เตรียม Blob ไว้ก่อนการแตะ หากสร้างหลังการแตะ เบราว์เซอร์อาจไม่อนุญาตให้แชร์แล้ว
- คุณแชร์ URL ที่กำหนดเองหรือไฟล์อื่นไม่ได้ ลิงก์จะเป็นหน้าเกมเสมอ

ข้อผิดพลาดของภาพคือ `invalid_host_share_image`, `host_share_image_type` และ `host_share_image_too_large`

## อ่านข้อมูลแนบตอนเปิดเกม

`payload` ยาวได้สูงสุด 256 ตัวอักษรแบบ base64url ผู้เล่นที่เปิดลิงก์ที่แชร์จะเริ่มเกมโดยมี `sdk.host.launchPayload` เป็นค่านั้น หรือเป็น `null` ให้ถือว่าเป็นอินพุตที่ไม่น่าเชื่อถือ: ตรวจสอบความถูกต้อง และตรวจสอบบนเซิร์ฟเวอร์ว่าผู้เล่นเข้าห้องที่ระบุไว้ได้จริง ห้ามใส่ข้อมูลรับรองไว้ในนั้นเด็ดขาด

## เลือกเพื่อนและส่งการ์ดเกม

`sdk.social.selectFriends({ max })` เปิดตัวเลือกเพื่อนของ PlayDrop (1 ถึง 10 ค่าเริ่มต้นคือ 1) และส่งคืนเฉพาะเพื่อนที่ผู้เล่นเลือก หรือ `[]` หากยกเลิก จากนั้นส่งการ์ดที่จะแสดงใน 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` เป็น `invite`, `request`, `gift`, `challenge` หรือ `turn`
- `title` ยาวได้สูงสุด 80 ตัวอักษร และ `subtitle` สูงสุด 160
- `expiresInSeconds` อยู่ระหว่าง 60 วินาทีถึง 30 วัน (ค่าเริ่มต้น)
- `clientMessageId` ทำให้ลองใหม่ได้อย่างปลอดภัย: การใช้ค่าเดิมซ้ำจะส่งคืนข้อความเดิม
- คุณส่งข้อความถึงเพื่อนที่ผู้เล่นเลือก เพื่อนที่เล่นเกมนี้ และผู้เล่นที่เคยส่งข้อความในเกมถึงกันอยู่แล้วได้ คนแปลกหน้าที่เจอจากการจับคู่จะส่งข้อความถึงไม่ได้

อ่านการ์ดที่ได้รับด้วย `getMessages({ limit })` โดยเรียงจากเก่าสุดก่อน แล้วทำเครื่องหมายว่าจัดการแล้วทีละใบด้วย `consumeMessage(message.id)` ผู้ส่งคือ `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);
}
```

ทำต่อด้วย `cursor: page.nextCursor` จนกว่าจะเป็น `null`

## เพื่อนที่เล่นเกมนี้

`sdk.social.listGameFriends()` ส่งคืนเพื่อนที่มีเซสชันล่าสุดในเกมนี้: เหมาะสำหรับปุ่ม "เล่นกับ" ฟังก์ชันนี้ไม่เปิดเผยรายชื่อเพื่อนทั้งหมดหรือสถานะออนไลน์ `openProfile(userId)` เปิดโปรไฟล์ของผู้เล่น และ `openChat({ recipientUserId, draftMessage })` เปิดแชทพร้อมข้อความร่างที่แก้ไขได้ ซึ่งผู้เล่นจะส่งเอง

ผู้เล่นใหม่ที่มาจากเพื่อนอาจมีค่า `sdk.host.launchFriend` เสนอให้เล่นกับเพื่อนคนนั้นและยืนยันด้วย `selectFriends({ max: 1 })` ห้ามเริ่มอะไรโดยอัตโนมัติเด็ดขาด

## แนะนำเกมอื่น

ในช่วงพักตามธรรมชาติ เช่น ตอนจบเกม `sdk.host.showGames({ games: ["@creator/name"] })` จะแสดงการ์ด PlayDrop ของเกมสาธารณะอื่นหนึ่งถึงสามเกมและหยุดเกมของคุณชั่วคราว ฟังก์ชันนี้ส่งคืน `played` (แล้ว PlayDrop จะสลับเกม) หรือ `dismissed` ส่วน `sdk.host.preloadGame(ref)` บอกใบ้ถึงเกมที่ผู้เล่นอาจเปิดต่อไป

## ข้อกำหนด

การแชร์และการเรียกฟีเจอร์โซเชียลต้องใช้[แพ็กเกจ](https://www.playdrop.ai/th/create/learn/packaging)ที่ใช้ SDK ฟีเจอร์เพื่อนต้องมีผู้เล่นที่เข้าสู่ระบบแล้ว หน้าต่างของโฮสต์จะหยุดเกมชั่วคราว ให้จัดการ[การหยุดชั่วคราวและการเล่นต่อ](https://www.playdrop.ai/th/create/learn/lifecycle)

## คู่มือที่เกี่ยวข้อง

- [ปาร์ตี้ออนไลน์และแชทเสียง](https://www.playdrop.ai/th/create/learn/online-party): ให้เพื่อนเล่นด้วยกันออนไลน์: ประกาศขนาดปาร์ตี้ เปิดหน้าต่างปาร์ตี้ของ PlayDrop เข้าห้องที่จองไว้ด้วย sdk.multiplayer.join และควบคุมแชทเสียงในห้อง
- [การมองเห็นและการเข้าถึงผู้เล่น](https://www.playdrop.ai/th/create/learn/distribution): เลือกว่าใครเปิดเกม PlayDrop ได้ ค่าเริ่มต้นของบัญชีและการเผยแพร่เวอร์ชันทำงานอย่างไร และบูสต์ แลกกันเล่น Instant และการค้นหาพาผู้เล่นใหม่มาได้อย่างไร
- [ลีดเดอร์บอร์ด](https://www.playdrop.ai/th/create/learn/leaderboards): ประกาศลีดเดอร์บอร์ดใน catalogue.json ส่งคะแนนด้วย sdk.leaderboards และแสดงอันดับสูงสุดกับผู้เล่นรอบข้าง พร้อมชนิดคะแนน ขีดจำกัด และกฎการอัปเดต
