mirai-js 2.8.4 → 2.8.5

Sign up to get free protection for your applications and to get access to all the features.
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
+ };