Skip to content

可交互输入(Prompt)

引言

在实际开发过程中,我们可能会需要用户输入必填参数,或者需要用户确认操作,才能继续执行函数,为此, Zhin 在**会话(Session)**上提供了一个 prompt 对象,用于接收用户下一次输入的内容,具体用例如下:

案例

typescript
import { Context } from "zhin";

export function install(ctx: Context) {
  ctx
    .command("del [id:number]")
    .desc("删除用户")
    .action(async ({ session }, id) => {
      if (!id) id = await session.prompt.number("请输入你要删除的用户ID");
      const confirm = await session.prompt.confirm(`确认删除用户(${id})么?`);
      if (confirm) {
        // 删除用户
        return "删除成功";
      }
      return "已取消";
    });
}
聊天记录
master
del
知音
请输入你要删除的用户ID
master
78
知音
确认删除用户(78)么?
输入yes,y,Yes,YES,Y,.,。,确认为确认
master
yes
知音
删除成功

当然,prompt 可以支持的交互不仅与 number 和 confirm,下面将详细介绍有那些交互输入的类型

可交互输入的类型

1.text

  • 输出一条提示信息,提示用户输入一行文本
typescript
const name = session.prompt.text("请输入姓名");

2.number

  • 输出一条提示信息,提示用户输入一个数字
typescript
const age = session.prompt.number("请输入年龄");

3.date

  • 输入一条提示信息,提示用户输入一个日期
typescript
const birthDay = session.prompt.date("请输入出生年月日");

4.regexp

  • 输入一条提示信息,提示用户输入一个正则表达式
typescript
const reg = session.prompt.regexp("请输入一个正则表达式");

5.confirm

  • 输入一条提示信息,提示用户是否确认
typescript
const isAdult = session.prompt.confirm("是否成年");

6.list

  • 输入一条提示信息,提示用户输入一个指定类型的list
typescript
const hobbies = session.prompt.list("请输入你的兴趣爱好", {
  child_type: "text",
});

7.select

  • 输入一条提示信息,提示用户选择一个或多个给出选项的值
typescript
const selctedList = session.prompt.select("请选择你喜欢的水果", {
  child_type: "text",
  multiple: true, // 不传则为单选
  options: [
    { label: "苹果", value: "apple" },
    { label: "香蕉", value: "banana" },
    { label: "橙子", value: "orange" },
  ],
});

8.组合成对象使用 (prompts)

除了上述单条单条的让用户输入,Zhin 还允许,你将配置组合成一个对象,让用户依次输入,最后组装成一个对象返回。

我们将上述7个例子组装在一起后,试试效果

typescript
import { Context } from "zhin";

export function install(ctx: Context) {
  ctx
    .command("collect")
    .desc("采集用户信息")
    .action(async ({ session }, id) => {
      const userInfo = await session.prompt.prompts({
        name: { type: "text", message: "请输入姓名" },
        age: { type: "number", message: "请输入年龄" },
        birthDay: { type: "date", message: "请输入出生年月日" },
        reg: { type: "regexp", message: "请输入一个正则表达式" },
        isAdult: { type: "confirm", message: "是否成年" },
        hobbies: {
          type: "list",
          child_type: "text",
          message: "请输入你的兴趣爱好",
        },
        likeFruits: {
          type: "select",
          child_type: "text",
          message: "请选择你喜欢的水果",
          multiple: true,
          options: [
            { label: "苹果", value: "apple" },
            { label: "香蕉", value: "banana" },
            { label: "橙子", value: "orange" },
          ],
        },
      });
      return JSON.stringify(userInfo, null, 2);
    });
}
聊天记录
master
collect
知音
请输入姓名
master
张三
知音
请输入年龄
master
18
知音
请输入出生年月日
master
2000-01-01
知音
请输入一个正则表达式
master
/^(.*)$/
知音
是否成年
输入yes,y,Yes,YES,Y,.,。,确认为确认
master
y
知音
请输入你的兴趣爱好
值之间使用','分隔
master
唱,跳,Rap,篮球
知音
请选择你喜欢的水果
1.苹果
2.香蕉
3.橙子
值之间使用','分隔
master
1
知音
{ "name": "张三", "age": 18, "birthDay": "2000-01-01T00:00:00.000Z", "reg": {}, "isAdult": true, "hobbies": [ "唱", "跳", "Rap", "篮球" ], "likeFruits": [ "apple" ] }