koishi-plugin-sky-blessing 0.2.2 → 0.2.3-rc.1
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/api.d.ts +19 -3
- package/lib/index.d.ts +1 -1
- package/lib/index.js +225 -133
- package/lib/types.d.ts +13 -2
- package/lib/usage.d.ts +1 -0
- package/package.json +2 -2
- package/readme.md +7 -3
package/lib/api.d.ts
CHANGED
|
@@ -1,25 +1,41 @@
|
|
|
1
1
|
import { Context } from 'koishi';
|
|
2
|
-
import { BlessingResult, PluginConfig, ParamMapping } from './types';
|
|
2
|
+
import { BlessingResult, PluginConfig, ParamMapping, BlessingStats } from './types';
|
|
3
3
|
import { SkyLogger } from './logger';
|
|
4
4
|
export declare class BlessingAPI {
|
|
5
5
|
private ctx;
|
|
6
6
|
private config;
|
|
7
7
|
private logger;
|
|
8
|
+
private stats;
|
|
8
9
|
constructor(ctx: Context, // 📡 Koishi 上下文
|
|
9
10
|
config: PluginConfig);
|
|
10
11
|
/**
|
|
11
12
|
* 设置日志器实例
|
|
12
13
|
*/
|
|
13
14
|
setLogger(logger: SkyLogger): void;
|
|
15
|
+
/**
|
|
16
|
+
* ✅ 验证配置合法性
|
|
17
|
+
*/
|
|
18
|
+
private validateConfig;
|
|
19
|
+
/**
|
|
20
|
+
* 📊 记录抽签统计数据
|
|
21
|
+
*/
|
|
22
|
+
private recordStats;
|
|
23
|
+
/**
|
|
24
|
+
* 📈 获取统计摘要
|
|
25
|
+
*/
|
|
26
|
+
getStatsSummary(): {
|
|
27
|
+
total: number;
|
|
28
|
+
recent: BlessingStats[];
|
|
29
|
+
};
|
|
14
30
|
/**
|
|
15
31
|
* 🔄 根据映射配置解析参数值
|
|
16
32
|
* ⚠️ 重复的 key 只有第一个启用的生效
|
|
17
33
|
*/
|
|
18
34
|
resolveParams(mappings: ParamMapping[], session: any): Record<string, string>;
|
|
19
35
|
/**
|
|
20
|
-
* 📡 调用 /blessing
|
|
36
|
+
* 📡 调用 /blessing 端点(带计时和统计)
|
|
21
37
|
*/
|
|
22
|
-
fetchBlessing(type: 'image' | 'json' | 'json_without_image', params?: Record<string, string
|
|
38
|
+
fetchBlessing(type: 'image' | 'json' | 'json_without_image', params?: Record<string, string>, commandType?: 'image' | 'text' | 'qq-markdown'): Promise<BlessingResult | Buffer>;
|
|
23
39
|
/**
|
|
24
40
|
* 🔄 将 buffer 转为 base64 data URI 格式
|
|
25
41
|
*/
|
package/lib/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Context } from 'koishi';
|
|
2
2
|
import { PluginConfig } from './types';
|
|
3
|
+
export { usage } from './usage';
|
|
3
4
|
import { SkyLogger } from './logger';
|
|
4
5
|
export declare const name = "sky-blessing";
|
|
5
|
-
export declare const usage = "\n<h1>Koishi \u63D2\u4EF6\uFF1Asky-blessing \u5149\u9047\u7948\u798F\u7B7E</h1>\n<h2>\uD83C\uDFAF \u529F\u80FD\u7B80\u4ECB</h2>\n<p>\u968F\u673A\u751F\u6210\u5149\u9047\u7948\u798F\u7B7E\u56FE\u7247\u7684 Koishi \u63D2\u4EF6\uFF0C\u652F\u6301\u4E09\u79CD\u8F93\u51FA\u6A21\u5F0F\uFF1A</p>\n<ul>\n <li>\uD83D\uDDBC\uFE0F <b>\u5149\u9047\u62BD\u7B7E\u56FE</b> - \u4EC5\u53D1\u9001\u7948\u798F\u7B7E\u56FE\u7247</li>\n <li>\uD83D\uDCDC <b>\u5149\u9047\u62BD\u7B7E</b> - \u53D1\u9001\u56FE\u7247 + \u6587\u5B57\u5185\u5BB9\uFF08\u8FD0\u52BF\u7B49\u7EA7\u3001\u7ED3\u7F18\u7269\u3001\u7F18\u5F69\u3001\u795D\u798F\u8BED\u7B49\uFF09</li>\n <li>\uD83D\uDCDD <b>\u5149\u9047\u62BD\u7B7Emd</b> - \u53D1\u9001\u56FE\u7247 + Markdown\u683C\u5F0F\uFF08\uD83D\uDCA1 \u4EC5\u9650 QQ \u5E73\u53F0\u53EF\u7528\uFF09</li>\n</ul>\n\n<h2>\uD83D\uDCAC \u4EA4\u6D41\u7FA4\u7EC4</h2>\n<p><del>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165QQ\u7FA4\uFF1A<b>259248174</b> \uD83C\uDF89\uFF08\u8FD9\u4E2A\u7FA4G\u4E86\uFF09</del></p>\n<p>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D\uD83D\uDCBB \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165\u65B0QQ\u7FA4\uFF1A<b>1085190201</b> \uD83C\uDF89</p>\n<p>\uD83D\uDCA1 \u5728\u7FA4\u91CC\u76F4\u63A5\u827E\u7279\u6211\uFF0C\u56DE\u590D\u7684\u66F4\u5FEB\u54E6~ \u2728</p>\n\n<hr>\n\n<h3 style=\"color: #e74c3c;\">\u2699\uFE0F \u524D\u7F6E\u4F9D\u8D56</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u4EE5\u4E0B\u4F9D\u8D56\u624D\u80FD\u6B63\u5E38\u5DE5\u4F5C\uFF1A</p>\n<ul>\n <li><b style=\"color: #e74c3c;\">http</b> - Koishi \u5185\u7F6E\u670D\u52A1\uFF0C\u7528\u4E8EHTTP\u8BF7\u6C42\u540E\u7AEFAPI <span style=\"color: #e74c3c;\">\u3010\u5FC5\u987B\u3011</span></li>\n</ul>\n\n<h3 style=\"color: #3498db;\">\uD83D\uDD17 \u540E\u7AEF\u670D\u52A1</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u914D\u5408\u540E\u7AEF\u670D\u52A1\u4F7F\u7528\uFF0C\u8BF7\u5148\u90E8\u7F72\u540E\u7AEF\uFF1A</p>\n<ul>\n <li><a href=\"https://github.com/VincentZyuApps/skyblessings-fastapi-pillow\">GitHub \u540E\u7AEF\u4ED3\u5E93</a></li>\n <li><a href=\"https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow\">Gitee \u540E\u7AEF\u4ED3\u5E93</a></li>\n</ul>\n<p>\u90E8\u7F72\u5B8C\u6210\u540E\uFF0C\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u586B\u5199 <code>backendUrl</code> \u4E3A\u540E\u7AEF\u670D\u52A1\u5730\u5740\u3002</p>\n\n<h3 style=\"color: #2ecc71;\">\uD83C\uDFAE \u547D\u4EE4\u5217\u8868</h3>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n <tr>\n <th>\u547D\u4EE4</th>\n <th>\u63CF\u8FF0</th>\n <th>\u5E73\u53F0\u9650\u5236</th>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E\u56FE</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + \u6587\u5B57\u8BE6\u60C5</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7Emd</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + Markdown\u683C\u5F0F</td>\n <td>\u4EC5QQ\u5E73\u53F0</td>\n </tr>\n</table>\n\n<h3 style=\"color: #f39c12;\">\u2699\uFE0F \u53C2\u6570\u6620\u5C04\u8BF4\u660E</h3>\n<p>\u53EF\u901A\u8FC7\u914D\u7F6E\u5C06 a~e \u4E94\u4E2A\u53C2\u6570\u952E\u6620\u5C04\u5230\u4E0D\u540C\u7684\u4F1A\u8BDD\u4FE1\u606F\uFF0C\u7528\u4E8E\u6784\u5EFA\u540E\u7AEF\u8BF7\u6C42\u7684\u79CD\u5B50\uFF1A</p>\n<ul>\n <li>\uD83C\uDF10 <b>platform</b> - \u5E73\u53F0\u540D\u79F0\uFF08\u5982 onebot\u3001discord\uFF09</li>\n <li>\uD83C\uDD94 <b>userid</b> - \u7528\u6237ID</li>\n <li>\uD83D\uDCC5 <b>date</b> - \u5F53\u524D\u65E5\u671F\uFF08YYYY-MM-DD\uFF09</li>\n <li>\uD83D\uDC64 <b>nickname</b> - \u7528\u6237\u6635\u79F0</li>\n <li>\uD83D\uDDBC\uFE0F <b>avatar_hash</b> - \u5934\u50CFMD5\u54C8\u5E0C\u503C</li>\n</ul>\n<p>\u9ED8\u8BA4\u914D\u7F6E\uFF1Aabc \u542F\u7528\uFF0Cde \u7981\u7528\u3002\u91CD\u590D\u7684 key \u53EA\u6709\u7B2C\u4E00\u4E2A\u542F\u7528\u7684\u4F1A\u751F\u6548\u3002</p>\n\n<h3 style=\"color: #9b59b6;\">\uD83D\uDCCA \u8FD4\u56DE\u5B57\u6BB5\u8BF4\u660E</h3>\n<ul>\n <li><b>fortune_level</b> - \u8FD0\u52BF\u7B49\u7EA7\uFF08\u5982\uFF1A\u5927\u5409\u3001\u4E2D\u5409\u3001\u5C0F\u5409\uFF09</li>\n <li><b>dordas</b> - \u7ED3\u7F18\u7269\uFF08\u5982\uFF1A\u7ED3\u7F18\u7269\uFF1A\u9065\u9CB2\uFF09</li>\n <li><b>dordas_color</b> - \u7F18\u5F69\uFF08\u5982\uFF1A\u7F18\u5F69\uFF1A\u68A7\u679D\u7EFF\uFF09</li>\n <li><b>color_hex</b> - \u989C\u8272\u5341\u516D\u8FDB\u5236\u503C\uFF08\u5982\uFF1A#4fd69e\uFF09</li>\n <li><b>blessing</b> - \u795D\u798F\u8BED</li>\n <li><b>entry</b> - \u5B9C\u5FCC\u63D0\u793A\uFF08\u5982\uFF1A\u5FCC\uFF1A\u4E00\u610F\u5B64\u884C\uFF09</li>\n</ul>\n";
|
|
6
6
|
export declare const inject: {
|
|
7
7
|
required: string[];
|
|
8
8
|
};
|
package/lib/index.js
CHANGED
|
@@ -70,9 +70,9 @@ var ConfigSchema = import_koishi.Schema.intersect([
|
|
|
70
70
|
// 🌐 后端连接设置
|
|
71
71
|
import_koishi.Schema.object({
|
|
72
72
|
backendUrl: import_koishi.Schema.string().default("http://127.0.0.1:51205").description("🔗 后端服务地址\n\n💡 可以去这里部署后端: `https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow`"),
|
|
73
|
-
sendBase64: import_koishi.Schema.boolean().default(false).description("🖼️ 是否将图片 Base64 编码后发送(关闭则发送 URL 链接)"),
|
|
74
73
|
enableQuote: import_koishi.Schema.boolean().default(true).description("💬 开启后,本插件发送的所有消息都会引用(回复)触发指令的消息"),
|
|
75
|
-
qqMarkdownSendImage: import_koishi.Schema.boolean().default(true).description("🖼️ 「光遇抽签md」命令是否同时发送图片(关闭则仅发送 Markdown 文本)")
|
|
74
|
+
qqMarkdownSendImage: import_koishi.Schema.boolean().default(true).description("🖼️ 「光遇抽签md」命令是否同时发送图片(关闭则仅发送 Markdown 文本)"),
|
|
75
|
+
alignWithTab: import_koishi.Schema.boolean().default(true).description("📏 文字对齐:在冒号前后添加制表符使文本对齐(⚠️ 仅对「光遇抽签」和「光遇抽签md」的文字部分生效,不影响图片)")
|
|
76
76
|
}).description("🌐 后端设置"),
|
|
77
77
|
// 📊 参数映射表设置
|
|
78
78
|
import_koishi.Schema.object({
|
|
@@ -88,82 +88,108 @@ var ConfigSchema = import_koishi.Schema.intersect([
|
|
|
88
88
|
}).description("🔧 调试设置")
|
|
89
89
|
]);
|
|
90
90
|
|
|
91
|
-
// src/
|
|
92
|
-
var
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
<
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
91
|
+
// src/usage.ts
|
|
92
|
+
var import_fs = require("fs");
|
|
93
|
+
var import_path = require("path");
|
|
94
|
+
var pkg = JSON.parse((0, import_fs.readFileSync)((0, import_path.resolve)(__dirname, "../package.json"), "utf-8"));
|
|
95
|
+
var usage = `
|
|
96
|
+
<h1>🎋 Sky Blessing 光遇祈福签</h1>
|
|
97
|
+
<h2>📦版本号: v${pkg.version}</h2>
|
|
98
|
+
|
|
99
|
+
<hr>
|
|
100
|
+
|
|
101
|
+
<h2>📖 简介</h2>
|
|
102
|
+
<p>${pkg.description}</p>
|
|
103
|
+
|
|
104
|
+
<hr>
|
|
105
|
+
|
|
106
|
+
<h2>🔗 相关链接</h2>
|
|
107
|
+
<p>
|
|
108
|
+
<a href="https://www.npmjs.com/package/koishi-plugin-sky-blessing" target="_blank">
|
|
109
|
+
<img src="https://img.shields.io/npm/v/koishi-plugin-sky-blessing?style=flat-square" alt="npm version">
|
|
110
|
+
</a>
|
|
111
|
+
<a href="https://github.com/VincentZyuApps/skyblessings-fastapi-pillow" target="_blank">
|
|
112
|
+
<img src="https://img.shields.io/badge/Backend-GitHub-181717?style=for-the-badge&logo=github&logoColor=white" alt="GitHub Backend">
|
|
113
|
+
</a>
|
|
114
|
+
<a href="https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow" target="_blank">
|
|
115
|
+
<img src="https://img.shields.io/badge/Backend-Gitee-C71D23?style=for-the-badge&logo=gitee&logoColor=white" alt="Gitee Backend">
|
|
116
|
+
</a>
|
|
117
|
+
<a href="https://qm.qq.com/q/ZN7fxZ3qCq" target="_blank">
|
|
118
|
+
<img src="https://img.shields.io/badge/QQ群-1085190201-1AAD19?style=flat-square" alt="QQ群">
|
|
119
|
+
</a>
|
|
120
|
+
<a href="https://forum.koishi.xyz/t/topic/12467" target="_blank">
|
|
121
|
+
<img src="https://img.shields.io/badge/Koishi%20Forum-12558-5546A3?style=for-the-badge&logo=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Ff%2Ff3%2FKoishi.js_Logo.png&logoColor=white" alt="Forum">
|
|
122
|
+
</a>
|
|
123
|
+
</p>
|
|
101
124
|
|
|
102
|
-
<
|
|
103
|
-
|
|
104
|
-
<
|
|
125
|
+
<hr>
|
|
126
|
+
|
|
127
|
+
<h2>💬 交流反馈</h2>
|
|
128
|
+
<p>🐛 Bug 反馈 / 💡 建议 / 👨💻 插件开发交流,欢迎加群:</p>
|
|
129
|
+
<p><del>💬 插件使用问题 / 🐛 Bug反馈 / 👨💻 插件开发交流,欢迎加入QQ群:<b>259248174</b> 🎉(这个群G了</del></p>
|
|
130
|
+
<p>💬 插件使用问题 / 🐛 Bug反馈 / 👨💻 插件开发交流,欢迎加入QQ群:<b>259248174🎉</p>
|
|
105
131
|
<p>💡 在群里直接艾特我,回复的更快哦~ ✨</p>
|
|
106
132
|
|
|
107
133
|
<hr>
|
|
108
134
|
|
|
109
|
-
<
|
|
110
|
-
<p>本插件需要以下依赖才能正常工作:</p>
|
|
135
|
+
<h2>⚠️ 前置条件</h2>
|
|
111
136
|
<ul>
|
|
112
|
-
<li
|
|
137
|
+
<li>需要 Koishi 的 <code>http</code> 服务</li>
|
|
138
|
+
<li>需要先部署后端服务,并在配置中填写 <code>backendUrl</code></li>
|
|
139
|
+
<li><code>光遇抽签md</code> 仅支持 QQ 平台</li>
|
|
113
140
|
</ul>
|
|
114
141
|
|
|
115
|
-
<
|
|
116
|
-
|
|
117
|
-
<
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
<
|
|
142
|
+
<hr>
|
|
143
|
+
|
|
144
|
+
<h2>⌨️ 指令说明</h2>
|
|
145
|
+
|
|
146
|
+
<h3>1️⃣ 光遇抽签图</h3>
|
|
147
|
+
<p>仅发送祈福签图片。</p>
|
|
148
|
+
<pre><code>光遇抽签图</code></pre>
|
|
149
|
+
|
|
150
|
+
<h3>2️⃣ 光遇抽签</h3>
|
|
151
|
+
<p>发送图片和文字详情,包括运势、结缘物、缘彩、祝福语、宜忌。</p>
|
|
152
|
+
<pre><code>光遇抽签</code></pre>
|
|
122
153
|
|
|
123
|
-
<h3
|
|
124
|
-
<
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
</tr>
|
|
135
|
-
<tr>
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
</tr>
|
|
140
|
-
<tr>
|
|
141
|
-
<td><code>光遇抽签md</code></td>
|
|
142
|
-
<td>获取祈福签图片 + Markdown格式</td>
|
|
143
|
-
<td>仅QQ平台</td>
|
|
144
|
-
</tr>
|
|
154
|
+
<h3>3️⃣ 光遇抽签md</h3>
|
|
155
|
+
<p>发送 QQ 原生 Markdown 版本,可选是否同时发送图片。</p>
|
|
156
|
+
<pre><code>光遇抽签md</code></pre>
|
|
157
|
+
|
|
158
|
+
<hr>
|
|
159
|
+
|
|
160
|
+
<h2>⚙️ 配置项</h2>
|
|
161
|
+
<table>
|
|
162
|
+
<tr><th>配置项</th><th>类型</th><th>默认值</th><th>说明</th></tr>
|
|
163
|
+
<tr><td><code>commandNames.image</code></td><td>string</td><td><code>光遇抽签图</code></td><td>仅图片命令名</td></tr>
|
|
164
|
+
<tr><td><code>commandNames.text</code></td><td>string</td><td><code>光遇抽签</code></td><td>图片 + 文字命令名</td></tr>
|
|
165
|
+
<tr><td><code>commandNames.qqMarkdown</code></td><td>string</td><td><code>光遇抽签md</code></td><td>QQ Markdown 命令名</td></tr>
|
|
166
|
+
<tr><td><code>backendUrl</code></td><td>string</td><td><code>http://127.0.0.1:51205</code></td><td>后端服务地址</td></tr>
|
|
167
|
+
<tr><td><code>enableQuote</code></td><td>boolean</td><td><code>true</code></td><td>发送时引用原消息</td></tr>
|
|
168
|
+
<tr><td><code>qqMarkdownSendImage</code></td><td>boolean</td><td><code>true</code></td><td>Markdown 命令是否额外发送图片</td></tr>
|
|
169
|
+
<tr><td><code>alignWithTab</code></td><td>boolean</td><td><code>true</code></td><td>文字模式中使用制表符对齐</td></tr>
|
|
170
|
+
<tr><td><code>logLevel</code></td><td>string</td><td><code>info</code></td><td>日志级别</td></tr>
|
|
171
|
+
<tr><td><code>paramMappings</code></td><td>table</td><td><code>abc 启用</code></td><td>请求参数 a~e 的映射表</td></tr>
|
|
145
172
|
</table>
|
|
146
173
|
|
|
147
|
-
<
|
|
148
|
-
<p>可通过配置将 a~e 五个参数键映射到不同的会话信息,用于构建后端请求的种子:</p>
|
|
149
|
-
<ul>
|
|
150
|
-
<li>🌐 <b>platform</b> - 平台名称(如 onebot、discord)</li>
|
|
151
|
-
<li>🆔 <b>userid</b> - 用户ID</li>
|
|
152
|
-
<li>📅 <b>date</b> - 当前日期(YYYY-MM-DD)</li>
|
|
153
|
-
<li>👤 <b>nickname</b> - 用户昵称</li>
|
|
154
|
-
<li>🖼️ <b>avatar_hash</b> - 头像MD5哈希值</li>
|
|
155
|
-
</ul>
|
|
156
|
-
<p>默认配置:abc 启用,de 禁用。重复的 key 只有第一个启用的会生效。</p>
|
|
174
|
+
<hr>
|
|
157
175
|
|
|
158
|
-
<
|
|
176
|
+
<h2>🧩 参数映射</h2>
|
|
177
|
+
<p>可将后端请求参数 <code>a ~ e</code> 映射到以下来源:</p>
|
|
159
178
|
<ul>
|
|
160
|
-
<li><
|
|
161
|
-
<li><
|
|
162
|
-
<li><
|
|
163
|
-
<li><
|
|
164
|
-
<li><
|
|
165
|
-
<li><b>entry</b> - 宜忌提示(如:忌:一意孤行)</li>
|
|
179
|
+
<li><code>platform</code>:平台名</li>
|
|
180
|
+
<li><code>userid</code>:用户 ID</li>
|
|
181
|
+
<li><code>date</code>:当前日期</li>
|
|
182
|
+
<li><code>nickname</code>:昵称</li>
|
|
183
|
+
<li><code>avatar_hash</code>:头像哈希</li>
|
|
166
184
|
</ul>
|
|
185
|
+
<p>默认启用 <code>a=platform</code>、<code>b=userid</code>、<code>c=date</code>。</p>
|
|
186
|
+
|
|
187
|
+
<hr>
|
|
188
|
+
|
|
189
|
+
<h2>🌐 后端项目</h2>
|
|
190
|
+
<p>后端参考:</p>
|
|
191
|
+
<p><a href="https://github.com/VincentZyuApps/skyblessings-fastapi-pillow" target="_blank">GitHub: skyblessings-fastapi-pillow</a></p>
|
|
192
|
+
<p><a href="https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow" target="_blank">Gitee: skyblessings-fastapi-pillow</a></p>
|
|
167
193
|
`;
|
|
168
194
|
|
|
169
195
|
// src/logger.ts
|
|
@@ -235,6 +261,7 @@ __name(createLogger, "createLogger");
|
|
|
235
261
|
// src/api.ts
|
|
236
262
|
var crypto = __toESM(require("crypto"));
|
|
237
263
|
var BlessingAPI = class {
|
|
264
|
+
// 📊 统计数据存储
|
|
238
265
|
constructor(ctx, config) {
|
|
239
266
|
this.ctx = ctx;
|
|
240
267
|
this.config = config;
|
|
@@ -244,11 +271,62 @@ var BlessingAPI = class {
|
|
|
244
271
|
__name(this, "BlessingAPI");
|
|
245
272
|
}
|
|
246
273
|
logger;
|
|
274
|
+
stats = [];
|
|
247
275
|
/**
|
|
248
276
|
* 设置日志器实例
|
|
249
277
|
*/
|
|
250
278
|
setLogger(logger) {
|
|
251
279
|
this.logger = logger;
|
|
280
|
+
this.validateConfig();
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* ✅ 验证配置合法性
|
|
284
|
+
*/
|
|
285
|
+
validateConfig() {
|
|
286
|
+
try {
|
|
287
|
+
const url = new URL(this.config.backendUrl);
|
|
288
|
+
if (!["http:", "https:"].includes(url.protocol)) {
|
|
289
|
+
this.logger.error(`❌ backendUrl 协议无效: ${this.config.backendUrl} (必须是 http:// 或 https://)`);
|
|
290
|
+
} else {
|
|
291
|
+
this.logger.info(`✅ backendUrl 格式验证通过: ${this.config.backendUrl}`);
|
|
292
|
+
}
|
|
293
|
+
} catch (error) {
|
|
294
|
+
this.logger.error(`❌ backendUrl 格式无效: ${this.config.backendUrl} (${error instanceof Error ? error.message : "未知错误"})`);
|
|
295
|
+
}
|
|
296
|
+
const enabledMappings = this.config.paramMappings.filter((m) => m.enabled);
|
|
297
|
+
const keyMap = /* @__PURE__ */ new Map();
|
|
298
|
+
for (let i = 0; i < enabledMappings.length; i++) {
|
|
299
|
+
const mapping = enabledMappings[i];
|
|
300
|
+
if (keyMap.has(mapping.key)) {
|
|
301
|
+
const firstIndex = keyMap.get(mapping.key);
|
|
302
|
+
this.logger.warn(
|
|
303
|
+
`⚠️ 参数映射存在重复的 key "${mapping.key}":第 ${firstIndex + 1} 行和第 ${i + 1} 行冲突,只有第 ${firstIndex + 1} 行会生效`
|
|
304
|
+
);
|
|
305
|
+
} else {
|
|
306
|
+
keyMap.set(mapping.key, i);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
this.logger.info(`✅ 配置验证完成`);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* 📊 记录抽签统计数据
|
|
313
|
+
*/
|
|
314
|
+
recordStats(stats) {
|
|
315
|
+
this.stats.push(stats);
|
|
316
|
+
this.logger.debug(`📊 统计数据已记录 (总计: ${this.stats.length} 次抽签)`);
|
|
317
|
+
if (this.stats.length > 1e3) {
|
|
318
|
+
this.stats = this.stats.slice(-1e3);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* 📈 获取统计摘要
|
|
323
|
+
*/
|
|
324
|
+
getStatsSummary() {
|
|
325
|
+
return {
|
|
326
|
+
total: this.stats.length,
|
|
327
|
+
recent: this.stats.slice(-10)
|
|
328
|
+
// 返回最近10条
|
|
329
|
+
};
|
|
252
330
|
}
|
|
253
331
|
/**
|
|
254
332
|
* 🔄 根据映射配置解析参数值
|
|
@@ -257,59 +335,87 @@ var BlessingAPI = class {
|
|
|
257
335
|
resolveParams(mappings, session) {
|
|
258
336
|
const params = {};
|
|
259
337
|
const seenKeys = /* @__PURE__ */ new Set();
|
|
260
|
-
this.logger.
|
|
338
|
+
this.logger.debug(`[BlessingAPI] 🔍 resolveParams: ${mappings.length} 条映射, session.platform=${session.platform}, userId=${session.userId}`);
|
|
261
339
|
for (const mapping of mappings) {
|
|
262
340
|
if (!mapping.enabled || seenKeys.has(mapping.key)) {
|
|
263
|
-
this.logger.
|
|
341
|
+
this.logger.debug(`[BlessingAPI] ⏭️ 跳过 key=${mapping.key} (enabled=${mapping.enabled}, seen=${seenKeys.has(mapping.key)})`);
|
|
264
342
|
continue;
|
|
265
343
|
}
|
|
266
344
|
seenKeys.add(mapping.key);
|
|
267
345
|
switch (mapping.value) {
|
|
268
346
|
case "platform":
|
|
269
347
|
params[mapping.key] = session.platform ?? "";
|
|
270
|
-
this.logger.
|
|
348
|
+
this.logger.debug(`[BlessingAPI] 🌐 ${mapping.key}=platform -> "${params[mapping.key]}"`);
|
|
271
349
|
break;
|
|
272
350
|
case "userid":
|
|
273
351
|
params[mapping.key] = String(session.userId ?? "");
|
|
274
|
-
this.logger.
|
|
352
|
+
this.logger.debug(`[BlessingAPI] 🆔 ${mapping.key}=userid -> "${params[mapping.key]}"`);
|
|
275
353
|
break;
|
|
276
354
|
case "date":
|
|
277
355
|
params[mapping.key] = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
278
|
-
this.logger.
|
|
356
|
+
this.logger.debug(`[BlessingAPI] 📅 ${mapping.key}=date -> "${params[mapping.key]}"`);
|
|
279
357
|
break;
|
|
280
358
|
case "nickname":
|
|
281
359
|
params[mapping.key] = session.username ?? "";
|
|
282
|
-
this.logger.
|
|
360
|
+
this.logger.debug(`[BlessingAPI] 👤 ${mapping.key}=nickname -> "${params[mapping.key]}"`);
|
|
283
361
|
break;
|
|
284
362
|
case "avatar_hash":
|
|
285
363
|
params[mapping.key] = session.avatar ? crypto.createHash("md5").update(session.avatar).digest("hex") : "";
|
|
286
|
-
this.logger.
|
|
364
|
+
this.logger.debug(`[BlessingAPI] 🖼️ ${mapping.key}=avatar_hash -> "${params[mapping.key].substring(0, 8)}..."`);
|
|
287
365
|
break;
|
|
288
366
|
}
|
|
289
367
|
}
|
|
290
|
-
this.logger.
|
|
368
|
+
this.logger.debug(`[BlessingAPI] ✅ 最终参数: ${JSON.stringify(params)}`);
|
|
291
369
|
return params;
|
|
292
370
|
}
|
|
293
371
|
/**
|
|
294
|
-
* 📡 调用 /blessing
|
|
372
|
+
* 📡 调用 /blessing 端点(带计时和统计)
|
|
295
373
|
*/
|
|
296
|
-
async fetchBlessing(type, params = {}) {
|
|
374
|
+
async fetchBlessing(type, params = {}, commandType = "image") {
|
|
297
375
|
const url = `${this.config.backendUrl}/blessing`;
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
376
|
+
const startTime = Date.now();
|
|
377
|
+
this.logger.debug(`[BlessingAPI] 🚀 fetchBlessing type=${type} url=${url}`);
|
|
378
|
+
try {
|
|
379
|
+
let result;
|
|
380
|
+
if (type === "image") {
|
|
381
|
+
const response = await this.ctx.http.get(url, {
|
|
382
|
+
responseType: "arraybuffer",
|
|
383
|
+
params: { type, ...params }
|
|
384
|
+
});
|
|
385
|
+
result = Buffer.from(response);
|
|
386
|
+
this.logger.debug(`[BlessingAPI] 🖼️ 图片响应: ${result.length} bytes`);
|
|
387
|
+
} else {
|
|
388
|
+
const data = await this.ctx.http.get(url, {
|
|
389
|
+
params: { type, ...params }
|
|
390
|
+
});
|
|
391
|
+
result = data;
|
|
392
|
+
const responseTime = Date.now() - startTime;
|
|
393
|
+
if ("fortune_level" in data) {
|
|
394
|
+
const stats = {
|
|
395
|
+
timestamp: Date.now(),
|
|
396
|
+
userId: params.b || "",
|
|
397
|
+
platform: params.a || "",
|
|
398
|
+
username: params.d || void 0,
|
|
399
|
+
fortune_level: data.fortune_level,
|
|
400
|
+
dordas: data.dordas,
|
|
401
|
+
dordas_color: data.dordas_color,
|
|
402
|
+
entry: data.entry,
|
|
403
|
+
responseTime,
|
|
404
|
+
commandType
|
|
405
|
+
};
|
|
406
|
+
this.recordStats(stats);
|
|
407
|
+
this.logger.info(`✨ 抽签结果: ${data.fortune_level} | 结缘物: ${data.dordas} | 耗时: ${responseTime}ms`);
|
|
408
|
+
}
|
|
409
|
+
this.logger.debug(`[BlessingAPI] 📄 JSON响应: fortune_level=${data.fortune_level}`);
|
|
410
|
+
}
|
|
411
|
+
const totalTime = Date.now() - startTime;
|
|
412
|
+
this.logger.debug(`[BlessingAPI] ✅ API 请求成功,总耗时: ${totalTime}ms`);
|
|
413
|
+
return result;
|
|
414
|
+
} catch (error) {
|
|
415
|
+
const totalTime = Date.now() - startTime;
|
|
416
|
+
this.logger.error(`[BlessingAPI] ❌ API 请求失败 (耗时: ${totalTime}ms): ${error instanceof Error ? error.message : String(error)}`);
|
|
417
|
+
throw error;
|
|
307
418
|
}
|
|
308
|
-
const data = await this.ctx.http.get(url, {
|
|
309
|
-
params: { type, ...params }
|
|
310
|
-
});
|
|
311
|
-
this.logger.info(`[BlessingAPI] 📄 JSON响应: fortune_level=${data.fortune_level}`);
|
|
312
|
-
return data;
|
|
313
419
|
}
|
|
314
420
|
/**
|
|
315
421
|
* 🔄 将 buffer 转为 base64 data URI 格式
|
|
@@ -324,21 +430,15 @@ var import_koishi2 = require("koishi");
|
|
|
324
430
|
function registerImageCommand(ctx, config, api, logger) {
|
|
325
431
|
ctx.command(config.commandNames.image).action(async ({ session }) => {
|
|
326
432
|
logger.info(`[光遇抽签图] 🎯 命令触发, userId=${session.userId}, platform=${session.platform}`);
|
|
327
|
-
logger.info(`[光遇抽签图] ⚙️ 配置: backendUrl=${config.backendUrl}
|
|
433
|
+
logger.info(`[光遇抽签图] ⚙️ 配置: backendUrl=${config.backendUrl}`);
|
|
328
434
|
logger.info(`[光遇抽签图] 📋 paramMappings: ${JSON.stringify(config.paramMappings)}`);
|
|
329
435
|
try {
|
|
330
436
|
const params = api.resolveParams(config.paramMappings, session);
|
|
331
437
|
logger.info(`[光遇抽签图] ✅ 解析参数: ${JSON.stringify(params)}`);
|
|
332
|
-
const imageBuffer = await api.fetchBlessing("image", params);
|
|
438
|
+
const imageBuffer = await api.fetchBlessing("image", params, "image");
|
|
333
439
|
logger.info(`[光遇抽签图] 🖼️ 图片接收成功, 大小=${imageBuffer.length} bytes`);
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
message = (0, import_koishi2.h)("image", { url: api.toBase64Image(imageBuffer) });
|
|
337
|
-
} else {
|
|
338
|
-
const url = `${config.backendUrl}/blessing?type=image&${new URLSearchParams(params)}`;
|
|
339
|
-
logger.info(`[光遇抽签图] 🔗 图片URL: ${url}`);
|
|
340
|
-
message = import_koishi2.h.image(url);
|
|
341
|
-
}
|
|
440
|
+
const message = (0, import_koishi2.h)("image", { url: api.toBase64Image(imageBuffer) });
|
|
441
|
+
logger.info(`[光遇抽签图] 🖼️ 图片已转换为Base64`);
|
|
342
442
|
logger.info(`[光遇抽签图] 📤 发送消息中...`);
|
|
343
443
|
const quotePart = config.enableQuote ? import_koishi2.h.quote(session.messageId) : "";
|
|
344
444
|
await session.send(`${quotePart}${message}`);
|
|
@@ -358,30 +458,27 @@ var import_koishi3 = require("koishi");
|
|
|
358
458
|
function registerTextCommand(ctx, config, api, logger) {
|
|
359
459
|
ctx.command(config.commandNames.text).action(async ({ session }) => {
|
|
360
460
|
logger.info(`[光遇抽签] 🎯 命令触发, userId=${session.userId}, platform=${session.platform}`);
|
|
361
|
-
logger.info(`[光遇抽签] ⚙️ 配置: backendUrl=${config.backendUrl}
|
|
461
|
+
logger.info(`[光遇抽签] ⚙️ 配置: backendUrl=${config.backendUrl}`);
|
|
362
462
|
try {
|
|
363
463
|
const params = api.resolveParams(config.paramMappings, session);
|
|
364
464
|
logger.info(`[光遇抽签] ✅ 解析参数: ${JSON.stringify(params)}`);
|
|
365
|
-
const result = await api.fetchBlessing("json", params);
|
|
465
|
+
const result = await api.fetchBlessing("json", params, "text");
|
|
366
466
|
logger.info(`[光遇抽签] 📄 JSON结果: fortune_level=${result.fortune_level}, dordas=${result.dordas}`);
|
|
467
|
+
const TAB = config.alignWithTab ? " " : "";
|
|
367
468
|
const textParts = [
|
|
368
|
-
`🎋 ${result.fortune_level}
|
|
369
|
-
result.dordas
|
|
370
|
-
`${result.dordas_color}`,
|
|
371
|
-
|
|
372
|
-
|
|
469
|
+
`🎋 ${result.fortune_level} ✨`,
|
|
470
|
+
`${result.dordas.split(":")[0]}:${TAB}${result.dordas.split(":")[1] || ""}`,
|
|
471
|
+
`${result.dordas_color.split(":")[0]}:${TAB}${result.dordas_color.split(":")[1] || ""}`,
|
|
472
|
+
`背景色:${TAB}\`${result.color_hex}\``,
|
|
473
|
+
"",
|
|
474
|
+
`「${result.blessing}」
|
|
475
|
+
`,
|
|
476
|
+
`${result.entry.split(":")[0]}:${TAB}${result.entry.split(":")[1] || ""}`
|
|
373
477
|
];
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
url: `data:image/png;base64,${result.image_base64}`
|
|
379
|
-
});
|
|
380
|
-
} else {
|
|
381
|
-
logger.info(`[光遇抽签] 📡 单独请求图片`);
|
|
382
|
-
const imageBuffer = await api.fetchBlessing("image", params);
|
|
383
|
-
imageSegment = (0, import_koishi3.h)("image", { url: api.toBase64Image(imageBuffer) });
|
|
384
|
-
}
|
|
478
|
+
logger.info(`[光遇抽签] 🖼️ 使用 JSON 中的 base64 图片`);
|
|
479
|
+
const imageSegment = (0, import_koishi3.h)("image", {
|
|
480
|
+
url: `data:image/png;base64,${result.image_base64}`
|
|
481
|
+
});
|
|
385
482
|
logger.info(`[光遇抽签] 📤 发送消息中...`);
|
|
386
483
|
const quotePart = config.enableQuote ? import_koishi3.h.quote(session.messageId) : "";
|
|
387
484
|
await session.send(`${quotePart}${imageSegment}
|
|
@@ -411,7 +508,7 @@ function registerQQMarkdownCommand(ctx, config, api, logger) {
|
|
|
411
508
|
try {
|
|
412
509
|
const params = api.resolveParams(config.paramMappings, session);
|
|
413
510
|
logger.info(`[光遇抽签md] ✅ 解析参数: ${JSON.stringify(params)}`);
|
|
414
|
-
const result = await api.fetchBlessing("json", params);
|
|
511
|
+
const result = await api.fetchBlessing("json", params, "qq-markdown");
|
|
415
512
|
logger.info(`[光遇抽签md] 📄 JSON结果: fortune_level=${result.fortune_level}`);
|
|
416
513
|
const extractLabelAndValue = /* @__PURE__ */ __name((text) => {
|
|
417
514
|
const idx = text.indexOf(":");
|
|
@@ -421,25 +518,21 @@ function registerQQMarkdownCommand(ctx, config, api, logger) {
|
|
|
421
518
|
const [dordasLabel, dordasValue] = extractLabelAndValue(result.dordas);
|
|
422
519
|
const [colorLabel, colorValue] = extractLabelAndValue(result.dordas_color);
|
|
423
520
|
const [entryLabel, entryValue] = extractLabelAndValue(result.entry);
|
|
424
|
-
const
|
|
521
|
+
const TAB = config.alignWithTab ? " " : "";
|
|
522
|
+
const markdownContent = `# 🎋 ${result.fortune_level} ✨
|
|
425
523
|
|
|
426
|
-
**${dordasLabel}**:${dordasValue}
|
|
427
|
-
**${colorLabel}**:${colorValue}
|
|
428
|
-
|
|
524
|
+
**${dordasLabel}**:${TAB}${dordasValue}
|
|
525
|
+
**${colorLabel}**:${TAB}${colorValue}
|
|
526
|
+
**背景色**:${TAB}\`${result.color_hex}\`
|
|
429
527
|
|
|
430
|
-
>
|
|
528
|
+
> 「${result.blessing}」
|
|
431
529
|
|
|
432
|
-
**${entryLabel}**:${entryValue}`;
|
|
530
|
+
**${entryLabel}**:${TAB}${entryValue}`;
|
|
433
531
|
logger.info(`[光遇抽签md] 📄 Markdown内容: ${markdownContent}`);
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
});
|
|
439
|
-
} else {
|
|
440
|
-
const imageBuffer = await api.fetchBlessing("image", params);
|
|
441
|
-
imageSegment = (0, import_koishi4.h)("image", { url: api.toBase64Image(imageBuffer) });
|
|
442
|
-
}
|
|
532
|
+
logger.info(`[光遇抽签md] 🖼️ 使用 JSON 中的 base64 图片`);
|
|
533
|
+
const imageSegment = (0, import_koishi4.h)("image", {
|
|
534
|
+
url: `data:image/png;base64,${result.image_base64}`
|
|
535
|
+
});
|
|
443
536
|
logger.info(`[光遇抽签md] 📤 发送图片中...`);
|
|
444
537
|
const quotePart = config.enableQuote ? import_koishi4.h.quote(session.messageId) : "";
|
|
445
538
|
await session.send(`${quotePart}${imageSegment}`);
|
|
@@ -464,7 +557,6 @@ __name(registerQQMarkdownCommand, "registerQQMarkdownCommand");
|
|
|
464
557
|
|
|
465
558
|
// src/index.ts
|
|
466
559
|
var name = "sky-blessing";
|
|
467
|
-
var usage = USAGE;
|
|
468
560
|
var inject = {
|
|
469
561
|
required: ["http"]
|
|
470
562
|
};
|
package/lib/types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare const USAGE = "\n<h1>Koishi \u63D2\u4EF6\uFF1Asky-blessing \u5149\u9047\u7948\u798F\u7B7E</h1>\n<h2>\uD83C\uDFAF \u529F\u80FD\u7B80\u4ECB</h2>\n<p>\u968F\u673A\u751F\u6210\u5149\u9047\u7948\u798F\u7B7E\u56FE\u7247\u7684 Koishi \u63D2\u4EF6\uFF0C\u652F\u6301\u4E09\u79CD\u8F93\u51FA\u6A21\u5F0F\uFF1A</p>\n<ul>\n <li>\uD83D\uDDBC\uFE0F <b>\u5149\u9047\u62BD\u7B7E\u56FE</b> - \u4EC5\u53D1\u9001\u7948\u798F\u7B7E\u56FE\u7247</li>\n <li>\uD83D\uDCDC <b>\u5149\u9047\u62BD\u7B7E</b> - \u53D1\u9001\u56FE\u7247 + \u6587\u5B57\u5185\u5BB9\uFF08\u8FD0\u52BF\u7B49\u7EA7\u3001\u7ED3\u7F18\u7269\u3001\u7F18\u5F69\u3001\u795D\u798F\u8BED\u7B49\uFF09</li>\n <li>\uD83D\uDCDD <b>\u5149\u9047\u62BD\u7B7Emd</b> - \u53D1\u9001\u56FE\u7247 + Markdown\u683C\u5F0F\uFF08\uD83D\uDCA1 \u4EC5\u9650 QQ \u5E73\u53F0\u53EF\u7528\uFF09</li>\n</ul>\n\n<h2>\uD83D\uDCAC \u4EA4\u6D41\u7FA4\u7EC4</h2>\n<p><del>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165QQ\u7FA4\uFF1A<b>259248174</b> \uD83C\uDF89\uFF08\u8FD9\u4E2A\u7FA4G\u4E86\uFF09</del></p>\n<p>\uD83D\uDCAC \u63D2\u4EF6\u4F7F\u7528\u95EE\u9898 / \uD83D\uDC1B Bug\u53CD\u9988 / \uD83D\uDC68\u200D\uD83D\uDCBB \u63D2\u4EF6\u5F00\u53D1\u4EA4\u6D41\uFF0C\u6B22\u8FCE\u52A0\u5165\u65B0QQ\u7FA4\uFF1A<b>1085190201</b> \uD83C\uDF89</p>\n<p>\uD83D\uDCA1 \u5728\u7FA4\u91CC\u76F4\u63A5\u827E\u7279\u6211\uFF0C\u56DE\u590D\u7684\u66F4\u5FEB\u54E6~ \u2728</p>\n\n<hr>\n\n<h3 style=\"color: #e74c3c;\">\u2699\uFE0F \u524D\u7F6E\u4F9D\u8D56</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u4EE5\u4E0B\u4F9D\u8D56\u624D\u80FD\u6B63\u5E38\u5DE5\u4F5C\uFF1A</p>\n<ul>\n <li><b style=\"color: #e74c3c;\">http</b> - Koishi \u5185\u7F6E\u670D\u52A1\uFF0C\u7528\u4E8EHTTP\u8BF7\u6C42\u540E\u7AEFAPI <span style=\"color: #e74c3c;\">\u3010\u5FC5\u987B\u3011</span></li>\n</ul>\n\n<h3 style=\"color: #3498db;\">\uD83D\uDD17 \u540E\u7AEF\u670D\u52A1</h3>\n<p>\u672C\u63D2\u4EF6\u9700\u8981\u914D\u5408\u540E\u7AEF\u670D\u52A1\u4F7F\u7528\uFF0C\u8BF7\u5148\u90E8\u7F72\u540E\u7AEF\uFF1A</p>\n<ul>\n <li><a href=\"https://github.com/VincentZyuApps/skyblessings-fastapi-pillow\">GitHub \u540E\u7AEF\u4ED3\u5E93</a></li>\n <li><a href=\"https://gitee.com/vincent-zyu/skyblessings-fastapi-pillow\">Gitee \u540E\u7AEF\u4ED3\u5E93</a></li>\n</ul>\n<p>\u90E8\u7F72\u5B8C\u6210\u540E\uFF0C\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u586B\u5199 <code>backendUrl</code> \u4E3A\u540E\u7AEF\u670D\u52A1\u5730\u5740\u3002</p>\n\n<h3 style=\"color: #2ecc71;\">\uD83C\uDFAE \u547D\u4EE4\u5217\u8868</h3>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n <tr>\n <th>\u547D\u4EE4</th>\n <th>\u63CF\u8FF0</th>\n <th>\u5E73\u53F0\u9650\u5236</th>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E\u56FE</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7E</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + \u6587\u5B57\u8BE6\u60C5</td>\n <td>\u65E0</td>\n </tr>\n <tr>\n <td><code>\u5149\u9047\u62BD\u7B7Emd</code></td>\n <td>\u83B7\u53D6\u7948\u798F\u7B7E\u56FE\u7247 + Markdown\u683C\u5F0F</td>\n <td>\u4EC5QQ\u5E73\u53F0</td>\n </tr>\n</table>\n\n<h3 style=\"color: #f39c12;\">\u2699\uFE0F \u53C2\u6570\u6620\u5C04\u8BF4\u660E</h3>\n<p>\u53EF\u901A\u8FC7\u914D\u7F6E\u5C06 a~e \u4E94\u4E2A\u53C2\u6570\u952E\u6620\u5C04\u5230\u4E0D\u540C\u7684\u4F1A\u8BDD\u4FE1\u606F\uFF0C\u7528\u4E8E\u6784\u5EFA\u540E\u7AEF\u8BF7\u6C42\u7684\u79CD\u5B50\uFF1A</p>\n<ul>\n <li>\uD83C\uDF10 <b>platform</b> - \u5E73\u53F0\u540D\u79F0\uFF08\u5982 onebot\u3001discord\uFF09</li>\n <li>\uD83C\uDD94 <b>userid</b> - \u7528\u6237ID</li>\n <li>\uD83D\uDCC5 <b>date</b> - \u5F53\u524D\u65E5\u671F\uFF08YYYY-MM-DD\uFF09</li>\n <li>\uD83D\uDC64 <b>nickname</b> - \u7528\u6237\u6635\u79F0</li>\n <li>\uD83D\uDDBC\uFE0F <b>avatar_hash</b> - \u5934\u50CFMD5\u54C8\u5E0C\u503C</li>\n</ul>\n<p>\u9ED8\u8BA4\u914D\u7F6E\uFF1Aabc \u542F\u7528\uFF0Cde \u7981\u7528\u3002\u91CD\u590D\u7684 key \u53EA\u6709\u7B2C\u4E00\u4E2A\u542F\u7528\u7684\u4F1A\u751F\u6548\u3002</p>\n\n<h3 style=\"color: #9b59b6;\">\uD83D\uDCCA \u8FD4\u56DE\u5B57\u6BB5\u8BF4\u660E</h3>\n<ul>\n <li><b>fortune_level</b> - \u8FD0\u52BF\u7B49\u7EA7\uFF08\u5982\uFF1A\u5927\u5409\u3001\u4E2D\u5409\u3001\u5C0F\u5409\uFF09</li>\n <li><b>dordas</b> - \u7ED3\u7F18\u7269\uFF08\u5982\uFF1A\u7ED3\u7F18\u7269\uFF1A\u9065\u9CB2\uFF09</li>\n <li><b>dordas_color</b> - \u7F18\u5F69\uFF08\u5982\uFF1A\u7F18\u5F69\uFF1A\u68A7\u679D\u7EFF\uFF09</li>\n <li><b>color_hex</b> - \u989C\u8272\u5341\u516D\u8FDB\u5236\u503C\uFF08\u5982\uFF1A#4fd69e\uFF09</li>\n <li><b>blessing</b> - \u795D\u798F\u8BED</li>\n <li><b>entry</b> - \u5B9C\u5FCC\u63D0\u793A\uFF08\u5982\uFF1A\u5FCC\uFF1A\u4E00\u610F\u5B64\u884C\uFF09</li>\n</ul>\n";
|
|
2
1
|
export interface BlessingResult {
|
|
3
2
|
fortune_level: string;
|
|
4
3
|
background_id: string;
|
|
@@ -21,9 +20,21 @@ export interface PluginConfig {
|
|
|
21
20
|
qqMarkdown: string;
|
|
22
21
|
};
|
|
23
22
|
backendUrl: string;
|
|
24
|
-
sendBase64: boolean;
|
|
25
23
|
enableQuote: boolean;
|
|
26
24
|
qqMarkdownSendImage: boolean;
|
|
25
|
+
alignWithTab: boolean;
|
|
27
26
|
logLevel: 'silent' | 'error' | 'warn' | 'info' | 'debug';
|
|
28
27
|
paramMappings: ParamMapping[];
|
|
29
28
|
}
|
|
29
|
+
export interface BlessingStats {
|
|
30
|
+
timestamp: number;
|
|
31
|
+
userId: string;
|
|
32
|
+
platform: string;
|
|
33
|
+
username?: string;
|
|
34
|
+
fortune_level: string;
|
|
35
|
+
dordas: string;
|
|
36
|
+
dordas_color: string;
|
|
37
|
+
entry: string;
|
|
38
|
+
responseTime: number;
|
|
39
|
+
commandType: 'image' | 'text' | 'qq-markdown';
|
|
40
|
+
}
|
package/lib/usage.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const usage: string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-sky-blessing",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "0.2.
|
|
3
|
+
"description": "🎋 Koishi光遇祈福签插件 | 随机生成Sky: Children of the Light风格祈福签图片 🖼️ 支持三种输出模式:仅图片/图片+文字/QQ原生Markdown 📱 可配置参数映射构建个性化种子 🔧 内置日志级别控制",
|
|
4
|
+
"version": "0.2.3-rc.1+20260613",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
7
7
|
"files": [
|
package/readme.md
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-

|
|
2
2
|
|
|
3
3
|
# koishi-plugin-sky-blessing
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/koishi-plugin-sky-blessing)
|
|
6
6
|
[](https://www.npmjs.com/package/koishi-plugin-sky-blessing)
|
|
7
|
-
|
|
8
|
-
[](https://github.com/VincentZyuApps/koishi-plugin-sky-blessing)
|
|
9
|
+
[](gitee.com/vincent-zyu/koishi-plugin-sky-blessing)
|
|
10
|
+
|
|
11
|
+
[](https://forum.koishi.xyz/t/topic/12467)
|
|
12
|
+
[](https://qm.qq.com/q/4vjto4V7Di)
|
|
9
13
|
|
|
10
14
|
<p><del>💬 插件使用问题 / 🐛 Bug反馈 / 👨💻 插件开发交流,欢迎加入QQ群:<b>259248174</b> 🎉(这个群G了)</del></p>
|
|
11
15
|
<p>💬 插件使用问题 / 🐛 Bug反馈 / 👨💻 插件开发交流,欢迎加入新QQ群:<b>1085190201</b> 🎉</p>
|