RPC - 说明
什么是 RPC?
RPC(Remote Procedure Call)是一种用于在不同进程或不同计算机上执行远程过程调用的通信协议。它允许一个程序调用另一个程序的过程,就像调用本地过程一样。
在 EasyBot 中,RPC 用于插件和服务器扩展之间通信,允许插件调用在服务器上安装的扩展插件中的函数或方法。这为插件的扩展和定制提供了更大的灵活性。
如何定义一个 RPC 接口
你 可以在插件中定义一个 RPC 接口, 这可以让在服务器上的扩展插件调用插件中定义的函数或方法。
// ctx 的定义
declare interface RpcContext {
args: any; // 服务器传递过来的参数 他是一个被 JSON 反序列化后的对象
/**
* 调用端 桥接对象
*/
caller?: Bridge; // 目前不会为NULL 但为了后续的插件扩展 这里保留了可选性 (后续更新后 如果是其他主程序插件调用的 这里可能会为NULL)
}
// 定义一个 RPC 接口 "get_servers"
rpc.on("get_servers", async (ctx) => { // 定义一个异步函数, 用于处理 "get_servers" 接口的调用
const servers = Array.from(await sessions.GetBridges());
return { // 这里可以返回任意类型的数据 但是他必须是一个 JSON 可序列化的对象
data: servers.map((s) => ({
name: s.Session.Info.CachedServerName,
token: s.Session.Info.CachedServerToken,
})),
args: ctx.args,
caller: {
name: ctx.caller?.Session.Info.CachedServerName,
token: ctx.caller?.Session.Info.CachedServerToken,
}
};
}, "获取服务器列表", "获取当前所有连接的服务器列表")
如何在服务器调用这个接口???
注意
以下是服务端插件扩展开发的代码,并非主程序插件开发的代码
BridgeClient.getInstance().rpcCall(
"", // 此处填写插件的 ID (manifest.json 中的 id 字段)
"get_servers", // 这里是 RPC 接口的名称 (上面定义的)
new JsonObject() // 这里可以传递任意 JSON 可序列化的对象 作为参数
)
如何调用服务器上的 RPC 接口?
参考 服务器扩展开发 - 如何在服务器定义RPC方法 中定义的 "get_date" 接口 你可以这样调用服务器上的方法
// 1. 获取服务器连接实例
const server = sessions.GetBridge("服务器TOKEN写这里");
if (server) {
try {
// 2. 发起 RPC 请求
// 参数 identifier: "bridge:test"
// 参数 method: "get_date"
// 参数 args: 根据实际业务需求传递对象
const response = await server.RpcInvoke(
"bridge:test",
"get_date",
{ /* params */ } // 这里无参
);
logger.info("服务器时间: {res}", response.date); // (正常情况下打印) 服务器时间: xxxxxxxxxxxxxxxx
} catch (err) {
logger.error("调用失败: {err}", err);
}
} else {
logger.warning("服务器离线或未连接");
}
遇到麻烦了?
我们提供有偿代安装服务,解决您的环境配置烦恼。