ruby - Lita 中的条件路由和机器人名称

标签 ruby lita

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

有几个问题我遇到了困难。

<强>1。条件路由

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

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

route(/^\s*run\s+(\S*)\s*(.*)$/, :cmd, command: true)

我想使用这样的东西,带有灵活的、基于配置的前缀:

route(/^\s*#{config.prefix}\s+(\S*)\s*(.*)$/, :cmd, command: true)

失败了。所以我也尝试过这样的事情:

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 属性可供我使用,但我无法在帮助字符串中使用它。我试图实现这样的目标:

  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."
  })

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

感谢任何帮助。

最佳答案

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

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

例如:

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-karma 的代码有关更详细的示例,因为它使用了此模式。

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

关于ruby - Lita 中的条件路由和机器人名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241601/

相关文章:

ruby - 如何将 gem 依赖项添加到我的 ruby​​ gem

ssl - 使用 Docker 向 Lita 机器人添加 SSL 证书

ruby - 正则表达式从 ruby​​ 中的非捕获组捕获

ruby - 如何指定类型参数

ruby - 如何在不构建的情况下安装 gem

ruby-on-rails - 在 url 路由中允许用户名中有空格

ruby - ruby 2.3.1 缺少库

ruby-on-rails - Ruby 中的正则表达式 URL 验证