Персонализация вызовов API в Errbot / Как хранить и получать доступ к пользовательской информации в Errbot?
Каков наилучший способ хранения и доступа к пользовательской информации в Errbot, доступной для всех плагинов?
Мой пример использования - создание плагина Redmine (отслеживание проблем), который позволяет пользователям создавать, обновлять, закрывать, назначать проблемы и т. Д.
Это можно получить с помощью одного токена пользователя, но это невозможно, поскольку все проблемы будут создаваться, обновляться и регистрироваться временем одним и тем же пользователем.
Может кто-нибудь предложить мне способ, чтобы пользователи могли хранить и обновлять свои пользовательские токены, а плагин извлекает их и использует их для вызова apis?
PS Я только что познакомился с Chatops/Errbot и пробовал вещи. Пожалуйста, дайте мне знать, если есть лучший подход.
1 ответ
Вы спрашиваете о хранении информации, доступной для всех плагинов. Это может быть достигнуто с помощью зависимостей плагинов, но на самом деле это не применимо к вашему варианту использования, потому что вам, кажется, нужны только эти пользовательские токены для перетекания в ваш плагин redmine, а не любые другие плагины.
Может кто-нибудь предложить мне способ, чтобы пользователи могли хранить и обновлять свои пользовательские токены, а плагин извлекает их и использует их для вызова apis?
Во-первых, это зависит от того, как ваш плагин должен аутентифицироваться в Redmine. Исходя из вашего вопроса, я предполагаю, что Redmine просто предлагает ключ API в настройке профиля пользователя, который вам нужно сохранить и использовать, поэтому я пойду с этим, но это усложняется, если метод получения указанного токена более сложен.
Таким образом, предполагая, что пользователь может получить свой токен API из своего профиля и просто должен позволить боту использовать его, вы можете:
Предоставьте пользователям команду для установки их токена API, сохраняя его с помощью встроенной персистентности:
def activate(self): super().activate() if 'tokens' not in self: self['tokens'] = {} @botcmd def set_redmine_token(self, msg, args): # See http://errbot.io/en/latest/user_guide/plugin_development/persistence.html#caveats # for an explanation of the mutable thing. with self.mutable('tokens') as tokens: tokens[msg.frm.person] = args return "API token set"
Делая вызовы API для redmine, вы можете увидеть, есть ли у вас токен в файле для пользователя, который вводит команду, и использовать его, в противном случае вывести сообщение об ошибке:
@botcmd def do_redmine_thing(self, msg, args): if msg.frm.person not in self['tokens']: return "I don't have a token for you, please set it with !set_redmine_token <token>" # Now do your API thing, using the token from # self['tokens'][msg.frm.person]
Обратите внимание, что вышеприведенный пример - действительно простой пример. Вы, вероятно, захотите использовать arg_botcmd
над равниной botcmd
для лучшего разбора аргументов сделайте больше проверки ошибок и т. д.