2

我正在尝试开发一个具有更灵活命令路由的简单 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 :prefix在这两种情况下,我都使用和定义了正确的配置键config :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."
  })

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

任何帮助表示赞赏。

4

1 回答 1

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 的下一个主要版本将包括对插件系统的大修,这将使这种模式更容易。不过,就目前而言,这是我推荐的。

于 2015-10-21T07:17:23.263 回答