mirai-js 2.8.4 → 2.8.5

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.
Files changed (79) hide show
  1. package/README.md +2 -0
  2. package/dist/browser/mirai-js.js +1 -1
  3. package/dist/node/borwserEntry.js +21 -0
  4. package/dist/node/lib/index.ts +0 -0
  5. package/index.ts +36 -3
  6. package/package.json +1 -1
  7. package/src/borwserEntry.js +11 -0
  8. package/src/lib/index.ts +0 -0
  9. package/srcold/BaseType.d.ts +419 -0
  10. package/srcold/Bot.d.ts +567 -0
  11. package/srcold/Bot.js +1208 -0
  12. package/srcold/FileManager.js +270 -0
  13. package/srcold/Message.d.ts +66 -0
  14. package/srcold/Message.js +314 -0
  15. package/srcold/Middleware.d.ts +170 -0
  16. package/srcold/Middleware.js +657 -0
  17. package/srcold/Waiter.d.ts +13 -0
  18. package/srcold/Waiter.js +24 -0
  19. package/srcold/core/anno/deleteAnno.js +43 -0
  20. package/srcold/core/anno/getAnno.js +44 -0
  21. package/srcold/core/anno/publishAnno.js +44 -0
  22. package/srcold/core/auth.js +40 -0
  23. package/srcold/core/fs/deleteGroupFile.js +45 -0
  24. package/srcold/core/fs/getGroupFileInfo.js +46 -0
  25. package/srcold/core/fs/getGroupFileList.js +47 -0
  26. package/srcold/core/fs/makeGroupDir.js +45 -0
  27. package/srcold/core/fs/moveGroupFile.js +47 -0
  28. package/srcold/core/fs/renameGroupFile.js +44 -0
  29. package/srcold/core/fs/uploadGroupFIle.js +58 -0
  30. package/srcold/core/getFriendList.js +37 -0
  31. package/srcold/core/getGroupConfig.js +37 -0
  32. package/srcold/core/getGroupList.js +37 -0
  33. package/srcold/core/getMemberInfo.js +41 -0
  34. package/srcold/core/getMemberList.js +49 -0
  35. package/srcold/core/getSessionConfig.js +39 -0
  36. package/srcold/core/getUserProfile.js +40 -0
  37. package/srcold/core/messageFromId.js +40 -0
  38. package/srcold/core/mute.js +41 -0
  39. package/srcold/core/muteAll.js +39 -0
  40. package/srcold/core/quitGroup.js +40 -0
  41. package/srcold/core/recall.js +39 -0
  42. package/srcold/core/releaseSession.js +41 -0
  43. package/srcold/core/removeFriend.js +40 -0
  44. package/srcold/core/removeMember.js +42 -0
  45. package/srcold/core/responseBotInvitedJoinGroupRequest.js +46 -0
  46. package/srcold/core/responseFirendRequest.js +45 -0
  47. package/srcold/core/responseMemberJoinRequest.js +47 -0
  48. package/srcold/core/sendCommand.js +41 -0
  49. package/srcold/core/sendFriendMessage.js +43 -0
  50. package/srcold/core/sendGroupMessage.js +43 -0
  51. package/srcold/core/sendImageMessage.js +4 -0
  52. package/srcold/core/sendNudge.js +43 -0
  53. package/srcold/core/sendTempMessage.js +55 -0
  54. package/srcold/core/setEssence.js +44 -0
  55. package/srcold/core/setGroupConfig.js +58 -0
  56. package/srcold/core/setMemberAdmin.js +44 -0
  57. package/srcold/core/setMemberInfo.js +48 -0
  58. package/srcold/core/setSessionConfig.js +41 -0
  59. package/srcold/core/startListeningBrowser.js +62 -0
  60. package/srcold/core/startListeningNode.js +74 -0
  61. package/srcold/core/stopListeningBrowser.js +34 -0
  62. package/srcold/core/stopListeningNode.js +34 -0
  63. package/srcold/core/unmute.js +40 -0
  64. package/srcold/core/unmuteAll.js +39 -0
  65. package/srcold/core/uploadImage.js +55 -0
  66. package/srcold/core/uploadVoice.js +54 -0
  67. package/srcold/core/verify.js +41 -0
  68. package/srcold/index.d.ts +10 -0
  69. package/srcold/index.js +21 -0
  70. package/srcold/interface.js +20 -0
  71. package/srcold/polyfill/URL.js +5 -0
  72. package/srcold/polyfill/wsListener.js +6 -0
  73. package/srcold/typeHelpers.d.ts +2 -0
  74. package/srcold/util/errCode.js +23 -0
  75. package/srcold/util/errorHandler.js +24 -0
  76. package/srcold/util/getInvalidParamsString.js +12 -0
  77. package/srcold/util/isBrowserEnv.js +3 -0
  78. package/srcold/util/random.js +6 -0
  79. package/webpack.config.js +3 -2
@@ -0,0 +1,43 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+ /**
10
+ * @description 向 qq 好友发送消息
11
+ * @param {string} baseUrl mirai-api-http server 的地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} target 目标好友 qq 号
14
+ * @param {number} quote 消息引用,使用发送时返回的 messageId
15
+ * @param {MessageType[]} messageChain 消息链,MessageType 数组
16
+ * @returns {Object} 结构 { message, code, messageId }
17
+ */
18
+ module.exports = async ({ baseUrl, sessionKey, target, quote, messageChain }) => {
19
+ try {
20
+ // 拼接 url
21
+ const url = new URL('/sendFriendMessage', baseUrl).toString();
22
+
23
+ // 请求
24
+ const responseData = await axios.post(url, {
25
+ sessionKey, target, quote, messageChain
26
+ });
27
+ try {
28
+ var {
29
+ data: { msg: message, code, messageId }
30
+ } = responseData;
31
+ } catch (error) {
32
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
33
+ }
34
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
35
+ if (code in errCodeMap) {
36
+ throw new Error(message);
37
+ }
38
+ return messageId;
39
+ } catch (error) {
40
+ console.error(`mirai-js: error ${locationStr}`);
41
+ errorHandler(error);
42
+ }
43
+ };
@@ -0,0 +1,43 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+ /**
10
+ * @description 向 qq 群发送消息
11
+ * @param {string} baseUrl mirai-api-http server 的地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} target 目标群号
14
+ * @param {number} quote 消息引用,使用发送时返回的 messageId
15
+ * @param {MessageType[]} messageChain 消息链,MessageType 数组
16
+ * @returns {Object} 结构 { message, code, messageId }
17
+ */
18
+ module.exports = async ({ baseUrl, sessionKey, target, quote, messageChain }) => {
19
+ try {
20
+ // 拼接 url
21
+ const url = new URL('/sendGroupMessage', baseUrl).toString();
22
+
23
+ // 请求
24
+ const responseData = await axios.post(url, {
25
+ sessionKey, target, quote, messageChain
26
+ });
27
+ try {
28
+ var {
29
+ data: { msg: message, code, messageId }
30
+ } = responseData;
31
+ } catch (error) {
32
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
33
+ }
34
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
35
+ if (code in errCodeMap) {
36
+ throw new Error(message);
37
+ }
38
+ return messageId;
39
+ } catch (error) {
40
+ console.error(`mirai-js: error ${locationStr}`);
41
+ errorHandler(error);
42
+ }
43
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 使用此方法向指定对象(群或好友)发送图片消息 除非需要通过此手段获取imageId,否则不推荐使用该接口
3
+ * 暂不提供该接口的实现
4
+ */
@@ -0,0 +1,43 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+ /**
10
+ * @description 发送戳一戳消息
11
+ * @param {string} baseUrl mirai-api-http server 的地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} target 戳一戳的目标
14
+ * @param {number} subject 戳一戳的上下文,群或好友
15
+ * @param {string} kind 上下文类型, 可选值 Friend, Group
16
+ * @returns {Object} 结构 { message, code, messageId }
17
+ */
18
+ module.exports = async ({ baseUrl, sessionKey, target, subject, kind }) => {
19
+ try {
20
+ // 拼接 url
21
+ const url = new URL('/sendNudge', baseUrl).toString();
22
+
23
+ // 请求
24
+ const responseData = await axios.post(url, {
25
+ sessionKey, target, subject, kind
26
+ });
27
+ try {
28
+ var {
29
+ data: { msg: message, code }
30
+ } = responseData;
31
+ } catch (error) {
32
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
33
+ }
34
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
35
+ if (code in errCodeMap) {
36
+ throw new Error(message);
37
+ }
38
+ return { message, code };
39
+ } catch (error) {
40
+ console.error(`mirai-js: error ${locationStr}`);
41
+ errorHandler(error);
42
+ }
43
+ };
@@ -0,0 +1,55 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+ /**
10
+ * @description 向临时对象发送消息
11
+ * @param {string} baseUrl mirai-api-http server 的地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} qq 目标 qq 号
14
+ * @param {number} group 目标群号
15
+ * @param {number} quote 消息引用,使用发送时返回的 messageId
16
+ * @param {MessageType[]} messageChain 消息链,MessageType 数组
17
+ * @returns {Object} 结构 { message, code, messageId }
18
+ */
19
+ module.exports = async ({ baseUrl, sessionKey, qq, group, quote, messageChain }) => {
20
+ try {
21
+ // 拼接 url
22
+ const url = new URL('/sendTempMessage', baseUrl).toString();
23
+
24
+ if (!qq || !group) {
25
+ throw new Error('sendTempMessage 缺少必要的 qq 和 group 参数');
26
+ }
27
+
28
+ // 请求
29
+ const responseData = await axios.post(url, {
30
+ sessionKey,
31
+ qq,
32
+ group,
33
+ quote,
34
+ messageChain
35
+ });
36
+
37
+ try {
38
+ var {
39
+ data: { msg: message, code, messageId }
40
+ } = responseData;
41
+ } catch (error) {
42
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
43
+ }
44
+
45
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
46
+ if (code in errCodeMap) {
47
+ throw new Error(message);
48
+ }
49
+ return messageId;
50
+ } catch (error) {
51
+ console.error(`mirai-js: error ${locationStr}`);
52
+ errorHandler(error);
53
+ }
54
+
55
+ };
@@ -0,0 +1,44 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+
10
+ /**
11
+ * @description 设置群精华消息
12
+ * @param {string} baseUrl mirai-api-http server 的地址
13
+ * @param {string} sessionKey 会话标识
14
+ * @param {string} target 消息 id
15
+ * @returns {Object} 结构 { message, code }
16
+ */
17
+ module.exports = async ({
18
+ baseUrl, sessionKey, target
19
+ }) => {
20
+ try {
21
+ // 拼接 url
22
+ const url = new URL('/setEssence', baseUrl).toString();
23
+
24
+ // 请求
25
+ const responseData = await axios.post(url, {
26
+ sessionKey, target,
27
+ });
28
+ try {
29
+ var {
30
+ data: { msg: message, code }
31
+ } = responseData;
32
+ } catch (error) {
33
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
34
+ }
35
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
36
+ if (code in errCodeMap) {
37
+ throw new Error(message);
38
+ }
39
+ return { message, code };
40
+ } catch (error) {
41
+ console.error(`mirai-js: error ${locationStr}`);
42
+ errorHandler(error);
43
+ }
44
+ };
@@ -0,0 +1,58 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+
10
+ /**
11
+ * @description 设置群配置
12
+ * @param {string} baseUrl mirai-api-http server 的地址
13
+ * @param {string} sessionKey 会话标识
14
+ * @param {string} name 群名
15
+ * @param {string} announcement 群公告
16
+ * @param {boolean} confessTalk 是否开启坦白说
17
+ * @param {boolean} allowMemberInvite 是否允许群员邀请
18
+ * @param {boolean} autoApprove 是否开启自动审批入群
19
+ * @param {boolean} anonymousChat 是否允许匿名聊天
20
+ * @returns {Object} 结构 { message, code }
21
+ */
22
+ module.exports = async ({
23
+ baseUrl, sessionKey, target,
24
+ name, announcement, confessTalk, allowMemberInvite, autoApprove, anonymousChat
25
+ }) => {
26
+ try {
27
+ // 拼接 url
28
+ const url = new URL('/groupConfig', baseUrl).toString();
29
+
30
+ // 请求
31
+ const responseData = await axios.post(url, {
32
+ sessionKey, target,
33
+ config: {
34
+ name,
35
+ announcement,
36
+ confessTalk,
37
+ allowMemberInvite,
38
+ autoApprove,
39
+ anonymousChat,
40
+ }
41
+ });
42
+ try {
43
+ var {
44
+ data: { msg: message, code }
45
+ } = responseData;
46
+ } catch (error) {
47
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
48
+ }
49
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
50
+ if (code in errCodeMap) {
51
+ throw new Error(message);
52
+ }
53
+ return { message, code };
54
+ } catch (error) {
55
+ console.error(`mirai-js: error ${locationStr}`);
56
+ errorHandler(error);
57
+ }
58
+ };
@@ -0,0 +1,44 @@
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 { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+ /**
10
+ * @description 设置群成员权限
11
+ * @param {string} baseUrl mirai-api-http server 的地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} target 群成员所在群号
14
+ * @param {number} memberId 群成员的 qq 号
15
+ * @param {string} assign 是否设置为管理员
16
+ * @returns {Object} 结构 { message, code }
17
+ */
18
+ module.exports = async ({ baseUrl, sessionKey, target, memberId, assign }) => {
19
+ try {
20
+ // 拼接 url
21
+ const url = new URL('/memberAdmin', baseUrl).toString();
22
+
23
+ // 请求
24
+ const responseData = await axios.post(url, {
25
+ sessionKey, target, memberId, assign
26
+ });
27
+ try {
28
+ var {
29
+ data: { msg: message, code }
30
+ } = responseData;
31
+ } catch (error) {
32
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
33
+ }
34
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
35
+ if (code in errCodeMap) {
36
+ throw new Error(message);
37
+ }
38
+ return { message, code };
39
+ } catch (error) {
40
+ console.error(`mirai-js: error ${locationStr}`);
41
+ errorHandler(error);
42
+ }
43
+
44
+ };
@@ -0,0 +1,48 @@
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 { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+ /**
10
+ * @description 设置群成员信息
11
+ * @param {string} baseUrl mirai-api-http server 的地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} target 群成员所在群号
14
+ * @param {number} memberId 群成员的 qq 号
15
+ * @param {string} name 要设置的群名片
16
+ * @param {string} specialTitle 要设置的群头衔
17
+ * @returns {Object} 结构 { message, code }
18
+ */
19
+ module.exports = async ({ baseUrl, sessionKey, target, memberId, name, specialTitle }) => {
20
+ try {
21
+ // 拼接 url
22
+ const url = new URL('/memberInfo', baseUrl).toString();
23
+
24
+ // 请求
25
+ const responseData = await axios.post(url, {
26
+ sessionKey, target, memberId,
27
+ info: {
28
+ name, specialTitle,
29
+ }
30
+ });
31
+ try {
32
+ var {
33
+ data: { msg: message, code }
34
+ } = responseData;
35
+ } catch (error) {
36
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
37
+ }
38
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
39
+ if (code in errCodeMap) {
40
+ throw new Error(message);
41
+ }
42
+ return { message, code };
43
+ } catch (error) {
44
+ console.error(`mirai-js: error ${locationStr}`);
45
+ errorHandler(error);
46
+ }
47
+
48
+ };
@@ -0,0 +1,41 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+
10
+ /**
11
+ * @description 设置指定 session 的 config
12
+ * @param {string} baseUrl mirai-api-http server 的地址
13
+ * @param {string} sessionKey 会话标识
14
+ * @param {number} cacheSize 插件缓存大小
15
+ * @param {boolean} enableWebsocket websocket 状态
16
+ * @returns {Object} 结构 { message, code }
17
+ */
18
+ module.exports = async ({ baseUrl, sessionKey, cacheSize, enableWebsocket }) => {
19
+ try {
20
+ // 拼接 url
21
+ const url = new URL('/config', baseUrl).toString();
22
+
23
+ // 请求
24
+ const responseData = await axios.post(url, { sessionKey, cacheSize, enableWebsocket });
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
+ };
@@ -0,0 +1,62 @@
1
+ const WebSocket = window.WebSocket;
2
+ const { URL } = require('../polyfill/URL');
3
+ const errorHandler = require('../util/errorHandler');
4
+ const path = require('path');
5
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
6
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
7
+
8
+ /**
9
+ * @description 开始侦听事件
10
+ * @param {string} baseUrl mirai-api-http server 的地址
11
+ * @param {string} sessionKey 会话标识
12
+ * @param {function} message 回调函数
13
+ * @param {function} error 回调函数
14
+ * @param {function} close 回调函数
15
+ * @returns {WebSocket} 建立连接的 WebSocket 实例
16
+ */
17
+ module.exports = async ({ baseUrl, sessionKey, verifyKey, message, error, close }) => {
18
+ try {
19
+ // 拼接 url
20
+ let url = new URL(`/all?sessionKey=${sessionKey}&verifyKey=${verifyKey}`, baseUrl);
21
+ // 更改协议为 ws
22
+ url.protocol = 'ws';
23
+ url = url.toString();
24
+
25
+ const ws = new WebSocket(url);
26
+
27
+ // 监听 ws 事件,分发消息
28
+ ws.onopen = () => {
29
+ // 10s 发个心跳,浏览器会过早关闭没有发生交互的连接
30
+ const interval = setInterval(() => {
31
+ ws.send(1);
32
+ }, 10000);
33
+
34
+ ws.onmessage = ({ data }) => {
35
+ try {
36
+ message(JSON.parse(data)?.data);
37
+ } catch (error) { }// eslint-disable-line no-empty
38
+ };
39
+
40
+ ws.onerror = err => {
41
+ /*
42
+ interface Error {
43
+ name: string;
44
+ message: string;
45
+ stack?: string;
46
+ }
47
+ */
48
+ error(err);
49
+ };
50
+
51
+ ws.onclose = ({ code, reason }) => {
52
+ // 关闭心跳
53
+ clearInterval(interval);
54
+ close({ code, reason });
55
+ };
56
+ };
57
+ return ws;
58
+ } catch (error) {
59
+ console.error(`mirai-js: error ${locationStr}`);
60
+ errorHandler(error);
61
+ }
62
+ };
@@ -0,0 +1,74 @@
1
+ const WebSocket = require('ws');
2
+ const { URL } = require('../polyfill/URL');
3
+ const errorHandler = require('../util/errorHandler');
4
+ const path = require('path');
5
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
6
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
7
+
8
+ /**
9
+ * @description 开始侦听事件
10
+ * @param {string} baseUrl mirai-api-http server 的地址
11
+ * @param {string} sessionKey 会话标识
12
+ * @param {function} message 回调函数
13
+ * @param {function} error 回调函数
14
+ * @param {function} close 回调函数
15
+ * @param {function} unexpectedResponse 回调函数
16
+ * @returns {WebSocket} 建立连接的 WebSocket 实例
17
+ */
18
+ module.exports = async ({ baseUrl, sessionKey, verifyKey, message, error, close, unexpectedResponse }) => {
19
+ try {
20
+ // 拼接 url
21
+ let url = new URL(`/all?sessionKey=${sessionKey}&verifyKey=${verifyKey}`, baseUrl);
22
+ // 更改协议为 ws
23
+ url.protocol = 'ws';
24
+ url = url.toString();
25
+
26
+ const ws = new WebSocket(url);
27
+
28
+
29
+ // 监听 ws 事件,分发消息
30
+ ws.on('open', () => {
31
+ // 60s 发个心跳
32
+ const interval = setInterval(() => {
33
+ ws.ping((err) => {
34
+ if (err) {
35
+ try {
36
+ console.log(`ws ping error\n${JSON.stringify(err)}`);
37
+ } catch (error) { }// eslint-disable-line no-empty
38
+ }
39
+ });
40
+ }, 60000);
41
+
42
+ ws.on('message', data => {
43
+ try {
44
+ message(JSON.parse(data)?.data);
45
+ } catch (error) { }// eslint-disable-line no-empty
46
+ });
47
+
48
+ ws.on('error', err => {
49
+ /*
50
+ interface Error {
51
+ name: string;
52
+ message: string;
53
+ stack?: string;
54
+ }
55
+ */
56
+ error(err);
57
+ });
58
+
59
+ ws.on('close', (code, reason) => {
60
+ // 关闭心跳
61
+ clearInterval(interval);
62
+ close({ code, reason });
63
+ });
64
+
65
+ ws.on('unexpectedResponse', ({ req, res }) => {
66
+ unexpectedResponse({ req, res });
67
+ });
68
+ });
69
+ return ws;
70
+ } catch (error) {
71
+ console.error(`mirai-js: error ${locationStr}`);
72
+ errorHandler(error);
73
+ }
74
+ };
@@ -0,0 +1,34 @@
1
+ const errorHandler = require('../util/errorHandler');
2
+ const path = require('path');
3
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
4
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
5
+
6
+ /**
7
+ * @description 停止侦听事件
8
+ * @param {WebSocket} 建立连接的 WebSocket 实例
9
+ */
10
+ module.exports = async (wsConnection) => {
11
+ try {
12
+ // 由于在 ws open 之前关闭连接会抛异常,故应先判断此时是否正在连接中
13
+ if (wsConnection.readyState == wsConnection.CONNECTING) {
14
+ // 正在连接中,注册一个 open,等待回调时关闭
15
+ // 由于是一个异步过程,使用 Promise 包装以配合开发者可能存在的同步调用
16
+ await new Promise(resolve => {
17
+ wsConnection.onopen = () => {
18
+ // 关闭 websocket 的连接
19
+ wsConnection.close(1000);
20
+ resolve(undefined);
21
+ };
22
+ });
23
+ } else if (wsConnection.readyState == wsConnection.OPEN) {
24
+ // 关闭 websocket 的连接
25
+ wsConnection.close(1000);
26
+ } else {
27
+ // CLOSING or CLOSED
28
+ // do nothing
29
+ }
30
+ } catch (error) {
31
+ console.error(`mirai-js: error ${locationStr}`);
32
+ errorHandler(error);
33
+ }
34
+ };
@@ -0,0 +1,34 @@
1
+ const errorHandler = require('../util/errorHandler');
2
+ const path = require('path');
3
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
4
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
5
+
6
+ /**
7
+ * @description 停止侦听事件
8
+ * @param {WebSocket} 建立连接的 WebSocket 实例
9
+ */
10
+ module.exports = async (wsConnection) => {
11
+ try {
12
+ // 由于在 ws open 之前关闭连接会抛异常,故应先判断此时是否正在连接中
13
+ if (wsConnection.readyState == wsConnection.CONNECTING) {
14
+ // 正在连接中,注册一个 open,等待回调时关闭
15
+ // 由于是一个异步过程,使用 Promise 包装以配合开发者可能存在的同步调用
16
+ await new Promise(resolve => {
17
+ wsConnection.on('open', () => {
18
+ // 关闭 websocket 的连接
19
+ wsConnection.close(1000);
20
+ resolve(undefined);
21
+ });
22
+ });
23
+ } else if (wsConnection.readyState == wsConnection.OPEN) {
24
+ // 关闭 websocket 的连接
25
+ wsConnection.close(1000);
26
+ } else {
27
+ // CLOSING or CLOSED
28
+ // do nothing
29
+ }
30
+ } catch (error) {
31
+ console.error(`mirai-js: error ${locationStr}`);
32
+ errorHandler(error);
33
+ }
34
+ };
@@ -0,0 +1,40 @@
1
+ const { errCodeMap } = require('../util/errCode');
2
+ const axios = require('axios').default;
3
+ const { URL } = require('../polyfill/URL');
4
+ const errorHandler = require('../util/errorHandler');
5
+ const path = require('path');
6
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
7
+ const locationStr = !isBrowserEnv() ? `core.${path.basename(__filename, path.extname(__filename))}` : 'borwser';
8
+
9
+ /**
10
+ * @description 解除禁言
11
+ * @param {string} baseUrl mirai-api-http server 的主机地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} target 欲解除禁言的成员所在群号
14
+ * @param {number} memberId 欲解除禁言的成员 qq 号
15
+ * @returns {Object} 结构 { message, code }
16
+ */
17
+ module.exports = async ({ baseUrl, sessionKey, target, memberId }) => {
18
+ try {
19
+ // 拼接 URL
20
+ const url = new URL('/unmute', baseUrl).toString();
21
+
22
+ // 请求
23
+ const responseData = await axios.post(url, { sessionKey, target, memberId });
24
+ try {
25
+ var {
26
+ data: { code, msg: message }
27
+ } = responseData;
28
+ } catch (error) {
29
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
30
+ }
31
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
32
+ if (code in errCodeMap) {
33
+ throw new Error(message);
34
+ }
35
+ return { message, code };
36
+ } catch (error) {
37
+ console.error(`mirai-js: error ${locationStr}`);
38
+ errorHandler(error);
39
+ }
40
+ };