koishi-plugin-bilibili-notify 3.0.0-alpha.23 → 3.0.0-alpha.25
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/comRegister.d.ts +2 -2
- package/lib/comRegister.js +381 -438
- package/lib/generateImg.d.ts +2 -0
- package/lib/generateImg.js +11 -9
- package/lib/index.d.ts +14 -0
- package/lib/index.js +27 -28
- package/package.json +1 -1
- package/readme.md +2 -0
package/lib/comRegister.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ declare class ComRegister {
|
|
|
26
26
|
sendPrivateMsgAndRebootService(): Promise<void>;
|
|
27
27
|
sendPrivateMsgAndStopService(): Promise<void>;
|
|
28
28
|
sendMsg(targets: Target, content: any, live?: boolean): Promise<void>;
|
|
29
|
-
dynamicDetect(): () =>
|
|
30
|
-
debug_dynamicDetect(): () =>
|
|
29
|
+
dynamicDetect(): (...args: any[]) => void;
|
|
30
|
+
debug_dynamicDetect(): (...args: any[]) => void;
|
|
31
31
|
sendLiveNotifyCard(info: {
|
|
32
32
|
username: string;
|
|
33
33
|
userface: string;
|
package/lib/comRegister.js
CHANGED
|
@@ -226,24 +226,31 @@ class ComRegister {
|
|
|
226
226
|
for (const sub of this.subManager) {
|
|
227
227
|
// 定义开播标志位
|
|
228
228
|
let onLive = false;
|
|
229
|
-
//
|
|
230
|
-
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
//
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
229
|
+
// 判断items是否存在
|
|
230
|
+
if (live_users.items) {
|
|
231
|
+
// 遍历liveUsers
|
|
232
|
+
for (const user of live_users.items) {
|
|
233
|
+
// 判断是否是订阅直播的UP
|
|
234
|
+
if (user.mid.toString() === sub.uid && sub.live) {
|
|
235
|
+
// 设置标志位为true
|
|
236
|
+
onLive = true;
|
|
237
|
+
// break
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
237
240
|
}
|
|
238
241
|
}
|
|
239
242
|
// 判断是否未开播
|
|
240
|
-
subLiveUsers.push({
|
|
243
|
+
subLiveUsers.push({
|
|
244
|
+
uid: Number.parseInt(sub.uid),
|
|
245
|
+
uname: sub.uname,
|
|
246
|
+
onLive,
|
|
247
|
+
});
|
|
241
248
|
}
|
|
242
249
|
// 定义table字符串
|
|
243
250
|
let table = "";
|
|
244
251
|
// 遍历liveUsers
|
|
245
252
|
for (const user of subLiveUsers) {
|
|
246
|
-
table += `[UID:${user.uid}] 「${user.uname}」 ${user.onLive ?
|
|
253
|
+
table += `[UID:${user.uid}] 「${user.uname}」 ${user.onLive ? "正在直播" : "未开播"}\n`;
|
|
247
254
|
}
|
|
248
255
|
return table;
|
|
249
256
|
});
|
|
@@ -252,7 +259,7 @@ class ComRegister {
|
|
|
252
259
|
// 设置logger
|
|
253
260
|
this.logger = this.ctx.logger("cr");
|
|
254
261
|
// logger
|
|
255
|
-
this.logger.info("
|
|
262
|
+
this.logger.info("初始化插件中...");
|
|
256
263
|
// 将config设置给类属性
|
|
257
264
|
this.config = config;
|
|
258
265
|
// 拿到私人机器人实例
|
|
@@ -290,11 +297,7 @@ class ComRegister {
|
|
|
290
297
|
bot, channelId,
|
|
291
298
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
292
299
|
content) => {
|
|
293
|
-
|
|
294
|
-
// 发送消息
|
|
295
|
-
await bot.sendMessage(channelId, content);
|
|
296
|
-
}
|
|
297
|
-
catch (e) {
|
|
300
|
+
(0, utils_1.withRetry)(async () => await bot.sendMessage(channelId, content), 0).catch(async (e) => {
|
|
298
301
|
if (e.message === "this._request is not a function") {
|
|
299
302
|
// 2S之后重新发送消息
|
|
300
303
|
this.ctx.setTimeout(async () => {
|
|
@@ -306,7 +309,7 @@ class ComRegister {
|
|
|
306
309
|
// 打印错误信息
|
|
307
310
|
this.logger.error(`发送群组ID:${channelId}消息失败!原因: ${e.message}`);
|
|
308
311
|
await this.sendPrivateMsg(`发送群组ID:${channelId}消息失败,请查看日志`);
|
|
309
|
-
}
|
|
312
|
+
});
|
|
310
313
|
};
|
|
311
314
|
}
|
|
312
315
|
// 检查登录数据库是否有数据
|
|
@@ -326,7 +329,7 @@ class ComRegister {
|
|
|
326
329
|
// 在控制台中显示订阅对象
|
|
327
330
|
this.updateSubNotifier();
|
|
328
331
|
// logger
|
|
329
|
-
this.logger.info("
|
|
332
|
+
this.logger.info("插件初始化完毕!");
|
|
330
333
|
}
|
|
331
334
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
332
335
|
getBot(pf) {
|
|
@@ -475,190 +478,174 @@ class ComRegister {
|
|
|
475
478
|
let updateBaseline;
|
|
476
479
|
// 第一条动态的动态ID
|
|
477
480
|
let dynamicIdStr;
|
|
478
|
-
//
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
481
|
+
// 定义handler
|
|
482
|
+
const handler = async () => {
|
|
483
|
+
// 检测启动初始化
|
|
484
|
+
if (detectSetup) {
|
|
485
|
+
// 获取动态信息
|
|
486
|
+
const data = (await this.ctx.ba.getAllDynamic());
|
|
487
|
+
// 判断获取动态信息是否成功
|
|
488
|
+
if (data.code !== 0)
|
|
489
|
+
return;
|
|
490
|
+
// 设置更新基线
|
|
491
|
+
updateBaseline = data.data.update_baseline;
|
|
492
|
+
// 设置初始化为false
|
|
493
|
+
detectSetup = false;
|
|
494
|
+
// 初始化完成
|
|
484
495
|
return;
|
|
485
|
-
|
|
486
|
-
//
|
|
496
|
+
}
|
|
497
|
+
// 获取用户所有动态数据
|
|
498
|
+
let updateNum;
|
|
499
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
500
|
+
let content;
|
|
487
501
|
try {
|
|
488
|
-
//
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
if (data.code !== 0)
|
|
494
|
-
return;
|
|
495
|
-
// 设置更新基线
|
|
496
|
-
updateBaseline = data.data.update_baseline;
|
|
497
|
-
// 设置初始化为false
|
|
498
|
-
detectSetup = false;
|
|
499
|
-
// 初始化完成
|
|
502
|
+
// 查询是否有新动态
|
|
503
|
+
const data = await this.ctx.ba.hasNewDynamic(updateBaseline);
|
|
504
|
+
updateNum = data.data.update_num;
|
|
505
|
+
// 没有新动态或获取动态信息失败直接返回
|
|
506
|
+
if (updateNum <= 0 || data.code !== 0)
|
|
500
507
|
return;
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
this.logger.error(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`);
|
|
549
|
-
// 发送私聊消息
|
|
550
|
-
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
551
|
-
// 结束循环
|
|
552
|
-
break;
|
|
553
|
-
}
|
|
554
|
-
default: {
|
|
555
|
-
// 未知错误
|
|
556
|
-
// 发送私聊消息
|
|
557
|
-
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
558
|
-
// 结束循环
|
|
559
|
-
break;
|
|
560
|
-
}
|
|
508
|
+
// 获取动态内容
|
|
509
|
+
content = (await this.ctx.ba.getAllDynamic(updateBaseline));
|
|
510
|
+
}
|
|
511
|
+
catch (e) {
|
|
512
|
+
return this.logger.error(`dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:${e.message}`);
|
|
513
|
+
}
|
|
514
|
+
// 判断获取动态内容是否成功
|
|
515
|
+
if (content.code !== 0) {
|
|
516
|
+
switch (content.code) {
|
|
517
|
+
case -101: {
|
|
518
|
+
// 账号未登录
|
|
519
|
+
// 输出日志
|
|
520
|
+
this.logger.error("账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件");
|
|
521
|
+
// 发送私聊消息
|
|
522
|
+
await this.sendPrivateMsg("账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件");
|
|
523
|
+
// 停止服务
|
|
524
|
+
await this.ctx.sm.disposePlugin();
|
|
525
|
+
// 结束循环
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
case -352: {
|
|
529
|
+
// 风控
|
|
530
|
+
// 输出日志
|
|
531
|
+
this.logger.error("账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件");
|
|
532
|
+
// 发送私聊消息
|
|
533
|
+
await this.sendPrivateMsg("账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件");
|
|
534
|
+
// 停止服务
|
|
535
|
+
await this.ctx.sm.disposePlugin();
|
|
536
|
+
// 结束循环
|
|
537
|
+
break;
|
|
538
|
+
}
|
|
539
|
+
case 4101128:
|
|
540
|
+
case 4101129: {
|
|
541
|
+
// 获取动态信息错误
|
|
542
|
+
// 输出日志
|
|
543
|
+
this.logger.error(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`);
|
|
544
|
+
// 发送私聊消息
|
|
545
|
+
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
546
|
+
// 结束循环
|
|
547
|
+
break;
|
|
548
|
+
}
|
|
549
|
+
default: {
|
|
550
|
+
// 未知错误
|
|
551
|
+
// 发送私聊消息
|
|
552
|
+
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
553
|
+
// 结束循环
|
|
554
|
+
break;
|
|
561
555
|
}
|
|
562
556
|
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
// 存储该动态ID
|
|
590
|
-
dynamicIdStr = items[num].id_str;
|
|
557
|
+
}
|
|
558
|
+
// 获取数据内容
|
|
559
|
+
const data = content.data;
|
|
560
|
+
// 更新基线
|
|
561
|
+
updateBaseline = data.update_baseline;
|
|
562
|
+
// 有新动态内容
|
|
563
|
+
const items = data.items;
|
|
564
|
+
// 检查更新的动态
|
|
565
|
+
for (let num = updateNum - 1; num >= 0; num--) {
|
|
566
|
+
// 没有动态内容则直接跳过
|
|
567
|
+
if (!items[num])
|
|
568
|
+
continue;
|
|
569
|
+
// 从动态数据中取出UP主名称、UID和动态ID
|
|
570
|
+
const upUID = items[num].modules.module_author.mid;
|
|
571
|
+
// 寻找关注的UP主的动态
|
|
572
|
+
for (const sub of this.subManager) {
|
|
573
|
+
// 判断是否是订阅的UP主
|
|
574
|
+
// biome-ignore lint/suspicious/noDoubleEquals: <explanation>
|
|
575
|
+
if (sub.dynamic && sub.uid == upUID) {
|
|
576
|
+
// 订阅该UP主,推送该动态
|
|
577
|
+
// 判断更新动态是否为1条
|
|
578
|
+
if (updateNum === 1) {
|
|
579
|
+
// 判断dynamicIdStr是否有值,是否与当前动态ID一致
|
|
580
|
+
if (dynamicIdStr && dynamicIdStr === items[num].id_str) {
|
|
581
|
+
// 重复动态,不再推送,直接返回
|
|
582
|
+
return;
|
|
591
583
|
}
|
|
592
|
-
//
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
await this.sendMsg(sub.target, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
619
|
-
}
|
|
620
|
-
return;
|
|
621
|
-
}
|
|
622
|
-
if (e.message === "已屏蔽转发动态") {
|
|
623
|
-
if (this.config.filter.notify) {
|
|
624
|
-
await this.sendMsg(sub.target, `${upName}发布了一条转发动态,已屏蔽`);
|
|
625
|
-
}
|
|
626
|
-
return;
|
|
627
|
-
}
|
|
628
|
-
// 未知错误
|
|
629
|
-
if (i === attempts - 1) {
|
|
630
|
-
this.logger.error(`dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:${e.message}`);
|
|
631
|
-
// 发送私聊消息并重启服务
|
|
632
|
-
return await this.sendPrivateMsgAndStopService();
|
|
633
|
-
}
|
|
584
|
+
// 存储该动态ID
|
|
585
|
+
dynamicIdStr = items[num].id_str;
|
|
586
|
+
}
|
|
587
|
+
// 定义变量
|
|
588
|
+
let pic;
|
|
589
|
+
let buffer;
|
|
590
|
+
// 从动态数据中取出UP主名称和动态ID
|
|
591
|
+
const upName = items[num].modules.module_author.name;
|
|
592
|
+
const dynamicId = items[num].id_str;
|
|
593
|
+
// 推送该条动态
|
|
594
|
+
const flag = await (0, utils_1.withRetry)(async () => {
|
|
595
|
+
// 渲染图片
|
|
596
|
+
const { pic: gimgPic, buffer: gimgBuffer } = await this.ctx.gi.generateDynamicImg(items[num]);
|
|
597
|
+
// 赋值
|
|
598
|
+
pic = gimgPic;
|
|
599
|
+
buffer = gimgBuffer;
|
|
600
|
+
})
|
|
601
|
+
.then(() => true)
|
|
602
|
+
.catch(async (e) => {
|
|
603
|
+
// 直播开播动态,不做处理
|
|
604
|
+
if (e.message === "直播开播动态,不做处理")
|
|
605
|
+
return;
|
|
606
|
+
if (e.message === "出现关键词,屏蔽该动态") {
|
|
607
|
+
// 如果需要发送才发送
|
|
608
|
+
if (this.config.filter.notify) {
|
|
609
|
+
await this.sendMsg(sub.target, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
634
610
|
}
|
|
611
|
+
return;
|
|
635
612
|
}
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
if (pic) {
|
|
642
|
-
this.logger.info("推送动态中,使用render模式");
|
|
643
|
-
// pic存在,使用的是render模式
|
|
644
|
-
await this.sendMsg(sub.target, pic + dUrl);
|
|
645
|
-
}
|
|
646
|
-
else if (buffer) {
|
|
647
|
-
this.logger.info("推送动态中,使用page模式");
|
|
648
|
-
// pic不存在,说明使用的是page模式
|
|
649
|
-
await this.sendMsg(sub.target, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, "image/png"), dUrl] }));
|
|
650
|
-
}
|
|
651
|
-
else {
|
|
652
|
-
this.logger.info(`${items[num].modules.module_author.name}发布了一条动态,但是推送失败`);
|
|
613
|
+
if (e.message === "已屏蔽转发动态") {
|
|
614
|
+
if (this.config.filter.notify) {
|
|
615
|
+
await this.sendMsg(sub.target, `${upName}发布了一条转发动态,已屏蔽`);
|
|
616
|
+
}
|
|
617
|
+
return;
|
|
653
618
|
}
|
|
619
|
+
// 未知错误
|
|
620
|
+
this.logger.error(`dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:${e.message}`);
|
|
621
|
+
});
|
|
622
|
+
// 判断是否执行成功,未执行成功直接返回
|
|
623
|
+
if (!flag)
|
|
624
|
+
return;
|
|
625
|
+
// 判断是否需要发送URL
|
|
626
|
+
const dUrl = this.config.dynamicUrl
|
|
627
|
+
? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}`
|
|
628
|
+
: "";
|
|
629
|
+
// 如果pic存在,则直接返回pic
|
|
630
|
+
if (pic) {
|
|
631
|
+
this.logger.info("推送动态中,使用render模式");
|
|
632
|
+
// pic存在,使用的是render模式
|
|
633
|
+
await this.sendMsg(sub.target, pic + dUrl);
|
|
634
|
+
}
|
|
635
|
+
else if (buffer) {
|
|
636
|
+
this.logger.info("推送动态中,使用page模式");
|
|
637
|
+
// pic不存在,说明使用的是page模式
|
|
638
|
+
await this.sendMsg(sub.target, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, "image/png"), dUrl] }));
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
this.logger.info(`${items[num].modules.module_author.name}发布了一条动态,但是推送失败`);
|
|
654
642
|
}
|
|
655
643
|
}
|
|
656
644
|
}
|
|
657
645
|
}
|
|
658
|
-
finally {
|
|
659
|
-
flag = true;
|
|
660
|
-
}
|
|
661
646
|
};
|
|
647
|
+
// 返回一个闭包函数
|
|
648
|
+
return (0, utils_1.withLock)(handler);
|
|
662
649
|
}
|
|
663
650
|
debug_dynamicDetect() {
|
|
664
651
|
// 检测初始化变量
|
|
@@ -667,205 +654,189 @@ class ComRegister {
|
|
|
667
654
|
let updateBaseline;
|
|
668
655
|
// 第一条动态的动态ID
|
|
669
656
|
let dynamicIdStr;
|
|
670
|
-
//
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
657
|
+
// 定义处理逻辑
|
|
658
|
+
const handler = async () => {
|
|
659
|
+
console.log(`初始化状态:${detectSetup}`);
|
|
660
|
+
// 检测启动初始化
|
|
661
|
+
if (detectSetup) {
|
|
662
|
+
// 获取动态信息
|
|
663
|
+
const data = (await this.ctx.ba.getAllDynamic());
|
|
664
|
+
// 判断获取动态信息是否成功
|
|
665
|
+
if (data.code !== 0)
|
|
666
|
+
return;
|
|
667
|
+
console.log(`更新基线:${data.data.update_baseline}`);
|
|
668
|
+
// 设置更新基线
|
|
669
|
+
updateBaseline = data.data.update_baseline;
|
|
670
|
+
// 设置初始化为false
|
|
671
|
+
detectSetup = false;
|
|
672
|
+
// 初始化完成
|
|
676
673
|
return;
|
|
677
|
-
|
|
678
|
-
//
|
|
674
|
+
}
|
|
675
|
+
// 获取用户所有动态数据
|
|
676
|
+
let updateNum;
|
|
677
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
678
|
+
let content;
|
|
679
679
|
try {
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
console.log(`更新基线:${data.data.update_baseline}`);
|
|
689
|
-
// 设置更新基线
|
|
690
|
-
updateBaseline = data.data.update_baseline;
|
|
691
|
-
// 设置初始化为false
|
|
692
|
-
detectSetup = false;
|
|
693
|
-
// 初始化完成
|
|
680
|
+
// 查询是否有新动态
|
|
681
|
+
const data = await this.ctx.ba.hasNewDynamic(updateBaseline);
|
|
682
|
+
updateNum = data.data.update_num;
|
|
683
|
+
// biome-ignore lint/style/noUnusedTemplateLiteral: <explanation>
|
|
684
|
+
console.log(`获取是否有新动态:`);
|
|
685
|
+
console.log(data);
|
|
686
|
+
// 没有新动态或获取动态信息失败直接返回
|
|
687
|
+
if (updateNum <= 0 || data.code !== 0)
|
|
694
688
|
return;
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
case 4101129: {
|
|
745
|
-
// 获取动态信息错误
|
|
746
|
-
// 输出日志
|
|
747
|
-
this.logger.error(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`);
|
|
748
|
-
// 发送私聊消息
|
|
749
|
-
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
750
|
-
// 结束循环
|
|
751
|
-
break;
|
|
752
|
-
}
|
|
753
|
-
default: {
|
|
754
|
-
// 未知错误
|
|
755
|
-
// 发送私聊消息
|
|
756
|
-
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
757
|
-
// 结束循环
|
|
758
|
-
break;
|
|
759
|
-
}
|
|
689
|
+
// 获取动态内容
|
|
690
|
+
content = (await this.ctx.ba.getAllDynamic(updateBaseline));
|
|
691
|
+
console.log("获取动态内容:");
|
|
692
|
+
console.log(content.data.items[0]);
|
|
693
|
+
}
|
|
694
|
+
catch (e) {
|
|
695
|
+
return this.logger.error(`dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:${e.message}`);
|
|
696
|
+
}
|
|
697
|
+
// 判断获取动态内容是否成功
|
|
698
|
+
if (content.code !== 0) {
|
|
699
|
+
switch (content.code) {
|
|
700
|
+
case -101: {
|
|
701
|
+
// 账号未登录
|
|
702
|
+
// 输出日志
|
|
703
|
+
this.logger.error("账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件");
|
|
704
|
+
// 发送私聊消息
|
|
705
|
+
await this.sendPrivateMsg("账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件");
|
|
706
|
+
// 停止服务
|
|
707
|
+
await this.ctx.sm.disposePlugin();
|
|
708
|
+
// 结束循环
|
|
709
|
+
break;
|
|
710
|
+
}
|
|
711
|
+
case -352: {
|
|
712
|
+
// 风控
|
|
713
|
+
// 输出日志
|
|
714
|
+
this.logger.error("账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件");
|
|
715
|
+
// 发送私聊消息
|
|
716
|
+
await this.sendPrivateMsg("账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件");
|
|
717
|
+
// 停止服务
|
|
718
|
+
await this.ctx.sm.disposePlugin();
|
|
719
|
+
// 结束循环
|
|
720
|
+
break;
|
|
721
|
+
}
|
|
722
|
+
case 4101128:
|
|
723
|
+
case 4101129: {
|
|
724
|
+
// 获取动态信息错误
|
|
725
|
+
// 输出日志
|
|
726
|
+
this.logger.error(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`);
|
|
727
|
+
// 发送私聊消息
|
|
728
|
+
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
729
|
+
// 结束循环
|
|
730
|
+
break;
|
|
731
|
+
}
|
|
732
|
+
default: {
|
|
733
|
+
// 未知错误
|
|
734
|
+
// 发送私聊消息
|
|
735
|
+
await this.sendPrivateMsg(`获取动态信息错误,错误码为:${content.code},错误为:${content.message}`); // 未知错误
|
|
736
|
+
// 结束循环
|
|
737
|
+
break;
|
|
760
738
|
}
|
|
761
739
|
}
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
// 存储该动态ID
|
|
796
|
-
dynamicIdStr = items[num].id_str;
|
|
740
|
+
}
|
|
741
|
+
// 获取数据内容
|
|
742
|
+
const data = content.data;
|
|
743
|
+
// 更新基线
|
|
744
|
+
updateBaseline = data.update_baseline;
|
|
745
|
+
console.log(`更新基线:${updateBaseline}`);
|
|
746
|
+
// 有新动态内容
|
|
747
|
+
const items = data.items;
|
|
748
|
+
// 检查更新的动态
|
|
749
|
+
for (let num = updateNum - 1; num >= 0; num--) {
|
|
750
|
+
// 有更新动态
|
|
751
|
+
console.log("有更新动态");
|
|
752
|
+
// 没有动态内容则直接跳过
|
|
753
|
+
if (!items[num])
|
|
754
|
+
continue;
|
|
755
|
+
// 从动态数据中取出UP主名称、UID和动态ID
|
|
756
|
+
const upName = content.data.items[num].modules.module_author.name;
|
|
757
|
+
const upUID = items[num].modules.module_author.mid;
|
|
758
|
+
const dynamicId = content.data.items[num].id_str;
|
|
759
|
+
console.log(`寻找关注的UP主,当前动态UP主:${upName},UID:${upUID},动态ID:${dynamicId}`);
|
|
760
|
+
// 寻找关注的UP主的动态
|
|
761
|
+
for (const sub of this.subManager) {
|
|
762
|
+
console.log(`当前订阅UP主:${sub.uid}`);
|
|
763
|
+
// 判断是否是订阅的UP主
|
|
764
|
+
// biome-ignore lint/suspicious/noDoubleEquals: <explanation>
|
|
765
|
+
if (sub.dynamic && sub.uid == upUID) {
|
|
766
|
+
// 订阅该UP主,推送该动态
|
|
767
|
+
// 判断更新动态是否为1条
|
|
768
|
+
if (updateNum === 1) {
|
|
769
|
+
// 判断dynamicIdStr是否有值,是否与当前动态ID一致
|
|
770
|
+
if (dynamicIdStr && dynamicIdStr === items[num].id_str) {
|
|
771
|
+
// 重复动态,不再推送,直接返回
|
|
772
|
+
return;
|
|
797
773
|
}
|
|
798
|
-
//
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
await this.sendMsg(sub.target, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
826
|
-
}
|
|
827
|
-
return;
|
|
828
|
-
}
|
|
829
|
-
if (e.message === "已屏蔽转发动态") {
|
|
830
|
-
if (this.config.filter.notify) {
|
|
831
|
-
await this.sendMsg(sub.target, `${upName}发布了一条转发动态,已屏蔽`);
|
|
832
|
-
}
|
|
833
|
-
return;
|
|
834
|
-
}
|
|
835
|
-
// 未知错误
|
|
836
|
-
if (i === attempts - 1) {
|
|
837
|
-
this.logger.error(`dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:${e.message}`);
|
|
838
|
-
// 发送私聊消息并重启服务
|
|
839
|
-
return await this.sendPrivateMsgAndStopService();
|
|
840
|
-
}
|
|
774
|
+
// 存储该动态ID
|
|
775
|
+
dynamicIdStr = items[num].id_str;
|
|
776
|
+
}
|
|
777
|
+
// 定义变量
|
|
778
|
+
let pic;
|
|
779
|
+
let buffer;
|
|
780
|
+
// 从动态数据中取出UP主名称和动态ID
|
|
781
|
+
const upName = items[num].modules.module_author.name;
|
|
782
|
+
const dynamicId = items[num].id_str;
|
|
783
|
+
console.log(`UP主名称:${upName},动态ID:${dynamicId}`);
|
|
784
|
+
// 推送该条动态
|
|
785
|
+
const flag = await (0, utils_1.withRetry)(async () => {
|
|
786
|
+
// 渲染图片
|
|
787
|
+
const { pic: gimgPic, buffer: gimgBuffer } = await this.ctx.gi.generateDynamicImg(items[num]);
|
|
788
|
+
// 赋值
|
|
789
|
+
pic = gimgPic;
|
|
790
|
+
buffer = gimgBuffer;
|
|
791
|
+
})
|
|
792
|
+
.then(() => true)
|
|
793
|
+
.catch(async (e) => {
|
|
794
|
+
// 直播开播动态,不做处理
|
|
795
|
+
if (e.message === "直播开播动态,不做处理")
|
|
796
|
+
return;
|
|
797
|
+
if (e.message === "出现关键词,屏蔽该动态") {
|
|
798
|
+
// 如果需要发送才发送
|
|
799
|
+
if (this.config.filter.notify) {
|
|
800
|
+
await this.sendMsg(sub.target, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
841
801
|
}
|
|
802
|
+
return;
|
|
842
803
|
}
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
if (pic) {
|
|
849
|
-
this.logger.info("推送动态中,使用render模式");
|
|
850
|
-
// pic存在,使用的是render模式
|
|
851
|
-
await this.sendMsg(sub.target, pic + dUrl);
|
|
852
|
-
}
|
|
853
|
-
else if (buffer) {
|
|
854
|
-
this.logger.info("推送动态中,使用page模式");
|
|
855
|
-
// pic不存在,说明使用的是page模式
|
|
856
|
-
await this.sendMsg(sub.target, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, "image/png"), dUrl] }));
|
|
857
|
-
}
|
|
858
|
-
else {
|
|
859
|
-
this.logger.info(`${items[num].modules.module_author.name}发布了一条动态,但是推送失败`);
|
|
804
|
+
if (e.message === "已屏蔽转发动态") {
|
|
805
|
+
if (this.config.filter.notify) {
|
|
806
|
+
await this.sendMsg(sub.target, `${upName}发布了一条转发动态,已屏蔽`);
|
|
807
|
+
}
|
|
808
|
+
return;
|
|
860
809
|
}
|
|
810
|
+
// 未知错误
|
|
811
|
+
this.logger.error(`dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:${e.message}`);
|
|
812
|
+
});
|
|
813
|
+
// 发送私聊消息并重启服务
|
|
814
|
+
if (!flag)
|
|
815
|
+
return await this.sendPrivateMsgAndStopService();
|
|
816
|
+
// 判断是否需要发送URL
|
|
817
|
+
const dUrl = this.config.dynamicUrl
|
|
818
|
+
? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}`
|
|
819
|
+
: "";
|
|
820
|
+
// 如果pic存在,则直接返回pic
|
|
821
|
+
if (pic) {
|
|
822
|
+
this.logger.info("推送动态中,使用render模式");
|
|
823
|
+
// pic存在,使用的是render模式
|
|
824
|
+
await this.sendMsg(sub.target, pic + dUrl);
|
|
825
|
+
}
|
|
826
|
+
else if (buffer) {
|
|
827
|
+
this.logger.info("推送动态中,使用page模式");
|
|
828
|
+
// pic不存在,说明使用的是page模式
|
|
829
|
+
await this.sendMsg(sub.target, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, "image/png"), dUrl] }));
|
|
830
|
+
}
|
|
831
|
+
else {
|
|
832
|
+
this.logger.info(`${items[num].modules.module_author.name}发布了一条动态,但是推送失败`);
|
|
861
833
|
}
|
|
862
834
|
}
|
|
863
835
|
}
|
|
864
836
|
}
|
|
865
|
-
finally {
|
|
866
|
-
flag = true;
|
|
867
|
-
}
|
|
868
837
|
};
|
|
838
|
+
// 加工handler并返回
|
|
839
|
+
return (0, utils_1.withLock)(handler);
|
|
869
840
|
}
|
|
870
841
|
// 定义发送直播通知卡片方法
|
|
871
842
|
async sendLiveNotifyCard(info, liveType, followerDisplay, liveNotifyMsg) {
|
|
@@ -873,26 +844,21 @@ class ComRegister {
|
|
|
873
844
|
let pic;
|
|
874
845
|
let buffer;
|
|
875
846
|
// 多次尝试生成图片
|
|
876
|
-
const
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
// 发送私聊消息并重启服务
|
|
892
|
-
return await this.sendPrivateMsgAndStopService();
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
}
|
|
847
|
+
const flag = await (0, utils_1.withRetry)(async () => {
|
|
848
|
+
// 获取直播通知卡片
|
|
849
|
+
const { pic: picv, buffer: bufferv } = await this.ctx.gi.generateLiveImg(info.data, info.username, info.userface, followerDisplay, liveType);
|
|
850
|
+
// 赋值
|
|
851
|
+
pic = picv;
|
|
852
|
+
buffer = bufferv;
|
|
853
|
+
})
|
|
854
|
+
.then(() => true)
|
|
855
|
+
.catch((e) => {
|
|
856
|
+
this.logger.error(`liveDetect generateLiveImg() 推送卡片生成失败,原因:${e.message}`);
|
|
857
|
+
return false;
|
|
858
|
+
});
|
|
859
|
+
// 发送私聊消息并重启服务
|
|
860
|
+
if (!flag)
|
|
861
|
+
return await this.sendPrivateMsgAndStopService();
|
|
896
862
|
// 推送直播信息
|
|
897
863
|
// pic 存在,使用的是render模式
|
|
898
864
|
if (pic) {
|
|
@@ -951,26 +917,18 @@ class ComRegister {
|
|
|
951
917
|
}
|
|
952
918
|
async useLiveRoomInfo(roomId) {
|
|
953
919
|
// 发送请求获取直播间信息
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
if (i === attempts - 1) {
|
|
967
|
-
// 已尝试三次
|
|
968
|
-
// 发送私聊消息并重启服务
|
|
969
|
-
return await this.sendPrivateMsgAndStopService();
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
return content.data;
|
|
920
|
+
const data = await (0, utils_1.withRetry)(async () => await this.ctx.ba.getLiveRoomInfo(roomId))
|
|
921
|
+
.then((content) => content.data)
|
|
922
|
+
.catch((e) => {
|
|
923
|
+
this.logger.error(`liveDetect getLiveRoomInfo 发生了错误,错误为:${e.message}`);
|
|
924
|
+
// 返回错误
|
|
925
|
+
return false;
|
|
926
|
+
});
|
|
927
|
+
// 发送私聊消息并重启服务
|
|
928
|
+
if (!data)
|
|
929
|
+
return await this.sendPrivateMsgAndStopService();
|
|
930
|
+
// 返回
|
|
931
|
+
return data;
|
|
974
932
|
}
|
|
975
933
|
async liveDetectWithListener(roomId, target) {
|
|
976
934
|
// 定义开播时间
|
|
@@ -1356,34 +1314,18 @@ class ComRegister {
|
|
|
1356
1314
|
}
|
|
1357
1315
|
async loadSubFromConfig(subs) {
|
|
1358
1316
|
for (const sub of subs) {
|
|
1317
|
+
// logger
|
|
1318
|
+
this.logger.info(`加载订阅UID:${sub.uid}中...`);
|
|
1359
1319
|
// 定义Data
|
|
1360
|
-
|
|
1361
|
-
|
|
1320
|
+
const data = await (0, utils_1.withRetry)(async () => await this.ctx.ba.getUserInfo(sub.uid))
|
|
1321
|
+
.then((content) => content.data)
|
|
1322
|
+
.catch((e) => {
|
|
1323
|
+
this.logger.error(`loadSubFromConfig() getUserInfo() 发生了错误,错误为:${e.message}`);
|
|
1324
|
+
// logger
|
|
1325
|
+
this.logger.info(`加载订阅UID:${sub.uid}失败!`);
|
|
1326
|
+
});
|
|
1362
1327
|
// 判断是否需要订阅直播
|
|
1363
1328
|
if (sub.live) {
|
|
1364
|
-
// 获取用户信息
|
|
1365
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
1366
|
-
let content;
|
|
1367
|
-
// 设置重试次数
|
|
1368
|
-
const attempts = 3;
|
|
1369
|
-
for (let i = 0; i < attempts; i++) {
|
|
1370
|
-
try {
|
|
1371
|
-
// 获取用户信息
|
|
1372
|
-
content = await this.ctx.ba.getUserInfo(sub.uid);
|
|
1373
|
-
// 成功则跳出循环
|
|
1374
|
-
break;
|
|
1375
|
-
}
|
|
1376
|
-
catch (e) {
|
|
1377
|
-
this.logger.error(`loadSubFromConfig() getUserInfo() 发生了错误,错误为:${e.message}`);
|
|
1378
|
-
if (i === attempts - 1) {
|
|
1379
|
-
// 已尝试三次
|
|
1380
|
-
// 发送私聊消息并重启服务
|
|
1381
|
-
return await this.sendPrivateMsgAndStopService();
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
// 获取data
|
|
1386
|
-
data = content.data;
|
|
1387
1329
|
// 检查roomid是否存在
|
|
1388
1330
|
if (!data.live_room) {
|
|
1389
1331
|
// 用户没有开通直播间,无法订阅直播
|
|
@@ -1413,6 +1355,7 @@ class ComRegister {
|
|
|
1413
1355
|
live: sub.live,
|
|
1414
1356
|
dynamic: sub.dynamic,
|
|
1415
1357
|
});
|
|
1358
|
+
this.logger.info(`UID:${sub.uid}订阅加载完毕!`);
|
|
1416
1359
|
}
|
|
1417
1360
|
}
|
|
1418
1361
|
checkIfDynamicDetectIsNeeded() {
|
package/lib/generateImg.d.ts
CHANGED
package/lib/generateImg.js
CHANGED
|
@@ -70,9 +70,9 @@ class GenerateImg extends koishi_1.Service {
|
|
|
70
70
|
width: 100%;
|
|
71
71
|
height: auto;
|
|
72
72
|
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
|
|
73
|
-
padding:
|
|
73
|
+
padding: ${this.giConfig.cardBasePlateBorder};
|
|
74
74
|
border-radius: 10px;
|
|
75
|
-
background-color:
|
|
75
|
+
background-color: ${this.giConfig.cardBasePlateColor};
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
.card {
|
|
@@ -160,7 +160,7 @@ class GenerateImg extends koishi_1.Service {
|
|
|
160
160
|
<span class="broadcast-message">${username}${titleStatus}</span>
|
|
161
161
|
</div>
|
|
162
162
|
</div>
|
|
163
|
-
${this.giConfig.hideDesc ? "" : `<p class="card-text">${data.description ? data.description : "
|
|
163
|
+
${this.giConfig.hideDesc ? "" : `<p class="card-text">${data.description ? data.description : "这个主播很懒,什么简介都没写"}</p>`}
|
|
164
164
|
<p class="card-link">
|
|
165
165
|
<span>人气:${data.online > 10000 ? `${(data.online / 10000).toFixed(1)}万` : data.online}</span>
|
|
166
166
|
<span>分区名称:${data.area_name}</span>
|
|
@@ -575,7 +575,7 @@ class GenerateImg extends koishi_1.Service {
|
|
|
575
575
|
// 判断是否开启大字体模式
|
|
576
576
|
let style;
|
|
577
577
|
if (this.giConfig.enableLargeFont) {
|
|
578
|
-
style = `
|
|
578
|
+
style = /* css */ `
|
|
579
579
|
@font-face {
|
|
580
580
|
font-family: "Custom Font";
|
|
581
581
|
src: url(${fontURL});
|
|
@@ -605,9 +605,9 @@ class GenerateImg extends koishi_1.Service {
|
|
|
605
605
|
width: 100%;
|
|
606
606
|
height: auto;
|
|
607
607
|
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
|
|
608
|
-
padding:
|
|
608
|
+
padding: ${this.giConfig.cardBasePlateBorder};
|
|
609
609
|
border-radius: 10px;
|
|
610
|
-
background-color:
|
|
610
|
+
background-color: ${this.giConfig.cardBasePlateColor};
|
|
611
611
|
}
|
|
612
612
|
|
|
613
613
|
.card {
|
|
@@ -940,7 +940,7 @@ class GenerateImg extends koishi_1.Service {
|
|
|
940
940
|
`;
|
|
941
941
|
}
|
|
942
942
|
else {
|
|
943
|
-
style = `
|
|
943
|
+
style = /* css */ `
|
|
944
944
|
@font-face {
|
|
945
945
|
font-family: "Custom Font";
|
|
946
946
|
src: url(${fontURL});
|
|
@@ -970,9 +970,9 @@ class GenerateImg extends koishi_1.Service {
|
|
|
970
970
|
width: 100%;
|
|
971
971
|
height: auto;
|
|
972
972
|
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
|
|
973
|
-
padding:
|
|
973
|
+
padding: ${this.giConfig.cardBasePlateBorder};
|
|
974
974
|
border-radius: 10px;
|
|
975
|
-
background-color:
|
|
975
|
+
background-color: ${this.giConfig.cardBasePlateColor};
|
|
976
976
|
}
|
|
977
977
|
|
|
978
978
|
.card {
|
|
@@ -1521,6 +1521,8 @@ class GenerateImg extends koishi_1.Service {
|
|
|
1521
1521
|
removeBorder: koishi_1.Schema.boolean(),
|
|
1522
1522
|
cardColorStart: koishi_1.Schema.string(),
|
|
1523
1523
|
cardColorEnd: koishi_1.Schema.string(),
|
|
1524
|
+
cardBasePlateColor: koishi_1.Schema.string(),
|
|
1525
|
+
cardBasePlateBorder: koishi_1.Schema.string(),
|
|
1524
1526
|
enableLargeFont: koishi_1.Schema.boolean(),
|
|
1525
1527
|
font: koishi_1.Schema.string(),
|
|
1526
1528
|
hideDesc: koishi_1.Schema.boolean(),
|
package/lib/index.d.ts
CHANGED
|
@@ -10,6 +10,18 @@ declare class ServerManager extends Service {
|
|
|
10
10
|
servers: ForkScope[];
|
|
11
11
|
renderType: number;
|
|
12
12
|
dynamicLoopTime: number;
|
|
13
|
+
renderTypePatternMatching: {
|
|
14
|
+
render: number;
|
|
15
|
+
page: number;
|
|
16
|
+
};
|
|
17
|
+
dynamicLoopTimePatternMatching: {
|
|
18
|
+
"1\u5206\u949F": number;
|
|
19
|
+
"2\u5206\u949F": number;
|
|
20
|
+
"3\u5206\u949F": number;
|
|
21
|
+
"5\u5206\u949F": number;
|
|
22
|
+
"10\u5206\u949F": number;
|
|
23
|
+
"20\u5206\u949F": number;
|
|
24
|
+
};
|
|
13
25
|
constructor(ctx: Context);
|
|
14
26
|
protected start(): void | Promise<void>;
|
|
15
27
|
registerPlugin: () => boolean;
|
|
@@ -57,6 +69,8 @@ export interface Config {
|
|
|
57
69
|
removeBorder: boolean;
|
|
58
70
|
cardColorStart: string;
|
|
59
71
|
cardColorEnd: string;
|
|
72
|
+
cardBasePlateColor: string;
|
|
73
|
+
cardBasePlateBorder: string;
|
|
60
74
|
enableLargeFont: boolean;
|
|
61
75
|
font: string;
|
|
62
76
|
filter: {};
|
package/lib/index.js
CHANGED
|
@@ -56,6 +56,20 @@ class ServerManager extends koishi_1.Service {
|
|
|
56
56
|
renderType;
|
|
57
57
|
// 动态循环时间
|
|
58
58
|
dynamicLoopTime;
|
|
59
|
+
// 定义渲染类型模式匹配
|
|
60
|
+
renderTypePatternMatching = {
|
|
61
|
+
render: 0,
|
|
62
|
+
page: 1,
|
|
63
|
+
};
|
|
64
|
+
// 定义具体时间模式匹配
|
|
65
|
+
dynamicLoopTimePatternMatching = {
|
|
66
|
+
"1分钟": 60,
|
|
67
|
+
"2分钟": 120,
|
|
68
|
+
"3分钟": 180,
|
|
69
|
+
"5分钟": 300,
|
|
70
|
+
"10分钟": 600,
|
|
71
|
+
"20分钟": 1200,
|
|
72
|
+
};
|
|
59
73
|
constructor(ctx) {
|
|
60
74
|
super(ctx, "sm");
|
|
61
75
|
// 插件运行相关指令
|
|
@@ -99,35 +113,10 @@ class ServerManager extends koishi_1.Service {
|
|
|
99
113
|
start() {
|
|
100
114
|
// 加载配置
|
|
101
115
|
// 根据用户设置的渲染模式设置
|
|
102
|
-
|
|
103
|
-
case "render":
|
|
104
|
-
this.renderType = 0;
|
|
105
|
-
break;
|
|
106
|
-
case "page":
|
|
107
|
-
this.renderType = 1;
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
116
|
+
this.renderType = this.renderTypePatternMatching[globalConfig.renderType];
|
|
110
117
|
// 转换为具体时间
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
this.dynamicLoopTime = 60;
|
|
114
|
-
break;
|
|
115
|
-
case "2分钟":
|
|
116
|
-
this.dynamicLoopTime = 120;
|
|
117
|
-
break;
|
|
118
|
-
case "3分钟":
|
|
119
|
-
this.dynamicLoopTime = 180;
|
|
120
|
-
break;
|
|
121
|
-
case "5分钟":
|
|
122
|
-
this.dynamicLoopTime = 300;
|
|
123
|
-
break;
|
|
124
|
-
case "10分钟":
|
|
125
|
-
this.dynamicLoopTime = 600;
|
|
126
|
-
break;
|
|
127
|
-
case "20分钟":
|
|
128
|
-
this.dynamicLoopTime = 1200;
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
118
|
+
this.dynamicLoopTime =
|
|
119
|
+
this.dynamicLoopTimePatternMatching[globalConfig.dynamicLoopTime];
|
|
131
120
|
// 注册插件
|
|
132
121
|
if (!this.registerPlugin()) {
|
|
133
122
|
this.logger.error("插件启动失败");
|
|
@@ -151,6 +140,8 @@ class ServerManager extends koishi_1.Service {
|
|
|
151
140
|
removeBorder: globalConfig.removeBorder,
|
|
152
141
|
cardColorStart: globalConfig.cardColorStart,
|
|
153
142
|
cardColorEnd: globalConfig.cardColorEnd,
|
|
143
|
+
cardBasePlateColor: globalConfig.cardBasePlateColor,
|
|
144
|
+
cardBasePlateBorder: globalConfig.cardBasePlateBorder,
|
|
154
145
|
hideDesc: globalConfig.hideDesc,
|
|
155
146
|
enableLargeFont: globalConfig.enableLargeFont,
|
|
156
147
|
font: globalConfig.font,
|
|
@@ -387,6 +378,14 @@ exports.Config = koishi_1.Schema.object({
|
|
|
387
378
|
.pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)
|
|
388
379
|
.default("#F9CCDF")
|
|
389
380
|
.description("推送卡片的结束渐变背景色,请填入16进制颜色代码,参考网站:https://colorate.azurewebsites.net/"),
|
|
381
|
+
cardBasePlateColor: koishi_1.Schema.string()
|
|
382
|
+
.pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)
|
|
383
|
+
.default("#FFF5EE")
|
|
384
|
+
.description("推送卡片底板颜色,请填入16进制颜色代码"),
|
|
385
|
+
cardBasePlateBorder: koishi_1.Schema.string()
|
|
386
|
+
.pattern(/\d*\.?\d+(?:px|em|rem|%|vh|vw|vmin|vmax)/)
|
|
387
|
+
.default("15px")
|
|
388
|
+
.description("推送卡片底板边框宽度,请填入css单位,例如1px,12.5rem,100%"),
|
|
390
389
|
enableLargeFont: koishi_1.Schema.boolean()
|
|
391
390
|
.default(false)
|
|
392
391
|
.description("是否开启动态推送卡片大字体模式,默认为小字体。小字体更漂亮,但阅读比较吃力,大字体更易阅读,但相对没这么好看"),
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -207,6 +207,8 @@
|
|
|
207
207
|
- ver 3.0.0-alpha.21 优化:部分代码; 新增:更新插件后,由于机器人还未启动,已开始发送消息报错 `this._request is not a function` ,新增报错后自动重新发送消息的功能
|
|
208
208
|
- ver 3.0.0-alpha.22 优化:订阅配置展示优化
|
|
209
209
|
- ver 3.0.0-alpha.23 新增:指令 `bili ll` 可以查看当前订阅直播的UP主们的开播情况
|
|
210
|
+
- ver 3.0.0-alpha.24 新增:配置项,`cardBasePlateColor` 和 `cardBasePlateBorder`,分别设置卡片底板颜色和底板边框宽度; 优化:部分代码结构
|
|
211
|
+
- ver 3.0.0-alpha.25 修复:输入指令 `bili ll` 时报错 `TypeError: Cannot read properties of null (reading 'items')`,当某个订阅只订阅动态时无法成功订阅且后续订阅都无法加载; 优化:部分代码结构
|
|
210
212
|
|
|
211
213
|
## 交流群
|
|
212
214
|
|