koishi-plugin-bilibili-notify 1.3.7 → 2.0.0-alpha.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/biliAPI.d.ts +8 -0
- package/lib/biliAPI.js +115 -0
- package/lib/comRegister.d.ts +26 -30
- package/lib/comRegister.js +528 -669
- package/lib/database.d.ts +1 -0
- package/lib/database.js +7 -6
- package/lib/generateImg.d.ts +2 -2
- package/lib/index.d.ts +2 -1
- package/lib/index.js +31 -16
- package/package.json +8 -8
- package/readme.md +3 -0
package/lib/comRegister.js
CHANGED
|
@@ -26,67 +26,36 @@ class ComRegister {
|
|
|
26
26
|
rebootCount = 0;
|
|
27
27
|
subNotifier;
|
|
28
28
|
subManager = [];
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
// OneBot机器人
|
|
34
|
-
oneBot;
|
|
35
|
-
// Red机器人
|
|
36
|
-
redBot;
|
|
37
|
-
// Telegram机器人
|
|
38
|
-
telegramBot;
|
|
39
|
-
// Satori机器人
|
|
40
|
-
satoriBot;
|
|
41
|
-
// Chronocat机器人
|
|
42
|
-
chronocatBot;
|
|
43
|
-
// Lark机器人
|
|
44
|
-
larkBot;
|
|
29
|
+
// 机器人实例
|
|
30
|
+
bot;
|
|
31
|
+
// 动态销毁函数
|
|
32
|
+
dynamicDispose;
|
|
45
33
|
// 发送消息方式
|
|
46
34
|
sendMsgFunc;
|
|
35
|
+
// 构造函数
|
|
47
36
|
constructor(ctx, config) {
|
|
48
37
|
this.logger = ctx.logger('cr');
|
|
49
38
|
this.config = config;
|
|
50
|
-
//
|
|
51
|
-
ctx.bots.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
case 'onebot':
|
|
60
|
-
this.oneBot = bot;
|
|
61
|
-
break;
|
|
62
|
-
case 'red':
|
|
63
|
-
this.redBot = bot;
|
|
64
|
-
break;
|
|
65
|
-
case 'telegram':
|
|
66
|
-
this.telegramBot = bot;
|
|
67
|
-
break;
|
|
68
|
-
case 'satori':
|
|
69
|
-
this.satoriBot = bot;
|
|
70
|
-
break;
|
|
71
|
-
case 'chronocat':
|
|
72
|
-
this.chronocatBot = bot;
|
|
73
|
-
break;
|
|
74
|
-
case 'lark':
|
|
75
|
-
this.larkBot = bot;
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
39
|
+
// 拿到机器人实例
|
|
40
|
+
this.bot = ctx.bots.find(bot => bot.platform === config.platform);
|
|
41
|
+
if (!this.bot) {
|
|
42
|
+
ctx.notifier.create({
|
|
43
|
+
type: 'danger',
|
|
44
|
+
content: '未找到对应机器人实例,请检查配置是否正确或重新配置适配器!'
|
|
45
|
+
});
|
|
46
|
+
this.logger.error('未找到对应机器人实例,请检查配置是否正确或重新配置适配器!');
|
|
47
|
+
}
|
|
79
48
|
// 从数据库获取订阅
|
|
80
49
|
this.getSubFromDatabase(ctx);
|
|
81
50
|
// 判断消息发送方式
|
|
82
51
|
if (config.automaticResend) {
|
|
83
|
-
this.sendMsgFunc = async (guild,
|
|
52
|
+
this.sendMsgFunc = async (guild, content) => {
|
|
84
53
|
// 多次尝试发送消息
|
|
85
54
|
const attempts = 3;
|
|
86
55
|
for (let i = 0; i < attempts; i++) {
|
|
87
56
|
try {
|
|
88
57
|
// 发送消息
|
|
89
|
-
await bot.sendMessage(guild, content);
|
|
58
|
+
await this.bot.sendMessage(guild, content);
|
|
90
59
|
// 防止消息发送速度过快被忽略
|
|
91
60
|
await ctx.sleep(500);
|
|
92
61
|
// 成功发送消息,跳出循环
|
|
@@ -95,134 +64,44 @@ class ComRegister {
|
|
|
95
64
|
catch (e) {
|
|
96
65
|
if (i === attempts - 1) { // 已尝试三次
|
|
97
66
|
this.logger.error(`发送群组ID:${guild}消息失败!原因: ` + e.message);
|
|
98
|
-
|
|
67
|
+
console.log(e);
|
|
68
|
+
this.sendPrivateMsg(`发送群组ID:${guild}消息失败,请查看日志`);
|
|
99
69
|
}
|
|
100
70
|
}
|
|
101
71
|
}
|
|
102
72
|
};
|
|
103
73
|
}
|
|
104
74
|
else {
|
|
105
|
-
this.sendMsgFunc = async (guild,
|
|
75
|
+
this.sendMsgFunc = async (guild, content) => {
|
|
106
76
|
try {
|
|
107
77
|
// 发送消息
|
|
108
|
-
await bot.sendMessage(guild, content);
|
|
78
|
+
await this.bot.sendMessage(guild, content);
|
|
109
79
|
}
|
|
110
80
|
catch (e) {
|
|
111
81
|
this.logger.error(`发送群组ID:${guild}消息失败!原因: ` + e.message);
|
|
112
|
-
await this.sendPrivateMsg(
|
|
82
|
+
await this.sendPrivateMsg(`发送群组ID:${guild}消息失败,请查看日志`);
|
|
113
83
|
}
|
|
114
84
|
};
|
|
115
85
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
.
|
|
120
|
-
.action(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
.
|
|
86
|
+
const statusCom = ctx.command('status', '插件状态相关指令', { permissions: ['authority:5'] });
|
|
87
|
+
statusCom.subcommand('.dyn', '查看动态监测运行状态')
|
|
88
|
+
.usage('查看动态监测运行状态')
|
|
89
|
+
.example('status dyn')
|
|
90
|
+
.action(() => {
|
|
91
|
+
if (this.dynamicDispose) {
|
|
92
|
+
return '动态监测正在运行';
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return '动态监测未运行';
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
statusCom.subcommand('.sm', '查看订阅管理对象')
|
|
99
|
+
.usage('查看订阅管理对象')
|
|
100
|
+
.example('status sm')
|
|
130
101
|
.action(async () => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
testCom
|
|
136
|
-
.subcommand('.user <mid:string>')
|
|
137
|
-
.usage('测试指令,用于测试获取用户信息')
|
|
138
|
-
.example('test.user 用户UID')
|
|
139
|
-
.action(async (_, mid) => {
|
|
140
|
-
const content = await ctx.ba.getUserInfo(mid)
|
|
141
|
-
console.log(content);
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
testCom
|
|
145
|
-
.subcommand('.time')
|
|
146
|
-
.usage('测试时间接口')
|
|
147
|
-
.example('test.time')
|
|
148
|
-
.action(async ({ session }) => {
|
|
149
|
-
session.send(await ctx.ba.getTimeNow())
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
testCom
|
|
153
|
-
.subcommand('.gimg <uid:string> <index:number>')
|
|
154
|
-
.usage('测试图片生成')
|
|
155
|
-
.example('test.gimg')
|
|
156
|
-
.action(async ({ session }, uid, index) => {
|
|
157
|
-
// logger
|
|
158
|
-
this.logger.info('调用test gimg指令')
|
|
159
|
-
// 获取用户空间动态数据
|
|
160
|
-
const { data } = await ctx.ba.getUserSpaceDynamic(uid)
|
|
161
|
-
// 获取动态推送图片
|
|
162
|
-
const { pic, buffer } = await ctx.gi.generateDynamicImg(data.items[index])
|
|
163
|
-
// 如果pic存在,则直接返回pic
|
|
164
|
-
if (pic) return pic
|
|
165
|
-
// pic不存在,说明使用的是page模式
|
|
166
|
-
await session.send(h.image(buffer, 'image/png'))
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
testCom
|
|
170
|
-
.subcommand('.group')
|
|
171
|
-
.usage('查看session groupId')
|
|
172
|
-
.example('test group')
|
|
173
|
-
.action(({ session }) => {
|
|
174
|
-
console.log(session.event.channel);
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
testCom
|
|
178
|
-
.subcommand('.session')
|
|
179
|
-
.usage('查看seesion')
|
|
180
|
-
.example('test session')
|
|
181
|
-
.action(({ session }) => {
|
|
182
|
-
console.log(session);
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
testCom
|
|
186
|
-
.subcommand('.utc')
|
|
187
|
-
.usage('获取当前UTC+8 Unix时间戳')
|
|
188
|
-
.example('test utc')
|
|
189
|
-
.action(async ({ session }) => {
|
|
190
|
-
session.send((await ctx.ba.getServerUTCTime()).toString())
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
testCom
|
|
194
|
-
.subcommand('.livestop', '发送下播提示语测试')
|
|
195
|
-
.usage('发送下播提示语测试')
|
|
196
|
-
.example('test livestop')
|
|
197
|
-
.action(async ({ session }) => {
|
|
198
|
-
// logger
|
|
199
|
-
this.logger.info('调用test gimg指令')
|
|
200
|
-
// 获取主播信息
|
|
201
|
-
const { data } = await ctx.ba.getMasterInfo('686127')
|
|
202
|
-
let resizedImage: Buffer
|
|
203
|
-
try {
|
|
204
|
-
resizedImage = await Jimp.read(data.info.face).then(async image => {
|
|
205
|
-
return await image.resize(100, 100).getBufferAsync(Jimp.MIME_PNG)
|
|
206
|
-
})
|
|
207
|
-
} catch (e) {
|
|
208
|
-
if (e.message === 'Unsupported MIME type: image/webp') console.log('主播使用的是webp格式头像,无法进行渲染');
|
|
209
|
-
else console.log(e);
|
|
210
|
-
}
|
|
211
|
-
// 发送下播提示语
|
|
212
|
-
await session.send(
|
|
213
|
-
<>{resizedImage && h.image(resizedImage, 'image/png')} 主播{data.info.uname}已下播</>
|
|
214
|
-
)
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
testCom
|
|
218
|
-
.subcommand('.sendmsg', '测试发送消息方法')
|
|
219
|
-
.usage('测试发送消息方法')
|
|
220
|
-
.example('test sendmsg')
|
|
221
|
-
.action(async ({ session }) => {
|
|
222
|
-
// 获得对应bot
|
|
223
|
-
const bot = this.getTheCorrespondingBotBasedOnTheSession(session)
|
|
224
|
-
// this.sendMsg(['all'], bot, 'Hello World')
|
|
225
|
-
}) */
|
|
102
|
+
console.log(this.subManager);
|
|
103
|
+
return '查看控制台';
|
|
104
|
+
});
|
|
226
105
|
const biliCom = ctx.command('bili', 'bili-notify插件相关指令', { permissions: ['authority:3'] });
|
|
227
106
|
biliCom.subcommand('.login', '登录B站之后才可以进行之后的操作')
|
|
228
107
|
.usage('使用二维码登录,登录B站之后才可以进行之后的操作')
|
|
@@ -340,18 +219,31 @@ class ComRegister {
|
|
|
340
219
|
return;
|
|
341
220
|
}
|
|
342
221
|
// 取消全部订阅 执行dispose方法,销毁定时器
|
|
343
|
-
if (sub.dynamic)
|
|
344
|
-
this.subManager[i].dynamicDispose();
|
|
345
222
|
if (sub.live)
|
|
346
223
|
this.subManager[i].liveDispose();
|
|
347
224
|
// 从数据库中删除订阅
|
|
348
225
|
await ctx.database.remove('bilibili', { uid: this.subManager[i].uid });
|
|
349
226
|
// 将该订阅对象从订阅管理对象中移除
|
|
350
227
|
this.subManager.splice(i, 1);
|
|
228
|
+
// 将订阅对象移出订阅关注组
|
|
229
|
+
const removeUserFromGroupData = await ctx.ba.removeUserFromGroup(sub.uid);
|
|
230
|
+
// 判断是否移出成功 22105关注对象为自己
|
|
231
|
+
if (removeUserFromGroupData.code !== 0 || removeUserFromGroupData.data !== 22105) {
|
|
232
|
+
// 移出失败
|
|
233
|
+
await session.send('取消订阅对象失败,请稍后重试');
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
351
236
|
// id--
|
|
352
237
|
this.num--;
|
|
238
|
+
// 判断是否还有动态订阅
|
|
239
|
+
if (this.dynamicDispose && !this.subManager.find((sub) => sub.dynamic === true)) { // 没有动态订阅
|
|
240
|
+
// 将动态检测关闭
|
|
241
|
+
this.dynamicDispose();
|
|
242
|
+
// 将动态监测置为空
|
|
243
|
+
this.dynamicDispose = null;
|
|
244
|
+
}
|
|
353
245
|
// 发送成功通知
|
|
354
|
-
session.send('已取消订阅该用户');
|
|
246
|
+
await session.send('已取消订阅该用户');
|
|
355
247
|
// 更新控制台提示
|
|
356
248
|
this.updateSubNotifier(ctx);
|
|
357
249
|
// 将存在flag设置为true
|
|
@@ -360,7 +252,7 @@ class ComRegister {
|
|
|
360
252
|
}));
|
|
361
253
|
// 未订阅该用户,无需取消订阅
|
|
362
254
|
if (!exist)
|
|
363
|
-
session.send('未订阅该用户,无需取消订阅');
|
|
255
|
+
await session.send('未订阅该用户,无需取消订阅');
|
|
364
256
|
});
|
|
365
257
|
biliCom
|
|
366
258
|
.subcommand('.show', '展示订阅对象')
|
|
@@ -378,6 +270,10 @@ class ComRegister {
|
|
|
378
270
|
.example('bili sub 1194210119 目标QQ群号(实验性) -l -d 订阅UID为1194210119的UP主的动态和直播')
|
|
379
271
|
.action(async ({ session, options }, mid, ...guildId) => {
|
|
380
272
|
this.logger.info('调用bili.sub指令');
|
|
273
|
+
// 先判断是否订阅直播,再判断是否解锁订阅限制,最后判断直播订阅是否已超三个
|
|
274
|
+
if (options.live && !this.config.unlockSubLimits && (this.subManager.reduce((acc, cur) => acc + (cur.live ? 1 : 0), 0) >= 3)) {
|
|
275
|
+
return '直播订阅已达上限,请取消部分直播订阅后再进行订阅';
|
|
276
|
+
}
|
|
381
277
|
// 检查是否是不支持的平台
|
|
382
278
|
switch (session.event.platform) {
|
|
383
279
|
case 'lark':
|
|
@@ -395,27 +291,74 @@ class ComRegister {
|
|
|
395
291
|
// 未登录直接返回
|
|
396
292
|
return '请使用指令bili login登录后再进行订阅操作';
|
|
397
293
|
}
|
|
398
|
-
//
|
|
399
|
-
if (!config.unlockSubLimits && this.num >= 3)
|
|
400
|
-
return '目前最多只能订阅三个人';
|
|
401
|
-
// 检查必选参数是否有值
|
|
294
|
+
// 检查必选参数是否已填
|
|
402
295
|
if (!mid)
|
|
403
296
|
return '请输入用户uid';
|
|
404
|
-
//
|
|
405
|
-
|
|
406
|
-
|
|
297
|
+
// 检查数据库是否有数据
|
|
298
|
+
const loginDBData = (await ctx.database.get('loginBili', 1, ['dynamic_group_id']))[0];
|
|
299
|
+
// 判断是否有数据
|
|
300
|
+
if (loginDBData.dynamic_group_id === '' || loginDBData.dynamic_group_id === null) {
|
|
301
|
+
// 没有数据,没有创建分组,尝试创建分组
|
|
302
|
+
const createGroupData = await ctx.ba.createGroup("订阅");
|
|
303
|
+
// 如果分组已创建,则获取分组id
|
|
304
|
+
if (createGroupData.code === 22106) {
|
|
305
|
+
// 分组已存在,拿到之前的分组id
|
|
306
|
+
const allGroupData = await ctx.ba.getAllGroup();
|
|
307
|
+
// 遍历所有分组
|
|
308
|
+
for (const group of allGroupData.data) {
|
|
309
|
+
// 找到订阅分组
|
|
310
|
+
if (group.name === '订阅') {
|
|
311
|
+
// 拿到分组id
|
|
312
|
+
loginDBData.dynamic_group_id = group.tagid;
|
|
313
|
+
// 结束循环
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else if (createGroupData.code !== 0) {
|
|
319
|
+
// 创建分组失败
|
|
320
|
+
return '创建关注分组出错';
|
|
321
|
+
}
|
|
322
|
+
// 创建成功,保存到数据库
|
|
323
|
+
ctx.database.set('loginBili', 1, { dynamic_group_id: loginDBData.dynamic_group_id });
|
|
407
324
|
}
|
|
408
|
-
//
|
|
325
|
+
// 订阅对象
|
|
326
|
+
const subUserData = await ctx.ba.follow(mid);
|
|
327
|
+
// 判断是否订阅成功
|
|
328
|
+
switch (subUserData.code) {
|
|
329
|
+
case -101: return '账号未登录,请使用指令bili login登录后再进行订阅操作';
|
|
330
|
+
case -102: return '账号被封停,无法进行订阅操作';
|
|
331
|
+
case 22002: return '因对方隐私设置,无法进行订阅操作';
|
|
332
|
+
case 22003: return '你已将对方拉黑,无法进行订阅操作';
|
|
333
|
+
case 22013: return '账号已注销,无法进行订阅操作';
|
|
334
|
+
case 40061: return '账号不存在,请检查uid输入是否正确或用户是否存在';
|
|
335
|
+
case 22001: break; // 订阅对象为自己 无需添加到分组
|
|
336
|
+
case 22014: // 已关注订阅对象 无需再次关注
|
|
337
|
+
case 0: { // 执行订阅成功
|
|
338
|
+
// 把订阅对象添加到分组中
|
|
339
|
+
const copyUserToGroupData = await ctx.ba.copyUserToGroup(mid, loginDBData.dynamic_group_id);
|
|
340
|
+
// 判断是否添加成功
|
|
341
|
+
if (copyUserToGroupData.code !== 0) {
|
|
342
|
+
// 添加失败
|
|
343
|
+
return '添加订阅对象到分组失败,请稍后重试';
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// 定义外围变量
|
|
409
348
|
let content;
|
|
410
349
|
try {
|
|
350
|
+
// 获取用户信息
|
|
411
351
|
content = await ctx.ba.getUserInfo(mid);
|
|
412
352
|
}
|
|
413
353
|
catch (e) {
|
|
354
|
+
// 返回错误信息
|
|
414
355
|
return 'bili sub getUserInfo() 发生了错误,错误为:' + e.message;
|
|
415
356
|
}
|
|
416
|
-
//
|
|
357
|
+
// 判断是否成功获取用户信息
|
|
417
358
|
if (content.code !== 0) {
|
|
359
|
+
// 定义错误消息
|
|
418
360
|
let msg;
|
|
361
|
+
// 判断错误代码
|
|
419
362
|
switch (content.code) {
|
|
420
363
|
case -400:
|
|
421
364
|
msg = '请求错误';
|
|
@@ -433,10 +376,13 @@ class ComRegister {
|
|
|
433
376
|
msg = '未知错误,错误信息:' + content.message;
|
|
434
377
|
break;
|
|
435
378
|
}
|
|
379
|
+
// 返回错误信息
|
|
436
380
|
return msg;
|
|
437
381
|
}
|
|
438
|
-
//
|
|
382
|
+
// 定义目标群组id
|
|
439
383
|
let targetId;
|
|
384
|
+
// 定义目标群组id数组
|
|
385
|
+
let targetIdArr;
|
|
440
386
|
// 判断是否输入了QQ群号
|
|
441
387
|
if (guildId.length > 0) { // 输入了QQ群号
|
|
442
388
|
// 定义方法
|
|
@@ -447,6 +393,7 @@ class ComRegister {
|
|
|
447
393
|
const targetArr = [];
|
|
448
394
|
// 判断群号是否符合条件
|
|
449
395
|
for (const guild of guildId) {
|
|
396
|
+
// 判断是否机器人加入了该群
|
|
450
397
|
if (guildList.data.some(cv => cv.id === guild)) { // 机器人加入了该群
|
|
451
398
|
// 保存到数组
|
|
452
399
|
targetArr.push(guild);
|
|
@@ -465,6 +412,7 @@ class ComRegister {
|
|
|
465
412
|
if (guildId[0] === 'all') {
|
|
466
413
|
// 判断是否有群机器人相关Bot
|
|
467
414
|
if (['qq', 'onebot', 'red', 'satori', 'chronocat'].includes(session.event.platform)) {
|
|
415
|
+
// 推送所有群组
|
|
468
416
|
okGuild.push('all');
|
|
469
417
|
}
|
|
470
418
|
else {
|
|
@@ -477,24 +425,13 @@ class ComRegister {
|
|
|
477
425
|
else {
|
|
478
426
|
// 判断是否有群机器人相关Bot
|
|
479
427
|
switch (session.event.platform) {
|
|
480
|
-
case 'qq':
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
case 'onebot': {
|
|
485
|
-
okGuild = await checkIfGuildHasJoined(this.oneBot);
|
|
486
|
-
break;
|
|
487
|
-
}
|
|
488
|
-
case 'red': {
|
|
489
|
-
okGuild = await checkIfGuildHasJoined(this.redBot);
|
|
490
|
-
break;
|
|
491
|
-
}
|
|
492
|
-
case 'satori': {
|
|
493
|
-
okGuild = await checkIfGuildHasJoined(this.satoriBot);
|
|
494
|
-
break;
|
|
495
|
-
}
|
|
428
|
+
case 'qq':
|
|
429
|
+
case 'onebot':
|
|
430
|
+
case 'red':
|
|
431
|
+
case 'satori':
|
|
496
432
|
case 'chronocat': {
|
|
497
|
-
|
|
433
|
+
// 检查机器人是否加入该群
|
|
434
|
+
okGuild = await checkIfGuildHasJoined(this.bot);
|
|
498
435
|
break;
|
|
499
436
|
}
|
|
500
437
|
default: {
|
|
@@ -505,23 +442,37 @@ class ComRegister {
|
|
|
505
442
|
}
|
|
506
443
|
}
|
|
507
444
|
}
|
|
445
|
+
// 将可用的目标赋值给数组
|
|
446
|
+
targetIdArr = okGuild;
|
|
508
447
|
// 将群号用空格进行分割
|
|
509
448
|
targetId = okGuild.join(' ');
|
|
510
449
|
}
|
|
511
450
|
else { // 没有输入QQ群号
|
|
512
451
|
// 为当前群聊环境进行推送
|
|
513
452
|
targetId = session.event.channel.id;
|
|
453
|
+
// 将目标id转换为数组进行赋值
|
|
454
|
+
targetIdArr = [session.event.channel.id];
|
|
514
455
|
}
|
|
515
456
|
// 获取data
|
|
516
457
|
const { data } = content;
|
|
517
|
-
//
|
|
518
|
-
const liveMsg = await this.checkIfNeedSub(options.live,
|
|
519
|
-
// 判断是否需要订阅动态
|
|
520
|
-
const dynamicMsg = await this.checkIfNeedSub(options.dynamic, '动态', session);
|
|
458
|
+
// 判断是否需要订阅直播和动态
|
|
459
|
+
const [liveMsg, dynamicMsg] = await this.checkIfNeedSub(options.live, options.dynamic, session, data);
|
|
521
460
|
// 判断是否未订阅任何消息
|
|
522
461
|
if (!liveMsg && !dynamicMsg) {
|
|
523
462
|
return '您未订阅该UP的任何消息';
|
|
524
463
|
}
|
|
464
|
+
const subUser = this.subManager.find(sub => sub.uid === mid);
|
|
465
|
+
// 判断要订阅的用户是否已经存在于订阅管理对象中
|
|
466
|
+
if (subUser) {
|
|
467
|
+
// 已存在,判断是否重复订阅直播通知
|
|
468
|
+
if (liveMsg && subUser.live) {
|
|
469
|
+
return '已订阅该用户直播通知,请勿重复订阅';
|
|
470
|
+
}
|
|
471
|
+
// 已存在,判断是否重复订阅动态通知
|
|
472
|
+
if (dynamicMsg && subUser.dynamic) {
|
|
473
|
+
return '已订阅该用户动态通知,请勿重复订阅';
|
|
474
|
+
}
|
|
475
|
+
}
|
|
525
476
|
// 获取直播房间号
|
|
526
477
|
const roomId = data.live_room?.roomid.toString();
|
|
527
478
|
// 保存到数据库中
|
|
@@ -537,18 +488,16 @@ class ComRegister {
|
|
|
537
488
|
});
|
|
538
489
|
// 订阅数+1
|
|
539
490
|
this.num++;
|
|
540
|
-
// 开始订阅
|
|
541
491
|
// 保存新订阅对象
|
|
542
492
|
this.subManager.push({
|
|
543
493
|
id: sub.id,
|
|
544
494
|
uid: mid,
|
|
545
|
-
|
|
495
|
+
targetIdArr,
|
|
546
496
|
roomId,
|
|
547
497
|
platform: session.event.platform,
|
|
548
498
|
live: liveMsg,
|
|
549
499
|
dynamic: dynamicMsg,
|
|
550
|
-
liveDispose: null
|
|
551
|
-
dynamicDispose: null
|
|
500
|
+
liveDispose: null
|
|
552
501
|
});
|
|
553
502
|
// 获取用户信息
|
|
554
503
|
let userData;
|
|
@@ -560,55 +509,36 @@ class ComRegister {
|
|
|
560
509
|
this.logger.error('bili sub指令 getMasterInfo() 发生了错误,错误为:' + e.message);
|
|
561
510
|
return '订阅出错啦,请重试';
|
|
562
511
|
}
|
|
563
|
-
|
|
512
|
+
console.log(liveMsg, dynamicMsg);
|
|
513
|
+
// 订阅直播
|
|
564
514
|
if (liveMsg) {
|
|
565
515
|
await session.execute(`bili live ${roomId} ${targetId.split(',').join(' ')}`);
|
|
566
516
|
// 发送订阅消息通知
|
|
567
517
|
await session.send(`订阅${userData.info.uname}直播通知`);
|
|
568
518
|
}
|
|
569
|
-
//
|
|
519
|
+
// 订阅动态
|
|
570
520
|
if (dynamicMsg) {
|
|
571
|
-
|
|
521
|
+
// 判断是否开启动态监测
|
|
522
|
+
if (!this.dynamicDispose) {
|
|
523
|
+
// 开启动态监测
|
|
524
|
+
if (this.config.dynamicDebugMode) {
|
|
525
|
+
this.dynamicDispose = ctx.setInterval(this.debug_dynamicDetect(ctx), config.dynamicLoopTime * 1000);
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
this.dynamicDispose = ctx.setInterval(this.dynamicDetect(ctx), config.dynamicLoopTime * 1000);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
572
531
|
// 发送订阅消息通知
|
|
573
532
|
await session.send(`订阅${userData.info.uname}动态通知`);
|
|
574
533
|
}
|
|
575
534
|
// 新增订阅展示到控制台
|
|
576
535
|
this.updateSubNotifier(ctx);
|
|
577
536
|
});
|
|
578
|
-
biliCom
|
|
579
|
-
.subcommand('.dynamic <uid:string> <...guildId:string>', '订阅用户动态推送', { hidden: true })
|
|
580
|
-
.usage('订阅用户动态推送')
|
|
581
|
-
.example('bili dynamic 1194210119 订阅UID为1194210119的动态')
|
|
582
|
-
.action(async ({ session }, uid, ...guildId) => {
|
|
583
|
-
this.logger.info('调用bili.dynamic指令');
|
|
584
|
-
// 如果uid为空则返回
|
|
585
|
-
if (!uid)
|
|
586
|
-
return `${uid}非法调用 dynamic 指令`; // 用户uid不能为空
|
|
587
|
-
if (!guildId)
|
|
588
|
-
return `${uid}非法调用 dynamic 指令`; // 目标群组或频道不能为空
|
|
589
|
-
// 寻找对应订阅管理对象
|
|
590
|
-
const index = this.subManager.findIndex(sub => sub.uid === uid);
|
|
591
|
-
// 不存在则直接返回
|
|
592
|
-
if (index === -1)
|
|
593
|
-
return '请勿直接调用该指令';
|
|
594
|
-
// 获得对应bot
|
|
595
|
-
const bot = this.getTheCorrespondingBotBasedOnTheSession(session);
|
|
596
|
-
// 开始循环检测
|
|
597
|
-
let dispose;
|
|
598
|
-
if (this.config.dynamicDebugMode) {
|
|
599
|
-
dispose = ctx.setInterval(this.debug_dynamicDetect(ctx, bot, uid, guildId), config.dynamicLoopTime * 1000);
|
|
600
|
-
}
|
|
601
|
-
else {
|
|
602
|
-
dispose = ctx.setInterval(this.dynamicDetect(ctx, bot, uid, guildId), config.dynamicLoopTime * 1000);
|
|
603
|
-
}
|
|
604
|
-
// 将销毁函数保存到订阅管理对象
|
|
605
|
-
this.subManager[index].dynamicDispose = dispose;
|
|
606
|
-
});
|
|
607
537
|
biliCom
|
|
608
538
|
.subcommand('.live <roomId:string> <...guildId:string>', '订阅主播开播通知', { hidden: true })
|
|
609
539
|
.usage('订阅主播开播通知')
|
|
610
540
|
.example('bili live 26316137 订阅房间号为26316137的直播间')
|
|
611
|
-
.action(async (
|
|
541
|
+
.action(async (_, roomId, ...guildId) => {
|
|
612
542
|
this.logger.info('调用bili.live指令');
|
|
613
543
|
// 如果room_id为空则返回
|
|
614
544
|
if (!roomId)
|
|
@@ -619,10 +549,8 @@ class ComRegister {
|
|
|
619
549
|
const index = this.subManager.findIndex(sub => sub.roomId === roomId);
|
|
620
550
|
if (index === -1)
|
|
621
551
|
return '请勿直接调用该指令';
|
|
622
|
-
// 获得对应bot
|
|
623
|
-
const bot = this.getTheCorrespondingBotBasedOnTheSession(session);
|
|
624
552
|
// 开始循环检测
|
|
625
|
-
const dispose = ctx.setInterval(this.liveDetect(ctx,
|
|
553
|
+
const dispose = ctx.setInterval(this.liveDetect(ctx, roomId, guildId), config.liveLoopTime * 1000);
|
|
626
554
|
// 保存销毁函数
|
|
627
555
|
this.subManager[index].liveDispose = dispose;
|
|
628
556
|
});
|
|
@@ -687,103 +615,31 @@ class ComRegister {
|
|
|
687
615
|
.usage('向主人账号发送一条测试消息')
|
|
688
616
|
.example('bili private 向主人账号发送一条测试消息')
|
|
689
617
|
.action(async ({ session }) => {
|
|
690
|
-
// 获得对应bot
|
|
691
|
-
const bot = this.getTheCorrespondingBotBasedOnTheSession(session);
|
|
692
618
|
// 发送消息
|
|
693
|
-
await this.sendPrivateMsg(
|
|
619
|
+
await this.sendPrivateMsg('Hello World');
|
|
694
620
|
// 发送提示
|
|
695
621
|
await session.send('已发送消息,如未收到则说明您的机器人不支持发送私聊消息或您的信息填写有误');
|
|
696
622
|
});
|
|
697
|
-
/* biliCom
|
|
698
|
-
.subcommand('.reboot', '测试插件自动重启功能', { hidden: true })
|
|
699
|
-
.usage('测试插件自动重启功能')
|
|
700
|
-
.example('bili reboot 测试插件自动重启功能')
|
|
701
|
-
.action(async ({ session }) => {
|
|
702
|
-
// 发送提示消息
|
|
703
|
-
await session.send('测试biliAPI等服务自动重启功能')
|
|
704
|
-
// 获得对应bot
|
|
705
|
-
const bot = this.getTheCorrespondingBotBasedOnTheSession(session)
|
|
706
|
-
// 发送提示消息,重启服务
|
|
707
|
-
await this.sendPrivateMsgAndStopService(ctx, bot, '测试biliAPI等服务自动重启功能')
|
|
708
|
-
}) */
|
|
709
|
-
/* biliCom
|
|
710
|
-
.subcommand('.sendall', '测试给机器人加入的所有群发送消息', { hidden: true })
|
|
711
|
-
.usage('测试给机器人加入的所有群发送消息')
|
|
712
|
-
.example('bili sendall 测试给机器人加入的所有群发送消息')
|
|
713
|
-
.action(async ({ session }) => {
|
|
714
|
-
// 获得对应bot
|
|
715
|
-
const bot = this.getTheCorrespondingBotBasedOnTheSession(session)
|
|
716
|
-
// 发送消息
|
|
717
|
-
await this.sendMsg(ctx, ['all'], bot, 'Hello World')
|
|
718
|
-
// 发送提示
|
|
719
|
-
await session.send('已向机器人加入的所有群发送了消息')
|
|
720
|
-
}) */
|
|
721
|
-
/* biliCom
|
|
722
|
-
.subcommand('.list', '获取机器人加入的所有群组', { hidden: true })
|
|
723
|
-
.usage('获取当前机器人加入的所有群聊')
|
|
724
|
-
.example('bili list 获取当前机器人加入的所有群聊')
|
|
725
|
-
.action(async ({ session }) => {
|
|
726
|
-
// 获取对应Bot
|
|
727
|
-
const bot = this.getTheCorrespondingBotBasedOnTheSession(session)
|
|
728
|
-
// 获取群列表
|
|
729
|
-
const guildList = (await bot.getGuildList()).data
|
|
730
|
-
// 遍历群列表
|
|
731
|
-
guildList.map(item => this.logger.info(`已加入${item.id}`))
|
|
732
|
-
}) */
|
|
733
|
-
}
|
|
734
|
-
getTheCorrespondingBotBasedOnTheSession(session) {
|
|
735
|
-
// 获取对应Bot
|
|
736
|
-
let bot;
|
|
737
|
-
switch (session.event.platform) {
|
|
738
|
-
case 'lark':
|
|
739
|
-
bot = this.larkBot;
|
|
740
|
-
break;
|
|
741
|
-
case 'qq':
|
|
742
|
-
bot = this.qqBot;
|
|
743
|
-
break;
|
|
744
|
-
case 'qqguild':
|
|
745
|
-
bot = this.qqguildBot;
|
|
746
|
-
break;
|
|
747
|
-
case 'onebot':
|
|
748
|
-
bot = this.oneBot;
|
|
749
|
-
break;
|
|
750
|
-
case 'red':
|
|
751
|
-
bot = this.redBot;
|
|
752
|
-
break;
|
|
753
|
-
case 'telegram':
|
|
754
|
-
bot = this.telegramBot;
|
|
755
|
-
break;
|
|
756
|
-
case 'satori':
|
|
757
|
-
bot = this.satoriBot;
|
|
758
|
-
break;
|
|
759
|
-
case 'chronocat':
|
|
760
|
-
bot = this.chronocatBot;
|
|
761
|
-
break;
|
|
762
|
-
default: {
|
|
763
|
-
session.send('暂不支持该平台!');
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
return bot;
|
|
767
623
|
}
|
|
768
|
-
async sendPrivateMsg(
|
|
624
|
+
async sendPrivateMsg(content) {
|
|
769
625
|
if (this.config.master.enable) {
|
|
770
626
|
if (this.config.master.masterAccountGuildId) {
|
|
771
627
|
// 向机器人主人发送消息
|
|
772
|
-
await bot.sendPrivateMessage(this.config.master.masterAccount, content, this.config.master.masterAccountGuildId);
|
|
628
|
+
await this.bot.sendPrivateMessage(this.config.master.masterAccount, content, this.config.master.masterAccountGuildId);
|
|
773
629
|
}
|
|
774
630
|
else {
|
|
775
631
|
// 向机器人主人发送消息
|
|
776
|
-
await bot.sendPrivateMessage(this.config.master.masterAccount, content);
|
|
632
|
+
await this.bot.sendPrivateMessage(this.config.master.masterAccount, content);
|
|
777
633
|
}
|
|
778
634
|
}
|
|
779
635
|
}
|
|
780
|
-
async sendPrivateMsgAndRebootService(ctx
|
|
636
|
+
async sendPrivateMsgAndRebootService(ctx) {
|
|
781
637
|
// 判断重启次数是否超过三次
|
|
782
638
|
if (this.rebootCount >= 3) {
|
|
783
639
|
// logger
|
|
784
640
|
this.logger.error('已重启插件三次,请检查机器人状态后使用指令 sys start 启动插件');
|
|
785
641
|
// 重启失败,发送消息
|
|
786
|
-
await this.sendPrivateMsg(
|
|
642
|
+
await this.sendPrivateMsg('已重启插件三次,请检查机器人状态后使用指令 sys start 启动插件');
|
|
787
643
|
// 关闭插件
|
|
788
644
|
await ctx.sm.disposePlugin();
|
|
789
645
|
// 结束
|
|
@@ -803,14 +659,14 @@ class ComRegister {
|
|
|
803
659
|
// logger
|
|
804
660
|
this.logger.error('重启插件失败,请检查机器人状态后使用指令 sys start 启动插件');
|
|
805
661
|
// 重启失败,发送消息
|
|
806
|
-
await this.sendPrivateMsg(
|
|
662
|
+
await this.sendPrivateMsg('重启插件失败,请检查机器人状态后使用指令 sys start 启动插件');
|
|
807
663
|
// 关闭插件
|
|
808
664
|
await ctx.sm.disposePlugin();
|
|
809
665
|
}
|
|
810
666
|
}
|
|
811
|
-
async sendPrivateMsgAndStopService(ctx
|
|
667
|
+
async sendPrivateMsgAndStopService(ctx) {
|
|
812
668
|
// 发送消息
|
|
813
|
-
await this.sendPrivateMsg(
|
|
669
|
+
await this.sendPrivateMsg('插件发生未知错误,请检查机器人状态后使用指令 sys start 启动插件');
|
|
814
670
|
// logger
|
|
815
671
|
this.logger.error('插件发生未知错误,请检查机器人状态后使用指令 sys start 启动插件');
|
|
816
672
|
// 关闭插件
|
|
@@ -818,13 +674,13 @@ class ComRegister {
|
|
|
818
674
|
// 结束
|
|
819
675
|
return;
|
|
820
676
|
}
|
|
821
|
-
async sendMsg(targets,
|
|
677
|
+
async sendMsg(targets, content) {
|
|
822
678
|
// 定义需要发送的数组
|
|
823
679
|
let sendArr = [];
|
|
824
680
|
// 判断是否需要推送所有机器人加入的群
|
|
825
681
|
if (targets[0] === 'all') {
|
|
826
682
|
// 获取所有guild
|
|
827
|
-
for (const guild of (await bot.getGuildList()).data) {
|
|
683
|
+
for (const guild of (await this.bot.getGuildList()).data) {
|
|
828
684
|
sendArr.push(guild.id);
|
|
829
685
|
}
|
|
830
686
|
}
|
|
@@ -833,14 +689,15 @@ class ComRegister {
|
|
|
833
689
|
}
|
|
834
690
|
// 循环给每个群组发送
|
|
835
691
|
for (const guild of sendArr) {
|
|
836
|
-
await this.sendMsgFunc(guild,
|
|
692
|
+
await this.sendMsgFunc(guild, content);
|
|
837
693
|
}
|
|
838
694
|
}
|
|
839
|
-
dynamicDetect(ctx
|
|
840
|
-
let
|
|
841
|
-
let
|
|
695
|
+
dynamicDetect(ctx) {
|
|
696
|
+
let detectSetup = true;
|
|
697
|
+
let updateBaseline;
|
|
842
698
|
// 相当于锁的作用,防止上一个循环没处理完
|
|
843
699
|
let flag = true;
|
|
700
|
+
// 返回一个闭包函数
|
|
844
701
|
return async () => {
|
|
845
702
|
// 判断上一个循环是否完成
|
|
846
703
|
if (!flag)
|
|
@@ -848,30 +705,44 @@ class ComRegister {
|
|
|
848
705
|
flag = false;
|
|
849
706
|
// 无论是否执行成功都要释放锁
|
|
850
707
|
try {
|
|
851
|
-
//
|
|
852
|
-
if (
|
|
853
|
-
//
|
|
854
|
-
|
|
855
|
-
//
|
|
856
|
-
|
|
708
|
+
// 检测启动初始化
|
|
709
|
+
if (detectSetup) {
|
|
710
|
+
// 获取动态信息
|
|
711
|
+
const data = await ctx.ba.getAllDynamic();
|
|
712
|
+
// 判断获取动态信息是否成功
|
|
713
|
+
if (data.code !== 0)
|
|
714
|
+
return;
|
|
715
|
+
// 设置更新基线
|
|
716
|
+
updateBaseline = data.data.update_baseline;
|
|
717
|
+
// 设置初始化为false
|
|
718
|
+
detectSetup = false;
|
|
719
|
+
// 初始化完成
|
|
857
720
|
return;
|
|
858
721
|
}
|
|
859
|
-
//
|
|
722
|
+
// 获取用户所有动态数据
|
|
723
|
+
let updateNum;
|
|
860
724
|
let content;
|
|
861
725
|
try {
|
|
862
|
-
|
|
726
|
+
// 查询是否有新动态
|
|
727
|
+
const data = await ctx.ba.hasNewDynamic(updateBaseline);
|
|
728
|
+
updateNum = data.data.update_num;
|
|
729
|
+
// 没有新动态或获取动态信息失败直接返回
|
|
730
|
+
if (updateNum <= 0 || data.code !== 0)
|
|
731
|
+
return;
|
|
732
|
+
// 获取动态内容
|
|
733
|
+
content = await ctx.ba.getAllDynamic(updateBaseline);
|
|
863
734
|
}
|
|
864
735
|
catch (e) {
|
|
865
736
|
return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
|
|
866
737
|
}
|
|
867
|
-
//
|
|
738
|
+
// 判断获取动态内容是否成功
|
|
868
739
|
if (content.code !== 0) {
|
|
869
740
|
switch (content.code) {
|
|
870
741
|
case -101: { // 账号未登录
|
|
871
742
|
// 输出日志
|
|
872
743
|
this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
873
744
|
// 发送私聊消息
|
|
874
|
-
await this.sendPrivateMsg(
|
|
745
|
+
await this.sendPrivateMsg('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
875
746
|
// 停止服务
|
|
876
747
|
await ctx.sm.disposePlugin();
|
|
877
748
|
// 结束循环
|
|
@@ -881,7 +752,7 @@ class ComRegister {
|
|
|
881
752
|
// 输出日志
|
|
882
753
|
this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
883
754
|
// 发送私聊消息
|
|
884
|
-
await this.sendPrivateMsg(
|
|
755
|
+
await this.sendPrivateMsg('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
885
756
|
// 停止服务
|
|
886
757
|
await ctx.sm.disposePlugin();
|
|
887
758
|
// 结束循环
|
|
@@ -892,104 +763,98 @@ class ComRegister {
|
|
|
892
763
|
// 输出日志
|
|
893
764
|
this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
|
|
894
765
|
// 发送私聊消息
|
|
895
|
-
await this.sendPrivateMsg(
|
|
766
|
+
await this.sendPrivateMsg('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
896
767
|
// 结束循环
|
|
897
768
|
break;
|
|
898
769
|
}
|
|
899
770
|
default: { // 未知错误
|
|
900
771
|
// 发送私聊消息
|
|
901
|
-
await this.sendPrivateMsg(
|
|
902
|
-
// 取消订阅
|
|
903
|
-
this.unsubAll(ctx, bot, uid);
|
|
772
|
+
await this.sendPrivateMsg('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
904
773
|
// 结束循环
|
|
905
774
|
break;
|
|
906
775
|
}
|
|
907
776
|
}
|
|
908
777
|
}
|
|
909
778
|
// 获取数据内容
|
|
910
|
-
const
|
|
911
|
-
//
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
}
|
|
918
|
-
break;
|
|
919
|
-
}
|
|
920
|
-
case 0: timePoint = items[num].modules.module_author.pub_ts;
|
|
921
|
-
}
|
|
922
|
-
};
|
|
923
|
-
// 发送请求 默认只查看配置文件规定数量的数据
|
|
924
|
-
for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
|
|
779
|
+
const data = content.data;
|
|
780
|
+
// 更新基线
|
|
781
|
+
updateBaseline = data.update_baseline;
|
|
782
|
+
// 有新动态内容
|
|
783
|
+
const items = data.items;
|
|
784
|
+
// 检查更新的动态
|
|
785
|
+
for (let num = updateNum - 1; num >= 0; num--) {
|
|
925
786
|
// 没有动态内容则直接跳过
|
|
926
787
|
if (!items[num])
|
|
927
788
|
continue;
|
|
928
|
-
//
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
if (e.message === '出现关键词,屏蔽该动态') {
|
|
954
|
-
// 如果需要发送才发送
|
|
955
|
-
if (this.config.filter.notify) {
|
|
956
|
-
await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
957
|
-
}
|
|
958
|
-
return updatePoint(num);
|
|
789
|
+
// 从动态数据中取出UP主名称、UID和动态ID
|
|
790
|
+
const upUID = items[num].modules.module_author.mid;
|
|
791
|
+
// 寻找关注的UP主的动态
|
|
792
|
+
this.subManager.forEach(async (sub) => {
|
|
793
|
+
// 判断是否是订阅的UP主
|
|
794
|
+
if (sub.uid == upUID) {
|
|
795
|
+
// 订阅该UP主,推送该动态
|
|
796
|
+
// 定义变量
|
|
797
|
+
let pic;
|
|
798
|
+
let buffer;
|
|
799
|
+
// 从动态数据中取出UP主名称和动态ID
|
|
800
|
+
const upName = content.data.items[num].modules.module_author.name;
|
|
801
|
+
const dynamicId = content.data.items[num].id_str;
|
|
802
|
+
// 推送该条动态
|
|
803
|
+
const attempts = 3;
|
|
804
|
+
for (let i = 0; i < attempts; i++) {
|
|
805
|
+
// 获取动态推送图片
|
|
806
|
+
try {
|
|
807
|
+
// 渲染图片
|
|
808
|
+
const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
|
|
809
|
+
// 赋值
|
|
810
|
+
pic = gimgPic;
|
|
811
|
+
buffer = gimgBuffer;
|
|
812
|
+
// 成功则跳出循环
|
|
813
|
+
break;
|
|
959
814
|
}
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
815
|
+
catch (e) {
|
|
816
|
+
// 直播开播动态,不做处理
|
|
817
|
+
if (e.message === '直播开播动态,不做处理')
|
|
818
|
+
return;
|
|
819
|
+
if (e.message === '出现关键词,屏蔽该动态') {
|
|
820
|
+
// 如果需要发送才发送
|
|
821
|
+
if (this.config.filter.notify) {
|
|
822
|
+
await this.sendMsg(sub.targetIdArr, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
823
|
+
}
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
if (e.message === '已屏蔽转发动态') {
|
|
827
|
+
if (this.config.filter.notify) {
|
|
828
|
+
await this.sendMsg(sub.targetIdArr, `${upName}发布了一条转发动态,已屏蔽`);
|
|
829
|
+
}
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
// 未知错误
|
|
833
|
+
if (i === attempts - 1) {
|
|
834
|
+
this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
|
|
835
|
+
// 发送私聊消息并重启服务
|
|
836
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
963
837
|
}
|
|
964
|
-
return updatePoint(num);
|
|
965
|
-
}
|
|
966
|
-
// 未知错误
|
|
967
|
-
if (i === attempts - 1) {
|
|
968
|
-
this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
|
|
969
|
-
// 发送私聊消息并重启服务
|
|
970
|
-
return await this.sendPrivateMsgAndStopService(ctx, bot);
|
|
971
838
|
}
|
|
972
839
|
}
|
|
840
|
+
// 判断是否需要发送URL
|
|
841
|
+
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
842
|
+
// 如果pic存在,则直接返回pic
|
|
843
|
+
if (pic) {
|
|
844
|
+
this.logger.info('推送动态中,使用render模式');
|
|
845
|
+
// pic存在,使用的是render模式
|
|
846
|
+
await this.sendMsg(sub.targetIdArr, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
847
|
+
}
|
|
848
|
+
else if (buffer) {
|
|
849
|
+
this.logger.info('推送动态中,使用page模式');
|
|
850
|
+
// pic不存在,说明使用的是page模式
|
|
851
|
+
await this.sendMsg(sub.targetIdArr, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
852
|
+
}
|
|
853
|
+
else {
|
|
854
|
+
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
855
|
+
}
|
|
973
856
|
}
|
|
974
|
-
|
|
975
|
-
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
976
|
-
// 如果pic存在,则直接返回pic
|
|
977
|
-
if (pic) {
|
|
978
|
-
this.logger.info('推送动态中,使用render模式');
|
|
979
|
-
// pic存在,使用的是render模式
|
|
980
|
-
await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
981
|
-
}
|
|
982
|
-
else if (buffer) {
|
|
983
|
-
this.logger.info('推送动态中,使用page模式');
|
|
984
|
-
// pic不存在,说明使用的是page模式
|
|
985
|
-
await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
986
|
-
}
|
|
987
|
-
else {
|
|
988
|
-
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
989
|
-
}
|
|
990
|
-
// 更新时间点
|
|
991
|
-
updatePoint(num);
|
|
992
|
-
}
|
|
857
|
+
});
|
|
993
858
|
}
|
|
994
859
|
}
|
|
995
860
|
finally {
|
|
@@ -997,11 +862,12 @@ class ComRegister {
|
|
|
997
862
|
}
|
|
998
863
|
};
|
|
999
864
|
}
|
|
1000
|
-
debug_dynamicDetect(ctx
|
|
1001
|
-
let
|
|
1002
|
-
let
|
|
865
|
+
debug_dynamicDetect(ctx) {
|
|
866
|
+
let detectSetup = true;
|
|
867
|
+
let updateBaseline;
|
|
1003
868
|
// 相当于锁的作用,防止上一个循环没处理完
|
|
1004
869
|
let flag = true;
|
|
870
|
+
// 返回一个闭包函数
|
|
1005
871
|
return async () => {
|
|
1006
872
|
// 判断上一个循环是否完成
|
|
1007
873
|
if (!flag)
|
|
@@ -1009,33 +875,50 @@ class ComRegister {
|
|
|
1009
875
|
flag = false;
|
|
1010
876
|
// 无论是否执行成功都要释放锁
|
|
1011
877
|
try {
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
//
|
|
1016
|
-
|
|
1017
|
-
//
|
|
1018
|
-
|
|
878
|
+
console.log(`初始化状态:${detectSetup}`);
|
|
879
|
+
// 检测启动初始化
|
|
880
|
+
if (detectSetup) {
|
|
881
|
+
// 获取动态信息
|
|
882
|
+
const data = await ctx.ba.getAllDynamic();
|
|
883
|
+
// 判断获取动态信息是否成功
|
|
884
|
+
if (data.code !== 0)
|
|
885
|
+
return;
|
|
886
|
+
console.log(`更新基线:${data.data.update_baseline}`);
|
|
887
|
+
// 设置更新基线
|
|
888
|
+
updateBaseline = data.data.update_baseline;
|
|
889
|
+
// 设置初始化为false
|
|
890
|
+
detectSetup = false;
|
|
891
|
+
// 初始化完成
|
|
1019
892
|
return;
|
|
1020
893
|
}
|
|
1021
|
-
|
|
1022
|
-
|
|
894
|
+
// 获取用户所有动态数据
|
|
895
|
+
let updateNum;
|
|
1023
896
|
let content;
|
|
1024
897
|
try {
|
|
1025
|
-
|
|
898
|
+
// 查询是否有新动态
|
|
899
|
+
const data = await ctx.ba.hasNewDynamic(updateBaseline);
|
|
900
|
+
updateNum = data.data.update_num;
|
|
901
|
+
console.log(`获取是否有新动态:`);
|
|
902
|
+
console.log(data);
|
|
903
|
+
// 没有新动态或获取动态信息失败直接返回
|
|
904
|
+
if (updateNum <= 0 || data.code !== 0)
|
|
905
|
+
return;
|
|
906
|
+
// 获取动态内容
|
|
907
|
+
content = await ctx.ba.getAllDynamic(updateBaseline);
|
|
908
|
+
console.log('获取动态内容:');
|
|
909
|
+
console.log(content.data.items[0]);
|
|
1026
910
|
}
|
|
1027
911
|
catch (e) {
|
|
1028
|
-
return this.logger.error(
|
|
912
|
+
return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
|
|
1029
913
|
}
|
|
1030
|
-
|
|
1031
|
-
// 判断是否出现其他问题
|
|
914
|
+
// 判断获取动态内容是否成功
|
|
1032
915
|
if (content.code !== 0) {
|
|
1033
916
|
switch (content.code) {
|
|
1034
917
|
case -101: { // 账号未登录
|
|
1035
918
|
// 输出日志
|
|
1036
919
|
this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
1037
920
|
// 发送私聊消息
|
|
1038
|
-
await this.sendPrivateMsg(
|
|
921
|
+
await this.sendPrivateMsg('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
1039
922
|
// 停止服务
|
|
1040
923
|
await ctx.sm.disposePlugin();
|
|
1041
924
|
// 结束循环
|
|
@@ -1045,7 +928,7 @@ class ComRegister {
|
|
|
1045
928
|
// 输出日志
|
|
1046
929
|
this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
1047
930
|
// 发送私聊消息
|
|
1048
|
-
await this.sendPrivateMsg(
|
|
931
|
+
await this.sendPrivateMsg('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
1049
932
|
// 停止服务
|
|
1050
933
|
await ctx.sm.disposePlugin();
|
|
1051
934
|
// 结束循环
|
|
@@ -1056,109 +939,106 @@ class ComRegister {
|
|
|
1056
939
|
// 输出日志
|
|
1057
940
|
this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
|
|
1058
941
|
// 发送私聊消息
|
|
1059
|
-
await this.sendPrivateMsg(
|
|
942
|
+
await this.sendPrivateMsg('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
1060
943
|
// 结束循环
|
|
1061
944
|
break;
|
|
1062
945
|
}
|
|
1063
946
|
default: { // 未知错误
|
|
1064
947
|
// 发送私聊消息
|
|
1065
|
-
await this.sendPrivateMsg(
|
|
1066
|
-
// 取消订阅
|
|
1067
|
-
this.unsubAll(ctx, bot, uid);
|
|
948
|
+
await this.sendPrivateMsg('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
1068
949
|
// 结束循环
|
|
1069
950
|
break;
|
|
1070
951
|
}
|
|
1071
952
|
}
|
|
1072
953
|
}
|
|
1073
954
|
// 获取数据内容
|
|
1074
|
-
const
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
}
|
|
1085
|
-
case 0: timePoint = items[num].modules.module_author.pub_ts;
|
|
1086
|
-
}
|
|
1087
|
-
};
|
|
1088
|
-
// 发送请求 默认只查看配置文件规定数量的数据
|
|
1089
|
-
for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
|
|
955
|
+
const data = content.data;
|
|
956
|
+
// 更新基线
|
|
957
|
+
updateBaseline = data.update_baseline;
|
|
958
|
+
console.log(`更新基线:${updateBaseline}`);
|
|
959
|
+
// 有新动态内容
|
|
960
|
+
const items = data.items;
|
|
961
|
+
// 检查更新的动态
|
|
962
|
+
for (let num = updateNum - 1; num >= 0; num--) {
|
|
963
|
+
// 有更新动态
|
|
964
|
+
console.log('有更新动态');
|
|
1090
965
|
// 没有动态内容则直接跳过
|
|
1091
966
|
if (!items[num])
|
|
1092
967
|
continue;
|
|
1093
|
-
//
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
//
|
|
1122
|
-
|
|
1123
|
-
await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
1124
|
-
}
|
|
1125
|
-
return updatePoint(num);
|
|
968
|
+
// 从动态数据中取出UP主名称、UID和动态ID
|
|
969
|
+
const upName = content.data.items[num].modules.module_author.name;
|
|
970
|
+
const upUID = items[num].modules.module_author.mid;
|
|
971
|
+
const dynamicId = content.data.items[num].id_str;
|
|
972
|
+
console.log(`寻找关注的UP主,当前动态UP主:${upName},UID:${upUID},动态ID:${dynamicId}`);
|
|
973
|
+
// 寻找关注的UP主的动态
|
|
974
|
+
this.subManager.forEach(async (sub) => {
|
|
975
|
+
console.log(`当前订阅UP主:${sub.uid}`);
|
|
976
|
+
// 判断是否是订阅的UP主
|
|
977
|
+
if (sub.uid == upUID) {
|
|
978
|
+
// 订阅该UP主,推送该动态
|
|
979
|
+
// 定义变量
|
|
980
|
+
let pic;
|
|
981
|
+
let buffer;
|
|
982
|
+
// 从动态数据中取出UP主名称和动态ID
|
|
983
|
+
const upName = content.data.items[num].modules.module_author.name;
|
|
984
|
+
const dynamicId = content.data.items[num].id_str;
|
|
985
|
+
console.log(`UP主名称:${upName},动态ID:${dynamicId}`);
|
|
986
|
+
// 推送该条动态
|
|
987
|
+
const attempts = 3;
|
|
988
|
+
for (let i = 0; i < attempts; i++) {
|
|
989
|
+
// 获取动态推送图片
|
|
990
|
+
try {
|
|
991
|
+
// 渲染图片
|
|
992
|
+
const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
|
|
993
|
+
// 赋值
|
|
994
|
+
pic = gimgPic;
|
|
995
|
+
buffer = gimgBuffer;
|
|
996
|
+
// 成功则跳出循环
|
|
997
|
+
break;
|
|
1126
998
|
}
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
999
|
+
catch (e) {
|
|
1000
|
+
// 直播开播动态,不做处理
|
|
1001
|
+
if (e.message === '直播开播动态,不做处理')
|
|
1002
|
+
return;
|
|
1003
|
+
if (e.message === '出现关键词,屏蔽该动态') {
|
|
1004
|
+
// 如果需要发送才发送
|
|
1005
|
+
if (this.config.filter.notify) {
|
|
1006
|
+
await this.sendMsg(sub.targetIdArr, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
1007
|
+
}
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
if (e.message === '已屏蔽转发动态') {
|
|
1011
|
+
if (this.config.filter.notify) {
|
|
1012
|
+
await this.sendMsg(sub.targetIdArr, `${upName}发布了一条转发动态,已屏蔽`);
|
|
1013
|
+
}
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
1016
|
+
// 未知错误
|
|
1017
|
+
if (i === attempts - 1) {
|
|
1018
|
+
this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
|
|
1019
|
+
// 发送私聊消息并重启服务
|
|
1020
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
1130
1021
|
}
|
|
1131
|
-
return updatePoint(num);
|
|
1132
|
-
}
|
|
1133
|
-
// 未知错误
|
|
1134
|
-
if (i === attempts - 1) {
|
|
1135
|
-
this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
|
|
1136
|
-
// 发送私聊消息并重启服务
|
|
1137
|
-
return await this.sendPrivateMsgAndStopService(ctx, bot);
|
|
1138
1022
|
}
|
|
1139
1023
|
}
|
|
1024
|
+
// 判断是否需要发送URL
|
|
1025
|
+
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
1026
|
+
// 如果pic存在,则直接返回pic
|
|
1027
|
+
if (pic) {
|
|
1028
|
+
this.logger.info('推送动态中,使用render模式');
|
|
1029
|
+
// pic存在,使用的是render模式
|
|
1030
|
+
await this.sendMsg(sub.targetIdArr, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
1031
|
+
}
|
|
1032
|
+
else if (buffer) {
|
|
1033
|
+
this.logger.info('推送动态中,使用page模式');
|
|
1034
|
+
// pic不存在,说明使用的是page模式
|
|
1035
|
+
await this.sendMsg(sub.targetIdArr, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
1036
|
+
}
|
|
1037
|
+
else {
|
|
1038
|
+
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
1039
|
+
}
|
|
1140
1040
|
}
|
|
1141
|
-
|
|
1142
|
-
// 判断是否需要发送URL
|
|
1143
|
-
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
1144
|
-
// 如果pic存在,则直接返回pic
|
|
1145
|
-
if (pic) {
|
|
1146
|
-
this.logger.info(`UID:${uid}-推送动态中,使用render模式`);
|
|
1147
|
-
// pic存在,使用的是render模式
|
|
1148
|
-
await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
1149
|
-
}
|
|
1150
|
-
else if (buffer) {
|
|
1151
|
-
this.logger.info(`UID:${uid}-推送动态中,使用page模式`);
|
|
1152
|
-
// pic不存在,说明使用的是page模式
|
|
1153
|
-
await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
1154
|
-
}
|
|
1155
|
-
else {
|
|
1156
|
-
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
1157
|
-
}
|
|
1158
|
-
// 更新时间点
|
|
1159
|
-
updatePoint(num);
|
|
1160
|
-
this.logger.info(`UID:${uid}-推送动态完成`);
|
|
1161
|
-
}
|
|
1041
|
+
});
|
|
1162
1042
|
}
|
|
1163
1043
|
}
|
|
1164
1044
|
finally {
|
|
@@ -1166,7 +1046,7 @@ class ComRegister {
|
|
|
1166
1046
|
}
|
|
1167
1047
|
};
|
|
1168
1048
|
}
|
|
1169
|
-
liveDetect(ctx,
|
|
1049
|
+
liveDetect(ctx, roomId, guildId) {
|
|
1170
1050
|
let firstSubscription = true;
|
|
1171
1051
|
let timer = 0;
|
|
1172
1052
|
let open = false;
|
|
@@ -1199,7 +1079,7 @@ class ComRegister {
|
|
|
1199
1079
|
if (i === attempts - 1) { // 已尝试三次
|
|
1200
1080
|
this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
|
|
1201
1081
|
// 发送私聊消息并重启服务
|
|
1202
|
-
return await this.sendPrivateMsgAndStopService(ctx
|
|
1082
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
1203
1083
|
}
|
|
1204
1084
|
}
|
|
1205
1085
|
}
|
|
@@ -1207,11 +1087,11 @@ class ComRegister {
|
|
|
1207
1087
|
// pic 存在,使用的是render模式
|
|
1208
1088
|
if (pic) {
|
|
1209
1089
|
const msg = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), liveStartMsg && liveStartMsg, liveType !== LiveType.StartBroadcasting ? `https://live.bilibili.com/${roomId}` : ''] });
|
|
1210
|
-
return await this.sendMsg(guildId,
|
|
1090
|
+
return await this.sendMsg(guildId, pic + msg);
|
|
1211
1091
|
}
|
|
1212
1092
|
// pic不存在,说明使用的是page模式
|
|
1213
1093
|
const msg = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), liveStartMsg && liveStartMsg, liveType !== LiveType.StartBroadcasting ? `https://live.bilibili.com/${roomId}` : ''] });
|
|
1214
|
-
await this.sendMsg(guildId,
|
|
1094
|
+
await this.sendMsg(guildId, msg);
|
|
1215
1095
|
};
|
|
1216
1096
|
}
|
|
1217
1097
|
else {
|
|
@@ -1235,7 +1115,7 @@ class ComRegister {
|
|
|
1235
1115
|
if (i === attempts - 1) { // 已尝试三次
|
|
1236
1116
|
this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
|
|
1237
1117
|
// 发送私聊消息并重启服务
|
|
1238
|
-
return await this.sendPrivateMsgAndStopService(ctx
|
|
1118
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
1239
1119
|
}
|
|
1240
1120
|
}
|
|
1241
1121
|
}
|
|
@@ -1243,11 +1123,11 @@ class ComRegister {
|
|
|
1243
1123
|
// pic 存在,使用的是render模式
|
|
1244
1124
|
if (pic) {
|
|
1245
1125
|
const msg = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), liveStartMsg && liveStartMsg] });
|
|
1246
|
-
return await this.sendMsg(guildId,
|
|
1126
|
+
return await this.sendMsg(guildId, pic + msg);
|
|
1247
1127
|
}
|
|
1248
1128
|
// pic不存在,说明使用的是page模式
|
|
1249
1129
|
const msg = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), liveStartMsg && liveStartMsg] });
|
|
1250
|
-
await this.sendMsg(guildId,
|
|
1130
|
+
await this.sendMsg(guildId, msg);
|
|
1251
1131
|
};
|
|
1252
1132
|
}
|
|
1253
1133
|
// 定义获取主播信息方法
|
|
@@ -1287,7 +1167,7 @@ class ComRegister {
|
|
|
1287
1167
|
this.logger.error('liveDetect getLiveRoomInfo 发生了错误,错误为:' + e.message);
|
|
1288
1168
|
if (i === attempts - 1) { // 已尝试三次
|
|
1289
1169
|
// 发送私聊消息并重启服务
|
|
1290
|
-
return await this.sendPrivateMsgAndStopService(ctx
|
|
1170
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
1291
1171
|
}
|
|
1292
1172
|
}
|
|
1293
1173
|
}
|
|
@@ -1308,7 +1188,7 @@ class ComRegister {
|
|
|
1308
1188
|
this.logger.error('liveDetect getMasterInfo() 发生了错误,错误为:' + e.message);
|
|
1309
1189
|
if (i === attempts - 1) { // 已尝试三次
|
|
1310
1190
|
// 发送私聊消息并重启服务
|
|
1311
|
-
return await this.sendPrivateMsgAndStopService(ctx
|
|
1191
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
1312
1192
|
}
|
|
1313
1193
|
}
|
|
1314
1194
|
}
|
|
@@ -1352,7 +1232,7 @@ class ComRegister {
|
|
|
1352
1232
|
console.log(e);
|
|
1353
1233
|
}
|
|
1354
1234
|
// 发送下播通知
|
|
1355
|
-
await this.sendMsg(guildId,
|
|
1235
|
+
await this.sendMsg(guildId, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [resizedImage && koishi_1.h.image(resizedImage, 'image/png'), " ", liveEndMsg] }));
|
|
1356
1236
|
}
|
|
1357
1237
|
// 未进循环,还未开播,继续循环
|
|
1358
1238
|
break;
|
|
@@ -1377,7 +1257,7 @@ class ComRegister {
|
|
|
1377
1257
|
this.logger.error('liveDetect open getMasterInfo() 发生了错误,错误为:' + e.message);
|
|
1378
1258
|
if (i === attempts - 1) { // 已尝试三次
|
|
1379
1259
|
// 发送私聊消息并重启服务
|
|
1380
|
-
return await this.sendPrivateMsgAndStopService(ctx
|
|
1260
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
1381
1261
|
}
|
|
1382
1262
|
}
|
|
1383
1263
|
}
|
|
@@ -1426,40 +1306,35 @@ class ComRegister {
|
|
|
1426
1306
|
});
|
|
1427
1307
|
return table ? table : '没有订阅任何UP';
|
|
1428
1308
|
}
|
|
1429
|
-
async checkIfNeedSub(
|
|
1430
|
-
|
|
1431
|
-
|
|
1309
|
+
async checkIfNeedSub(liveSub, dynamicSub, session, data) {
|
|
1310
|
+
// 定义方法:用户直播间是否存在
|
|
1311
|
+
const liveRoom = async () => {
|
|
1312
|
+
if (!data.live_room) {
|
|
1313
|
+
// 未开通直播间
|
|
1432
1314
|
await session.send('该用户未开通直播间,无法订阅直播');
|
|
1433
|
-
|
|
1315
|
+
// 返回false
|
|
1316
|
+
return true;
|
|
1434
1317
|
}
|
|
1435
|
-
return
|
|
1318
|
+
return false;
|
|
1319
|
+
};
|
|
1320
|
+
// 如果两者都为true或者都为false则直接返回
|
|
1321
|
+
if ((liveSub && dynamicSub) || (!liveSub && !dynamicSub)) {
|
|
1322
|
+
// 判断是否存在直播间
|
|
1323
|
+
if (await liveRoom())
|
|
1324
|
+
return [false, true];
|
|
1325
|
+
// 返回
|
|
1326
|
+
return [true, true];
|
|
1436
1327
|
}
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
continue;
|
|
1445
|
-
}
|
|
1446
|
-
switch (input) {
|
|
1447
|
-
case 'y': { // 需要订阅直播
|
|
1448
|
-
// 如果用户没有开通直播间则无法订阅
|
|
1449
|
-
if (subType === '直播' && !data.live_room) {
|
|
1450
|
-
await session.send('该用户未开通直播间,无法订阅直播');
|
|
1451
|
-
return false;
|
|
1452
|
-
}
|
|
1453
|
-
// 开启直播订阅
|
|
1454
|
-
return true;
|
|
1455
|
-
}
|
|
1456
|
-
// 不需要
|
|
1457
|
-
case 'n': return false;
|
|
1458
|
-
default: { // 输入了其他的内容
|
|
1459
|
-
session.send('输入有误,请输入 y 或 n');
|
|
1460
|
-
}
|
|
1461
|
-
}
|
|
1328
|
+
// 如果只订阅直播
|
|
1329
|
+
if (liveSub) {
|
|
1330
|
+
// 判断是否存在直播间
|
|
1331
|
+
if (await liveRoom())
|
|
1332
|
+
return [false, false];
|
|
1333
|
+
// 返回
|
|
1334
|
+
return [true, false];
|
|
1462
1335
|
}
|
|
1336
|
+
// 只订阅动态
|
|
1337
|
+
return [false, true];
|
|
1463
1338
|
}
|
|
1464
1339
|
updateSubNotifier(ctx) {
|
|
1465
1340
|
// 更新控制台提示
|
|
@@ -1509,21 +1384,10 @@ class ComRegister {
|
|
|
1509
1384
|
return;
|
|
1510
1385
|
// 从数据库中获取数据
|
|
1511
1386
|
const subData = await ctx.database.get('bilibili', { id: { $gt: 0 } });
|
|
1512
|
-
//
|
|
1513
|
-
|
|
1514
|
-
// 如果订阅数量超过三个则数据库被非法修改
|
|
1515
|
-
if (!this.config.unlockSubLimits && this.num > 3) {
|
|
1516
|
-
// 在控制台提示重新订阅
|
|
1517
|
-
ctx.notifier.create({
|
|
1518
|
-
type: 'danger',
|
|
1519
|
-
content: '您未解锁订阅限制,且订阅数大于3人,请您手动删除bilibili表中多余的数据后重启本插件'
|
|
1520
|
-
});
|
|
1521
|
-
return;
|
|
1522
|
-
}
|
|
1387
|
+
// 定义变量:订阅直播数
|
|
1388
|
+
let liveSubNum = 0;
|
|
1523
1389
|
// 循环遍历
|
|
1524
1390
|
for (const sub of subData) {
|
|
1525
|
-
// 定义Bot
|
|
1526
|
-
let bot;
|
|
1527
1391
|
// 判断是否存在没有任何订阅的数据
|
|
1528
1392
|
if (!sub.dynamic && !sub.live) { // 存在未订阅任何项目的数据
|
|
1529
1393
|
// 删除该条数据
|
|
@@ -1534,45 +1398,8 @@ class ComRegister {
|
|
|
1534
1398
|
continue;
|
|
1535
1399
|
}
|
|
1536
1400
|
// 获取推送目标数组
|
|
1537
|
-
const
|
|
1538
|
-
|
|
1539
|
-
switch (sub.platform) {
|
|
1540
|
-
case 'lark':
|
|
1541
|
-
bot = this.larkBot;
|
|
1542
|
-
break;
|
|
1543
|
-
case 'qq':
|
|
1544
|
-
bot = this.qqBot;
|
|
1545
|
-
break;
|
|
1546
|
-
case 'qqguild':
|
|
1547
|
-
bot = this.qqguildBot;
|
|
1548
|
-
break;
|
|
1549
|
-
case 'onebot':
|
|
1550
|
-
bot = this.oneBot;
|
|
1551
|
-
break;
|
|
1552
|
-
case 'red':
|
|
1553
|
-
bot = this.redBot;
|
|
1554
|
-
break;
|
|
1555
|
-
case 'telegram':
|
|
1556
|
-
bot = this.telegramBot;
|
|
1557
|
-
break;
|
|
1558
|
-
case 'satori':
|
|
1559
|
-
bot = this.satoriBot;
|
|
1560
|
-
break;
|
|
1561
|
-
case 'chronocat':
|
|
1562
|
-
bot = this.chronocatBot;
|
|
1563
|
-
break;
|
|
1564
|
-
default: {
|
|
1565
|
-
// 本条数据被篡改,删除该条订阅
|
|
1566
|
-
ctx.database.remove('bilibili', { id: sub.id });
|
|
1567
|
-
// 不支持的协议
|
|
1568
|
-
this.logger.info(`UID:${sub.uid} 出现不支持的协议,该条数据被篡改,自动取消订阅`);
|
|
1569
|
-
// 发送消息
|
|
1570
|
-
await this.sendPrivateMsg(bot, `UID:${sub.uid} 出现不支持的协议,该条数据被篡改,自动取消订阅`);
|
|
1571
|
-
// 继续下个循环
|
|
1572
|
-
continue;
|
|
1573
|
-
}
|
|
1574
|
-
}
|
|
1575
|
-
// 判断数据库是否被篡改
|
|
1401
|
+
const targetIdArr = sub.targetId.split(' ');
|
|
1402
|
+
/* 判断数据库是否被篡改 */
|
|
1576
1403
|
// 获取用户信息
|
|
1577
1404
|
let content;
|
|
1578
1405
|
const attempts = 3;
|
|
@@ -1587,7 +1414,7 @@ class ComRegister {
|
|
|
1587
1414
|
this.logger.error('getSubFromDatabase() getUserInfo() 发生了错误,错误为:' + e.message);
|
|
1588
1415
|
if (i === attempts - 1) { // 已尝试三次
|
|
1589
1416
|
// 发送私聊消息并重启服务
|
|
1590
|
-
return await this.sendPrivateMsgAndStopService(ctx
|
|
1417
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
1591
1418
|
}
|
|
1592
1419
|
}
|
|
1593
1420
|
}
|
|
@@ -1598,14 +1425,14 @@ class ComRegister {
|
|
|
1598
1425
|
// 从数据库删除该条数据
|
|
1599
1426
|
await ctx.database.remove('bilibili', { id: sub.id });
|
|
1600
1427
|
// 给用户发送提示
|
|
1601
|
-
await this.sendPrivateMsg(
|
|
1428
|
+
await this.sendPrivateMsg(`UID:${sub.uid} 数据库内容被篡改,已取消对该UP主的订阅`);
|
|
1602
1429
|
};
|
|
1603
1430
|
// 判断是否有其他问题
|
|
1604
1431
|
if (content.code !== 0) {
|
|
1605
1432
|
switch (content.code) {
|
|
1606
1433
|
case -352:
|
|
1607
1434
|
case -403: {
|
|
1608
|
-
await this.sendPrivateMsg(
|
|
1435
|
+
await this.sendPrivateMsg('你的登录信息已过期,请重新登录Bilibili');
|
|
1609
1436
|
return;
|
|
1610
1437
|
}
|
|
1611
1438
|
case -400:
|
|
@@ -1613,7 +1440,7 @@ class ComRegister {
|
|
|
1613
1440
|
default: {
|
|
1614
1441
|
await deleteSub();
|
|
1615
1442
|
// PrivateMsg
|
|
1616
|
-
await this.sendPrivateMsg(
|
|
1443
|
+
await this.sendPrivateMsg(`UID:${sub.uid} 数据出现问题,自动取消订阅`);
|
|
1617
1444
|
// log
|
|
1618
1445
|
this.logger.info(`UID:${sub.uid} 数据出现问题,自动取消订阅`);
|
|
1619
1446
|
return;
|
|
@@ -1627,7 +1454,7 @@ class ComRegister {
|
|
|
1627
1454
|
// log
|
|
1628
1455
|
this.logger.info(`UID:${sub.uid} 房间号被篡改,自动取消订阅`);
|
|
1629
1456
|
// Send msg
|
|
1630
|
-
await this.sendPrivateMsg(
|
|
1457
|
+
await this.sendPrivateMsg(`UID:${sub.uid} 房间号被篡改,自动取消订阅`);
|
|
1631
1458
|
return;
|
|
1632
1459
|
}
|
|
1633
1460
|
// 构建订阅对象
|
|
@@ -1635,92 +1462,116 @@ class ComRegister {
|
|
|
1635
1462
|
id: sub.id,
|
|
1636
1463
|
uid: sub.uid,
|
|
1637
1464
|
roomId: sub.room_id,
|
|
1638
|
-
|
|
1465
|
+
targetIdArr,
|
|
1639
1466
|
platform: sub.platform,
|
|
1640
1467
|
live: +sub.live === 1 ? true : false,
|
|
1641
1468
|
dynamic: +sub.dynamic === 1 ? true : false,
|
|
1642
|
-
liveDispose: null
|
|
1643
|
-
dynamicDispose: null
|
|
1469
|
+
liveDispose: null
|
|
1644
1470
|
};
|
|
1645
|
-
//
|
|
1646
|
-
if (sub.
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1471
|
+
// 判断是否订阅直播
|
|
1472
|
+
if (sub.live) {
|
|
1473
|
+
// 判断订阅直播数是否超过限制
|
|
1474
|
+
if (!this.config.unlockSubLimits && liveSubNum >= 3) {
|
|
1475
|
+
subManagerItem.live = false;
|
|
1476
|
+
// log
|
|
1477
|
+
this.logger.warn(`UID:${sub.uid} 订阅直播数超过限制,自动取消订阅`);
|
|
1478
|
+
// 发送错误消息
|
|
1479
|
+
this.sendPrivateMsg(`UID:${sub.uid} 订阅直播数超过限制,自动取消订阅`);
|
|
1651
1480
|
}
|
|
1652
1481
|
else {
|
|
1653
|
-
|
|
1482
|
+
// 直播订阅数+1
|
|
1483
|
+
liveSubNum++;
|
|
1484
|
+
// 订阅直播,开始循环检测
|
|
1485
|
+
const dispose = ctx.setInterval(this.liveDetect(ctx, sub.room_id, targetIdArr), this.config.liveLoopTime * 1000);
|
|
1486
|
+
// 保存销毁函数
|
|
1487
|
+
subManagerItem.liveDispose = dispose;
|
|
1654
1488
|
}
|
|
1655
|
-
// 保存销毁函数
|
|
1656
|
-
subManagerItem.dynamicDispose = dispose;
|
|
1657
|
-
}
|
|
1658
|
-
if (sub.live) { // 需要订阅直播
|
|
1659
|
-
// 开始循环检测
|
|
1660
|
-
const dispose = ctx.setInterval(this.liveDetect(ctx, bot, sub.room_id, targetArr), this.config.liveLoopTime * 1000);
|
|
1661
|
-
// 保存销毁函数
|
|
1662
|
-
subManagerItem.liveDispose = dispose;
|
|
1663
1489
|
}
|
|
1664
1490
|
// 保存新订阅对象
|
|
1665
1491
|
this.subManager.push(subManagerItem);
|
|
1666
1492
|
}
|
|
1493
|
+
// 检查是否有订阅对象需要动态监测
|
|
1494
|
+
if (this.subManager.some(sub => sub.dynamic)) {
|
|
1495
|
+
// 开始动态监测
|
|
1496
|
+
if (this.config.dynamicDebugMode) {
|
|
1497
|
+
this.dynamicDispose = ctx.setInterval(this.debug_dynamicDetect(ctx), 10000);
|
|
1498
|
+
}
|
|
1499
|
+
else {
|
|
1500
|
+
this.dynamicDispose = ctx.setInterval(this.dynamicDetect(ctx), 10000 /* this.config.dynamicLoopTime * 1000 */);
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1667
1503
|
// 在控制台中显示订阅对象
|
|
1668
1504
|
this.updateSubNotifier(ctx);
|
|
1669
1505
|
}
|
|
1670
1506
|
unsubSingle(ctx, id /* UID或RoomId */, type /* 0取消Live订阅,1取消Dynamic订阅 */) {
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1507
|
+
// 定义返回消息
|
|
1508
|
+
let msg;
|
|
1509
|
+
// 定义方法:检查是否没有任何订阅
|
|
1510
|
+
const checkIfNoSubExist = (sub) => !sub.dynamic && !sub.live;
|
|
1511
|
+
// 定义方法:将订阅对象从订阅管理对象中移除
|
|
1512
|
+
const removeSub = (index) => {
|
|
1513
|
+
// 从管理对象中移除
|
|
1514
|
+
this.subManager.splice(index, 1);
|
|
1515
|
+
// 从数据库中删除
|
|
1516
|
+
ctx.database.remove('bilibili', [this.subManager[index].id]);
|
|
1517
|
+
// num--
|
|
1518
|
+
this.num--;
|
|
1519
|
+
// 判断是否还存在订阅了动态的对象,不存在则停止动态监测
|
|
1520
|
+
this.checkIfUserThatIsSubDynAndUnsub();
|
|
1685
1521
|
};
|
|
1686
1522
|
try {
|
|
1687
1523
|
switch (type) {
|
|
1688
1524
|
case 0: { // 取消Live订阅
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1525
|
+
// 获取订阅对象所在的索引
|
|
1526
|
+
const index = this.subManager.findIndex(sub => sub.roomId === id);
|
|
1527
|
+
// 获取订阅对象
|
|
1528
|
+
const sub = this.subManager.find(sub => sub.roomId === id);
|
|
1529
|
+
// 判断是否存在订阅对象
|
|
1530
|
+
if (!sub) {
|
|
1531
|
+
msg = '未订阅该用户,无需取消订阅';
|
|
1532
|
+
return msg;
|
|
1533
|
+
}
|
|
1692
1534
|
// 取消订阅
|
|
1693
|
-
if (
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1535
|
+
if (sub.live)
|
|
1536
|
+
sub.liveDispose();
|
|
1537
|
+
sub.liveDispose = null;
|
|
1538
|
+
sub.live = false;
|
|
1697
1539
|
// 如果没有对这个UP的任何订阅,则移除
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1540
|
+
if (checkIfNoSubExist(sub)) {
|
|
1541
|
+
// 从管理对象中移除
|
|
1542
|
+
removeSub(index);
|
|
1543
|
+
return '已取消订阅该用户';
|
|
1544
|
+
}
|
|
1701
1545
|
// 更新数据库
|
|
1702
1546
|
ctx.database.upsert('bilibili', [{
|
|
1703
|
-
id: +`${
|
|
1547
|
+
id: +`${sub.id}`,
|
|
1704
1548
|
live: 0
|
|
1705
1549
|
}]);
|
|
1706
1550
|
return '已取消订阅Live';
|
|
1707
1551
|
}
|
|
1708
1552
|
case 1: { // 取消Dynamic订阅
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1553
|
+
// 获取订阅对象所在的索引
|
|
1554
|
+
const index = this.subManager.findIndex(sub => sub.uid === id);
|
|
1555
|
+
// 获取订阅对象
|
|
1556
|
+
const sub = this.subManager.find(sub => sub.uid === id);
|
|
1557
|
+
// 判断是否存在订阅对象
|
|
1558
|
+
if (!sub) {
|
|
1559
|
+
msg = '未订阅该用户,无需取消订阅';
|
|
1560
|
+
return msg;
|
|
1561
|
+
}
|
|
1712
1562
|
// 取消订阅
|
|
1713
|
-
if (this.subManager[index].dynamic)
|
|
1714
|
-
this.subManager[index].dynamicDispose();
|
|
1715
|
-
this.subManager[index].dynamicDispose = null;
|
|
1716
1563
|
this.subManager[index].dynamic = false;
|
|
1564
|
+
// 判断是否还存在订阅了动态的对象,不存在则停止动态监测
|
|
1565
|
+
this.checkIfUserThatIsSubDynAndUnsub();
|
|
1717
1566
|
// 如果没有对这个UP的任何订阅,则移除
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1567
|
+
if (checkIfNoSubExist(sub)) {
|
|
1568
|
+
// 从管理对象中移除
|
|
1569
|
+
removeSub(index);
|
|
1570
|
+
return '已取消订阅该用户';
|
|
1571
|
+
}
|
|
1721
1572
|
// 更新数据库
|
|
1722
1573
|
ctx.database.upsert('bilibili', [{
|
|
1723
|
-
id:
|
|
1574
|
+
id: sub.id,
|
|
1724
1575
|
dynamic: 0
|
|
1725
1576
|
}]);
|
|
1726
1577
|
return '已取消订阅Dynamic';
|
|
@@ -1732,13 +1583,20 @@ class ComRegister {
|
|
|
1732
1583
|
this.updateSubNotifier(ctx);
|
|
1733
1584
|
}
|
|
1734
1585
|
}
|
|
1735
|
-
|
|
1586
|
+
checkIfUserThatIsSubDynAndUnsub() {
|
|
1587
|
+
if (this.subManager.some(sub => sub.dynamic)) {
|
|
1588
|
+
// 停止动态监测
|
|
1589
|
+
this.dynamicDispose();
|
|
1590
|
+
this.dynamicDispose = null;
|
|
1591
|
+
}
|
|
1592
|
+
}
|
|
1593
|
+
unsubAll(ctx, uid) {
|
|
1736
1594
|
this.subManager.filter(sub => sub.uid === uid).map(async (sub, i) => {
|
|
1737
1595
|
// 取消全部订阅 执行dispose方法,销毁定时器
|
|
1738
|
-
if (sub.dynamic)
|
|
1739
|
-
await this.subManager[i].dynamicDispose();
|
|
1740
1596
|
if (sub.live)
|
|
1741
1597
|
await this.subManager[i].liveDispose();
|
|
1598
|
+
// 判断是否还存在订阅了动态的对象,不存在则停止动态监测
|
|
1599
|
+
this.checkIfUserThatIsSubDynAndUnsub();
|
|
1742
1600
|
// 从数据库中删除订阅
|
|
1743
1601
|
await ctx.database.remove('bilibili', { uid: this.subManager[i].uid });
|
|
1744
1602
|
// 将该订阅对象从订阅管理对象中移除
|
|
@@ -1746,7 +1604,7 @@ class ComRegister {
|
|
|
1746
1604
|
// id--
|
|
1747
1605
|
this.num--;
|
|
1748
1606
|
// 发送成功通知
|
|
1749
|
-
this.sendPrivateMsg(
|
|
1607
|
+
this.sendPrivateMsg(`UID:${uid},已取消订阅该用户`);
|
|
1750
1608
|
// 更新控制台提示
|
|
1751
1609
|
this.updateSubNotifier(ctx);
|
|
1752
1610
|
});
|
|
@@ -1763,6 +1621,7 @@ class ComRegister {
|
|
|
1763
1621
|
}
|
|
1764
1622
|
(function (ComRegister) {
|
|
1765
1623
|
ComRegister.Config = koishi_1.Schema.object({
|
|
1624
|
+
platform: koishi_1.Schema.string(),
|
|
1766
1625
|
master: koishi_1.Schema.object({
|
|
1767
1626
|
enable: koishi_1.Schema.boolean(),
|
|
1768
1627
|
masterAccount: koishi_1.Schema.string(),
|