Lita中的条件路由和bot名称



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

我遇到了几个问题。

1。有条件的路由

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

例如,代替这个需要"run"前缀的定义:

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

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

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

而失败。所以我也尝试了这样做:

if config.use_prefix
   route(/^s*runs+(S*)s*(.*)$/, :cmd, command: true)
else
   route(/^s*(S*)s*(.*)$/, :cmd, command: true)
end

也会失败,并出现一个不太有用的错误。在这两种情况下,我都用config :prefixconfig :use_prefix定义了正确的配置键。

2。在帮助

中显示bot名称

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

  route(/^s*runs+(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在实例级(在实例方法中或在使用块提供给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

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

Lita的下一个主要版本将包括对插件系统的全面检修,这将使这种模式更容易。现在,这是我推荐的。

最新更新