-
Notifications
You must be signed in to change notification settings - Fork 2
3 (1). 通用的信息处理 (收取,发送,撤回)
当然,在本例中我们使用MessageX.cs
文件中的MessageX
类来处理客户端接受的信息.
您可以 自定义 类的名称.
//MessageX类
using MeowMiraiLib.Msg.Sender;
using MeowMiraiLib.Msg.Type;
namespace Test
{
internal class MessageX
{
public static void OnFriendMessageReceive(FriendMessageSender s, Message[] e)
{
System.Console.WriteLine($"好友信息 [qq:{s.id},昵称:{s.nickname},备注:{s.remark}] \n内容:{e.MGetPlainString()}");
//MGetPlainString() 是一个关于Message类的数组扩展方法,用于返回信息里的文字部分
//....其他操作
}
}
}
在顶级语句内添加如下字段
//顶级语句...
c.OnFriendMessageReceive += MeowMiraiLibTest.MessageX.OnFriendMessageReceive;
//...
运行,并尝试发送给您的机器人一段文字.
至此,接收端就这样做成了.
在本节中,我们主要讨论 收到信息后的发送
和 主动发送信息
假设我们从好友信息
中读取数据.
- 首先需要先规定命令的格式 例如: 重复 [要重复的内容]
- 写一个处理这个事件的函数, 传入数据为原始信息需要的部分, 输出为一个Message[]数组等待发送.
- 发送这个信息,使用某个端发送.
原始写法:
using MeowMiraiLib.Msg;
using MeowMiraiLib.Msg.Sender;
using MeowMiraiLib.Msg.Type;
namespace Test
{
internal class MessageX
{
public static void OnFriendMessageReceive(FriendMessageSender s, Message[] e)
{
//MGetPlainStringSplit() 是一个关于Message类的数组扩展方法,
//用于返回信息里的文字部分后按照 Splitor进行分割, splitor默认是空格
var sx = e.MGetPlainStringSplit();
var sendto = s.id;
var msg = sx[0] switch
{
"重复" => Repeat(sx[1]),
_ => null,
};
new FriendMessage(sendto, msg).Send(ClientX.c);
}
//重复消息
public static Message[] Repeat(string s) => new Message[] { new Plain(s) };
}
}
扩展写法
using MeowMiraiLib.Msg;
using MeowMiraiLib.Msg.Sender;
using MeowMiraiLib.Msg.Type;
namespace Test
{
internal class MessageX
{
public static void OnFriendMessageReceive(FriendMessageSender s, Message[] e)
{
//MGetPlainStringSplit() 是一个关于Message类的数组扩展方法,
//用于返回信息里的文字部分后按照 Splitor进行分割, splitor默认是空格
var sx = e.MGetPlainStringSplit();
var sendto = s.id;
var s = sx[0] switch
{
//使用信息类的扩展发送方法
"重复" => new Message[] { new Plain(sx[1]) }.SendToFriend(sendto,ClientX.c),
};
}
}
}
到现在为止, 您可以尝试发送给您的机器人一个消息, 内容如下: 重复 这句话
您的机器人应该回复: 这句话
至此, 被动处理消息已经完成
(不建议大量发送,可能会被风控)
您可以使用消息发送功能主动
朝某个端的好友/群/陌生人发送消息.
例如下例的 整点报时系统.
using System;
using MeowMiraiLib.Msg;
using MeowMiraiLib.Msg.Type;
MeowMiraiLib.Client c = new("ws://test.com.cn:8888/all?verifyKey=123456&qq=1234567");
c.Connect();
System.Timers.Timer t = new(1000*60); //每一分钟查看一次
t.Start(); //启动计时器
t.Elapsed += (s,e) =>
{
if(DateTime.Now.Minute == 0) //检测当前的分钟是否为0 (整点)
{
//发送信息给某个人..
new FriendMessage(/*qq号*/, new Message[] { new Plain($"{DateTime.Now.Hour}点 啦!") }).Send(c);
}
};
while (true)
{
switch (Console.ReadLine()) // 控制台操作
{
//.....
}
}
您也未必需要都写在顶级语句内, 您可以 自己规定发送形式
, 以及其他的任何程序处理逻辑.
如上例的计时器可以完全写在另一个类内.
但您要注意, 您无法获得顶级语句内的任何变量,
所以我们 建议在外域(其他类) 定 义 端
, 然后在顶级语句使用完全限定名称引用.
在8.0.0更新后
, 将SSM(发送信息回收端) 的标准方案适配回值改为T
而非(bool,JObject)
,
您可以通过检查MessageId来进行判断消息是否成功, 您也可以使用MessageId快速撤回消息
如果您需要以前的返回值请使用函数OSend
或者OSendAsync
除了文件管理
类,其他类均已解析实例类
详细信息如本例:
var k = new Message[] { new Plain("test") }.SendToFriend(qq,client);
if(k.Id > 0)//您可以不适用此检测方案
{
//发送成功 且MessageId = k.Id
}
else if(k.Id == -1)
{
//失败
}
k.ReCall();//快速撤回
var d = k.ReCall(2);//2秒后撤回
if (d)//您可以不适用此检测方案
{
//撤回成功
}
else
{
//撤回失败
}
1.端和信息有什么关系么?
A: 简单的说, 没有任何关系, 任何
一组信息
, 可以被任何端发送.
您可以使用扩展方法Message[].Send(Client,Type,SendTo)
.
2.我可以群发信息么(比如遍历什么的)?
A: 首先
一组信息
可以发送给群
也可以发送给人
, 所以需要类型, 当完全明确的时候, 我们建议使用MessageType*.Send()
, 而不是使用Message[].Send()
,
另: 8.0.0更新了获取信息类, 详细的成员遍历发送等请移步获取类查看.
3.我应该写新类还是使用主函数类?
A: 为了保持顶级语句的整洁, 当发送信息时, 我们
建议
您应当另开新文件
,创建新静态类
处理, 使用事件注册来控制.
4.收发之间有什么关系么?
A: 本框架调用段完全收发自由, 您无需先收后发, 您可以
直接
进行发送信息
, 也可以接受到信息后不产生回应
, 比如上例整点报时, 不需要收到信息然后产生动作.