LINUX.ORG.RU

Чат-боты: Модульная структура.

 , ,


0

1

В общем. Необходимо сейчас писать бота для мессенджера со сложной структурой. В связи с чем возник вопрос, как грамотно организовать все, чтобы код был красивым, а не с кучей if-else, смешанных в каше(видел такие проекты - смотреть больно, трогать - смертельно)? Сейчас примерно выстроил следующее: у пользователя в базе данных хранятся соответствующие два поля - в одном хранится текущее действие(или функциональность), выполняемое в данный момент пользователем. Например, он находится в процессе заполнения заявки, или же просмотра списка заявок. Для каждого действия при поступлении сообщения от пользователя, из базы данных получаем текущее действие и создаем соотвествующий действию класс, и маршрутизируем обработку сообщения ему. Второе поле - статус в текущем действии. Его обрабатывает всегда соответствующий действию класс и использует для перехода между состояниями внутри себя. При переходе на другое действие, происходит сброс статуса в «start». При этом каждое действие должно обрабатывать этот статус всегда - по своему. Так как пишу на Python, неплохо бы все это дело обернуть в декораторы - для каждого state своя функция, обернутая декоратор. Из if-else останется только обработка в зависимости от конкретного ответа(message). Было бы неплохо получить отклик(сильно не пинать), либо советы.

Ответ на: комментарий от ugoday

Он и есть. Только тут суть в том, что в одном конечном автомате работает другой) т.е два уровня. Каждое состояние первого уровня описывается отдельным классом. А уже второго уровня - отдельными функциями в нем.

crarkie
() автор топика

Был на эту тему комикс, там тип за 21 день управился.

pon4ik ★★★★★
()
Ответ на: комментарий от crarkie

Тебе не съехать на IRC предложили, а посмотреть на структуру и если возможно - адаптировать код под телеграм. Я бы посоветовал ещё покурить https://github.com/hubotio/hubot, он правда на CoffeeScript о уже переписали на JS.

ei-grad ★★★★★
()

Не знаю есть ли у тебя возможность выбра языка, на Эрланге то что ты описал это паттерн которому лет 20, называется gen_server.

По-сути это процесс с состоянием и в него приходят события (сообщения) из вне и в зависимости от состояния (элементарно делается паттерн-матчингом) он реагирует.

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от loz

Да. Примерно такое и должно быть. Только состояние для каждого пользователя из БД подтягивается. Язык Python - банально быстрый прототип. Из библиотек - Gino, Aiohttp(requests), Sanic.

crarkie
() автор топика
Ответ на: комментарий от crarkie

Только состояние для каждого пользователя из БД подтягивается

Это изи в эрланге - процесс на каждого пользователя со своим состоянием :)

loz ★★★★★
()
Ответ на: комментарий от loz

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

crarkie
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.