@yyyu-star/arcade-kit 0.12.0 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # 更新日志
2
2
 
3
+ ## 0.12.2
4
+
5
+ - **"叫朋友来"面板** `openInvite({ game, room })`(`arcade-kit/social`;mountSocial 返回的 handle 上也有 `openInvite`,自动带上游戏名):0.12.0 只有 `sendInvite` 接口,游戏里没有叫人的界面。
6
+ - 列好友,在线的在前,写在哪("在<游戏名>的好友房 · 3/4""在大厅""3 天前来过");每人一个"叫他来",发出后变"已叫"、1 分钟内灰着(这一页里记着,关了再开也灰着)。
7
+ - 叫不了的换成大白话:429 等两分钟以内是"刚叫过他,过一会儿再叫",更久是"今天叫人的次数用完了,明天再叫";403 `not_friend` 是"叫不了他(可能已经不是好友了)"。
8
+ - 底下"复制邀请链接":能系统分享就分享,不能就复制,复制不了把链接写出来。`friends: false` 只有这个按钮(单独部署、没登录)。
9
+ - DOM,样式和 table-fun 一样(同一套颜色、圆角、44px 按钮);点空白处、✕、Esc 关掉;只在调用时碰 DOM。
10
+ - 新的纯函数 `whereText`、`inviteErrorText`,常数 `INVITE_GAP_MS`。
11
+ - 测试:`test/social.test.ts` 加两条(在哪的话、叫不了的话)。浏览器里用 `demo/social.html` 的"叫朋友来"按 390×844 和 1200×800 核对过:列表顺序和"在哪"、叫成功变"已叫"、被拒的、次数用完的、复制链接、Esc 关掉、再开还灰着,控制台零报错。
12
+
13
+ ## 0.12.1
14
+
15
+ - **social 的好友列表一直是空的**:`fetchFriends` 只认每项的 `id`、`name`,平台 `GET /api/friends` 每项一直是公开资料 `{ userId, displayName, avatar }`(`docs/platform-backend.md` 15.4),
16
+ 所以全被当成形状不对丢掉了,游戏里"叫他来"出不来。改成认 `userId` / `displayName`(也兼容 `id` / `name`),统一成 `Friend.id`、`Friend.name`,平台原样的字段(`avatar` 等)留着。新导出 `parseFriend`。
17
+ - 测试:按平台的真实形状加一条(`test/social.test.ts`)。邀请(`from: { id, name }`、`until` 毫秒)平台照这个形状做,不用改。
18
+
3
19
  ## 0.12.0
4
20
 
5
21
  社交第一期的两个部件(仓库根 `docs/social.md` 1.1–1.3;接口形状主线定、平台实现)。都只在调用时碰 DOM,import 时不碰;已有入口没改。
package/README.md CHANGED
@@ -395,7 +395,10 @@ social?.presenceNow(true); // 进房、换房时马上
395
395
  - 横条在页面顶上(让出刘海),一次一条,先到期的先弹;过期的、已经在那个房间里的不弹。"去"先 `dismiss`(keepalive)再跳 `/games/<id>/?room=<码>`,
396
396
  "不了"`dismiss` 后弹下一条,到期自己收起。按钮 `data-key` 是 `invite:go`、`invite:no`;`log` 给 `位置 204`、`邀请 弹 <id>`、`邀请 去`、`邀请 不了`、`邀请 过期`。
397
397
  - 发邀请 `sendInvite({ to, game, room })` → `{ ok: true, id }` 或 `{ ok: false, error: 'limit' | 'blocked' | 'login' | 'failed', retryAfter? }`(429 是每天 50 条、同一好友 1 分钟 1 条超了)。
398
- `fetchFriends()` 带 `online`、`where`(对方关了开关就没有),`setShowWhere(bool)` 改"让好友看到我在哪"。都带同源 cookie,写的请求带 `x-arcade: 1`。
398
+ `fetchFriends()` 把平台每项的公开资料 `{ userId, displayName, avatar }` 统一成 `id`、`name`(原样字段留着),带 `online`、`where`(对方关了开关就没有),`setShowWhere(bool)` 改"让好友看到我在哪"。都带同源 cookie,写的请求带 `x-arcade: 1`。
399
+ - **"叫朋友来"面板**(0.12.2):`social.openInvite({ game, room })`(`social` 是 `mountSocial` 的返回值;没挂上时用导出的 `openInvite({ game, room, friends: false })`,只有"复制邀请链接")。
400
+ 列好友(在线的在前,写在哪),每人一个"叫他来",发出后 1 分钟内是灰的"已叫",叫不了的写成大白话;底下"复制邀请链接"(能系统分享就分享)。
401
+ 样式和 table-fun 一样,z-index 默认 1600;按钮的 `data-key` 是 `invite:call:<好友 id>`、`invite:copy`、`invite:close`,`log` 给 `叫人 打开 <n>`、`叫人 <id> ok|limit|blocked|…`、`叫人 复制`、`叫人 关闭`。
399
402
  - 演示页 `demo/share.html`、`demo/social.html`(`npx vite` 后打开;社交用假 fetch,一进来就有几条邀请)。
400
403
 
401
404
  ## 房间怎么守规矩
package/dist/social.d.ts CHANGED
@@ -27,14 +27,20 @@ export interface Invite {
27
27
  room: string;
28
28
  until: number;
29
29
  }
30
- /** 好友列表的一项:平台的原样加 online、where(对方关了"让好友看到我在哪"就没有 where) */
30
+ /**
31
+ * 好友列表的一项。平台每项是公开资料 `{ userId, displayName, avatar }`(docs/platform-backend.md 15.4,只增不改)加 online、where
32
+ * (对方关了"让好友看到我在哪"就没有 where);kit 统一成 id、name(0.12.1),平台原样的字段也留着。发邀请的 `to` 用 id
33
+ */
31
34
  export interface Friend {
32
35
  id: string;
33
36
  name: string;
34
37
  online: boolean;
35
38
  where?: Presence;
39
+ avatar?: unknown;
36
40
  [k: string]: unknown;
37
41
  }
42
+ /** 平台的一项 → Friend:认 userId / displayName(平台的形状),也认 id / name;没有 id 的丢掉 */
43
+ export declare function parseFriend(x: unknown): Friend | null;
38
44
  export interface ApiOptions {
39
45
  fetchImpl?: typeof fetch;
40
46
  }
@@ -83,6 +89,19 @@ export declare function sendInvite(inv: {
83
89
  export declare function fetchFriends(opts?: ApiOptions): Promise<Friend[] | null>;
84
90
  /** "让好友看到我在哪"的开关 */
85
91
  export declare function setShowWhere(show: boolean, opts?: ApiOptions): Promise<boolean>;
92
+ /** "在哪"那一行:好友房带人数,在游戏里写游戏名(不认识的说"在玩游戏"),大厅;没给 where 按离线写几天前来过 */
93
+ export declare function whereText(f: Pick<Friend, 'online' | 'where'> & {
94
+ lastSeenDaysAgo?: unknown;
95
+ }, gameName?: (id: string) => string | undefined): string;
96
+ /**
97
+ * 叫不了的大白话(平台:429 rate_limited 带 Retry-After,同一个好友 1 分钟一条、每人 24 小时 50 条;403 not_friend:不是好友、屏蔽了、对方不存在一律这个)。
98
+ * 等的时间超过两分钟的是每天的次数用完了
99
+ */
100
+ export declare function inviteErrorText(r: Exclude<SendInviteResult, {
101
+ ok: true;
102
+ }>): string;
103
+ /** 叫过以后多久不能再叫同一个人(平台同一个好友 1 分钟一条) */
104
+ export declare const INVITE_GAP_MS = 60000;
86
105
  export interface SocialOptions extends ApiOptions {
87
106
  /**
88
107
  * 我现在在哪:每次报之前现问。返回 null 这次不报(比如还没进房)。
@@ -112,9 +131,38 @@ export interface SocialHandle {
112
131
  pollNow(): void;
113
132
  /** 收起横条、停掉计时、解开监听 */
114
133
  stop(): void;
134
+ /** 打开"叫朋友来"面板(0.12.2):列好友、"叫他来"、复制邀请链接。游戏名用 mountSocial 给的 gameName */
135
+ openInvite(inv: Omit<InvitePanelOptions, 'fetchImpl' | 'gameName'>): InvitePanel;
115
136
  }
116
137
  /**
117
138
  * 挂上报位置和收邀请。没平台、没登录、平台连不上都回 null(不挂);中途掉了登录(401)自己停
118
139
  */
119
140
  export declare function mountSocial(opts: SocialOptions): Promise<SocialHandle | null>;
141
+ export interface InvitePanelOptions extends ApiOptions {
142
+ /** 游戏 id、房间码:叫来的就是这个房间 */
143
+ game: string;
144
+ room: string;
145
+ /** 列好友、"叫他来"(有平台、已登录时);false 只有"复制邀请链接"(单独部署、没登录) */
146
+ friends?: boolean;
147
+ /** 邀请链接,默认 `<站点>/games/<id>/?room=<码>` */
148
+ url?: string;
149
+ /** 系统分享、复制时的那句话,默认"来一起玩!房间码 <码>" */
150
+ text?: string;
151
+ /** 游戏 id → 名字(好友"在哪"那一行) */
152
+ gameName?(id: string): string | undefined;
153
+ /** 默认 1600(在邀请横条之上,在分享预览之下) */
154
+ zIndex?: number;
155
+ /** 冒烟、调试看的流水:`叫人 打开 <n>`、`叫人 <id> ok|<错误>`、`叫人 复制`、`叫人 关闭` */
156
+ log?(line: string): void;
157
+ /** 测试用:时钟 */
158
+ now?(): number;
159
+ }
160
+ export interface InvitePanel {
161
+ close(): void;
162
+ }
163
+ /**
164
+ * 打开"叫朋友来"面板:列好友(在线的在前,写在哪),每人一个"叫他来",发出后变"已叫"、1 分钟内灰着,叫不了的换成大白话;
165
+ * 底下"复制邀请链接"(能系统分享就分享)。点空白处、✕、Esc 关掉。只发平台的 `POST /api/invites`,不写别的
166
+ */
167
+ export declare function openInvite(o: InvitePanelOptions): InvitePanel;
120
168
  //# sourceMappingURL=social.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../src/social.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../src/social.ts"],"names":[],"mappings":"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"}
package/dist/social.js CHANGED
@@ -9,6 +9,17 @@
9
9
  * - 接口形状是主线定的(docs/platform-backend.md 里平台写细节):都要登录,写的请求带 `x-arcade: 1`、同源(平台的 CSRF 规矩)。
10
10
  */
11
11
  import { detectPlatform } from './client.js';
12
+ /** 平台的一项 → Friend:认 userId / displayName(平台的形状),也认 id / name;没有 id 的丢掉 */
13
+ export function parseFriend(x) {
14
+ if (!x || typeof x !== 'object')
15
+ return null;
16
+ const f = x;
17
+ const id = typeof f['userId'] === 'string' ? f['userId'] : typeof f['id'] === 'string' ? f['id'] : null;
18
+ if (!id)
19
+ return null;
20
+ const name = typeof f['displayName'] === 'string' ? f['displayName'] : typeof f['name'] === 'string' ? f['name'] : '';
21
+ return { ...f, id, name, online: f['online'] === true };
22
+ }
12
23
  /** 位置每 2 分钟一次、邀请每 30 秒一次(docs/social.md) */
13
24
  export const PRESENCE_MS = 120_000;
14
25
  export const INVITE_POLL_MS = 30_000;
@@ -144,7 +155,7 @@ export async function fetchFriends(opts = {}) {
144
155
  const body = (await res.json());
145
156
  if (!Array.isArray(body?.friends))
146
157
  return null;
147
- return body.friends.filter((f) => f && typeof f.id === 'string').map((f) => ({ ...f, online: f.online === true }));
158
+ return body.friends.map(parseFriend).filter((f) => f !== null);
148
159
  }
149
160
  catch {
150
161
  return null;
@@ -159,6 +170,40 @@ export async function setShowWhere(show, opts = {}) {
159
170
  return false;
160
171
  }
161
172
  }
173
+ /** "在哪"那一行:好友房带人数,在游戏里写游戏名(不认识的说"在玩游戏"),大厅;没给 where 按离线写几天前来过 */
174
+ export function whereText(f, gameName) {
175
+ if (!f.online) {
176
+ const d = f.lastSeenDaysAgo;
177
+ return typeof d !== 'number' ? '不在线' : d <= 0 ? '今天来过' : d === 1 ? '昨天来过' : `${d} 天前来过`;
178
+ }
179
+ const w = f.where;
180
+ if (!w)
181
+ return '在线';
182
+ if (w.place === 'lobby')
183
+ return '在大厅';
184
+ const g = w.game ? gameName?.(w.game) : undefined;
185
+ if (w.place === 'room')
186
+ return `在${g ? `${g}的` : ''}好友房${w.seats ? ` · ${w.seats}` : ''}`;
187
+ return g ? `在${g}` : '在玩游戏';
188
+ }
189
+ /**
190
+ * 叫不了的大白话(平台:429 rate_limited 带 Retry-After,同一个好友 1 分钟一条、每人 24 小时 50 条;403 not_friend:不是好友、屏蔽了、对方不存在一律这个)。
191
+ * 等的时间超过两分钟的是每天的次数用完了
192
+ */
193
+ export function inviteErrorText(r) {
194
+ switch (r.error) {
195
+ case 'limit':
196
+ return r.retryAfter !== undefined && r.retryAfter > 120 ? '今天叫人的次数用完了,明天再叫' : '刚叫过他,过一会儿再叫';
197
+ case 'blocked':
198
+ return '叫不了他(可能已经不是好友了)';
199
+ case 'login':
200
+ return '登录过期了,刷新一下再叫';
201
+ default:
202
+ return '没发出去,过一会儿再试';
203
+ }
204
+ }
205
+ /** 叫过以后多久不能再叫同一个人(平台同一个好友 1 分钟一条) */
206
+ export const INVITE_GAP_MS = 60_000;
162
207
  const BANNER_ID = 'arcade-invite-banner';
163
208
  /**
164
209
  * 挂上报位置和收邀请。没平台、没登录、平台连不上都回 null(不挂);中途掉了登录(401)自己停
@@ -192,6 +237,14 @@ class Social {
192
237
  now() {
193
238
  return this.o.now?.() ?? Date.now();
194
239
  }
240
+ openInvite(inv) {
241
+ return openInvite({
242
+ ...inv,
243
+ ...(this.o.fetchImpl ? { fetchImpl: this.o.fetchImpl } : {}),
244
+ ...(this.o.gameName ? { gameName: this.o.gameName } : {}),
245
+ ...(this.o.now ? { now: this.o.now } : {}),
246
+ });
247
+ }
195
248
  visible() {
196
249
  return document.visibilityState === 'visible';
197
250
  }
@@ -332,4 +385,188 @@ class Social {
332
385
  this.hide();
333
386
  }
334
387
  }
388
+ const PANEL_ID = 'arcade-invite-panel';
389
+ const PANEL_CSS_ID = 'arcade-invite-css';
390
+ /** 和牌桌互动(table-fun)同一套颜色、圆角、按钮 */
391
+ const PANEL_CSS = `
392
+ .aiv-back{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:8px;box-sizing:border-box;background:rgba(0,0,0,.5);font-family:inherit;-webkit-tap-highlight-color:transparent}
393
+ .aiv-box{position:relative;display:flex;flex-direction:column;width:min(420px,calc(100vw - 16px));max-height:calc(100% - 16px);background:rgba(43,29,20,.97);border:2px solid #d4a64a;border-radius:14px;padding:12px;box-sizing:border-box;color:#fff6e0;box-shadow:0 6px 18px rgba(0,0,0,.45);animation:aiv-pop .14s ease-out}
394
+ .aiv-title{font-size:17px;font-weight:700;color:#f3d98b;margin:2px 48px 2px 4px}
395
+ .aiv-sub{font-size:13px;opacity:.75;margin:0 4px 8px}
396
+ .aiv-x{position:absolute;right:6px;top:6px;width:44px;height:44px;border:0;border-radius:22px;background:transparent;color:#f3d98b;font:inherit;font-size:22px;cursor:pointer}
397
+ .aiv-list{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:6px}
398
+ .aiv-row{display:flex;align-items:center;gap:8px;padding:6px 6px 6px 10px;border-radius:10px;background:#4a3220}
399
+ .aiv-dot{flex:none;width:10px;height:10px;border-radius:50%;background:#6a6a6a}.aiv-dot.aiv-on{background:#6fd36f}
400
+ .aiv-who{flex:1 1 auto;min-width:0}
401
+ .aiv-name{font-size:15px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
402
+ .aiv-where{font-size:12px;opacity:.75;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
403
+ .aiv-chip{flex:none;min-width:84px;min-height:44px;border:1px solid rgba(212,166,74,.6);border-radius:22px;background:#7a2a1e;color:#fff6e0;font:inherit;font-size:14px;font-weight:700;padding:0 12px;cursor:pointer}
404
+ .aiv-chip:disabled{background:#3a3a3a;cursor:default;opacity:.8}.aiv-chip.aiv-soft{background:#4a3220}
405
+ .aiv-note{font-size:13px;text-align:center;opacity:.85;padding:10px 4px;min-height:1em}
406
+ .aiv-err{color:#ffb0a0}
407
+ .aiv-foot{display:flex;justify-content:center;padding-top:10px}
408
+ @keyframes aiv-pop{from{opacity:0;scale:.94}to{opacity:1;scale:1}}
409
+ `;
410
+ /** 叫过的人什么时候能再叫(这一页里记着,关了面板再开也灰着) */
411
+ const calledUntil = new Map();
412
+ /**
413
+ * 打开"叫朋友来"面板:列好友(在线的在前,写在哪),每人一个"叫他来",发出后变"已叫"、1 分钟内灰着,叫不了的换成大白话;
414
+ * 底下"复制邀请链接"(能系统分享就分享)。点空白处、✕、Esc 关掉。只发平台的 `POST /api/invites`,不写别的
415
+ */
416
+ export function openInvite(o) {
417
+ const doc = document;
418
+ doc.getElementById(PANEL_ID)?.remove();
419
+ if (!doc.getElementById(PANEL_CSS_ID)) {
420
+ const st = doc.createElement('style');
421
+ st.id = PANEL_CSS_ID;
422
+ st.textContent = PANEL_CSS;
423
+ doc.head.appendChild(st);
424
+ }
425
+ const now = () => o.now?.() ?? Date.now();
426
+ const url = o.url ?? `${location.origin}${inviteUrl(o)}`;
427
+ const el = (tag, cls, text = '') => {
428
+ const e = doc.createElement(tag);
429
+ e.className = cls;
430
+ if (text)
431
+ e.textContent = text;
432
+ return e;
433
+ };
434
+ const back = el('div', 'aiv-back');
435
+ back.id = PANEL_ID;
436
+ back.style.zIndex = String(o.zIndex ?? 1600);
437
+ const box = el('div', 'aiv-box');
438
+ box.setAttribute('role', 'dialog');
439
+ box.setAttribute('aria-label', '叫朋友来');
440
+ const x = el('button', 'aiv-x', '✕');
441
+ x.type = 'button';
442
+ x.dataset['key'] = 'invite:close';
443
+ x.setAttribute('aria-label', '关闭');
444
+ const list = el('div', 'aiv-list');
445
+ const note = el('div', 'aiv-note', o.friends === false ? '把链接发给朋友,点开就进房' : '正在找好友…');
446
+ const copy = el('button', 'aiv-chip aiv-soft', '复制邀请链接');
447
+ copy.type = 'button';
448
+ copy.dataset['key'] = 'invite:copy';
449
+ const foot = el('div', 'aiv-foot');
450
+ foot.appendChild(copy);
451
+ box.appendChild(x);
452
+ box.appendChild(el('div', 'aiv-title', '叫朋友来'));
453
+ box.appendChild(el('div', 'aiv-sub', `房间码 ${o.room}`));
454
+ box.appendChild(list);
455
+ box.appendChild(note);
456
+ box.appendChild(foot);
457
+ back.appendChild(box);
458
+ doc.body.appendChild(back);
459
+ let closed = false;
460
+ const timers = new Set();
461
+ const onKey = (e) => {
462
+ if (e.key === 'Escape')
463
+ close();
464
+ };
465
+ const close = () => {
466
+ if (closed)
467
+ return;
468
+ closed = true;
469
+ for (const t of timers)
470
+ clearTimeout(t);
471
+ doc.removeEventListener('keydown', onKey);
472
+ back.remove();
473
+ o.log?.('叫人 关闭');
474
+ };
475
+ doc.addEventListener('keydown', onKey);
476
+ back.addEventListener('click', (e) => {
477
+ if (e.target === back)
478
+ close();
479
+ });
480
+ x.addEventListener('click', close);
481
+ copy.addEventListener('click', () => {
482
+ const text = o.text ?? `来一起玩!房间码 ${o.room}`;
483
+ const done = (msg, err = false) => {
484
+ note.textContent = msg;
485
+ note.classList.toggle('aiv-err', err);
486
+ o.log?.('叫人 复制');
487
+ };
488
+ const nav = navigator;
489
+ if (typeof nav.share === 'function') {
490
+ nav.share({ title: text, text, url }).then(() => done('发出去了'), (e) => (e?.name === 'AbortError' ? undefined : clip()));
491
+ return;
492
+ }
493
+ clip();
494
+ function clip() {
495
+ if (navigator.clipboard?.writeText)
496
+ navigator.clipboard.writeText(`${text}:${url}`).then(() => done('链接复制好了,发给朋友,点开就进房'), () => done(`把这个链接发给朋友:${url}`, true));
497
+ else
498
+ done(`把这个链接发给朋友:${url}`, true);
499
+ }
500
+ });
501
+ /** "叫他来"按钮的样子:叫过的 1 分钟内灰着,到点自己变回来 */
502
+ const paint = (b, id) => {
503
+ const left = (calledUntil.get(id) ?? 0) - now();
504
+ b.disabled = left > 0;
505
+ b.textContent = left > 0 ? '已叫' : '叫他来';
506
+ if (left > 0) {
507
+ const t = setTimeout(() => {
508
+ timers.delete(t);
509
+ if (!closed)
510
+ paint(b, id);
511
+ }, left);
512
+ timers.add(t);
513
+ }
514
+ };
515
+ const render = (friends) => {
516
+ note.textContent = friends.length ? '' : '还没有好友,先把链接发给朋友';
517
+ // 平台已经按在线、最近来过排好;这里再保证在线的在前(稳定排序)
518
+ const sorted = [...friends].sort((a, b) => Number(b.online) - Number(a.online));
519
+ for (const f of sorted) {
520
+ const row = el('div', 'aiv-row');
521
+ row.appendChild(el('span', `aiv-dot${f.online ? ' aiv-on' : ''}`));
522
+ const who = el('div', 'aiv-who');
523
+ who.appendChild(el('div', 'aiv-name', f.name || '好友'));
524
+ who.appendChild(el('div', 'aiv-where', whereText(f, o.gameName)));
525
+ const b = el('button', 'aiv-chip', '叫他来');
526
+ b.type = 'button';
527
+ b.dataset['key'] = `invite:call:${f.id}`;
528
+ paint(b, f.id);
529
+ b.addEventListener('click', () => {
530
+ b.disabled = true;
531
+ void sendInvite({ to: f.id, game: o.game, room: o.room }, o).then((r) => {
532
+ if (closed)
533
+ return;
534
+ o.log?.(`叫人 ${f.id} ${r.ok ? 'ok' : r.error}`);
535
+ if (r.ok) {
536
+ calledUntil.set(f.id, now() + INVITE_GAP_MS);
537
+ note.textContent = `叫了 ${f.name || '好友'},他会在页面顶上看到`;
538
+ note.classList.remove('aiv-err');
539
+ }
540
+ else {
541
+ // 刚叫过(平台按 1 分钟算)也灰到能叫为止
542
+ if (r.error === 'limit')
543
+ calledUntil.set(f.id, now() + Math.min(r.retryAfter ?? 60, 60) * 1000);
544
+ note.textContent = inviteErrorText(r);
545
+ note.classList.add('aiv-err');
546
+ }
547
+ paint(b, f.id);
548
+ });
549
+ });
550
+ row.appendChild(who);
551
+ row.appendChild(b);
552
+ list.appendChild(row);
553
+ }
554
+ o.log?.(`叫人 打开 ${friends.length}`);
555
+ };
556
+ if (o.friends === false)
557
+ o.log?.('叫人 打开 0');
558
+ else
559
+ void fetchFriends(o).then((fs) => {
560
+ if (closed)
561
+ return;
562
+ if (fs)
563
+ render(fs);
564
+ else {
565
+ note.textContent = '好友列表暂时打不开,可以先把链接发给朋友';
566
+ o.log?.('叫人 打开 失败');
567
+ }
568
+ });
569
+ copy.focus();
570
+ return { close };
571
+ }
335
572
  //# sourceMappingURL=social.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"social.js","sourceRoot":"","sources":["../src/social.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"social.js","sourceRoot":"","sources":["../src/social.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yyyu-star/arcade-kit",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
4
4
  "description": "Multiplayer toolkit for small Cloudflare Workers games: Durable Object game rooms, room create/join entry points, browser client, daily write quota, ChaCha20 RNG, platform or standalone (guest) identity. 小游戏共用的联机底座",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/src/social.ts CHANGED
@@ -27,15 +27,29 @@ export interface Invite {
27
27
  until: number;
28
28
  }
29
29
 
30
- /** 好友列表的一项:平台的原样加 online、where(对方关了"让好友看到我在哪"就没有 where) */
30
+ /**
31
+ * 好友列表的一项。平台每项是公开资料 `{ userId, displayName, avatar }`(docs/platform-backend.md 15.4,只增不改)加 online、where
32
+ * (对方关了"让好友看到我在哪"就没有 where);kit 统一成 id、name(0.12.1),平台原样的字段也留着。发邀请的 `to` 用 id
33
+ */
31
34
  export interface Friend {
32
35
  id: string;
33
36
  name: string;
34
37
  online: boolean;
35
38
  where?: Presence;
39
+ avatar?: unknown;
36
40
  [k: string]: unknown;
37
41
  }
38
42
 
43
+ /** 平台的一项 → Friend:认 userId / displayName(平台的形状),也认 id / name;没有 id 的丢掉 */
44
+ export function parseFriend(x: unknown): Friend | null {
45
+ if (!x || typeof x !== 'object') return null;
46
+ const f = x as Record<string, unknown>;
47
+ const id = typeof f['userId'] === 'string' ? f['userId'] : typeof f['id'] === 'string' ? f['id'] : null;
48
+ if (!id) return null;
49
+ const name = typeof f['displayName'] === 'string' ? f['displayName'] : typeof f['name'] === 'string' ? f['name'] : '';
50
+ return { ...f, id, name, online: f['online'] === true };
51
+ }
52
+
39
53
  export interface ApiOptions {
40
54
  fetchImpl?: typeof fetch;
41
55
  }
@@ -181,7 +195,7 @@ export async function fetchFriends(opts: ApiOptions = {}): Promise<Friend[] | nu
181
195
  if (res.status !== 200) return null;
182
196
  const body = (await res.json()) as { friends?: unknown };
183
197
  if (!Array.isArray(body?.friends)) return null;
184
- return (body.friends as Friend[]).filter((f) => f && typeof f.id === 'string').map((f) => ({ ...f, online: f.online === true }));
198
+ return (body.friends as unknown[]).map(parseFriend).filter((f): f is Friend => f !== null);
185
199
  } catch {
186
200
  return null;
187
201
  }
@@ -196,6 +210,40 @@ export async function setShowWhere(show: boolean, opts: ApiOptions = {}): Promis
196
210
  }
197
211
  }
198
212
 
213
+ /** "在哪"那一行:好友房带人数,在游戏里写游戏名(不认识的说"在玩游戏"),大厅;没给 where 按离线写几天前来过 */
214
+ export function whereText(f: Pick<Friend, 'online' | 'where'> & { lastSeenDaysAgo?: unknown }, gameName?: (id: string) => string | undefined): string {
215
+ if (!f.online) {
216
+ const d = f.lastSeenDaysAgo;
217
+ return typeof d !== 'number' ? '不在线' : d <= 0 ? '今天来过' : d === 1 ? '昨天来过' : `${d} 天前来过`;
218
+ }
219
+ const w = f.where;
220
+ if (!w) return '在线';
221
+ if (w.place === 'lobby') return '在大厅';
222
+ const g = w.game ? gameName?.(w.game) : undefined;
223
+ if (w.place === 'room') return `在${g ? `${g}的` : ''}好友房${w.seats ? ` · ${w.seats}` : ''}`;
224
+ return g ? `在${g}` : '在玩游戏';
225
+ }
226
+
227
+ /**
228
+ * 叫不了的大白话(平台:429 rate_limited 带 Retry-After,同一个好友 1 分钟一条、每人 24 小时 50 条;403 not_friend:不是好友、屏蔽了、对方不存在一律这个)。
229
+ * 等的时间超过两分钟的是每天的次数用完了
230
+ */
231
+ export function inviteErrorText(r: Exclude<SendInviteResult, { ok: true }>): string {
232
+ switch (r.error) {
233
+ case 'limit':
234
+ return r.retryAfter !== undefined && r.retryAfter > 120 ? '今天叫人的次数用完了,明天再叫' : '刚叫过他,过一会儿再叫';
235
+ case 'blocked':
236
+ return '叫不了他(可能已经不是好友了)';
237
+ case 'login':
238
+ return '登录过期了,刷新一下再叫';
239
+ default:
240
+ return '没发出去,过一会儿再试';
241
+ }
242
+ }
243
+
244
+ /** 叫过以后多久不能再叫同一个人(平台同一个好友 1 分钟一条) */
245
+ export const INVITE_GAP_MS = 60_000;
246
+
199
247
  // ───────────── 挂到页面上(只在调用时碰 DOM) ─────────────
200
248
 
201
249
  export interface SocialOptions extends ApiOptions {
@@ -228,6 +276,8 @@ export interface SocialHandle {
228
276
  pollNow(): void;
229
277
  /** 收起横条、停掉计时、解开监听 */
230
278
  stop(): void;
279
+ /** 打开"叫朋友来"面板(0.12.2):列好友、"叫他来"、复制邀请链接。游戏名用 mountSocial 给的 gameName */
280
+ openInvite(inv: Omit<InvitePanelOptions, 'fetchImpl' | 'gameName'>): InvitePanel;
231
281
  }
232
282
 
233
283
  const BANNER_ID = 'arcade-invite-banner';
@@ -264,6 +314,15 @@ class Social implements SocialHandle {
264
314
  return this.o.now?.() ?? Date.now();
265
315
  }
266
316
 
317
+ openInvite(inv: Omit<InvitePanelOptions, 'fetchImpl' | 'gameName'>): InvitePanel {
318
+ return openInvite({
319
+ ...inv,
320
+ ...(this.o.fetchImpl ? { fetchImpl: this.o.fetchImpl } : {}),
321
+ ...(this.o.gameName ? { gameName: this.o.gameName } : {}),
322
+ ...(this.o.now ? { now: this.o.now } : {}),
323
+ });
324
+ }
325
+
267
326
  private visible(): boolean {
268
327
  return document.visibilityState === 'visible';
269
328
  }
@@ -395,3 +454,210 @@ class Social implements SocialHandle {
395
454
  this.hide();
396
455
  }
397
456
  }
457
+
458
+ // ───────────── "叫朋友来"面板(0.12.2,只在调用时碰 DOM) ─────────────
459
+
460
+ export interface InvitePanelOptions extends ApiOptions {
461
+ /** 游戏 id、房间码:叫来的就是这个房间 */
462
+ game: string;
463
+ room: string;
464
+ /** 列好友、"叫他来"(有平台、已登录时);false 只有"复制邀请链接"(单独部署、没登录) */
465
+ friends?: boolean;
466
+ /** 邀请链接,默认 `<站点>/games/<id>/?room=<码>` */
467
+ url?: string;
468
+ /** 系统分享、复制时的那句话,默认"来一起玩!房间码 <码>" */
469
+ text?: string;
470
+ /** 游戏 id → 名字(好友"在哪"那一行) */
471
+ gameName?(id: string): string | undefined;
472
+ /** 默认 1600(在邀请横条之上,在分享预览之下) */
473
+ zIndex?: number;
474
+ /** 冒烟、调试看的流水:`叫人 打开 <n>`、`叫人 <id> ok|<错误>`、`叫人 复制`、`叫人 关闭` */
475
+ log?(line: string): void;
476
+ /** 测试用:时钟 */
477
+ now?(): number;
478
+ }
479
+
480
+ export interface InvitePanel {
481
+ close(): void;
482
+ }
483
+
484
+ const PANEL_ID = 'arcade-invite-panel';
485
+ const PANEL_CSS_ID = 'arcade-invite-css';
486
+ /** 和牌桌互动(table-fun)同一套颜色、圆角、按钮 */
487
+ const PANEL_CSS = `
488
+ .aiv-back{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:8px;box-sizing:border-box;background:rgba(0,0,0,.5);font-family:inherit;-webkit-tap-highlight-color:transparent}
489
+ .aiv-box{position:relative;display:flex;flex-direction:column;width:min(420px,calc(100vw - 16px));max-height:calc(100% - 16px);background:rgba(43,29,20,.97);border:2px solid #d4a64a;border-radius:14px;padding:12px;box-sizing:border-box;color:#fff6e0;box-shadow:0 6px 18px rgba(0,0,0,.45);animation:aiv-pop .14s ease-out}
490
+ .aiv-title{font-size:17px;font-weight:700;color:#f3d98b;margin:2px 48px 2px 4px}
491
+ .aiv-sub{font-size:13px;opacity:.75;margin:0 4px 8px}
492
+ .aiv-x{position:absolute;right:6px;top:6px;width:44px;height:44px;border:0;border-radius:22px;background:transparent;color:#f3d98b;font:inherit;font-size:22px;cursor:pointer}
493
+ .aiv-list{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:6px}
494
+ .aiv-row{display:flex;align-items:center;gap:8px;padding:6px 6px 6px 10px;border-radius:10px;background:#4a3220}
495
+ .aiv-dot{flex:none;width:10px;height:10px;border-radius:50%;background:#6a6a6a}.aiv-dot.aiv-on{background:#6fd36f}
496
+ .aiv-who{flex:1 1 auto;min-width:0}
497
+ .aiv-name{font-size:15px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
498
+ .aiv-where{font-size:12px;opacity:.75;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
499
+ .aiv-chip{flex:none;min-width:84px;min-height:44px;border:1px solid rgba(212,166,74,.6);border-radius:22px;background:#7a2a1e;color:#fff6e0;font:inherit;font-size:14px;font-weight:700;padding:0 12px;cursor:pointer}
500
+ .aiv-chip:disabled{background:#3a3a3a;cursor:default;opacity:.8}.aiv-chip.aiv-soft{background:#4a3220}
501
+ .aiv-note{font-size:13px;text-align:center;opacity:.85;padding:10px 4px;min-height:1em}
502
+ .aiv-err{color:#ffb0a0}
503
+ .aiv-foot{display:flex;justify-content:center;padding-top:10px}
504
+ @keyframes aiv-pop{from{opacity:0;scale:.94}to{opacity:1;scale:1}}
505
+ `;
506
+
507
+ /** 叫过的人什么时候能再叫(这一页里记着,关了面板再开也灰着) */
508
+ const calledUntil = new Map<string, number>();
509
+
510
+ /**
511
+ * 打开"叫朋友来"面板:列好友(在线的在前,写在哪),每人一个"叫他来",发出后变"已叫"、1 分钟内灰着,叫不了的换成大白话;
512
+ * 底下"复制邀请链接"(能系统分享就分享)。点空白处、✕、Esc 关掉。只发平台的 `POST /api/invites`,不写别的
513
+ */
514
+ export function openInvite(o: InvitePanelOptions): InvitePanel {
515
+ const doc = document;
516
+ doc.getElementById(PANEL_ID)?.remove();
517
+ if (!doc.getElementById(PANEL_CSS_ID)) {
518
+ const st = doc.createElement('style');
519
+ st.id = PANEL_CSS_ID;
520
+ st.textContent = PANEL_CSS;
521
+ doc.head.appendChild(st);
522
+ }
523
+ const now = (): number => o.now?.() ?? Date.now();
524
+ const url = o.url ?? `${location.origin}${inviteUrl(o)}`;
525
+ const el = <K extends keyof HTMLElementTagNameMap>(tag: K, cls: string, text = ''): HTMLElementTagNameMap[K] => {
526
+ const e = doc.createElement(tag);
527
+ e.className = cls;
528
+ if (text) e.textContent = text;
529
+ return e;
530
+ };
531
+ const back = el('div', 'aiv-back');
532
+ back.id = PANEL_ID;
533
+ back.style.zIndex = String(o.zIndex ?? 1600);
534
+ const box = el('div', 'aiv-box');
535
+ box.setAttribute('role', 'dialog');
536
+ box.setAttribute('aria-label', '叫朋友来');
537
+ const x = el('button', 'aiv-x', '✕');
538
+ x.type = 'button';
539
+ x.dataset['key'] = 'invite:close';
540
+ x.setAttribute('aria-label', '关闭');
541
+ const list = el('div', 'aiv-list');
542
+ const note = el('div', 'aiv-note', o.friends === false ? '把链接发给朋友,点开就进房' : '正在找好友…');
543
+ const copy = el('button', 'aiv-chip aiv-soft', '复制邀请链接');
544
+ copy.type = 'button';
545
+ copy.dataset['key'] = 'invite:copy';
546
+ const foot = el('div', 'aiv-foot');
547
+ foot.appendChild(copy);
548
+ box.appendChild(x);
549
+ box.appendChild(el('div', 'aiv-title', '叫朋友来'));
550
+ box.appendChild(el('div', 'aiv-sub', `房间码 ${o.room}`));
551
+ box.appendChild(list);
552
+ box.appendChild(note);
553
+ box.appendChild(foot);
554
+ back.appendChild(box);
555
+ doc.body.appendChild(back);
556
+
557
+ let closed = false;
558
+ const timers = new Set<ReturnType<typeof setTimeout>>();
559
+ const onKey = (e: KeyboardEvent): void => {
560
+ if (e.key === 'Escape') close();
561
+ };
562
+ const close = (): void => {
563
+ if (closed) return;
564
+ closed = true;
565
+ for (const t of timers) clearTimeout(t);
566
+ doc.removeEventListener('keydown', onKey);
567
+ back.remove();
568
+ o.log?.('叫人 关闭');
569
+ };
570
+ doc.addEventListener('keydown', onKey);
571
+ back.addEventListener('click', (e) => {
572
+ if (e.target === back) close();
573
+ });
574
+ x.addEventListener('click', close);
575
+
576
+ copy.addEventListener('click', () => {
577
+ const text = o.text ?? `来一起玩!房间码 ${o.room}`;
578
+ const done = (msg: string, err = false): void => {
579
+ note.textContent = msg;
580
+ note.classList.toggle('aiv-err', err);
581
+ o.log?.('叫人 复制');
582
+ };
583
+ const nav = navigator as Navigator & { share?: (d: ShareData) => Promise<void> };
584
+ if (typeof nav.share === 'function') {
585
+ nav.share({ title: text, text, url }).then(
586
+ () => done('发出去了'),
587
+ (e: { name?: string }) => (e?.name === 'AbortError' ? undefined : clip()),
588
+ );
589
+ return;
590
+ }
591
+ clip();
592
+ function clip(): void {
593
+ if (navigator.clipboard?.writeText) navigator.clipboard.writeText(`${text}:${url}`).then(() => done('链接复制好了,发给朋友,点开就进房'), () => done(`把这个链接发给朋友:${url}`, true));
594
+ else done(`把这个链接发给朋友:${url}`, true);
595
+ }
596
+ });
597
+
598
+ /** "叫他来"按钮的样子:叫过的 1 分钟内灰着,到点自己变回来 */
599
+ const paint = (b: HTMLButtonElement, id: string): void => {
600
+ const left = (calledUntil.get(id) ?? 0) - now();
601
+ b.disabled = left > 0;
602
+ b.textContent = left > 0 ? '已叫' : '叫他来';
603
+ if (left > 0) {
604
+ const t = setTimeout(() => {
605
+ timers.delete(t);
606
+ if (!closed) paint(b, id);
607
+ }, left);
608
+ timers.add(t);
609
+ }
610
+ };
611
+
612
+ const render = (friends: Friend[]): void => {
613
+ note.textContent = friends.length ? '' : '还没有好友,先把链接发给朋友';
614
+ // 平台已经按在线、最近来过排好;这里再保证在线的在前(稳定排序)
615
+ const sorted = [...friends].sort((a, b) => Number(b.online) - Number(a.online));
616
+ for (const f of sorted) {
617
+ const row = el('div', 'aiv-row');
618
+ row.appendChild(el('span', `aiv-dot${f.online ? ' aiv-on' : ''}`));
619
+ const who = el('div', 'aiv-who');
620
+ who.appendChild(el('div', 'aiv-name', f.name || '好友'));
621
+ who.appendChild(el('div', 'aiv-where', whereText(f, o.gameName)));
622
+ const b = el('button', 'aiv-chip', '叫他来');
623
+ b.type = 'button';
624
+ b.dataset['key'] = `invite:call:${f.id}`;
625
+ paint(b, f.id);
626
+ b.addEventListener('click', () => {
627
+ b.disabled = true;
628
+ void sendInvite({ to: f.id, game: o.game, room: o.room }, o).then((r) => {
629
+ if (closed) return;
630
+ o.log?.(`叫人 ${f.id} ${r.ok ? 'ok' : r.error}`);
631
+ if (r.ok) {
632
+ calledUntil.set(f.id, now() + INVITE_GAP_MS);
633
+ note.textContent = `叫了 ${f.name || '好友'},他会在页面顶上看到`;
634
+ note.classList.remove('aiv-err');
635
+ } else {
636
+ // 刚叫过(平台按 1 分钟算)也灰到能叫为止
637
+ if (r.error === 'limit') calledUntil.set(f.id, now() + Math.min(r.retryAfter ?? 60, 60) * 1000);
638
+ note.textContent = inviteErrorText(r);
639
+ note.classList.add('aiv-err');
640
+ }
641
+ paint(b, f.id);
642
+ });
643
+ });
644
+ row.appendChild(who);
645
+ row.appendChild(b);
646
+ list.appendChild(row);
647
+ }
648
+ o.log?.(`叫人 打开 ${friends.length}`);
649
+ };
650
+
651
+ if (o.friends === false) o.log?.('叫人 打开 0');
652
+ else
653
+ void fetchFriends(o).then((fs) => {
654
+ if (closed) return;
655
+ if (fs) render(fs);
656
+ else {
657
+ note.textContent = '好友列表暂时打不开,可以先把链接发给朋友';
658
+ o.log?.('叫人 打开 失败');
659
+ }
660
+ });
661
+ copy.focus();
662
+ return { close };
663
+ }