Хранение состояния пользователя

Messages
1,679
Reaction score
288
Website
tehadm.ru
C-like:
package main

import (
    "log"

    tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

var userStates = make(map[int64]string)

func main() {
    bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
    if err != nil {
        log.Panic(err)
    }

    bot.Debug = false

    log.Printf("Авторизовался как %s", bot.Self.UserName)

    u := tgbotapi.NewUpdate(0)
    u.Timeout = 60

    updates := bot.GetUpdatesChan(u)

    for update := range updates {
        if update.Message != nil { // Если получено сообщение
            if update.Message.IsCommand() { // Если сообщение - команда
                switch update.Message.Command() {
                case "start":
                    sendMainMenu(update.Message.Chat.ID, bot)
                    userStates[update.Message.Chat.ID] = ""
                default:
                    msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Неизвестная команда. Используйте /start для начала.")
                    bot.Send(msg)
                }
            } else {
                // Проверяем состояние пользователя
                state, exists := userStates[update.Message.Chat.ID]
                if exists && state == "awaiting_name" {
                    userName := update.Message.Text
                    msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Привет, "+userName+"!")
                    bot.Send(msg)
                    // Сбрасываем состояние
                    userStates[update.Message.Chat.ID] = ""
                } else {
                    msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Пожалуйста, используйте меню или команды.")
                    bot.Send(msg)
                }
            }
        } else if update.CallbackQuery != nil { // Если получен callback из инлайн-кнопки
            callback := update.CallbackQuery
            log.Printf("Нажата кнопка: %s", callback.Data)

            var responseText string
            switch callback.Data {
            case "option1":
                responseText = "Вы выбрали Опцию 1. Пожалуйста, введите ваше имя."
                userStates[callback.Message.Chat.ID] = "awaiting_name"
            case "option2":
                responseText = "Вы выбрали Опцию 2"
            case "option3":
                responseText = "Вы выбрали Опцию 3"
            default:
                responseText = "Неизвестная опция."
            }

            // Отправляем уведомление пользователю
            msg := tgbotapi.NewMessage(callback.Message.Chat.ID, responseText)
            bot.Send(msg)

            // Удостоверяемся, что уведомление обработано
            callbackConfig := tgbotapi.NewCallback(callback.ID, "")
            bot.Request(callbackConfig)
        }
    }
}

func sendMainMenu(chatID int64, bot *tgbotapi.BotAPI) {
    // Создаём кнопки меню
    keyboard := tgbotapi.NewInlineKeyboardMarkup(
        tgbotapi.NewInlineKeyboardRow(
            tgbotapi.NewInlineKeyboardButtonData("Опция 1", "option1"),
            tgbotapi.NewInlineKeyboardButtonData("Опция 2", "option2"),
        ),
        tgbotapi.NewInlineKeyboardRow(
            tgbotapi.NewInlineKeyboardButtonData("Опция 3", "option3"),
        ),
    )

    msg := tgbotapi.NewMessage(chatID, "Выберите опцию:")
    msg.ReplyMarkup = keyboard

    bot.Send(msg)
}
 
Back
Top