-
Notifications
You must be signed in to change notification settings - Fork 12
"Hello JKook!"
本节将会教您从 0 开始制作一个基于 JKook 的,超级简单的 KOOK 机器人插件。
我们让这个插件实现了一个简单的 /ping
命令。
效果是:当您在某服务器的任何文字频道发送了内容为 "/ping" 的聊天信息,机器人将会向您发送一条私信,内容为 "PONG!" 。
前提是我们的机器人需要在这个服务器里。
先让我们从搭建基础环境开始。
我们用到了以下工具:
- IntelliJ IDEA
- OpenJDK 8
- Maven 3
接下来,请创建一个全新的 Maven 项目。
然后,根据 JKook 仓库 的 README 所提供的安装教程,将 JKook 工件作为您的项目的依赖项。
请新建一个 Java 类,使其继承 BasePlugin
类 (位于 snw.jkook.plugin
包下)。API 实现在读取您的 JAR 时会构造这个类的实例来表示您的 Plugin 。
之后的内容将此次新建的 Java 类命名为核心类 (Core Class)。
您的核心类可能像这样:
package snw.pings;
// import 被忽略
public class Main extends BasePlugin {
@Override
public void onLoad() {
// 重写 onLoad 并不是必须的,但是您可以在此阶段做一些初始化工作,比如解压默认的配置文件 (saveDefaultConfig)
// 三个方法内的日志记录也不是必须的,但是善用日志记录有助于描述 Bot 的运行状态!
getLogger().info("Ping loaded successfully"); // getLogger() 返回的是一个 org.slf4j.Logger 的实例对象,为日志记录器
}
@Override
public void onEnable() {
getLogger().info("Ping enabled successfully");
}
@Override
public void onDisable() {
getLogger().info("Ping stopped");
}
}
之后,请在 src\main\resources 下创建一个名为 plugin.yml 的文件,用以下内容填充。
name: Ping
version: 0.1.0
authors: ["<Your Name>"] # e.g. ["SNWCreations"]
main: <Your Core Class path> # e.g. snw.pingbot.Main
api-version: 0.48.2 # 注意,这个必不可少!
好的,我们可以开始思考实现了。
首先,/ping
是一个命令,如何在 JKook 里编写一个命令呢?
用 JKookCommand 类 (位于 snw.jkook.command
包下)。
现在让我们看看 JKookCommand
类的重要方法 setExecutor
。
文档原文:
"Set the executor of this command."
我们可以通过这个方法设置此命令的 "执行器" 。目标的执行器会在命令被触发时调用。
命令可以被触发的情况如下:
- 用户在任意文字频道内发送了有效命令
- 后台执行了有效命令
最后我们要知道怎么注册一个 JKookCommand
。
JKookCommand
是建造器模式,一个最简单的、标准的 JKookCommand
命令大概是这样的:
new JKookCommand("blah")
.setExecutor(
(sender, args, message, message) -> {
// 执行器内容
}
)
.register(); // 注册命令
自 0.26.0 起,也提供了另一种方法: JKookCommand#executesUser 。
其接受一个 UserCommandExecutor 参数,可以用 lambda 实现。
现在,文档看完了。但是我有两个问题需要你思考。
- 命令有几个参数?
- 命令面向的对象是谁?
思考完了吗?我要开始解读了。
第一个问题。命令有几个参数?
答案是没有。
很好理解,因为你只需要在收到命令时做出反应。
第二个问题,命令面向的对象是谁?
主要还是 KOOK 用户。
后台执行这个命令是没有意义的。
其实这部分内容很简单。
只需要在核心类的 onEnable 阶段注册命令就可以了。
我们的命令大概是这样:
new JKookCommand("ping")
.setExecutor(
(sender, args, message) -> {
if (sender instanceof User) { // 确保是个 Kook 用户在执行此命令, 现在更推荐 executesUser 方法
((User) sender).sendPrivateMessage(
new TextComponent("PONG!") // Component 表示一个聊天组件,见 snw.jkook.message.component 包
); // 发送私信
}
else {
getLogger().info("This command is not available for console.");
// 这个 else 块是可选的,但为了用户体验,最好还是提醒一下
// 另外,我们假设此执行器是在 Plugin#onEnable 里写的,所以我们可以使用 getLogger() 。
}
}
)
.register();
整个核心类大概是这样:
package snw.ping;
// import 被忽略
public class Main extends BasePlugin {
@Override
public void onLoad() {
// 重写 onLoad 并不是必须的,但是您可以在此阶段做一些初始化工作,比如解压默认的配置文件 (saveDefaultConfig)
// 三个方法内的日志记录也不是必须的,但是善用日志记录有助于描述 Bot 的运行状态!
getLogger().info("Ping loaded successfully"); // getLogger() 返回的是一个 org.slf4j.Logger 的实例对象,为日志记录器
}
@Override
public void onEnable() {
new JKookCommand("ping")
.setExecutor(
(sender, args, message) -> {
if (sender instanceof User) { // 确保是个 Kook 用户在执行此命令
((User) sender).sendPrivateMessage(
new TextComponent("PONG!") // Component 表示一个聊天组件,见 snw.jkook.message.component 包
); // 发送私信
}
else {
getLogger().info("This command is not available for console.");
// 这个 else 块是可选的,但为了用户体验,最好还是提醒一下
// 另外,我们假设此执行器是在 Plugin#onEnable 里写的,所以我们可以使用 getLogger() 。
}
}
)
.register();
getLogger().info("Ping enabled successfully");
}
@Override
public void onDisable() {
getLogger().info("Ping stopped");
}
}
至此,这个 Ping 插件就完成了。
构建,然后拿着 JAR 到一个 API 实现那里去试试吧!
我们提到了以下内容:
- 一个简单的 JKook 开发环境的准备
- 一个 Plugin 应该如何声明
- 如何在 JKook 里注册命令
- Logger 的简单使用