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

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.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
  // 判断消息发送方式
@@ -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,7 @@ 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
- // 订阅对象
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
- }
306
+ // 订阅对象 TODO
348
307
  // 定义外围变量
349
308
  let content;
350
309
  try {
@@ -510,7 +469,6 @@ class ComRegister {
510
469
  this.logger.error('bili sub指令 getMasterInfo() 发生了错误,错误为:' + e.message);
511
470
  return '订阅出错啦,请重试';
512
471
  }
513
- console.log(liveMsg, dynamicMsg);
514
472
  // 订阅直播
515
473
  if (liveMsg) {
516
474
  await session.execute(`bili live ${roomId} ${targetId.split(',').join(' ')}`);
@@ -1218,8 +1176,10 @@ class ComRegister {
1218
1176
  const liveEndMsg = this.config.customLiveEnd
1219
1177
  .replace('-name', username)
1220
1178
  .replace('-time', await ctx.gi.getTimeDifference(liveTime));
1179
+ // 更改直播时长
1180
+ data.live_time = liveTime;
1221
1181
  // 发送@全体成员通知
1222
- await sendLiveNotifyCard(data, LiveType.StartBroadcasting, liveEndMsg);
1182
+ await sendLiveNotifyCard(data, LiveType.StopBroadcast, liveEndMsg);
1223
1183
  }
1224
1184
  // 未进循环,还未开播,继续循环
1225
1185
  break;
@@ -1357,6 +1317,97 @@ class ComRegister {
1357
1317
  check();
1358
1318
  });
1359
1319
  }
1320
+ async subUserInBili(ctx, mid) {
1321
+ // 获取关注分组信息
1322
+ const checkGroupIsReady = async () => {
1323
+ // 判断是否有数据
1324
+ if (this.loginDBData.dynamic_group_id === '' || this.loginDBData.dynamic_group_id === null) {
1325
+ // 没有数据,没有创建分组,尝试创建分组
1326
+ const createGroupData = await ctx.ba.createGroup("订阅");
1327
+ // 如果分组已创建,则获取分组id
1328
+ if (createGroupData.code === 22106) {
1329
+ // 分组已存在,拿到之前的分组id
1330
+ const allGroupData = await ctx.ba.getAllGroup();
1331
+ // 遍历所有分组
1332
+ for (const group of allGroupData.data) {
1333
+ // 找到订阅分组
1334
+ if (group.name === '订阅') {
1335
+ // 拿到分组id
1336
+ this.loginDBData.dynamic_group_id = group.tagid;
1337
+ // 结束循环
1338
+ break;
1339
+ }
1340
+ }
1341
+ }
1342
+ else if (createGroupData.code !== 0) {
1343
+ console.log(createGroupData);
1344
+ // 创建分组失败
1345
+ return false;
1346
+ }
1347
+ // 创建成功,保存到数据库
1348
+ ctx.database.set('loginBili', 1, { dynamic_group_id: this.loginDBData.dynamic_group_id });
1349
+ // 创建成功
1350
+ return true;
1351
+ }
1352
+ return true;
1353
+ };
1354
+ // 判断分组是否准备好
1355
+ const flag = await checkGroupIsReady();
1356
+ // 判断是否创建成功
1357
+ if (!flag) {
1358
+ // 创建分组失败
1359
+ return { flag: false, msg: '创建分组失败,请尝试重启插件' };
1360
+ }
1361
+ // 获取分组明细
1362
+ const relationGroupDetailData = await ctx.ba.getRelationGroupDetail(this.loginDBData.dynamic_group_id);
1363
+ // 判断分组信息是否获取成功
1364
+ if (relationGroupDetailData.code !== 0) {
1365
+ if (relationGroupDetailData.code === 22104) {
1366
+ // 将原先的分组id置空
1367
+ this.loginDBData.dynamic_group_id = null;
1368
+ // 分组不存在
1369
+ const flag = await checkGroupIsReady();
1370
+ // 判断是否创建成功
1371
+ if (!flag) {
1372
+ // 创建分组失败
1373
+ return { flag: false, msg: '创建分组失败,请尝试重启插件' };
1374
+ }
1375
+ return { flag: true, msg: '分组不存在,已重新创建分组' };
1376
+ }
1377
+ // 获取分组明细失败
1378
+ return { flag: false, msg: '获取分组明细失败' };
1379
+ }
1380
+ relationGroupDetailData.data.forEach(user => {
1381
+ if (user.mid === mid) {
1382
+ // 已关注订阅对象
1383
+ return { flag: true, msg: '订阅对象已存在于分组中' };
1384
+ }
1385
+ });
1386
+ // 订阅对象
1387
+ const subUserData = await ctx.ba.follow(mid);
1388
+ // 判断是否订阅成功
1389
+ switch (subUserData.code) {
1390
+ case -101: return { flag: false, msg: '账号未登录,请使用指令bili login登录后再进行订阅操作' };
1391
+ case -102: return { flag: false, msg: '账号被封停,无法进行订阅操作' };
1392
+ case 22002: return { flag: false, msg: '因对方隐私设置,无法进行订阅操作' };
1393
+ case 22003: return { flag: false, msg: '你已将对方拉黑,无法进行订阅操作' };
1394
+ case 22013: return { flag: false, msg: '账号已注销,无法进行订阅操作' };
1395
+ case 40061: return { flag: false, msg: '账号不存在,请检查uid输入是否正确或用户是否存在' };
1396
+ case 22001: break; // 订阅对象为自己 无需添加到分组
1397
+ case 22014: // 已关注订阅对象 无需再次关注
1398
+ case 0: { // 执行订阅成功
1399
+ // 把订阅对象添加到分组中
1400
+ const copyUserToGroupData = await ctx.ba.copyUserToGroup(mid, this.loginDBData.dynamic_group_id);
1401
+ // 判断是否添加成功
1402
+ if (copyUserToGroupData.code !== 0) {
1403
+ // 添加失败
1404
+ return { flag: false, msg: '添加订阅对象到分组失败,请稍后重试' };
1405
+ }
1406
+ }
1407
+ }
1408
+ // 订阅成功
1409
+ return { flag: true, msg: '用户订阅成功' };
1410
+ }
1360
1411
  async getSubFromDatabase(ctx) {
1361
1412
  // 判断登录信息是否已加载完毕
1362
1413
  await this.checkIfLoginInfoIsLoaded(ctx);
@@ -1384,6 +1435,19 @@ class ComRegister {
1384
1435
  // 跳过下面的步骤
1385
1436
  continue;
1386
1437
  }
1438
+ // 判断用户是否在B站中订阅了
1439
+ const subUserData = await this.subUserInBili(ctx, sub.uid);
1440
+ // 判断是否订阅
1441
+ if (!subUserData.flag) {
1442
+ // log
1443
+ this.logger.warn(`UID:${sub.uid} ${subUserData.msg},自动取消订阅`);
1444
+ // 发送私聊消息
1445
+ await this.sendPrivateMsg(`UID:${sub.uid} ${subUserData.msg},自动取消订阅`);
1446
+ // 删除该条数据
1447
+ await ctx.database.remove('bilibili', { id: sub.id });
1448
+ // 跳过下面的步骤
1449
+ continue;
1450
+ }
1387
1451
  // 获取推送目标数组
1388
1452
  const targetIdArr = sub.targetId.split(' ');
1389
1453
  /* 判断数据库是否被篡改 */
@@ -1435,7 +1499,7 @@ class ComRegister {
1435
1499
  }
1436
1500
  }
1437
1501
  // 检测房间号是否被篡改
1438
- if (sub.live && (!data.live_room || data.live_room.roomid.toString() !== sub.room_id)) {
1502
+ if (sub.live && (!data.live_room || data.live_room.roomid != sub.room_id)) {
1439
1503
  // 房间号被篡改,删除该订阅
1440
1504
  await deleteSub();
1441
1505
  // 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.3",
5
5
  "contributors": [
6
6
  "Akokko <admin@akokko.com>"
7
7
  ],
@@ -178,8 +178,9 @@
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
183
184
 
184
185
  ## 交流群
185
186