@yyyu-star/arcade-kit 0.11.1 → 0.12.0
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 +21 -0
- package/README.md +58 -1
- package/dist/fun-logic.d.ts +4 -1
- package/dist/fun-logic.d.ts.map +1 -1
- package/dist/fun-logic.js +7 -1
- package/dist/fun-logic.js.map +1 -1
- package/dist/share.d.ts +106 -0
- package/dist/share.d.ts.map +1 -0
- package/dist/share.js +378 -0
- package/dist/share.js.map +1 -0
- package/dist/social.d.ts +120 -0
- package/dist/social.d.ts.map +1 -0
- package/dist/social.js +335 -0
- package/dist/social.js.map +1 -0
- package/dist/table-fun.d.ts +2 -0
- package/dist/table-fun.d.ts.map +1 -1
- package/dist/table-fun.js +15 -7
- package/dist/table-fun.js.map +1 -1
- package/package.json +9 -1
- package/src/fun-logic.ts +8 -1
- package/src/share.ts +435 -0
- package/src/social.ts +397 -0
- package/src/table-fun.ts +15 -6
package/dist/share.js
ADDED
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 分享卡(0.12.0,仓库根 docs/social.md 1.1):结算页的"分享"按钮生成一张 1080×1350 的战绩图(Canvas 画,不经服务器,0 行写入),
|
|
3
|
+
* 手机上支持带文件的 navigator.share 就直接调系统分享,不支持的出预览,"保存图片""复制链接"两个按钮。
|
|
4
|
+
*
|
|
5
|
+
* - 游戏只交数据(`ShareCard`),画法统一在这里,几个游戏风格一致;kit 不认识任何游戏,名字、图标、主题色都由游戏给。
|
|
6
|
+
* - 这个文件只在调用时碰 DOM,import 时不碰(房间、测试里 import 没事);排版的算法是纯函数,测试在 test/share.test.ts。
|
|
7
|
+
* - 图上只有游戏给的数据:别人的隐藏信息(没摊的底牌、手牌)游戏自己别放进来。
|
|
8
|
+
*/
|
|
9
|
+
/** 卡的尺寸:竖版 4:5,社交软件里不被裁 */
|
|
10
|
+
export const CARD_W = 1080;
|
|
11
|
+
export const CARD_H = 1350;
|
|
12
|
+
/** 小数据最多三条,多的不画 */
|
|
13
|
+
export const MAX_STATS = 3;
|
|
14
|
+
/** 截短:超过 max 个字符的截掉、补省略号(按码点算,不切坏表情) */
|
|
15
|
+
export function clip(s, max) {
|
|
16
|
+
const cs = [...s.trim()];
|
|
17
|
+
return cs.length <= max ? cs.join('') : `${cs.slice(0, Math.max(1, max - 1)).join('')}…`;
|
|
18
|
+
}
|
|
19
|
+
/** 游戏给的主题色只认 #rrggbb,不认的用一个中性的深红 */
|
|
20
|
+
export function accentOf(x) {
|
|
21
|
+
return /^#[0-9a-f]{6}$/i.test(x) ? x.toLowerCase() : '#9b2f24';
|
|
22
|
+
}
|
|
23
|
+
/** 颜色变深 / 变浅:k < 0 往黑走,k > 0 往白走(-1..1) */
|
|
24
|
+
export function shade(hex, k) {
|
|
25
|
+
const c = accentOf(hex);
|
|
26
|
+
const ch = [1, 3, 5].map((i) => parseInt(c.slice(i, i + 2), 16));
|
|
27
|
+
const out = ch.map((v) => Math.round(k < 0 ? v * (1 + k) : v + (255 - v) * k));
|
|
28
|
+
return `#${out.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, '0')).join('')}`;
|
|
29
|
+
}
|
|
30
|
+
/** 日期按北京时间写:2026.10.16 */
|
|
31
|
+
export function cardDate(d) {
|
|
32
|
+
const p = new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit' }).formatToParts(d);
|
|
33
|
+
const get = (t) => p.find((x) => x.type === t)?.value ?? '';
|
|
34
|
+
return `${get('year')}.${get('month')}.${get('day')}`;
|
|
35
|
+
}
|
|
36
|
+
/** 卡上真正要画的字:截短、最多三条小数据、颜色认好 */
|
|
37
|
+
export function normalizeCard(card) {
|
|
38
|
+
return {
|
|
39
|
+
game: clip(card.game, 12),
|
|
40
|
+
title: clip(card.title, 20),
|
|
41
|
+
big: { value: clip(card.big.value, 10), label: clip(card.big.label, 16) },
|
|
42
|
+
stats: (card.stats ?? []).slice(0, MAX_STATS).map((s) => ({ label: clip(s.label, 8), value: clip(s.value, 10) })),
|
|
43
|
+
line: clip(card.line ?? '', 60),
|
|
44
|
+
accent: accentOf(card.accent),
|
|
45
|
+
date: card.date ?? new Date(),
|
|
46
|
+
art: card.art,
|
|
47
|
+
player: card.player ? { name: clip(card.player.name, 12), ...(card.player.badge ? { badge: clip(card.player.badge, 10) } : {}) } : undefined,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 按宽度折行(中文逐字、英文按词),最多 maxLines 行,放不下的最后一行补省略号。measure 由调用方给(Canvas 的 measureText),测试给假的
|
|
52
|
+
*/
|
|
53
|
+
export function wrapLines(text, maxW, measure, maxLines) {
|
|
54
|
+
const tokens = text.match(/[A-Za-z0-9.,'%+\-]+|\s+|./gu) ?? [];
|
|
55
|
+
const lines = [];
|
|
56
|
+
let cur = '';
|
|
57
|
+
let cut = false;
|
|
58
|
+
for (const t of tokens) {
|
|
59
|
+
const space = /^\s+$/.test(t);
|
|
60
|
+
if (!cur && space)
|
|
61
|
+
continue;
|
|
62
|
+
// 行满了还有字没放:截断
|
|
63
|
+
if (lines.length === maxLines) {
|
|
64
|
+
cut = true;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
const next = cur + t;
|
|
68
|
+
if (measure(next) <= maxW || !cur) {
|
|
69
|
+
cur = next;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
lines.push(cur.trimEnd());
|
|
73
|
+
cur = space ? '' : t;
|
|
74
|
+
if (cur && lines.length === maxLines) {
|
|
75
|
+
cut = true;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!cut && cur)
|
|
80
|
+
lines.push(cur.trimEnd());
|
|
81
|
+
if (cut) {
|
|
82
|
+
let last = lines[maxLines - 1];
|
|
83
|
+
while (last && measure(`${last}…`) > maxW)
|
|
84
|
+
last = [...last].slice(0, -1).join('');
|
|
85
|
+
lines[maxLines - 1] = `${last}…`;
|
|
86
|
+
}
|
|
87
|
+
return lines;
|
|
88
|
+
}
|
|
89
|
+
/** 图怎么放进框:contain 整张放进去、居中;cover 铺满框、裁掉多的(中间那块)。返回 drawImage 的九个参数里后八个 */
|
|
90
|
+
export function artRect(src, box, fit = 'contain', crop) {
|
|
91
|
+
let sx = crop?.x ?? 0;
|
|
92
|
+
let sy = crop?.y ?? 0;
|
|
93
|
+
let sw = crop?.w ?? src.w;
|
|
94
|
+
let sh = crop?.h ?? src.h;
|
|
95
|
+
if (fit === 'cover') {
|
|
96
|
+
const k = Math.max(box.w / sw, box.h / sh);
|
|
97
|
+
const vw = box.w / k;
|
|
98
|
+
const vh = box.h / k;
|
|
99
|
+
sx += (sw - vw) / 2;
|
|
100
|
+
sy += (sh - vh) / 2;
|
|
101
|
+
sw = vw;
|
|
102
|
+
sh = vh;
|
|
103
|
+
return [sx, sy, sw, sh, box.x, box.y, box.w, box.h];
|
|
104
|
+
}
|
|
105
|
+
const k = Math.min(box.w / sw, box.h / sh);
|
|
106
|
+
const dw = sw * k;
|
|
107
|
+
const dh = sh * k;
|
|
108
|
+
return [sx, sy, sw, sh, box.x + (box.w - dw) / 2, box.y + (box.h - dh) / 2, dw, dh];
|
|
109
|
+
}
|
|
110
|
+
// ───────────── 画(只在调用时碰 DOM) ─────────────
|
|
111
|
+
const FONT = '"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC","Source Han Sans SC",system-ui,sans-serif';
|
|
112
|
+
function sizeOf(img) {
|
|
113
|
+
const o = img;
|
|
114
|
+
const num = (v) => (typeof v === 'number' ? v : typeof v === 'object' && v && 'baseVal' in v ? Number(v.baseVal.value) : 0);
|
|
115
|
+
const w = o.naturalWidth || o.videoWidth || o.displayWidth || num(o.width);
|
|
116
|
+
const h = o.naturalHeight || o.videoHeight || o.displayHeight || num(o.height);
|
|
117
|
+
return { w, h };
|
|
118
|
+
}
|
|
119
|
+
/** art 的两种写法拆开;是 img 就先 decode(没加载完、坏图都在这里失败),失败返回 null,卡照常出 */
|
|
120
|
+
async function readyArt(art) {
|
|
121
|
+
if (!art)
|
|
122
|
+
return null;
|
|
123
|
+
const spec = typeof art === 'object' && art !== null && 'image' in art && !('naturalWidth' in art) ? art : { image: art };
|
|
124
|
+
const img = spec.image;
|
|
125
|
+
if (typeof img.decode === 'function' && 'naturalWidth' in img) {
|
|
126
|
+
try {
|
|
127
|
+
await img.decode();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const { w, h } = sizeOf(spec.image);
|
|
134
|
+
if (!w || !h)
|
|
135
|
+
return null;
|
|
136
|
+
return { image: spec.image, crop: spec.crop, fit: spec.fit ?? 'contain' };
|
|
137
|
+
}
|
|
138
|
+
function round(ctx, x, y, w, h, r) {
|
|
139
|
+
ctx.beginPath();
|
|
140
|
+
ctx.moveTo(x + r, y);
|
|
141
|
+
ctx.arcTo(x + w, y, x + w, y + h, r);
|
|
142
|
+
ctx.arcTo(x + w, y + h, x, y + h, r);
|
|
143
|
+
ctx.arcTo(x, y + h, x, y, r);
|
|
144
|
+
ctx.arcTo(x, y, x + w, y, r);
|
|
145
|
+
ctx.closePath();
|
|
146
|
+
}
|
|
147
|
+
/** 字太宽就缩小字号,最小到 min */
|
|
148
|
+
function fitFont(ctx, text, weight, size, maxW, min) {
|
|
149
|
+
let s = size;
|
|
150
|
+
for (; s > min; s -= 4) {
|
|
151
|
+
ctx.font = `${weight} ${s}px ${FONT}`;
|
|
152
|
+
if (ctx.measureText(text).width <= maxW)
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
ctx.font = `${weight} ${s}px ${FONT}`;
|
|
156
|
+
return s;
|
|
157
|
+
}
|
|
158
|
+
/** 画一张卡。canvas 不给就新建一个 1080×1350 的 */
|
|
159
|
+
export async function drawShareCard(input, canvas) {
|
|
160
|
+
const c = normalizeCard(input);
|
|
161
|
+
const cv = canvas ?? document.createElement('canvas');
|
|
162
|
+
cv.width = CARD_W;
|
|
163
|
+
cv.height = CARD_H;
|
|
164
|
+
const ctx = cv.getContext('2d');
|
|
165
|
+
const art = await readyArt(c.art);
|
|
166
|
+
const W = CARD_W;
|
|
167
|
+
const M = 72;
|
|
168
|
+
// 底:主题色从上往下变深,再压一层很淡的斜纹
|
|
169
|
+
const bg = ctx.createLinearGradient(0, 0, W * 0.4, CARD_H);
|
|
170
|
+
bg.addColorStop(0, shade(c.accent, 0.12));
|
|
171
|
+
bg.addColorStop(1, shade(c.accent, -0.55));
|
|
172
|
+
ctx.fillStyle = bg;
|
|
173
|
+
ctx.fillRect(0, 0, W, CARD_H);
|
|
174
|
+
ctx.save();
|
|
175
|
+
ctx.globalAlpha = 0.06;
|
|
176
|
+
ctx.strokeStyle = '#ffffff';
|
|
177
|
+
ctx.lineWidth = 28;
|
|
178
|
+
for (let x = -CARD_H; x < W; x += 110) {
|
|
179
|
+
ctx.beginPath();
|
|
180
|
+
ctx.moveTo(x, CARD_H);
|
|
181
|
+
ctx.lineTo(x + CARD_H, 0);
|
|
182
|
+
ctx.stroke();
|
|
183
|
+
}
|
|
184
|
+
ctx.restore();
|
|
185
|
+
// 顶:图标 + 游戏名 + 这一张是什么
|
|
186
|
+
let tx = M;
|
|
187
|
+
if (art) {
|
|
188
|
+
const box = { x: M, y: 70, w: 180, h: 180 };
|
|
189
|
+
ctx.save();
|
|
190
|
+
round(ctx, box.x, box.y, box.w, box.h, 36);
|
|
191
|
+
ctx.fillStyle = 'rgba(255,255,255,0.16)';
|
|
192
|
+
ctx.fill();
|
|
193
|
+
ctx.clip();
|
|
194
|
+
try {
|
|
195
|
+
ctx.drawImage(art.image, ...artRect(sizeOf(art.image), box, art.fit, art.crop));
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// 跨域的图、坏图:不画,卡照常出
|
|
199
|
+
}
|
|
200
|
+
ctx.restore();
|
|
201
|
+
tx = M + 180 + 36;
|
|
202
|
+
}
|
|
203
|
+
ctx.fillStyle = '#ffffff';
|
|
204
|
+
ctx.textBaseline = 'alphabetic';
|
|
205
|
+
ctx.textAlign = 'left';
|
|
206
|
+
fitFont(ctx, c.game, '800', 84, W - tx - M, 48);
|
|
207
|
+
ctx.fillText(c.game, tx, 160);
|
|
208
|
+
ctx.fillStyle = 'rgba(255,255,255,0.82)';
|
|
209
|
+
fitFont(ctx, c.title, '600', 44, W - tx - M, 30);
|
|
210
|
+
ctx.fillText(c.title, tx, 228);
|
|
211
|
+
// 中:大数字
|
|
212
|
+
ctx.textAlign = 'center';
|
|
213
|
+
ctx.fillStyle = '#ffffff';
|
|
214
|
+
ctx.shadowColor = 'rgba(0,0,0,0.25)';
|
|
215
|
+
ctx.shadowBlur = 24;
|
|
216
|
+
ctx.shadowOffsetY = 8;
|
|
217
|
+
fitFont(ctx, c.big.value, '900', 230, W - 2 * M, 96);
|
|
218
|
+
ctx.fillText(c.big.value, W / 2, 600);
|
|
219
|
+
ctx.shadowColor = 'transparent';
|
|
220
|
+
ctx.fillStyle = 'rgba(255,255,255,0.88)';
|
|
221
|
+
fitFont(ctx, c.big.label, '700', 54, W - 2 * M, 34);
|
|
222
|
+
ctx.fillText(c.big.label, W / 2, 690);
|
|
223
|
+
// 小数据:一排最多三格
|
|
224
|
+
const n = c.stats.length;
|
|
225
|
+
if (n) {
|
|
226
|
+
const gap = 28;
|
|
227
|
+
const cw = (W - 2 * M - gap * (n - 1)) / n;
|
|
228
|
+
c.stats.forEach((s, i) => {
|
|
229
|
+
const x = M + i * (cw + gap);
|
|
230
|
+
round(ctx, x, 770, cw, 190, 28);
|
|
231
|
+
ctx.fillStyle = 'rgba(255,255,255,0.14)';
|
|
232
|
+
ctx.fill();
|
|
233
|
+
ctx.fillStyle = '#ffffff';
|
|
234
|
+
fitFont(ctx, s.value, '800', 76, cw - 32, 40);
|
|
235
|
+
ctx.fillText(s.value, x + cw / 2, 870);
|
|
236
|
+
ctx.fillStyle = 'rgba(255,255,255,0.78)';
|
|
237
|
+
fitFont(ctx, s.label, '600', 36, cw - 32, 26);
|
|
238
|
+
ctx.fillText(s.label, x + cw / 2, 925);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// 一句名场面:最多两行
|
|
242
|
+
if (c.line) {
|
|
243
|
+
ctx.fillStyle = '#ffffff';
|
|
244
|
+
ctx.font = `700 50px ${FONT}`;
|
|
245
|
+
const lines = wrapLines(`“${c.line}”`, W - 2 * M - 40, (s) => ctx.measureText(s).width, 2);
|
|
246
|
+
lines.forEach((l, i) => ctx.fillText(l, W / 2, 1065 + i * 66));
|
|
247
|
+
}
|
|
248
|
+
// 底:昵称、称号、日期
|
|
249
|
+
ctx.fillStyle = 'rgba(0,0,0,0.22)';
|
|
250
|
+
ctx.fillRect(0, CARD_H - 150, W, 150);
|
|
251
|
+
ctx.textAlign = 'left';
|
|
252
|
+
ctx.fillStyle = '#ffffff';
|
|
253
|
+
if (c.player) {
|
|
254
|
+
fitFont(ctx, c.player.name, '800', 50, W * 0.5, 32);
|
|
255
|
+
ctx.fillText(c.player.name, M, CARD_H - 62);
|
|
256
|
+
if (c.player.badge) {
|
|
257
|
+
const nw = ctx.measureText(c.player.name).width;
|
|
258
|
+
ctx.font = `700 34px ${FONT}`;
|
|
259
|
+
const bw = ctx.measureText(c.player.badge).width + 36;
|
|
260
|
+
const bx = M + nw + 24;
|
|
261
|
+
if (bx + bw < W * 0.72) {
|
|
262
|
+
round(ctx, bx, CARD_H - 104, bw, 54, 27);
|
|
263
|
+
ctx.fillStyle = shade(c.accent, 0.75);
|
|
264
|
+
ctx.fill();
|
|
265
|
+
ctx.fillStyle = shade(c.accent, -0.5);
|
|
266
|
+
ctx.fillText(c.player.badge, bx + 18, CARD_H - 66);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
ctx.textAlign = 'right';
|
|
271
|
+
ctx.fillStyle = 'rgba(255,255,255,0.8)';
|
|
272
|
+
ctx.font = `600 38px ${FONT}`;
|
|
273
|
+
ctx.fillText(cardDate(c.date), W - M, CARD_H - 62);
|
|
274
|
+
return cv;
|
|
275
|
+
}
|
|
276
|
+
/** 画成 PNG */
|
|
277
|
+
export async function shareCardBlob(card) {
|
|
278
|
+
const cv = await drawShareCard(card);
|
|
279
|
+
return new Promise((resolve, reject) => cv.toBlob((b) => (b ? resolve(b) : reject(new Error('toBlob failed'))), 'image/png'));
|
|
280
|
+
}
|
|
281
|
+
const PREVIEW_ID = 'arcade-share-preview';
|
|
282
|
+
/**
|
|
283
|
+
* 点"分享":画卡,能带文件调系统分享就调,不能就出预览(保存图片、复制链接)。
|
|
284
|
+
* 系统分享出错(不是用户取消)也退回预览,总能拿到图。
|
|
285
|
+
*/
|
|
286
|
+
export async function shareCard(card, opts) {
|
|
287
|
+
const blob = await shareCardBlob(card);
|
|
288
|
+
const name = opts.fileName ?? 'share.png';
|
|
289
|
+
const text = opts.text ?? `${card.game} · ${card.big.label} ${card.big.value}`;
|
|
290
|
+
const nav = navigator;
|
|
291
|
+
if (typeof File === 'function' && typeof nav.share === 'function') {
|
|
292
|
+
const file = new File([blob], name, { type: 'image/png' });
|
|
293
|
+
const data = { files: [file], title: card.game, text, url: opts.url };
|
|
294
|
+
if (nav.canShare?.(data)) {
|
|
295
|
+
try {
|
|
296
|
+
await nav.share(data);
|
|
297
|
+
opts.log?.('分享 系统');
|
|
298
|
+
return 'shared';
|
|
299
|
+
}
|
|
300
|
+
catch (e) {
|
|
301
|
+
if (e.name === 'AbortError')
|
|
302
|
+
return 'cancelled';
|
|
303
|
+
// 别的错(权限、不支持的类型):退回预览
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
showPreview(blob, name, opts);
|
|
308
|
+
return 'preview';
|
|
309
|
+
}
|
|
310
|
+
/** 不支持系统分享时:预览图 + "保存图片""复制链接";点空白处或"关闭"收起 */
|
|
311
|
+
function showPreview(blob, name, opts) {
|
|
312
|
+
document.getElementById(PREVIEW_ID)?.remove();
|
|
313
|
+
const url = URL.createObjectURL(blob);
|
|
314
|
+
const root = document.createElement('div');
|
|
315
|
+
root.id = PREVIEW_ID;
|
|
316
|
+
root.setAttribute('role', 'dialog');
|
|
317
|
+
root.style.cssText = `position:fixed;inset:0;z-index:${opts.zIndex ?? 2000};display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:16px;box-sizing:border-box;background:rgba(0,0,0,.72);font:600 16px ${FONT};color:#fff`;
|
|
318
|
+
const close = () => {
|
|
319
|
+
root.remove();
|
|
320
|
+
URL.revokeObjectURL(url);
|
|
321
|
+
};
|
|
322
|
+
root.addEventListener('click', (e) => {
|
|
323
|
+
if (e.target === root)
|
|
324
|
+
close();
|
|
325
|
+
});
|
|
326
|
+
const img = document.createElement('img');
|
|
327
|
+
img.src = url;
|
|
328
|
+
img.alt = '战绩图';
|
|
329
|
+
img.style.cssText = 'max-width:min(92vw,540px);max-height:calc(100% - 140px);border-radius:16px;box-shadow:0 8px 32px rgba(0,0,0,.5)';
|
|
330
|
+
const tip = document.createElement('div');
|
|
331
|
+
tip.textContent = '手机上也可以长按图片保存';
|
|
332
|
+
tip.style.cssText = 'font-size:13px;opacity:.75';
|
|
333
|
+
const row = document.createElement('div');
|
|
334
|
+
row.style.cssText = 'display:flex;gap:12px;flex-wrap:wrap;justify-content:center';
|
|
335
|
+
const btn = (label, key, fn, primary = false) => {
|
|
336
|
+
const b = document.createElement('button');
|
|
337
|
+
b.type = 'button';
|
|
338
|
+
b.textContent = label;
|
|
339
|
+
b.dataset['key'] = key;
|
|
340
|
+
b.style.cssText = `min-width:120px;min-height:48px;padding:0 20px;border-radius:24px;border:2px solid #fff;font:inherit;cursor:pointer;${primary ? 'background:#fff;color:#222' : 'background:transparent;color:#fff'}`;
|
|
341
|
+
b.addEventListener('click', (e) => {
|
|
342
|
+
e.stopPropagation();
|
|
343
|
+
fn();
|
|
344
|
+
});
|
|
345
|
+
return b;
|
|
346
|
+
};
|
|
347
|
+
const save = btn('保存图片', 'share:save', () => {
|
|
348
|
+
const a = document.createElement('a');
|
|
349
|
+
a.href = url;
|
|
350
|
+
a.download = name;
|
|
351
|
+
document.body.appendChild(a);
|
|
352
|
+
a.click();
|
|
353
|
+
a.remove();
|
|
354
|
+
opts.log?.('分享 保存');
|
|
355
|
+
}, true);
|
|
356
|
+
const copy = btn('复制链接', 'share:copy', () => {
|
|
357
|
+
const done = (ok) => {
|
|
358
|
+
copy.textContent = ok ? '已复制' : '复制不了,链接:';
|
|
359
|
+
if (!ok)
|
|
360
|
+
tip.textContent = opts.url;
|
|
361
|
+
opts.log?.(ok ? '分享 复制' : '分享 复制失败');
|
|
362
|
+
};
|
|
363
|
+
if (navigator.clipboard?.writeText)
|
|
364
|
+
navigator.clipboard.writeText(opts.url).then(() => done(true), () => done(false));
|
|
365
|
+
else
|
|
366
|
+
done(false);
|
|
367
|
+
});
|
|
368
|
+
const shut = btn('关闭', 'share:close', close);
|
|
369
|
+
row.appendChild(save);
|
|
370
|
+
row.appendChild(copy);
|
|
371
|
+
row.appendChild(shut);
|
|
372
|
+
root.appendChild(img);
|
|
373
|
+
root.appendChild(tip);
|
|
374
|
+
root.appendChild(row);
|
|
375
|
+
document.body.appendChild(root);
|
|
376
|
+
opts.log?.('分享 预览');
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"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"}
|
package/dist/social.d.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 社交第一期(0.12.0,仓库根 docs/social.md 1.2、1.3):游戏页面开着时报"我在哪"、收好友的邀请,在页面顶上弹一条"老王叫你来打牌 [去] [不了]"。
|
|
3
|
+
*
|
|
4
|
+
* - 只在有平台、已登录时挂(`mountSocial` 先看 `detectPlatform`):单独部署、没登录一个请求都不发。
|
|
5
|
+
* - 省平台的写入:位置只在页面在前台时每 2 分钟报一次(平台再按 2 分钟节流,和 last_seen_at 一起写);邀请每 30 秒问一次(只读)。
|
|
6
|
+
* 切到后台就停,回到前台到点了马上补一次。不用 Web Push。
|
|
7
|
+
* - 没有自由文字:横条上只有对方的昵称(平台的账号名)和游戏名(游戏给的表),都按纯文本放进去。
|
|
8
|
+
* - 这个文件只在调用时碰 DOM,import 时不碰;接口的小函数和挑邀请的逻辑是纯的,测试在 test/social.test.ts(假 fetch)。
|
|
9
|
+
* - 接口形状是主线定的(docs/platform-backend.md 里平台写细节):都要登录,写的请求带 `x-arcade: 1`、同源(平台的 CSRF 规矩)。
|
|
10
|
+
*/
|
|
11
|
+
import { type PlatformInfo } from './client.js';
|
|
12
|
+
/** 报位置:在大厅、在玩某个游戏、在某个好友房里(seats 是"3/4"这样的人数) */
|
|
13
|
+
export interface Presence {
|
|
14
|
+
place: 'lobby' | 'game' | 'room';
|
|
15
|
+
game?: string;
|
|
16
|
+
room?: string;
|
|
17
|
+
seats?: string;
|
|
18
|
+
}
|
|
19
|
+
/** 收到的一条邀请;until 是过期时间(毫秒时间戳,平台给字符串也认) */
|
|
20
|
+
export interface Invite {
|
|
21
|
+
id: string;
|
|
22
|
+
from: {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
};
|
|
26
|
+
game: string;
|
|
27
|
+
room: string;
|
|
28
|
+
until: number;
|
|
29
|
+
}
|
|
30
|
+
/** 好友列表的一项:平台的原样加 online、where(对方关了"让好友看到我在哪"就没有 where) */
|
|
31
|
+
export interface Friend {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
online: boolean;
|
|
35
|
+
where?: Presence;
|
|
36
|
+
[k: string]: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface ApiOptions {
|
|
39
|
+
fetchImpl?: typeof fetch;
|
|
40
|
+
}
|
|
41
|
+
/** 发邀请的结果:limit 是超了次数(每人每天 50 条、同一好友 1 分钟 1 条),blocked 是被屏蔽或不是好友 */
|
|
42
|
+
export type SendInviteResult = {
|
|
43
|
+
ok: true;
|
|
44
|
+
id: string;
|
|
45
|
+
} | {
|
|
46
|
+
ok: false;
|
|
47
|
+
error: 'limit' | 'blocked' | 'login' | 'failed';
|
|
48
|
+
retryAfter?: number;
|
|
49
|
+
};
|
|
50
|
+
/** 位置每 2 分钟一次、邀请每 30 秒一次(docs/social.md) */
|
|
51
|
+
export declare const PRESENCE_MS = 120000;
|
|
52
|
+
export declare const INVITE_POLL_MS = 30000;
|
|
53
|
+
/** 过期时间:数字(毫秒)或能解析的时间字符串;都不是返回 NaN */
|
|
54
|
+
export declare function untilOf(x: unknown): number;
|
|
55
|
+
/** 平台回的邀请列表:形状不对的项丢掉(游戏 id、房间码按格式查,跳转地址只从这两样拼) */
|
|
56
|
+
export declare function parseInvites(body: unknown): Invite[];
|
|
57
|
+
/**
|
|
58
|
+
* 现在该弹哪一条:没过期、没弹过(skip)、不是我已经在的那个房间的;先到期的先弹
|
|
59
|
+
*/
|
|
60
|
+
export declare function pickInvite(list: readonly Invite[], now: number, skip: ReadonlySet<string>, here?: Presence | null): Invite | null;
|
|
61
|
+
/** 点"去"跳到哪:`/games/<id>/?room=<码>`(站点根下,和自己挂在哪无关) */
|
|
62
|
+
export declare function inviteUrl(v: Pick<Invite, 'game' | 'room'>): string;
|
|
63
|
+
/** 横条上的那句话:游戏名不认识就说"一起玩" */
|
|
64
|
+
export declare function inviteText(v: Pick<Invite, 'from' | 'game'>, gameName?: (id: string) => string | undefined): string;
|
|
65
|
+
/** 报一次位置。返回 HTTP 状态(0 = 没连上);平台回 204 */
|
|
66
|
+
export declare function postPresence(p: Presence, opts?: ApiOptions): Promise<number>;
|
|
67
|
+
/** 问一次有没有邀请。没连上、不是 200 回 null(和"没有邀请"分开:401 时调用方要停) */
|
|
68
|
+
export declare function fetchInvites(opts?: ApiOptions): Promise<{
|
|
69
|
+
status: number;
|
|
70
|
+
invites: Invite[];
|
|
71
|
+
}>;
|
|
72
|
+
/** "不了":这条以后不再弹(跳过去之前也调一次,到了游戏页不会再弹同一条) */
|
|
73
|
+
export declare function dismissInvite(id: string, opts?: ApiOptions & {
|
|
74
|
+
keepalive?: boolean;
|
|
75
|
+
}): Promise<boolean>;
|
|
76
|
+
/** 叫好友来:to 是好友的用户 id,game、room 是我在的房间 */
|
|
77
|
+
export declare function sendInvite(inv: {
|
|
78
|
+
to: string;
|
|
79
|
+
game: string;
|
|
80
|
+
room: string;
|
|
81
|
+
}, opts?: ApiOptions): Promise<SendInviteResult>;
|
|
82
|
+
/** 好友列表(带在线、在哪)。没连上、不是 200 回 null */
|
|
83
|
+
export declare function fetchFriends(opts?: ApiOptions): Promise<Friend[] | null>;
|
|
84
|
+
/** "让好友看到我在哪"的开关 */
|
|
85
|
+
export declare function setShowWhere(show: boolean, opts?: ApiOptions): Promise<boolean>;
|
|
86
|
+
export interface SocialOptions extends ApiOptions {
|
|
87
|
+
/**
|
|
88
|
+
* 我现在在哪:每次报之前现问。返回 null 这次不报(比如还没进房)。
|
|
89
|
+
* 房间的人数由游戏给("3/4"),平台不进房间问
|
|
90
|
+
*/
|
|
91
|
+
where(): Presence | null;
|
|
92
|
+
/** 游戏 id → 显示的名字(横条上"叫你来<名字>");kit 不认识任何游戏,没给或不认识的说"一起玩" */
|
|
93
|
+
gameName?(id: string): string | undefined;
|
|
94
|
+
/**
|
|
95
|
+
* 有没有平台、登没登录:`detectPlatform` 的结果。游戏启动时已经问过 `/api/me` 的传进来,省一次请求;
|
|
96
|
+
* 不传就自己问一次
|
|
97
|
+
*/
|
|
98
|
+
platform?: PlatformInfo;
|
|
99
|
+
/** 点"去":默认先告诉平台这条办了,再跳到 `/games/<id>/?room=<码>`;游戏要先确认离开(打到一半)就自己接 */
|
|
100
|
+
onGo?(invite: Invite): void;
|
|
101
|
+
/** 横条的 z-index,默认 1500(在牌桌互动之上,在分享预览之下) */
|
|
102
|
+
zIndex?: number;
|
|
103
|
+
/** 冒烟、调试看的流水:`位置 204`、`邀请 弹 <id>`、`邀请 去`、`邀请 不了`、`邀请 过期` */
|
|
104
|
+
log?(line: string): void;
|
|
105
|
+
/** 测试用:时钟 */
|
|
106
|
+
now?(): number;
|
|
107
|
+
}
|
|
108
|
+
export interface SocialHandle {
|
|
109
|
+
/** 位置变了(进房、换游戏)马上报一次;离上次不到 2 分钟就不报,平台反正也会节流 */
|
|
110
|
+
presenceNow(force?: boolean): void;
|
|
111
|
+
/** 马上问一次邀请(比如刚从后台回来,或者冒烟) */
|
|
112
|
+
pollNow(): void;
|
|
113
|
+
/** 收起横条、停掉计时、解开监听 */
|
|
114
|
+
stop(): void;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 挂上报位置和收邀请。没平台、没登录、平台连不上都回 null(不挂);中途掉了登录(401)自己停
|
|
118
|
+
*/
|
|
119
|
+
export declare function mountSocial(opts: SocialOptions): Promise<SocialHandle | null>;
|
|
120
|
+
//# sourceMappingURL=social.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../src/social.ts"],"names":[],"mappings":"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"}
|