2015-10-20 3 views
2

Я пытаюсь разработать простой бот-чат 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 :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." 
    }) 

но оно только что напечатало что-то неожиданное.

Любая помощь приветствуется.

ответ

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 будет включать в себя капитальный ремонт системы плагинов, которая сделает этот шаблон намного проще. На данный момент это то, что я бы рекомендовал.

+0

Это похоже на разумное и элегантное решение на данный момент, спасибо большое.Я думаю, что нет простого способа использовать имя робота в тексте справки? – DannyB

+1

Это было бы сделано так же, определяя в обратном вызове, который не выполняется до создания объекта робота. –

Смежные вопросы