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.
@@ -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>, content: string): Promise<void>;
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>;
@@ -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, content) {
784
- await this.sendPrivateMsg(bot, content);
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(true /* 非人为重启,需要计数 */);
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 (firstSubscription) {
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
- content = await ctx.ba.getUserSpaceDynamic(uid);
834
- }
835
- catch (e) {
836
- return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
837
- }
838
- // 判断是否出现其他问题
839
- if (content.code !== 0) {
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
- const items = content.data.items;
882
- // 定义方法:更新时间点为最新发布动态的发布时间
883
- const updatePoint = (num) => {
884
- switch (num) {
885
- case 1: {
886
- if (items[0].modules.module_tag) { // 存在置顶动态
887
- timePoint = items[num].modules.module_author.pub_ts;
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
- for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
896
- // 没有动态内容则直接跳过
897
- if (!items[num])
898
- continue;
899
- // 寻找发布时间比时间点更晚的动态
900
- if (items[num].modules.module_author.pub_ts > timePoint) {
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
- catch (e) {
921
- // 直播开播动态,不做处理
922
- if (e.message === '直播开播动态,不做处理')
923
- return updatePoint(num);
924
- if (e.message === '出现关键词,屏蔽该动态') {
925
- // 如果需要发送才发送
926
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
927
- return updatePoint(num);
928
- }
929
- if (e.message === '已屏蔽转发动态') {
930
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
931
- return updatePoint(num);
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
- if (i === attempts - 1) {
935
- this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
936
- // 发送私聊消息并重启服务
937
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
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 (firstSubscription) {
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
- this.logger.info(`UID:${uid}-获取动态信息中`);
977
- // 获取用户空间动态数据
978
- let content;
999
+ flag = false;
1000
+ // 无论是否执行成功都要释放锁
979
1001
  try {
980
- content = await ctx.ba.getUserSpaceDynamic(uid);
981
- }
982
- catch (e) {
983
- return this.logger.error(`UID:${uid}-dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:${e.message}`);
984
- }
985
- this.logger.info(`UID:${uid}-判断动态信息是否正确`);
986
- // 判断是否出现其他问题
987
- if (content.code !== 0) {
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
- const items = content.data.items;
1030
- this.logger.info(`UID:${uid}-获取到的动态信息:${items.map(v => v.basic.rid_str).join('、')}`);
1031
- // 定义方法:更新时间点为最新发布动态的发布时间
1032
- const updatePoint = (num) => {
1033
- switch (num) {
1034
- case 1: {
1035
- if (items[0].modules.module_tag) { // 存在置顶动态
1036
- timePoint = items[num].modules.module_author.pub_ts;
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
- for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
1045
- // 没有动态内容则直接跳过
1046
- if (!items[num])
1047
- continue;
1048
- // 寻找发布时间比时间点更晚的动态
1049
- if (items[num].modules.module_author.pub_ts > timePoint) {
1050
- this.logger.info(`UID:${uid}-即将推送的动态:${items[num].basic.rid_str}`);
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
- catch (e) {
1072
- // 直播开播动态,不做处理
1073
- if (e.message === '直播开播动态,不做处理')
1074
- return updatePoint(num);
1075
- if (e.message === '出现关键词,屏蔽该动态') {
1076
- // 如果需要发送才发送
1077
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
1078
- return updatePoint(num);
1079
- }
1080
- if (e.message === '已屏蔽转发动态') {
1081
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
1082
- return updatePoint(num);
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
- if (i === attempts - 1) {
1086
- this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
1087
- // 发送私聊消息并重启服务
1088
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
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
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
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
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
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
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
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
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
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
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
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
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '你的网络可能出现了某些问题,请检查后重启插件');
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: (count?: boolean) => Promise<boolean>;
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 (count /* 是否需要计数 */) => {
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
- await new Promise(resolve => {
321
+ return new Promise(resolve => {
329
322
  this.ctx.setTimeout(async () => {
330
- await this.registerPlugin();
331
- resolve('ok');
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-bilibili-notify",
3
3
  "description": "Koishi bilibili notify plugin",
4
- "version": "1.3.4",
4
+ "version": "1.3.6-alpha.0",
5
5
  "contributors": [
6
6
  "Akokko <admin@akokko.com>"
7
7
  ],
package/readme.md CHANGED
@@ -170,6 +170,8 @@
170
170
  - ver 1.3.2 增加对飞书平台的支持
171
171
  - ver 1.3.3 新增直播推送人气信息展示
172
172
  - ver 1.3.4 新增消息推送失败是否自动重发的选项,修复了一些潜在的bug
173
+ - ver 1.3.5 动态监测循环时间新增20分钟选项
174
+ - ver 1.3.6-alpha.0 修复bug:无限重复的报错提示
173
175
 
174
176
  ## 交流群
175
177