mirai-js 2.8.3 → 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 (83) hide show
  1. package/1.mp3 +0 -0
  2. package/README.md +2 -0
  3. package/demo.ts +3 -6
  4. package/dist/browser/mirai-js.js +1 -1
  5. package/dist/node/borwserEntry.js +21 -0
  6. package/dist/node/core/uploadVoice.js +1 -1
  7. package/dist/node/lib/index.ts +0 -0
  8. package/index.ts +36 -3
  9. package/package.json +1 -1
  10. package/src/borwserEntry.js +11 -0
  11. package/src/core/uploadVoice.js +1 -1
  12. package/src/lib/index.ts +0 -0
  13. package/srcold/BaseType.d.ts +419 -0
  14. package/srcold/Bot.d.ts +567 -0
  15. package/srcold/Bot.js +1208 -0
  16. package/srcold/FileManager.js +270 -0
  17. package/srcold/Message.d.ts +66 -0
  18. package/srcold/Message.js +314 -0
  19. package/srcold/Middleware.d.ts +170 -0
  20. package/srcold/Middleware.js +657 -0
  21. package/srcold/Waiter.d.ts +13 -0
  22. package/srcold/Waiter.js +24 -0
  23. package/srcold/core/anno/deleteAnno.js +43 -0
  24. package/srcold/core/anno/getAnno.js +44 -0
  25. package/srcold/core/anno/publishAnno.js +44 -0
  26. package/srcold/core/auth.js +40 -0
  27. package/srcold/core/fs/deleteGroupFile.js +45 -0
  28. package/srcold/core/fs/getGroupFileInfo.js +46 -0
  29. package/srcold/core/fs/getGroupFileList.js +47 -0
  30. package/srcold/core/fs/makeGroupDir.js +45 -0
  31. package/srcold/core/fs/moveGroupFile.js +47 -0
  32. package/srcold/core/fs/renameGroupFile.js +44 -0
  33. package/srcold/core/fs/uploadGroupFIle.js +58 -0
  34. package/srcold/core/getFriendList.js +37 -0
  35. package/srcold/core/getGroupConfig.js +37 -0
  36. package/srcold/core/getGroupList.js +37 -0
  37. package/srcold/core/getMemberInfo.js +41 -0
  38. package/srcold/core/getMemberList.js +49 -0
  39. package/srcold/core/getSessionConfig.js +39 -0
  40. package/srcold/core/getUserProfile.js +40 -0
  41. package/srcold/core/messageFromId.js +40 -0
  42. package/srcold/core/mute.js +41 -0
  43. package/srcold/core/muteAll.js +39 -0
  44. package/srcold/core/quitGroup.js +40 -0
  45. package/srcold/core/recall.js +39 -0
  46. package/srcold/core/releaseSession.js +41 -0
  47. package/srcold/core/removeFriend.js +40 -0
  48. package/srcold/core/removeMember.js +42 -0
  49. package/srcold/core/responseBotInvitedJoinGroupRequest.js +46 -0
  50. package/srcold/core/responseFirendRequest.js +45 -0
  51. package/srcold/core/responseMemberJoinRequest.js +47 -0
  52. package/srcold/core/sendCommand.js +41 -0
  53. package/srcold/core/sendFriendMessage.js +43 -0
  54. package/srcold/core/sendGroupMessage.js +43 -0
  55. package/srcold/core/sendImageMessage.js +4 -0
  56. package/srcold/core/sendNudge.js +43 -0
  57. package/srcold/core/sendTempMessage.js +55 -0
  58. package/srcold/core/setEssence.js +44 -0
  59. package/srcold/core/setGroupConfig.js +58 -0
  60. package/srcold/core/setMemberAdmin.js +44 -0
  61. package/srcold/core/setMemberInfo.js +48 -0
  62. package/srcold/core/setSessionConfig.js +41 -0
  63. package/srcold/core/startListeningBrowser.js +62 -0
  64. package/srcold/core/startListeningNode.js +74 -0
  65. package/srcold/core/stopListeningBrowser.js +34 -0
  66. package/srcold/core/stopListeningNode.js +34 -0
  67. package/srcold/core/unmute.js +40 -0
  68. package/srcold/core/unmuteAll.js +39 -0
  69. package/srcold/core/uploadImage.js +55 -0
  70. package/srcold/core/uploadVoice.js +54 -0
  71. package/srcold/core/verify.js +41 -0
  72. package/srcold/index.d.ts +10 -0
  73. package/srcold/index.js +21 -0
  74. package/srcold/interface.js +20 -0
  75. package/srcold/polyfill/URL.js +5 -0
  76. package/srcold/polyfill/wsListener.js +6 -0
  77. package/srcold/typeHelpers.d.ts +2 -0
  78. package/srcold/util/errCode.js +23 -0
  79. package/srcold/util/errorHandler.js +24 -0
  80. package/srcold/util/getInvalidParamsString.js +12 -0
  81. package/srcold/util/isBrowserEnv.js +3 -0
  82. package/srcold/util/random.js +6 -0
  83. package/webpack.config.js +3 -2
@@ -0,0 +1,39 @@
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
+ * @returns {Object} 结构 { message, code }
15
+ */
16
+ module.exports = async ({ baseUrl, sessionKey, target }) => {
17
+ try {
18
+ // 拼接 URL
19
+ const url = new URL('/unmuteAll', baseUrl).toString();
20
+
21
+ // 请求
22
+ const responseData = await axios.post(url, { sessionKey, target });
23
+ try {
24
+ var {
25
+ data: { code, msg: message }
26
+ } = responseData;
27
+ } catch (error) {
28
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
29
+ }
30
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
31
+ if (code in errCodeMap) {
32
+ throw new Error(message);
33
+ }
34
+ return { message, code };
35
+ } catch (error) {
36
+ console.error(`mirai-js: error ${locationStr}`);
37
+ errorHandler(error);
38
+ }
39
+ };
@@ -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
+ const FormData = require('form-data');
9
+
10
+
11
+ /**
12
+ * @description 上传图片至服务器,返回指定 type 的 imageId,url,及 path
13
+ * @param {string} baseUrl mirai-api-http server 的地址
14
+ * @param {string} sessionKey 会话标识
15
+ * @param {string} type "friend" 或 "group" 或 "temp"
16
+ * @param {Buffer} img 图片二进制数据
17
+ * @returns {Object} 结构 { imageId, url, path }
18
+ */
19
+ module.exports = async ({ baseUrl, sessionKey, type, img }) => {
20
+ try {
21
+ // 拼接 url
22
+ const targetUrl = new URL('/uploadImage', baseUrl).toString();
23
+
24
+ // 构造 fromdata
25
+ const form = new FormData();
26
+ form.append('sessionKey', sessionKey);
27
+ form.append('type', type);
28
+ // filename 指定了文件名
29
+ form.append('img', img, { filename: 'img.jpg' });
30
+
31
+ // 请求
32
+ const responseData = await axios.post(targetUrl, form, {
33
+ // formdata.getHeaders 将会指定 content-type,同时给定随
34
+ // 机生成的 boundary,即分隔符,用以分隔多个表单项而不会造成混乱
35
+ headers: form.getHeaders(),
36
+ });
37
+
38
+ try {
39
+ var {
40
+ data: { msg: message, code, imageId, url, path }
41
+ } = responseData;
42
+ } catch (error) {
43
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
44
+ }
45
+
46
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
47
+ if (code in errCodeMap) {
48
+ throw new Error(message);
49
+ }
50
+ return { imageId, url, path };
51
+ } catch (error) {
52
+ console.error(`mirai-js: error ${locationStr}`);
53
+ errorHandler(error);
54
+ }
55
+ };
@@ -0,0 +1,54 @@
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
+ const FormData = require('form-data');
9
+
10
+
11
+ /**
12
+ * FIXME: 目前该功能返回的 voiceId 无法正常使用,无法
13
+ * 发送给好友,提示 message is empty,发到群里则是 1s 的无声语音
14
+ * @description 上传语音至服务器,返回指定 type 的 imageId,url,及 path
15
+ * @param {string} baseUrl mirai-api-http server 的地址
16
+ * @param {string} sessionKey 会话标识
17
+ * @param {string} type TODO: 目前服务端仅支持 "group"
18
+ * @param {Buffer} voice 语音二进制数据
19
+ * @returns {Object} 结构 { imageId, url, path }
20
+ */
21
+ module.exports = async ({ baseUrl, sessionKey, type, voice }) => {
22
+ try {
23
+ // 拼接 url
24
+ const targetUrl = new URL('/uploadVoice', baseUrl).toString();
25
+
26
+ // 构造 fromdata
27
+ const form = new FormData();
28
+ form.append('sessionKey', sessionKey);
29
+ form.append('type', type);
30
+ form.append('voice', voice, { filename: 'voice.slk' });
31
+
32
+ // 请求
33
+ const responseData = await axios.post(targetUrl, form, {
34
+ // formdata.getHeaders 将会指定 content-type,同时给定随
35
+ // 机生成的 boundary,即分隔符,用以分隔多个表单项而不会造成混乱
36
+ headers: form.getHeaders(),
37
+ });
38
+ try {
39
+ var {
40
+ data: { msg: message, code, voiceId, url, path }
41
+ } = responseData;
42
+ } catch (error) {
43
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
44
+ }
45
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
46
+ if (code in errCodeMap) {
47
+ throw new Error(message);
48
+ }
49
+ return { voiceId, url, path };
50
+ } catch (error) {
51
+ console.error(`mirai-js: error ${locationStr}`);
52
+ errorHandler(error);
53
+ }
54
+ };
@@ -0,0 +1,41 @@
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 校验 sessionKey,将一个 session 绑定到指定的 qq 上
11
+ * @param {string} baseUrl mirai-api-http server 的地址
12
+ * @param {string} sessionKey 会话标识
13
+ * @param {number} qq qq 号
14
+ * @param {boolean} throwable 是否抛出已知的 mah 异常,用来在发生异常时获得返回值中的 mah 状态码
15
+ * @returns {Object} 结构 { message, code }
16
+ */
17
+ module.exports = async ({ baseUrl, sessionKey, qq, throwable = true }) => {
18
+ try {
19
+ // 拼接 auth url
20
+ const url = new URL('/bind', baseUrl).toString();
21
+
22
+ // 请求
23
+ const responseData = await axios.post(url, { sessionKey, qq });
24
+ try {
25
+ var {
26
+ data: { msg: message, code },
27
+ } = responseData;
28
+ } catch (error) {
29
+ throw new Error(('请求返回格式出错,请检查 mirai-console'));
30
+ }
31
+ // 抛出 mirai 的异常,到 catch 中处理后再抛出
32
+ if (code in errCodeMap) {
33
+ if (throwable) throw new Error(message);
34
+ }
35
+ return { message, code };
36
+ } catch (error) {
37
+ console.error(`mirai-js: error ${locationStr}`);
38
+ errorHandler(error);
39
+ }
40
+
41
+ };
@@ -0,0 +1,10 @@
1
+ import { Bot, Bot as BotType } from './Bot';
2
+ import { Message, Message as MessageType } from './Message';
3
+ import { Middleware, Middleware as MiddlewareType } from './Middleware';
4
+
5
+ export { Bot, Message, Middleware };
6
+ declare module 'mirai-js' {
7
+ export const Bot: typeof BotType;
8
+ export const Message: typeof MessageType;
9
+ export const Middleware: typeof MiddlewareType;
10
+ }
@@ -0,0 +1,21 @@
1
+ const { Bot } = require('./Bot');
2
+ const { Message } = require('./Message');
3
+ const { Middleware } = require('./Middleware');
4
+
5
+ (function (window, factory) {
6
+ if (typeof exports === 'object') {
7
+ module.exports = factory();
8
+ // eslint-disable-next-line no-undef
9
+ } else if (typeof define === 'function' && define.amd) {
10
+ // eslint-disable-next-line no-undef
11
+ define(factory);
12
+ } else {
13
+ window.miraiJs = factory();
14
+ }
15
+ })(this, function () {
16
+ return {
17
+ Bot,
18
+ Message,
19
+ Middleware,
20
+ };
21
+ });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @description Bot.sendMessage 方法的扩展接口
3
+ * 重写该接口后可将子类实例直接传入 message 参数
4
+ */
5
+ class MessageChainGetable {
6
+ getMessageChain() { }
7
+ }
8
+
9
+ /**
10
+ * @description Bot 实现的接口,其他类访问 bot.config
11
+ * 的途径,避免其他类直接访问实现,用来解耦
12
+ */
13
+ class BotConfigGetable {
14
+ getBaseUrl() { }
15
+ getQQ() { }
16
+ getVerifyKey() { }
17
+ getSessionKey() { }
18
+ }
19
+
20
+ module.exports = { MessageChainGetable, BotConfigGetable };
@@ -0,0 +1,5 @@
1
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
2
+
3
+ module.exports = {
4
+ URL: isBrowserEnv() ? window.URL : require('url').URL
5
+ };
@@ -0,0 +1,6 @@
1
+ const { isBrowserEnv } = require('../util/isBrowserEnv');
2
+
3
+ module.exports = {
4
+ wsStartListening: isBrowserEnv() ? require('../core/startListeningBrowser') : require('../core/startListeningNode'),
5
+ wsStopListening: isBrowserEnv() ? require('../core/stopListeningBrowser') : require('../core/stopListeningNode'),
6
+ };
@@ -0,0 +1,2 @@
1
+ // 将数组转换为
2
+ export type ArrayToValuesUnion<T extends string[]> = T extends (infer E)[] ? E : never;
@@ -0,0 +1,23 @@
1
+ let errCodeMap = {
2
+ 1: '错误的 auth key',
3
+ 2: '指定的 Bot 不存在',
4
+ 3: 'Session 失效或不存在',
5
+ 4: 'Session未认证(未激活)',
6
+ 5: '发送消息目标不存在(指定对象不存在)',
7
+ 6: '指定文件不存在,出现于发送本地图片',
8
+ 10: '无操作权限,指 Bot 没有对应操作的限权',
9
+ 20: 'Bot 被禁言,指 Bot 当前无法向指定群发送消息',
10
+ 30: '消息过长',
11
+ 400: '错误的访问,可能是参数错误',
12
+ };
13
+
14
+ let errCodeEnum = {
15
+ get BOT_NOT_FOUND() {
16
+ return 2;
17
+ },
18
+ // 需要的时候随时加
19
+ };
20
+ module.exports = {
21
+ errCodeMap,
22
+ errCodeEnum
23
+ };
@@ -0,0 +1,24 @@
1
+ module.exports = (error) => {
2
+ // 拿到所有的 message
3
+ let message, miraiMessage, resMessage;
4
+
5
+ ({ message } = error);
6
+
7
+ const { response } = error;
8
+ if (response?.data) {
9
+ ({ msg: miraiMessage, resMessage } = response.data);
10
+ }
11
+
12
+ // 抛出
13
+ if ((message ?? miraiMessage ?? resMessage ?? response?.data)) {
14
+ // 拼接
15
+ throw new Error(
16
+ [message, miraiMessage, resMessage, response?.data]
17
+ .filter(msg => typeof msg == 'string')
18
+ .join('\n')
19
+ );
20
+ } else {
21
+ // 未知异常
22
+ throw error;
23
+ }
24
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @description 检查必选参数
3
+ * @param {Object} parametersMap 要检查的参数 map
4
+ * @returns {string} 未提供参数的参数名,以空格隔开
5
+ */
6
+ module.exports = parametersMap => {
7
+ return Object.keys(parametersMap)
8
+ .filter(fieldName => {
9
+ return parametersMap[fieldName] === undefined;
10
+ })
11
+ .join(' ');
12
+ };
@@ -0,0 +1,3 @@
1
+ exports.isBrowserEnv = () => {
2
+ return typeof window !== 'undefined';
3
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = (min, max) => {
2
+ return () => {
3
+ return Math.floor((Math.random() * (max - min + 1)) + min);
4
+ };
5
+
6
+ };
package/webpack.config.js CHANGED
@@ -2,11 +2,12 @@ const { ProvidePlugin } = require('webpack');
2
2
 
3
3
  module.exports = {
4
4
  context: __dirname,
5
- entry: './src/index.js',
5
+ entry: './src/borwserEntry.js',
6
6
  output: {
7
7
  path: require('path').resolve(__dirname, 'dist', 'browser'),
8
8
  filename: 'mirai-js.js',
9
- clean: true
9
+ clean: true,
10
+ libraryTarget: 'umd',
10
11
  },
11
12
  externals: {
12
13
  // ws v8+ 会需要配置更多 polyfill, 这里通过外部依赖直接忽略它