Fraqv0.7.0

第一个 Fraq 机器人

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

echo <任意文本>

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

You said: <任意文本>

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

编写代码

首先,启动你的 Milky 协议端,并确认它监听的地址与端口。然后,在你的项目中创建一个 index.ts 文件,并添加以下代码:

import { Context, param } from '@fraqjs/fraq';

const ctx = Context.fromUrl('<替换成你的 Milky 协议端地址>', {
  // accessToken: '<如果你的 Milky 协议端配置了 token,请在这里添加>',
});

ctx.router.command(
  'echo',
  {
    content: param.str(),
  },
  (session, { content }) => {
    session.reply([
      {
        type: 'text',
        data: {
          text: `You said: ${content}`,
        },
      },
    ]);
  },
);

ctx.start();

在一切完成之后,用 tsx 执行你的 index.ts 文件:

npx tsx index.ts
# 或 tsx index.ts, 如果你全局安装了 tsx

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

到底做了些什么?

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

const ctx = Context.fromUrl('<替换成你的 Milky 协议端地址>');

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

ctx.router.command(
  'echo',
  {
    content: param.str(),
  },
  (session, { content }) => {
    session.reply([
      {
        type: 'text',
        data: {
          text: `You said: ${content}`,
        },
      },
    ]);
  },
);

routerContext 实例的一个属性,我们用它来定义机器人将会响应哪些指令,并且这些指令的规则分别是什么样的。ctx.router.command 方法用来定义一个指令指令。它接受三个参数:

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

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

下一步

如果一切正常,恭喜你,你已经成功创建了一个简单的 Fraq 机器人!你可能会觉得上面回复消息的代码有些啰嗦,毕竟我们只是想回复一条简单的文本消息,却用了足足 8 行代码来表示这条消息。别担心,下一节就会介绍更加简洁的写法。祝你玩得开心!

On this page