koishi-plugin-bilibili-notify 1.2.11-alpha.0 → 1.2.12-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/biliAPI.js CHANGED
@@ -40,10 +40,11 @@ class BiliAPI extends koishi_1.Service {
40
40
  this.createNewClient();
41
41
  // 从数据库加载cookies
42
42
  this.loadCookiesFromDatabase();
43
- // this.logger.info('工作中')
43
+ // 输出日志
44
+ this.logger.info('工作中');
44
45
  }
45
46
  stop() {
46
- // this.logger.info('已停止工作')
47
+ this.logger.info('已停止工作');
47
48
  }
48
49
  async getServerUTCTime() {
49
50
  try {
@@ -364,7 +364,7 @@ class ComRegister {
364
364
  content = await ctx.biliAPI.getUserInfo(mid);
365
365
  }
366
366
  catch (e) {
367
- return 'bili sub getUserInfo() 发生了错误,错误为:' + e.toString();
367
+ return 'bili sub getUserInfo() 发生了错误,错误为:' + e.message;
368
368
  }
369
369
  // 判断是否有其他问题
370
370
  if (content.code !== 0) {
@@ -501,7 +501,7 @@ class ComRegister {
501
501
  userData = data;
502
502
  }
503
503
  catch (e) {
504
- this.logger.error('bili sub指令 getMasterInfo() 发生了错误,错误为:' + e.toString());
504
+ this.logger.error('bili sub指令 getMasterInfo() 发生了错误,错误为:' + e.message);
505
505
  return '订阅出错啦,请重试';
506
506
  }
507
507
  // 需要订阅直播
@@ -577,7 +577,7 @@ class ComRegister {
577
577
  content = await ctx.biliAPI.getLiveRoomInfo(roomId);
578
578
  }
579
579
  catch (e) {
580
- return 'bili status指令 getLiveRoomInfo() 发生了错误,错误为:' + e.toString();
580
+ return 'bili status指令 getLiveRoomInfo() 发生了错误,错误为:' + e.message;
581
581
  }
582
582
  const { data } = content;
583
583
  let userData;
@@ -586,7 +586,7 @@ class ComRegister {
586
586
  userData = userInfo;
587
587
  }
588
588
  catch (e) {
589
- return 'bili status指令 getMasterInfo() 发生了错误,错误为:' + e.toString();
589
+ return 'bili status指令 getMasterInfo() 发生了错误,错误为:' + e.message;
590
590
  }
591
591
  // B站出问题了
592
592
  if (content.code !== 0) {
@@ -715,7 +715,7 @@ class ComRegister {
715
715
  async sendPrivateMsgAndRebootService(ctx, bot, content) {
716
716
  await this.sendPrivateMsg(bot, content);
717
717
  // 重启插件
718
- const flag = ctx.sm.restartPlugin();
718
+ const flag = await ctx.sm.restartPlugin(true /* 非人为重启,需要计数 */);
719
719
  // 判断是否重启成功
720
720
  if (flag) {
721
721
  this.logger.info('重启插件成功');
@@ -726,7 +726,7 @@ class ComRegister {
726
726
  // 重启失败,发送消息
727
727
  await this.sendPrivateMsg(bot, '已重启插件三次,请检查机器人状态后手动重启');
728
728
  // 关闭插件
729
- ctx.sm.disposePlugin();
729
+ await ctx.sm.disposePlugin();
730
730
  }
731
731
  }
732
732
  async sendMsg(ctx, targets, bot, content) {
@@ -757,7 +757,7 @@ class ComRegister {
757
757
  }
758
758
  catch (e) {
759
759
  if (i === attempts - 1) { // 已尝试三次
760
- this.logger.error(`发送群组ID:${guildId}消息失败!原因: ` + e.toString());
760
+ this.logger.error(`发送群组ID:${guildId}消息失败!原因: ` + e.message);
761
761
  this.sendPrivateMsg(bot, `发送群组ID:${guildId}消息失败,请检查机器人状态`);
762
762
  }
763
763
  }
@@ -782,7 +782,7 @@ class ComRegister {
782
782
  content = await ctx.biliAPI.getUserSpaceDynamic(uid);
783
783
  }
784
784
  catch (e) {
785
- return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.toString());
785
+ return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
786
786
  }
787
787
  // 判断是否出现其他问题
788
788
  if (content.code !== 0) {
@@ -791,18 +791,37 @@ class ComRegister {
791
791
  await this.sendPrivateMsg(bot, '账号未登录,请登录后重新订阅动态');
792
792
  break;
793
793
  }
794
- default: await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
794
+ case -352: { // 风控
795
+ // 发送私聊消息
796
+ await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
797
+ // 停止服务
798
+ await ctx.sm.disposePlugin();
799
+ // 结束循环
800
+ return;
801
+ }
802
+ default: { // 未知错误
803
+ await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
804
+ // 取消订阅
805
+ this.unsubAll(ctx, bot, uid);
806
+ // 结束循环
807
+ return;
808
+ }
795
809
  }
796
- // 取消订阅
797
- this.unsubAll(ctx, bot, uid);
798
- // this.unsubSingle(ctx, uid, 1) /* 1为取消动态订阅 */
799
- // 发送取消订阅消息
800
- // await this.sendPrivateMsg(bot, `UID:${uid},已取消订阅动态`)
801
- // 结束循环
802
- return;
803
810
  }
804
811
  // 获取数据内容
805
812
  const items = content.data.items;
813
+ // 定义方法:更新时间点为最新发布动态的发布时间
814
+ const updatePoint = (num) => {
815
+ switch (num) {
816
+ case 1: {
817
+ if (items[0].modules.module_tag) { // 存在置顶动态
818
+ timePoint = items[num].modules.module_author.pub_ts;
819
+ }
820
+ break;
821
+ }
822
+ case 0: timePoint = items[num].modules.module_author.pub_ts;
823
+ }
824
+ };
806
825
  // 发送请求 默认只查看配置文件规定数量的数据
807
826
  for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
808
827
  // 没有动态内容则直接跳过
@@ -823,25 +842,28 @@ class ComRegister {
823
842
  try {
824
843
  // 渲染图片
825
844
  const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gimg.generateDynamicImg(items[num]);
845
+ // 赋值
826
846
  pic = gimgPic;
827
847
  buffer = gimgBuffer;
848
+ // 成功则跳出循环
849
+ break;
828
850
  }
829
851
  catch (e) {
830
852
  // 直播开播动态,不做处理
831
853
  if (e.message === '直播开播动态,不做处理')
832
- break;
854
+ return updatePoint(num);
833
855
  if (e.message === '出现关键词,屏蔽该动态') {
834
856
  // 如果需要发送才发送
835
857
  this.config.filter.notify && await this.sendMsg(ctx, guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
836
- break;
858
+ return updatePoint(num);
837
859
  }
838
860
  if (e.message === '已屏蔽转发动态') {
839
861
  this.config.filter.notify && await this.sendMsg(ctx, guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
840
- break;
862
+ return updatePoint(num);
841
863
  }
842
864
  // 未知错误
843
865
  if (i === attempts - 1) {
844
- this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.toString());
866
+ this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
845
867
  // 发送私聊消息并重启服务
846
868
  return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
847
869
  }
@@ -855,21 +877,16 @@ class ComRegister {
855
877
  // pic存在,使用的是render模式
856
878
  await this.sendMsg(ctx, guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
857
879
  }
858
- else {
880
+ else if (buffer) {
859
881
  this.logger.info('推送动态中,使用page模式');
860
882
  // pic不存在,说明使用的是page模式
861
- await this.sendMsg(ctx, guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("img", { src: 'data:image/png;base64,' + buffer.toString('base64') }), " ", dUrl] }));
883
+ await this.sendMsg(ctx, guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), " ", dUrl] }));
862
884
  }
863
- // 更新时间点为最新发布动态的发布时间
864
- switch (num) {
865
- case 1: {
866
- if (items[0].modules.module_tag) { // 存在置顶动态
867
- timePoint = items[num].modules.module_author.pub_ts;
868
- }
869
- break;
870
- }
871
- case 0: timePoint = items[num].modules.module_author.pub_ts;
885
+ else {
886
+ this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
872
887
  }
888
+ // 更新时间点
889
+ updatePoint(num);
873
890
  }
874
891
  }
875
892
  };
@@ -900,7 +917,7 @@ class ComRegister {
900
917
  }
901
918
  catch (e) {
902
919
  if (i === attempts - 1) { // 已尝试三次
903
- this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.toString());
920
+ this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
904
921
  return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
905
922
  }
906
923
  }
@@ -912,7 +929,7 @@ class ComRegister {
912
929
  return await this.sendMsg(ctx, guildId, bot, pic + msg);
913
930
  }
914
931
  // pic不存在,说明使用的是page模式
915
- await this.sendMsg(ctx, guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("img", { src: 'data:image/png;base64,' + buffer.toString('base64') }), " ", atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), " ", liveStartMsg && liveStartMsg] }));
932
+ await this.sendMsg(ctx, guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), " ", atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), " ", liveStartMsg && liveStartMsg] }));
916
933
  };
917
934
  return async () => {
918
935
  try {
@@ -931,7 +948,7 @@ class ComRegister {
931
948
  break;
932
949
  }
933
950
  catch (e) {
934
- this.logger.error('liveDetect getLiveRoomInfo 发生了错误,错误为:' + e.toString());
951
+ this.logger.error('liveDetect getLiveRoomInfo 发生了错误,错误为:' + e.message);
935
952
  if (i === attempts - 1) { // 已尝试三次
936
953
  return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
937
954
  }
@@ -953,7 +970,7 @@ class ComRegister {
953
970
  break;
954
971
  }
955
972
  catch (e) {
956
- this.logger.error('liveDetect getMasterInfo() 发生了错误,错误为:' + e.toString());
973
+ this.logger.error('liveDetect getMasterInfo() 发生了错误,错误为:' + e.message);
957
974
  if (i === attempts - 1) { // 已尝试三次
958
975
  return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
959
976
  }
@@ -1023,7 +1040,7 @@ class ComRegister {
1023
1040
  break;
1024
1041
  }
1025
1042
  catch (e) {
1026
- this.logger.error('liveDetect open getMasterInfo() 发生了错误,错误为:' + e.toString());
1043
+ this.logger.error('liveDetect open getMasterInfo() 发生了错误,错误为:' + e.message);
1027
1044
  if (i === attempts - 1) { // 已尝试三次
1028
1045
  return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
1029
1046
  }
@@ -1230,7 +1247,7 @@ class ComRegister {
1230
1247
  break;
1231
1248
  }
1232
1249
  catch (e) {
1233
- this.logger.error('getSubFromDatabase() getUserInfo() 发生了错误,错误为:' + e.toString());
1250
+ this.logger.error('getSubFromDatabase() getUserInfo() 发生了错误,错误为:' + e.message);
1234
1251
  if (i === attempts - 1) { // 已尝试三次
1235
1252
  return await this.sendPrivateMsgAndRebootService(ctx, bot, '你的网络可能出现了某些问题,请检查后重启插件');
1236
1253
  }
@@ -44,10 +44,10 @@ class GenerateImg extends koishi_1.Service {
44
44
  this.giConfig = config;
45
45
  }
46
46
  start() {
47
- // this.logger.info('工作中');
47
+ this.logger.info('工作中');
48
48
  }
49
49
  stop() {
50
- // this.logger.info('已停止工作')
50
+ this.logger.info('已停止工作');
51
51
  }
52
52
  async generateLiveImg(data, userData, liveStatus /*0未开播 1刚开播 2已开播 */) {
53
53
  const [titleStatus, liveTime, cover] = await this.getLiveStatus(data.live_time, liveStatus);
package/lib/index.d.ts CHANGED
@@ -38,9 +38,9 @@ declare class ServerManager extends Service {
38
38
  restartCount: number;
39
39
  constructor(ctx: Context);
40
40
  protected start(): void | Promise<void>;
41
- registerPlugin: () => void;
42
- disposePlugin: () => void;
43
- restartPlugin: () => boolean;
41
+ registerPlugin: () => Promise<boolean>;
42
+ disposePlugin: () => Promise<boolean>;
43
+ restartPlugin: (count?: boolean) => Promise<boolean>;
44
44
  }
45
45
  export declare function apply(ctx: Context, config: Config): void;
46
46
  export {};
package/lib/index.js CHANGED
@@ -160,6 +160,41 @@ class ServerManager extends koishi_1.Service {
160
160
  restartCount = 0;
161
161
  constructor(ctx) {
162
162
  super(ctx, 'sm');
163
+ // 插件运行相关指令
164
+ const sysCom = ctx.command('sys', 'bili-notify插件运行相关指令', { permissions: ['authority:5'] });
165
+ sysCom
166
+ .subcommand('.restart', '重启插件')
167
+ .usage('重启插件')
168
+ .example('sys restart')
169
+ .action(async () => {
170
+ this.logger.info('调用sys restart指令');
171
+ if (await this.restartPlugin()) {
172
+ return '插件重启成功';
173
+ }
174
+ return '插件重启失败';
175
+ });
176
+ sysCom
177
+ .subcommand('.stop', '停止插件')
178
+ .usage('停止插件')
179
+ .example('sys stop')
180
+ .action(async () => {
181
+ this.logger.info('调用sys stop指令');
182
+ if (await this.disposePlugin()) {
183
+ return '插件已停止';
184
+ }
185
+ return '停止插件失败';
186
+ });
187
+ sysCom
188
+ .subcommand('.start', '启动插件')
189
+ .usage('启动插件')
190
+ .example('sys start')
191
+ .action(async () => {
192
+ this.logger.info('调用sys start指令');
193
+ if (await this.registerPlugin()) {
194
+ return '插件启动成功';
195
+ }
196
+ return '插件启动失败';
197
+ });
163
198
  }
164
199
  start() {
165
200
  // 根据用户设置的渲染模式设置
@@ -174,40 +209,71 @@ class ServerManager extends koishi_1.Service {
174
209
  // 注册插件
175
210
  this.registerPlugin();
176
211
  }
177
- registerPlugin = () => {
178
- const biliApi = this.ctx.plugin(biliAPI_1.default, {
179
- userAgent: globalConfig.userAgent
180
- });
181
- const generateImg = this.ctx.plugin(generateImg_1.default, {
182
- renderType: this.renderType,
183
- filter: globalConfig.filter,
184
- removeBorder: globalConfig.removeBorder,
185
- cardColorStart: globalConfig.cardColorStart,
186
- cardColorEnd: globalConfig.cardColorEnd,
187
- enableLargeFont: globalConfig.enableLargeFont,
188
- font: globalConfig.font
212
+ registerPlugin = async () => {
213
+ // 如果已经有服务则返回false
214
+ if (this.servers.length !== 0)
215
+ return false;
216
+ await new Promise(resolve => {
217
+ // 注册插件
218
+ const biliApi = this.ctx.plugin(biliAPI_1.default, {
219
+ userAgent: globalConfig.userAgent
220
+ });
221
+ const generateImg = this.ctx.plugin(generateImg_1.default, {
222
+ renderType: this.renderType,
223
+ filter: globalConfig.filter,
224
+ removeBorder: globalConfig.removeBorder,
225
+ cardColorStart: globalConfig.cardColorStart,
226
+ cardColorEnd: globalConfig.cardColorEnd,
227
+ enableLargeFont: globalConfig.enableLargeFont,
228
+ font: globalConfig.font
229
+ });
230
+ // 添加服务
231
+ this.servers.push(biliApi);
232
+ this.servers.push(generateImg);
233
+ // 成功
234
+ resolve('ok');
189
235
  });
190
- this.servers.push(biliApi);
191
- this.servers.push(generateImg);
236
+ // 成功返回true
237
+ return true;
192
238
  };
193
- disposePlugin = () => {
194
- this.servers.forEach(fork => {
195
- fork.dispose();
239
+ disposePlugin = async () => {
240
+ // 如果没有服务则返回false
241
+ if (this.servers.length === 0)
242
+ return false;
243
+ // 遍历服务
244
+ await new Promise(resolve => {
245
+ this.servers.forEach(fork => {
246
+ fork.dispose();
247
+ });
248
+ // 清空服务
249
+ this.servers = [];
250
+ resolve('ok');
196
251
  });
252
+ // 成功返回true
253
+ return true;
197
254
  };
198
- restartPlugin = () => {
199
- // 重启次数大于等于3次
200
- if (this.restartCount >= 3)
255
+ restartPlugin = async (count /* 是否需要计数 */) => {
256
+ // 如果没有服务则返回false
257
+ if (this.servers.length === 0)
201
258
  return false;
202
- // 重启次数+1
203
- this.restartCount++;
259
+ // 如果需要计数
260
+ if (count) {
261
+ // 重启次数大于等于3次
262
+ if (this.restartCount >= 3)
263
+ return false;
264
+ // 重启次数+1
265
+ this.restartCount++;
266
+ }
204
267
  // 停用插件
205
- this.disposePlugin();
268
+ await this.disposePlugin();
206
269
  // 隔一秒启动插件
207
- this.ctx.setTimeout(() => {
208
- this.registerPlugin();
209
- }, 1000);
210
- // 返回true
270
+ await new Promise(resolve => {
271
+ this.ctx.setTimeout(async () => {
272
+ await this.registerPlugin();
273
+ resolve('ok');
274
+ }, 1000);
275
+ });
276
+ // 成功返回true
211
277
  return true;
212
278
  };
213
279
  }
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.2.11-alpha.0",
4
+ "version": "1.2.12-alpha.0",
5
5
  "contributors": [
6
6
  "Akokko <admin@akokko.com>"
7
7
  ],
package/readme.md CHANGED
@@ -67,6 +67,11 @@
67
67
 
68
68
  - 使用指令 `bili show`
69
69
 
70
+ 插件的启动、停止和重启
71
+
72
+ - 使用指令 `sys`
73
+ - 子命令:`start`、`stop`、`restart` 分别代表插件的启动,停止和重启
74
+
70
75
  ## 注意事项
71
76
 
72
77
  1. 此插件依赖于 `database` 和 `puppeteer` 服务,同时受权限控制,需要具备 `authority:3` 及以上的权限才能使用本插件提供的指令,你可以参考下方配置登录插件中的方法得到一个超级管理员账号(具有 `authority:5` 的最高权限)
@@ -145,6 +150,8 @@
145
150
  - ver 1.2.9-alpha.0 bug测试版本,请跳过
146
151
  - ver 1.2.10 修复插件启动一段时间后一直报错的问题,更新了UA列表,新增了更多日志输出
147
152
  - ver 1.2.11-alpha.0 新增自定义UA的设置。动态推送出错时,现在会直接取消订阅该UP主而不是取消订阅动态
153
+ - ver 1.2.11-alpha.1 修复报错 `app TypeError: Cannot read properties of undefined (reading 'toString')`,添加更多日志输出
154
+ - ver 1.2.12-alpha.0 新增 `sys` 类指令,包括子命令:`start`、`stop`、`restart` 分别为插件的启动、停止和重启,需要权限等级5才能使用。现在,账号出现某些问题后,不会再清除订阅信息,而是停止插件,在排除问题后需要使用指令 `sys start` 手动启动插件。修复一个动态推送的bug
148
155
 
149
156
  ## 交流群
150
157