扩展 WudiLib 事件
若要扩展 WudiLib 事件列表,需要定义数据类型,继承 ApiPostListener
类(或者子类),重写 Response ProcessPost(JObject contentObject)
方法。
定义事件的数据类型
首先需要定义数据类型,根据事件类型不同,继承不同的类并添加缺失字段。同时需要 override Endpoint
以确保相关响应可以发送到正确的群或好友。以好友消息撤回为例:
public sealed class FriendRecallNotice : Notice
{
public override Endpoint Endpoint => new PrivateEndpoint(UserId); // 必须 override
[JsonProperty("message_id")]
public long MessageId { get; set; }
}
提示
Post
类中已经定义了 time
等字段,Notice
类定义了 notice_type
,所以无需在此重复定义。
添加事件处理路由
根据通信方式的不同,需要继承不同的类并重写相关方法。如果是 HTTP POST 方式,需要继承 ApiPostListener
;正向 WebSocket 则需要继承 CqHttpWebSocketEvent
。
可以重写的方法包括 Response ProcessPost(JObject contentObject)
、void ProcessMessage(JObject contentObject)
、virtual void ProcessNotice(JObject contentObject)
等,请根据扩展事件类型重写对应方法。如果匹配事件类型,则调用相关业务逻辑,并在未匹配时调用基类的同名方法。例如:
public class ExtendedApiPostListener : ApiPostListener
{
public ExtendedApiPostListener() : base() { } // 添加构造方法
public ExtendedApiPostListener(string address) : base(address) { } // 添加构造方法
public ExtendedApiPostListener(int port) : base(port) { } // 添加构造方法
protected override void ProcessNotice(JObject contentObject)
{
switch (contentObject["notice_type"].ToObject<string>())
{
case "friend_recall":
ProcessFriendRecallNotice(contentObject.ToObject<FriendRecallNotice>());
break;
default:
base.ProcessNotice(contentObject); // 必须调用基类的方法
break;
}
}
}