Skip to content

"Hello JKook!"

ZX夏夜之风 edited this page Mar 11, 2023 · 8 revisions

本节将会教您从 0 开始制作一个基于 JKook 的,超级简单的 KOOK 机器人插件。

我们让这个插件实现了一个简单的 /ping 命令。

效果是:当您在某服务器的任何文字频道发送了内容为 "/ping" 的聊天信息,机器人将会向您发送一条私信,内容为 "PONG!" 。

前提是我们的机器人需要在这个服务器里。

准备环境

先让我们从搭建基础环境开始。

我们用到了以下工具:

接下来,请创建一个全新的 Maven 项目。

然后,根据 JKook 仓库README 所提供的安装教程,将 JKook 工件作为您的项目的依赖项。

声明 Plugin

请新建一个 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 # 注意,这个必不可少!

用到的 JKook 内容解读

好的,我们可以开始思考实现了。

首先,/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 的简单使用
Clone this wiki locally