Как не создавать путанницы в состояниях тг бота

Проблема такая: есть тг магазин, который продаёт товары. Я не профи, поэтому с горем пополам реализованы состояния бота. В зависимости от состояния устанавливаются различные кнопки, и messageId присваивается соответсвующее значение. Всё работает хорошо с одним пользователем, но с двумя уже возникают проблемы - а именно путанница в состояниях и messageId. Пользователь 1 находится в состоянии С, а пользователь 2 в состоянии A, из-за чего бот начинает работать некорректно и с состояниями, и с messageId соответственно. Каким образом можно довести всё это дело до ума, чтоб работало и не было стыдно?)

@Override
public void onUpdateReceived(Update update) {


    if (update.hasPreCheckoutQuery()) {
        answerPreCheckout(update.getPreCheckoutQuery());
    }


    if (update.hasCallbackQuery()) {

        if (state instanceof MainMenu) {

            handleCallback(update.getCallbackQuery());


        } else if (state instanceof ReturnProduct) {

            handleCourses(update.getCallbackQuery());

        }
        else if (state instanceof Return_Invoice) {


            handleInvoice(update.getCallbackQuery());

        }
    }
    if(update.hasMessage()){
        Message message = update.getMessage();
        handleMessage(message);
}


}

state и messageId определены в основном классе бота

public class MySuperBot extends TelegramLongPollingBot {
    private static final String TOKEN = "Token";
    private static final String USERNAME = "UserName";

    State state;
    int messageid = 0;

Присваиваю им значения в методах каждого из состояний. Вот кусок одного из методов:

try {
            Message sentoutmessage = execute(SendMessage.builder().text("Текст").chatId(message.getChatId()).replyMarkup(InlineKeyboardMarkup.builder()
                    .keyboard(menu.returnButtons().getKeyboard()).build()).build());
            setMessageid(sentoutmessage.getMessageId());
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }


            state = new MainMenu();

здесь я нажимаю "Главное меню" -> устанавливаются кнопки -> присваиваю messageId значение msgId этой клавиатуры -> потом state присваивается класс главного меню.

Далее нажимаю на какой-либо продукт. С помощью EdidMessage меняются кнопки на другие, messageId присваивается уже новое значение и state так же меняется. Дальше всё работает тем же макаром.


Ответы (0 шт):