Модификация бота-лайкера для поддержки новичков
В предыдущей статье я описал как устроен и работает бот mayakovskiy.
Сегодня предлагаю перейти от теории к практике, немного изменить код и некоторые параметры
Приступаем.
В текущий момент, бот голосует только за посты, опубликованные через golosio и это жестко прописано в коде. Я хочу добавить возможность указывать любого бенефициара либо же вовсе не указывать никого.
Аккаунт @golosio в данный момент раздает лайки пользователям с силой голоса > 100. Я собираюсь добавить возможность указывать минимальную СГ автора и максимальную. В таком случае можно будет настроить бота, чтобы он голосовал, например, за пользователей, у которых СГ больше 3, но меньше 100
Количество лайков в сутки также запрограммировано в виде константы. Я бы хотел иметь возможность ставить 100% лайки по любви, без серьезных потерь в батарейке, поэтому я хочу сделать данное значение настраиваемым.
В первую очередь надо форкнуть проект на github, дальше все изменения я буду вносить в свой репозиторий, чтобы не нести мои личные изменения в код проекта, а в случае необходимости
Структура проекта выглядит следующим образом.
Первым делом добавим новые переменные в файл ENV.js
- MAX_GOLOS_POWER - максимальное количество СГ пользователя, при котором за него будет отдан голос. По умолчанию выставим значение 0. Это будет означать, что максимального предела нет.
- VOTE_BY_DAY_WITH_MAX_WEIGHT - максимальное количество голосов с силой 100%, которые будут распределены при помощи бота за сутки. По умолчанию устанавливаем значение в 40 голосов.
- BENEFICIARY_NAME - определяем бенефициара, который должен быть указан в посте, для того чтобы бот отдал голос за пост. По умолчанию устанавливаем значение null, что означает, что бенефициар не учитывается при голосовании.
- BENEFICIARY_PROCENT - определяем процент, бенефициарских выплат, по умолчанию 0. Стоит обратить внимание на то, что значение процента необходимо умножать на 100, например 5% бенефициарская выплата будет равна 500.
Для того, чтобы докер применил указанные выше настройки при запуске сервиса надо обновить файл docker-compose.yml, а именно в секцию environment вносим новые переменные, описанные выше, в итоге данная секция должна выглядеть следующим образом.
Для простоты дальнейшей работы с данным сервисом, я создам файл .env. Добавляем сюда все ENV переменные, описанные в файле ENV.js, теперь при запуске значения будут автоматически подставляться из этого файла.
Теперь перейдем непосредственно к валидации постов.
Как я писал ранее, валидация происходит в файле Registrator.js
Нас интересует функция _checkAndRegister, как видно из названия именно в ней происходит проверка поста, прежде чем добавить его в очередь к голосованию.
В данной функции идет вызов двух проверок, и, в случае, если обе пройдены успешно, то пост регистрируется в очереди к голосованию. Метод _remoteValidation в данный момент нас не интересует, поскольку это заглушка, поэтому будем рассматривать только _basicValidation, который в свою очередь состоит из трех проверок, рассмотрим _validateBeneficiaries и _validatePower более детально.
_validateBeneficiaries - как видно из названия, данная функция проверяет пост на наличие бенефициара. Также в данной функции происходит проверка на процент бенефициарских выплат.
Добавим сюда дополнительную проверку, сразу после объявления переменной valid. Сверимся, что боту действительно надо проверять наличие бенефициара в посте, а так же, что процент бенефициарской выплаты отличен от 0.
Соответственно, если бенефициар не указан, или не указан минимальный процент бенефициарской выплаты, то пост считается валидным.
Поскольку мы вынесли имя бенефициара и необходимый процент в настраиваемые параметры, нужно внести небольшие изменения в цикл проверки.
_validatePower - функция проверки необходимой Силы Голоса у пользователя, которому бот отдаст лайк.
Поскольку я хочу добавить возможность указывать диапазон Силы Голоса, сюда надо внести некоторые изменения. В первое условие проверку добавим проверку, установлен ли максимальный лимит Силы Голоса для пользователя, и, в случае, если он не установлен будем считать, что пост прошел проверку.
Далее по коду происходит расчет текущей Силы Голоса пользователя, результат вычислений попадает в переменную power.
Добавим еще одну проверку, в которой мы будем сверять Силу Голоса пользователя с максимально допустимой.
Для этого создадим дополнительную переменную checkMaxPower, и в случае, если максимальный порог не установлен, то сразу считаем, что автор прошел проверку, в противном случае, производим проверку Силы Голоса автора и максимально допустимую, указанную в конфиге.
И добавляем данную проверку в return
Теперь осталось только использовать значение максимального количества стопроцентных голосов, при раздаче лайков.
Для этого отправляемся в Planner.js
Подключаем описанные выше энвы
Теперь можно забрать переменную VOTE_BY_DAY_WITH_MAX_WEIGHT из настроек.
Все, готово, можно перейти к установке.
Я собираюсь использовать самую дешевую виртуалку, которую предоставляет hetzner.
Пропустим часть с регистрацией на hetzner, надеюсь, что это не вызовет каких либо проблем, и перейдем сразу к установке и настройке бота.
Характеристики сервера: 1 CPU, 2GB RAM, 20GB SSD, Ubuntu 18.04
Первым делом нужно подготовить виртуалку к работе, для этого я рекомендую воспользоваться достаточно подробный гайдом от Digital Ocean
После первичной настройки сервера необходимо установить Docker и docker-compose . Подробная инструкция от Digital Ocean по установке Docker.
И так, на данном этапе весь необходимый софт уже установлен и можно приступить непосредственно к установке и настройке бота.
Первым делом склонируем код с git (я клонирую именно свой репозиторий)
shtefan@ubuntu$ git clone git@github.com:NickShtefan/mayakovskiy.git
shtefan@ubuntu$ cd mayakovskiy/
Теперь необходимо заполнить файл .env, с конфигурацией, я буду использовать vim, но вы можете использовать любой текстовый редактор
shtefan@ubuntu:~/mayakovskiy$ vim .env
файл конфигурации будет выглядеть следующим образом, я указываю свой логин и приватный постинг ключ, остальные настройки будут настройками по умолчанию.
LOGIN=ВАШ ЛОГИН НА ГОЛОСЕ
WIF=ВАШ ПРИВАТНЫЙ ПОСТИНГ КЛЮЧ
MIN_GOLOS_POWER=0 // Мой бот будет голосовать за пользователей с Силой голоса от 0
MAX_GOLOS_POWER=100 // До 100
VOTE_BY_DAY_WITH_MAX_WEIGHT=35 // У бота в распоряжении будет 35 лайков с силой 100%
На этом настройки завершены, можно запустить сервис.
shtefan@ubuntu:~/mayakovskiy$ sudo docker-compose up -d
Данная команда установит все необходимые зависимости, такие как mongodb, nodejs, проведет инициализацию приложения и запустит его.
Successfully built dde3063c0b32
Successfully tagged mayakovskiy_node:latest
WARNING: Image for service node was built because it did not already exist. To rebuild this image you must use docker-compose build
or docker-compose up --build
.
Creating mongo ... done
Creating node ... done
Теперь давайте убедимся, что сервис запустился и работает.
shtefan@ubuntu:~/mayakovskiy$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99011734222c mayakovskiy_node "node ./src/Main.js" 48 seconds ago Up 47 seconds node
50e2701aa788 mongo "docker-entrypoint.s…" 49 seconds ago Up 48 seconds 127.0.0.1:27017->27017/tcp mongo
shtefan@ubuntu:~/mayakovskiy$ sudo docker logs -f 99011734222c
2018-08-10 17:00:02 <1> [info] Start services...
2018-08-10 17:00:02 <1> [info] Start MongoDB...
2018-08-10 17:00:02 <1> [info] MongoDB connection established.
2018-08-10 17:00:02 <1> [info] The MongoDB done!
2018-08-10 17:00:02 <1> [info] Start Registrator...
2018-08-10 17:00:02 <1> [info] The Registrator done!
2018-08-10 17:00:02 <1> [info] Start Planner...
2018-08-10 17:00:02 <1> [info] The Planner done!
2018-08-10 17:00:02 <1> [info] Start services done!
2018-08-10 17:00:02 <1> [info] Main service started!
2018-08-10 17:00:02 <1> [info] BlockSubscribe websocket connection established.
2018-08-10 17:00:03 <1> [log] Empty Post collection, then start sync from block 18711118
На этом все, бот установлен, настроен и работает. Он будет лайкать всех пользователей, вне зависимости от клиента, который они используют и чья Сила Голоса находится в диапазоне от 0 до 100.
В следующей статье я начну описывать какие еще сервисы мы разработали, и как они работают.
Я всегда открыт для конструктивного диалога, со мной можно связаться и обсудить волнующие вас задачи в телеграмме в нашей группе, посвященной разработке клиента golos.io, либо лично.
Голосуйте за мою делегатскую ноду, если вам интересны подобные статьи, а я, вне зависимости от вашего голоса, направлю все свои силы для улучшения и развития проекта Голос.