首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lita中的条件路由和bot名称

Lita中的条件路由和bot名称
EN

Stack Overflow用户
提问于 2015-10-20 16:11:37
回答 1查看 250关注 0票数 2

我正在尝试开发一个简单的Lita聊天机器人,具有更灵活的命令路由。

有几个问题我有困难。

1.条件路由

如何在路由定义之前或内部使用配置值?

例如,不需要这个需要"run“前缀的定义:

代码语言:javascript
复制
route(/^\s*run\s+(\S*)\s*(.*)$/, :cmd, command: true)

我想使用这样的方式,使用灵活的、基于配置的前缀:

代码语言:javascript
复制
route(/^\s*#{config.prefix}\s+(\S*)\s*(.*)$/, :cmd, command: true)

但失败了。所以我也尝试过这样的方法:

代码语言:javascript
复制
if config.use_prefix
   route(/^\s*run\s+(\S*)\s*(.*)$/, :cmd, command: true)
else
   route(/^\s*(\S*)\s*(.*)$/, :cmd, command: true)
end

它也失败了,但错误并不是很有用。在这两种情况下,我都用config :prefixconfig :use_prefix定义了适当的配置键。

2.在帮助中显示机器人名称

我知道在已执行的命令中有一个robot.name属性可供我使用,但我无法在帮助字符串中使用它。我试着实现这样的目标:

代码语言:javascript
复制
  route(/^\s*run\s+(\S*)\s*(.*)$/, :cmd, command: true, help: {
    "run SCRIPT" => "run the specified SCRIPT. use `#{robot.name} run list` for a list of available scripts."
  })

但它只是印出了一些意想不到的东西。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 07:17:23

问题是您混淆了config类方法和config实例方法。类级别的config (类主体中的代码,而不是实例方法定义中的代码)为插件定义了一个新的配置属性。实例级别的config (在实例方法中或在使用块提供给route的内联回调中)在运行时访问插件自身配置的值。

在当前版本的Lita中,在类级定义(如聊天路由)中使用运行时配置并不是一种很好的方法。我自己使用的解决方法是为:loaded事件注册一个事件侦听器,该事件在初始化Lita::Robot时触发。此时,配置已经完成,您可以使用它来定义更多的路由。

例如:

代码语言:javascript
复制
class MyHandler < Lita::Handler
  on :loaded, :define_dynamic_routes

  def define_dynamic_routes(payload)
    if config.some_setting
      self.class.route(/foo/, :callback)
    else
      self.class.route(/bar/, :callback)
    end
  end
end

您可以查看丽塔-业力的代码以获得更详细的示例,因为它使用了这种模式。

Lita的下一个主要版本将包括对插件系统的彻底改造,这将使这种模式更加容易。不过,就目前而言,这是我的建议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33241601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档