169 похожих чатов

Помогите придумать систему, ибо моя голова уже разрывается от того,

что не может придумать как это адекватно и аккуратно выразить в коде.

Телега. Бот.
1. Команды.
1.1. Я глупый юзер и не умею в аргументы команд и вообще хочу кнопки. Вызвал я команду и следующим сообщением хочу отправить какую-либо инфу.
Вопрос: Обработать сообщение не проблема, но как узнать что перед этим была вызвана определённая команда? Как это алгоритмически выразить и написать?
1.2. Я ещё тупее юзер и после одной команды с обработкой текста в следующем сообщении вызвал другую команду.
Вопрос: Как отменить первую команду и дать выполнение второй? Опять же, нужен алгоритм.
2. Типы сообщений.
Есть много типов сообщений: фото, видео, голосовое, геолокация, текст, совмещённое и т.д. И есть только 1 ивент, который вызывается при получении сообщения.
Вопрос: Как правильнее разделить все сообщения по типам и условиям, к примеру, на текстовые команды. Проблема в том, что команд таких может быть уйма и писать в 1 листенере их вообще не в кайф. Так что тогда делать?

12 ответов

21 просмотр

1.1. Хранить в бд состояние. Переключать через fsm. В популярных бото-либах есть функция диалогов 1.2. Или ставить в очередь и троттлить, или никак 1.3. Разделять хендлеры по разным классам

1. Я не подскажу по либам, я по сути. Можешь сам набросать, главное принцип fsm и хранить состояние. Условный редис подойдёт для этого хорошо 2. Ну, фсм это одно состояние в каждый момент времени. Ты можешь просто игнорировать ввод или реально троттлить, брать все апдейты и искать самый последний для чувака. Но тут задача кмк бесполезная. 3. Ну, тут не прям просто. Если брать каждый отдельный апдейт, то можно выкупить или простую команду, или активный диалог по user id, туда и отправлять. Но тут проще сказать чем сделать)

Ратмир-Диронин Автор вопроса
Sergey Chizhik
1. Я не подскажу по либам, я по сути. Можешь сам н...

https://spatie.be/docs/laravel-model-states/v2/01-introduction Пойдёт как fsm?

Ратмир Диронин
https://spatie.be/docs/laravel-model-states/v2/01-...

Та похер шо) fsm и самому пишется за пару минут

Ратмир-Диронин Автор вопроса
Sergey Chizhik
Та похер шо) fsm и самому пишется за пару минут

Не шарю просто за fsm. Это же обычные состояния?

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

Ратмир-Диронин Автор вопроса

Это если отвечать на сообщение, а не, как обычно, просто писать новое. У кнопок каллбэк идентификаторы есть. Как-то раньше писал, но то была просто простыня в 1 файл + библиотека для базы

Ратмир Диронин
Это если отвечать на сообщение, а не, как обычно, ...

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

Ратмир-Диронин Автор вопроса
Andrey Helldar
В любом случае, годных актуальных пакетов с реализ...

Есть какая-то инфа по работе системы диалога? Мб попробую написать

На первый вопрос уже сказали fsm делать, я fsm на простом mysql делал, а на второй вопрос, поставь один обработчик который будет обрабатывать текст, если текст какая-то команда тогда переключаешься на другой функционал бота, а если какое-то ключевое слово из кнопок тоже так и каждый апдейт пропускаешь через этот обработик, крч ставишь условие if('/command' || 'keyword') и так продолжаешь. И про ивенты по моему лучше создать по одному для каждого типа

Ратмир-Диронин Автор вопроса
𝕱𝖎𝖗𝖉𝖆𝖛𝖘 ⁹⁹
На первый вопрос уже сказали fsm делать, я fsm на ...

2. Да ну. Правда что-ли? Вот это удивил... Только я не хочу писать 3-ю ивент-систему, а аккуратно распределить по кастомным хандлерам тоже дело не простое

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта