koishi-plugin-maibot 1.0.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/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # koishi-plugin-maibot
2
+
3
+ 舞萌DX游戏高级操作插件 for Koishi
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 用户绑定(通过 SGWCMAID 二维码)
8
+ - ✅ 用户解绑
9
+ - ✅ 状态查询(实时获取账号信息)
10
+ - ✅ 完整的 API 调用封装
11
+ - ✅ 数据库存储(SQLite/MySQL/PostgreSQL)
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ npm install koishi-plugin-maibot
17
+ ```
18
+
19
+ ## 配置
20
+
21
+ 在 `koishi.yml` 中配置:
22
+
23
+ ```yaml
24
+ plugins:
25
+ maibot:
26
+ apiBaseURL: http://localhost:5566 # 你的API服务地址
27
+ apiTimeout: 30000 # 可选,默认30秒
28
+ ```
29
+
30
+ ## 使用
31
+
32
+ ### 绑定账号
33
+ ```
34
+ /mai绑定 SGWCMAIDxxxxxxxxxxxxx
35
+ ```
36
+
37
+ ### 查询状态
38
+ ```
39
+ /mai状态
40
+ ```
41
+
42
+ ### 解绑账号
43
+ ```
44
+ /mai解绑
45
+ ```
46
+
47
+ ## API 要求
48
+
49
+ 本插件需要配合 [anti15-api](https://github.com/your-repo/anti15-api) 使用。
50
+
51
+ API 服务需要提供以下接口:
52
+ - `POST /api/qr2userid/<qr_text>` - 二维码转用户ID
53
+ - `GET /api/preview?mai_uid=<encrypted_uid>` - 用户状态预览
54
+
55
+ 更多 API 文档请参考 API README。
56
+
57
+ ## 许可证
58
+
59
+ MIT
60
+
package/lib/api.d.ts ADDED
@@ -0,0 +1,97 @@
1
+ export interface ApiConfig {
2
+ baseURL: string;
3
+ timeout?: number;
4
+ }
5
+ export declare class MaiBotAPI {
6
+ private client;
7
+ constructor(config: ApiConfig);
8
+ /**
9
+ * 二维码转用户ID
10
+ */
11
+ qr2userid(qrText: string): Promise<{
12
+ QRStatus: boolean;
13
+ UserID: string;
14
+ }>;
15
+ /**
16
+ * 用户状态预览
17
+ */
18
+ preview(maiUid: string): Promise<{
19
+ UserID: string;
20
+ BanState: string;
21
+ IsLogin: string;
22
+ LastLoginDate: string;
23
+ LastPlayDate: string;
24
+ Rating: string;
25
+ UserName: string;
26
+ }>;
27
+ /**
28
+ * 用户登出
29
+ */
30
+ logout(maiUid: string, regionId: string, clientId: string, placeId: string, token: string): Promise<{
31
+ LogoutStatus: boolean;
32
+ }>;
33
+ /**
34
+ * 获取1.5倍票
35
+ */
36
+ get15Ticket(maiUid: string, clientId: string, regionId: number, placeId: number, placeName: string, regionName: string, token: string): Promise<{
37
+ LoginStatus: boolean;
38
+ LogoutStatus: boolean;
39
+ UserAllStatus: boolean;
40
+ UserLogStatus: boolean;
41
+ }>;
42
+ /**
43
+ * 上传水鱼 B50
44
+ */
45
+ uploadB50(maiUid: string, fishToken: string): Promise<{
46
+ UploadStatus: boolean;
47
+ msg: string;
48
+ task_id: string;
49
+ }>;
50
+ /**
51
+ * 查询水鱼 B50 任务状态
52
+ */
53
+ getB50TaskStatus(maiUid: string): Promise<{
54
+ code: number;
55
+ alive_task_id: string;
56
+ alive_task_time: string;
57
+ }>;
58
+ /**
59
+ * 根据ID查询水鱼 B50 任务
60
+ */
61
+ getB50TaskById(taskId: string): Promise<{
62
+ code: number;
63
+ alive_task_id: string;
64
+ alive_task_time: string;
65
+ alive_task_end_time?: string;
66
+ error?: string;
67
+ done: boolean;
68
+ }>;
69
+ /**
70
+ * 上传落雪 B50
71
+ */
72
+ uploadLxB50(maiUid: string, lxnsCode: string): Promise<{
73
+ UploadStatus: boolean;
74
+ msg: string;
75
+ task_id: string;
76
+ }>;
77
+ /**
78
+ * 查询落雪 B50 任务状态
79
+ */
80
+ getLxB50TaskStatus(maiUid: string): Promise<{
81
+ code: number;
82
+ alive_task_id: string;
83
+ alive_task_time: string;
84
+ }>;
85
+ /**
86
+ * 根据ID查询落雪 B50 任务
87
+ */
88
+ getLxB50TaskById(taskId: string): Promise<{
89
+ code: number;
90
+ alive_task_id: string;
91
+ alive_task_time: string;
92
+ alive_task_end_time?: string;
93
+ error?: string;
94
+ done: boolean;
95
+ }>;
96
+ }
97
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/lib/api.js ADDED
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MaiBotAPI = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ class MaiBotAPI {
9
+ constructor(config) {
10
+ this.client = axios_1.default.create({
11
+ baseURL: config.baseURL || 'http://localhost:5566',
12
+ timeout: config.timeout || 30000,
13
+ headers: {
14
+ 'Content-Type': 'application/json',
15
+ },
16
+ });
17
+ }
18
+ /**
19
+ * 二维码转用户ID
20
+ */
21
+ async qr2userid(qrText) {
22
+ const response = await this.client.post(`/api/qr2userid/${qrText}`);
23
+ return response.data;
24
+ }
25
+ /**
26
+ * 用户状态预览
27
+ */
28
+ async preview(maiUid) {
29
+ const response = await this.client.get('/api/preview', {
30
+ params: { mai_uid: maiUid },
31
+ });
32
+ return response.data;
33
+ }
34
+ /**
35
+ * 用户登出
36
+ */
37
+ async logout(maiUid, regionId, clientId, placeId, token) {
38
+ const response = await this.client.post('/api/logout', {
39
+ token,
40
+ }, {
41
+ params: {
42
+ mai_uid: maiUid,
43
+ region_id: regionId,
44
+ client_id: clientId,
45
+ place_id: placeId,
46
+ },
47
+ });
48
+ return response.data;
49
+ }
50
+ /**
51
+ * 获取1.5倍票
52
+ */
53
+ async get15Ticket(maiUid, clientId, regionId, placeId, placeName, regionName, token) {
54
+ const response = await this.client.post('/api/get_15_ticket', {
55
+ token,
56
+ }, {
57
+ params: {
58
+ mai_uid: maiUid,
59
+ client_id: clientId,
60
+ region_id: regionId,
61
+ place_id: placeId,
62
+ place_name: placeName,
63
+ region_name: regionName,
64
+ },
65
+ });
66
+ return response.data;
67
+ }
68
+ /**
69
+ * 上传水鱼 B50
70
+ */
71
+ async uploadB50(maiUid, fishToken) {
72
+ const response = await this.client.post('/api/upload_b50', null, {
73
+ params: {
74
+ mai_uid: maiUid,
75
+ fish_token: fishToken,
76
+ },
77
+ });
78
+ return response.data;
79
+ }
80
+ /**
81
+ * 查询水鱼 B50 任务状态
82
+ */
83
+ async getB50TaskStatus(maiUid) {
84
+ const response = await this.client.get('/api/get_b50_task_status', {
85
+ params: { mai_uid: maiUid },
86
+ });
87
+ return response.data;
88
+ }
89
+ /**
90
+ * 根据ID查询水鱼 B50 任务
91
+ */
92
+ async getB50TaskById(taskId) {
93
+ const response = await this.client.get('/api/get_b50_task_byid', {
94
+ params: { taskid: taskId },
95
+ });
96
+ return response.data;
97
+ }
98
+ /**
99
+ * 上传落雪 B50
100
+ */
101
+ async uploadLxB50(maiUid, lxnsCode) {
102
+ const response = await this.client.post('/api/upload_lx_b50', null, {
103
+ params: {
104
+ mai_uid: maiUid,
105
+ lxns_code: lxnsCode,
106
+ },
107
+ });
108
+ return response.data;
109
+ }
110
+ /**
111
+ * 查询落雪 B50 任务状态
112
+ */
113
+ async getLxB50TaskStatus(maiUid) {
114
+ const response = await this.client.get('/api/get_lx_b50_task_status', {
115
+ params: { mai_uid: maiUid },
116
+ });
117
+ return response.data;
118
+ }
119
+ /**
120
+ * 根据ID查询落雪 B50 任务
121
+ */
122
+ async getLxB50TaskById(taskId) {
123
+ const response = await this.client.get('/api/get_lx_b50_task_byid', {
124
+ params: { taskid: taskId },
125
+ });
126
+ return response.data;
127
+ }
128
+ }
129
+ exports.MaiBotAPI = MaiBotAPI;
130
+ //# sourceMappingURL=api.js.map
package/lib/api.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Context } from 'koishi';
2
+ export interface UserBinding {
3
+ id: number;
4
+ userId: string;
5
+ maiUid: string;
6
+ qrCode: string;
7
+ bindTime: Date;
8
+ userName?: string;
9
+ rating?: string;
10
+ }
11
+ declare module 'koishi' {
12
+ interface Tables {
13
+ maibot_bindings: UserBinding;
14
+ }
15
+ }
16
+ export declare function extendDatabase(ctx: Context): void;
17
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,IAAI,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,MAAM;QACd,eAAe,EAAE,WAAW,CAAA;KAC7B;CACF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,QAe1C"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extendDatabase = extendDatabase;
4
+ function extendDatabase(ctx) {
5
+ ctx.model.extend('maibot_bindings', {
6
+ id: 'unsigned',
7
+ userId: 'string',
8
+ maiUid: 'string',
9
+ qrCode: 'string',
10
+ bindTime: 'timestamp',
11
+ userName: 'string',
12
+ rating: 'string',
13
+ }, {
14
+ primary: 'id',
15
+ autoInc: true,
16
+ // userName 和 rating 可以为空
17
+ unique: ['userId'], // 每个用户只能绑定一个账号
18
+ });
19
+ }
20
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":";;AAkBA,wCAeC;AAfD,SAAgB,cAAc,CAAC,GAAY;IACzC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE;QAClC,EAAE,EAAE,UAAU;QACd,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,QAAQ;KACjB,EAAE;QACD,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,yBAAyB;QACzB,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,eAAe;KACpC,CAAC,CAAA;AACJ,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { Context, Schema } from 'koishi';
2
+ export declare const name = "maibot";
3
+ export interface Config {
4
+ apiBaseURL: string;
5
+ apiTimeout?: number;
6
+ }
7
+ export declare const Config: Schema<Config>;
8
+ export declare function apply(ctx: Context, config: Config): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAIxC,eAAO,MAAM,IAAI,WAAW,CAAA;AAE5B,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAGhC,CAAA;AAEF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAuKjD"}
package/lib/index.js ADDED
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Config = exports.name = void 0;
4
+ exports.apply = apply;
5
+ const koishi_1 = require("koishi");
6
+ const api_1 = require("./api");
7
+ const database_1 = require("./database");
8
+ exports.name = 'maibot';
9
+ exports.Config = koishi_1.Schema.object({
10
+ apiBaseURL: koishi_1.Schema.string().default('http://localhost:5566').description('API服务地址'),
11
+ apiTimeout: koishi_1.Schema.number().default(30000).description('API请求超时时间(毫秒)'),
12
+ });
13
+ function apply(ctx, config) {
14
+ // 扩展数据库
15
+ (0, database_1.extendDatabase)(ctx);
16
+ // 初始化API客户端
17
+ const api = new api_1.MaiBotAPI({
18
+ baseURL: config.apiBaseURL,
19
+ timeout: config.apiTimeout,
20
+ });
21
+ /**
22
+ * 绑定用户
23
+ * 用法: /mai绑定 <SGWCMAID...>
24
+ */
25
+ ctx.command('mai绑定 <qrCode:text>', '绑定舞萌DX账号')
26
+ .action(async ({ session }, qrCode) => {
27
+ if (!session) {
28
+ return '❌ 无法获取会话信息';
29
+ }
30
+ if (!qrCode) {
31
+ return '请提供二维码文本(SGWCMAID开头)\n用法:/mai绑定 SGWCMAIDxxxxxxxxxxxxx';
32
+ }
33
+ // 验证二维码格式
34
+ if (!qrCode.startsWith('SGWCMAID')) {
35
+ return '❌ 二维码格式错误,必须以 SGWCMAID 开头';
36
+ }
37
+ if (qrCode.length < 48 || qrCode.length > 128) {
38
+ return '❌ 二维码长度错误,应在48-128字符之间';
39
+ }
40
+ const userId = session.userId;
41
+ try {
42
+ // 检查是否已绑定
43
+ const existing = await ctx.database.get('maibot_bindings', { userId });
44
+ if (existing.length > 0) {
45
+ return `❌ 您已经绑定了账号\n用户ID: ${existing[0].maiUid}\n绑定时间: ${new Date(existing[0].bindTime).toLocaleString('zh-CN')}\n\n如需重新绑定,请先使用 /mai解绑`;
46
+ }
47
+ // 调用API获取用户ID
48
+ const result = await api.qr2userid(qrCode);
49
+ if (!result.QRStatus) {
50
+ return `❌ 绑定失败:无法从二维码获取用户ID\n错误信息: ${result.UserID === 'MTI1MTEy' ? '无效的二维码' : result.UserID}`;
51
+ }
52
+ const maiUid = result.UserID;
53
+ // 获取用户详细信息(可选)
54
+ let userName;
55
+ let rating;
56
+ try {
57
+ const preview = await api.preview(maiUid);
58
+ userName = preview.UserName;
59
+ rating = preview.Rating;
60
+ }
61
+ catch (error) {
62
+ // 如果获取预览失败,不影响绑定
63
+ ctx.logger('maibot').warn('获取用户预览信息失败:', error);
64
+ }
65
+ // 存储到数据库
66
+ await ctx.database.create('maibot_bindings', {
67
+ userId,
68
+ maiUid,
69
+ qrCode,
70
+ bindTime: new Date(),
71
+ userName,
72
+ rating,
73
+ });
74
+ return `✅ 绑定成功!\n` +
75
+ `用户ID: ${maiUid}\n` +
76
+ (userName ? `用户名: ${userName}\n` : '') +
77
+ (rating ? `Rating: ${rating}\n` : '') +
78
+ `绑定时间: ${new Date().toLocaleString('zh-CN')}`;
79
+ }
80
+ catch (error) {
81
+ ctx.logger('maibot').error('绑定失败:', error);
82
+ if (error?.response) {
83
+ return `❌ API请求失败: ${error.response.status} ${error.response.statusText}`;
84
+ }
85
+ return `❌ 绑定失败: ${error?.message || '未知错误'}`;
86
+ }
87
+ });
88
+ /**
89
+ * 解绑用户
90
+ * 用法: /mai解绑
91
+ */
92
+ ctx.command('mai解绑', '解绑舞萌DX账号')
93
+ .action(async ({ session }) => {
94
+ if (!session) {
95
+ return '❌ 无法获取会话信息';
96
+ }
97
+ const userId = session.userId;
98
+ try {
99
+ // 查找绑定记录
100
+ const bindings = await ctx.database.get('maibot_bindings', { userId });
101
+ if (bindings.length === 0) {
102
+ return '❌ 您还没有绑定账号\n使用 /mai绑定 <SGWCMAID...> 进行绑定';
103
+ }
104
+ // 删除绑定记录
105
+ await ctx.database.remove('maibot_bindings', { userId });
106
+ return `✅ 解绑成功!\n已解绑的用户ID: ${bindings[0].maiUid}`;
107
+ }
108
+ catch (error) {
109
+ ctx.logger('maibot').error('解绑失败:', error);
110
+ return `❌ 解绑失败: ${error?.message || '未知错误'}`;
111
+ }
112
+ });
113
+ /**
114
+ * 查询绑定状态
115
+ * 用法: /mai状态
116
+ */
117
+ ctx.command('mai状态', '查询绑定状态')
118
+ .action(async ({ session }) => {
119
+ if (!session) {
120
+ return '❌ 无法获取会话信息';
121
+ }
122
+ const userId = session.userId;
123
+ try {
124
+ const bindings = await ctx.database.get('maibot_bindings', { userId });
125
+ if (bindings.length === 0) {
126
+ return '❌ 您还没有绑定账号\n使用 /mai绑定 <SGWCMAID...> 进行绑定';
127
+ }
128
+ const binding = bindings[0];
129
+ let statusInfo = `✅ 已绑定账号\n\n` +
130
+ `用户ID: ${binding.maiUid}\n` +
131
+ `绑定时间: ${new Date(binding.bindTime).toLocaleString('zh-CN')}\n`;
132
+ // 尝试获取最新状态
133
+ try {
134
+ const preview = await api.preview(binding.maiUid);
135
+ statusInfo += `\n📊 账号信息:\n` +
136
+ `用户名: ${preview.UserName}\n` +
137
+ `Rating: ${preview.Rating}\n` +
138
+ `登录状态: ${preview.IsLogin}\n` +
139
+ `封禁状态: ${preview.BanState}\n` +
140
+ `最后登录: ${preview.LastLoginDate}\n` +
141
+ `最后游玩: ${preview.LastPlayDate}`;
142
+ }
143
+ catch (error) {
144
+ // 如果获取失败,使用缓存的信息
145
+ if (binding.userName) {
146
+ statusInfo += `\n📊 账号信息(缓存):\n` +
147
+ `用户名: ${binding.userName}\n` +
148
+ (binding.rating ? `Rating: ${binding.rating}\n` : '');
149
+ }
150
+ statusInfo += `\n⚠️ 无法获取最新状态,请检查API服务`;
151
+ }
152
+ return statusInfo;
153
+ }
154
+ catch (error) {
155
+ ctx.logger('maibot').error('查询状态失败:', error);
156
+ return `❌ 查询失败: ${error?.message || '未知错误'}`;
157
+ }
158
+ });
159
+ }
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "koishi-plugin-maibot",
3
+ "version": "1.0.0",
4
+ "description": "舞萌DX游戏高级操作插件 for Koishi - 支持用户绑定、B50更新、1.5倍票获取等功能",
5
+ "main": "lib/index.js",
6
+ "typings": "lib/index.d.ts",
7
+ "files": [
8
+ "lib",
9
+ "README.md"
10
+ ],
11
+ "keywords": [
12
+ "koishi",
13
+ "plugin",
14
+ "maimai",
15
+ "maibot",
16
+ "舞萌",
17
+ "maimai-dx"
18
+ ],
19
+ "author": "",
20
+ "license": "MIT",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": ""
24
+ },
25
+ "peerDependencies": {
26
+ "koishi": "^4.15.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.0.0",
30
+ "typescript": "^5.0.0",
31
+ "koishi": "^4.15.0"
32
+ },
33
+ "dependencies": {
34
+ "axios": "^1.6.0"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc",
38
+ "dev": "tsc --watch"
39
+ }
40
+ }
41
+