koishi-plugin-bilibili-notify 2.0.0-alpha.0 → 2.0.0-alpha.10
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 +1 -0
- package/lib/biliAPI.js +10 -0
- package/lib/comRegister.d.ts +29 -11
- package/lib/comRegister.js +577 -370
- package/lib/database.d.ts +1 -2
- package/lib/database.js +1 -2
- package/lib/generateImg.js +8 -9
- package/lib/index.d.ts +2 -3
- package/lib/index.js +16 -18
- package/package.json +1 -2
- package/readme.md +28 -10
package/lib/comRegister.js
CHANGED
|
@@ -10,15 +10,16 @@ const jsx_runtime_1 = require("@satorijs/element/jsx-runtime");
|
|
|
10
10
|
const koishi_1 = require("koishi");
|
|
11
11
|
// 导入qrcode
|
|
12
12
|
const qrcode_1 = __importDefault(require("qrcode"));
|
|
13
|
-
const jimp_1 = require("jimp");
|
|
14
13
|
var LiveType;
|
|
15
14
|
(function (LiveType) {
|
|
16
15
|
LiveType[LiveType["NotLiveBroadcast"] = 0] = "NotLiveBroadcast";
|
|
17
16
|
LiveType[LiveType["StartBroadcasting"] = 1] = "StartBroadcasting";
|
|
18
17
|
LiveType[LiveType["LiveBroadcast"] = 2] = "LiveBroadcast";
|
|
18
|
+
LiveType[LiveType["StopBroadcast"] = 3] = "StopBroadcast";
|
|
19
19
|
})(LiveType || (LiveType = {}));
|
|
20
20
|
class ComRegister {
|
|
21
21
|
static inject = ['ba', 'gi', 'database', 'sm'];
|
|
22
|
+
qqRelatedBotList = ['qq', 'onebot', 'red', 'satori', 'chronocat'];
|
|
22
23
|
logger;
|
|
23
24
|
config;
|
|
24
25
|
loginTimer;
|
|
@@ -26,8 +27,10 @@ class ComRegister {
|
|
|
26
27
|
rebootCount = 0;
|
|
27
28
|
subNotifier;
|
|
28
29
|
subManager = [];
|
|
30
|
+
// 检查登录数据库是否有数据
|
|
31
|
+
loginDBData;
|
|
29
32
|
// 机器人实例
|
|
30
|
-
|
|
33
|
+
privateBot;
|
|
31
34
|
// 动态销毁函数
|
|
32
35
|
dynamicDispose;
|
|
33
36
|
// 发送消息方式
|
|
@@ -36,26 +39,27 @@ class ComRegister {
|
|
|
36
39
|
constructor(ctx, config) {
|
|
37
40
|
this.logger = ctx.logger('cr');
|
|
38
41
|
this.config = config;
|
|
39
|
-
//
|
|
40
|
-
this.
|
|
41
|
-
if (!this.
|
|
42
|
+
// 拿到私人机器人实例
|
|
43
|
+
this.privateBot = ctx.bots.find(bot => bot.platform === config.master.platform);
|
|
44
|
+
if (!this.privateBot) {
|
|
42
45
|
ctx.notifier.create({
|
|
43
|
-
|
|
44
|
-
content: '未找到对应机器人实例,请检查配置是否正确或重新配置适配器!'
|
|
46
|
+
content: '您未配置私人机器人,将无法向您推送机器人状态!'
|
|
45
47
|
});
|
|
46
|
-
this.logger.error('
|
|
48
|
+
this.logger.error('您未配置私人机器人,将无法向您推送机器人状态!');
|
|
47
49
|
}
|
|
50
|
+
// 检查登录数据库是否有数据
|
|
51
|
+
ctx.database.get('loginBili', 1, ['dynamic_group_id']).then(data => this.loginDBData = data[0]);
|
|
48
52
|
// 从数据库获取订阅
|
|
49
53
|
this.getSubFromDatabase(ctx);
|
|
50
54
|
// 判断消息发送方式
|
|
51
55
|
if (config.automaticResend) {
|
|
52
|
-
this.sendMsgFunc = async (
|
|
56
|
+
this.sendMsgFunc = async (bot, channelId, content) => {
|
|
53
57
|
// 多次尝试发送消息
|
|
54
58
|
const attempts = 3;
|
|
55
59
|
for (let i = 0; i < attempts; i++) {
|
|
56
60
|
try {
|
|
57
61
|
// 发送消息
|
|
58
|
-
await
|
|
62
|
+
await bot.sendMessage(channelId, content);
|
|
59
63
|
// 防止消息发送速度过快被忽略
|
|
60
64
|
await ctx.sleep(500);
|
|
61
65
|
// 成功发送消息,跳出循环
|
|
@@ -63,19 +67,19 @@ class ComRegister {
|
|
|
63
67
|
}
|
|
64
68
|
catch (e) {
|
|
65
69
|
if (i === attempts - 1) { // 已尝试三次
|
|
66
|
-
this.logger.error(`发送群组ID:${
|
|
70
|
+
this.logger.error(`发送群组ID:${channelId}消息失败!原因: ` + e.message);
|
|
67
71
|
console.log(e);
|
|
68
|
-
this.sendPrivateMsg(`发送群组ID:${
|
|
72
|
+
this.sendPrivateMsg(`发送群组ID:${channelId}消息失败,请查看日志`);
|
|
69
73
|
}
|
|
70
74
|
}
|
|
71
75
|
}
|
|
72
76
|
};
|
|
73
77
|
}
|
|
74
78
|
else {
|
|
75
|
-
this.sendMsgFunc = async (guild, content) => {
|
|
79
|
+
this.sendMsgFunc = async (bot, guild, content) => {
|
|
76
80
|
try {
|
|
77
81
|
// 发送消息
|
|
78
|
-
await
|
|
82
|
+
await bot.sendMessage(guild, content);
|
|
79
83
|
}
|
|
80
84
|
catch (e) {
|
|
81
85
|
this.logger.error(`发送群组ID:${guild}消息失败!原因: ` + e.message);
|
|
@@ -99,9 +103,30 @@ class ComRegister {
|
|
|
99
103
|
.usage('查看订阅管理对象')
|
|
100
104
|
.example('status sm')
|
|
101
105
|
.action(async () => {
|
|
102
|
-
|
|
106
|
+
this.logger.info(this.subManager);
|
|
103
107
|
return '查看控制台';
|
|
104
108
|
});
|
|
109
|
+
statusCom
|
|
110
|
+
.subcommand('.bot', '查询当前拥有的机器人信息', { hidden: true })
|
|
111
|
+
.usage('查询当前拥有的机器人信息')
|
|
112
|
+
.example('status bot 查询当前拥有的机器人信息')
|
|
113
|
+
.action(() => {
|
|
114
|
+
this.logger.info('开始输出BOT信息');
|
|
115
|
+
ctx.bots.forEach(bot => {
|
|
116
|
+
this.logger.info('--------------------------------');
|
|
117
|
+
this.logger.info('平台:' + bot.platform);
|
|
118
|
+
this.logger.info('名称:' + bot.user.name);
|
|
119
|
+
this.logger.info('--------------------------------');
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
statusCom
|
|
123
|
+
.subcommand('.env', '查询当前环境的信息', { hidden: true })
|
|
124
|
+
.usage('查询当前环境的信息')
|
|
125
|
+
.example('status env 查询当前环境的信息')
|
|
126
|
+
.action(async ({ session }) => {
|
|
127
|
+
await session.send(`Guild ID:${session.event.guild.id}`);
|
|
128
|
+
await session.send(`Channel ID: ${session.event.channel.id}`);
|
|
129
|
+
});
|
|
105
130
|
const biliCom = ctx.command('bili', 'bili-notify插件相关指令', { permissions: ['authority:3'] });
|
|
106
131
|
biliCom.subcommand('.login', '登录B站之后才可以进行之后的操作')
|
|
107
132
|
.usage('使用二维码登录,登录B站之后才可以进行之后的操作')
|
|
@@ -216,6 +241,7 @@ class ComRegister {
|
|
|
216
241
|
await session.send(this.unsubSingle(ctx, sub.uid, 1)); /* 1为取消订阅Dynamic */
|
|
217
242
|
// 将存在flag设置为true
|
|
218
243
|
exist = true;
|
|
244
|
+
// 结束循环
|
|
219
245
|
return;
|
|
220
246
|
}
|
|
221
247
|
// 取消全部订阅 执行dispose方法,销毁定时器
|
|
@@ -227,10 +253,13 @@ class ComRegister {
|
|
|
227
253
|
this.subManager.splice(i, 1);
|
|
228
254
|
// 将订阅对象移出订阅关注组
|
|
229
255
|
const removeUserFromGroupData = await ctx.ba.removeUserFromGroup(sub.uid);
|
|
230
|
-
// 判断是否移出成功
|
|
231
|
-
if (removeUserFromGroupData.code !== 0) {
|
|
256
|
+
// 判断是否移出成功 22105关注对象为自己
|
|
257
|
+
if (removeUserFromGroupData.code !== 0 && removeUserFromGroupData.code !== 22105) {
|
|
232
258
|
// 移出失败
|
|
233
|
-
session.send('取消订阅对象失败,请稍后重试');
|
|
259
|
+
await session.send('取消订阅对象失败,请稍后重试');
|
|
260
|
+
// 将存在flag设置为true
|
|
261
|
+
exist = true;
|
|
262
|
+
// 结束循环
|
|
234
263
|
return;
|
|
235
264
|
}
|
|
236
265
|
// id--
|
|
@@ -243,7 +272,7 @@ class ComRegister {
|
|
|
243
272
|
this.dynamicDispose = null;
|
|
244
273
|
}
|
|
245
274
|
// 发送成功通知
|
|
246
|
-
session.send('已取消订阅该用户');
|
|
275
|
+
await session.send('已取消订阅该用户');
|
|
247
276
|
// 更新控制台提示
|
|
248
277
|
this.updateSubNotifier(ctx);
|
|
249
278
|
// 将存在flag设置为true
|
|
@@ -252,7 +281,7 @@ class ComRegister {
|
|
|
252
281
|
}));
|
|
253
282
|
// 未订阅该用户,无需取消订阅
|
|
254
283
|
if (!exist)
|
|
255
|
-
session.send('未订阅该用户,无需取消订阅');
|
|
284
|
+
await session.send('未订阅该用户,无需取消订阅');
|
|
256
285
|
});
|
|
257
286
|
biliCom
|
|
258
287
|
.subcommand('.show', '展示订阅对象')
|
|
@@ -263,24 +292,18 @@ class ComRegister {
|
|
|
263
292
|
return subTable;
|
|
264
293
|
});
|
|
265
294
|
biliCom
|
|
266
|
-
.subcommand('.sub <mid:string>
|
|
295
|
+
.subcommand('.sub <mid:string>', '订阅用户动态和直播通知')
|
|
296
|
+
.option('multiplatform', '-m <value:string>', { type: /^[A-Za-z0-9]+@?(?:,[A-Za-z0-9]+@?)*\.[A-Za-z0-9]+(?:;[A-Za-z0-9]+@?(?:,[A-Za-z0-9]+@?)*\.[A-Za-z0-9]+)*$/ })
|
|
267
297
|
.option('live', '-l')
|
|
268
298
|
.option('dynamic', '-d')
|
|
269
|
-
.
|
|
270
|
-
.
|
|
271
|
-
.
|
|
299
|
+
.option('atAll', '-a')
|
|
300
|
+
.usage('订阅用户动态和直播通知,若需要订阅直播请加上-l,需要订阅动态则加上-d')
|
|
301
|
+
.example('bili sub 1194210119 目标群号或频道号 -l -d 订阅UID为1194210119的UP主的动态和直播')
|
|
302
|
+
.action(async ({ session, options }, mid) => {
|
|
272
303
|
this.logger.info('调用bili.sub指令');
|
|
273
|
-
//
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
case 'red':
|
|
277
|
-
case 'onebot':
|
|
278
|
-
case 'telegram':
|
|
279
|
-
case 'satori':
|
|
280
|
-
case 'chronocat':
|
|
281
|
-
case 'qq':
|
|
282
|
-
case 'qqguild': break;
|
|
283
|
-
default: return '暂不支持该平台';
|
|
304
|
+
// 先判断是否订阅直播,再判断是否解锁订阅限制,最后判断直播订阅是否已超三个
|
|
305
|
+
if (options.live && !this.config.unlockSubLimits && (this.subManager.reduce((acc, cur) => acc + (cur.live ? 1 : 0), 0) >= 3)) {
|
|
306
|
+
return '直播订阅已达上限,请取消部分直播订阅后再进行订阅';
|
|
284
307
|
}
|
|
285
308
|
// 检查是否登录
|
|
286
309
|
if (!(await this.checkIfIsLogin(ctx))) {
|
|
@@ -290,54 +313,80 @@ class ComRegister {
|
|
|
290
313
|
// 检查必选参数是否已填
|
|
291
314
|
if (!mid)
|
|
292
315
|
return '请输入用户uid';
|
|
293
|
-
//
|
|
294
|
-
const
|
|
295
|
-
//
|
|
296
|
-
if (
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
316
|
+
// 订阅对象
|
|
317
|
+
const subUserData = await this.subUserInBili(ctx, mid);
|
|
318
|
+
// 判断是否订阅对象存在
|
|
319
|
+
if (!subUserData.flag)
|
|
320
|
+
return '订阅对象失败,请稍后重试!';
|
|
321
|
+
// 定义目标变量
|
|
322
|
+
let target = [];
|
|
323
|
+
// 判断是否使用多平台功能
|
|
324
|
+
if (options.multiplatform) {
|
|
325
|
+
// 分割字符串,赋值给target
|
|
326
|
+
target = this.splitMultiPlatformStr(options.multiplatform);
|
|
327
|
+
}
|
|
328
|
+
// 判断是否使用了多平台
|
|
329
|
+
if (target) {
|
|
330
|
+
target.forEach(async ({ channelIdArr, platform }, index) => {
|
|
331
|
+
if (channelIdArr.length > 0) { // 输入了推送群号或频道号
|
|
332
|
+
// 拿到对应的bot
|
|
333
|
+
const bot = this.getBot(ctx, platform);
|
|
334
|
+
// 判断是否配置了对应平台的机器人
|
|
335
|
+
if (!ctx.bots.some(bot => bot.platform === platform)) {
|
|
336
|
+
await session.send('您未配置对应平台的机器人,不能在该平台进行订阅操作');
|
|
310
337
|
}
|
|
338
|
+
// 判断是否需要加入的群全部推送
|
|
339
|
+
if (channelIdArr[0].channelId !== 'all') {
|
|
340
|
+
// 定义满足条件的群组数组
|
|
341
|
+
const targetArr = [];
|
|
342
|
+
// 获取机器人加入的群组
|
|
343
|
+
const guildList = await bot.getGuildList();
|
|
344
|
+
// 遍历target数组
|
|
345
|
+
for (const channelId of channelIdArr) {
|
|
346
|
+
// 定义是否加入群组标志
|
|
347
|
+
let flag = false;
|
|
348
|
+
// 遍历群组
|
|
349
|
+
for (const guild of guildList.data) {
|
|
350
|
+
// 获取频道列表
|
|
351
|
+
const channelList = await bot.getChannelList(guild.id);
|
|
352
|
+
// 判断机器人是否加入群聊或频道
|
|
353
|
+
if (channelList.data.some(channel => channel.id === channelId.channelId)) {
|
|
354
|
+
// 加入群聊或频道
|
|
355
|
+
targetArr.push(channelId);
|
|
356
|
+
// 设置标志位为true
|
|
357
|
+
flag = true;
|
|
358
|
+
// 结束循环
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (!flag) {
|
|
363
|
+
// 不满足条件发送错误提示
|
|
364
|
+
await session.send(`您的机器未加入${channelId.channelId},无法对该群或频道进行推送`);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// 判断targetArr是否为空
|
|
368
|
+
if (target.length === 0) {
|
|
369
|
+
// 为空则默认为当前环境
|
|
370
|
+
target = [{ channelIdArr: [{ channelId: session.event.channel.id, atAll: options.atAll }], platform: session.event.platform }];
|
|
371
|
+
// 没有满足条件的群组或频道
|
|
372
|
+
await session.send('没有满足条件的群组或频道,默认订阅到当前聊天环境');
|
|
373
|
+
}
|
|
374
|
+
// 将符合条件的群组添加到target中
|
|
375
|
+
target[index].channelIdArr = targetArr;
|
|
376
|
+
}
|
|
377
|
+
// 如果为all则全部推送,不需要进行处理
|
|
311
378
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
// 创建成功,保存到数据库
|
|
318
|
-
ctx.database.set('loginBili', 1, { dynamic_group_id: loginDBData.dynamic_group_id });
|
|
319
|
-
}
|
|
320
|
-
// 订阅对象
|
|
321
|
-
const subUserData = await ctx.ba.follow(mid);
|
|
322
|
-
// 判断是否订阅成功
|
|
323
|
-
switch (subUserData.code) {
|
|
324
|
-
case -101: return '账号未登录,请使用指令bili login登录后再进行订阅操作';
|
|
325
|
-
case -102: return '账号被封停,无法进行订阅操作';
|
|
326
|
-
case 22002: return '因对方隐私设置,无法进行订阅操作';
|
|
327
|
-
case 22003: return '你已将对方拉黑,无法进行订阅操作';
|
|
328
|
-
case 22013: return '账号已注销,无法进行订阅操作';
|
|
329
|
-
case 40061: return '账号不存在,请检查uid输入是否正确或用户是否存在';
|
|
330
|
-
case 22001: break; // 订阅对象为自己 无需添加到分组
|
|
331
|
-
case 22014: // 已关注订阅对象 无需再次关注
|
|
332
|
-
case 0: { // 执行订阅成功
|
|
333
|
-
// 把订阅对象添加到分组中
|
|
334
|
-
const copyUserToGroupData = await ctx.ba.copyUserToGroup(mid, loginDBData.dynamic_group_id);
|
|
335
|
-
// 判断是否添加成功
|
|
336
|
-
if (copyUserToGroupData.code !== 0) {
|
|
337
|
-
// 添加失败
|
|
338
|
-
return '添加订阅对象到分组失败,请稍后重试';
|
|
379
|
+
else {
|
|
380
|
+
// 未填写群号或频道号,默认为当前环境
|
|
381
|
+
target = [{ channelIdArr: [{ channelId: session.event.channel.id, atAll: options.atAll }], platform: session.event.platform }];
|
|
382
|
+
// 发送提示消息
|
|
383
|
+
await session.send('没有填写群号或频道号,默认订阅到当前聊天环境');
|
|
339
384
|
}
|
|
340
|
-
}
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
// 用户直接订阅,将当前环境赋值给target
|
|
389
|
+
target = [{ channelIdArr: [{ channelId: session.event.channel.id, atAll: options.atAll }], platform: session.event.platform }];
|
|
341
390
|
}
|
|
342
391
|
// 定义外围变量
|
|
343
392
|
let content;
|
|
@@ -374,90 +423,14 @@ class ComRegister {
|
|
|
374
423
|
// 返回错误信息
|
|
375
424
|
return msg;
|
|
376
425
|
}
|
|
377
|
-
// 定义目标群组id
|
|
378
|
-
let targetId;
|
|
379
|
-
// 定义目标群组id数组
|
|
380
|
-
let targetIdArr;
|
|
381
|
-
// 判断是否输入了QQ群号
|
|
382
|
-
if (guildId.length > 0) { // 输入了QQ群号
|
|
383
|
-
// 定义方法
|
|
384
|
-
const checkIfGuildHasJoined = async (bot) => {
|
|
385
|
-
// 获取机器人加入的群组
|
|
386
|
-
const guildList = await bot.getGuildList();
|
|
387
|
-
// 定义满足条件的群组数组
|
|
388
|
-
const targetArr = [];
|
|
389
|
-
// 判断群号是否符合条件
|
|
390
|
-
for (const guild of guildId) {
|
|
391
|
-
// 判断是否机器人加入了该群
|
|
392
|
-
if (guildList.data.some(cv => cv.id === guild)) { // 机器人加入了该群
|
|
393
|
-
// 保存到数组
|
|
394
|
-
targetArr.push(guild);
|
|
395
|
-
// 继续下一个循环
|
|
396
|
-
continue;
|
|
397
|
-
}
|
|
398
|
-
// 不满足条件发送错误提示
|
|
399
|
-
session.send(`您的机器未加入${guild},无法对该群进行推送`);
|
|
400
|
-
}
|
|
401
|
-
// 返回数组
|
|
402
|
-
return targetArr;
|
|
403
|
-
};
|
|
404
|
-
// 定义可用的群组数组
|
|
405
|
-
let okGuild = [];
|
|
406
|
-
// 判断是否需要加入的群全部推送
|
|
407
|
-
if (guildId[0] === 'all') {
|
|
408
|
-
// 判断是否有群机器人相关Bot
|
|
409
|
-
if (['qq', 'onebot', 'red', 'satori', 'chronocat'].includes(session.event.platform)) {
|
|
410
|
-
// 推送所有群组
|
|
411
|
-
okGuild.push('all');
|
|
412
|
-
}
|
|
413
|
-
else {
|
|
414
|
-
// 发送错误提示并返回
|
|
415
|
-
session.send('您尚未配置任何QQ群相关机器人,不能对QQ群进行操作');
|
|
416
|
-
// 直接返回
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
else {
|
|
421
|
-
// 判断是否有群机器人相关Bot
|
|
422
|
-
switch (session.event.platform) {
|
|
423
|
-
case 'qq':
|
|
424
|
-
case 'onebot':
|
|
425
|
-
case 'red':
|
|
426
|
-
case 'satori':
|
|
427
|
-
case 'chronocat': {
|
|
428
|
-
// 检查机器人是否加入该群
|
|
429
|
-
okGuild = await checkIfGuildHasJoined(this.bot);
|
|
430
|
-
break;
|
|
431
|
-
}
|
|
432
|
-
default: {
|
|
433
|
-
// 发送错误提示并返回
|
|
434
|
-
session.send('您尚未配置任何QQ群相关机器人,不能对QQ群进行操作');
|
|
435
|
-
// 直接返回
|
|
436
|
-
return;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
// 将可用的目标赋值给数组
|
|
441
|
-
targetIdArr = okGuild;
|
|
442
|
-
// 将群号用空格进行分割
|
|
443
|
-
targetId = okGuild.join(' ');
|
|
444
|
-
}
|
|
445
|
-
else { // 没有输入QQ群号
|
|
446
|
-
// 为当前群聊环境进行推送
|
|
447
|
-
targetId = session.event.channel.id;
|
|
448
|
-
// 将目标id转换为数组进行赋值
|
|
449
|
-
targetIdArr = [session.event.channel.id];
|
|
450
|
-
}
|
|
451
426
|
// 获取data
|
|
452
427
|
const { data } = content;
|
|
453
428
|
// 判断是否需要订阅直播和动态
|
|
454
|
-
const [liveMsg, dynamicMsg] = await this.checkIfNeedSub(options.live, options.dynamic, session, data);
|
|
455
|
-
console.log('Live MSG:', liveMsg);
|
|
456
|
-
console.log('Dynamic MSG:', dynamicMsg);
|
|
429
|
+
const [liveMsg, dynamicMsg] = await this.checkIfNeedSub(options.live, options.dynamic, session, data.live_room);
|
|
457
430
|
// 判断是否未订阅任何消息
|
|
458
|
-
if (!liveMsg && !dynamicMsg)
|
|
431
|
+
if (!liveMsg && !dynamicMsg)
|
|
459
432
|
return '您未订阅该UP的任何消息';
|
|
460
|
-
|
|
433
|
+
// 获取到对应的订阅对象
|
|
461
434
|
const subUser = this.subManager.find(sub => sub.uid === mid);
|
|
462
435
|
// 判断要订阅的用户是否已经存在于订阅管理对象中
|
|
463
436
|
if (subUser) {
|
|
@@ -472,43 +445,22 @@ class ComRegister {
|
|
|
472
445
|
}
|
|
473
446
|
// 获取直播房间号
|
|
474
447
|
const roomId = data.live_room?.roomid.toString();
|
|
475
|
-
// 保存到数据库中
|
|
476
|
-
const sub = await ctx.database.create('bilibili', {
|
|
477
|
-
uid: mid,
|
|
478
|
-
room_id: roomId,
|
|
479
|
-
dynamic: dynamicMsg ? 1 : 0,
|
|
480
|
-
video: 1,
|
|
481
|
-
live: liveMsg ? 1 : 0,
|
|
482
|
-
targetId,
|
|
483
|
-
platform: session.event.platform,
|
|
484
|
-
time: new Date()
|
|
485
|
-
});
|
|
486
|
-
// 订阅数+1
|
|
487
|
-
this.num++;
|
|
488
|
-
// 保存新订阅对象
|
|
489
|
-
this.subManager.push({
|
|
490
|
-
id: sub.id,
|
|
491
|
-
uid: mid,
|
|
492
|
-
targetIdArr,
|
|
493
|
-
roomId,
|
|
494
|
-
platform: session.event.platform,
|
|
495
|
-
live: liveMsg,
|
|
496
|
-
dynamic: dynamicMsg,
|
|
497
|
-
liveDispose: null
|
|
498
|
-
});
|
|
499
448
|
// 获取用户信息
|
|
500
449
|
let userData;
|
|
501
450
|
try {
|
|
502
|
-
const { data } = await ctx.ba.getMasterInfo(
|
|
451
|
+
const { data } = await ctx.ba.getMasterInfo(mid);
|
|
503
452
|
userData = data;
|
|
504
453
|
}
|
|
505
454
|
catch (e) {
|
|
506
455
|
this.logger.error('bili sub指令 getMasterInfo() 发生了错误,错误为:' + e.message);
|
|
507
456
|
return '订阅出错啦,请重试';
|
|
508
457
|
}
|
|
458
|
+
// 定义live销毁函数
|
|
459
|
+
let liveDispose;
|
|
509
460
|
// 订阅直播
|
|
510
461
|
if (liveMsg) {
|
|
511
|
-
|
|
462
|
+
// 开始循环检测
|
|
463
|
+
liveDispose = ctx.setInterval(this.liveDetect(ctx, roomId, target), config.liveLoopTime * 1000);
|
|
512
464
|
// 发送订阅消息通知
|
|
513
465
|
await session.send(`订阅${userData.info.uname}直播通知`);
|
|
514
466
|
}
|
|
@@ -517,44 +469,42 @@ class ComRegister {
|
|
|
517
469
|
// 判断是否开启动态监测
|
|
518
470
|
if (!this.dynamicDispose) {
|
|
519
471
|
// 开启动态监测
|
|
520
|
-
|
|
472
|
+
if (this.config.dynamicDebugMode) {
|
|
473
|
+
this.dynamicDispose = ctx.setInterval(this.debug_dynamicDetect(ctx), config.dynamicLoopTime * 1000);
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
this.dynamicDispose = ctx.setInterval(this.dynamicDetect(ctx), config.dynamicLoopTime * 1000);
|
|
477
|
+
}
|
|
521
478
|
}
|
|
522
479
|
// 发送订阅消息通知
|
|
523
480
|
await session.send(`订阅${userData.info.uname}动态通知`);
|
|
524
481
|
}
|
|
482
|
+
// 保存到数据库中
|
|
483
|
+
const sub = await ctx.database.create('bilibili', {
|
|
484
|
+
uid: mid,
|
|
485
|
+
room_id: roomId,
|
|
486
|
+
dynamic: dynamicMsg ? 1 : 0,
|
|
487
|
+
live: liveMsg ? 1 : 0,
|
|
488
|
+
target: JSON.stringify(target),
|
|
489
|
+
platform: session.event.platform,
|
|
490
|
+
time: new Date()
|
|
491
|
+
});
|
|
492
|
+
// 订阅数+1
|
|
493
|
+
this.num++;
|
|
494
|
+
// 保存新订阅对象
|
|
495
|
+
this.subManager.push({
|
|
496
|
+
id: sub.id,
|
|
497
|
+
uid: mid,
|
|
498
|
+
roomId,
|
|
499
|
+
target,
|
|
500
|
+
platform: session.event.platform,
|
|
501
|
+
live: liveMsg,
|
|
502
|
+
dynamic: dynamicMsg,
|
|
503
|
+
liveDispose
|
|
504
|
+
});
|
|
525
505
|
// 新增订阅展示到控制台
|
|
526
506
|
this.updateSubNotifier(ctx);
|
|
527
507
|
});
|
|
528
|
-
/* biliCom
|
|
529
|
-
.subcommand('.dynamic <uid:string> <...guildId:string>', '订阅用户动态推送', { hidden: true })
|
|
530
|
-
.usage('订阅用户动态推送')
|
|
531
|
-
.example('bili dynamic 1194210119 订阅UID为1194210119的动态')
|
|
532
|
-
.action(async () => {
|
|
533
|
-
// Log
|
|
534
|
-
this.logger.info('调用bili.dynamic指令')
|
|
535
|
-
// 开始循环检测
|
|
536
|
-
this.dynamicDispose = ctx.setInterval(this.dynamicDetect(ctx), config.dynamicLoopTime * 1000)
|
|
537
|
-
}) */
|
|
538
|
-
biliCom
|
|
539
|
-
.subcommand('.live <roomId:string> <...guildId:string>', '订阅主播开播通知', { hidden: true })
|
|
540
|
-
.usage('订阅主播开播通知')
|
|
541
|
-
.example('bili live 26316137 订阅房间号为26316137的直播间')
|
|
542
|
-
.action(async (_, roomId, ...guildId) => {
|
|
543
|
-
this.logger.info('调用bili.live指令');
|
|
544
|
-
// 如果room_id为空则返回
|
|
545
|
-
if (!roomId)
|
|
546
|
-
return `${roomId}非法调用 dynamic 指令`; // 订阅主播房间号不能为空
|
|
547
|
-
if (!guildId)
|
|
548
|
-
return `${roomId}非法调用 dynamic 指令`; // 目标群组或频道不能为空
|
|
549
|
-
// 要订阅的对象不在订阅管理对象中,直接返回
|
|
550
|
-
const index = this.subManager.findIndex(sub => sub.roomId === roomId);
|
|
551
|
-
if (index === -1)
|
|
552
|
-
return '请勿直接调用该指令';
|
|
553
|
-
// 开始循环检测
|
|
554
|
-
const dispose = ctx.setInterval(this.liveDetect(ctx, roomId, guildId), config.liveLoopTime * 1000);
|
|
555
|
-
// 保存销毁函数
|
|
556
|
-
this.subManager[index].liveDispose = dispose;
|
|
557
|
-
});
|
|
558
508
|
biliCom
|
|
559
509
|
.subcommand('.status <roomId:string>', '查询主播当前直播状态', { hidden: true })
|
|
560
510
|
.usage('查询主播当前直播状态')
|
|
@@ -598,19 +548,6 @@ class ComRegister {
|
|
|
598
548
|
// pic不存在,说明使用的是page模式
|
|
599
549
|
await session.send(koishi_1.h.image(buffer, 'image/png'));
|
|
600
550
|
});
|
|
601
|
-
biliCom
|
|
602
|
-
.subcommand('.bot', '查询当前拥有的机器人信息', { hidden: true })
|
|
603
|
-
.usage('查询当前拥有的机器人信息')
|
|
604
|
-
.example('bili bot 查询当前拥有的机器人信息')
|
|
605
|
-
.action(() => {
|
|
606
|
-
this.logger.info('开始输出BOT信息');
|
|
607
|
-
ctx.bots.forEach(bot => {
|
|
608
|
-
this.logger.info('--------------------------------');
|
|
609
|
-
this.logger.info('平台:' + bot.platform);
|
|
610
|
-
this.logger.info('名称:' + bot.user.name);
|
|
611
|
-
this.logger.info('--------------------------------');
|
|
612
|
-
});
|
|
613
|
-
});
|
|
614
551
|
biliCom
|
|
615
552
|
.subcommand('.private', '向主人账号发送一条测试消息', { hidden: true })
|
|
616
553
|
.usage('向主人账号发送一条测试消息')
|
|
@@ -622,15 +559,28 @@ class ComRegister {
|
|
|
622
559
|
await session.send('已发送消息,如未收到则说明您的机器人不支持发送私聊消息或您的信息填写有误');
|
|
623
560
|
});
|
|
624
561
|
}
|
|
562
|
+
splitMultiPlatformStr(str) {
|
|
563
|
+
return str.split(';').map(cv => cv.split('.')).map(([idStr, platform]) => {
|
|
564
|
+
const channelIdArr = idStr.split(',').map(id => {
|
|
565
|
+
const atAll = /@$/.test(id); // 使用正则表达式检查 id 是否以 @ 结尾
|
|
566
|
+
const channelId = atAll ? id.slice(0, -1) : id; // 去除末尾的 @
|
|
567
|
+
return { channelId, atAll };
|
|
568
|
+
});
|
|
569
|
+
return { channelIdArr, platform };
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
getBot(ctx, pf) {
|
|
573
|
+
return ctx.bots.find(bot => bot.platform === pf);
|
|
574
|
+
}
|
|
625
575
|
async sendPrivateMsg(content) {
|
|
626
576
|
if (this.config.master.enable) {
|
|
627
577
|
if (this.config.master.masterAccountGuildId) {
|
|
628
578
|
// 向机器人主人发送消息
|
|
629
|
-
await this.
|
|
579
|
+
await this.privateBot.sendPrivateMessage(this.config.master.masterAccount, content, this.config.master.masterAccountGuildId);
|
|
630
580
|
}
|
|
631
581
|
else {
|
|
632
582
|
// 向机器人主人发送消息
|
|
633
|
-
await this.
|
|
583
|
+
await this.privateBot.sendPrivateMessage(this.config.master.masterAccount, content);
|
|
634
584
|
}
|
|
635
585
|
}
|
|
636
586
|
}
|
|
@@ -675,25 +625,207 @@ class ComRegister {
|
|
|
675
625
|
// 结束
|
|
676
626
|
return;
|
|
677
627
|
}
|
|
678
|
-
async sendMsg(targets, content) {
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
628
|
+
async sendMsg(ctx, targets, content, live) {
|
|
629
|
+
for (const target of targets) {
|
|
630
|
+
// 获取机器人实例
|
|
631
|
+
const bot = this.getBot(ctx, target.platform);
|
|
632
|
+
// 定义需要发送的数组
|
|
633
|
+
let sendArr = [];
|
|
634
|
+
// 判断是否需要推送所有机器人加入的群
|
|
635
|
+
if (target.channelIdArr[0].channelId === 'all') {
|
|
636
|
+
// 获取所有guild
|
|
637
|
+
for (const guild of (await bot.getGuildList()).data) {
|
|
638
|
+
sendArr.push({ channelId: guild.id, atAll: target.channelIdArr[0].atAll });
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
sendArr = target.channelIdArr;
|
|
643
|
+
}
|
|
644
|
+
// 循环给每个群组发送
|
|
645
|
+
if (live) {
|
|
646
|
+
// 直播推送,需要判断是否为
|
|
647
|
+
for (const channel of sendArr) {
|
|
648
|
+
await this.sendMsgFunc(bot, channel.channelId, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [channel.atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), content] }));
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
for (const channel of sendArr) {
|
|
653
|
+
await this.sendMsgFunc(bot, channel.channelId, content);
|
|
654
|
+
}
|
|
686
655
|
}
|
|
687
|
-
}
|
|
688
|
-
else {
|
|
689
|
-
sendArr = targets;
|
|
690
|
-
}
|
|
691
|
-
// 循环给每个群组发送
|
|
692
|
-
for (const guild of sendArr) {
|
|
693
|
-
await this.sendMsgFunc(guild, content);
|
|
694
656
|
}
|
|
695
657
|
}
|
|
696
658
|
dynamicDetect(ctx) {
|
|
659
|
+
let detectSetup = true;
|
|
660
|
+
let updateBaseline;
|
|
661
|
+
// 相当于锁的作用,防止上一个循环没处理完
|
|
662
|
+
let flag = true;
|
|
663
|
+
// 返回一个闭包函数
|
|
664
|
+
return async () => {
|
|
665
|
+
// 判断上一个循环是否完成
|
|
666
|
+
if (!flag)
|
|
667
|
+
return;
|
|
668
|
+
flag = false;
|
|
669
|
+
// 无论是否执行成功都要释放锁
|
|
670
|
+
try {
|
|
671
|
+
// 检测启动初始化
|
|
672
|
+
if (detectSetup) {
|
|
673
|
+
// 获取动态信息
|
|
674
|
+
const data = await ctx.ba.getAllDynamic();
|
|
675
|
+
// 判断获取动态信息是否成功
|
|
676
|
+
if (data.code !== 0)
|
|
677
|
+
return;
|
|
678
|
+
// 设置更新基线
|
|
679
|
+
updateBaseline = data.data.update_baseline;
|
|
680
|
+
// 设置初始化为false
|
|
681
|
+
detectSetup = false;
|
|
682
|
+
// 初始化完成
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
685
|
+
// 获取用户所有动态数据
|
|
686
|
+
let updateNum;
|
|
687
|
+
let content;
|
|
688
|
+
try {
|
|
689
|
+
// 查询是否有新动态
|
|
690
|
+
const data = await ctx.ba.hasNewDynamic(updateBaseline);
|
|
691
|
+
updateNum = data.data.update_num;
|
|
692
|
+
// 没有新动态或获取动态信息失败直接返回
|
|
693
|
+
if (updateNum <= 0 || data.code !== 0)
|
|
694
|
+
return;
|
|
695
|
+
// 获取动态内容
|
|
696
|
+
content = await ctx.ba.getAllDynamic(updateBaseline);
|
|
697
|
+
}
|
|
698
|
+
catch (e) {
|
|
699
|
+
return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
|
|
700
|
+
}
|
|
701
|
+
// 判断获取动态内容是否成功
|
|
702
|
+
if (content.code !== 0) {
|
|
703
|
+
switch (content.code) {
|
|
704
|
+
case -101: { // 账号未登录
|
|
705
|
+
// 输出日志
|
|
706
|
+
this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
707
|
+
// 发送私聊消息
|
|
708
|
+
await this.sendPrivateMsg('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
709
|
+
// 停止服务
|
|
710
|
+
await ctx.sm.disposePlugin();
|
|
711
|
+
// 结束循环
|
|
712
|
+
break;
|
|
713
|
+
}
|
|
714
|
+
case -352: { // 风控
|
|
715
|
+
// 输出日志
|
|
716
|
+
this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
717
|
+
// 发送私聊消息
|
|
718
|
+
await this.sendPrivateMsg('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
719
|
+
// 停止服务
|
|
720
|
+
await ctx.sm.disposePlugin();
|
|
721
|
+
// 结束循环
|
|
722
|
+
break;
|
|
723
|
+
}
|
|
724
|
+
case 4101128:
|
|
725
|
+
case 4101129: { // 获取动态信息错误
|
|
726
|
+
// 输出日志
|
|
727
|
+
this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
|
|
728
|
+
// 发送私聊消息
|
|
729
|
+
await this.sendPrivateMsg('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
730
|
+
// 结束循环
|
|
731
|
+
break;
|
|
732
|
+
}
|
|
733
|
+
default: { // 未知错误
|
|
734
|
+
// 发送私聊消息
|
|
735
|
+
await this.sendPrivateMsg('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
736
|
+
// 结束循环
|
|
737
|
+
break;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
// 获取数据内容
|
|
742
|
+
const data = content.data;
|
|
743
|
+
// 更新基线
|
|
744
|
+
updateBaseline = data.update_baseline;
|
|
745
|
+
// 有新动态内容
|
|
746
|
+
const items = data.items;
|
|
747
|
+
// 检查更新的动态
|
|
748
|
+
for (let num = updateNum - 1; num >= 0; num--) {
|
|
749
|
+
// 没有动态内容则直接跳过
|
|
750
|
+
if (!items[num])
|
|
751
|
+
continue;
|
|
752
|
+
// 从动态数据中取出UP主名称、UID和动态ID
|
|
753
|
+
const upUID = items[num].modules.module_author.mid;
|
|
754
|
+
// 寻找关注的UP主的动态
|
|
755
|
+
this.subManager.forEach(async (sub) => {
|
|
756
|
+
// 判断是否是订阅的UP主
|
|
757
|
+
if (sub.uid == upUID) {
|
|
758
|
+
// 订阅该UP主,推送该动态
|
|
759
|
+
// 定义变量
|
|
760
|
+
let pic;
|
|
761
|
+
let buffer;
|
|
762
|
+
// 从动态数据中取出UP主名称和动态ID
|
|
763
|
+
const upName = content.data.items[num].modules.module_author.name;
|
|
764
|
+
const dynamicId = content.data.items[num].id_str;
|
|
765
|
+
// 推送该条动态
|
|
766
|
+
const attempts = 3;
|
|
767
|
+
for (let i = 0; i < attempts; i++) {
|
|
768
|
+
// 获取动态推送图片
|
|
769
|
+
try {
|
|
770
|
+
// 渲染图片
|
|
771
|
+
const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
|
|
772
|
+
// 赋值
|
|
773
|
+
pic = gimgPic;
|
|
774
|
+
buffer = gimgBuffer;
|
|
775
|
+
// 成功则跳出循环
|
|
776
|
+
break;
|
|
777
|
+
}
|
|
778
|
+
catch (e) {
|
|
779
|
+
// 直播开播动态,不做处理
|
|
780
|
+
if (e.message === '直播开播动态,不做处理')
|
|
781
|
+
return;
|
|
782
|
+
if (e.message === '出现关键词,屏蔽该动态') {
|
|
783
|
+
// 如果需要发送才发送
|
|
784
|
+
if (this.config.filter.notify) {
|
|
785
|
+
await this.sendMsg(ctx, sub.target, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
786
|
+
}
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
if (e.message === '已屏蔽转发动态') {
|
|
790
|
+
if (this.config.filter.notify) {
|
|
791
|
+
await this.sendMsg(ctx, sub.target, `${upName}发布了一条转发动态,已屏蔽`);
|
|
792
|
+
}
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
// 未知错误
|
|
796
|
+
if (i === attempts - 1) {
|
|
797
|
+
this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
|
|
798
|
+
// 发送私聊消息并重启服务
|
|
799
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
// 判断是否需要发送URL
|
|
804
|
+
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
805
|
+
// 如果pic存在,则直接返回pic
|
|
806
|
+
if (pic) {
|
|
807
|
+
this.logger.info('推送动态中,使用render模式');
|
|
808
|
+
// pic存在,使用的是render模式
|
|
809
|
+
await this.sendMsg(ctx, sub.target, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
810
|
+
}
|
|
811
|
+
else if (buffer) {
|
|
812
|
+
this.logger.info('推送动态中,使用page模式');
|
|
813
|
+
// pic不存在,说明使用的是page模式
|
|
814
|
+
await this.sendMsg(ctx, sub.target, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
815
|
+
}
|
|
816
|
+
else {
|
|
817
|
+
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
finally {
|
|
824
|
+
flag = true;
|
|
825
|
+
}
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
debug_dynamicDetect(ctx) {
|
|
697
829
|
let detectSetup = true;
|
|
698
830
|
let updateBaseline;
|
|
699
831
|
// 相当于锁的作用,防止上一个循环没处理完
|
|
@@ -834,13 +966,13 @@ class ComRegister {
|
|
|
834
966
|
if (e.message === '出现关键词,屏蔽该动态') {
|
|
835
967
|
// 如果需要发送才发送
|
|
836
968
|
if (this.config.filter.notify) {
|
|
837
|
-
await this.sendMsg(sub.
|
|
969
|
+
await this.sendMsg(ctx, sub.target, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
838
970
|
}
|
|
839
971
|
return;
|
|
840
972
|
}
|
|
841
973
|
if (e.message === '已屏蔽转发动态') {
|
|
842
974
|
if (this.config.filter.notify) {
|
|
843
|
-
await this.sendMsg(sub.
|
|
975
|
+
await this.sendMsg(ctx, sub.target, `${upName}发布了一条转发动态,已屏蔽`);
|
|
844
976
|
}
|
|
845
977
|
return;
|
|
846
978
|
}
|
|
@@ -858,12 +990,12 @@ class ComRegister {
|
|
|
858
990
|
if (pic) {
|
|
859
991
|
this.logger.info('推送动态中,使用render模式');
|
|
860
992
|
// pic存在,使用的是render模式
|
|
861
|
-
await this.sendMsg(sub.
|
|
993
|
+
await this.sendMsg(ctx, sub.target, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
862
994
|
}
|
|
863
995
|
else if (buffer) {
|
|
864
996
|
this.logger.info('推送动态中,使用page模式');
|
|
865
997
|
// pic不存在,说明使用的是page模式
|
|
866
|
-
await this.sendMsg(sub.
|
|
998
|
+
await this.sendMsg(ctx, sub.target, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
867
999
|
}
|
|
868
1000
|
else {
|
|
869
1001
|
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
@@ -877,7 +1009,7 @@ class ComRegister {
|
|
|
877
1009
|
}
|
|
878
1010
|
};
|
|
879
1011
|
}
|
|
880
|
-
liveDetect(ctx, roomId,
|
|
1012
|
+
liveDetect(ctx, roomId, target) {
|
|
881
1013
|
let firstSubscription = true;
|
|
882
1014
|
let timer = 0;
|
|
883
1015
|
let open = false;
|
|
@@ -887,80 +1019,40 @@ class ComRegister {
|
|
|
887
1019
|
// 相当于锁的作用,防止上一个循环没处理完
|
|
888
1020
|
let flag = true;
|
|
889
1021
|
// 定义发送直播通知卡片方法
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
buffer = bufferv;
|
|
906
|
-
// 成功则跳出循环
|
|
907
|
-
break;
|
|
908
|
-
}
|
|
909
|
-
catch (e) {
|
|
910
|
-
if (i === attempts - 1) { // 已尝试三次
|
|
911
|
-
this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
|
|
912
|
-
// 发送私聊消息并重启服务
|
|
913
|
-
return await this.sendPrivateMsgAndStopService(ctx);
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
// 推送直播信息
|
|
918
|
-
// pic 存在,使用的是render模式
|
|
919
|
-
if (pic) {
|
|
920
|
-
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}` : ''] });
|
|
921
|
-
return await this.sendMsg(guildId, pic + msg);
|
|
1022
|
+
const sendLiveNotifyCard = async (data, liveType, liveNotifyMsg) => {
|
|
1023
|
+
// 定义变量
|
|
1024
|
+
let pic;
|
|
1025
|
+
let buffer;
|
|
1026
|
+
// 多次尝试生成图片
|
|
1027
|
+
const attempts = 3;
|
|
1028
|
+
for (let i = 0; i < attempts; i++) {
|
|
1029
|
+
try {
|
|
1030
|
+
// 获取直播通知卡片
|
|
1031
|
+
const { pic: picv, buffer: bufferv } = await ctx.gi.generateLiveImg(data, username, userface, liveType);
|
|
1032
|
+
// 赋值
|
|
1033
|
+
pic = picv;
|
|
1034
|
+
buffer = bufferv;
|
|
1035
|
+
// 成功则跳出循环
|
|
1036
|
+
break;
|
|
922
1037
|
}
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
else {
|
|
929
|
-
sendLiveNotifyCard = async (data, liveType, liveStartMsg, atAll) => {
|
|
930
|
-
// 定义变量
|
|
931
|
-
let pic;
|
|
932
|
-
let buffer;
|
|
933
|
-
// 多次尝试生成图片
|
|
934
|
-
const attempts = 3;
|
|
935
|
-
for (let i = 0; i < attempts; i++) {
|
|
936
|
-
try {
|
|
937
|
-
// 获取直播通知卡片
|
|
938
|
-
const { pic: picv, buffer: bufferv } = await ctx.gi.generateLiveImg(data, username, userface, liveType);
|
|
939
|
-
// 赋值
|
|
940
|
-
pic = picv;
|
|
941
|
-
buffer = bufferv;
|
|
942
|
-
// 成功则跳出循环
|
|
943
|
-
break;
|
|
944
|
-
}
|
|
945
|
-
catch (e) {
|
|
946
|
-
if (i === attempts - 1) { // 已尝试三次
|
|
947
|
-
this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
|
|
948
|
-
// 发送私聊消息并重启服务
|
|
949
|
-
return await this.sendPrivateMsgAndStopService(ctx);
|
|
950
|
-
}
|
|
1038
|
+
catch (e) {
|
|
1039
|
+
if (i === attempts - 1) { // 已尝试三次
|
|
1040
|
+
this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
|
|
1041
|
+
// 发送私聊消息并重启服务
|
|
1042
|
+
return await this.sendPrivateMsgAndStopService(ctx);
|
|
951
1043
|
}
|
|
952
1044
|
}
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
}
|
|
1045
|
+
}
|
|
1046
|
+
// 推送直播信息
|
|
1047
|
+
// pic 存在,使用的是render模式
|
|
1048
|
+
if (pic) {
|
|
1049
|
+
const msg = (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: liveNotifyMsg && liveNotifyMsg });
|
|
1050
|
+
return await this.sendMsg(ctx, target, pic + msg, true);
|
|
1051
|
+
}
|
|
1052
|
+
// pic不存在,说明使用的是page模式
|
|
1053
|
+
const msg = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), liveNotifyMsg && liveNotifyMsg] });
|
|
1054
|
+
await this.sendMsg(ctx, target, msg, true);
|
|
1055
|
+
};
|
|
964
1056
|
// 定义获取主播信息方法
|
|
965
1057
|
let useMasterInfo;
|
|
966
1058
|
if (this.config.changeMasterInfoApi) {
|
|
@@ -1048,22 +1140,10 @@ class ComRegister {
|
|
|
1048
1140
|
const liveEndMsg = this.config.customLiveEnd
|
|
1049
1141
|
.replace('-name', username)
|
|
1050
1142
|
.replace('-time', await ctx.gi.getTimeDifference(liveTime));
|
|
1051
|
-
//
|
|
1052
|
-
|
|
1053
|
-
//
|
|
1054
|
-
|
|
1055
|
-
resizedImage = await jimp_1.Jimp.read(userface).then(async (image) => {
|
|
1056
|
-
return await image.resize({ w: 100, h: 100 }).getBuffer(jimp_1.JimpMime.png);
|
|
1057
|
-
});
|
|
1058
|
-
}
|
|
1059
|
-
catch (e) {
|
|
1060
|
-
if (e.message === 'Unsupported MIME type: image/webp')
|
|
1061
|
-
console.log('主播使用的是webp格式头像,无法进行渲染');
|
|
1062
|
-
else
|
|
1063
|
-
console.log(e);
|
|
1064
|
-
}
|
|
1065
|
-
// 发送下播通知
|
|
1066
|
-
await this.sendMsg(guildId, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [resizedImage && koishi_1.h.image(resizedImage, 'image/png'), " ", liveEndMsg] }));
|
|
1143
|
+
// 更改直播时长
|
|
1144
|
+
data.live_time = liveTime;
|
|
1145
|
+
// 发送@全体成员通知
|
|
1146
|
+
await sendLiveNotifyCard(data, LiveType.StopBroadcast, liveEndMsg);
|
|
1067
1147
|
}
|
|
1068
1148
|
// 未进循环,还未开播,继续循环
|
|
1069
1149
|
break;
|
|
@@ -1097,15 +1177,8 @@ class ComRegister {
|
|
|
1097
1177
|
.replace('-name', username)
|
|
1098
1178
|
.replace('-time', await ctx.gi.getTimeDifference(liveTime))
|
|
1099
1179
|
.replace('-link', `https://live.bilibili.com/${data.short_id === 0 ? data.room_id : data.short_id}`);
|
|
1100
|
-
//
|
|
1101
|
-
|
|
1102
|
-
// 发送@全体成员通知
|
|
1103
|
-
await sendLiveNotifyCard(data, LiveType.StartBroadcasting, liveStartMsg, true);
|
|
1104
|
-
}
|
|
1105
|
-
else {
|
|
1106
|
-
// 发送直播通知卡片
|
|
1107
|
-
await sendLiveNotifyCard(data, LiveType.StartBroadcasting, liveStartMsg);
|
|
1108
|
-
}
|
|
1180
|
+
// 发送消息
|
|
1181
|
+
await sendLiveNotifyCard(data, LiveType.StartBroadcasting, liveStartMsg);
|
|
1109
1182
|
}
|
|
1110
1183
|
else { // 还在直播
|
|
1111
1184
|
if (this.config.pushTime > 0) {
|
|
@@ -1114,8 +1187,13 @@ class ComRegister {
|
|
|
1114
1187
|
if (timer >= (6 * 60 * this.config.pushTime)) { // 到时间推送直播消息
|
|
1115
1188
|
// 到时间重新计时
|
|
1116
1189
|
timer = 0;
|
|
1190
|
+
// 定义直播中通知消息
|
|
1191
|
+
const liveMsg = this.config.customLive ? this.config.customLive
|
|
1192
|
+
.replace('-name', username)
|
|
1193
|
+
.replace('-time', await ctx.gi.getTimeDifference(liveTime))
|
|
1194
|
+
.replace('-link', `https://live.bilibili.com/${data.short_id === 0 ? data.room_id : data.short_id}`) : '';
|
|
1117
1195
|
// 发送直播通知卡片
|
|
1118
|
-
sendLiveNotifyCard(data, LiveType.LiveBroadcast);
|
|
1196
|
+
sendLiveNotifyCard(data, LiveType.LiveBroadcast, liveMsg);
|
|
1119
1197
|
}
|
|
1120
1198
|
}
|
|
1121
1199
|
// 否则继续循环
|
|
@@ -1137,19 +1215,25 @@ class ComRegister {
|
|
|
1137
1215
|
});
|
|
1138
1216
|
return table ? table : '没有订阅任何UP';
|
|
1139
1217
|
}
|
|
1140
|
-
async checkIfNeedSub(liveSub, dynamicSub, session,
|
|
1218
|
+
async checkIfNeedSub(liveSub, dynamicSub, session, liveRoomData) {
|
|
1141
1219
|
// 定义方法:用户直播间是否存在
|
|
1142
1220
|
const liveRoom = async () => {
|
|
1143
|
-
if (!
|
|
1221
|
+
if (!liveRoomData) {
|
|
1144
1222
|
// 未开通直播间
|
|
1145
1223
|
await session.send('该用户未开通直播间,无法订阅直播');
|
|
1146
1224
|
// 返回false
|
|
1147
|
-
return
|
|
1225
|
+
return true;
|
|
1148
1226
|
}
|
|
1227
|
+
return false;
|
|
1149
1228
|
};
|
|
1150
1229
|
// 如果两者都为true或者都为false则直接返回
|
|
1151
|
-
if ((liveSub && dynamicSub) || (!liveSub && !dynamicSub))
|
|
1230
|
+
if ((liveSub && dynamicSub) || (!liveSub && !dynamicSub)) {
|
|
1231
|
+
// 判断是否存在直播间
|
|
1232
|
+
if (await liveRoom())
|
|
1233
|
+
return [false, true];
|
|
1234
|
+
// 返回
|
|
1152
1235
|
return [true, true];
|
|
1236
|
+
}
|
|
1153
1237
|
// 如果只订阅直播
|
|
1154
1238
|
if (liveSub) {
|
|
1155
1239
|
// 判断是否存在直播间
|
|
@@ -1195,6 +1279,97 @@ class ComRegister {
|
|
|
1195
1279
|
check();
|
|
1196
1280
|
});
|
|
1197
1281
|
}
|
|
1282
|
+
async subUserInBili(ctx, mid) {
|
|
1283
|
+
// 获取关注分组信息
|
|
1284
|
+
const checkGroupIsReady = async () => {
|
|
1285
|
+
// 判断是否有数据
|
|
1286
|
+
if (this.loginDBData.dynamic_group_id === '' || this.loginDBData.dynamic_group_id === null) {
|
|
1287
|
+
// 没有数据,没有创建分组,尝试创建分组
|
|
1288
|
+
const createGroupData = await ctx.ba.createGroup("订阅");
|
|
1289
|
+
// 如果分组已创建,则获取分组id
|
|
1290
|
+
if (createGroupData.code === 22106) {
|
|
1291
|
+
// 分组已存在,拿到之前的分组id
|
|
1292
|
+
const allGroupData = await ctx.ba.getAllGroup();
|
|
1293
|
+
// 遍历所有分组
|
|
1294
|
+
for (const group of allGroupData.data) {
|
|
1295
|
+
// 找到订阅分组
|
|
1296
|
+
if (group.name === '订阅') {
|
|
1297
|
+
// 拿到分组id
|
|
1298
|
+
this.loginDBData.dynamic_group_id = group.tagid;
|
|
1299
|
+
// 结束循环
|
|
1300
|
+
break;
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
else if (createGroupData.code !== 0) {
|
|
1305
|
+
console.log(createGroupData);
|
|
1306
|
+
// 创建分组失败
|
|
1307
|
+
return false;
|
|
1308
|
+
}
|
|
1309
|
+
// 创建成功,保存到数据库
|
|
1310
|
+
ctx.database.set('loginBili', 1, { dynamic_group_id: this.loginDBData.dynamic_group_id });
|
|
1311
|
+
// 创建成功
|
|
1312
|
+
return true;
|
|
1313
|
+
}
|
|
1314
|
+
return true;
|
|
1315
|
+
};
|
|
1316
|
+
// 判断分组是否准备好
|
|
1317
|
+
const flag = await checkGroupIsReady();
|
|
1318
|
+
// 判断是否创建成功
|
|
1319
|
+
if (!flag) {
|
|
1320
|
+
// 创建分组失败
|
|
1321
|
+
return { flag: false, msg: '创建分组失败,请尝试重启插件' };
|
|
1322
|
+
}
|
|
1323
|
+
// 获取分组明细
|
|
1324
|
+
const relationGroupDetailData = await ctx.ba.getRelationGroupDetail(this.loginDBData.dynamic_group_id);
|
|
1325
|
+
// 判断分组信息是否获取成功
|
|
1326
|
+
if (relationGroupDetailData.code !== 0) {
|
|
1327
|
+
if (relationGroupDetailData.code === 22104) {
|
|
1328
|
+
// 将原先的分组id置空
|
|
1329
|
+
this.loginDBData.dynamic_group_id = null;
|
|
1330
|
+
// 分组不存在
|
|
1331
|
+
const flag = await checkGroupIsReady();
|
|
1332
|
+
// 判断是否创建成功
|
|
1333
|
+
if (!flag) {
|
|
1334
|
+
// 创建分组失败
|
|
1335
|
+
return { flag: false, msg: '创建分组失败,请尝试重启插件' };
|
|
1336
|
+
}
|
|
1337
|
+
return { flag: true, msg: '分组不存在,已重新创建分组' };
|
|
1338
|
+
}
|
|
1339
|
+
// 获取分组明细失败
|
|
1340
|
+
return { flag: false, msg: '获取分组明细失败' };
|
|
1341
|
+
}
|
|
1342
|
+
relationGroupDetailData.data.forEach(user => {
|
|
1343
|
+
if (user.mid === mid) {
|
|
1344
|
+
// 已关注订阅对象
|
|
1345
|
+
return { flag: true, msg: '订阅对象已存在于分组中' };
|
|
1346
|
+
}
|
|
1347
|
+
});
|
|
1348
|
+
// 订阅对象
|
|
1349
|
+
const subUserData = await ctx.ba.follow(mid);
|
|
1350
|
+
// 判断是否订阅成功
|
|
1351
|
+
switch (subUserData.code) {
|
|
1352
|
+
case -101: return { flag: false, msg: '账号未登录,请使用指令bili login登录后再进行订阅操作' };
|
|
1353
|
+
case -102: return { flag: false, msg: '账号被封停,无法进行订阅操作' };
|
|
1354
|
+
case 22002: return { flag: false, msg: '因对方隐私设置,无法进行订阅操作' };
|
|
1355
|
+
case 22003: return { flag: false, msg: '你已将对方拉黑,无法进行订阅操作' };
|
|
1356
|
+
case 22013: return { flag: false, msg: '账号已注销,无法进行订阅操作' };
|
|
1357
|
+
case 40061: return { flag: false, msg: '账号不存在,请检查uid输入是否正确或用户是否存在' };
|
|
1358
|
+
case 22001: break; // 订阅对象为自己 无需添加到分组
|
|
1359
|
+
case 22014: // 已关注订阅对象 无需再次关注
|
|
1360
|
+
case 0: { // 执行订阅成功
|
|
1361
|
+
// 把订阅对象添加到分组中
|
|
1362
|
+
const copyUserToGroupData = await ctx.ba.copyUserToGroup(mid, this.loginDBData.dynamic_group_id);
|
|
1363
|
+
// 判断是否添加成功
|
|
1364
|
+
if (copyUserToGroupData.code !== 0) {
|
|
1365
|
+
// 添加失败
|
|
1366
|
+
return { flag: false, msg: '添加订阅对象到分组失败,请稍后重试' };
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
// 订阅成功
|
|
1371
|
+
return { flag: true, msg: '用户订阅成功' };
|
|
1372
|
+
}
|
|
1198
1373
|
async getSubFromDatabase(ctx) {
|
|
1199
1374
|
// 判断登录信息是否已加载完毕
|
|
1200
1375
|
await this.checkIfLoginInfoIsLoaded(ctx);
|
|
@@ -1209,6 +1384,8 @@ class ComRegister {
|
|
|
1209
1384
|
return;
|
|
1210
1385
|
// 从数据库中获取数据
|
|
1211
1386
|
const subData = await ctx.database.get('bilibili', { id: { $gt: 0 } });
|
|
1387
|
+
// 定义变量:订阅直播数
|
|
1388
|
+
let liveSubNum = 0;
|
|
1212
1389
|
// 循环遍历
|
|
1213
1390
|
for (const sub of subData) {
|
|
1214
1391
|
// 判断是否存在没有任何订阅的数据
|
|
@@ -1220,8 +1397,21 @@ class ComRegister {
|
|
|
1220
1397
|
// 跳过下面的步骤
|
|
1221
1398
|
continue;
|
|
1222
1399
|
}
|
|
1400
|
+
// 判断用户是否在B站中订阅了
|
|
1401
|
+
const subUserData = await this.subUserInBili(ctx, sub.uid);
|
|
1402
|
+
// 判断是否订阅
|
|
1403
|
+
if (!subUserData.flag) {
|
|
1404
|
+
// log
|
|
1405
|
+
this.logger.warn(`UID:${sub.uid} ${subUserData.msg},自动取消订阅`);
|
|
1406
|
+
// 发送私聊消息
|
|
1407
|
+
await this.sendPrivateMsg(`UID:${sub.uid} ${subUserData.msg},自动取消订阅`);
|
|
1408
|
+
// 删除该条数据
|
|
1409
|
+
await ctx.database.remove('bilibili', { id: sub.id });
|
|
1410
|
+
// 跳过下面的步骤
|
|
1411
|
+
continue;
|
|
1412
|
+
}
|
|
1223
1413
|
// 获取推送目标数组
|
|
1224
|
-
const
|
|
1414
|
+
const target = JSON.parse(sub.target);
|
|
1225
1415
|
/* 判断数据库是否被篡改 */
|
|
1226
1416
|
// 获取用户信息
|
|
1227
1417
|
let content;
|
|
@@ -1271,7 +1461,7 @@ class ComRegister {
|
|
|
1271
1461
|
}
|
|
1272
1462
|
}
|
|
1273
1463
|
// 检测房间号是否被篡改
|
|
1274
|
-
if (sub.live && (!data.live_room || data.live_room.roomid
|
|
1464
|
+
if (sub.live && (!data.live_room || data.live_room.roomid != sub.room_id)) {
|
|
1275
1465
|
// 房间号被篡改,删除该订阅
|
|
1276
1466
|
await deleteSub();
|
|
1277
1467
|
// log
|
|
@@ -1285,17 +1475,30 @@ class ComRegister {
|
|
|
1285
1475
|
id: sub.id,
|
|
1286
1476
|
uid: sub.uid,
|
|
1287
1477
|
roomId: sub.room_id,
|
|
1288
|
-
|
|
1478
|
+
target,
|
|
1289
1479
|
platform: sub.platform,
|
|
1290
|
-
live:
|
|
1291
|
-
dynamic:
|
|
1480
|
+
live: sub.live === 1 ? true : false,
|
|
1481
|
+
dynamic: sub.dynamic === 1 ? true : false,
|
|
1292
1482
|
liveDispose: null
|
|
1293
1483
|
};
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1484
|
+
// 判断是否订阅直播
|
|
1485
|
+
if (sub.live) {
|
|
1486
|
+
// 判断订阅直播数是否超过限制
|
|
1487
|
+
if (!this.config.unlockSubLimits && liveSubNum >= 3) {
|
|
1488
|
+
subManagerItem.live = false;
|
|
1489
|
+
// log
|
|
1490
|
+
this.logger.warn(`UID:${sub.uid} 订阅直播数超过限制,自动取消订阅`);
|
|
1491
|
+
// 发送错误消息
|
|
1492
|
+
this.sendPrivateMsg(`UID:${sub.uid} 订阅直播数超过限制,自动取消订阅`);
|
|
1493
|
+
}
|
|
1494
|
+
else {
|
|
1495
|
+
// 直播订阅数+1
|
|
1496
|
+
liveSubNum++;
|
|
1497
|
+
// 订阅直播,开始循环检测
|
|
1498
|
+
const dispose = ctx.setInterval(this.liveDetect(ctx, sub.room_id, target), this.config.liveLoopTime * 1000);
|
|
1499
|
+
// 保存销毁函数
|
|
1500
|
+
subManagerItem.liveDispose = dispose;
|
|
1501
|
+
}
|
|
1299
1502
|
}
|
|
1300
1503
|
// 保存新订阅对象
|
|
1301
1504
|
this.subManager.push(subManagerItem);
|
|
@@ -1303,7 +1506,12 @@ class ComRegister {
|
|
|
1303
1506
|
// 检查是否有订阅对象需要动态监测
|
|
1304
1507
|
if (this.subManager.some(sub => sub.dynamic)) {
|
|
1305
1508
|
// 开始动态监测
|
|
1306
|
-
|
|
1509
|
+
if (this.config.dynamicDebugMode) {
|
|
1510
|
+
this.dynamicDispose = ctx.setInterval(this.debug_dynamicDetect(ctx), 10000);
|
|
1511
|
+
}
|
|
1512
|
+
else {
|
|
1513
|
+
this.dynamicDispose = ctx.setInterval(this.dynamicDetect(ctx), 10000 /* this.config.dynamicLoopTime * 1000 */);
|
|
1514
|
+
}
|
|
1307
1515
|
}
|
|
1308
1516
|
// 在控制台中显示订阅对象
|
|
1309
1517
|
this.updateSubNotifier(ctx);
|
|
@@ -1322,7 +1530,7 @@ class ComRegister {
|
|
|
1322
1530
|
// num--
|
|
1323
1531
|
this.num--;
|
|
1324
1532
|
// 判断是否还存在订阅了动态的对象,不存在则停止动态监测
|
|
1325
|
-
this.
|
|
1533
|
+
this.checkIfUserIsTheLastOneWhoSubDyn();
|
|
1326
1534
|
};
|
|
1327
1535
|
try {
|
|
1328
1536
|
switch (type) {
|
|
@@ -1367,7 +1575,7 @@ class ComRegister {
|
|
|
1367
1575
|
// 取消订阅
|
|
1368
1576
|
this.subManager[index].dynamic = false;
|
|
1369
1577
|
// 判断是否还存在订阅了动态的对象,不存在则停止动态监测
|
|
1370
|
-
this.
|
|
1578
|
+
this.checkIfUserIsTheLastOneWhoSubDyn();
|
|
1371
1579
|
// 如果没有对这个UP的任何订阅,则移除
|
|
1372
1580
|
if (checkIfNoSubExist(sub)) {
|
|
1373
1581
|
// 从管理对象中移除
|
|
@@ -1388,7 +1596,7 @@ class ComRegister {
|
|
|
1388
1596
|
this.updateSubNotifier(ctx);
|
|
1389
1597
|
}
|
|
1390
1598
|
}
|
|
1391
|
-
|
|
1599
|
+
checkIfUserIsTheLastOneWhoSubDyn() {
|
|
1392
1600
|
if (this.subManager.some(sub => sub.dynamic)) {
|
|
1393
1601
|
// 停止动态监测
|
|
1394
1602
|
this.dynamicDispose();
|
|
@@ -1401,7 +1609,7 @@ class ComRegister {
|
|
|
1401
1609
|
if (sub.live)
|
|
1402
1610
|
await this.subManager[i].liveDispose();
|
|
1403
1611
|
// 判断是否还存在订阅了动态的对象,不存在则停止动态监测
|
|
1404
|
-
this.
|
|
1612
|
+
this.checkIfUserIsTheLastOneWhoSubDyn();
|
|
1405
1613
|
// 从数据库中删除订阅
|
|
1406
1614
|
await ctx.database.remove('bilibili', { uid: this.subManager[i].uid });
|
|
1407
1615
|
// 将该订阅对象从订阅管理对象中移除
|
|
@@ -1426,21 +1634,20 @@ class ComRegister {
|
|
|
1426
1634
|
}
|
|
1427
1635
|
(function (ComRegister) {
|
|
1428
1636
|
ComRegister.Config = koishi_1.Schema.object({
|
|
1429
|
-
platform: koishi_1.Schema.string(),
|
|
1430
1637
|
master: koishi_1.Schema.object({
|
|
1431
1638
|
enable: koishi_1.Schema.boolean(),
|
|
1639
|
+
platform: koishi_1.Schema.string(),
|
|
1432
1640
|
masterAccount: koishi_1.Schema.string(),
|
|
1433
1641
|
masterAccountGuildId: koishi_1.Schema.string()
|
|
1434
1642
|
}),
|
|
1435
1643
|
unlockSubLimits: koishi_1.Schema.boolean().required(),
|
|
1436
1644
|
automaticResend: koishi_1.Schema.boolean().required(),
|
|
1437
1645
|
changeMasterInfoApi: koishi_1.Schema.boolean().required(),
|
|
1438
|
-
liveStartAtAll: koishi_1.Schema.boolean().required(),
|
|
1439
1646
|
restartPush: koishi_1.Schema.boolean().required(),
|
|
1440
|
-
pushUrl: koishi_1.Schema.boolean().required(),
|
|
1441
1647
|
pushTime: koishi_1.Schema.number().required(),
|
|
1442
1648
|
liveLoopTime: koishi_1.Schema.number().default(10),
|
|
1443
1649
|
customLiveStart: koishi_1.Schema.string().required(),
|
|
1650
|
+
customLive: koishi_1.Schema.string(),
|
|
1444
1651
|
customLiveEnd: koishi_1.Schema.string().required(),
|
|
1445
1652
|
dynamicUrl: koishi_1.Schema.boolean().required(),
|
|
1446
1653
|
dynamicLoopTime: koishi_1.Schema.number().default(60),
|