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.
- package/1.mp3 +0 -0
- package/README.md +2 -0
- package/demo.ts +3 -6
- package/dist/browser/mirai-js.js +1 -1
- package/dist/node/borwserEntry.js +21 -0
- package/dist/node/core/uploadVoice.js +1 -1
- package/dist/node/lib/index.ts +0 -0
- package/index.ts +36 -3
- package/package.json +1 -1
- package/src/borwserEntry.js +11 -0
- package/src/core/uploadVoice.js +1 -1
- package/src/lib/index.ts +0 -0
- package/srcold/BaseType.d.ts +419 -0
- package/srcold/Bot.d.ts +567 -0
- package/srcold/Bot.js +1208 -0
- package/srcold/FileManager.js +270 -0
- package/srcold/Message.d.ts +66 -0
- package/srcold/Message.js +314 -0
- package/srcold/Middleware.d.ts +170 -0
- package/srcold/Middleware.js +657 -0
- package/srcold/Waiter.d.ts +13 -0
- package/srcold/Waiter.js +24 -0
- package/srcold/core/anno/deleteAnno.js +43 -0
- package/srcold/core/anno/getAnno.js +44 -0
- package/srcold/core/anno/publishAnno.js +44 -0
- package/srcold/core/auth.js +40 -0
- package/srcold/core/fs/deleteGroupFile.js +45 -0
- package/srcold/core/fs/getGroupFileInfo.js +46 -0
- package/srcold/core/fs/getGroupFileList.js +47 -0
- package/srcold/core/fs/makeGroupDir.js +45 -0
- package/srcold/core/fs/moveGroupFile.js +47 -0
- package/srcold/core/fs/renameGroupFile.js +44 -0
- package/srcold/core/fs/uploadGroupFIle.js +58 -0
- package/srcold/core/getFriendList.js +37 -0
- package/srcold/core/getGroupConfig.js +37 -0
- package/srcold/core/getGroupList.js +37 -0
- package/srcold/core/getMemberInfo.js +41 -0
- package/srcold/core/getMemberList.js +49 -0
- package/srcold/core/getSessionConfig.js +39 -0
- package/srcold/core/getUserProfile.js +40 -0
- package/srcold/core/messageFromId.js +40 -0
- package/srcold/core/mute.js +41 -0
- package/srcold/core/muteAll.js +39 -0
- package/srcold/core/quitGroup.js +40 -0
- package/srcold/core/recall.js +39 -0
- package/srcold/core/releaseSession.js +41 -0
- package/srcold/core/removeFriend.js +40 -0
- package/srcold/core/removeMember.js +42 -0
- package/srcold/core/responseBotInvitedJoinGroupRequest.js +46 -0
- package/srcold/core/responseFirendRequest.js +45 -0
- package/srcold/core/responseMemberJoinRequest.js +47 -0
- package/srcold/core/sendCommand.js +41 -0
- package/srcold/core/sendFriendMessage.js +43 -0
- package/srcold/core/sendGroupMessage.js +43 -0
- package/srcold/core/sendImageMessage.js +4 -0
- package/srcold/core/sendNudge.js +43 -0
- package/srcold/core/sendTempMessage.js +55 -0
- package/srcold/core/setEssence.js +44 -0
- package/srcold/core/setGroupConfig.js +58 -0
- package/srcold/core/setMemberAdmin.js +44 -0
- package/srcold/core/setMemberInfo.js +48 -0
- package/srcold/core/setSessionConfig.js +41 -0
- package/srcold/core/startListeningBrowser.js +62 -0
- package/srcold/core/startListeningNode.js +74 -0
- package/srcold/core/stopListeningBrowser.js +34 -0
- package/srcold/core/stopListeningNode.js +34 -0
- package/srcold/core/unmute.js +40 -0
- package/srcold/core/unmuteAll.js +39 -0
- package/srcold/core/uploadImage.js +55 -0
- package/srcold/core/uploadVoice.js +54 -0
- package/srcold/core/verify.js +41 -0
- package/srcold/index.d.ts +10 -0
- package/srcold/index.js +21 -0
- package/srcold/interface.js +20 -0
- package/srcold/polyfill/URL.js +5 -0
- package/srcold/polyfill/wsListener.js +6 -0
- package/srcold/typeHelpers.d.ts +2 -0
- package/srcold/util/errCode.js +23 -0
- package/srcold/util/errorHandler.js +24 -0
- package/srcold/util/getInvalidParamsString.js +12 -0
- package/srcold/util/isBrowserEnv.js +3 -0
- package/srcold/util/random.js +6 -0
- 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
|
+
}
|
package/srcold/index.js
ADDED
@@ -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,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,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
|
+
};
|
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/
|
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, 这里通过外部依赖直接忽略它
|