Wednesday, November 14, 2018

Тестовое задание React

 

Вступление

Что делать, чтобы скорее выучить React?
Пройти туториал и выполнить тестовое задание.

Полезные ссылки

Документация react - раздел Getting Started»
Introducing JSX - синтаксическое расширение к языку JavaScript.

Документация по фреймворку React прекрасна (на первых этапах), дальше есть проблемы.

Тестовое задание

В прекрасном тестовом задании от KODE была задача реализовать простой интерфейс с ключевой особенностью: бесконечный слайдер. Самостоятельно я с этой задачей не справился, но и в интернетах готовое решение не смотрел. Вместо слайдера я использовал кнопки.

Скрин 1:

Скрин 2 (когда нет прогноза погоды):


Исходники сайта находятся в открытом доступе, а сам сайт лежит тут

Итого

Первый проект (пусть и тестовый) на фреймворке React готов.

Thursday, October 18, 2018

Анализ оскорблений в сети

 

Вступление

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

Оскорбления с точки зрения закона

В действующем законодательстве оскорбление личности рассматривается как административное правонарушение, наказание за которое предусмотрено статьёй 5.61 Кодекса РФ об административных правонарушениях.

Текст закона об унижении чести и достоинства другого лица:
КоАП РФ Статья 5.61. Оскорбление [1]

Унижение чести или достоинства должно быть выражено в неприличной форме, отсутствие таковой исключает квалификацию правонарушения как оскорбления. Понятие «неприличная форма» законодательно не раскрывается, но под ним понимается действие виновного в грубой, циничной форме, противоречащей правилам поведения, принятым в обществе либо разделяемым большинством членов данного общества, это форма унизительного обращения с человеком. Сегодня исследователи справедливо отмечают, что правоприменители нередко сталкиваются с проблемой толкования термина «неприличная форма». Нередко данный вопрос («Выражено ли высказывание в неприличной форме?») адресуется экспертам-лингвистам.

Из судебной практики. Не оскорбление:
«Ведь для всего этого уголовного сброда в лице Евдокимовых, Давыдовых, Мотовиловых, Мякушей, Истоминых, Караваевых, Мошаровых, Юревичей и прочих предстоящие выборы - это тест на профпригодность, на лояльность своему нацлидеру жуликов и воров».

Оскорбительные высказывания в адрес персонально неопределенной группы лиц, идентифицируемой признаками профессии, национальной принадлежности и т.д., состава оскорбления не образуют, но в некоторых случаях могут квалифицироваться как преступление (например, ст. 282 УК РФ «Возбуждение ненависти либо вражды, а равно унижение человеческого достоинства») или образовывать состав административного правонарушения (например, ст.5.62 «Дискриминация»).

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

Субъективная сторона оскорбления характеризуется умышленной формой вины, причем возможен только прямой умысел. Виновный осознает, что наносит оскорбление другому человеку, и желает этого. Он сознает общественную опасность деяния. Вместе с тем вопрос о субъективной стороне оскорбления является дискуссионным. [2]

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


Эксперт объясняет почему решил, что "Иди на х*й" не является оскорблением [3]

Эталонный пример.
Эксперт объясняет почему решил, что "Иди на х*й" не является оскорблением [3]

Еще раз:
Оскорбление - это унижение чести и достоинства другого лица, выраженное в неприличной форме.

Оскорбление:
ты - х*й

Не оскорбление (нет неприличной формы):
ты - дубина

Не оскорбление (нет унижения чести и достоинства):
иди нах*й [3]

Не оскорбление (нет объекта оскорбления):
мне пох*й

TODO: информация будет дополнена

Cсылки

[1] КоАП РФ Статья 5.61. Оскорбление
http://www.consultant.ru/document/cons_doc_LAW_34661/d40cbd099d17057d9697b15ee8368e49953416ae/

[2] Оскорбление: деликт, правоприменительная практика: https://ceur.ru/library/articles/lingvisticheskaja_jekspertiza/item134171/

[3] Эксперт объясняет почему решил, что "Иди на х*й" не является оскорблением
https://euroradio.fm/ru/ekspert-obyasnyaet-pochemu-reshil-chto-idi-na-hy-ne-yavlyaetsya-oskorbleniem

Sunday, September 30, 2018

"Hello, world!" бот за 10 минут

Вступление


С каждым новым ботом приходится повторять одни и те же действия для создания стартового шаблона. Есть необходимость создать базовый шаблон для всех ботов и всегда его использовать для ускорения разработки.

Шаблон, собственно, уже создан. Вот он:
https://github.com/VadimCpp/myfirstbotbot

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


Инструкция


0. Предусловия


Прежде чем перейти к пункту 1, проверьте чек-лист:

  1. У вас есть аккаунт Github (если нет - зарегистрироваться);
  2. Вы умеете работать в командной строке (если нет - изучить навигацию по системе, выполнение команд, создание/копирование/удаление файлов);
  3. У вас установлен Telegram (если нет - установить);
  4. Уметь создавать боты в Telegram (если нет - изучить @BotFather);

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


1. Скачать исходники


Открыть командную строку перейти в рабочий каталог и выполнить команду:
git clone https://github.com/VadimCpp/myfirstbotbot.git

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



После этого необходимо убедиться в том что файлы скачаны. Перейти в папку проекта и вывести список файлов. 
Выполнить команды для OS X:
cd fxswap_bot/
ls -l

Выполнить команды для Windows:
cd fxswap_bot/
dir

Результат примерно такой:



2. Создать телеграм бот


Запустить бот для создания ботов. Перейти по ссылке:
Или открыть бот непосредственно в приложении: @BotFather

Необходимо создать бота и получить его токен. Пример:



3. Создать приложение Heroku


Теперь необходимо создать приложение Heroku.



4. Настроить приложение Heroku


Теперь необходимо настроить приложение. Первым делом нужно на вкладке “Deploy” выполнить указания раздела “Deploy using Heroku Git”:


Необходимо связать исходники с локального компьютера с приложением Heroku. Выполнить команды:
heroku git:remote -a your_heroku_app_name
git push heroku master

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

Результат команд должен выглядеть примерно так:




5. Прописать переменные


Далее на странице Settings необходимо прописать переменные:


Сначала пример, а ниже - какое значение прописывать для каждой переменной. Пример:


5.1. Токен бота


BOT_ACCESS_TOKEN - токен бота. Получить значение в Телеграмме у бота @BotFather.
Пример:


5.2. Ссылка для мессенджера телеграм.


HEROKU_URL - это ссылка на сайт. Ее можно узнать нажав на кнопочку “Open app”.
Вот она:


Пример:

https://myfirstbotbot.herokuapp.com/

5.3. Тип деплоя


NODE_ENV - всегда “production”

Это означает, что бот запускается в боевом режиме (а не в режиме разработки).


6. Запустить бот


Необходимо запустить бот и убедиться что он работает. Открыть вкладку “View logs” и затем нажать кнопку “Restart all dynos”



На скрине видно запись:
[MyFirstBotApp]: Create Application...

Это означает что бот запущен. Еще совсем чуточку…

...


Откройте бота и убедитесь что он работает:


Поздравляем!
Вы только что создали свой первый телеграм бот на node.js


Итого


Исходники бота:
https://github.com/VadimCpp/myfirstbotbot

Бот:
https://t.me/myfirstbotbot

Update 2019-08-11:
Бот построен на основе библиотеки https://github.com/yagop/node-telegram-bot-api
Есть еще другая библиотека: https://github.com/telegraf/telegraf , но до нее руки пока так и не дошли. 🙂

Thursday, September 20, 2018

Календарь-калькулятор

Вступление


Так исторически сложилось, что в календарь записывали расходы/доходы. 😐
Необходимо создать веб-приложение, которое получает и обрабатывает данные календаря Google.

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


Исследование


Полезные ссылки:
Calendar API
Сайт позволяет тестировать методы API.

Getting Started with  JavaScript client library:
https://developers.google.com/api-client-library/javascript/start/start-js

People API:
https://developers.google.com/people/

При инициализации библиотеки необходимо указывать scope: какие именно API будут использоваться. В моем случае это будет срока:

profile https://www.googleapis.com/auth/calendar.readonly

Для получения данных о пользователе, и для получения данных о календарях.


Реализация


По шагам:


  1. Создаем проект на github (CalendarCalculator)
  2. Настроить npm + gulp: коммит
  3. В консоли google создаем проект "Calendar Calculator"
  4. Необходимо подключить People API
  5. Реализовать авторизацию: коммит

  6. Получить список календарей: коммит

  7. Реализовать получение событий: коммит

  8. Подсчет данных из событий в календаре: коммит



Вот и собственно все.
Далее остается фикс багов, затем расширение.

upd: после добавления стилей календарь выглядит так:




Итого


Календарь-калькулятор можно заценить на https://vadimcpp.github.io/calendarCalculator/
Веб-приложение подключается к календарю, читает данные календаря и проводит простую калькуляцию.


Friday, September 14, 2018

Подготовка к devfest 2018

Вступление


15 сентября 2018 года состоялось событие DevFest, в рамках которого рассказал историю одного цензор-бота.


Презентация и речь


Время - 25 минут.

Содержимое:

  • Вступление
  • Представление
  • История цензуры
  • Русский мат
  • Проблема
  • Хакатон KoenigHack-2018
  • Как работает алгоритм?
  • Как наполняли словарь?
  • Где уже внедрено?
  • Планы на будущее
  • Итого



1. Вступление




Технологии стремительно развиваются. Мир становится сложнее. Соцсети уходят в прошлое. Все пользуются мессенджерами. А уже совсем скоро наши карманные компьютеры, которые мы называем телефонами, заговорят.

Создается впечатление, что для создания стоящего продукта необходимо:

быть гением;
вложить массу усилий, денег и времени;
Но это не так... (интрига?)



2. Представление




Привет! Меня зовут Вадим. Я работаю фронтенд-разработчиком в компании РосКомпьютинг, которая занимается разработкой программного обеспечения на заказ, ИТ консалтингом, а также развивает собственную линейку продуктов.

ИТ технологии кардинально изменили и продолжают менять этот мир. Мне очень интересно изучать то, как технологии меняют общество, способы коммуникации и уклад жизни современного человек. Поэтому в свободное время я работаю над социально полезными продуктами.

Сегодняшняя история - это история как раз про социально полезный продукт. История о том, как простая идея и простая реализация приносит большую пользу. Это история цензор-бота.


3. История цензуры




Что такое «цензура»? Это слово в переводе с латинского означает «строгое суждение, суровый разбор, взыскательная критика». В современном мире цензура - это:
  1. надзор за печатью с целью недопущения распространения вредных с точки зрения правительства произведений печати
  2. учреждения, которым поручен этот надзор
  3. неотъемлемая функция любого государства



Точно можно сказать, что цензуры как таковой не существовало, пока не появилась письменность. Далее в хронологическом порядке:

  1. Письменность массово появляется после Крещения Руси Владимиром в 988 году.
  2. Первый России список запрещённых к чтению книг вышел в 1073 году: «Изборник 1073 года»
  3. Первый русский литературный памятник — „Слово о полку Игореве“ — появился в конце XII в. (1185 году)



Парадокс!

Цензура в России развивалась по стопам материковой Европы и была предварительной, как в Европе. Французские законы были базой для российского цензурного законодательства в отношении отечественных изданий, а прообразом правил к иностранным изданиям - Пруссия и Австрия.

16 мая 1917 года в «Вестнике Временного правительства» было обнародовано законодательное распоряжение: «Печать и торговля произведениями печати свободны. Применительно к ним административных взысканий не допускается». В реальности подобная свобода полностью реализована не была.
В современной России цензура запрещена Конституцией Российской Федерации  — п. 5 статьи 29




4. Русский мат


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

Одна из распространенных версий – татаро-монголы. Но на самом деле к ним эта лексика никакого отношения не имеет. Русский мат славянского происхождения. Четыре известные каждому русскому человеку корня можно встретить и в македонском, и в словенском, и в других славянских языках.


Древнейшие известные образцы — в берестяных грамотах XII-XIII веков из Новгорода и Старой Руссы. Вот они:



Сейчас использование мата считается неприемлемым в приличном обществе и в литературе, и обычно цензурируется в периодической печати, на телевидении, радио и в других СМИ. Почему?

Потому что церковь и государство в России всегда были тесно связаны. Крещение Руси принесло не только письменность, но и начало активную борьбу с языческими культами, в том числе с матерными словами как одним из проявлений культа. Борьба с русским матом продолжается и сейчас.


5. Проблема


Согласно Кодексам об административных правонарушениях русскоязычных стран, а именно России (статья 20.1[32]), Казахстана (статья 330[33]), Белоруссии (статья 156[34]) и Киргизии (статья 364[35]), публичное употребление мата может расцениваться как мелкое хулиганство, наказываемое штрафом или административным арестом. Статья 20.1 Кодекса об административных правонарушениях Российской Федерации:

«Мелкое хулиганство, то есть нарушение общественного порядка, выражающее явное неуважение к обществу, сопровождающееся нецензурной бранью в общественных местах, оскорбительным приставанием к гражданам, а равно уничтожением или повреждением чужого имущества, — влечёт наложение административного штрафа в размере от пятисот до одной тысячи рублей или административный арест на срок до пятнадцати суток.»



Как бы странно не звучало, но чат - это общественное место! Из определения: общественное место — территория или пространство потенциального местонахождения людей.

В начале 2018 года я заметил, что маты в чатах доставляют боль. Почти в каждом чате присутствует список правил:
⛔️ не материться
⛔️ не спамить
⛔️ не оскорблять других участников
⛔️ не разжигать

Тогда совместно с Машей мы обсудили идею телеграм бота и на ближейшем хакатоне реализовали бота и внедрили в группу GDG Kaliningrad


6. Хакатон KoenigHack-2018


Собственно с этого момента начинается история цензор-бота.
17 февраля 2018 года в 5:35 утра был сделан первый коммит

Почитать про событие можно тут:


7. Как работает алгоритм?


Бот - это на самом деле обычный веб-сервер, который принимает запросы от мессенджера Telegram и обрабатывает их.



А как бот удаляет маты?

Тут схема чуть сложнее. Для каждого сообщения бот выполняет два действия:
Отмечает в сообщении слова, которые однозначно не являются нецензурными
Затем удаляет все нецензурные слова



8. Как наполняли словарь?


После внедрения бота в чат, начался период его совершенствования. Несколько человек (@MISTikus, @imfrombristol, @KlepikovKonstantin и др.) наполняли словарь матами. На сегодняшний день размер словаря составляет 1360 слов. Это почти все нецензурные слова русского языка,  с разными окончаниями и разными приставками.


9. Где уже внедрено?


Внедрено в игре Мафия, на моем сайте и в телеграмме. Для бота доступен REST API. Вы можете интегрировать свое приложение с ботом, предварительно получив ключ.




10. Планы на будущее


Недавно прошла тестирование фича антиспам. Цензор-бот также выполняет функцию антиспам в основной группе GDG Kaliningrad.

Чего хотелось бы еще?

  • Статистика
    Еще пока нет статистики. Кроме уровня загрузки сервера.
  • Цензура сообщений в бизнес чатах
    Цензура сообщений в бизнес переписке значительно повысит стрессоустойчивость сотрудников, которые вынуждены читать все сообщения от всех недовольных клиентов. Клиенту даже необязательно показывать что его сообщение подверглось цензуре. Тут важно то, что бот заботится о психологическом здоровье сотрудника.
  • Распознавание и предварительная цензура речевых оборотов, которые нарушают законодательство РФПредварительная цензура На текущей момент существует 7 статей УК, по которым могут призвать к ответственности:
    • 282 возбуждение ненависти
    • 280 экстремизм
    • 148 1 2 оскорбление чувств верующих
    • 205.2 оправдание терроризма
    • 280.1 призывы к сепаратизму
    • 354.1 реабилитация нацизма
Тогда можно будет не тратить деньги государства на цензуру и содержание аппарата, а заниматься более полезными делами, например, медициной.

11. Итого

Есть видео: 



Ссылки

Вики:

Отчет о хакатоне:

Приложение, в которое интегрирован бот:

Персональный сайт, в который интегрирован бот:

Сайт компании Роскомпьютинг:

Monday, July 30, 2018

GDG Цензура Bot, Антиспам (часть 5)

 

Проблема

В наш чат GDG Kaliningrad часто добавляются спамеры. Есть необходимость спам-фильтра.

Анализ и алгоритм

Обычно в группу вступает пользователь John Doe и молчит. Спустя некоторое время он постит ссылку, содержащую спам. Выглядит это так:


Дальше, кто-то добавляет его в ЧС и удаляется сообщение. Так повторяется много раз с разными пользователями.

Поэтому GDG Цензура Бот будет действовать по самому простому алгоритму: каждый вступивший в группу пользователь будет занесен в таблицу новичков. Каждый новичек должен написать 3 сообщения, не содержащих ссылок. После того, как новенький пользователь выполнил условия (они обязательно будут меняться, но пока просто 3 сообщения 1 сообщение), бот "верифицирует" пользователя и удаляет его из таблицы новеньких.

Если новенький пользователь спамит в группу, бот выполняет несколько действий:
  1. Удаляет сообщение со спамом
  2. Удаляет пользователя из группы
  3. Заносит пользователя в ЧС
  4. Формирует отчет и отправляет его в GDG Censor Chat

Важно отметить, что алгоритм работы бота соответствует правилам чата GDG Kaliningrad и согласован с руководителями.

Что видит спамер?


Что видит админ?



Дальше немного технических деталей, а затем выводы и открытые вопросы.

Техническая реализация

Установка и подключение к redis

Установить brew,
Затем установите redis.
Использовать инструкцию по установке:
http://jasdeep.ca/2012/05/installing-redis-on-mac-os-x/

Выполнить в консоли тестовую команду:
$ redis-cli -v
redis-cli 4.0.10
Если отобразилась версия - установка прошла успешно.

Создать базу данных, и получить к ней точку входа Endpoint, который состоит из url и номера порта.

Запустить redis cli:
$ redis-cli
connect {url} {port}

Затем выполнить тестовую команду:
redis-url.com: 12345 > ping

PONG

PONG означает что подключение прошло успешно 🙂

Работа с hash в redis

Тут будет описание команд согласно тому как будет реализована фича антиспам.

Добавляем новенького

Когда пользователь вступает в чат, бот добавляет новенького в хеш:
> hmset gdguser:{id} username {user name} messagecount 0

Это нужно для того чтобы можно было начать подсчет написанных сообщений.

Удаляем новенького

Тут есть три случая когда надо удалить новенького:
  • новенький покинул группу;
  • новенький прислал спам;
  • новенький прошел верификацию.
Команда удаляет все данные о пользователе:
> hdel gdguser:{id} username messagecount

Теперь необходимо получить данные.

Получение информации

Чтобы определить, является ли пользователь новичком, выполняем запрос:
> hgetall gdguser:{id}

Пример ответа:
> hgetall gdguser:1
1) "name"
2) "Vlad"
3) "messagecount"
4) "0"

Еще пример ответа:
> hgetall gdguser:2
(empty list or set)

Если пользователь присутствует в таблице, он является новичком. Следовательно, необходимо проверить, сколько сообщений он уже отправил. Эта информация уже содержится в ответе.

Инкремент счетчика сообщений

Когда новенький отправил сообщение, необходимо увеличить счетчик на 1. Это можно сделать командой:
> hincrby gdguser:1 messagecount 1
(integer) 6

Проверка:
> hget gdguser:1 messagecount
"6"

Использование методов API

Используем API npm redis для реализации наших операций.
На js это выглядит так.

Добавляем новенького:
> redisClient.hmset(hashname, "username", name, "messagecount", 0, (e, r) => {console.log(e, r)});

Удаляем новенького:
> redisClient.hdel(hashname, "username", "messagecount", 0, (e, r) => {console.log(e, r)});

Получаем все данные:
> redisClient.hgetall(hashname, (e, r) => {console.log(e, r)});

Инкремент счетчика сообщений:
> redisClient.hincrby("gdguser:1", "messagecount", 1, (e, r) => {console.log(e, r)});

Полезные ссылки

Быстрый старт: https://redis.io/topics/quickstart
Работа схешем: https://redis.io/commands#hash
A node.js redis client: https://www.npmjs.com/package/redis

Итого

Антиспам реализован, внедрен и приносит первые плоды. В виде заблокированных спамеров.


Присоединяйтесь (тыц) и смотрите, как бот выполняет свою работу. 😎
Ссылочка: https://t.me/gdgcensorchat

Проблемы

Вот пример спама, который бот никак не фильтрует:

Увы, эта ситуация должна быть исправлена на уровне мессенджера Telegram.

В будущем, фича антиспам будет развиваться и усложняться по мере того, как будут появляться новые виды спама.

Thursday, June 28, 2018

Хорошо посидели бот (часть 2)

Проблема

В первом посте был описан алгоритм "Хорошо посидели" бота. В данном посте будет описан интерфейс взаимодействия пользователя с ботом.


Зачем тут эта картинка? Люди могут тратить вместе деньги при организации пикника)


Интерфейс взаимодействия


1. Команда /start


Эта команда, с которой всегда начинается общение с ботом. При запуске бот отправляет сообщение пользователю:
"Привет! Это хорошо посидели бот. 😎

1️⃣ 
Бот помогает разобраться кто, кому и сколько должен после того как хорошо посидели.

2️⃣
Подразумевается, что суммарный счет делится поровну.

3️⃣
Все округления справедливо ложатся на плечи тех, кто заплатил меньше в начале. Подробный алгоритм тут: http://webdev2018.blogspot.com/2018/05/dereban-1.html

4️⃣
Есть вопросы и предложения? Наша команда:
@vadimcpp - программирование и маркетинг
@oleg - программирование

5️⃣
Нажмите кнопку «Новый расчет»
"

У пользователя есть возможность нажать одну кнопку «Новый расчет»

2. Команда «Новый расчет»


Бот отправляет сообщение пользователю:
"Введите имя первого участника"

Пользователь вводит имя.

Бот отправляет сообщение пользователю:
"Сколько денег потратил?"

Пользователь вводит сумму.

Бот рассчитывает сумму минимум между двумя людьми, поэтому...

Бот отправляет сообщение пользователю:
"Введите имя второго участника"

Пользователь вводит имя.

Бот отправляет сообщение пользователю:
"Сколько денег потратил?"

Бот отправляет сообщение пользователю:
"
Имя1 потратил: Сумма1
Имя2 потратил: Сумма2
"

Когда пользователь ввел данные двух и более человек, меню содержит три кнопки:
  1. Добавить еще
  2. Расчет
  3. Сброс

3. Команда «Добавить еще»


Бот отправляет сообщение пользователю:
"Введите имя следующего участника"

Пользователь вводит имя.

Бот отправляет сообщение пользователю:
"Сколько денег потратил?"

Пользователь вводит сумму.

Бот отправляет сообщение пользователю:
"
Имя1 потратил: Сумма1
Имя2 потратил: Сумма2
"

Когда пользователь ввел данные двух и более человек, меню содержит три кнопки:
  1. Добавить еще
  2. Расчет
  3. Сброс

4. Команда «Расчет»


Бот отправляет сообщение пользователю:
"
 Имя1 → Имя2: 💰Сумма1
 Имя2  Имя3: 💰Сумма2
 Имя4  Имя1: 💰Сумма3
 Имя5  Имя2: 💰Сумма4
...
"

Когда пользователь ввел данные двух и более человек, меню содержит три кнопки:
  1. Добавить еще
  2. Расчет
  3. Сброс

5. Команда «Сброс»


Бот очищает данные.

У пользователя есть возможность нажать одну кнопку «Новый расчет»


Итого


Имея под рукой алгоритм расчета и интерфейс взаимодействия пользователя и бота мы готовы к разработке. Бот можно протестировать в телеграме: https://t.me/HoroshoPosideliBot 

upd 26.12.2020: бот удален из телеграма, исходники лежат у Олега: https://github.com/sylvan008/hadGoodTime