koishi-plugin-ggcevo 1.3.2 → 1.3.5
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/lib/index.js +54 -6
- package/package.json +1 -1
- package/readme.md +23 -1
package/lib/index.js
CHANGED
|
@@ -128,6 +128,18 @@ var ExchangeConfig = {
|
|
|
128
128
|
23: { name: "赎罪券", quality: "t0", type: "道具", cost: 2 }
|
|
129
129
|
};
|
|
130
130
|
function apply(ctx, config) {
|
|
131
|
+
ctx.root.on("command/before-execute", (argv) => {
|
|
132
|
+
if (argv.command?.ctx === ctx && argv.command.name !== "咕咕之战") {
|
|
133
|
+
;
|
|
134
|
+
argv.session["ggcevoQuote"] = true;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
ctx.root.before("send", (session, options) => {
|
|
138
|
+
const source = options.session;
|
|
139
|
+
if (source?.["ggcevoQuote"] && !session.elements?.some((el) => el.type === "quote")) {
|
|
140
|
+
session.elements?.unshift((0, import_koishi.h)("quote", { id: source.messageId }));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
131
143
|
const debug = /* @__PURE__ */ __name((...args) => {
|
|
132
144
|
if (config.debugEnabled) {
|
|
133
145
|
ctx.logger.info("[ggcevo:debug]", ...args);
|
|
@@ -2973,7 +2985,7 @@ ${rewardLines.join("\n")}` : "";
|
|
|
2973
2985
|
const cachePath = import_node_path.default.resolve(menuCacheDir, `${hash}.jpg`);
|
|
2974
2986
|
if (import_node_fs.default.existsSync(cachePath)) {
|
|
2975
2987
|
const cached = await (0, import_promises.readFile)(cachePath);
|
|
2976
|
-
return
|
|
2988
|
+
return `data:image/jpeg;base64,${cached.toString("base64")}`;
|
|
2977
2989
|
}
|
|
2978
2990
|
if (!ctx.puppeteer) {
|
|
2979
2991
|
logger.warn("[menu-render] 未启用 puppeteer 服务");
|
|
@@ -2985,7 +2997,6 @@ ${rewardLines.join("\n")}` : "";
|
|
|
2985
2997
|
await page.setContent(html);
|
|
2986
2998
|
await page.waitForNetworkIdle();
|
|
2987
2999
|
const img = await page.screenshot({ type: "jpeg", quality: 85, fullPage: true, encoding: "binary" });
|
|
2988
|
-
logger.info("[menu-render] 菜单图渲染完成, 体积 %s KB", (img.length / 1024).toFixed(1));
|
|
2989
3000
|
try {
|
|
2990
3001
|
await (0, import_promises.mkdir)(menuCacheDir, { recursive: true });
|
|
2991
3002
|
const files = await (0, import_promises.readdir)(menuCacheDir);
|
|
@@ -2994,7 +3005,7 @@ ${rewardLines.join("\n")}` : "";
|
|
|
2994
3005
|
} catch (e) {
|
|
2995
3006
|
logger.error("[menu-render] 写入菜单图缓存失败: %o", e);
|
|
2996
3007
|
}
|
|
2997
|
-
return
|
|
3008
|
+
return `data:image/jpeg;base64,${img.toString("base64")}`;
|
|
2998
3009
|
} catch (e) {
|
|
2999
3010
|
logger.warn("[menu-render] 渲染菜单图片失败: %o", e);
|
|
3000
3011
|
return "⚠️ 菜单图片渲染失败,请查看日志后重试。";
|
|
@@ -3002,10 +3013,47 @@ ${rewardLines.join("\n")}` : "";
|
|
|
3002
3013
|
await page.close();
|
|
3003
3014
|
}
|
|
3004
3015
|
}, "renderMenuImage");
|
|
3005
|
-
|
|
3016
|
+
const sendMenuImage = /* @__PURE__ */ __name(async (session, dataUrl) => {
|
|
3017
|
+
const logger = ctx.logger("ggcevo");
|
|
3018
|
+
if (!dataUrl.startsWith("data:image")) return dataUrl;
|
|
3019
|
+
if (session.platform !== "qq") return import_koishi.h.image(dataUrl);
|
|
3020
|
+
const bot = session.bot;
|
|
3021
|
+
const match = /^data:image\/[\w.+-]+;base64,(.*)$/.exec(dataUrl);
|
|
3022
|
+
if (!match) return "⚠️ 菜单图片数据无效。";
|
|
3023
|
+
try {
|
|
3024
|
+
const fileData = match[1];
|
|
3025
|
+
const msgSeq = (session["seq"] || 0) + 1;
|
|
3026
|
+
session["seq"] = msgSeq;
|
|
3027
|
+
if (session.isDirect) {
|
|
3028
|
+
const fileRes = await bot.internal.sendFilePrivate(session.userId, { file_type: 1, srv_send_msg: false, file_data: fileData });
|
|
3029
|
+
await bot.internal.sendPrivateMessage(session.channelId, {
|
|
3030
|
+
msg_type: 7,
|
|
3031
|
+
media: fileRes,
|
|
3032
|
+
content: "",
|
|
3033
|
+
msg_id: session.messageId,
|
|
3034
|
+
msg_seq: msgSeq
|
|
3035
|
+
});
|
|
3036
|
+
} else {
|
|
3037
|
+
const fileRes = await bot.internal.sendFileGuild(session.channelId, { file_type: 1, srv_send_msg: false, file_data: fileData });
|
|
3038
|
+
const msgRes = await bot.internal.sendMessage(session.channelId, {
|
|
3039
|
+
msg_type: 7,
|
|
3040
|
+
media: fileRes,
|
|
3041
|
+
content: "",
|
|
3042
|
+
msg_id: session.messageId,
|
|
3043
|
+
msg_seq: msgSeq
|
|
3044
|
+
});
|
|
3045
|
+
if (msgRes?.audit_id) logger.warn("[menu-render] QQ 菜单图消息进入审核(audit_id=%s), 若未开启 MESSAGE_AUDIT intent 消息可能不显示", msgRes.audit_id);
|
|
3046
|
+
}
|
|
3047
|
+
return;
|
|
3048
|
+
} catch (e) {
|
|
3049
|
+
logger.error("[menu-render] QQ 官方发送菜单图失败: %o", e);
|
|
3050
|
+
return "⚠️ QQ 发送菜单图失败,请查看日志中的错误信息。";
|
|
3051
|
+
}
|
|
3052
|
+
}, "sendMenuImage");
|
|
3053
|
+
ctx.command("咕咕之战", "查看咕咕之战内容分类菜单").action(async ({ session }) => {
|
|
3006
3054
|
if (config.menuStyle === "image") {
|
|
3007
|
-
const
|
|
3008
|
-
return
|
|
3055
|
+
const dataUrl = await renderMenuImage(buildMenuHtml("咕咕之战", "内容分类菜单 · 输入指令名即可使用"));
|
|
3056
|
+
return sendMenuImage(session, dataUrl);
|
|
3009
3057
|
}
|
|
3010
3058
|
return buildTextMenu();
|
|
3011
3059
|
});
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -108,7 +108,7 @@ npm install koishi-plugin-ggcevo
|
|
|
108
108
|
|
|
109
109
|
| 指令 | 别名 | 权限 | 说明 |
|
|
110
110
|
| --- | --- | --- | --- |
|
|
111
|
-
| `咕咕之战` |
|
|
111
|
+
| `咕咕之战` | — | — | 生成咕咕之战内容分类菜单(「每日玩法」「物品背包」「抽奖兑换」「活动」「句柄绑定」「查询信息」六类,仅收录普通用户可用指令)。根据配置项 `menuStyle` 选择渲染方式:`text`(默认)输出文字分类菜单,`image` 使用 puppeteer 渲染分类图片菜单(需启用 puppeteer 服务,未启用时自动降级为文字菜单) |
|
|
112
112
|
| `签到` | — | — | 每日签到,获取奖励并发放签到券/补签券等。每月首次签到时,若签到者的游戏句柄匹配管理员福利文档记录,额外发放 50 咕咕币津贴(仅校验句柄) |
|
|
113
113
|
| `挖矿` | — | — | 领取挂机挖矿收益(咕咕之战玩法)。每半小时收益 4 金币,单次存储上限 24 小时,领取后立即进入下一轮挖矿。累计挖矿总时长与累计收益金币数会被记录统计。受宵禁影响:17:00-24:00 禁止领取 |
|
|
114
114
|
| `探索` | — | — | 选择星系进行 12 小时探索,结束后领取收益(咕咕之战玩法)。星系:天枢(成功率100%,成功80金币)、赤潮(成功率60%,成功120金币/失败60金币)、千帆(成功率80%,成功50金币/失败25金币,成功时独立概率获得补签券×1(10%)、咕咕币1-3枚(50%),失败无道具)。金币/道具发放到背包,按星系累计统计探索次数/成功次数/累计金币。受宵禁影响:17:00-24:00 禁止 |
|
|
@@ -179,6 +179,28 @@ npm install koishi-plugin-ggcevo
|
|
|
179
179
|
|
|
180
180
|
## 更新日志
|
|
181
181
|
|
|
182
|
+
### v1.3.5
|
|
183
|
+
|
|
184
|
+
引用回复与菜单指令调整。
|
|
185
|
+
|
|
186
|
+
- **移除 `菜单` 别名**:菜单仅可通过 `咕咕之战` 指令触发
|
|
187
|
+
- **统一引用回复**:除 `咕咕之战` 外,其余指令的回复自动添加引用回复(引用用户触发指令的原消息);已自带引用的指令(如句柄绑定/切换)不会叠加,避免双引用
|
|
188
|
+
|
|
189
|
+
### v1.3.4
|
|
190
|
+
|
|
191
|
+
正式版清理:去除调试日志。
|
|
192
|
+
|
|
193
|
+
- **去除调试日志**:移除 v1.3.3 新增的 `[menu-render]` 信息级调试日志(渲染体积、QQ 上传/发送响应打印),仅保留发送失败时的错误日志,以及消息进入审核(`audit_id`)时的警告
|
|
194
|
+
- 保留 QQ 官方机器人手动富媒体上传+发送逻辑(v1.3.3 修复,不走适配器以避免静默吞错)
|
|
195
|
+
|
|
196
|
+
### v1.3.3
|
|
197
|
+
|
|
198
|
+
修复 QQ 官方机器人不发送图片菜单且无报错的问题。
|
|
199
|
+
|
|
200
|
+
- **移除图片消息的引用回复**:`咕咕之战` 图片菜单不再包裹 `<quote>` 引用(与 preview-help 一致,裸发图片)。此前消息同时携带 `message_reference` + 被动回复 `msg_id` + `media` 的组合,在 QQ 官方接口下可能被静默丢弃
|
|
201
|
+
- **QQ 官方机器人手动发送 + 真实响应日志**:图片模式下,QQ 平台不再走适配器(适配器会吞掉 QQ 接口错误导致「无报错」),改为插件直接调用 QQ 官方富媒体上传(`/v2/groups/{id}/files`)与消息发送接口,并将 QQ 真实返回(含 `file_uuid`/`audit_id`/错误码)输出到 `[menu-render]` 日志;若返回 `audit_id`(消息进入审核)会额外警告,提示需开启 `MESSAGE_AUDIT` intent
|
|
202
|
+
- **非 QQ 平台**:图片直接发送,不再带引用
|
|
203
|
+
|
|
182
204
|
### v1.3.2
|
|
183
205
|
|
|
184
206
|
图片菜单渲染对齐 preview-help 方案,新增磁盘缓存。
|