事件监听
监听
- C#
- JavaScript
代码参考:
- v2.1.x+: src/Serein.Core/Services/Plugins/Net/PluginBase.Events.cs
- v2.0.x: src/Serein.Core/Models/Plugins/Net/PluginBase.Events.cs
在插件类内重载虚方法即可
示例
using Serein.Core.Services.Plugins.Net;
using System;
using System.Threading.Tasks;
namespace MyPlugin;
public class MainPlugin : PluginBase
{
public override void Dispose() { }
protected override Task OnPluginsLoaded()
{
Console.WriteLine("Loaded!");
return Task.CompletedTask;
}
}
serein.setListener(event: string, callback: Function): void
参数 | 类型 | 说明 |
---|---|---|
event | string | 事件名称(见下;不区分大小写) |
callback | Function | null | 回调函数 |
示例
serein.setListener('PluginsLoaded', () => {
console.log(`I'm loaded!`);
});
serein.setListener('PluginsLoaded', async () => {
await doSomethingAsync();
console.log(`I'm loaded after doing something async!`);
});
serein.setListener('PluginsLoaded', null); // 移除监听
拦截
对于可被拦截的事件,可以通过返回 false
来拦截事件,阻止其继续传递
例如,拦截 ServerStarting
将阻止服务器启动并阻止下一个事件 ServerStarted
的触发
- C#
- JavaScript
using Serein.Core.Services.Plugins.Net;
using Serein.Core.Services.Servers;
using System;
using System.Threading.Tasks;
namespace MyPlugin;
public partial class MainPlugin : PluginBase
{
protected override Task<bool> OnServerStarting(ServerBase server)
{
Console.WriteLine("Intercepted!");
return Task.FromResult(false);
}
}
提示
从 v2.1.0 开始,支持返回 Promise
,以便在异步操作完成后再触发事件
// 同步
serein.setListener('ServerStarting', (_) => {
console.log('Intercepted!');
return false;
});
// 异步(v2.1.0+)
serein.setListener('ServerStarting', async (_) => {
await doSomethingAsync();
console.log('Intercepted!');
return false; // 返回 false 拦截事件
});
提示
当拦截事件时,你或许应该根据实际情况以合理的方式告诉用户,避免造成不必要的困扰
事件一览
事件名称 | 是否可被拦截 |
---|---|
ServerStarting | ✅ |
ServerStarted | ❌ |
ServerStopping | ✅ |
ServerExited | ❌ |
ServerRawOutput | ✅ |
ServerOutput | ✅ |
ServerInput | ❌ |
ChannelMessageReceived | ✅ |
GroupMessageReceived | ✅ |
PrivateMessageReceived | ✅ |
OnConnectionDataReceived | ✅ |
PacketReceived | ✅ |
SereinClosed | ❌ |
SereinCrashed | ❌ |
PluginsLoaded | ❌ |
PluginsUnloading | ❌ |
ServerStarting
- 触发时机:服务器启动前
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
server | Server | 服务器对象 |
ServerStarted
- 触发时机:服务器启动后
- 可被拦截:否
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
server | Server | 服务器对象 |
ServerStopping
- 触 发时机:用户尝试手动停止服务器时
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
server | Server | 服务器对象 |
ServerExited
- 触发时机:服务器进程退出后
- 可被拦截:否
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
server | Server | 服务器对象 |
exitCode | int /number | 退出代码 |
exitTime | DateTime /Date | 退出时间 |
ServerRawOutput
和
ServerOutput
的区别ServerRawOutput
会在 ServerOutput
之前触发,且可能包含 ANSI 转义序列等特殊字符
- 触发时机:服务器输出
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
server | Server | 服务器对象 |
line | string | 输出行 |
ServerOutput
- 触发时机:服务器输出
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
server | Server | 服务器对象 |
line | string | 输出行 |
ServerInput
- 触发时机:服务器输入
- 可被拦截:否
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
server | Server | 服务器对象 |
line | string | 输入行 |
GroupMessageReceived
- 触发时机:收到群聊消息
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
packets | Packets | 消息数据包 |
PrivateMessageReceived
- 触发时机:收到私聊消息
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
packets | Packets | 消息数据包 |
ChannelMessageReceived
- 最低版本:v2.1.0
- 触发时机:收到频道消息
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
packets | Packets | 消息数据包 |
ConnectionDataReceived
触发顺序
ConnectionDataReceived
PacketReceived
- 以下事件
GroupMessageReceived
PrivateMessageReceived
ChannelMessageReceived
- 最低版本:v2.1.0
- 触发时机:收到 WebSocket 连接的数据文本
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
data | string | 数据文本 |
PacketReceived
- 触发时机:收到 WebSocket 连接的数据包
- 可被拦截:是
- 函数参数:
参数 | 类型 | 说明 |
---|---|---|
packet | JsonNode | 数据包 |
SereinClosed
提示
你可以通过此事件和 PluginsUnloading
事件来释放插件占用的资源,例如数据库连接、文件流等
- 触发时机:程序即将退出前
- 可被拦截:否
- 函数参数:无
SereinCrashed
备注
不能保证总是能触发成功
- 触发时机:程序崩溃后
- 可被拦截:否
- 函数参数:无
PluginsLoaded
- 触发时机:插件加载完成后
- 可被拦截:否
- 函数参数:无
PluginsUnloading
- 触发时机:插件卸载前
- 可被拦截:否
- 函数参数:无