Персонализация вызовов API в Errbot / Как хранить и получать доступ к пользовательской информации в Errbot?

Каков наилучший способ хранения и доступа к пользовательской информации в Errbot, доступной для всех плагинов?

Мой пример использования - создание плагина Redmine (отслеживание проблем), который позволяет пользователям создавать, обновлять, закрывать, назначать проблемы и т. Д.

Это можно получить с помощью одного токена пользователя, но это невозможно, поскольку все проблемы будут создаваться, обновляться и регистрироваться временем одним и тем же пользователем.

Может кто-нибудь предложить мне способ, чтобы пользователи могли хранить и обновлять свои пользовательские токены, а плагин извлекает их и использует их для вызова apis?

PS Я только что познакомился с Chatops/Errbot и пробовал вещи. Пожалуйста, дайте мне знать, если есть лучший подход.

1 ответ

Решение

Вы спрашиваете о хранении информации, доступной для всех плагинов. Это может быть достигнуто с помощью зависимостей плагинов, но на самом деле это не применимо к вашему варианту использования, потому что вам, кажется, нужны только эти пользовательские токены для перетекания в ваш плагин redmine, а не любые другие плагины.

Может кто-нибудь предложить мне способ, чтобы пользователи могли хранить и обновлять свои пользовательские токены, а плагин извлекает их и использует их для вызова apis?

Во-первых, это зависит от того, как ваш плагин должен аутентифицироваться в Redmine. Исходя из вашего вопроса, я предполагаю, что Redmine просто предлагает ключ API в настройке профиля пользователя, который вам нужно сохранить и использовать, поэтому я пойду с этим, но это усложняется, если метод получения указанного токена более сложен.

Таким образом, предполагая, что пользователь может получить свой токен API из своего профиля и просто должен позволить боту использовать его, вы можете:

  1. Предоставьте пользователям команду для установки их токена 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"
    
  2. Делая вызовы 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 для лучшего разбора аргументов сделайте больше проверки ошибок и т. д.

Другие вопросы по тегам