【发布时间】:2018-01-22 07:43:38
【问题描述】:
我的机器人将用户名存储在数据库中,并且数据库会不时向会话发送一条消息“setname username”。示例铆钉:
+ setname *
- <set name=<formal>>
+ (what is my name|who am i)
- You're <get name>, right?
+ didntlike
- {topic=nlike}Why?
> topic nlike
+ *
- {topic=random}Thanks for charing.
< topic
+ *
- I don't have a reply for that.
- Try asking that a different way.
问题是当用户处于一个由 * 退出的“nlike”之类的主题中,我发送消息设置名称,然后对话退出该主题。
预期对话:
Me: hello
Bot: I don't have a reply for that.
Me: didntlike
Bot: Why?
Me: setname John
Bot:
Me: I didn't like because you are ugly.
Bot: Thanks for charing.
Me: Who am I?
Bot: You're John, right?
有没有办法在开始块中处理它?我尝试了不同的语法,但没有积极的结果。我想到了类似的东西:
> begin
+ setname *
- <set name=<formal>>
+ request
- {ok}
< begin
一种解决方法是在所有主题中添加相同的触发器,但我需要一个更好的解决方案,因为随着我的 rive 文件变大,这种方法很容易出错。
==== 根据 Nelson 的回答尝试的代码 =====
> begin
+ request
- {ok}{topic=specialtriggers}
< begin
> topic specialtriggers
+ setname *
- <set name=<formal>>
< topic
+ (what is my name|who am i)
- You're <get name>, right?
+ didntlike
- {topic=nlike}Why?
> topic nlike
+ *
- {topic=random}Thanks for charing.
< topic
+ *
- I don't have a reply for that.
- Try asking that a different way.
我认为将主题添加到 {ok}{topic=specialtriggers} 会使该主题之外的所有触发器都失败。预处理后,Rivescript 应该回答是否是特殊触发器,否则搜索正常触发器。
【问题讨论】:
-
我不明白你对谈话的期望是什么。你能举一些例句让这个观点更具体吗?您是否希望输入带有星号的消息
setname *,而不是触发器? -
是的。我希望使用开始块来预处理此消息。每当我说“setname John”时,我都会将变量“name”设置为“John”。这很有用,因为我不必在 .rive 文件的每个主题中复制触发器“setname *”。我也可以说一些更简单的话,比如:'close',它会通过不输入 rive 规则来响应。
标签: rivescript