-
Notifications
You must be signed in to change notification settings - Fork 0
[FR] Session API #37
Description
摘要
一个用于在各种 ChatChannel 创建会话的机制。
动机
在真实场景里,人们总是倾向于和 bot 交互而不只是使用命令。然而,具有交互性的 bot 对于开发人员的要求很高,因为他们需要自己去管理状态,处理回调以及考虑可能的极端情况。这些事情非常繁杂,使得开发人员难以花时间在真正有价值的业务上。
Dash 将提供 Session API 解决这一问题。
描述
Session
Session
接口代表了一个 临时的,自托管 的"会话"。举个例子,一个表单机器人可以在一个会话里询问用户多个问题来填充它的表单,一些机器人在做一些事情之前可以询问用户是否确认这么做。
一个 Session
由以下三部分组成:
participants
Session
的参与者state
目前的 状态,一会解释。channels
会话发生的地点。
以及具有这些特质
scope
这个 Session 的作用范围 (比如,@bot PROMPT
或者直接PROMPT
)timeout
用户输入的时限,可能依赖于scope
的类型
(details TBD because I left my notebook in the school)
状态
一个会话(Session)由多个状态组成,其中,总有一个状态一直受理应答。
并且,他们之间可以构成环路。让我们看的仔细一些:
真实的场景总比这要复杂得多,而代码的表述也总比这更加清晰的多。
在这些图中的圆圈即代表 ISessionState
, 他们可以 指向其他 state, 返回到上一个 state 或者干脆 结束 session.
接下来给出该接口的大致定义:
interface ISessionState {
void init(reason, oldState);
void onMessage(message);
void terminate(newState)
}
reason
使得 SessionState 可以根据具体的情况作出回应。配合 oldSession
,上图中的 State DeleteDB
实际上是同一个类在作用。
会话上下文
会话上下文(SessionContext
)储存会话的相关信息,同时托管当前的状态以及状态的轨迹以便于回溯。
要注意的是,Session 实际上是可以嵌套的。我们将通过 JDK Loom 实现类似 await 的效果。
种类 (scope)
会话分为 strict
和 catchy
型。
strict
要求所有参与会话的消息必须要达成某种不能太宽泛的条件,比如带上 @Bot
的前缀。
catchy
将会捕获所有来自当前 chatchannel 以及 paticipant 的消息,具有严格的时限。
Conversation
比起 Session 的抽象接口,Conversation
更像是为了表单机器人量身定做的。
例子
Conversations.of(new MyFormBean())
.required("Please input your name", MyFormBean::setName)
.optional("What's your gender? You can send anything wrong to skip this answer", MyFormBean::setGender)
.with(prompt,mapper,setter)
(details TBD)