mirai-js 2.1.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. package/.eslintrc.json +45 -45
  2. package/.github/FUNDING.yml +12 -12
  3. package/.github/dependabot.yml +14 -14
  4. package/.github/workflows/codeql-analysis.yml +70 -0
  5. package/.husky/pre-commit +5 -5
  6. package/LICENSE +661 -661
  7. package/README.md +17 -283
  8. package/demo.html +1 -1
  9. package/demo.js +14 -92
  10. package/dist/browser/mirai-js.js +1 -1
  11. package/dist/node/BaseType.d.ts +3 -0
  12. package/dist/node/Bot.d.ts +95 -8
  13. package/dist/node/Bot.js +241 -18
  14. package/dist/node/FileManager.js +15 -6
  15. package/dist/node/Middleware.js +90 -16
  16. package/dist/node/core/anno/deleteAnno.js +67 -0
  17. package/dist/node/core/anno/getAnno.js +70 -0
  18. package/dist/node/core/anno/publishAnno.js +70 -0
  19. package/dist/node/core/auth.js +9 -11
  20. package/dist/node/core/fs/deleteGroupFile.js +71 -0
  21. package/dist/node/core/fs/getGroupFileInfo.js +77 -0
  22. package/dist/node/core/fs/getGroupFileList.js +82 -0
  23. package/dist/node/core/fs/makeGroupDir.js +73 -0
  24. package/dist/node/core/fs/moveGroupFile.js +77 -0
  25. package/dist/node/core/fs/renameGroupFile.js +73 -0
  26. package/dist/node/core/fs/uploadGroupFIle.js +81 -0
  27. package/dist/node/core/getFriendList.js +9 -11
  28. package/dist/node/core/getGroupConfig.js +9 -11
  29. package/dist/node/core/getGroupFileInfo.js +6 -2
  30. package/dist/node/core/getGroupFileList.js +6 -2
  31. package/dist/node/core/getGroupList.js +9 -11
  32. package/dist/node/core/getMemberInfo.js +13 -19
  33. package/dist/node/core/getMemberList.js +9 -11
  34. package/dist/node/core/getSessionConfig.js +9 -11
  35. package/dist/node/core/getUserProfile.js +78 -0
  36. package/dist/node/core/groupFileDelete.js +6 -2
  37. package/dist/node/core/groupFileMove.js +6 -2
  38. package/dist/node/core/groupFileRename.js +6 -2
  39. package/dist/node/core/mute.js +9 -11
  40. package/dist/node/core/muteAll.js +9 -11
  41. package/dist/node/core/quitGroup.js +9 -11
  42. package/dist/node/core/recall.js +9 -11
  43. package/dist/node/core/releaseSession.js +10 -11
  44. package/dist/node/core/removeFriend.js +64 -0
  45. package/dist/node/core/removeMember.js +9 -11
  46. package/dist/node/core/responseBotInvitedJoinGroupRequest.js +9 -11
  47. package/dist/node/core/responseFirendRequest.js +9 -11
  48. package/dist/node/core/responseMemberJoinRequest.js +9 -11
  49. package/dist/node/core/sendCommand.js +9 -11
  50. package/dist/node/core/sendFirendMessage.js +9 -11
  51. package/dist/node/core/sendGroupMessage.js +9 -11
  52. package/dist/node/core/sendNudge.js +9 -11
  53. package/dist/node/core/sendTempMessage.js +9 -11
  54. package/dist/node/core/setEssence.js +9 -11
  55. package/dist/node/core/setGroupConfig.js +9 -11
  56. package/dist/node/core/setMemberAdmin.js +70 -0
  57. package/dist/node/core/setMemberInfo.js +9 -11
  58. package/dist/node/core/setSessionConfig.js +9 -11
  59. package/dist/node/core/startListeningBrowser.js +8 -9
  60. package/dist/node/core/startListeningNode.js +8 -10
  61. package/dist/node/core/stopListeningBrowser.js +5 -1
  62. package/dist/node/core/stopListeningNode.js +5 -1
  63. package/dist/node/core/unmute.js +9 -11
  64. package/dist/node/core/unmuteAll.js +9 -11
  65. package/dist/node/core/uploadFileAndSend.js +6 -1
  66. package/dist/node/core/uploadImage.js +9 -10
  67. package/dist/node/core/uploadVoice.js +9 -10
  68. package/dist/node/core/verify.js +9 -11
  69. package/dist/node/polyfill/URL.js +5 -0
  70. package/dist/node/polyfill/wsListener.js +6 -0
  71. package/docs/checkDocShouldBuild.sh +4 -4
  72. package/package.json +51 -51
  73. package/src/BaseType.d.ts +3 -0
  74. package/src/Bot.d.ts +95 -8
  75. package/src/Bot.js +154 -9
  76. package/src/FileManager.js +10 -6
  77. package/src/Middleware.js +51 -3
  78. package/src/core/anno/deleteAnno.js +42 -0
  79. package/src/core/anno/getAnno.js +43 -0
  80. package/src/core/anno/publishAnno.js +43 -0
  81. package/src/core/auth.js +5 -7
  82. package/src/core/fs/deleteGroupFile.js +44 -0
  83. package/src/core/fs/getGroupFileInfo.js +45 -0
  84. package/src/core/fs/getGroupFileList.js +46 -0
  85. package/src/core/fs/makeGroupDir.js +44 -0
  86. package/src/core/fs/moveGroupFile.js +46 -0
  87. package/src/core/{groupFileRename.js → fs/renameGroupFile.js} +11 -13
  88. package/src/core/{uploadFileAndSend.js → fs/uploadGroupFIle.js} +9 -11
  89. package/src/core/getFriendList.js +5 -7
  90. package/src/core/getGroupConfig.js +5 -7
  91. package/src/core/getGroupList.js +5 -7
  92. package/src/core/getMemberInfo.js +8 -10
  93. package/src/core/getMemberList.js +5 -7
  94. package/src/core/getSessionConfig.js +5 -7
  95. package/src/core/getUserProfile.js +39 -0
  96. package/src/core/mute.js +5 -7
  97. package/src/core/muteAll.js +5 -7
  98. package/src/core/quitGroup.js +5 -7
  99. package/src/core/recall.js +5 -7
  100. package/src/core/releaseSession.js +6 -7
  101. package/src/core/{groupFileDelete.js → removeFriend.js} +11 -17
  102. package/src/core/removeMember.js +5 -7
  103. package/src/core/responseBotInvitedJoinGroupRequest.js +5 -7
  104. package/src/core/responseFirendRequest.js +5 -7
  105. package/src/core/responseMemberJoinRequest.js +5 -7
  106. package/src/core/sendCommand.js +5 -7
  107. package/src/core/sendFirendMessage.js +5 -7
  108. package/src/core/sendGroupMessage.js +5 -7
  109. package/src/core/sendNudge.js +5 -7
  110. package/src/core/sendTempMessage.js +5 -7
  111. package/src/core/setEssence.js +5 -7
  112. package/src/core/setGroupConfig.js +5 -7
  113. package/src/core/setMemberAdmin.js +43 -0
  114. package/src/core/setMemberInfo.js +5 -7
  115. package/src/core/setSessionConfig.js +5 -7
  116. package/src/core/startListeningBrowser.js +4 -6
  117. package/src/core/startListeningNode.js +4 -6
  118. package/src/core/stopListeningBrowser.js +3 -0
  119. package/src/core/stopListeningNode.js +3 -0
  120. package/src/core/unmute.js +5 -7
  121. package/src/core/unmuteAll.js +5 -7
  122. package/src/core/uploadImage.js +5 -7
  123. package/src/core/uploadVoice.js +5 -7
  124. package/src/core/verify.js +5 -7
  125. package/src/polyfill/URL.js +3 -0
  126. package/src/polyfill/wsListener.js +4 -0
  127. package/webpack.config.js +4 -0
  128. package/src/core/getGroupFileInfo.js +0 -44
  129. package/src/core/getGroupFileList.js +0 -40
  130. package/src/core/groupFileMove.js +0 -46
package/package.json CHANGED
@@ -1,52 +1,52 @@
1
- {
2
- "name": "mirai-js",
3
- "version": "2.1.0",
4
- "description": "QQ robot development framework based on Mirai-api-http.",
5
- "main": "dist/node/index.js",
6
- "scripts": {
7
- "lint": "eslint --fix .",
8
- "build": "webpack && babel src --out-dir dist/node --copy-files",
9
- "prepare": "husky install"
10
- },
11
- "lint-staged": {
12
- "*.js": "eslint --fix",
13
- "*.ts": "eslint --fix"
14
- },
15
- "keywords": [
16
- "mirai",
17
- "api",
18
- "http",
19
- "robot"
20
- ],
21
- "author": {
22
- "email": "devgaolihai@foxmail.com",
23
- "name": "gaolihai",
24
- "url": "https://gaolihai.cool/note/"
25
- },
26
- "repository": {
27
- "type": "git",
28
- "url": "https://github.com/Drincann/Mirai-js"
29
- },
30
- "homepage": "https://drincann.github.io/Mirai-js/",
31
- "license": "AGPL-3.0",
32
- "dependencies": {
33
- "axios": "^0.21.1",
34
- "form-data": "^3.0.0",
35
- "ws": "^7.4.2"
36
- },
37
- "devDependencies": {
38
- "@babel/cli": "^7.13.14",
39
- "@babel/core": "^7.13.14",
40
- "@babel/preset-env": "^7.13.12",
41
- "@typescript-eslint/eslint-plugin": "^4.15.2",
42
- "@typescript-eslint/parser": "^4.15.2",
43
- "eslint": "^7.19.0",
44
- "husky": "^6.0.0",
45
- "lint-staged": "^10.5.4",
46
- "path-browserify": "^1.0.1",
47
- "process": "^0.11.10",
48
- "typescript": "^4.2.2",
49
- "webpack": "^5.30.0",
50
- "webpack-cli": "^4.6.0"
51
- }
1
+ {
2
+ "name": "mirai-js",
3
+ "version": "2.4.0",
4
+ "description": "QQ robot development framework based on Mirai-api-http.",
5
+ "main": "dist/node/index.js",
6
+ "scripts": {
7
+ "lint": "eslint --fix .",
8
+ "build": "webpack && babel src --out-dir dist/node --copy-files",
9
+ "prepare": "husky install"
10
+ },
11
+ "lint-staged": {
12
+ "*.js": "eslint --fix",
13
+ "*.ts": "eslint --fix"
14
+ },
15
+ "keywords": [
16
+ "mirai",
17
+ "api",
18
+ "http",
19
+ "robot"
20
+ ],
21
+ "author": {
22
+ "email": "devgaolihai@foxmail.com",
23
+ "name": "gaolihai",
24
+ "url": "https://gaolihai.cool/note/"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/Drincann/Mirai-js"
29
+ },
30
+ "homepage": "https://drincann.github.io/Mirai-js/",
31
+ "license": "AGPL-3.0",
32
+ "dependencies": {
33
+ "axios": "^0.24.0",
34
+ "form-data": "^3.0.0",
35
+ "ws": "^8.4.0"
36
+ },
37
+ "devDependencies": {
38
+ "@babel/cli": "^7.13.14",
39
+ "@babel/core": "^7.13.14",
40
+ "@babel/preset-env": "^7.13.12",
41
+ "@typescript-eslint/eslint-plugin": "^5.4.0",
42
+ "@typescript-eslint/parser": "^5.5.0",
43
+ "eslint": "^8.2.0",
44
+ "husky": "^6.0.0",
45
+ "lint-staged": "^12.0.2",
46
+ "path-browserify": "^1.0.1",
47
+ "process": "^0.11.10",
48
+ "typescript": "^4.2.2",
49
+ "webpack": "^5.30.0",
50
+ "webpack-cli": "^4.6.0"
51
+ }
52
52
  }
package/src/BaseType.d.ts CHANGED
@@ -98,6 +98,9 @@ type GroupPermission =
98
98
  | 'ADMINISTRATOR'
99
99
  | 'MEMBER';
100
100
 
101
+ // 性别
102
+ type SEX = 'UNKNOWN' | 'MALE' | 'FEMALE'
103
+
101
104
  // 消息处理器
102
105
  type Processor = (data: any) => Promise<any> | any;
103
106
 
package/src/Bot.d.ts CHANGED
@@ -2,8 +2,8 @@ import {
2
2
  // 图片 id 语音 id 消息 id
3
3
  ImageId, VoiceId, MessageId,
4
4
 
5
- // 事件类型 群成员权限
6
- EventType, GroupPermission,
5
+ // 事件类型 群成员权限 性别
6
+ EventType, GroupPermission, SEX,
7
7
 
8
8
  // 接口 原始消息类型 事件处理器类型
9
9
  MessageChainGetable, BotConfigGetable, MessageType, Processor
@@ -146,9 +146,9 @@ export class Bot implements BotConfigGetable {
146
146
 
147
147
  /**
148
148
  * @description 上传语音至服务器,返回 voiceId, url 及 path
149
- * @param {string} type 目前仅支持 "group",请忽略该参数
150
- * @param {Buffer} voice 二选一,语音二进制数据
151
- * @param {string} filename 二选一,语音文件路径
149
+ * @param type 目前仅支持 "group",请忽略该参数
150
+ * @param voice 二选一,语音二进制数据
151
+ * @param filename 二选一,语音文件路径
152
152
  */
153
153
  uploadVoice({ type, voice, filename }: Bot.UploadVoiceOptions): Promise<Bot.VoiceInfo>;
154
154
 
@@ -173,7 +173,13 @@ export class Bot implements BotConfigGetable {
173
173
  * @param group 必选,群成员所在群号
174
174
  * @param qq 必选,群成员的 qq 号
175
175
  */
176
- getMemberInfo(): Promise<Bot.MemberDetails>;
176
+ getMemberInfo({ group, qq }: Bot.GetMemberInfoOptions): Promise<Bot.MemberDetails>;
177
+
178
+ /**
179
+ * @description 获取群成员信息
180
+ * @param qq 必选,用户的 qq 号
181
+ */
182
+ getUserProfile({ qq }: Bot.GetUserProfileOptions): Promise<Bot.UserProfile>;
177
183
 
178
184
  /**
179
185
  * @description 设置群成员信息
@@ -181,8 +187,31 @@ export class Bot implements BotConfigGetable {
181
187
  * @param qq 必选,群成员的 qq 号
182
188
  * @param name 可选,要设置的群名片
183
189
  * @param title 可选,要设置的群头衔
190
+ * @param permission 可选,要设置的群头衔
184
191
  */
185
- setMemberInfo({ group, qq, name, title }: Bot.SetMemberInfoOptions): Promise<void>;
192
+ setMemberInfo({ group, qq, name, title, permission }: Bot.SetMemberInfoOptions): Promise<void>;
193
+
194
+ /**
195
+ * @description 获取群公告列表迭代器
196
+ * @param group 必选,群号
197
+ * @returns 迭代器
198
+ */
199
+ getAnnoIter({ group }: Bot.GetAnnoIterOptions): AsyncGenerator<Bot.AnnoInfo>;
200
+
201
+ /**
202
+ * @description 发布群公告
203
+ * @param group 必选,群号
204
+ * @param content 必选,公告内容
205
+ */
206
+ async publishAnno({ group, content, pinned }: Bot.PublishAnnoOptions): Promise<void>;
207
+
208
+ /**
209
+ * @description 删除群公告
210
+ * @param {number} group 必选,群号
211
+ * @param {string} fid 必选,公告 id
212
+ * @reaturns {void}
213
+ */
214
+ async deleteAnno({ group, fid }: Bot.DeleteAnnoOptions): Promise<void>;
186
215
 
187
216
  /**
188
217
  * @description 禁言群成员
@@ -219,6 +248,12 @@ export class Bot implements BotConfigGetable {
219
248
  */
220
249
  removeMember({ group, qq, message }: Bot.RemoveMemberOptions): Promise<void>;
221
250
 
251
+ /**
252
+ * @description 删除好友
253
+ * @param qq 欲删除的好友 qq 号
254
+ */
255
+ removeFriend({ qq }: Bot.RemoveFriendOptions): Promise<void>;
256
+
222
257
  /**
223
258
  * @description 移除群成员
224
259
  * @param group 必选,欲移除的成员所在群号
@@ -363,8 +398,18 @@ declare namespace Bot {
363
398
  permission: GroupPermission;
364
399
  }
365
400
 
401
+ interface GetMemberInfoOptions {
402
+ group: number;
403
+ qq: number;
404
+ }
405
+
366
406
  interface MemberDetails {
367
- name: string;
407
+ id: number;
408
+ joinTimestamp: number;
409
+ lastSpeakTimestamp: number;
410
+ memberName: string;
411
+ nuteTimeRemaining: number;
412
+ permission: GroupPermission;
368
413
  title: string;
369
414
  }
370
415
 
@@ -372,11 +417,49 @@ declare namespace Bot {
372
417
  group: number;
373
418
  }
374
419
 
420
+ interface GetUserProfileOptions {
421
+ qq: number;
422
+ }
423
+
424
+ interface UserProfile {
425
+ nickname: string;
426
+ email: string;
427
+ age: number;
428
+ level: number;
429
+ sign: string;
430
+ sex: SEX;
431
+ }
432
+
375
433
  interface SetMemberInfoOptions {
376
434
  group: number;
377
435
  qq: number;
378
436
  name?: string;
379
437
  title?: string;
438
+ permission?: GroupPermission
439
+ }
440
+
441
+ interface GetAnnoIterOptions {
442
+ gourp: number;
443
+ }
444
+
445
+ interface PublishAnnoOptions {
446
+ group: number;
447
+ content: string;
448
+ pinned: boolean;
449
+ }
450
+
451
+ interface DeleteAnnoOptions {
452
+ group: number;
453
+ fid: string;
454
+ }
455
+ interface AnnoInfo {
456
+ group: { id: number; name: string; permission: GroupPermission; };
457
+ content: string;
458
+ senderId: number;
459
+ fid: string;
460
+ allConfirmed: boolean;
461
+ confirmedMembersCount: number;
462
+ publicationTime: number;
380
463
  }
381
464
 
382
465
  interface MuteOptions {
@@ -404,6 +487,10 @@ declare namespace Bot {
404
487
  message?: string;
405
488
  }
406
489
 
490
+ interface RemoveFriendOptions {
491
+ qq: number;
492
+ }
493
+
407
494
  interface QuitGroupOptions {
408
495
  group: number;
409
496
  }
package/src/Bot.js CHANGED
@@ -15,19 +15,24 @@ const _getFriendList = require('./core/getFriendList');
15
15
  const _getGroupList = require('./core/getGroupList');
16
16
  const _getMemberList = require('./core/getMemberList');
17
17
  const _getMemberInfo = require('./core/getMemberInfo');
18
+ const _getUserProfile = require('./core/getUserProfile');
18
19
  const _setMemberInfo = require('./core/setMemberInfo');
20
+ const _setMemberAdmin = require('./core/setMemberAdmin');
21
+ const _getAnnoList = require('./core/anno/getAnno');
22
+ const _publishAnno = require('./core/anno/publishAnno');
23
+ const _deleteAnno = require('./core/anno/deleteAnno');
19
24
  const _recall = require('./core/recall');
20
25
  const _mute = require('./core/mute');
21
26
  const _muteAll = require('./core/muteAll');
22
27
  const _unmute = require('./core/unmute');
23
28
  const _unmuteAll = require('./core/unmuteAll');
24
29
  const _removeMember = require('./core/removeMember');
30
+ const _removeFriend = require('./core/removeFriend');
25
31
  const _quitGroup = require('./core/quitGroup');
26
32
  const _getGroupConfig = require('./core/getGroupConfig');
27
33
  const _setGroupConfig = require('./core/setGroupConfig');
28
34
  const _setEssence = require('./core/setEssence');
29
- const _startListening = process.browser ? require('./core/startListeningBrowser') : require('./core/startListeningNode');
30
- const _stopListening = process.browser ? require('./core/stopListeningBrowser') : require('./core/stopListeningNode');
35
+ const { wsStartListening: _startListening, wsStopListening: _stopListening } = require('./polyfill/wsListener');
31
36
 
32
37
  // 其他
33
38
  const random = require('./util/random')(0, 2E16);
@@ -691,7 +696,7 @@ class Bot extends BotConfigGetable {
691
696
  * @description 获取群成员信息
692
697
  * @param {number} group 必选,群成员所在群号
693
698
  * @param {number} qq 必选,群成员的 qq 号
694
- * @returns {Object[]} 结构 { name, title } 群名片和群头衔
699
+ * @returns {Object}
695
700
  */
696
701
  async getMemberInfo({ group, qq }) {
697
702
  // 检查对象状态
@@ -719,15 +724,37 @@ class Bot extends BotConfigGetable {
719
724
  return memberInfo;
720
725
  }
721
726
 
727
+ /**
728
+ * @description 获取群成员信息
729
+ * @param {number} qq 必选,用户的 qq 号
730
+ * @returns {Object} 结构 { nickname, email, age, level, sign, sex }
731
+ */
732
+ async getUserProfile({ qq }) {
733
+ // 检查对象状态
734
+ if (!this.config) {
735
+ throw new Error('getUserProfile 请先调用 open,建立一个会话');
736
+ }
737
+
738
+ // 检查参数
739
+ if (!qq) {
740
+ throw new Error('getUserProfile 缺少必要的 qq 参数');
741
+ }
742
+
743
+ const { baseUrl, sessionKey } = this.config;
744
+ return await _getUserProfile({ baseUrl, sessionKey, target: qq });
745
+ }
746
+
722
747
  /**
723
748
  * @description 设置群成员信息
724
749
  * @param {number} group 必选,群成员所在群号
725
750
  * @param {number} qq 必选,群成员的 qq 号
726
751
  * @param {string} name 可选,要设置的群名片
727
752
  * @param {string} title 可选,要设置的群头衔
753
+ * @param {boolean} permission 可选,要设置的权限,
754
+ * 使用枚举值:Bot.Permission.Admin, Bot.Permission.Member
728
755
  * @returns {void}
729
756
  */
730
- async setMemberInfo({ group, qq, name, title }) {
757
+ async setMemberInfo({ group, qq, name, title, permission }) {
731
758
  // 检查对象状态
732
759
  if (!this.config) {
733
760
  throw new Error('setMemberInfo 请先调用 open,建立一个会话');
@@ -739,13 +766,109 @@ class Bot extends BotConfigGetable {
739
766
  group, qq
740
767
  })} 参数`);
741
768
  }
769
+ if (permission != undefined
770
+ && permission != Bot.groupPermission.ADMINISTRATOR
771
+ && permission != Bot.groupPermission.MEMBER) {
772
+ throw new Error('setMemberInfo admin 参数只能是 Bot.groupPermission.ADMINISTRATOR 或 Bot.groupPermission.Member');
773
+ }
774
+
775
+ // setMemberInfo
776
+ const { baseUrl, sessionKey } = this.config;
777
+ if (name != undefined || title != undefined) {
778
+ await _setMemberInfo({
779
+ baseUrl, sessionKey, target: group, memberId: qq,
780
+ name, specialTitle: title,
781
+ });
782
+ }
783
+
784
+ // setPermission
785
+ if (permission != undefined) {
786
+ await _setMemberAdmin({
787
+ baseUrl, sessionKey, target: group, memberId: qq,
788
+ assign: permission == Bot.groupPermission.ADMINISTRATOR ? true : false,
789
+ });
790
+ }
791
+ }
792
+
793
+ /**
794
+ * @description 获取群公告列表迭代器
795
+ * @param {number} group 必选,群号
796
+ * @returns 迭代器
797
+ */
798
+ async *getAnnoIter({ group }) {
799
+ // 检查对象状态
800
+ if (!this.config) {
801
+ throw new Error('getAnno 请先调用 open,建立一个会话');
802
+ }
803
+
804
+ // 检查参数
805
+ if (!group) {
806
+ throw new Error('getAnno 缺少必要的 group 参数');
807
+ }
742
808
 
743
809
  // 获取列表
744
810
  const { baseUrl, sessionKey } = this.config;
745
- await _setMemberInfo({
746
- baseUrl, sessionKey, target: group, memberId: qq,
747
- name, specialTitle: title,
748
- });
811
+ let offset = 0;
812
+ let annoList = await _getAnnoList({ baseUrl, sessionKey, id: group, offset, size: 10 });
813
+ while (annoList.length > 0) {
814
+ for (const anno of annoList) {
815
+ yield anno;
816
+ }
817
+
818
+ // 获取下一页
819
+ offset += 10;
820
+ annoList = await _getAnnoList({ baseUrl, sessionKey, id: group, offset, size: 10 });
821
+ }
822
+
823
+ return;
824
+ }
825
+
826
+ /**
827
+ * @description 发布群公告
828
+ * @param {number} group 必选,群号
829
+ * @param {string} content 必选,公告内容
830
+ * @returns {void}
831
+ */
832
+ async publishAnno({ group, content, pinned }) {
833
+ // 检查对象状态
834
+ if (!this.config) {
835
+ throw new Error('publishAllo 请先调用 open,建立一个会话');
836
+ }
837
+
838
+ // 检查参数
839
+ if (!group || !content) {
840
+ throw new Error(`publishAllo 缺少必要的 ${getInvalidParamsString({
841
+ group, content
842
+ })} 参数`);
843
+ }
844
+
845
+ // 发布公告
846
+ const { baseUrl, sessionKey } = this.config;
847
+ await _publishAnno({ baseUrl, sessionKey, target: group, content, pinned });
848
+ }
849
+
850
+ /**
851
+ * @description 删除群公告
852
+ * @param {number} group 必选,群号
853
+ * @param {string} fid 必选,公告 id
854
+ * @reaturns {void}
855
+ */
856
+ async deleteAnno({ group, fid }) {
857
+ // 检查对象状态
858
+ if (!this.config) {
859
+ throw new Error('deleteAnno 请先调用 open,建立一个会话');
860
+ }
861
+
862
+ // 检查参数
863
+ if (!group || !fid) {
864
+ throw new Error(`deleteAnno 缺少必要的 ${getInvalidParamsString({
865
+ group, fid
866
+ })} 参数`);
867
+ }
868
+
869
+ // 发布公告
870
+ const { baseUrl, sessionKey } = this.config;
871
+ await _deleteAnno({ baseUrl, sessionKey, id: group, fid });
749
872
  }
750
873
 
751
874
  /**
@@ -858,13 +981,35 @@ class Bot extends BotConfigGetable {
858
981
  await _removeMember({ baseUrl, sessionKey, target: group, memberId: qq, msg: message });
859
982
  }
860
983
 
984
+ /**
985
+ * @description 删除好友
986
+ * @param {*} qq 欲删除的好友 qq 号
987
+ * @returns {void}
988
+ */
989
+ async removeFriend({ qq }) {
990
+ // 检查对象状态
991
+ if (!this.config) {
992
+ throw new Error('removeFriend 请先调用 open,建立一个会话');
993
+ }
994
+
995
+ // 检查参数
996
+ if (!qq) {
997
+ throw new Error('removeFriend 缺少必要的 qq 参数');
998
+ }
999
+
1000
+ const { baseUrl, sessionKey } = this.config;
1001
+
1002
+ // 删除好友
1003
+ await _removeFriend({ baseUrl, sessionKey, target: qq });
1004
+ }
1005
+
861
1006
  /**
862
1007
  * @description 移除群成员
863
1008
  * @param {number} group 必选,欲移除的成员所在群号
864
1009
  * @returns {void}
865
1010
  */
866
1011
  async quitGroup({ group }) {
867
- // 检查对象状态
1012
+ // 检查对象状态
868
1013
  if (!this.config) {
869
1014
  throw new Error('quitGroup 请先调用 open,建立一个会话');
870
1015
  }
@@ -7,27 +7,31 @@ class FileManager {
7
7
  const baseUrl = bot.getBaseUrl();
8
8
  const sessionKey = bot.sessionKey();
9
9
  // core 柯里化,为内部类 File Directory 提供包装的接口
10
- this._getGroupFileList = ({ dir }) => require('./core/getGroupFileList')({
10
+ this._getGroupFileList = ({ dir }) => require('./core/fs/getGroupFileList')({
11
11
  baseUrl, sessionKey, target: group, dir
12
12
  });
13
13
 
14
- this._getGroupFileInfo = ({ id }) => require('./core/getGroupFileInfo')({
14
+ this._getGroupFileInfo = ({ id }) => require('./core/fs/getGroupFileInfo')({
15
15
  baseUrl, sessionKey, target: group, id
16
16
  });
17
17
 
18
- this._uploadFileAndSend = ({ type, path, file }) => require('./core/uploadFileAndSend')({
18
+ this._uploadFileAndSend = ({ type, path, file }) => require('./core/fs/uploadGroupFIle')({
19
19
  baseUrl, sessionKey, type, target: group, path, file
20
20
  });
21
21
 
22
- this._groupFileDelete = ({ id }) => require('./core/groupFileDelete')({
22
+ this._groupFileDelete = ({ id }) => require('./core/fs/deleteGroupFile')({
23
23
  baseUrl, sessionKey, target: group, id
24
24
  });
25
25
 
26
- this._groupFileRename = ({ id, rename }) => require('./core/groupFileRename')({
26
+ this._makeGroupDir = ({ dir }) => require('./core/fs/makeGroupDir')({
27
+ baseUrl, sessionKey, target: group, dir
28
+ });
29
+
30
+ this._groupFileRename = ({ id, rename }) => require('./core/fs/renameGroupFile')({
27
31
  baseUrl, sessionKey, target: group, id, rename
28
32
  });
29
33
 
30
- this._groupFileMove = ({ id, movePath }) => require('./core/groupFileMove')({
34
+ this._groupFileMove = ({ id, movePath }) => require('./core/fs/moveGroupFile')({
31
35
  baseUrl, sessionKey, target: group, id, movePath
32
36
  });
33
37
 
package/src/Middleware.js CHANGED
@@ -534,10 +534,58 @@ class Middleware {
534
534
  if (data.type != 'GroupMessage' && data.type != 'FriendMessage') {
535
535
  throw new Error('Middleware.syncWrapper 消息格式出错');
536
536
  }
537
+ const watiForMessageChain = async (qq) => {
538
+ qq = qq ?? data?.sender?.id;
539
+ if (qq == undefined) {
540
+ throw new Error('Middleware.syncWrapper 消息格式出错');
541
+ }
542
+ do {
543
+ var { messageChain, id } = await data.bot?.waiter?.wait(data.type, ({ messageChain, sender: { id } }) => ({ messageChain, id })) ?? {};
544
+ } while (qq != id);
545
+
546
+ return messageChain;
547
+ };
548
+
549
+ const waitForText = async (qq) => {
550
+ qq = qq ?? data?.sender?.id;
551
+ if (qq == undefined) {
552
+ throw new Error('Middleware.syncWrapper 消息格式出错');
553
+ }
554
+ do {
555
+ var { text, id } = await data.bot?.waiter?.wait(data.type, new Middleware().textProcessor().done(({ text, sender: { id } }) => ({ text, id }))) ?? {};
556
+ } while (qq != id);
557
+ return text;
558
+ };
559
+
560
+ const waitForCustom = async (qq, processor) => {
561
+ qq = qq ?? data?.sender?.id;
562
+ if (qq == undefined) {
563
+ throw new Error('Middleware.syncWrapper 消息格式出错');
564
+ }
565
+ do {
566
+ var data = await data.bot?.waiter?.wait(data.type, new Middleware().textProcessor().done((data) => data));
567
+ } while (qq != data?.sender?.id);
568
+ return await processor(data);
569
+ };
570
+
537
571
  data.waitFor = {
538
- messageChain: () => data.bot?.waiter?.wait(data.type, ({ messageChain }) => messageChain),
539
- text: () => data.bot?.waiter?.wait(data.type, new Middleware().textProcessor().done(({ text }) => text)),
540
- custom: (processor) => data.bot?.waiter?.wait(data.type, processor),
572
+ groupMember: (qq = undefined) => {
573
+ return {
574
+ messageChain: () => watiForMessageChain(qq),
575
+ text: () => waitForText(qq),
576
+ custom: (processor) => waitForCustom(qq, processor),
577
+ };
578
+ },
579
+ friend: (qq) => {
580
+ return {
581
+ messageChain: () => watiForMessageChain(qq),
582
+ text: () => waitForText(qq),
583
+ custom: (processor) => waitForCustom(qq, processor),
584
+ };
585
+ },
586
+ messageChain: () => watiForMessageChain(data.sender.id),
587
+ text: () => waitForText(data.sender.id),
588
+ custom: (processor) => waitForCustom(data.sender.id, processor),
541
589
  };
542
590
 
543
591
  await next();
@@ -0,0 +1,42 @@
1
+ const { errCodeMap } = require('../../util/errCode');
2
+ const axios = require('axios');
3
+ const { URL } = require('../../polyfill/URL');
4
+ const errorHandler = require('../../util/errorHandler');
5
+ const path = require('path');
6
+ const locationStr = `core.${path.basename(__filename, path.extname(__filename))}`;
7
+
8
+ /**
9
+ * @description 删除群公告
10
+ * @param {string} baseUrl mirai-api-http server 的地址
11
+ * @param {string} sessionKey 会话标识
12
+ * @param {number} id 群号
13
+ * @param {string} fid 公告 id
14
+ * @returns {Object} { code, msg }
15
+ */
16
+ module.exports = async ({ baseUrl, sessionKey, id, fid }) => {
17
+ try {
18
+ // 拼接 url
19
+ const url = new URL('/anno/delete', baseUrl).toString();
20
+
21
+ // 请求
22
+ const responseData = await axios.post(url, {
23
+ sessionKey, id, fid,
24
+ });
25
+ try {
26
+ var {
27
+ data: { msg: message, code }
28
+ } = responseData;
29
+ } catch (error) {
30
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
31
+ }
32
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
33
+ if (code in errCodeMap) {
34
+ throw new Error(message);
35
+ }
36
+ return { message, code };
37
+ } catch (error) {
38
+ console.error(`mirai-js: error ${locationStr}`);
39
+ errorHandler(error);
40
+ }
41
+
42
+ };