Custom Commands V3Flows 与编辑器
Custom Commands V3公测

机器人的逻辑,一步步搭建

Flow 就是一连串步骤。“每日一问”Flow 只有五步:读取题库、挑出下一个问题、发布、开启子区、计数。添加一个步骤,把数值接进去,测试一下,然后启用。

每日一问

已启用保存

触发器

更改

定时,每天 09:00

#1

获取存储值(get-storage-value)

从以下位置读取题库:{questions}

#2

挑选下一条(array-at)

昨天那条之后的一条

#3

发送消息(send-message)

输入参数

频道:#general

消息:今日问题

#4

创建子区(start-thread-from-message)

在该消息下开启一个子区

#5

增加存储值(increment-storage-value)

将该问题计为已提问,写入{asked}

仅为示意,实际界面可能有所不同

这五个步骤在 09:00 的运行结果

这五个步骤产生一条消息。答案会汇集在它下面的子区里,计数器则确保明天会轮到下一个问题。

general
在线
你的机器人机器人09:00

今日问题

有哪款游戏是你不管它变得多老,都会一直回去玩的?

第 42 个问题,共 120 个

Mira09:04

泰拉瑞亚。我每年冬天都要重装一遍。

给 #general 发消息

仅为示意,实际界面和行为可能有所不同

用步骤,而不是脚本

每个步骤都是目录中的一个动作,有各自的输入,而某个步骤产生的值可以接入后面任何一个步骤。编辑器只会提供与之匹配的值。选择器背后共有 691 个动作和 181 种参数类型。

固定值、接入的变量或模板

每个输入都可以三选一。模板可以把你自己写的文字和插入的变量混合在一起。

变量选择器能识别类型

它会隐藏不匹配的值,可以深入对象的属性,提醒你哪些值可能为空,还能替你添加转换步骤。

接入的值以标签形式显示

这些行上的标签是问题题库和频道,让你一眼看出数值的来源。

每个步骤都有成本

从“免费”到“极重”,启用前 Flow 会先告诉你它的最坏情况。

你不必从空白 Flow 开始。控制台自带可以打开并修改的模板:问候回复、欢迎新成员、/warn 命令、/remind 命令、XP 系统、建议和活动报名。

每日一问

已启用保存

触发器

更改

定时,每天 09:00

#1

获取存储值(get-storage-value)

从以下位置读取题库:{questions}

#2

挑选下一条(array-at)

昨天那条之后的一条

#3

发送消息(send-message)

输入参数

频道:#general

消息:今日问题

#4

创建子区(start-thread-from-message)

在该消息下开启一个子区

#5

增加存储值(increment-storage-value)

将该问题计为已提问,写入{asked}

仅为示意,实际界面可能有所不同

分支与循环

自动化需要做决定。“如果”“切换”“随机分支”和“按子命令分支”可以拆分 Flow,“遍历每个项目”“遍历每个映射条目”和“重复”可以配合“中断”与“继续”遍历列表和映射,而“尝试”块则让你在 Discord 拒绝时有地方放置补救措施。

每个分支都有自己的变量

在分支内设置的值只属于该分支。

“尝试”,附带“出错时”分支

它可以根据错误代码切换:缺少权限、未找到、输入无效、存储错误、超时、交互已过期。

该停就停

这个 Flow 里的“如果”会在员工频道发出提醒然后停止,而不是发布一个空的问题。

失控的循环会自行停止,所以出错时它会停下来,而不是跑一上午。

每日一问

已启用保存

触发器

更改

定时,每天 09:00

#1

获取存储值(get-storage-value)

从以下位置读取题库:{questions}

#2

如果(if-condition)

题库为空:在 #staff 发布提醒并停止

#3

遍历每个项目(for-each)

遍历题库,直到找到一个没用过的问题

#4

发送消息(send-message)

把问题以嵌入消息发布到#general

#5

创建子区(start-thread-from-message)

在该消息下开启一个子区

仅为示意,实际界面可能有所不同

Flow 可以调用其他 Flow,等待也是一个步骤

把一种行为写一次,在任何需要的地方调用。而当 Flow 需要先得到一个答复才能继续时,这个等待会被记录下来,而不是存放在内存里,所以机器人重启也不会丢失。

调用另一个 Flow

传入数值,读回结果。会形成循环互相调用的 Flow 会被拒绝。

被调用的 Flow 属于调用者的这次运行

运行历史里会注明这一点,并链接回调用者。自定义事件则是更松散的方式:一个 Flow 发送,另一个监听。

等待在重启后依然有效

请求确认、请求选择、等待消息、显示弹窗并等待提交。期间重启也不会丢失等待。

定时运行

“安排 Flow 运行”可以在 Flow 内部预约之后的一次运行,还有取消和列出待执行项的动作。

如果你在某个 Flow 的一次运行正在等待某人时编辑了它,这次等待中的运行会停止,日志里也会注明。对于需要保持数月可用的功能,用按钮来启动 Flow 是更好的选择:没人点击时不产生任何成本,而且永不过期。

审核建议

已启用保存

触发器

更改

弹窗已提交,建议一个问题

#1

发送消息(send-message)

发布带“批准”按钮的建议到#staff

#2

等待按钮(wait-for-interaction)

暂停,直到版主点击

#3

设置存储值(set-storage-value)

把问题添加到{questions}

#4

调用另一个 Flow(call-flow)

每日一问,并把新问题作为参数传入

仅为示意,实际界面可能有所不同

上线前先看一遍

测试运行会用你自己的服务器数据模拟这个 Flow,不会发送、更改或删除任何内容。你可以选择以谁的身份运行、在哪个频道运行,以及触发器传入什么,结果会列出每个步骤以及它本会做什么。测试不会给你的服务器带来任何成本。

Flow 在激活前还会经过检查,所以问题会在编辑器里暴露,而不是等到早上九点才出现。失控的循环也不会拖垮你的机器人:它会自行停止。

草稿或已激活

草稿会被保存和检查,但永远不会运行。

保存已激活的 Flow 会立即生效

保存后,你的机器人会立刻采用新版本。如果没有成功,原来正在运行的版本会继续处理该 Flow,你可以再试一次。

不会意外丢失任何东西

如果你打开 Flow 期间别人保存了它,你会收到警告,而不是覆盖他们的成果。已删除的 Flow 和模块可在 30 天内恢复。

有一点需要说清楚:只有测试运行才会显示每个步骤。正式运行只记录状态、耗时和失败的步骤,而不是它经过的所有步骤。

测试运行

模拟运行,未发送任何内容

获取存储值

读取题库,共 120 条

挑选下一条

第 42 个问题

发送消息

本会发布到 #general

创建子区

本会在该消息下开启一个子区

增加存储值

已提问计数器本会从 41 变为 42

仅为示意,实际界面可能有所不同

关于 Flows 的问题

正在等待某人的 Flow 会继续。“请求确认”或“等待消息”这类等待是被记录下来的,而不是存放在内存里,所以重启后依然有效。有一个例外需要了解:如果你在它的某次运行等待期间编辑了该 Flow,这次运行会停止,日志里也会注明。

想让你的服务器加入公测吗?

V3 是个庞大的系统,而且迭代很快,所以服务器是逐个加入的,而不是一次全部放进来。每份申请都由真人阅读,几天内你就会收到回复。

已经加入公测的服务器,在很大程度上决定了我们接下来做什么。你搭建的东西归你所有:公测结束后,Flows 和模块都会保留。