简体   繁体   中英

Conditional routes and bot name in Lita

I am trying to develop a simple Lita chat bot with more flexible command routing.

There are a couple of issues I am having difficulties with.

1. Conditional routing

How can I use config values before or inside route definitions?

For example, instead of this definition that needs a "run" prefix:

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

I would like to use something like this, with a flexible, config-based prefix:

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

Which fails. So I also tried something like this:

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

Which also fails with a not very helpful error. In both cases, I defined the proper config key with config :prefix and config :use_prefix .

2. Showing the bot name in the help

I know there is a robot.name property available for me inside the executed command, but I was unable to use it inside of the help string. I was trying to achieve something like this:

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

but it just printed something unexpected.

Any help is appreciated.

The issue is that you're confusing the config class method and the config instance method. config at the class level (code in the class body but not inside an instance method definition) defines a new configuration attribute for the plugin. config at the instance level (inside an instance method or in an inline callback provided to route using a block) accesses the values of the plugin's own configuration at runtime.

In the current version of Lita, there isn't a pretty way to use runtime configuration in class-level definitions like chat routes. The workaround I've used myself is to register an event listener for the :loaded event, which triggers when the Lita::Robot has been initialized. At this point, configuration has been finalized, and you can use it to define more routes.

For example:

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

You can look at the code for lita-karma for a more detailed example, as it uses this pattern.

The next major version of Lita is going to include an overhaul to the plugin system which will make this pattern much easier. For now, this is what I'd recommend, though.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM