- 负责mirai-api-http中的接收消息反序列化和发送消息的序列化
- 定义消息结构
-
MessageRev
pub struct MessageRev {
pub msg_type: String, // 消息类型
pub sender: Box<dyn Sender>, // 消息发送者
pub chain: Vec<Box<dyn MessageChain>>, // 消息内容
}
- 提供方法
load_recive_data
将解析完毕的Hashmap<String,serde_json::Value>
转换为MessageRev
- t o d o
- 消息链类型为
Vec<Box<dyn MessageChain>>
,手动构造消息链是比较繁琐的。提供ChainBuiler
用于辅助构造消息链 - 创建构造器
let chain = ChainBuilder::new();
- 为常用消息链提供构造支持
let chain : ChainBuilder = ChainBuilder::new()
.text("好耶") // 文本
.textln("开始") // 自动换行文本
.text_repeat("emm", 4) // 将指定文本重复 rep次
.text_repeat_ln("-", 6) // 将指定文本重复 rep次 并自动换行
.image(ResouceSrc::path("./static/test_img.png")) // 图片
.face(53) //表情
.at(114145) // At 指定成员
.at_all() // At 全体成员
// 对于没有实现助构造器的,可以手动添加
.push(Box::new(Plain{text:String::from("abab")}));
- 分支语句构造支持
let so = Some(12);
let so2 = Some(11);
let ne = Option::<u8>::None;
let ok = Result::<i32, i32>::Ok(12);
let err = Result::<i32, i32>::Err(12);
let err2 = Result::<i32, i32>::Err(113);
let chain = ChainBuilder::new()
// 当条件为true,使用闭包,否则不进行任何操作
.if_then(2 + 2 == 4, |chain| chain.textln("2+2=4 is true"))
// 当条件为true,使用闭包f,否则使用闭包f_else
.if_else(
1 * 12 == 4,
|chain| chain.text("1*12 是 14"),
|chain| chain.text("1*12 不是 14"),
)
// 当 传入 Option 为 Some(T)时,使用闭包 handle_some ,否则不做任何操作
.if_some(so, |chain, data| chain.text(format!("ok: ->{}", data)))
// 当 传入 Option 为 None时,使用闭包 handle_none ,否则不做任何操作
.if_none(ne, |chain| chain.text("err"))
// 当 传入 Option 为 Some(T)时,使用闭包 handle_some ,否则使用闭包handle_none
.if_option(
so2,
|chain, data| chain.text(data),
|chain| chain.text("is None"),
)
// 当 传入 Result 为 Ok(T)时,使用闭包 hanle ,否则不做任何操作
.if_ok(ok, |chain, data| chain.text(data))
// 当 传入 Result 为 Err(E)时,使用闭包 err_hanle ,否则不做任何操作
.if_err(err, |chain, err| chain.text("err:").text(err))
// 当 传入 Result 为 Ok(T) 时,使用闭包 hanle ,否则使用闭包 err_hanle
.if_result(
err2,
|chain, data| chain.text("ok ").text(data),
|chain, err| chain.text("err ").text(err),
);
- 循环语句支持
iter1 = 1..5;
let iter2 = 'a'..'c';
let chain = ChainBuilder::new()
// 对每个元素调用handle
.loop_in(iter2, |chain, data, _| {
chain.text(format!("当前是字符:{}", data))
})
//在迭代遍历每个元素时,在2个元素间使用sep构造分割线
.loop_in_with_sep(
iter1,
|chain, data, index| chain.text(format!("第{}个。是: {}", index, data)),
|chain| chain.text_repeat_ln("-", 6),
);
- 更加复杂的逻辑语句和操作
let a=Some(1);
let chain=ChainBuilder::new()
.do_operate(|chain|match a {
Some(d) => chain.face(d),
None => chain.face(112),
});
- 完成构造后,可以使用
simplify
合并相邻的文本,使用build
构造出Vec<Box<dyn MessageChain>>
let chain : Vec<Box<dyn MessageChain>> = chain.simplify().build();