avatar

Mirai RhinoJS SDK文档

所有类和类型方法皆为测试阶段,未来可能会有更改。
若按照文档的方法调用出现问题,或文档有错字或术语性错误,请在 StageGuard/mirai-rhinojs-sdk 开issue反馈。
ISSUE的标题前必须加上[SDK文档]或者[SDK Documentation],否则不予受理/更改。
有关文档更新,请查看文档更新日志

由于v1.6.0版本的breaking changes,文档大幅度改动。
现在只提供对外使用的接口,内部实现的方法没有必要了解。

不同版本的MiraiQQBot.js在方法上略有不同,在方法前会用[http][core]标记来表示http版本和core版本独有方法。


类型预览

其他内容


Mirai

Mirai类是基类。

方法预览

返回类型 方法
PlaceHolder PlaceHolder
VOID static init(Object globalObject)
VOID static registerClasses2Object(Object object)
VOID static loadExternalObject(Object object, String filepath, String name)
VOID static [http]setAuthKey(String authKey)
VOID static [http]setSever(String server)
Mirai.Bot static getBot(Number qq)
Mirai.Bot static createNewBot(Number qq, String password)

VOID表示无返回值。

详细方法

VOID static init(Object globalObject)

初始化Mirai库,做平台判断和依赖下载等工作。

注:wrapper.js中已初始化,无需再次初始化。

VOID static registerClasses2Object(Object object)

注册MessageTypeMessageTypeConstEventTypeConstPermissionLogobject中,例如:

1
2
3
4
5
var M;
Mirai.registerClasses2Object(M = {});
//可以使用M.PLAIN代替Mirai.MessageTypeConst.PLAIN
Mirai.registerClasses2Object(this);
//可以使用PLAIN代替Mirai.MessageTypeConst.PLAIN

VOID static loadExternalObject(Object object, String filepath, String name)

加载路径为filepath的本地文件或网络文件,该文件应该在eval后返回一个对象,将这个对象命名为name并注册到object中。
例如:

1
2
3
4
5
6
7
8
9
10
//外部文件ex.js
(function(){
var r = {info: "i am ex."};
return r;
}());

//加载这个文件并注册到全局对象
Mirai.loadExternalObject(this, "/path/to/ex.js", "EX");
Lpg.v(EX.info); //输出i am ex.
Mirai.loadExternalObject(this, "http://your.server/path/to/ex.js", "EX2");

[http] VOID static setAuthKey(String authKey)

设置连接http api服务器的验证密钥。

[http] VOID static setServer(String server)

设置连接http api服务器地址。

Mirai.Bot static getBot(Number qq);

获取并返回bot对象,若无则返回null

Mirai.Bot static createNewBot(Number qq, String password);

创建一个新的bot,将其添加到BotManager并返回bot对象。参数qqpassword指定了bot的qq号和密码。

[http]在http版本中不需要传入password

若未指定服务器地址和验证密钥,将抛出Server host or authenticate key isnt set.异常。
若验证密钥错误,将抛出Authenticate key is invaild.异常。


Mirai.Bot

Bot是bot对象,提供消息处理功能。

方法预览

返回类型 方法
PlaceHolder PlaceHolder
String [http]getSessionKey()
Number subscribe(Object subscriber)
VOID destroy()
Number send(GroupOrSender target, MessageObject)
Number sendFriendMessage(Sender target, [MessageObject][, Number quoteId])
Number sendGroupMessage(Group target, [MessageObject][, Number quoteId])
Number sendTempMessage(Sender target, Group from, [MessageObject][, Number quoteId])
Number recall(Number target)
Array getFriendList()
Array getGroupList()
Array getGroupMemberList(Group group)
Boolean haveFriend(Sender target)
VOID mute(Group group, Sender[, Number time])
VOID unmute(Group group, Sender target)
VOID muteAll(Group group)
VOID unmuteAll(Group group)
VOID kick(Group group, Sender target)
VOID handleFriendRequest(JSON iArg, Number isAccept, String msg)
VOID handleMemberJoinRequest(JSON iArg, Number isAccept, String msg)

紫色参数表示聚合类型,将会在方法详细中介绍。

详细方法

[http]String getSessionKey()

返回当前bot的sessionKey(由http api分配)。

VOID subscribe(Object subscriber)

订阅当前bot接受到的消息。
subscriber是一个JSON对象,它的格式是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
bot.subscribe({
//订阅好友消息
friend: (sender, message) => {},
//订阅群组消息
group: (group, sender, message) => {},
//订阅临时消息(从群组来的群友)
temp: (group, sender, message) => {},
//订阅各类其他事件(如新群友进群,撤回消息等)
event: (event) => {},
//捕捉消息接收时的异常
error: (error) => {}
});

在参数中,sender的数据类型为MessageSendergroup的数据类型为GroupInfomessage的类型为MessageChainerror的数据类型为ErrorString
订阅什么类型消息是可选的:

1
2
3
4
5
6
7
8
9
10
11
12
//只订阅群组消息
bot.subscribe({
group: (group, sender, message) => {}
});
//不订阅临时消息
bot.subscribe({
friend: (sender, message) => {},
group: (group, sender, message) => {},
//temp: (group, sender, message) => {},
event: (event) => {},
error: (error) => {}
})

若再次调用subscribe(),则会覆盖之前的订阅对象。

VOID destroy()

将这个bot从BotManager中移除并销毁当前bot对象。

Number send(GroupOrSender target, MessageObject)

发送一条消息,GroupOrSender表示GroupInfoMessageSender,若为GroupInfo则表示发送群消息,MessageSender则表示发送好友消息,若无这个好友,但在同一个群,会尝试发送临时消息。
若发送成功则返回消息ID,否则返回0。

聚合消息对象

MessageObject是聚合类消息对象,它可以为以下格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
//单消息对象
Plain("hello")
//纯文本,处理时转化成文本消息
"hello"
//多消息对象(多参)
At(xxx), Plain("at你了!")
//多参中纯文本也会转化成文本消息
At(xxx), "at你了!"
//多消息对象(操作符)
At(xxx) + Plain("at你了!")
//操作符中纯文本不能转化成文本消息
///以下写法将出错
At(xxx) + "at你了!"

不是很懂?以下例子帮助你理解:

1
2
3
4
5
6
send(xxx, At(xxx), Plain("at你!"));
send(xxx, Plain("hello"));
send(xxx, "hello");
send(xxx, At(xxx), Plain("at你了!"));
send(xxx, At(xxx), "at你了!");
send(xxx, At(xxx) + Plain("at你了!"));

以下所有MessageObject的意义都与这里相同。

Number sendFriendMessage(Sender target, [MessageObject][, Number quoteId])

发送好友消息,Sender表示 Number类型的用户qq号 或 MessageSender类型的消息发送者对象,quoteId是可选项,表示引用回复的消息ID。
若发送成功则返回消息ID,否则返回0。

注意这里的MessageObject,它是被[]套起来的,换句话说这里传入的MessageObject是单成员数组:

1
sendFriendMessage(xxx, [Plain("hello")], quoteId);

以下所有Sender的意义都与这里相同。

Number sendGroupMessage(Group target, [MessageObject][, Number quoteId])

发送群组消息,Group表示 Number类型的群号 或 GroupInfo类型的群组对象,quoteId是可选项,表示引用回复的消息ID。
若发送成功则返回消息ID,否则返回0。

这里也需要注意MessageObject

以下所有Group的意义都与这里相同。

Number sendTempMessage(Sender target, Group from, [MessageObject][, Number quoteId])

发送临时消息,target表示要发送对象,from表示群组来源,quoteId是可选项,表示引用回复的消息ID。
若发送成功则返回消息ID,否则返回0。

同样需要注意MessageObject

Number recall(Number target)

撤回一条消息,target指定了要撤回的消息的ID。

Array getFriendList()

获取当前bot的好友列表,它的格式是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"id":123456789, //QQ号
"nickname":"", //昵称
"remark":"" //备注
},
{
"id":987654321,
"nickname":"",
"remark":""
}
]

若出现了任何错误,会返回一个空数组。

Array getGroupList()

获取当前bot的群组列表,它的格式是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"id":123456789, //群号
"name":"群名1", //群名称
"permission": "MEMBER" //bot在这个群的权限
},
{
"id":987654321,
"name":"群名2",
"permission": "MEMBER"
}
]

若出现了任何错误,会返回一个空数组。

Array getGroupMemberList(Group group)

获取一个群的群员列表数组,group指定了要查询的群组。它的格式是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
{
"id":1234567890, //群友qq号
"memberName":"", //群友群名片
"permission":"MEMBER" //群友权限对应Permission.MEMBER/ADMIN/OWNER
/*"group":{
"id":12345,
"name":"群名1",
"permission": "MEMBER"
}*/
},
{
"id":9876543210,
"memberName":"",
"permission":"OWNER"
/*"group":{
"id":54321,
"name":"群名2",
"permission": "MEMBER"
}*/
}
]

若出现了任何错误,会返回一个空数组。

Boolean haveFriend(Sender target)

判断bot是否有这个好友,target指定了查询的对象。

VOID mute(Group group, Sender[, Number time])

禁言一个群员,group指定要操作的群,target指定要禁言的成员,time指定禁言的时间(秒)。
注:需要bot有对应权限!

VOID unmute(Group group, Sender target)

解除禁言一个群员,group指定要操作的群,target指定要解除禁言的成员。

注:需要bot有对应权限!

VOID muteAll(Group group)

全体禁言一个群组,group指定要操作的群。

注:需要bot有对应权限!

VOID unmuteAll(Group group)

解除全体禁言一个群组,group指定要操作的群。

注:需要bot有对应权限!

VOID kick(Group group, Sender target)

踢出群组的某个群员,group指定要操作的群,target指定要踢出的群员。

注:需要bot有对应权限!

VOID handleFriendRequest(JSON iArg, Number isAccept, String msg)

处理一个好友请求,iArg必须为新好友事件的event.toIArg()方法返回的JSON。
isAccept表示要执行的操作,0为同意好友请求; 1为拒绝好友请求; 2为拒绝添加好友并添加黑名单,不再接收该用户的好友申请。
msg是可选的,表示拒绝同意好友请求的理由。

VOID handleMemberJoinRequest(JSON iArg, Number isAccept, String msg)

处理一个好友请求,iArg必须为新成员入群事件的event.toIArg()方法返回的JSON。
isAccept表示要执行的操作,0为同意入群请求; 1为拒绝入群请求; 2为忽略入群请求; 3为拒绝入群并添加黑名单,不再接收该用户的入群申请; 4为忽略入群并添加黑名单,不再接收该用户的入群申请。
msg是可选的,表示拒绝入群请求的理由。
注:需要bot有对应权限!


Mirai.MessageChain

MessageChain提供消息链构造方法。
(QQ的一个消息可能是由各种消息构成的,如”文字+图片”。Mirai对此的处理方式是:将这些复合消息转化成各种类型消息构成的消息链。)

方法预览

返回类型 方法
PlaceHolder PlaceHolder
Number length()
MessageType.? get(MessageTypeConst.? type)
Boolean contain(RegExp regex)
TempObject contain(RegExp* / Array[RegExp*] regex)
self(MessageChain) discard(MessageTypeConst.? type)
self(MessageChain) add(MessageObject messages)
self(MessageChain) addF(MessageObject messages)
String toString()

详细方法

Number length()

返回消息链中消息对象的数目。

MessageType.? get(MessageTypeConst.? type)

返回消息链中第一个类型为type的消息。
若该链中不存在type类型的消息,则返回一个新的参数均为nulltype类型的消息。

Boolean contain(RegExp regex)

判断消息链中的文本消息是否匹配regex正则表达式。

TempObject contain(RegExp* / Array[RegExp*] regex)

判断消息链中的文本消息是否匹配regex正则表达式,并返回一个临时对象,用于执行后续操作。
参数regex可以是一个正则表达式字符串或正则表达式对象,或一个包含多个正则表达式的数组,用于一次匹配多个正则表达式。

详情请浏览:contains返回的临时对象contains正则表达式拓展

self(MessageChain) discard(MessageTypeConst.? type)

删除(丢弃)消息链中所有类型为type的消息,并返回自己(方便链式调用)。
若消息链无type类型的消息,则什么也不会做。

self(MessageChain) add(MessageObject messages)

在消息链末端追加消息对象或消息链,并返回自己(方便链式调用)。

self(MessageChain) addF(MessageObject messages)

在消息链首端追加消息对象或消息链,并返回自己(方便链式调用)。

String toString()

返回消息链原始JSON信息字符串。


Mirai.MessageSender

MessageSender消息发送者对象。

MessageSender只从Bot.subscribe返回,实例化MessageSender是没有任何意义的。

构造函数与方法预览

返回类型 方法
Number getId()
String getName()
Permission getPermission()
Number getSourceId()
Number send(MessageObject messages)
Number reply(MessageObject messages)
Number at(MessageObject messages)
VOID mute(Number time)
VOID unmute()
VOID kick(String msg)
String toString()

详细方法

Number getId()

返回该用户QQ号。

String getName()

返回该用户名称。

Permission getPermission()

返回在群群的权限,若为subscribe()的friend返回的MessageSender,则为null

Number getSourceId()

MessageSender都是通过订阅的消息构造的,该方法返回这条消息的ID用于引用或撤回消息。

Number send(MessageObject messages)

给这个用户发送私人消息并返回消息ID,若无好友则发送临时消息。

Number reply(MessageObject messages)

回复这个用户的消息并返回消息ID。

Number at(MessageObject messages)

at这个用户并发送消息并返回消息ID。

VOID mute(Number time)

禁言这个用户,time指定了要禁言的时间(秒),若为subscribe()的friend返回的MessageSender,则什么也不做。
注:需要bot有对应权限。

VOID unmute()

解禁这个用户,若为subscribe()的friend返回的MessageSender,则什么也不做。
注:需要bot有对应权限。

VOID kick(String msg)

将这个用户踢出群组,msg为踢出原因,若为subscribe()的friend返回的MessageSender,则什么也不做。
注:需要bot有对应权限。

String toString()

返回该用户信息。


Mirai.GroupInfo

GroupInfo为群组对象。

GroupInfo只从Bot.subscribe返回,实例化GroupInfo是没有任何意义的。

构造函数与方法预览

返回类型 方法
Number getId()
String getName()
Permission getPermission()
Number send(MessageObject messages)
Number reply(MessageObject messages)
Number at(Sender target, MessageObject messages)
VOID mute(Sender target, Number time)
VOID unmute(Sender target)
VOID muteAll()
VOID unmuteAll()
VOID kick(Sender, String msg)
String toString()

详细方法

Number getId()

返回该QQ群的群号。

String getName()

返回该QQ群的名称。

Permission getPermission()

返回成员在该群的权限(一般为bot)。

Number send(MessageObject messages)

给这个群组发送消息并返回消息ID。

Number reply(MessageObject messages)

GroupInfo都是通过订阅的消息构造的,该方法回复这条消息的发送者并返回消息ID。

Number at(Sender target, MessageObject messages)

at用户并发送消息并返回消息ID。

VOID mute(Sender target, Number time)

禁言这个用户,target指定了要禁言的群成员,time指定了要禁言的时间(秒)。
注:需要bot有对应权限。

VOID unmute(Sender target)

解禁这个用户,target指定了要解禁的群成员。
注:需要bot有对应权限。

VOID muteAll()

全体禁言。
注:需要bot有对应权限。

VOID unmuteAll()

解除全体禁言。
注:需要bot有对应权限。

VOID kick(Sender target, String msg)

将这个用户踢出群组,target为踢出的群友,msg为踢出原因,若为subscribe()的friend返回的GroupInfo,则什么也不做。
注:需要bot有对应权限。

String toString()

返回该群信息。

Mirai.GroupInfo.Permission

该常量集用于表示群组成员权限

Permission.OWNER 群主

Permission.ADMIN 管理员

Permission.MEMBER 普通成员


Mirai.MessageType

MessageType提供各种消息类型的方法,提供给sdk使用者的都是静态方法。

所有子类

类名称 对应消息类型
Source 源消息连首
Quote 引用(回复)
Plain 文字
Image 图片
FlashImage 闪照
Face QQ表情
At @某人
AtAll @全体成员
Xml XML消息
Json2 JSON消息
App APP消息
Poke 戳一戳

详细方法

不需要实例化消息类型

Source(Number id, Number time)

源消息链首,id为消息ID,time为UNIX时间。

构建Source类型消息毫无意义,因为Source只作为群组消息ID的标记,而发送消息不需要消息ID(除了引用)。

Quote(Number id, Number senderId, Number groupId, Mirai.MessageChain origin)

引用消息,id为消息ID,senderId为引用原文发送者QQ号,groupId为该消息QQ群的群号,origin为引用原文消息链。

构建Quote类型消息毫无意义,因为发送引用消息的方法是在Bot.sendGroupMessage的第三个参数传入要引用的消息ID或GroupInfo.reply或MessageSender.reply。

Plain(String text)

文字消息,text为文本内容。

Image(String imageId, String url, String path)

图片消息,imageId为图片的UUID,url为图片的链接,path为图片本地链接。
三者可以任选一个参数,当同时有多个参数时,http api会按照imageId>url>path的优先级发送图片。
接收到的图片永远不可能会有path

FlashImage(String imageId, String url, String path)

闪照消息,用法和Image完全相同。

Face(Number faceId, String name)

QQ表情,faceId为表情编号(优先级高于后面的name),name为表情名称。

At(Number target, String displayText)

@某人,taeget为被@的人的QQ号,displayText为@发送时显示的@文字。

AtAll()

@全体成员。

Xml(String xml)

XML消息,xml为XML消息内容。

Json2(String json)

JSON消息,json为JSON消息内容。

App(String app)

APP消息,app为APP消息内容。

Poke(PokeType.? name)

Poke(戳一戳)消息,name为Poke消息内容。


所有消息类型的获取只需要对应参数前面加`get`并将参数首字母大写。 像这样:
1
2
3
Mirai.MessageType.Image.getImageId();
Mirai.MessageType.App.getApp();
Mirai.MessageType.At.getTarget();
所有消息类型都有`toString()`方法,该方法返回原始JSON消息对象数据。

Mirai.MessageTypeConst

MessageTypeConst保存一些静态常量。

SOURCE 源消息链首

QUOTE 引用消息

PLAIN 文字消息

IMAGE 图片消息

FLASHIMAGE 闪照消息

FACE QQ表情

AT @某人

ATALL @全体成员

XML XML消息

JSON2 JSON消息

APP APP消息

POKE 戳一戳消息

PokeType

PokeType.POKE 戳一戳

PokeType.SHOWLOVE 比心

PokeType.LIKE 点赞

PokeType.HEARTBROKEN 心碎

PokeType.SIXSIXSIX 666

PokeType.FANGDAZHAO 放大招


Mirai.EventType(Const)

EventType为Bot.subscribe中的其他事件event的参数中的event的类型基类

注:EventType.?只作为返回参数,构造它们是没有任何意义的。

所有事件类型

Bot.subscribe中的event中,我们可以通过判断event.type来确定接受到的事件类型。
下面是所有事件类型常量(EventTypeConst.?):
它们后面对应着event中有的属性

BOT_ONLINE: bot上线

Number id: bot的qq号

BOT_OFFLINE: bot下线

Number id: bot的qq号

BOT_OFFLINE_FORCE: bot被挤下线

Number id: bot的qq号

BOT_OFFLINE_DROPPED: bot异常下线

Number id: bot的qq号

BOT_RELOGIN: bot重新登录

Number id: bot的qq号

GROUP_RECALL: 群组撤回消息

Number senderId: 撤回者QQ号
Number messageId: 撤回的消息的id
Number time: 撤回时间
GroupInfo group: 事件发生所在的群组
MessageSender operator: 撤回者信息

FRIEND_RECALL: 好友撤回消息

Number senderId: 撤回者QQ号
Number messageId: 撤回的消息的id
Number time: 撤回时间

BOT_GROUP_PERMISSION_CHANGE: bot在群的权限被改变

Permission before: 改前权限
Permission after: 改后权限
GroupInfo group: 事件发生所在群组

BOT_MUTE: bot被禁言

Number duration: 禁言时长
MessageSender operator: 禁言者
(群组信息可以在event.getOperator().group找到)

BOT_UNMUTE: bot被解除禁言

MessageSender operator: 禁言者
(群组信息可以在event.getOperator().group找到)

BOT_JOIN_GROUP: bot新加入群组

GroupInfo group: 加入的群组

GROUP_NAME_CHANGE: 群名称改变

String before: 改之前名称
String after: 改之后名称
GroupInfo group: 事件发生所在群组

GROUP_ENTRANCE_ANN_CHANGE: 入群公告改变

String before: 改之前入群公告
String after: 改之后入群公告
GroupInfo group: 事件发生所在群组
MessageSender operator: 操作者

GROUP_MUTE_ALL: 群全体禁言事件

Boolean before: 之前是否禁言
Boolean after: 之后是否禁言
GroupInfo group: 事件发生所在群组
MessageSender operator: 操作者

GROUP_ALLOW_ANONYMOUS_CHAT: 匿名聊天

未写

GROUP_ALLOW_CONFESS_TALK: 坦白说

未写

GROUP_ALLOW_MEMBER_INVITE: 允许成员邀请其他人入群

未写

GROUP_MEMBER_JOIN: 新人入群

MessageSender member: 入群人信息
(群组信息可以在event.getMember().group找到)

GROUP_MEMBER_KICK: 群员被踢

MessageSender target: 被踢人信息
MessageSender operator: 操作者
(群组信息可以在event.getOperator/Target().group找到)

GROUP_MEMBER_QUIT: 群员退群

MessageSender member: 退群人信息
(群组信息可以在event.getMember().group找到)

GROUP_MEMBER_NAME_CHANGE: 群成员昵称改变

String before: 改之前昵称
String after: 改之后昵称
MessageSender target: 被改昵称的人
MessageSender operator: 操作者(自己或者管理员)
(群组信息可以在event.getOperator/Target().group找到)

GROUP_MEMBER_FAME_CHANHE: 群特殊头衔改变

String before: 改之前头衔(空或有)
String after: 改之后头衔
MessageSender target: 被改特殊头衔的人
(群组信息可以在event.getTarget().group找到)

GROUP_MEMBER_PERMISSION_CHANGE: 群成员权限改变(不能是bot)

Permission before: 改之前权限
Permission after: 改之后权限
MessageSender target: 被改权限的人

GROUP_MEMBER_MUTE: 群员被禁言

Number duration: 禁言时长
MessageSender target: 被禁言的人
MessageSender operator: 操作者(自己或者管理员)

GROUP_MEMBER_UNMUTE: 群员被解除禁言

MessageSender target: 被解除禁言的人
MessageSender operator: 操作者(自己或者管理员)

NEW_FRIEND_REQUEST: 新好友请求事件

Number eventId: 事件ID,用于标识事件
Number fromId: 新好友QQ号
Number groupId: 新好友来自的群(0为不是通过群加的好友)
String nickname: 新好友昵称
特殊方法:
event.accept() 同意好友请求。
event.reject() 拒绝好友请求。
event.block() 拒绝并拉黑,不再接收请求。
event.toIArg()用于获取要传入Bot.handleFriendRequest的一个参数。
(下面有例子)

NEW_MEMBER_JOIN_REQUEST: 新成员入群请求事件

Number eventId: 事件ID,用于标识事件
Number fromId: 加群人QQ号
Number groupId: 加群群号
String groupName: 加群群名称
String nickname: 加群人昵称
特殊方法:
event.accept() 同意加群请求。
event.reject() 拒绝加群请求。
event.ignore() 忽略加群请求。
event.ignoreAndBlock() 忽略加群请求并不再接收请求。
event.rejectAndBlock() 拒绝加群请求并不再接收请求。
event.toIArg()用于获取要传入Bot.handleMemberJoinRequest的一个参数。

所有的属性都可以通过调用event.getXxx()(get+属性首字母大写)方法来过得。

下面通过一个例子展示用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
event: (event) => {
//群组改名提示
if(event.type == GROUP_NAME_CHANGE){
bot.sendGroupMessage(
event.group.id, //这是群qq号
[Plain("Administrator changed the group mame \"" + event.getBefore() + "\" to \"" + event.getAfter() + "\"")]
);
}
//自动同意新好友请求
if(event.type == NEW_FRIEND_REQUEST){
//以下两个方法是等价的
bot.handleFriendRequest(event.toIArg(), 0);
event.accept();
}
},
...

Mirai.utils.file

file类提供简单的文件读取和写入方法。

方法预览

返回类型 方法
VOID static create(String path)
VOID static remove(String path)
? static read(String path, ? mode)
VOID static writeString(String path, String string, Boolean isCover)
VOID static writeStream(String path, java.io.InputStream inputStream, Boolean isCover, Boolean isInputStreamClose)
VOID static appendString(String path, String appendString)

详细方法

VOID static create(String path)

path创建一个文件或目录。

VOID static remove(String path)

删除在path的一个文件或目录。

? static read(String path, ? mode)

读取在path的文件。
如果modeMirai.utils.file.STRING,则返回文件内容。
如果modeMirai.utils.file.STREAM,则返回文件输入流。

VOID static writeString(String path, String string, Boolean isCover)

写入字符串到path的文件。
isCover设定是否在文件已存在的情况下覆盖文件内容。

VOID static writeStream(String path, java.io.InputStream inputStream, Boolean isCover, Boolean isInputStreamClose)

写入字符串到path的文件。
isCover设定是否在文件已存在的情况下覆盖文件内容。
isInputStreamClose设定是否在写入完成后关闭并回收输入流。

VOID static appendString(String path, String appendString)

追加字符串到path的文件。


Mirai.utils.http

http类提供简单HTTP POST/GET方法。

方法预览

返回类型 方法
[Number, java.io.InputStream] static getInputStream(String url[, Array headers])
String static get(String url[, Array headers, Boolean isLineBreak])
String static post(String url, String params[, Array headers])

详细方法

[Number, java.io.InputStream] static getInputStream(String url[, Array headers])

读取远程服务器资源并返回输入流,常用于获取图片,音乐等非文字信息。
headers是可选的,指定了请求头,它应该是这样的格式:

1
2
3
4
5
[
["Content-Type", "blablabla"],
["Connection", "Keep-Alive"],
["...", "..."]
]

返回的Array中,第一个元素为输入流大小(文件大小),第二个元素为输入流。

String static get(String url[, Array headers, Boolean isLineBreak]) |

读取远程服务器资源并返回字符串。
isLineBreak指定是否有换行符,若为false则读取后的字符串都在一行l。

String static post(String url, String params[, Array headers])

向远程服务器发送请求。


Mirai.utils.rsync

rsync类提供在rhino中异步执行的方法。

方法预览

返回类型 方法
PlaceHolder PlaceHolder
rsync static run(Object func)
rsync static loop(Object func, Number times, Number, interval)
rsync static corun(Object func, Number count)
rsync static flag(String name)
rsync static interval(Number interval)
rsync static co_count(Number count)
rsync static loop_times(Number count)
self(rsync) run(Object func)
self(rsync) loop(Object func, Number times, Number, interval)
self(rsync) corun(Object func, Number count)
String/self(rsync) flag(String name)
Number/self(rsync) interval(Number interval)
Number/self(rsync) co_count(Number count)
Number/self(rsync) loop_times(Number count)
VOID sleep(Number duration)
VOID stop()
VOID restart()

详细方法

rsync static run(Object func)

创建执行单程异步线程,并返回这个异步线程对象。

rsync调用方法

例如:

1
2
3
rsync.run((s) => {
Log.i("in rsync thread.");
});

输出:

1
in rsync thread.

func中的参数s表示自身rsync对象,可以对当前异步线程进行sleep()或stop()等操作。

例如:

1
2
3
4
5
rsync.run((s) => {
Log.i("in rsync thread.");
s.stop();
Log.i("print me.");//这条将不会被打印
});

输出:

1
in rsync thread.

stop()是可以将sleep()打断的。

1
2
3
4
5
6
7
var r = rsync.run((s) => {
Log.i("in rsync thread.");
s.sleep(3000);
Log.i("print me.");//这条将不会被打印
});
java.lang.Thread.sleep(1500);
r.stop();

输出:

1
in rsync thread.

rsync static loop(Object func, Number times, Number, interval)

创建执行循环异步线程并返回这个异步线程对象。
times表示循环执行的次数,-1表示无限次(默认就是执行无限次),直到调用stop()。
interval表示每次上一次执行完毕到下一次执行的中间间隔(毫秒)。

它的本质是创建一个rsync对象,将标记循环执行次数的属性loop_times和执行间隔属性interval设置为参数timesinterval

rsync static corun(Object func, Number count)

创建同时执行count个单程异步线程并返回这个异步线程对象。
count表示创建同时执行线程的个数,若设置为为1,个则最终效果和rsync.run()相同。

它的本质是创建一个rsync对象,将标记同时执行线程个数的属性co_count设置为参数count

1
2
3
rsync.corun((s, i) => {
Log.i("我是第" + i + "个线程")。
}, 5);

将同时输出:

1
2
3
4
5
我是第0个线程
我是第1个线程
我是第2个线程
我是第3个线程
我是第4个线程

rsync static flag(String name)

创建一个新的异步线程,将线程组名称设置为name并返回这个异步线程对象。

rsync static interval(Number interval)

创建一个新的异步线程,将上一次执行完毕到下一次执行的中间间隔设置为interval并返回这个异步线程对象。
loop_times为1(默认)时异步线程不会执行第二次,所以interval属性不会起作用。

rsync static co_count(Number count)

创建一个新的异步线程,将同时异步执行线程的个数设置为count并返回这个异步线程对象。

rsync static loop_times(Number times)

创建一个新的异步线程,将循环执行次数设置为interval(-1表示执行无限次)并返回这个异步线程对象。

self(rsync) run(Object func)

开始执行异步线程。
funcnull,则什么也不会执行。
若当前rsync对象线程已开始执行,则会抛出异常。

self(rsync) loop(Object func, Number times, Number, interval)

同上方静态方法,若当前rsync对象线程已开始执行,则会抛出异常。
它的本质是将当前rsync对象线程标记循环执行次数的属性loop_times和执行间隔属性interval设置为参数timesinterval

self(rsync) corun(Object func, Number count)

同上方静态方法,若当前rsync对象线程已开始执行,则会抛出异常。
它的本质是将当前rsync对象标记同时执行线程个数的属性co_count设置为参数count

String/self(rsync) flag(String name)

将当前rsync对象线程组名称设置为name并返回这个异步线程对象。
若当前rsync对象线程已开始执行,则会抛出异常。
若参数为空,则会返回当前rsync对象flag值。

Number/self(rsync) interval(Number interval)

将当前rsync对象上一次执行完毕到下一次执行的中间间隔设置为interval并返回这个异步线程对象。
loop_times为1(默认)时异步线程不会执行第二次,所以interval属性不会起作用。
若当前rsync对象线程已开始执行,则会抛出异常。
若参数为空,则会返回当前rsync对象interval值。

Number/self(rsync) co_count(Number count)

将当前rsync对象同时异步执行线程的个数设置为count并返回这个异步线程对象。
若当前rsync对象线程已开始执行,则会抛出异常。
若参数为空,则会返回当前rsync对象co_count值。

Number/self(rsync) loop_times(Number times)

将当前rsync对象循环执行次数设置为times(-1表示执行无限次)并返回这个异步线程对象。
若当前rsync对象线程已开始执行,则会抛出异常。
若参数为空,则会返回当前rsync对象loop_times值。

VOID sleep(Number duration)

睡眠,duration表示时长。

VOID stop()

打断并停止线程执行。

VOID restart()

重新执行。

rsync链式调用例子:

1
2
3
4
5
6
7
8
9
//循环执行,以下方法是等价的
rsync.loop((s) => {...}, 10, 100);
rsync.flag("loop_thread").interval(100).loop_times(10).run((s) => {...});
//实例化对象中调用loop或corun会覆盖静态方法设置的属性。
rsync.flag("loop_thread").loop((s) => {...}, 10, 100);
var r = rsync.flag("loop_times");
r.interval(100);
r.loop_times(10);
r.run((s) => {...});

Mirai.Log

Log类向控制台输出日志,自动适配标准输出流和AutoJS控制台。

方法预览

返回类型 方法
VOID static v(Object object)
VOID static i(Object object)
VOID static w(Object object)
VOID static e(Object object)

他们分别对应着verbose,info,warning和error消息,这里只是颜色不同而已。


其他内容

contains返回的临时对象

MessageChain.contains会返回一个临时对象用于执行.then(Sync)/.or(Sync)后续操作

例如:

1
msg.contains("打招呼").then(() => sender.at("你好呀!"));

当消息内容满足正则表达式(组)匹配,则会将该临时对象中的flag标为true,表示包含满足匹配的消息

这里的then并不是Promise中的then,此then非彼then…

看一下详细方法:

self(TempObject) then(Object func)

self(TempObject) thenSync(Object func)

self(TempObject) or(Object func)

self(TempObject) orSync(Object func)

flag被标为true,则then(Sync)可以被执行,否则执行or(Sync)
为了防止消息处理阻塞消息监听线程,你可以调用xxxSync来异步执行。
func表示一个函数,为执行的内容,这个函数应该有两个(三个)形参:

1
2
3
4
.then((i, v) => {});
.thenSync((i, v, r) => {});
.then((i, v) => {});
.thenSync((i, v, r) => {});

其中:

i表示满足contains表达式中的第几个表达式。
当contains的参数为RegExp时,这个值是0,当为Array[RegExp]时,返回满足的表达式的元素序号。

1
2
3
4
5
6
7
8
9
10
11
msg.contains([
"舔我",
"骂我",
"给爷爬"
]).thenSync((i) => {
switch(i) {
case 0: sender.at("你太帅了!");break;
case 1: sender.at("wdnmd!");break;
case 2: sender.at("我爬了...");break;
}
});

v表示匹配结果,请看contains正则表达式拓展

1
2
3
4
msg.contains([
"听过{s<sp>:song}吗",
"(搜|点)歌{s<sp>:song}"
]).then((i, k) => music.search(k.song));

r表示调用xxxSync后执行的异步线程对象,也就是一个rsync对象。

1
msg.contains("...").thenSync((i, k, r) => Log.i(r));

输出:

1
RsyncThreadGroup-unnamed@xxxxx-x

上述四个方法都返回自身,可以链式调用

1
2
3
4
5
6
7
8
msg.contains([
"听过{s<sp>:song}吗",
"(搜|点)歌{s<sp>:song}"
])
.thenSync((i, k, r) => sender.at(music.search(k.song)))
.or((i, k) => sender.at("未匹配到!"));
//TempObject临时对象里也有contains方法
.contains("\\.\\.\\.").then(() => sender.at("怎么了怎么了为什么打三个点?"));

contains正则表达式拓展

此处基于常规正则表达式添加了简便子匹配结果提取方法,简化exec()获得子匹配内容的过程。

它的格式是这样的:

${[type[<properties...>]:]name}

其中[...]表示为可选项。

例如:
${content} : 隐式定义匹配字符串,不包含空格和换行符,相当于${s:content}
${s:content} : 显式指定匹配字符串,不包含空格和换行符
${s<sp>:content} : 匹配字符串,包含空格(space),相当于([^\n]+)
${s<lb>:content} : 匹配字符串,包含换行符(break line),相当于([^ ]+)
${s<lb, sp>:content} : 匹配字符串,包含所有字符,相当于([\s\S]+)
${s<len=5>:content} : 匹配字符串,限制匹配长度,相当于([^ \n]{5})

正如你所见,未指定type则默认为匹配字符串(s),properties可以同事指定多个属性,中间用逗号隔开。
某些属性需要设置属性值,如类型s中的len属性,表示匹配字符的个数。

它有什么用?

所有匹配结果都将以JSON格式封装至contains返回的临时对象中的.then(Sync)/.or(Sync)的第二个参数中,你可以更方便地得到匹配结果。

1
2
3
4
5
msg
.contains("${n:lv}(\\+|加上|加)${n:rv}(=|等于)(几|\\?)")
.then((i, k) => {
sender.at(k.lv + k.rv);
});

所有用户定义的子匹配表达式(...)都会被转为非捕获组子匹配表达式(?:...)

拓展匹配格式是无视正则表达式规则的:

1
msg.contains(/${s:name}/).then(...);

将匹配连续不包含空格和换行的字符,而$不表示表达式的开始标识符

类型支持:

n: 匹配数字

属性:

  • bit=value 指定匹配数字的位数为value

s: 匹配字符,不包括空格符和换行符

属性:

  • sp 匹配空格
  • lb 匹配换行符
  • len=value 指定匹配字符的长度为value