mirai-js 2.8.3 → 2.8.5

Sign up to get free protection for your applications and to get access to all the features.
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, 这里通过外部依赖直接忽略它