Giter VIP home page Giter VIP logo

rt-bot's Introduction

Мета-репо для движения «создай своего бота»

Build Status

Боты для чата подкаста Радио-Т

  • Каждый бот представляет из себя полностью законченный микросервис с единой точкой входа /event
  • /event вызывается для любого сообщения через POST с телом {text: сообщение, username: id пользователя, display_name: имя пользователя} (json)
  • Бот может на это реагировать 2мя способами:
  • вернуть 417 (Expectation Failed) если ему нечего сказать на сообщение
  • вернуть 201 и body {text: сообщение, bot: имя/id бота} (json). Техт может быть markdown. EOL должны быть представлены как строки \n (в json должно быть \\n). Заголовок Content-Type в ответе должен быть application/json. В чат текст сообщения вставляется инлайном после имени бота, поэтому если в сообщении есть сложная разметка (например таблицы), то стоит начать сообщение с \n\n
  • Бот оформляется как контейнер с прилагаемым docker-compose.yml, для запуска которого должно хватить git clone ... && docker-compose up -d
  • Бот (внутри контейнера) слушает на порту 8080
  • Бот может вызывать внешние сервисы, если есть такая необходимость.
  • Нежелательно тянуть за собой внешние зависимости, типа баз данных, редисов и прочего.
  • На запрос бот должен ответить за какое-то фиксированное время. Предлагаемый максимум 5 сек.
  • Бот не получит след. сообщения пока не ответит на предыдущее.
  • Бот можно писать на всем, чем хотите/умеете. Однако, результат должен быть разумен по размеру контейнера и используемым ресурсам.
  • Бот должен быть полностью собираемым вашим Dockerfile. Не надо коммитить собранные бинарники и/или jar и прочее в этом роде.
  • UPD: После разговора с авторами решили добавить GET /info (200) с ответом {author: name, info: blah, commands: [xx, yyy]}
  • UPD: Бот не будет получать свои собственные сообщения
  • UPD: Для бота должен быть определен конфиг в файле bot-spec.yml. Он используется для автоматического тестирования бота.

Идеи для полезных и забавных ботов

  • ведение псевдо-разумной дискуссии по варианту сири/алексы/гугла
  • ответы на узкие вопросы, типа "какая погода в Москве сегодня"
  • функции поиска по подкасту (шоунотам и логам)
  • все остальное, что можете придумать

Идеи для вредных ботов, которые не будут приняты

  • разные бессмысленные гифки, особенно "анимационные"
  • болтливые боты, которые реагируют на все, или слишком многое
  • те, которые падают на ошибки и вместо того, что задумал автор, показывают эти ошибки в чат.
  • разговаривающие матом или другим "крутым" слэнгом
  • которые делают тоже самое, что и другие, уже реализованные боты

Зачем вам это надо?

  • для развлечения
  • для добавления в чат чего-то полезного
  • для славы и почета :) Мы расскажем о каждом вашем боте который будет принят и поощрим авторов, как минимум добрым словом.

Как в этом поучаствовать?

  • посмотреть на то, что сделали другие
  • почитать что пишут
  • сделать PR со своим ботом в отдельном каталоге. Это хозяйство должно собираться и подниматься локально, через compose build + up
  • в этом PR не забыть изменить etc/nginx.conf и docker-compose.yml для вашего бота
  • Приложить README.md для своего бота
  • Не забыть определить конфиг bot-spec.yml.

Как проверить бот в реальной жизни?

> http POST https://bot.radio-t.com/api/hello/event text=Привет username=user123 display_name=Вася
HTTP/1.1 201 Created
Connection: keep-alive
Content-Length: 31
Content-Type: application/json;charset=UTF-8
Date: Thu, 10 Nov 2016 19:46:38 GMT
Server: nginx
Strict-Transport-Security: max-age=63072000; includeSubdomains; preload

{
   "bot": "hello",
   "text": "Hello!"
}
  • Проверить как это работает end-to-end можно и нужно в тестовом чатике
  • UPD: запустить весь проект можно локально через run_local.sh в корне проекта. Доступен он будет на https://localhost.

rt-bot's People

Contributors

alehano avatar astoliarov avatar bessarabov avatar budnik avatar constructor-igor avatar exelban avatar gangstajs avatar hixon10 avatar khaale avatar m1kecv avatar mylog00 avatar popov1024 avatar pqr avatar progsly avatar rabinzon avatar roman-lugovkin avatar scorpil avatar selevit avatar simy4 avatar singleton11 avatar ssgreg avatar strayge avatar terbooter avatar timocov avatar umputun avatar usrenmae avatar vovanz avatar vparth avatar yatsenko avatar zin4uk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rt-bot's Issues

run_local.sh - ssl сертификаты всегда создаются заново

В скрипте ./run_local.sh условие в if-е выглядит странно, оно проверяет либо отсутствие SSL_KEY файла, либо наличие SSL_CERT: if [ ! -f "$SSL_KEYS_DIR/$SSL_KEY" ] || [ -f "$SSL_KEYS_DIR/$SSL_CERT" ].
В результате сертификаты всегда пересоздаются.

Тут есть какие-то глубокие мотивы, или просто забыли ! во второй части условия?

API для использования микросервисов вне чата

Коллеги, приветствую.

Как вы считаете, не стоит ли ботам, помимо чата, иметь собственные API, используя которые они могли бы общаться между собой в обход чата?
Например, у нас уже есть несколько независимых реализаций функции, которая определяет номер текущего выпуска. Было бы здорово, если бы можно было просто обратиться к rtnumber-bot через API. В последствие можно было бы сделать микросервисы, которые сообщали бы и другую полезную информацию: кто из гостей и ведущих присутствует в эфире, какая тема обсуждается в данный момеyт и т.п.

Боты в действии

Как увидеть существующих ботов в действии?
Зашел в чятик https://chat.radio-t.com или https://gitter.im/radio-t/chat, написал /karma.
Карма бот должен на это что-то ответить? Ничего не происходит.
Или пишу Гвидо, гвидо-бот в ответ должен запостить картинку. Нифига не происходит.
Чего я не понимаю?

Нет, эти сумашедшие гифки не наш путь

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

Memberries бот очень долго запускается

@popov1024, есть проблема в том, что бот memberries долго запускается (после запуска самого контейнера).
Как я понимаю, там происходит какая-то инициализация и бот ничего не отвечает по HTTP.
И в тестах происходит ошибка 502 Bad Gateway.
Это нужно починить.

Лучший вариант - перевести долгую часть инициализации в шаг сборки контейнера.

Как воспроизвести:

cd memberries
mv _bot_spec.yml bot_spec.yml

После этого закоммитить и сделать PR. Увидишь, что тест не проходит.
Я увеличивал параметр BOTS_WAIT_TIMEOUT до 60 секунд, но это не помогает.

Добавить проверку наличия всех ботов в /list

В nginx.conf есть локация /list, которая возвращает список всех ботов.
Нужно проверить, что все боты в этой локации имеют bot-spec.yml.
И что все боты, у которых прописан конфиг, там зарегистрированы.
Сделать это нужно на этапе запуска функциональных тестов (ci/run_bot_tests.py).

Задача блокируется тикетом #126

Search bot сломался

Search bot ничего не находит.
Надо перезапустить. И как логи посмотреть что там за ошибка?

чиним кошмар у ужас /info

Вот вам правила для /info:

  1. не включать свой твитер - он раскрывается в гиттере
  2. не использовать болд и любое другое оформление нигде вообще в /info ответе.

Все остальное форматирование для вас будет сделано.

Автоматический push образов в docker hub

  1. При успешной сборке ботов в ветке мастер, все docker-образы должны отправляться в docker-hub.
  2. Имя пользователя в docker-hub и доступы для авторизации должны передаваться через переменные окружения. Секретные ключи, такие как пароли или API-токены не должны выводиться в лог при сборке в travis.
  3. Если репозитория в docker hub еще не существует, его нужно создать через API. Нужно сделать автоматически собираемый репозиторий со ссылкой на Dockerfile конкретного бота. Настроить автосборку только только на master-ветке.
  4. После успешной сборки и тестирования всех ботов в master, нужно в любом случае сделать push всех собранных контейнеров в docker hub. Либо дождаться успешной сборки со стороны docker-hub и после этого закончить выполнение билда.
  5. Для ускорения сборки ботов в travis, нужно сперва делать docker pull всех ботов из travis. Это позволит избежать тотального пересбора ботов на каждое изменение.
  6. В docker-compose для всех ботов вместе с ключом build нужно добавить еще ключ image, откуда будет пулиться и пушиться этот бот. Имя пользователя docker-hub (в docker-compose.yml) должно быть настраиваемым через переменную окружения. По умолчанию используется значение rt-bot.

GET /info

UPD: После разговора с авторами решили добавить GET /info (200) с ответом {author: name, info: blah, commands: [xx, yyy]}

Но что делать ботам, которые реагируют не на команду, а на ключевое слово, или работают по какой-нибудь другой логике? Оставить commands пустым?

money_bot

Есть еще идея добавить курсы валют. Например в чате можно будет вписать USD_EUR и получить курс долара к евро.
Есть ли смысл делать это?

Добавить в кармического бота возможность просмотра top-100 пользователей

Как вам идея запилить команду /karma-top [n], которая будет выводить список n пользователей с самой большой кармой (в порядке убывания).
Ограничить n каким-нибудь разумным значением. По умолчанию пусть будет 10.

grabpage-bot public api key

Как-то несекьюрно наружу API Key для сервиса pagelr.com выставлять, тем более что он платный.

Автоматический деплоймент

  • Добавить на bot.radio-t.com API для этого дела - GET /deploy. С http auth.
  • Поменять загрузку всех внешнких ботов с одноразовой (во времq старта), на периодическую (дергать /list каждую минуту, и догружать/перегружать если появился/исчез бот)
  • Добавить вызов API для deplpy со стороны CI

Тестовый сетап

Я подниму бота на gitter канале umputun/test чтоб все авторы могли поиграться и потестирвоать это хозяйство в реальной жизни

Grabpage-bot отвечает 502 Bad Gateway

Привет,

Grabpage-bot отвечает 502 на тестовый запрос

curl --request POST \ --url https://bot.radio-t.com/api/grabpage-bot/event \ --header 'content-type: application/json' \ --data '{ "text" : "Bla bla bla www.mail.ru" }'

Добавить конфиги к ботам

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

Нужно запилить конфигурационные файлы для всех ботов.

Пример конфига для карма-бота:

bot_name: "karma-bot"

defaults:
  username: "test-user"
  display_name: "Test User"

ignored_commands:
  - "Ignored message 1"
  - "Ignored message 2"
  - "Ignored message 3"

test_cases:
  - command: "/karma selevit"
    result: "^Карма пользователя @selevit: \\d+.$"

  - command:
      username: "selevit"
      text: "selevit +1"
    result: "^Вы не можете изменять свою карму!$"

  - command: "selevit++"
    result: "^Карма пользователя @selevit увеличена \\(текущее значение: \\d+\\).$"

Проект не поднимается локально

virtualbox с убунтой (Ubuntu 14.04.4 LTS) и докером (version 1.12.0) на win7
Делаю git clone ... & docker-compose up
При запуске контейнер nginx-bot ругается

nginx-bot         | start nginx
nginx-bot         | ssl_key=le-key.pem, ssl_cert=le-crt.pem
nginx-bot         | '/etc/nginx/conf.d' -> '/etc/nginx/conf.d.disabled'
nginx-bot         | start letsencrypt updater
nginx-bot         | trying to update letsencrypt ...
nginx-bot         | Failed authorization procedure. bot.radio-t.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://bot.radio-t.com/.well-known/acme-challenge/uo16YjdUUmXQ28_WVvN6HG9N9Tw-SfdaVBvPk3GPSSQ: "<html>
nginx-bot         | <head><title>404 Not Found</title></head>
nginx-bot         | <body bgcolor="white">
nginx-bot         | <center><h1>404 Not Found</h1></center>
nginx-bot         | <hr><center>"
nginx-bot         | IMPORTANT NOTES:
nginx-bot         |  - The following errors were reported by the server:
nginx-bot         | 
nginx-bot         |    Domain: bot.radio-t.com
nginx-bot         |    Type:   unauthorized
nginx-bot         |    Detail: Invalid response from
nginx-bot         |    http://bot.radio-t.com/.well-known/acme-challenge/uo16YjdUUmXQ28_WVvN6HG9N9Tw-SfdaVBvPk3GPSSQ:
nginx-bot         |    "<html>
nginx-bot         |    <head><title>404 Not Found</title></head>
nginx-bot         |    <body bgcolor="white">
nginx-bot         |    <center><h1>404 Not Found</h1></center>
nginx-bot         |    <hr><center>"
nginx-bot         | 
nginx-bot         |    To fix these errors, please make sure that your domain name was
nginx-bot         |    entered correctly and the DNS A record(s) for that domain
nginx-bot         |    contain(s) the right IP address.
nginx-bot         | cp: can't stat '/etc/letsencrypt/live/bot.radio-t.com/privkey.pem': No such file or directory
nginx-bot         | cp: can't stat '/etc/letsencrypt/live/bot.radio-t.com/fullchain.pem': No such file or directory
nginx-bot         | '/etc/nginx/conf.d.disabled' -> '/etc/nginx/conf.d'
nginx-bot         | reload nginx with ssl
nginx-bot         | 2016/11/14 08:21:51 [emerg] 26#26: BIO_new_file("/etc/nginx/ssl/le-crt.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/ssl/le-crt.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
nginx-bot         | nginx: [emerg] BIO_new_file("/etc/nginx/ssl/le-crt.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/ssl/le-crt.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)

При попытке открыть URL по IP виртуалки
http://192.168.0.30/list
редиректит на
https://_/list

bot-4-bots - таблицы не отображаются в ответе

Ответ бота не рендерится в таблицу, а отображается в исходном виде (хотя ссылки при этом форматируются нормально):

Bot Name | Created On ↓ | Created By | Last Changed On | Last Changed By
---------|-------------------|------------|-----------------|----------------
bot-4-bots|12/28/2016|khaale|01/06/2017|khaale|
docker-bot|12/26/2016|Vitaly Pryakhin|01/01/2017|Vitaly Pryakhin|
random-bot|12/24/2016|Rabinzon|12/29/2016|Rabinzon|
money_bot|12/09/2016|exelban|12/25/2016|exelban|

вместо

Bot Name Created On ↓ Created By Last Changed On Last Changed By
bot-4-bots 12/28/2016 khaale 01/06/2017 khaale
docker-bot 12/26/2016 Vitaly Pryakhin 01/01/2017 Vitaly Pryakhin
random-bot 12/24/2016 Rabinzon 12/29/2016 Rabinzon
money_bot 12/09/2016 exelban 12/25/2016 exelban

Можно ли посмотреть на дамп сообщения, которое radio-t бот постит в gitter от имени бота? Возможно, дело в каком-нибудь дополнительном форматировании.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.