koishi-plugin-bilibili-notify 2.0.0-alpha.2 → 2.0.0-alpha.4

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/README.md CHANGED
@@ -178,8 +178,10 @@
178
178
  - ver 1.3.7 新增设置项:插件重启后是否进行直播推送。优化直播人气显示
179
179
 
180
180
  - ver 2.0.0-alpha.0 重构:对动态订阅进行了重构,优化了订阅流程
181
- - ver 2.0.0-alpha.1 修复bug:无法成功取消订阅自己、用户没有直播间订阅直播出错。对直播订阅进行了限制,继承自以前的unlockSubLimits配置项。优化了一些配置项
181
+ - ver 2.0.0-alpha.1 修复:无法成功取消订阅自己、用户没有直播间订阅直播出错。对直播订阅进行了限制,继承自以前的unlockSubLimits配置项。优化了一些配置项
182
182
  - ver 2.0.0-alpha.2 新增:支持Discord平台。优化了下播通知
183
+ - ver 2.0.0-alpha.3 修复:订阅和取消订阅的bug,下播通知的bug
184
+ - ver 2.0.0-alpha.4 修复:初次订阅后不推送动态的bug 优化:下播不再发送链接
183
185
 
184
186
  ## 交流群
185
187
 
package/lib/biliAPI.d.ts CHANGED
@@ -36,6 +36,7 @@ declare class BiliAPI extends Service {
36
36
  getAllDynamic(updateBaseline?: string): Promise<any>;
37
37
  hasNewDynamic(updateBaseline: string): Promise<any>;
38
38
  follow(fid: string): Promise<any>;
39
+ getRelationGroupDetail(tagid: string): Promise<any>;
39
40
  getCookieInfo(refreshToken: string): Promise<any>;
40
41
  getUserInfo(mid: string): Promise<any>;
41
42
  getWbiKeys(): Promise<{
package/lib/biliAPI.js CHANGED
@@ -40,6 +40,7 @@ const CREATE_GROUP = 'https://api.bilibili.com/x/relation/tag/create';
40
40
  const MODIFY_GROUP_MEMBER = 'https://api.bilibili.com/x/relation/tags/addUsers';
41
41
  const GET_ALL_GROUP = 'https://api.bilibili.com/x/relation/tags';
42
42
  const COPY_USER_TO_GROUP = 'https://api.bilibili.com/x/relation/tags/copyUsers';
43
+ const GET_RELATION_GROUP_DETAIL = 'https://api.bilibili.com/x/relation/tag';
43
44
  class BiliAPI extends koishi_1.Service {
44
45
  static inject = ['database', 'notifier'];
45
46
  jar;
@@ -240,6 +241,15 @@ class BiliAPI extends koishi_1.Service {
240
241
  throw new Error('网络异常,本次请求失败!');
241
242
  }
242
243
  }
244
+ async getRelationGroupDetail(tagid) {
245
+ try {
246
+ const { data } = await this.client.get(`${GET_RELATION_GROUP_DETAIL}?tagid=${tagid}`);
247
+ return data;
248
+ }
249
+ catch (e) {
250
+ throw new Error('网络异常,本次请求失败!');
251
+ }
252
+ }
243
253
  // Check if Token need refresh
244
254
  async getCookieInfo(refreshToken) {
245
255
  try {
@@ -1,5 +1,6 @@
1
- import { Bot, Context, Logger, Schema, Session } from "koishi";
1
+ import { Bot, Context, FlatPick, Logger, Schema, Session } from "koishi";
2
2
  import { Notifier } from "@koishijs/plugin-notifier";
3
+ import { LoginBili } from "./database";
3
4
  type SubItem = {
4
5
  id: number;
5
6
  uid: string;
@@ -20,6 +21,7 @@ declare class ComRegister {
20
21
  rebootCount: number;
21
22
  subNotifier: Notifier;
22
23
  subManager: SubManager;
24
+ loginDBData: FlatPick<LoginBili, "dynamic_group_id">;
23
25
  bot: Bot<Context>;
24
26
  dynamicDispose: Function;
25
27
  sendMsgFunc: (guild: string, content: any) => Promise<void>;
@@ -35,6 +37,10 @@ declare class ComRegister {
35
37
  checkIfNeedSub(liveSub: boolean, dynamicSub: boolean, session: Session, data?: any): Promise<Array<boolean>>;
36
38
  updateSubNotifier(ctx: Context): void;
37
39
  checkIfLoginInfoIsLoaded(ctx: Context): Promise<unknown>;
40
+ subUserInBili(ctx: Context, mid: string): Promise<{
41
+ flag: boolean;
42
+ msg: string;
43
+ }>;
38
44
  getSubFromDatabase(ctx: Context): Promise<void>;
39
45
  unsubSingle(ctx: Context, id: string, type: number): string;
40
46
  checkIfUserThatIsSubDynAndUnsub(): void;
@@ -26,6 +26,8 @@ class ComRegister {
26
26
  rebootCount = 0;
27
27
  subNotifier;
28
28
  subManager = [];
29
+ // 检查登录数据库是否有数据
30
+ loginDBData;
29
31
  // 机器人实例
30
32
  bot;
31
33
  // 动态销毁函数
@@ -45,6 +47,8 @@ class ComRegister {
45
47
  });
46
48
  this.logger.error('未找到对应机器人实例,请检查配置是否正确或重新配置适配器!');
47
49
  }
50
+ // 检查登录数据库是否有数据
51
+ ctx.database.get('loginBili', 1, ['dynamic_group_id']).then(data => this.loginDBData = data[0]);
48
52
  // 从数据库获取订阅
49
53
  this.getSubFromDatabase(ctx);
50
54
  // 判断消息发送方式
@@ -99,7 +103,7 @@ class ComRegister {
99
103
  .usage('查看订阅管理对象')
100
104
  .example('status sm')
101
105
  .action(async () => {
102
- console.log(this.subManager);
106
+ this.logger.info(this.subManager);
103
107
  return '查看控制台';
104
108
  });
105
109
  const biliCom = ctx.command('bili', 'bili-notify插件相关指令', { permissions: ['authority:3'] });
@@ -216,6 +220,7 @@ class ComRegister {
216
220
  await session.send(this.unsubSingle(ctx, sub.uid, 1)); /* 1为取消订阅Dynamic */
217
221
  // 将存在flag设置为true
218
222
  exist = true;
223
+ // 结束循环
219
224
  return;
220
225
  }
221
226
  // 取消全部订阅 执行dispose方法,销毁定时器
@@ -228,9 +233,12 @@ class ComRegister {
228
233
  // 将订阅对象移出订阅关注组
229
234
  const removeUserFromGroupData = await ctx.ba.removeUserFromGroup(sub.uid);
230
235
  // 判断是否移出成功 22105关注对象为自己
231
- if (removeUserFromGroupData.code !== 0 || removeUserFromGroupData.data !== 22105) {
236
+ if (removeUserFromGroupData.code !== 0 && removeUserFromGroupData.code !== 22105) {
232
237
  // 移出失败
233
238
  await session.send('取消订阅对象失败,请稍后重试');
239
+ // 将存在flag设置为true
240
+ exist = true;
241
+ // 结束循环
234
242
  return;
235
243
  }
236
244
  // id--
@@ -295,56 +303,11 @@ class ComRegister {
295
303
  // 检查必选参数是否已填
296
304
  if (!mid)
297
305
  return '请输入用户uid';
298
- // 检查数据库是否有数据
299
- const loginDBData = (await ctx.database.get('loginBili', 1, ['dynamic_group_id']))[0];
300
- // 判断是否有数据
301
- if (loginDBData.dynamic_group_id === '' || loginDBData.dynamic_group_id === null) {
302
- // 没有数据,没有创建分组,尝试创建分组
303
- const createGroupData = await ctx.ba.createGroup("订阅");
304
- // 如果分组已创建,则获取分组id
305
- if (createGroupData.code === 22106) {
306
- // 分组已存在,拿到之前的分组id
307
- const allGroupData = await ctx.ba.getAllGroup();
308
- // 遍历所有分组
309
- for (const group of allGroupData.data) {
310
- // 找到订阅分组
311
- if (group.name === '订阅') {
312
- // 拿到分组id
313
- loginDBData.dynamic_group_id = group.tagid;
314
- // 结束循环
315
- break;
316
- }
317
- }
318
- }
319
- else if (createGroupData.code !== 0) {
320
- // 创建分组失败
321
- return '创建关注分组出错';
322
- }
323
- // 创建成功,保存到数据库
324
- ctx.database.set('loginBili', 1, { dynamic_group_id: loginDBData.dynamic_group_id });
325
- }
326
306
  // 订阅对象
327
- const subUserData = await ctx.ba.follow(mid);
328
- // 判断是否订阅成功
329
- switch (subUserData.code) {
330
- case -101: return '账号未登录,请使用指令bili login登录后再进行订阅操作';
331
- case -102: return '账号被封停,无法进行订阅操作';
332
- case 22002: return '因对方隐私设置,无法进行订阅操作';
333
- case 22003: return '你已将对方拉黑,无法进行订阅操作';
334
- case 22013: return '账号已注销,无法进行订阅操作';
335
- case 40061: return '账号不存在,请检查uid输入是否正确或用户是否存在';
336
- case 22001: break; // 订阅对象为自己 无需添加到分组
337
- case 22014: // 已关注订阅对象 无需再次关注
338
- case 0: { // 执行订阅成功
339
- // 把订阅对象添加到分组中
340
- const copyUserToGroupData = await ctx.ba.copyUserToGroup(mid, loginDBData.dynamic_group_id);
341
- // 判断是否添加成功
342
- if (copyUserToGroupData.code !== 0) {
343
- // 添加失败
344
- return '添加订阅对象到分组失败,请稍后重试';
345
- }
346
- }
347
- }
307
+ const subUserData = await this.subUserInBili(ctx, mid);
308
+ // 判断是否订阅对象存在
309
+ if (!subUserData.flag)
310
+ return '订阅对象失败,请稍后重试!';
348
311
  // 定义外围变量
349
312
  let content;
350
313
  try {
@@ -510,7 +473,6 @@ class ComRegister {
510
473
  this.logger.error('bili sub指令 getMasterInfo() 发生了错误,错误为:' + e.message);
511
474
  return '订阅出错啦,请重试';
512
475
  }
513
- console.log(liveMsg, dynamicMsg);
514
476
  // 订阅直播
515
477
  if (liveMsg) {
516
478
  await session.execute(`bili live ${roomId} ${targetId.split(',').join(' ')}`);
@@ -1087,7 +1049,7 @@ class ComRegister {
1087
1049
  // 推送直播信息
1088
1050
  // pic 存在,使用的是render模式
1089
1051
  if (pic) {
1090
- const msg = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), liveStartMsg && liveStartMsg, liveType !== LiveType.StartBroadcasting ? `https://live.bilibili.com/${roomId}` : ''] });
1052
+ const msg = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [atAll && (0, jsx_runtime_1.jsx)("at", { type: "all" }), liveStartMsg && liveStartMsg, liveType !== LiveType.StartBroadcasting && liveType !== LiveType.StopBroadcast ? `https://live.bilibili.com/${roomId}` : ''] });
1091
1053
  return await this.sendMsg(guildId, pic + msg);
1092
1054
  }
1093
1055
  // pic不存在,说明使用的是page模式
@@ -1218,8 +1180,10 @@ class ComRegister {
1218
1180
  const liveEndMsg = this.config.customLiveEnd
1219
1181
  .replace('-name', username)
1220
1182
  .replace('-time', await ctx.gi.getTimeDifference(liveTime));
1183
+ // 更改直播时长
1184
+ data.live_time = liveTime;
1221
1185
  // 发送@全体成员通知
1222
- await sendLiveNotifyCard(data, LiveType.StartBroadcasting, liveEndMsg);
1186
+ await sendLiveNotifyCard(data, LiveType.StopBroadcast, liveEndMsg);
1223
1187
  }
1224
1188
  // 未进循环,还未开播,继续循环
1225
1189
  break;
@@ -1357,6 +1321,97 @@ class ComRegister {
1357
1321
  check();
1358
1322
  });
1359
1323
  }
1324
+ async subUserInBili(ctx, mid) {
1325
+ // 获取关注分组信息
1326
+ const checkGroupIsReady = async () => {
1327
+ // 判断是否有数据
1328
+ if (this.loginDBData.dynamic_group_id === '' || this.loginDBData.dynamic_group_id === null) {
1329
+ // 没有数据,没有创建分组,尝试创建分组
1330
+ const createGroupData = await ctx.ba.createGroup("订阅");
1331
+ // 如果分组已创建,则获取分组id
1332
+ if (createGroupData.code === 22106) {
1333
+ // 分组已存在,拿到之前的分组id
1334
+ const allGroupData = await ctx.ba.getAllGroup();
1335
+ // 遍历所有分组
1336
+ for (const group of allGroupData.data) {
1337
+ // 找到订阅分组
1338
+ if (group.name === '订阅') {
1339
+ // 拿到分组id
1340
+ this.loginDBData.dynamic_group_id = group.tagid;
1341
+ // 结束循环
1342
+ break;
1343
+ }
1344
+ }
1345
+ }
1346
+ else if (createGroupData.code !== 0) {
1347
+ console.log(createGroupData);
1348
+ // 创建分组失败
1349
+ return false;
1350
+ }
1351
+ // 创建成功,保存到数据库
1352
+ ctx.database.set('loginBili', 1, { dynamic_group_id: this.loginDBData.dynamic_group_id });
1353
+ // 创建成功
1354
+ return true;
1355
+ }
1356
+ return true;
1357
+ };
1358
+ // 判断分组是否准备好
1359
+ const flag = await checkGroupIsReady();
1360
+ // 判断是否创建成功
1361
+ if (!flag) {
1362
+ // 创建分组失败
1363
+ return { flag: false, msg: '创建分组失败,请尝试重启插件' };
1364
+ }
1365
+ // 获取分组明细
1366
+ const relationGroupDetailData = await ctx.ba.getRelationGroupDetail(this.loginDBData.dynamic_group_id);
1367
+ // 判断分组信息是否获取成功
1368
+ if (relationGroupDetailData.code !== 0) {
1369
+ if (relationGroupDetailData.code === 22104) {
1370
+ // 将原先的分组id置空
1371
+ this.loginDBData.dynamic_group_id = null;
1372
+ // 分组不存在
1373
+ const flag = await checkGroupIsReady();
1374
+ // 判断是否创建成功
1375
+ if (!flag) {
1376
+ // 创建分组失败
1377
+ return { flag: false, msg: '创建分组失败,请尝试重启插件' };
1378
+ }
1379
+ return { flag: true, msg: '分组不存在,已重新创建分组' };
1380
+ }
1381
+ // 获取分组明细失败
1382
+ return { flag: false, msg: '获取分组明细失败' };
1383
+ }
1384
+ relationGroupDetailData.data.forEach(user => {
1385
+ if (user.mid === mid) {
1386
+ // 已关注订阅对象
1387
+ return { flag: true, msg: '订阅对象已存在于分组中' };
1388
+ }
1389
+ });
1390
+ // 订阅对象
1391
+ const subUserData = await ctx.ba.follow(mid);
1392
+ // 判断是否订阅成功
1393
+ switch (subUserData.code) {
1394
+ case -101: return { flag: false, msg: '账号未登录,请使用指令bili login登录后再进行订阅操作' };
1395
+ case -102: return { flag: false, msg: '账号被封停,无法进行订阅操作' };
1396
+ case 22002: return { flag: false, msg: '因对方隐私设置,无法进行订阅操作' };
1397
+ case 22003: return { flag: false, msg: '你已将对方拉黑,无法进行订阅操作' };
1398
+ case 22013: return { flag: false, msg: '账号已注销,无法进行订阅操作' };
1399
+ case 40061: return { flag: false, msg: '账号不存在,请检查uid输入是否正确或用户是否存在' };
1400
+ case 22001: break; // 订阅对象为自己 无需添加到分组
1401
+ case 22014: // 已关注订阅对象 无需再次关注
1402
+ case 0: { // 执行订阅成功
1403
+ // 把订阅对象添加到分组中
1404
+ const copyUserToGroupData = await ctx.ba.copyUserToGroup(mid, this.loginDBData.dynamic_group_id);
1405
+ // 判断是否添加成功
1406
+ if (copyUserToGroupData.code !== 0) {
1407
+ // 添加失败
1408
+ return { flag: false, msg: '添加订阅对象到分组失败,请稍后重试' };
1409
+ }
1410
+ }
1411
+ }
1412
+ // 订阅成功
1413
+ return { flag: true, msg: '用户订阅成功' };
1414
+ }
1360
1415
  async getSubFromDatabase(ctx) {
1361
1416
  // 判断登录信息是否已加载完毕
1362
1417
  await this.checkIfLoginInfoIsLoaded(ctx);
@@ -1384,6 +1439,19 @@ class ComRegister {
1384
1439
  // 跳过下面的步骤
1385
1440
  continue;
1386
1441
  }
1442
+ // 判断用户是否在B站中订阅了
1443
+ const subUserData = await this.subUserInBili(ctx, sub.uid);
1444
+ // 判断是否订阅
1445
+ if (!subUserData.flag) {
1446
+ // log
1447
+ this.logger.warn(`UID:${sub.uid} ${subUserData.msg},自动取消订阅`);
1448
+ // 发送私聊消息
1449
+ await this.sendPrivateMsg(`UID:${sub.uid} ${subUserData.msg},自动取消订阅`);
1450
+ // 删除该条数据
1451
+ await ctx.database.remove('bilibili', { id: sub.id });
1452
+ // 跳过下面的步骤
1453
+ continue;
1454
+ }
1387
1455
  // 获取推送目标数组
1388
1456
  const targetIdArr = sub.targetId.split(' ');
1389
1457
  /* 判断数据库是否被篡改 */
@@ -1435,7 +1503,7 @@ class ComRegister {
1435
1503
  }
1436
1504
  }
1437
1505
  // 检测房间号是否被篡改
1438
- if (sub.live && (!data.live_room || data.live_room.roomid.toString() !== sub.room_id)) {
1506
+ if (sub.live && (!data.live_room || data.live_room.roomid != sub.room_id)) {
1439
1507
  // 房间号被篡改,删除该订阅
1440
1508
  await deleteSub();
1441
1509
  // log
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": "2.0.0-alpha.2",
4
+ "version": "2.0.0-alpha.4",
5
5
  "contributors": [
6
6
  "Akokko <admin@akokko.com>"
7
7
  ],