[Slackify] – удобный уведомлятор в Slack для MODX

Привет, друзья.



На прошлой неделе меня однажды утром осенила мысль «а что, если» и не отпускала, пока не доделал все, что хотел. А сделал вот что: написал компонент, который добавляет набор классов, используя которые можно удобно настроить уведомления с сайта на MODX в чат Slack. Особенная фишка пакета — это уже готовые плагины для 404 ошибок, Tickets и miniShop2. Но, по порядку.

В основном репозитории – modx.com/extras/package/slackify
В репозитории modstore.pro – modstore.pro/packages/alerts-mailing/slackify



Кому не терпится, то документация на английском доступна на GitHub – github.com/Alroniks/modx-slackify. Там же и исходники и последний пакет во вкладке Релизы.

ВАЖНО! Данный плагин не работает на php ниже версии 5.4. Он даже не установится. Делать версию для 5.3 или ниже не буду, даже не просите. Обновляйте свои дырявые ведра до нормальных версий.

API у Slack довольно простое и по сути, чтобы отправить сообщение в него, нужно на заданный URL (incoming-hook) отправить POST-запрос с переменной payload, в которой в JSON формате передать сообщение и возможные параметры. По сути, все так и происходит, но для удобства и наглядности я создал несколько классов, которые отвечают за определенные куски сообщения.

Подробно расписывать по каждому не буду, так как все есть в readme на GitHub (мой английский прост, разберетесь что к чему). Расскажу лишь о базовых вещах.

Перед созданием и отправкой сообщения нужно обязательно подключить сервис Slackify. Делается это так:

$slackify = $modx->getService('slackify');
Можно так же переопределить от кого и куда слать сообщение.

$message->from('Дядя Ваня')->to('@alroniks');
Для того, чтобы отправить сообщение, достаточно создать объект сообщения и отправить его. Довольно просто.

$message = new Message('I am Message');
$slackify->send($message);

Кроме простых текстовых сообщений Slack умеет еще так называемые «вложения» (attachment). Это что-то вроде блоков внутри сообщения. Для работы с ними создан класс Attachment, методы которого могут добавлять в него дополнительную информацию.

Например, создадим плагин, который будет писать в чат о том, что на сайте добавили новый комментарий в Tickets (полный код плагина есть в пакете, некоторые детали я опустил).

$a = new Attachment();
$a->setPretext('Кто-то оставил комментарий в важной теме на сайте');

$a->setColor(new Color('#00FF00')); // green
$a->setAuthor(new Author($comment->get('name'), 'mailto:' . $comment->get('email')));

$a->setTitle(new Title("оставил комментарий к тикету '{$ticket->get('pagetitle')}'"));
$a->setText($comment->get('text'));

$a->addField(new Field('Дата', $comment->get('createdon'), true));
$a->addField(new Field('Опубликован', $comment->get('published') ? 'True' : 'False', true));
$a->addField(new Field('Тикет', new Link($modx->makeUrl($ticket->get('id'), 'web', '', 'full'), $ticket->get('pagetitle'))));

$message = new Message('*Новый комментарий*');
$message->attach($a);

$slackify->send($message);

Все довольно просто. Классы, отвечающие за отдельные поля следуют паттерну value-object. Так же используется type hinting в методах, что гарантирует целостность данных.

Данный компонент уже содержит несколько готовых к употреблению плагинов, но в первую очередь он нужен для того, чтобы на базе него делать свои уведомления, заточенные под конкретные нужны. Примеры всех плагинов можно посмотреть тут – github.com/Alroniks/modx-slackify/tree/master/core/components/slackify/elements/plugins.

Установка и настройка

Для того, чтобы отправлять сообщения в чаты или конкретным участникам, нужно создать incoming-webhook в Slack. Как это делается можно почитать тут – api.slack.com/incoming-webhooks. Хук можно настроить прямо в Slack, но API при этом позволяет переопределить заданные по умолчанию параметры.

При установке пакет требует ввести ссылку на сам хук и задать канал по умолчанию, куда будут сыпаться уведомления.

Как это выглядит в Slack

Уведомление о 404 ошибке


Уведомление о новом тикете


Уведомление о новом комментарии


Уведомление о новом заказе


Уведомление об изменении статуса заказа. Цвета берутся из статусов в настройках MS2.


Пакет пока проходит все нужные процедуры в репозиториях, но собранный архив можно скачать на странице релизов на GitHub – github.com/Alroniks/modx-slackify/releases.

Либо можно собрать пакет самому. Для этого не нужно даже иметь установленный MODX. Да-да, я решил эту проблемку, расскажу в отдельной заметке. Делаем как указано ниже и забираем готовый zip в папке _packages.

git clone --recursive git@github.com:Alroniks/modx-slackify.git
cd modx-slackify/_build && php build.transport.php

Буду рад тестам и отзывам. А так же предлагайте ситуации, в случае которых можно было бы отправлять сообщения в Slack. В планах пополнять список плагинов, включенных в пакет по умолчанию.
Іван Клімчук
25 сентября 2015, 00:17
modx.pro
6
21 479
+16

Комментарии: 18

Илья Уткин
25 сентября 2015, 13:15
0
А как картинки прикреплять?

Например, «Пользователь загрузил новую картинку в профиль»
    Іван Клімчук
    25 сентября 2015, 14:08
    0
    Добавить через attachment.

    $a->setImage('url/path/to/image');
    $a->setThumb('url/path/to/thumb');
    but1head
    26 сентября 2015, 19:43
    0
    Очень круто!

      but1head
      27 сентября 2015, 22:18
      0
      [2015-09-27 22:18:10] (ERROR @ /index.php) Could not load class: slackify from slackify.
      [2015-09-27 22:18:10] (ERROR @ /index.php) Problem getting service slackify, instance of class slackify, from path
      modhost.pro
        Іван Клімчук
        28 сентября 2015, 10:10
        0
        Покажите, что у вас в системной настройке extension_packages и в каком случае возникает эта ошибка? Если пишете свой плагин, нужно обязательно написать в начале $slackify = $modx->getService('slackify');
          Іван Клімчук
          28 сентября 2015, 14:22
          0
          Выложил фикс modx.com/extras/package/slackify После обновления все ок должно быть.
        Виталий
        28 сентября 2015, 12:58
        0
        Сценарий:
        — Установил пустой сайт;
        — установил Slackify;
        — создал канал test, создал Incoming Webhook;
        — при инсталляции пакета указал webhook url;(https://hooks.slack.com/services/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) и канал #test;
        — создал 404 ошибку;
        — после установки компонента при вводе некорректного адреса открывается пустая страница и сообщение не отправляется;
        — деинсталирую дополнение — 404 ошибка открывается корректно.

        Доступ на сутки:
        s3047.h4.modhost.pro/manager/
        Логин: s3047
        Пароль: Qjubi7Mp9t5V
          Іван Клімчук
          28 сентября 2015, 13:17
          0
          Спасибо за ошибку. Проблема в регистре имен файлов и папок. Тестировал в маке, там регистр не учитывается.
          Быстрый фикс такой — переименовать файл Slackify.class.php и папку Slackify внутри model в нижний регистр. Фикс будет после обеда.
            Виталий
            28 сентября 2015, 13:20
            0
            Пожалуйста.

            Выложишь в modstore?
              Іван Клімчук
              28 сентября 2015, 13:32
              0
              Уже отправил Леониду. Ещё в пятницу, ждём его.
                Виталий
                28 сентября 2015, 13:33
                0
                В смысле, лучше сразу с фиксом выложить.
              Виталий
              28 сентября 2015, 14:35
              0
              С обновлением — заработало. Спасибо!
            Іван Клімчук
            28 сентября 2015, 18:17
            0
            Теперь и в modstore.pro — modstore.pro/packages/alerts-mailing/slackify
              but1head
              29 сентября 2015, 00:05
              0
              2.4.0-pl
              [2015-09-29 00:04:53] (ERROR @ /index.php) Entry point for Slackify not defined in system settings
              на 2.4.1 работает
                Іван Клімчук
                29 сентября 2015, 00:09
                0
                В этом случае ошибка (на самом деле не совсем) более чем очевидна. Достаточно перевести фразу «Entry point for Slackify not defined in system settings» и все станет понятно.
                  but1head
                  29 сентября 2015, 00:14
                  0
                  Оба сайта на modhost.pro, настройки идентичны.
                    Іван Клімчук
                    29 сентября 2015, 00:16
                    0
                    Что в системной настройке slackify_entrypoint?
              Руслан
              10 марта 2017, 13:43
              0
              Добрый день. При оформлении заказа в minishop2 2.4.9-pl
              вылетала 500 ошибка
              [Fri Mar 10 13:09:01.054721 2017] [:error] [pid 20254] [client x.x.x.x:59151] PHP Fatal error: Uncaught Error: Call to a member function get() on null in /public_html/core/cache/includes/elements/modplugin/16.include.cache.php:42

              за комментировал 42 строку, и все вроде заработало. Но без ссылки на заказ.
              $link = new Link(rtrim(MODX_SITE_URL, '/') . MODX_MANAGER_URL . "index.php?a={$action->get('id')}#&order={$order->get('id')}", $order->get('num'));
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                18