Fraqv0.14.0

第一个 Fraq 机器人

我们从一个 Echo 机器人开始。它的功能很简单:在任何一个包含它的会话(私聊或群聊)中,只要发送

echo <任意文本>

机器人就会相应地发送一条

You said: <任意文本>

的消息。下面我们开始编写这个机器人。

创建项目

Fraq 提供了一个模板仓库方便你快速创建一个新的 Fraq 项目。你可以点击 "Use this template" 按钮来创建一个新的仓库,然后克隆到本地。

模板仓库使用 pnpm 作为包管理器,因此你需要先安装 pnpm。如果你还没有安装,可以参考 pnpm 官方文档来安装。确保 pnpm 可用之后,在项目根目录下运行以下命令来安装依赖:

pnpm install

强烈建议使用 TypeScript 来编写 Fraq 代码。

编写代码

首先,启动你的 Milky 协议端,并确认它监听 127.0.0.1 地址的 30001 端口。然后,打开你的项目的 src/index.ts 文件,你会看到以下的代码:

import { createColoredLogHandler } from '@fraqjs/color-log';
import { Context, param } from '@fraqjs/fraq';

const ctx = Context.fromUrl('http://127.0.0.1:30001/', {
  logHandler: createColoredLogHandler({
    minLevel: 'debug',
  }),
});

ctx.router
  .command('echo')
  .arg('content', param.str())
  .execute((session, { content }) => {
    session.reply(`You said: ${content}`);
  });

ctx.start();

用以下命令启动你的 Fraq 项目:

pnpm start

你可以在任何一个包含机器人的会话中发送 echo Hello 来测试它是否正常工作。

到底做了些什么?

我们来逐行解释一下上面的代码:

const ctx = Context.fromUrl('http://localhost:30001/', {
  // logHandler 的配置
});

Context 是 Fraq 的核心类,代表了一个机器人实例,它包含了机器人的配置、状态、路由等信息。我们通过 Context.fromUrl 方法来创建一个新的 Context 实例,并传入 Milky 协议端的地址。

ctx.router
  .command('echo')
  .arg('content', param.str())
  .execute((session, { content }) => {
    session.reply(`You said: ${content}`);
  });

routerContext 实例的一个属性,我们用它来定义机器人将会响应哪些指令,并且这些指令的规则分别是什么样的。ctx.router.command('echo') 会开始定义一个名为 echo 的指令;随后可以继续调用 .arg(...) 添加参数,最后通过 .execute(...) 注册处理函数。

  • .command('echo') 指定了指令名称,表示当用户发送的消息以 echo 开头时,这个指令就会被触发。
  • .arg('content', param.str()) 定义了这个指令的参数规则。这里的 content 是一个字符串类型的参数,表示用户在 echo 后面输入的文本内容。
  • .execute(...) 用于注册处理函数。当指令被触发时,这个函数会被调用。它接受两个参数:session 和一个包含指令参数的对象。
    • session 代表了当前的会话,可以用它来发送回复消息等操作。我们在回调函数中使用 session.reply 方法来回复一条消息。
    • 第二个参数是一个对象,包含了指令的参数,这里我们通过解构赋值的方式直接获取了 content 参数。得益于 TypeScript 的类型推断,编译器知道 content 是一个字符串类型的参数,因此我们不需要再重复声明它的类型。
ctx.start();

最后,我们调用 ctx.start 方法来启动机器人,使它开始连接 Milky 协议端并监听消息。你可以随时使用 Ctrl+C 来停止机器人。

下一步

如果一切正常,恭喜你,你已经成功创建了一个简单的 Fraq 机器人。下一节将会介绍如何构建更多类型的消息段。祝你玩得开心!

On this page