koishi-plugin-bilibili-notify 1.3.4 → 1.3.6-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/comRegister.d.ts +2 -1
- package/lib/comRegister.js +319 -273
- package/lib/index.d.ts +2 -3
- package/lib/index.js +14 -17
- package/package.json +1 -1
- package/readme.md +2 -0
package/lib/comRegister.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ declare class ComRegister {
|
|
|
6
6
|
config: ComRegister.Config;
|
|
7
7
|
loginTimer: Function;
|
|
8
8
|
num: number;
|
|
9
|
+
rebootCount: number;
|
|
9
10
|
subNotifier: Notifier;
|
|
10
11
|
subManager: {
|
|
11
12
|
id: number;
|
|
@@ -30,7 +31,7 @@ declare class ComRegister {
|
|
|
30
31
|
constructor(ctx: Context, config: ComRegister.Config);
|
|
31
32
|
getTheCorrespondingBotBasedOnTheSession(session: Session): Bot<Context, any>;
|
|
32
33
|
sendPrivateMsg(bot: Bot<Context>, content: string): Promise<void>;
|
|
33
|
-
sendPrivateMsgAndRebootService(ctx: Context, bot: Bot<Context
|
|
34
|
+
sendPrivateMsgAndRebootService(ctx: Context, bot: Bot<Context>): Promise<void>;
|
|
34
35
|
sendMsg(targets: Array<string>, bot: Bot<Context>, content: any): Promise<void>;
|
|
35
36
|
dynamicDetect(ctx: Context, bot: Bot<Context>, uid: string, guildId: Array<string>): () => Promise<void>;
|
|
36
37
|
debug_dynamicDetect(ctx: Context, bot: Bot<Context>, uid: string, guildId: Array<string>): () => Promise<void>;
|
package/lib/comRegister.js
CHANGED
|
@@ -23,6 +23,7 @@ class ComRegister {
|
|
|
23
23
|
config;
|
|
24
24
|
loginTimer;
|
|
25
25
|
num = 0;
|
|
26
|
+
rebootCount = 0;
|
|
26
27
|
subNotifier;
|
|
27
28
|
subManager = [];
|
|
28
29
|
// QQ群机器人
|
|
@@ -780,19 +781,33 @@ class ComRegister {
|
|
|
780
781
|
}
|
|
781
782
|
}
|
|
782
783
|
}
|
|
783
|
-
async sendPrivateMsgAndRebootService(ctx, bot
|
|
784
|
-
|
|
784
|
+
async sendPrivateMsgAndRebootService(ctx, bot) {
|
|
785
|
+
// 判断重启次数是否超过三次
|
|
786
|
+
if (this.rebootCount >= 3) {
|
|
787
|
+
// logger
|
|
788
|
+
this.logger.error('已重启插件三次,请检查机器人状态后使用指令 sys start 启动插件');
|
|
789
|
+
// 重启失败,发送消息
|
|
790
|
+
await this.sendPrivateMsg(bot, '已重启插件三次,请检查机器人状态后使用指令 sys start 启动插件');
|
|
791
|
+
// 关闭插件
|
|
792
|
+
await ctx.sm.disposePlugin();
|
|
793
|
+
// 结束
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
// 重启次数+1
|
|
797
|
+
this.rebootCount++;
|
|
798
|
+
// logger
|
|
799
|
+
this.logger.info('插件出现未知错误,正在重启插件');
|
|
785
800
|
// 重启插件
|
|
786
|
-
const flag = await ctx.sm.restartPlugin(
|
|
801
|
+
const flag = await ctx.sm.restartPlugin();
|
|
787
802
|
// 判断是否重启成功
|
|
788
803
|
if (flag) {
|
|
789
804
|
this.logger.info('重启插件成功');
|
|
790
805
|
}
|
|
791
806
|
else {
|
|
792
807
|
// logger
|
|
793
|
-
this.logger.error('
|
|
808
|
+
this.logger.error('重启插件失败,请检查机器人状态后使用指令 sys start 启动插件');
|
|
794
809
|
// 重启失败,发送消息
|
|
795
|
-
await this.sendPrivateMsg(bot, '
|
|
810
|
+
await this.sendPrivateMsg(bot, '重启插件失败,请检查机器人状态后使用指令 sys start 启动插件');
|
|
796
811
|
// 关闭插件
|
|
797
812
|
await ctx.sm.disposePlugin();
|
|
798
813
|
}
|
|
@@ -818,299 +833,323 @@ class ComRegister {
|
|
|
818
833
|
dynamicDetect(ctx, bot, uid, guildId) {
|
|
819
834
|
let firstSubscription = true;
|
|
820
835
|
let timePoint;
|
|
836
|
+
// 相当于锁的作用,防止上一个循环没处理完
|
|
837
|
+
let flag = true;
|
|
821
838
|
return async () => {
|
|
822
|
-
//
|
|
823
|
-
if (
|
|
824
|
-
// 设置第一次的时间点
|
|
825
|
-
timePoint = ctx.ba.getTimeOfUTC8();
|
|
826
|
-
// 设置第一次为false
|
|
827
|
-
firstSubscription = false;
|
|
839
|
+
// 判断上一个循环是否完成
|
|
840
|
+
if (!flag)
|
|
828
841
|
return;
|
|
829
|
-
|
|
830
|
-
//
|
|
831
|
-
let content;
|
|
842
|
+
flag = false;
|
|
843
|
+
// 无论是否执行成功都要释放锁
|
|
832
844
|
try {
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
switch (content.code) {
|
|
841
|
-
case -101: { // 账号未登录
|
|
842
|
-
// 输出日志
|
|
843
|
-
this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
844
|
-
// 发送私聊消息
|
|
845
|
-
await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
846
|
-
// 停止服务
|
|
847
|
-
await ctx.sm.disposePlugin();
|
|
848
|
-
// 结束循环
|
|
849
|
-
break;
|
|
850
|
-
}
|
|
851
|
-
case -352: { // 风控
|
|
852
|
-
// 输出日志
|
|
853
|
-
this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
854
|
-
// 发送私聊消息
|
|
855
|
-
await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
856
|
-
// 停止服务
|
|
857
|
-
await ctx.sm.disposePlugin();
|
|
858
|
-
// 结束循环
|
|
859
|
-
break;
|
|
860
|
-
}
|
|
861
|
-
case 4101128:
|
|
862
|
-
case 4101129: { // 获取动态信息错误
|
|
863
|
-
// 输出日志
|
|
864
|
-
this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
|
|
865
|
-
// 发送私聊消息
|
|
866
|
-
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
867
|
-
// 结束循环
|
|
868
|
-
break;
|
|
869
|
-
}
|
|
870
|
-
default: { // 未知错误
|
|
871
|
-
// 发送私聊消息
|
|
872
|
-
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
873
|
-
// 取消订阅
|
|
874
|
-
this.unsubAll(ctx, bot, uid);
|
|
875
|
-
// 结束循环
|
|
876
|
-
break;
|
|
877
|
-
}
|
|
845
|
+
// 第一次订阅判断
|
|
846
|
+
if (firstSubscription) {
|
|
847
|
+
// 设置第一次的时间点
|
|
848
|
+
timePoint = ctx.ba.getTimeOfUTC8();
|
|
849
|
+
// 设置第一次为false
|
|
850
|
+
firstSubscription = false;
|
|
851
|
+
return;
|
|
878
852
|
}
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
853
|
+
// 获取用户空间动态数据
|
|
854
|
+
let content;
|
|
855
|
+
try {
|
|
856
|
+
content = await ctx.ba.getUserSpaceDynamic(uid);
|
|
857
|
+
}
|
|
858
|
+
catch (e) {
|
|
859
|
+
return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
|
|
860
|
+
}
|
|
861
|
+
// 判断是否出现其他问题
|
|
862
|
+
if (content.code !== 0) {
|
|
863
|
+
switch (content.code) {
|
|
864
|
+
case -101: { // 账号未登录
|
|
865
|
+
// 输出日志
|
|
866
|
+
this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
867
|
+
// 发送私聊消息
|
|
868
|
+
await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
869
|
+
// 停止服务
|
|
870
|
+
await ctx.sm.disposePlugin();
|
|
871
|
+
// 结束循环
|
|
872
|
+
break;
|
|
873
|
+
}
|
|
874
|
+
case -352: { // 风控
|
|
875
|
+
// 输出日志
|
|
876
|
+
this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
877
|
+
// 发送私聊消息
|
|
878
|
+
await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
879
|
+
// 停止服务
|
|
880
|
+
await ctx.sm.disposePlugin();
|
|
881
|
+
// 结束循环
|
|
882
|
+
break;
|
|
883
|
+
}
|
|
884
|
+
case 4101128:
|
|
885
|
+
case 4101129: { // 获取动态信息错误
|
|
886
|
+
// 输出日志
|
|
887
|
+
this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
|
|
888
|
+
// 发送私聊消息
|
|
889
|
+
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
890
|
+
// 结束循环
|
|
891
|
+
break;
|
|
892
|
+
}
|
|
893
|
+
default: { // 未知错误
|
|
894
|
+
// 发送私聊消息
|
|
895
|
+
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
896
|
+
// 取消订阅
|
|
897
|
+
this.unsubAll(ctx, bot, uid);
|
|
898
|
+
// 结束循环
|
|
899
|
+
break;
|
|
888
900
|
}
|
|
889
|
-
break;
|
|
890
901
|
}
|
|
891
|
-
case 0: timePoint = items[num].modules.module_author.pub_ts;
|
|
892
902
|
}
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
let pic;
|
|
903
|
-
let buffer;
|
|
904
|
-
// 从动态数据中取出UP主名称和动态ID
|
|
905
|
-
const upName = content.data.items[num].modules.module_author.name;
|
|
906
|
-
const dynamicId = content.data.items[num].id_str;
|
|
907
|
-
// 推送该条动态
|
|
908
|
-
const attempts = 3;
|
|
909
|
-
for (let i = 0; i < attempts; i++) {
|
|
910
|
-
// 获取动态推送图片
|
|
911
|
-
try {
|
|
912
|
-
// 渲染图片
|
|
913
|
-
const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
|
|
914
|
-
// 赋值
|
|
915
|
-
pic = gimgPic;
|
|
916
|
-
buffer = gimgBuffer;
|
|
917
|
-
// 成功则跳出循环
|
|
903
|
+
// 获取数据内容
|
|
904
|
+
const items = content.data.items;
|
|
905
|
+
// 定义方法:更新时间点为最新发布动态的发布时间
|
|
906
|
+
const updatePoint = (num) => {
|
|
907
|
+
switch (num) {
|
|
908
|
+
case 1: {
|
|
909
|
+
if (items[0].modules.module_tag) { // 存在置顶动态
|
|
910
|
+
timePoint = items[num].modules.module_author.pub_ts;
|
|
911
|
+
}
|
|
918
912
|
break;
|
|
919
913
|
}
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
914
|
+
case 0: timePoint = items[num].modules.module_author.pub_ts;
|
|
915
|
+
}
|
|
916
|
+
};
|
|
917
|
+
// 发送请求 默认只查看配置文件规定数量的数据
|
|
918
|
+
for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
|
|
919
|
+
// 没有动态内容则直接跳过
|
|
920
|
+
if (!items[num])
|
|
921
|
+
continue;
|
|
922
|
+
// 寻找发布时间比时间点更晚的动态
|
|
923
|
+
if (items[num].modules.module_author.pub_ts > timePoint) {
|
|
924
|
+
// 定义变量
|
|
925
|
+
let pic;
|
|
926
|
+
let buffer;
|
|
927
|
+
// 从动态数据中取出UP主名称和动态ID
|
|
928
|
+
const upName = content.data.items[num].modules.module_author.name;
|
|
929
|
+
const dynamicId = content.data.items[num].id_str;
|
|
930
|
+
// 推送该条动态
|
|
931
|
+
const attempts = 3;
|
|
932
|
+
for (let i = 0; i < attempts; i++) {
|
|
933
|
+
// 获取动态推送图片
|
|
934
|
+
try {
|
|
935
|
+
// 渲染图片
|
|
936
|
+
const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
|
|
937
|
+
// 赋值
|
|
938
|
+
pic = gimgPic;
|
|
939
|
+
buffer = gimgBuffer;
|
|
940
|
+
// 成功则跳出循环
|
|
941
|
+
break;
|
|
932
942
|
}
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
943
|
+
catch (e) {
|
|
944
|
+
// 直播开播动态,不做处理
|
|
945
|
+
if (e.message === '直播开播动态,不做处理')
|
|
946
|
+
return updatePoint(num);
|
|
947
|
+
if (e.message === '出现关键词,屏蔽该动态') {
|
|
948
|
+
// 如果需要发送才发送
|
|
949
|
+
this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
950
|
+
return updatePoint(num);
|
|
951
|
+
}
|
|
952
|
+
if (e.message === '已屏蔽转发动态') {
|
|
953
|
+
this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
|
|
954
|
+
return updatePoint(num);
|
|
955
|
+
}
|
|
956
|
+
// 未知错误
|
|
957
|
+
if (i === attempts - 1) {
|
|
958
|
+
this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
|
|
959
|
+
// 发送私聊消息并重启服务
|
|
960
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
961
|
+
}
|
|
938
962
|
}
|
|
939
963
|
}
|
|
964
|
+
// 判断是否需要发送URL
|
|
965
|
+
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
966
|
+
// 如果pic存在,则直接返回pic
|
|
967
|
+
if (pic) {
|
|
968
|
+
this.logger.info('推送动态中,使用render模式');
|
|
969
|
+
// pic存在,使用的是render模式
|
|
970
|
+
await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
971
|
+
}
|
|
972
|
+
else if (buffer) {
|
|
973
|
+
this.logger.info('推送动态中,使用page模式');
|
|
974
|
+
// pic不存在,说明使用的是page模式
|
|
975
|
+
await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
976
|
+
}
|
|
977
|
+
else {
|
|
978
|
+
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
979
|
+
}
|
|
980
|
+
// 更新时间点
|
|
981
|
+
updatePoint(num);
|
|
940
982
|
}
|
|
941
|
-
// 判断是否需要发送URL
|
|
942
|
-
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
943
|
-
// 如果pic存在,则直接返回pic
|
|
944
|
-
if (pic) {
|
|
945
|
-
this.logger.info('推送动态中,使用render模式');
|
|
946
|
-
// pic存在,使用的是render模式
|
|
947
|
-
await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
948
|
-
}
|
|
949
|
-
else if (buffer) {
|
|
950
|
-
this.logger.info('推送动态中,使用page模式');
|
|
951
|
-
// pic不存在,说明使用的是page模式
|
|
952
|
-
await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
953
|
-
}
|
|
954
|
-
else {
|
|
955
|
-
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
956
|
-
}
|
|
957
|
-
// 更新时间点
|
|
958
|
-
updatePoint(num);
|
|
959
983
|
}
|
|
960
984
|
}
|
|
985
|
+
finally {
|
|
986
|
+
flag = true;
|
|
987
|
+
}
|
|
961
988
|
};
|
|
962
989
|
}
|
|
963
990
|
debug_dynamicDetect(ctx, bot, uid, guildId) {
|
|
964
991
|
let firstSubscription = true;
|
|
965
992
|
let timePoint;
|
|
993
|
+
// 相当于锁的作用,防止上一个循环没处理完
|
|
994
|
+
let flag = true;
|
|
966
995
|
return async () => {
|
|
967
|
-
//
|
|
968
|
-
if (
|
|
969
|
-
this.logger.info(`UID:${uid}-动态监测开始`);
|
|
970
|
-
// 设置第一次的时间点
|
|
971
|
-
timePoint = ctx.ba.getTimeOfUTC8();
|
|
972
|
-
// 设置第一次为false
|
|
973
|
-
firstSubscription = false;
|
|
996
|
+
// 判断上一个循环是否完成
|
|
997
|
+
if (!flag)
|
|
974
998
|
return;
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
// 获取用户空间动态数据
|
|
978
|
-
let content;
|
|
999
|
+
flag = false;
|
|
1000
|
+
// 无论是否执行成功都要释放锁
|
|
979
1001
|
try {
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
switch (content.code) {
|
|
989
|
-
case -101: { // 账号未登录
|
|
990
|
-
// 输出日志
|
|
991
|
-
this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
992
|
-
// 发送私聊消息
|
|
993
|
-
await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
994
|
-
// 停止服务
|
|
995
|
-
await ctx.sm.disposePlugin();
|
|
996
|
-
// 结束循环
|
|
997
|
-
break;
|
|
998
|
-
}
|
|
999
|
-
case -352: { // 风控
|
|
1000
|
-
// 输出日志
|
|
1001
|
-
this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
1002
|
-
// 发送私聊消息
|
|
1003
|
-
await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
1004
|
-
// 停止服务
|
|
1005
|
-
await ctx.sm.disposePlugin();
|
|
1006
|
-
// 结束循环
|
|
1007
|
-
break;
|
|
1008
|
-
}
|
|
1009
|
-
case 4101128:
|
|
1010
|
-
case 4101129: { // 获取动态信息错误
|
|
1011
|
-
// 输出日志
|
|
1012
|
-
this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
|
|
1013
|
-
// 发送私聊消息
|
|
1014
|
-
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
1015
|
-
// 结束循环
|
|
1016
|
-
break;
|
|
1017
|
-
}
|
|
1018
|
-
default: { // 未知错误
|
|
1019
|
-
// 发送私聊消息
|
|
1020
|
-
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
1021
|
-
// 取消订阅
|
|
1022
|
-
this.unsubAll(ctx, bot, uid);
|
|
1023
|
-
// 结束循环
|
|
1024
|
-
break;
|
|
1025
|
-
}
|
|
1002
|
+
// 第一次订阅判断
|
|
1003
|
+
if (firstSubscription) {
|
|
1004
|
+
this.logger.info(`UID:${uid}-动态监测开始`);
|
|
1005
|
+
// 设置第一次的时间点
|
|
1006
|
+
timePoint = ctx.ba.getTimeOfUTC8();
|
|
1007
|
+
// 设置第一次为false
|
|
1008
|
+
firstSubscription = false;
|
|
1009
|
+
return;
|
|
1026
1010
|
}
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1011
|
+
this.logger.info(`UID:${uid}-获取动态信息中`);
|
|
1012
|
+
// 获取用户空间动态数据
|
|
1013
|
+
let content;
|
|
1014
|
+
try {
|
|
1015
|
+
content = await ctx.ba.getUserSpaceDynamic(uid);
|
|
1016
|
+
}
|
|
1017
|
+
catch (e) {
|
|
1018
|
+
return this.logger.error(`UID:${uid}-dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:${e.message}`);
|
|
1019
|
+
}
|
|
1020
|
+
this.logger.info(`UID:${uid}-判断动态信息是否正确`);
|
|
1021
|
+
// 判断是否出现其他问题
|
|
1022
|
+
if (content.code !== 0) {
|
|
1023
|
+
switch (content.code) {
|
|
1024
|
+
case -101: { // 账号未登录
|
|
1025
|
+
// 输出日志
|
|
1026
|
+
this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
1027
|
+
// 发送私聊消息
|
|
1028
|
+
await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
|
|
1029
|
+
// 停止服务
|
|
1030
|
+
await ctx.sm.disposePlugin();
|
|
1031
|
+
// 结束循环
|
|
1032
|
+
break;
|
|
1033
|
+
}
|
|
1034
|
+
case -352: { // 风控
|
|
1035
|
+
// 输出日志
|
|
1036
|
+
this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
1037
|
+
// 发送私聊消息
|
|
1038
|
+
await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
|
|
1039
|
+
// 停止服务
|
|
1040
|
+
await ctx.sm.disposePlugin();
|
|
1041
|
+
// 结束循环
|
|
1042
|
+
break;
|
|
1043
|
+
}
|
|
1044
|
+
case 4101128:
|
|
1045
|
+
case 4101129: { // 获取动态信息错误
|
|
1046
|
+
// 输出日志
|
|
1047
|
+
this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
|
|
1048
|
+
// 发送私聊消息
|
|
1049
|
+
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
1050
|
+
// 结束循环
|
|
1051
|
+
break;
|
|
1052
|
+
}
|
|
1053
|
+
default: { // 未知错误
|
|
1054
|
+
// 发送私聊消息
|
|
1055
|
+
await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
|
|
1056
|
+
// 取消订阅
|
|
1057
|
+
this.unsubAll(ctx, bot, uid);
|
|
1058
|
+
// 结束循环
|
|
1059
|
+
break;
|
|
1037
1060
|
}
|
|
1038
|
-
break;
|
|
1039
1061
|
}
|
|
1040
|
-
case 0: timePoint = items[num].modules.module_author.pub_ts;
|
|
1041
1062
|
}
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
//
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
let pic;
|
|
1053
|
-
let buffer;
|
|
1054
|
-
// 从动态数据中取出UP主名称和动态ID
|
|
1055
|
-
const upName = content.data.items[num].modules.module_author.name;
|
|
1056
|
-
const dynamicId = content.data.items[num].id_str;
|
|
1057
|
-
// 推送该条动态
|
|
1058
|
-
const attempts = 3;
|
|
1059
|
-
this.logger.info(`UID:${uid}-尝试渲染推送图片`);
|
|
1060
|
-
for (let i = 0; i < attempts; i++) {
|
|
1061
|
-
// 获取动态推送图片
|
|
1062
|
-
try {
|
|
1063
|
-
// 渲染图片
|
|
1064
|
-
const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
|
|
1065
|
-
// 赋值
|
|
1066
|
-
pic = gimgPic;
|
|
1067
|
-
buffer = gimgBuffer;
|
|
1068
|
-
// 成功则跳出循环
|
|
1063
|
+
// 获取数据内容
|
|
1064
|
+
const items = content.data.items;
|
|
1065
|
+
this.logger.info(`UID:${uid}-获取到的动态信息:${items.map(v => v.basic.rid_str).join('、')}`);
|
|
1066
|
+
// 定义方法:更新时间点为最新发布动态的发布时间
|
|
1067
|
+
const updatePoint = (num) => {
|
|
1068
|
+
switch (num) {
|
|
1069
|
+
case 1: {
|
|
1070
|
+
if (items[0].modules.module_tag) { // 存在置顶动态
|
|
1071
|
+
timePoint = items[num].modules.module_author.pub_ts;
|
|
1072
|
+
}
|
|
1069
1073
|
break;
|
|
1070
1074
|
}
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1075
|
+
case 0: timePoint = items[num].modules.module_author.pub_ts;
|
|
1076
|
+
}
|
|
1077
|
+
};
|
|
1078
|
+
// 发送请求 默认只查看配置文件规定数量的数据
|
|
1079
|
+
for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
|
|
1080
|
+
// 没有动态内容则直接跳过
|
|
1081
|
+
if (!items[num])
|
|
1082
|
+
continue;
|
|
1083
|
+
// 寻找发布时间比时间点更晚的动态
|
|
1084
|
+
if (items[num].modules.module_author.pub_ts > timePoint) {
|
|
1085
|
+
this.logger.info(`UID:${uid}-即将推送的动态:${items[num].basic.rid_str}`);
|
|
1086
|
+
// 定义变量
|
|
1087
|
+
let pic;
|
|
1088
|
+
let buffer;
|
|
1089
|
+
// 从动态数据中取出UP主名称和动态ID
|
|
1090
|
+
const upName = content.data.items[num].modules.module_author.name;
|
|
1091
|
+
const dynamicId = content.data.items[num].id_str;
|
|
1092
|
+
// 推送该条动态
|
|
1093
|
+
const attempts = 3;
|
|
1094
|
+
this.logger.info(`UID:${uid}-尝试渲染推送图片`);
|
|
1095
|
+
for (let i = 0; i < attempts; i++) {
|
|
1096
|
+
// 获取动态推送图片
|
|
1097
|
+
try {
|
|
1098
|
+
// 渲染图片
|
|
1099
|
+
const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
|
|
1100
|
+
// 赋值
|
|
1101
|
+
pic = gimgPic;
|
|
1102
|
+
buffer = gimgBuffer;
|
|
1103
|
+
// 成功则跳出循环
|
|
1104
|
+
break;
|
|
1083
1105
|
}
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1106
|
+
catch (e) {
|
|
1107
|
+
// 直播开播动态,不做处理
|
|
1108
|
+
if (e.message === '直播开播动态,不做处理')
|
|
1109
|
+
return updatePoint(num);
|
|
1110
|
+
if (e.message === '出现关键词,屏蔽该动态') {
|
|
1111
|
+
// 如果需要发送才发送
|
|
1112
|
+
this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
|
|
1113
|
+
return updatePoint(num);
|
|
1114
|
+
}
|
|
1115
|
+
if (e.message === '已屏蔽转发动态') {
|
|
1116
|
+
this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
|
|
1117
|
+
return updatePoint(num);
|
|
1118
|
+
}
|
|
1119
|
+
// 未知错误
|
|
1120
|
+
if (i === attempts - 1) {
|
|
1121
|
+
this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
|
|
1122
|
+
// 发送私聊消息并重启服务
|
|
1123
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
1124
|
+
}
|
|
1089
1125
|
}
|
|
1090
1126
|
}
|
|
1127
|
+
this.logger.info(`UID:${uid}-尝试推送动态卡片`);
|
|
1128
|
+
// 判断是否需要发送URL
|
|
1129
|
+
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
1130
|
+
// 如果pic存在,则直接返回pic
|
|
1131
|
+
if (pic) {
|
|
1132
|
+
this.logger.info(`UID:${uid}-推送动态中,使用render模式`);
|
|
1133
|
+
// pic存在,使用的是render模式
|
|
1134
|
+
await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
1135
|
+
}
|
|
1136
|
+
else if (buffer) {
|
|
1137
|
+
this.logger.info(`UID:${uid}-推送动态中,使用page模式`);
|
|
1138
|
+
// pic不存在,说明使用的是page模式
|
|
1139
|
+
await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
1140
|
+
}
|
|
1141
|
+
else {
|
|
1142
|
+
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
1143
|
+
}
|
|
1144
|
+
// 更新时间点
|
|
1145
|
+
updatePoint(num);
|
|
1146
|
+
this.logger.info(`UID:${uid}-推送动态完成`);
|
|
1091
1147
|
}
|
|
1092
|
-
this.logger.info(`UID:${uid}-尝试推送动态卡片`);
|
|
1093
|
-
// 判断是否需要发送URL
|
|
1094
|
-
const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
|
|
1095
|
-
// 如果pic存在,则直接返回pic
|
|
1096
|
-
if (pic) {
|
|
1097
|
-
this.logger.info(`UID:${uid}-推送动态中,使用render模式`);
|
|
1098
|
-
// pic存在,使用的是render模式
|
|
1099
|
-
await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
|
|
1100
|
-
}
|
|
1101
|
-
else if (buffer) {
|
|
1102
|
-
this.logger.info(`UID:${uid}-推送动态中,使用page模式`);
|
|
1103
|
-
// pic不存在,说明使用的是page模式
|
|
1104
|
-
await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
|
|
1105
|
-
}
|
|
1106
|
-
else {
|
|
1107
|
-
this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
|
|
1108
|
-
}
|
|
1109
|
-
// 更新时间点
|
|
1110
|
-
updatePoint(num);
|
|
1111
|
-
this.logger.info(`UID:${uid}-推送动态完成`);
|
|
1112
1148
|
}
|
|
1113
1149
|
}
|
|
1150
|
+
finally {
|
|
1151
|
+
flag = true;
|
|
1152
|
+
}
|
|
1114
1153
|
};
|
|
1115
1154
|
}
|
|
1116
1155
|
liveDetect(ctx, bot, roomId, guildId) {
|
|
@@ -1145,7 +1184,8 @@ class ComRegister {
|
|
|
1145
1184
|
catch (e) {
|
|
1146
1185
|
if (i === attempts - 1) { // 已尝试三次
|
|
1147
1186
|
this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
|
|
1148
|
-
|
|
1187
|
+
// 发送私聊消息并重启服务
|
|
1188
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
1149
1189
|
}
|
|
1150
1190
|
}
|
|
1151
1191
|
}
|
|
@@ -1180,7 +1220,8 @@ class ComRegister {
|
|
|
1180
1220
|
catch (e) {
|
|
1181
1221
|
if (i === attempts - 1) { // 已尝试三次
|
|
1182
1222
|
this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
|
|
1183
|
-
|
|
1223
|
+
// 发送私聊消息并重启服务
|
|
1224
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
1184
1225
|
}
|
|
1185
1226
|
}
|
|
1186
1227
|
}
|
|
@@ -1212,11 +1253,12 @@ class ComRegister {
|
|
|
1212
1253
|
};
|
|
1213
1254
|
}
|
|
1214
1255
|
return async () => {
|
|
1256
|
+
// 如果flag为false则说明前面的代码还未执行完,则直接返回
|
|
1257
|
+
if (!flag)
|
|
1258
|
+
return;
|
|
1259
|
+
flag = false;
|
|
1260
|
+
// 无论是否执行成功都要释放锁
|
|
1215
1261
|
try {
|
|
1216
|
-
// 如果flag为false则说明前面的代码还未执行完,则直接返回
|
|
1217
|
-
if (!flag)
|
|
1218
|
-
return;
|
|
1219
|
-
flag = false;
|
|
1220
1262
|
// 发送请求检测直播状态
|
|
1221
1263
|
let content;
|
|
1222
1264
|
const attempts = 3;
|
|
@@ -1230,7 +1272,8 @@ class ComRegister {
|
|
|
1230
1272
|
catch (e) {
|
|
1231
1273
|
this.logger.error('liveDetect getLiveRoomInfo 发生了错误,错误为:' + e.message);
|
|
1232
1274
|
if (i === attempts - 1) { // 已尝试三次
|
|
1233
|
-
|
|
1275
|
+
// 发送私聊消息并重启服务
|
|
1276
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
1234
1277
|
}
|
|
1235
1278
|
}
|
|
1236
1279
|
}
|
|
@@ -1250,7 +1293,8 @@ class ComRegister {
|
|
|
1250
1293
|
catch (e) {
|
|
1251
1294
|
this.logger.error('liveDetect getMasterInfo() 发生了错误,错误为:' + e.message);
|
|
1252
1295
|
if (i === attempts - 1) { // 已尝试三次
|
|
1253
|
-
|
|
1296
|
+
// 发送私聊消息并重启服务
|
|
1297
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
1254
1298
|
}
|
|
1255
1299
|
}
|
|
1256
1300
|
}
|
|
@@ -1317,7 +1361,8 @@ class ComRegister {
|
|
|
1317
1361
|
catch (e) {
|
|
1318
1362
|
this.logger.error('liveDetect open getMasterInfo() 发生了错误,错误为:' + e.message);
|
|
1319
1363
|
if (i === attempts - 1) { // 已尝试三次
|
|
1320
|
-
|
|
1364
|
+
// 发送私聊消息并重启服务
|
|
1365
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
1321
1366
|
}
|
|
1322
1367
|
}
|
|
1323
1368
|
}
|
|
@@ -1525,7 +1570,8 @@ class ComRegister {
|
|
|
1525
1570
|
catch (e) {
|
|
1526
1571
|
this.logger.error('getSubFromDatabase() getUserInfo() 发生了错误,错误为:' + e.message);
|
|
1527
1572
|
if (i === attempts - 1) { // 已尝试三次
|
|
1528
|
-
|
|
1573
|
+
// 发送私聊消息并重启服务
|
|
1574
|
+
return await this.sendPrivateMsgAndRebootService(ctx, bot);
|
|
1529
1575
|
}
|
|
1530
1576
|
}
|
|
1531
1577
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export interface Config {
|
|
|
18
18
|
dynamic: {};
|
|
19
19
|
dynamicUrl: boolean;
|
|
20
20
|
dynamicCheckNumber: number;
|
|
21
|
-
dynamicLoopTime: '1分钟' | '2分钟' | '3分钟' | '5分钟';
|
|
21
|
+
dynamicLoopTime: '1分钟' | '2分钟' | '3分钟' | '5分钟' | '20分钟';
|
|
22
22
|
live: {};
|
|
23
23
|
changeMasterInfoApi: boolean;
|
|
24
24
|
liveStartAtAll: boolean;
|
|
@@ -42,12 +42,11 @@ declare class ServerManager extends Service {
|
|
|
42
42
|
servers: ForkScope[];
|
|
43
43
|
renderType: number;
|
|
44
44
|
dynamicLoopTime: number;
|
|
45
|
-
restartCount: number;
|
|
46
45
|
constructor(ctx: Context);
|
|
47
46
|
protected start(): void | Promise<void>;
|
|
48
47
|
registerPlugin: () => Promise<boolean>;
|
|
49
48
|
disposePlugin: () => Promise<boolean>;
|
|
50
|
-
restartPlugin: (
|
|
49
|
+
restartPlugin: () => Promise<boolean>;
|
|
51
50
|
}
|
|
52
51
|
export declare function apply(ctx: Context, config: Config): void;
|
|
53
52
|
export {};
|
package/lib/index.js
CHANGED
|
@@ -93,7 +93,7 @@ exports.Config = koishi_1.Schema.object({
|
|
|
93
93
|
.step(1)
|
|
94
94
|
.default(5)
|
|
95
95
|
.description('设定每次检查动态的数量。若订阅的UP主经常在短时间内连着发多条动态可以将该值提高,若订阅的UP主有置顶动态,在计算该值时应+1。默认值为5条'),
|
|
96
|
-
dynamicLoopTime: koishi_1.Schema.union(['1分钟', '2分钟', '3分钟', '5分钟'])
|
|
96
|
+
dynamicLoopTime: koishi_1.Schema.union(['1分钟', '2分钟', '3分钟', '5分钟', '20分钟'])
|
|
97
97
|
.role('')
|
|
98
98
|
.default('2分钟')
|
|
99
99
|
.description('设定多久检测一次动态。若需动态的时效性,可以设置为1分钟。若订阅的UP主经常在短时间内连着发多条动态应该将该值提高,否则会出现动态漏推送和晚推送的问题,默认值为2分钟'),
|
|
@@ -178,8 +178,6 @@ class ServerManager extends koishi_1.Service {
|
|
|
178
178
|
renderType;
|
|
179
179
|
// 动态循环时间
|
|
180
180
|
dynamicLoopTime;
|
|
181
|
-
// 重启次数
|
|
182
|
-
restartCount = 0;
|
|
183
181
|
constructor(ctx) {
|
|
184
182
|
super(ctx, 'sm');
|
|
185
183
|
// 插件运行相关指令
|
|
@@ -243,6 +241,9 @@ class ServerManager extends koishi_1.Service {
|
|
|
243
241
|
case '5分钟':
|
|
244
242
|
this.dynamicLoopTime = 300;
|
|
245
243
|
break;
|
|
244
|
+
case '20分钟':
|
|
245
|
+
this.dynamicLoopTime = 1200;
|
|
246
|
+
break;
|
|
246
247
|
}
|
|
247
248
|
// 注册插件
|
|
248
249
|
this.registerPlugin();
|
|
@@ -310,29 +311,25 @@ class ServerManager extends koishi_1.Service {
|
|
|
310
311
|
// 成功返回true
|
|
311
312
|
return true;
|
|
312
313
|
};
|
|
313
|
-
restartPlugin = async (
|
|
314
|
+
restartPlugin = async () => {
|
|
314
315
|
// 如果没有服务则返回false
|
|
315
316
|
if (this.servers.length === 0)
|
|
316
317
|
return false;
|
|
317
|
-
// 如果需要计数
|
|
318
|
-
if (count) {
|
|
319
|
-
// 重启次数大于等于3次
|
|
320
|
-
if (this.restartCount >= 3)
|
|
321
|
-
return false;
|
|
322
|
-
// 重启次数+1
|
|
323
|
-
this.restartCount++;
|
|
324
|
-
}
|
|
325
318
|
// 停用插件
|
|
326
319
|
await this.disposePlugin();
|
|
327
320
|
// 隔一秒启动插件
|
|
328
|
-
|
|
321
|
+
return new Promise(resolve => {
|
|
329
322
|
this.ctx.setTimeout(async () => {
|
|
330
|
-
|
|
331
|
-
|
|
323
|
+
try {
|
|
324
|
+
await this.registerPlugin();
|
|
325
|
+
}
|
|
326
|
+
catch (e) {
|
|
327
|
+
this.logger.error('重启插件失败', e);
|
|
328
|
+
resolve(false);
|
|
329
|
+
}
|
|
330
|
+
resolve(true);
|
|
332
331
|
}, 1000);
|
|
333
332
|
});
|
|
334
|
-
// 成功返回true
|
|
335
|
-
return true;
|
|
336
333
|
};
|
|
337
334
|
}
|
|
338
335
|
function apply(ctx, config) {
|
package/package.json
CHANGED