Lita的条件路线和机器人名称

时间:2015-10-20 16:11:38

标签: ruby lita

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

我遇到了一些问题。

1。条件路由

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

例如,而不是需要“运行”前缀的此定义:

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

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

问题在于您混淆了config类方法和config实例方法。类级别的config(类体中的代码但不在实例方法定义中)为插件定义了新的配置属性。 config在实例级别(在实例方法内或使用块提供给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的下一个主要版本将包括对插件系统的大修,这将使这种模式更容易。现在,这是我建议的。