Lita 中的条件路由和机器人名称
Conditional routes and bot name in 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 :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."
})
但它只是打印了一些意想不到的东西。
感谢任何帮助。
问题是您混淆了 config
class 方法和 config
实例方法。 config
在 class 级别(代码在 class 主体中但不在实例方法定义内)为插件定义了一个新的配置属性。 config
在实例级别(在实例方法内或在使用块提供给 route
的内联回调中)在运行时访问插件自身配置的值。
在当前版本的 Lita 中,没有一种很好的方法可以在 class 级定义(如聊天路线)中使用运行时配置。我自己使用的解决方法是为 :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 的下一个主要版本将包括对插件系统的彻底改造,这将使这种模式变得更加容易。不过,就目前而言,这是我推荐的。
我正在尝试开发一个具有更灵活命令路由的简单 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 :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."
})
但它只是打印了一些意想不到的东西。
感谢任何帮助。
问题是您混淆了 config
class 方法和 config
实例方法。 config
在 class 级别(代码在 class 主体中但不在实例方法定义内)为插件定义了一个新的配置属性。 config
在实例级别(在实例方法内或在使用块提供给 route
的内联回调中)在运行时访问插件自身配置的值。
在当前版本的 Lita 中,没有一种很好的方法可以在 class 级定义(如聊天路线)中使用运行时配置。我自己使用的解决方法是为 :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 的下一个主要版本将包括对插件系统的彻底改造,这将使这种模式变得更加容易。不过,就目前而言,这是我推荐的。