Serein 相关
输出日志
serein.log(content?: any)
serein.log("这是一条日志");
serein.log(12345); // 你也可以输出数字
serein.log(new System.IO.StreamWriter('log.txt')); // 甚至可以输出对象
- 参数
content输出内容
 - 返回
- 空
 
 
提示
个人更推荐使用Logger输出,支持多参输入,且方便区分输出等级
Debug 输出
serein.debugLog(content?: any)
serein.debugLog("这是一条Debug输出");
- 参数
content输出内容
 - 返回
- 空
 
 
注册插件
serein.registerPlugin(name: string, version: string, author: string, description: string)
serein.registerPlugin("示例插件","v1.0","Zaitonn","这是一个示例插件"); 
- 参数
name插件名称version版本author作者或版权 信息description介绍
 - 返回
boolean(v1.3.2 及以前)- 成功为
true,否则为false 
- 成功为
 string(v1.3.3 及以后)- 当前的命名空间
 
 
设置监听器
serein.setListener(event: string, callback: Function)
serein.setListener("onServerOutput", (line) => {
    serein.log(`服务器输出:${line}`);
    return false; // 拦截此输出
});
serein.setListener("onGroupPoke", (group, user) => {
    serein.log(`监听群群成员戳一戳当前账号 触发群:${group} QQ:${user}`);
});
- 参数
event事件名称,具体值见下表(区分大小写)callback回调函数- 不要包含
()和参数 - 对于可拦截的事件,你可以通过返回
false进行拦截- 拦截后该事件便不会进行下一步处理(如正则匹配或输出到控制台)
 - 需要注意的是,你需要在规定时间内返回,具体时间可在配置文件
Serein.json-Function的JSEventMaxWaitingTime中修改(默认 500ms);超出时间后返回的将被忽略; 
 
- 不要包含
 
 - 返回
boolean- 设置监听器成功为
true,否则为false 
- 设置监听器成功为
 
 
事件列表
onServerStart
- 服务器启动
 - 监听函数原型: 
function () -> void - 不可拦截
 
onServerStop
- 服务器关闭
 - 监听函数原型: 
function (exitCode: number) -> voidexitCode退出代码(正常关闭时为 0)
 - 不可拦截
 
onServerOutput
- 服务器输出
 - 监听函数原型: 
function (line: string) -> booleanline输出行
 - 可被拦截
 
onServerOriginalOutput
- 服务器原始输出
 - 监听函数原型: 
function (line: string) -> booleanline输出行
 - 可被拦截
 
备注
onServerOutput总是先于onServerOriginalOutput触发,但是拦截onServerOutput不影响后者触发- 当两者中至少有一个事件被拦截时才会跳过下一步处理
 
onServerSendCommand
- 服务器输入指令
 - 监听函数原型: 
function (cmd: string) -> voidcmd输入命令
 - 不可拦截
 
onGroupIncrease
- 监听群群成员增加
 - 监听函数原型: 
function (group_id: number, user_id: number) -> voidgroup_id群号user_idQQ 号
 - 不可拦截
 
onGroupDecrease
- 监听群群成员减少
 - 监听函数原型: 
function (group_id: number, user_id: number) -> voidgroup_id群号user_idQQ 号
 - 不可拦截
 
onGroupPoke
- 监听 群戳一戳自身账号
 - 监听函数原型: 
function (group_id: number, user_id: number) -> voidgroup_id群号user_idQQ 号
 - 不可拦截
 
onReceiveGroupMessage
- 收到群消息(包括设置中未监听的群聊)
 - 监听函数原型: 
function (group_id: number, user_id: number, msg: string, shownName: string, message_id: number?) -> booleangroup_id群号user_idQQ 号msg消息内容shownName显示名称message_id消息 ID
 - 可被拦截
 
onReceivePrivateMessage
- 收到私聊消息
 - 监听函数原型: 
function (user_id: number, msg: string, nickName: string, message_id: number?) -> booleanuser_idQQ 号msg消息内容nickName昵称message_id消息 ID
 - 可被拦截
 
onReceivePacket
- 收到数据包
 - 监听函数原型: 
function (packet: string) -> booleanpacket数据包 UTF8 文本
 - 可被拦截
 
备注
onReceivePacket先于onReceivePrivateMessage和onReceiveGroupMessage触发,若此事件被拦截,私聊和群聊消息事件均不会被触发
onSereinClose
- Serein 关闭
 - 监听函数原型: 
function () -> void - 不可拦截
 
onPluginsReload
- 插件重载
 - 监听函数原型: 
function () -> void - 不可拦截
 
备注
以上两个事件为方便插件保存信息使用,超过JSEventMaxWaitingTime设置项的时间后继续执行将被中止
onPluginsLoaded
- 插件加载完毕
 - 监听函数原型: 
function () -> void - 不可拦截
 
设置预加载配置
serein.setPreLoadConfig(
  assemblies: string[], 
  allowGetType: boolean, 
  allowOperatorOverloading: boolean, 
  allowSystemReflection: boolean, 
  allowWrite: boolean, 
  strict: boolean
  )
- 参数
- 详见预加载配置
 
 - 返回
- 空
 
 
提示
设置后需要重新加载插件以应用
获取 Serein 设置
serein.getSettings()
- 参数
- 空
 
 - 返回
string设置的 json 文本
 
返回文本示例(因版本不同会有所偏差)
{
  "server": {
    "autoStop": true,
    "enableRestart": false,
    "enableOutputCommand": true,
    "enableLog": false,
    "enableUnicode": false,
    "excludedOutputs": [],
    "inputEncoding": 0,
    "lineTerminator": "\r\n",
    "outputEncoding": 0,
    "outputStyle": 1,
    "path": "C:\\Users\\Zaitonn\\Desktop\\s19\\bedrock_server_mod.exe",
    "port": 19132,
    "stopCommands": [
      "stop"
    ],
    "type": 1
  },
  "matches": {
    "difficulty": "(PEACEFUL|EASY|NORMAL|HARD|DIFFICULT[^Y])",
    "levelName": "Level\\sName:\\s(.+?)$",
    "muiltLines": [
      "players\\sonline:",
      "个玩家在线"
    ]
  },
  "bot": {
    "authorization": "",
    "autoEscape": false,
    "autoReconnect": false,
    "enableLog": false,
    "enbaleOutputData": false,
    "enbaleParseAt": true,
    "givePermissionToAllAdmin": false,
    "groupList": [],
    "permissionList": [],
    "uri": "127.0.0.1:8080"
  },
  "serein": {
    "autoUpdate": false,
    "colorfulLog": true,
    "dpiAware": true,
    "enableGetUpdate": false,
    "maxCacheLines": 250,
    "themeFollowSystem": true,
    "useDarkTheme": false,
    "autoRun": {
      "startServer": false,
      "connectWS": false,
      "delay": 0
    },
    "developmentTool": {
      "enableDebug": true,
      "detailDebug": false,
      "note": "以上设置内容为开发专用选项,请在指导下修改"
    },
    "function": {
      "noHeartbeat": false,
      "jsEventMaxWaitingTime": 500,
      "jsEventCoolingDownTime": 15,
      "disableBinderWhenServerClosed": false
    },
    "pagesDisplayed": {
      "serverPanel": true,
      "serverPluginManager": true,
      "regexList": true,
      "schedule": true,
      "bot": true,
      "member": true,
      "jsPlugin": true,
      "settings": true
    }
  },
  "event": {
    "BindingSucceed": [
      "g|[CQ:at,qq=%ID%] 绑定成功"
    ],
    "BindingFailDueToOccupation": [
      "g|[CQ:at,qq=%ID%] 该游戏名称被占用"
    ],
    "BindingFailDueToInvalid": [
      "g|[CQ:at,qq=%ID%] 该游戏名称无效"
    ],
    "BindingFailDueToAlreadyBinded": [
      "g|[CQ:at,qq=%ID%] 你已经绑定过了"
    ],
    "UnbindingSucceed": [
      "g|[CQ:at,qq=%ID%] 解绑成功"
    ],
    "UnbindingFail": [
      "g|[CQ:at,qq=%ID%] 该账号未绑定"
    ],
    "BinderDisable": [
      "g|[CQ:at,qq=%ID%] 绑定功能已被禁用"
    ],
    "ServerStart": [
      "g|服务器正在启动"
    ],
    "ServerStop": [
      "g|服务器已关闭"
    ],
    "ServerExitUnexpectedly": [
      "g|服务器异常关闭"
    ],
    "GroupIncrease": [
      "g|欢迎[CQ:at,qq=%ID%]入群~"
    ],
    "GroupDecrease": [
      "g|用户%ID%退出了群聊,已自动解绑游戏ID",
      "unbind|%ID%"
    ],
    "GroupPoke": [
      "g|别戳我……(*/ω\*)"
    ],
    "SereinCrash": [
      "g|唔……发生了一点小问题(っ °Д °;)っ\n请查看Serein错误弹窗获取更多信息"
    ],
    "RequestingMotdpeSucceed": [
      "g|服务器描述:%Description%\n版本:%Version%(%Protocol%)\n在线玩家:%OnlinePlayer%/%MaxPlayer%\n游戏模式:%GameMode%\n延迟:%Delay%ms"
    ],
    "RequestingMotdjeSucceed": [
      "g|服务器描述:%Description%\n版本:%Version%(%Protocol%)\n在线玩家:%OnlinePlayer%/%MaxPlayer%\n延迟:%Delay%ms\n%Favicon%"
    ],
    "RequestingMotdFail": [
      "g|Motd获取失败\n详细原因:%Exception%"
    ],
    "PermissionDeniedFromPrivateMsg": [
      "p|你没有执行这个命令的权限"
    ],
    "PermissionDeniedFromGroupMsg": [
      "g|[CQ:at,qq=%ID%] 你没有执行这个命令的权限 %card%"
    ]
  }
}
获取 Serein 设置对象
serein.getSettingsObject()
- 参数
- 空
 
 - 返回
object设置内容对象(见上)
 
提示
推荐使用serein.getSettingsObject()而不是serein.getSettings()
const settings = JSON.parse(serein.getSettings());
const settingsObj = serein.getSettingsObject();
// 虽然说两个方法等价(
// 但是通过`getSettingsObject`获取不需要再加一步转成JS对象,效率更高
执行命令
serein.runCommand(cmd: string)
serein.runCommand("g|hello")
- 参数
cmd一条Serein 命令
 - 返回
- 空
 
 
警告
此处无法执行绑定或解绑 ID、获取 motd 和执行 js 代码的命令
获取插件列表
serein.getPluginList()
- 参数
- 空
 
 - 返回
Array<PluginInfo>插件列表
 
// PluginInfo
{ 
  "namespace": "test",        // 命名空间
  "available": true,          // 是否可用
  "file": "plugins\\test.js", // 相对路径
  "wsclients": [],            // 创建的WS对象状态列表
  "name": "test",             // 注册的名称
  "version": "",              // 注册的版本
  "author": "",               // 注册的作者
  "description": "",          // 注册的介绍
  "eventList": [],            // 监听的事件列表
  "preLoadConig": {           // 预加载配置
    "assemblies": [],
    "allowGetType": false,
    "allowOperatorOverloading": true,
    "allowSystemReflection": false,
    "allowWrite": true,
    "strict": false
  } 
} 
serein.d.ts
declare type Plugin = {
  readonly namespace: string
  readonly name?: string
  readonly version?: string
  readonly author?: string
  readonly description?: string
  readonly file: string
  readonly preLoadConfig: PreLoadConfig
  readonly eventList: string[]
  readonly wsclients: WSClient[]
  readonly available: boolean
}
declare interface PreLoadConfig {
  readonly assemblies: string[]
  readonly allowGetType: boolean
  readonly allowOperatorOverloading: boolean
  readonly allowSystemReflection: boolean
  readonly allowWrite: boolean
  readonly strict: boolean
  readonly stringCompilationAllowed: boolean
}
declare interface WSClient {
  readonly state: -1 | 0 | 2 | 3
  readonly disposed: boolean
}
提示
由于此函数为即时获取,获取时可能还未将所有插件载入,故建议使用setTimeout()延迟一段时间再获取
设置命令变量
serein.setVariable(key: string, variable: any)
- 参数
key变量名称variable变量内容
 - 返回
boolean- 成功为
true,否则为false 
- 成功为
 
 
备注
key不能为空或 nullkey只能包含大小写字母、数字和下划线(即需要满足正则表达式^\w+$)key不需要包括两边的%- 设置重复的
key将会被覆盖 - 各个插件设置变量的可能存在冲突,执行时以最后设置的为准
- 你可以使用一个相对复杂的名称避免被覆盖(如
插件名_变量名) 
 - 你可以使用一个相对复杂的名称避免被覆盖(如
 - Serein 提供的变量在替换时优先级大于该变量
- 也就是说,只有当匹配不到 Serein 内的变量时才会采用以上自定义的变量