fboës - Der Blog

Wie zieht man Slacks Slash-Commands in Rocket.Chat?

Wenn man gerade erst ein einfaches Slash-Command für Slack gebaut hat, lässt es sich mit überschaubaren Aufwand auch für Rocket.Chat verwenden. Die folgende Schritte führen zum Ziel:

  1. Unter „Administration“ eine neue „Integration“ anlegen.
  2. Als Event Trigger: „Message Sent“
  3. Als Kanal: „all_public_channels,all_private_groups,all_direct_messages“
  4. Als Trigger-Wort den Namen des alten Slash-Commands eintragen. Hinweis: Kommandos in Rocket.Chat beginnen nicht mit einem /.
  5. Als URL gibt man die alte Slash-Command-URL an.
  6. Bei „Verswchicken als“ trägt man sinnigerweise einen Nutzer an, den man extra als Bot einträgt. Besonders schlau ist es, wenn Nutzernamen und Slash-Command-Name übereinstimmen. So kann man statt /command an @command schreiben, und den Bot als Gesprächspartner verwenden.
  7. Beim Script gibt man das folgende Script ein:
class Script {
  prepare_outgoing_request({ request }) {
    // request.params            {object}
    // request.method            {string}
    // request.url               {string}
    // request.auth              {string}
    // request.headers           {object}
    // request.data.token        {string}
    // request.data.channel_id   {string}
    // request.data.channel_name {string}
    // request.data.timestamp    {date}
    // request.data.user_id      {string}
    // request.data.user_name    {string}
    // request.data.text         {string}
    // request.data.trigger_word {string}

    if (new RegExp('^[\\/\\+@]?(' + request.data.trigger_word + ')(\\s|$)').test(request.data.text)) {
      request.params2 = Object.keys(request.data).map(function (key) { 
        return key + '=' + encodeURIComponent(request.data[key]); 
      });
      request.params2.push('text=' + encodeURIComponent(request.data.text.replace(/^\S+(\s|$)/, '')));
      request.params2.push('command=' +encodeURIComponent('/' + request.data.trigger_word));
      request.params2.push('client=' +encodeURIComponent('rocket'));
      request.url += '?' + request.params2.join('&');
      return request;
    }
  }

  process_outgoing_response({ request, response }) {
    // response.error       {object}
    // response.status_code {integer}
    // response.content     {object}
    // response.content_raw {string/object}
    // response.headers     {object}

    return response;
  }
}

Mit diesem Script werden die Request-Parameter soweit umgeformt, dass sie den von Slack bekannten Parametern entsprechen. Die Response wiederum ist im Groben und Ganzen kompatibel mit Rocket.Chat.