В предыдущей статье я описал как устроен и работает бот 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 [email protected]: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, либо лично.
Голосуйте за мою делегатскую ноду, если вам интересны подобные статьи, а я, вне зависимости от вашего голоса, направлю все свои силы для улучшения и развития проекта Голос.
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество полученных голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за Количество комментариев
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@nickshtefan, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
narin, max-max, vadbars, yurgent71, vict0r, ladyzarulem, arystarch, amelina.elena, kertar, bag, ifingramota, duremarr, abloud, aleos, benken, brainmechanic, boliwar
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
чего-то тут не то. умножать вероятно на 100, но всё равно не сходится : )
@zxcat все верно, спасибо, что заметил.
@nickshtefan
этот бот будет использоваться командой? или его смогут поставить себе все кто хочет?
@ladyzarulem командой уже используется, голоса идут от @golosio. Все кто хочет могут его поставить и использовать, ссылки на гитхаб есть здесь и в предыдущем посте
@nickshtefan
спасибо за инфу Ник!
может быть, он и нашему сообществу пригодится в будущем.