@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 +16 -0
- package/README.md +4 -1
- package/dist/social.d.ts +49 -1
- package/dist/social.d.ts.map +1 -1
- package/dist/social.js +238 -1
- package/dist/social.js.map +1 -1
- package/package.json +1 -1
- package/src/social.ts +268 -2
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()`
|
|
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
|
-
/**
|
|
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
|
package/dist/social.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../src/social.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE,gDAAgD;AAChD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0CAA0C;AAC1C,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED
|
|
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.
|
|
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
|
package/dist/social.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social.js","sourceRoot":"","sources":["../src/social.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAqChE,4CAA4C;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAErC,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAC5C,MAAM,SAAS,GAAG,qBAAqB,CAAC;AAExC,SAAS,GAAG,CAAC,IAAgB;IAC3B,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAA2B,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,gDAAgD;AAChD,SAAS,KAAK,CAAC,MAAc,EAAE,IAAc,EAAE,SAAS,GAAG,KAAK;IAC9D,OAAO;QACL,MAAM;QACN,WAAW,EAAE,aAAa;QAC1B,SAAS;QACT,OAAO,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,EAAE;QAC/H,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC;AAElG,sCAAsC;AACtC,MAAM,UAAU,OAAO,CAAC,CAAU;IAChC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC,GAAG,CAAC;AACpB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,MAAM,IAAI,GAAI,IAAqC,EAAE,OAAO,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,IAAiB,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,CAAkD,CAAC;QAC7D,MAAM,IAAI,GAAG,CAAC,EAAE,IAAoD,CAAC;QACrE,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChC,IACE,OAAO,CAAC,EAAE,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE;YACjC,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI;YAC3C,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAClD,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EACtB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAuB,EAAE,GAAW,EAAE,IAAyB,EAAE,IAAsB;IAChH,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,SAAS;QAC/C,IAAI,IAAI,EAAE,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,SAAS;QACrF,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;YAAE,IAAI,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,CAAgC;IACxD,OAAO,UAAU,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,UAAU,CAAC,CAAgC,EAAE,QAA6C;IACxG,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC;AAC7C,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAW,EAAE,IAAI,GAAe,EAAE;IACnE,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,GAAe,EAAE;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU,EAAE,IAAI,GAAyC,EAAE;IAC7F,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACxH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAA+C,EAAE,IAAI,GAAe,EAAE;IACrG,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAA4B,CAAC;QAC7E,OAAO,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACnG,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAClG,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACrF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,GAAe,EAAE;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAQ,IAAI,CAAC,OAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IACnI,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAa,EAAE,IAAI,GAAe,EAAE;IACrE,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAoCD,MAAM,SAAS,GAAG,sBAAsB,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAmB;IACnD,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1G,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,MAAM;IAWmB,CAAC;IAVtB,YAAY,GAAG,CAAC,QAAQ,CAAC;IACzB,QAAQ,GAAG,CAAC,QAAQ,CAAC;IACrB,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IACP,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,OAAO,GAAa,EAAE,CAAC;IACvB,KAAK,GAAqF,IAAI,CAAC;IACtF,KAAK,CAAiC;IACtC,KAAK,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAEjD,YAA6B,CAAgB;iBAAhB,CAAC;QAC5B,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,+BAA+B;QAC/B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,GAAG;QACT,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,CAAC;IAEO,OAAO;QACb,OAAO,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAC;IAChD,CAAC;IAEO,IAAI;QACV,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,cAAc;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1D,CAAC;IAED,WAAW,CAAC,KAAK,GAAG,KAAK;QACvB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,GAAG,WAAW;YAAE,OAAO;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,KAAK,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACtC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YACrD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,CAAC,mBAAmB;YAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvC,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAEO,IAAI,CAAC,CAAS;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;QAClB,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG;YACjB,gBAAgB;YAChB,UAAU;YACV,+CAA+C;YAC/C,WAAW,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,cAAc;YACd,oBAAoB;YACpB,SAAS;YACT,8BAA8B;YAC9B,uBAAuB;YACvB,0BAA0B;YAC1B,oBAAoB;YACpB,+BAA+B;YAC/B,YAAY;YACZ,uCAAuC;YACvC,oEAAoE;YACpE,iCAAiC;YACjC,WAAW;YACX,0DAA0D;SAC3D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,uEAAuE,CAAC;QAC7F,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,OAAgB,EAAE,EAAc,EAAqB,EAAE;YAC9F,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC3C,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC;YAClB,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC;YACtB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACvB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,mHAAmH,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,6CAA6C,EAAE,CAAC;YACjO,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE;YAC1C,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,0CAA0C;YAC1C,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;gBAC3B,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE;YAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;YACtB,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrB,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnB,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,qBAAqB,CAAC,GAAG,EAAE;YACzB,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;YACzC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,8BAA8B;QAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACjC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,uBAAuB,CAAC;QAC7C,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;QACvB,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;CACF"}
|
|
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.
|
|
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
|
-
/**
|
|
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
|
|
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
|
+
}
|