Telegram bot golang

Рейтинг: 0Ответов: 1Опубликовано: 07.03.2023

Я начал разрабатывать телеграм бота на golang, на библиотеке telegram-bot-api. И встал такой вопрос, что мне нужно сделать регистрацию пользователя. Помню как на питоне с библиотекой aiogram там легко задавалось машинное состояние. Есть ли какие-то такие же альтернативы или другой способ, чтобы можно было сделать машинное состояние? Я прочитал отдельно про fsm, пока что для моего уровня знания это тяжело реализовывать.

Ответы

▲ 2Принят
var ctx = context.Background()

func main() {
    // Инициализация бота
    bot, err := tgbotapi.NewBotAPI("token")
    if err != nil {
        log.Fatal(err)
    }

    // Инициализация FSM
    newFSM := fsm.NewFSM(
        "start",
        fsm.Events{
            {Name: "register", Src: []string{"start"}, Dst: "registering"},
            {Name: "cancel", Src: []string{"registering"}, Dst: "start"},
        },
        fsm.Callbacks{},
    )

    // Обработка команд
    u := tgbotapi.NewUpdate(0)
    u.Timeout = 60

    updates, err := bot.GetUpdatesChan(u)
    if err != nil {
        log.Fatal(err)
    }

    for update := range updates {
        if update.Message == nil {
            continue
        }

        switch update.Message.Text {
        case "/start":
            // Отправляем приветственное сообщение
            msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Привет! Я бот для регистрации пользователей.")
            _, err := bot.Send(msg)
            if err != nil {
                log.Println(err)
            }

        case "/register":
            // Проверяем состояние FSM и отправляем соответствующее сообщение
            switch newFSM.Current() {
            case "start":
                msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Начинаем регистрацию. Введите ваше имя:")
                _, err := bot.Send(msg)
                if err != nil {
                    log.Println(err)
                }
                err = newFSM.Event(ctx, "register")
                if err != nil {
                    log.Println(err)
                }

            case "registering":
                msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Вы уже зарегистрированы.")
                _, err := bot.Send(msg)
                if err != nil {
                    log.Println(err)
                }
            }

        default:
            // Обрабатываем сообщения в зависимости от состояния FSM
            switch newFSM.Current() {
            case "registering":
                // Обрабатываем введенное имя
                // Здесь можно добавить код для обработки других данных пользователя
                msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Спасибо за регистрацию!")
                _, err := bot.Send(msg)
                if err != nil {
                    log.Println(err)
                }
                err = newFSM.Event(ctx, "cancel")
                if err != nil {
                    log.Println(err)
                }
            }
        }
    }
}