Skip to content
This repository was archived by the owner on Mar 29, 2024. It is now read-only.

3 (1). 通用的信息处理 (收取,发送,撤回)

DavidMeow edited this page Jan 13, 2023 · 1 revision

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;
//...

运行,并尝试发送给您的机器人一段文字.
至此,接收端就这样做成了.

3.2 信息的发送

在本节中,我们主要讨论 收到信息后的发送主动发送信息

3.2.1 被动处理消息

假设我们从好友信息中读取数据.

  1. 首先需要先规定命令的格式 例如: 重复 [要重复的内容]
  2. 写一个处理这个事件的函数, 传入数据为原始信息需要的部分, 输出为一个Message[]数组等待发送.
  3. 发送这个信息,使用某个端发送.

原始写法:

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),
            };
        }
    }
}

到现在为止, 您可以尝试发送给您的机器人一个消息, 内容如下: 重复 这句话
您的机器人应该回复: 这句话
至此, 被动处理消息已经完成

3.2.2 主动发送消息

(不建议大量发送,可能会被风控)

您可以使用消息发送功能主动朝某个端的好友/群/陌生人发送消息.
例如下例的 整点报时系统.

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()) // 控制台操作
    {
        //.....
    }
}

您也未必需要都写在顶级语句内, 您可以 自己规定发送形式, 以及其他的任何程序处理逻辑.
如上例的计时器可以完全写在另一个类内.
但您要注意, 您无法获得顶级语句内的任何变量,
所以我们 建议在外域(其他类) 定 义 端, 然后在顶级语句使用完全限定名称引用.

3.3 信息的撤回

在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
{
    //撤回失败
}

3.4 FAQ

1.端和信息有什么关系么?

A: 简单的说, 没有任何关系, 任何一组信息, 可以被任何端发送.
您可以使用扩展方法 Message[].Send(Client,Type,SendTo).

2.我可以群发信息么(比如遍历什么的)?

A: 首先一组信息可以发送给也可以发送给, 所以需要类型, 当完全明确的时候, 我们建议使用 MessageType*.Send(), 而不是使用 Message[].Send(),
另: 8.0.0更新了获取信息类, 详细的成员遍历发送等请移步获取类查看.

3.我应该写新类还是使用主函数类?

A: 为了保持顶级语句的整洁, 当发送信息时, 我们建议您应当另开新文件, 创建新静态类处理, 使用事件注册来控制.

4.收发之间有什么关系么?

A: 本框架调用段完全收发自由, 您无需先收后发, 您可以直接进行发送信息, 也可以接受到信息后不产生回应, 比如上例整点报时, 不需要收到信息然后产生动作.