Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
ropox
7 лет назад

Делаем своего бота для уведомлений на Node-RED для golos.io. Часть третья, разделительная

Люблю программировать и экспериментировать. После того как я написал второй блог о том как сделать golos бота, я не стал выключать созданного для блога бота. Получилось соревнование ботов, моего и @on0tole, кто вперед сообщит. Причем мне понравилось, что мой бот сообщал не только о вотингах и оставленных комментариях, а также о выплаченных вознаграждениях, о трансфере монет и так далее. Единственное, что хотелось бы видеть, это понятные сообщения. Поэтому я решил, что обязательно расширю возможности бота. Заодно напишу еще один блог, где познакомлю с еще парой возможностей, которые предоставляет Node-RED. Link для связи сценариев и Split для разбиения сообщения на несколько по заданным правилам.

Кстати Node-RED дает возможность экспортировать сценарии, но я правда еще этим не пользовался. Возможно, когда я разберусь с экспортом, я выложу где нибудь сценарий бота.

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

Json c содержимым записи выглядит следующим образом c авторским вознаграждением..

     "op": ["author_reward", {
        "author": "ropox",
        "permlink": "delaem-svoego-bota-dlya-uvedoml...",
        "sbd_payout": "89.849 GBG",
        "vesting_payout": "341392.847703 GESTS"
      }]

А так с голосованием

     "op": ["vote", {
        "voter": "demon",
        "author": "ropox",
        "permlink": "hoversurf-pokoryaet-nebesa",
        "weight": 10000
      }]

Как видно мы можем определить тип записи, то-есть сформировать соответствующее сообщение. У каждого типа записи свои атрибуты.

Для начала модифицируем существующий сценарий, так, чтобы обрабатывать 5 сообщений, вместо одного. Для этого откроем ноду, которая формирует json для запроса серверу с именем “get_account_history(ropox)”. Откройте свойства ноды и в Json-е поменяйте последний параметр для метода с 0 на 5.

Теперь мы отредактируем Change ноду с именем “get ID”. Нам нужен весь список, а не просто ID. Уберем “[0][0]”, оставим только payload.result и переименуем соответственно в “get result”.

Разорвем соединения исходящие из только что отредактированной ноды “get result”. Нам надо будет вставить промежуточную ноду.

Сообщение на входе ноды “get result” содержит массив (англ. Array) записей истории аккаунта размерностью 6 (несмотря на установленный лимит в 5 записей, метод get_account_history возвращает 6 записей). Нам нужно обработать каждый элемент массива отдельно. Для этого имеется замечательная функциональная нода Split (русск. Разбивать на части). Перетащим ее на сценарий и подключим к выходу ноды “get result”, а выход ноды Split ко входу ноды с именем “Сменился ID?”-

Собственно с этой нодой больше делать ничего не надо. Если нода Split получит на вход строку, она разобьет ее на несколько подстрок по заданному разделителю и на выходе пошлет столько сообщений, сколько частей получилось после разбивки. К примеру если строка “один,два,три” и разделитель “,”, то на выходе мы получим три сообщения, где msg.payload равно “один”, потом “два” и потом “три”. Если на входе же массив, наш случай, то Split соответственно под каждый элемент массива сформирует сообщение, в котором msg.payload содержит элемент массива.

Теперь надо поправить ноду проверяющую ID с именем “Сменился ID?”. На ее вход будет поступать массив из двух элементов. ID и запись истории. Откройте свойства ноды и допишите к payload “[0]”. Вместо оператора сравнения “!=” выберите “<”. То-есть мы будем пропускать дальше только те записи, у которых ID больше сохраненного.

Так как на выходе ноды Split и следовательно “Сменился ID?” у нас теперь массив, а не одиночный ID, нам нужно отредактировать ноду “Сохранять ID в кэше”.

Теперь осталось только сформировать правильное сообщение. Нам нужно будет добавить ветвление в наш сценарий и в зависимости от типа записи формировать свое сообщение. Чтобы не захламлять сценарий кучей связей и нод, формирование сообщения и отсылку его в боту мы сделаем на отдельном сценарии. Создайте новый сценарий (Flow) и назовите его как нибудь звучно.

Теперь вернитесь на предыдущий сценарий, выделите ноды “msg Движуха” и Telegram Sender “Голос бот” и нажмите Ctrl-X.

Эти ноды были вырезаны из этого сценария. Вставьте их на новом сценарии нажав Ctrl-V.

Вернитесь на сценарий “Вестник Голоса”. Добавьте ноду Change и исходящую (output) ноду Link. Нода Link для создания связи между сценариями. На текущем сценарии мы будем получать данные от сервера, а на новом сценарии мы будем формировать сообщения и отсылать из боту. Важный принцип для всех случаев жизни “Разделяй и властвуй” в действии.

Соедините ноды как на иллюстрации выше и откройте свойства только что добавленной ноды Change. Для удобства мы из payload массива извлечем только то, что нас интересует.

И задайте имя для Link ноды. К примеру “Запись истории”. Я еще добавил отладочную ноду, чтобы проконтролировать работу сценария. И я пока удалил ноду Delay, чтобы на время отладки не запускать сценарий каждый раз. В итоге вот такой сценарий у меня получился. Ну не прелесть? Я не знаю, сколько строк кода мне бы пришлось написать на javascript, если бы пришлось писать все вручную. Тут же чуть более десятка нод! В десять строк я бы точно не уложился.

Давайте задеплоим и протестируем. В отладочной панели, после того как я сбросил ID в кэше нажав Inject ноду “1” я получил шесть записей. Сразу видно, у меня в истории три голосования, один комментарий и два вознаграждения за кураторство.

У меня уже получилось четыре страницы чисто текста. Чтобы не перегружать, формирование сообщений я опишу в следующем блоге..

14
1407.692 GOLOS
На Golos с February 2017
Комментарии (7)
Сортировать по:
Сначала старые