第一个 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}`,
},
},
]);
},
);router 是 Context 实例的一个属性,我们用它来定义机器人将会响应哪些指令,并且这些指令的规则分别是什么样的。ctx.router.command 方法用来定义一个指令指令。它接受三个参数:
- 第一个参数是指令的名称,这里是
echo,表示当用户发送的消息以echo开头时,这个指令就会被触发。 - 第二个参数是一个对象,定义了这个指令的参数规则。我们给
echo指令定义了一个content参数,它是一个字符串类型的参数,表示用户在echo后面输入的文本内容。 - 第三个参数是一个回调函数,当指令被触发时,这个函数会被调用。它接受两个参数:
session和一个包含指令参数的对象。session代表了当前的会话,可以用它来发送回复消息等操作。我们在回调函数中使用session.reply方法来回复一条消息。- 第二个参数是一个对象,包含了指令的参数,这里我们通过解构赋值的方式直接获取了
content参数。得益于 TypeScript 的类型推断,编译器知道content是一个字符串类型的参数,因此我们不需要再重复声明它的类型。
ctx.start();最后,我们调用 ctx.start 方法来启动机器人,使它开始连接 Milky 协议端并监听消息。你可以随时使用 Ctrl+C 来停止机器人。
下一步
如果一切正常,恭喜你,你已经成功创建了一个简单的 Fraq 机器人!你可能会觉得上面回复消息的代码有些啰嗦,毕竟我们只是想回复一条简单的文本消息,却用了足足 8 行代码来表示这条消息。别担心,下一节就会介绍更加简洁的写法。祝你玩得开心!