Telegram бот падает с ошибкой, на вход приходит сообщение содержащие nil

В телеграмм бот отправляю команду Добавить Тег, она должна вызвать функцию AddTag, но получаю ошибку

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0xd8668b]

goroutine 1 [running]:
main.AddTag(0xc00009b220, 0xc0000a9688)
        D:/Programming/GO/test_bot_api/bot_api.go:174 +0x8b
main.bot_main()
        D:/Programming/GO/test_bot_api/bot_api.go:82 +0x358
main.main()
        D:/Programming/GO/test_bot_api/bot_api.go:196 +0xf
exit status

Как я понимаю это происходит из-за того, что после отправки команды (с кнопки или просто вводом с клавиатуры) я получаю на вход подобное пустое сообщение:

&{0  <nil> 0 <nil>  <nil> 0   0 false <nil>  0 false    [] <nil> <nil> <nil> [] <nil> <nil> <nil> <nil>  [] <nil> <nil> <nil> <nil> <nil> <nil> []   [] false false false false <nil> 0 0 <nil> <nil> <nil>  <nil> <nil> <nil> <nil> <nil> <nil> <nil>}

После получения программа сразу падает.

Код

func AddTag(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
    if message == nil {
        return
    }
    fmt.Println(message)

    msg := tgbotapi.NewMessage(message.Chat.ID, "Введите цифру:")
    bot.Send(msg)

    inputNumber := 0

    for {
        input := message.Text

        if _, err := strconv.Atoi(input); err == nil {
            inputNumber, _ = strconv.Atoi(input)
            break
        } else {
            errMsg := tgbotapi.NewMessage(message.Chat.ID, "Ошибка! Можно использовать только цифры. Пожалуйста, введите цифру:")
            bot.Send(errMsg)
        }
    }

    responseMsg := tgbotapi.NewMessage(message.Chat.ID, "Вы ввели числовое значение: "+strconv.Itoa(inputNumber))
    bot.Send(responseMsg)
}

func bot_main() {

    bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_APITOKEN"))
    if err != nil {
        log.Panic(err)
    }

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

    updates := bot.GetUpdatesChan(updateConfig)

    for update := range updates {
        if update.Message == nil { // игнорировать сообщения, не являющиеся текстовыми
            continue
        }

        allowed, err := isTelegramIDAllowed(update.Message.Chat.ID)
        if err != nil {
            bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Ты куда зашёл, дружок?"))
            continue
        }

        if !allowed {
            bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Вам не разрешено отправлять сообщения этому боту!"))
            continue
        }

        userID := update.Message.From.ID

        msg := tgbotapi.NewMessage(userID, "Привет, я бот Telegram на Go! Чем могу помочь?")

        switch update.Message.Text {
        case "/start":
            msg.ReplyMarkup = numericKeyboard
        case "Список Тегов":
            msg.ParseMode = "HTML"
            msg.Text = GetTag()
        case "Добавить Тег":
            AddTag(bot, &tgbotapi.Message{})
        case "close":
            msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard(true)
        }

        if _, err := bot.Send(msg); err != nil {
            log.Panic(err)
        }
    }
}

Судя по логу паники. Вызываем через case

case "Добавить Тег":
    AddTag(bot, &tgbotapi.Message{})

Начинает работать AddTag, проходит проверка, fmt вывод сообщение которое пришло на вход и на сл строчке выходит ошибка

func AddTag(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
    if message == nil {
        return
    }
    fmt.Println(message)

    msg := tgbotapi.NewMessage(message.Chat.ID, "Введите цифру:")

Есть еще функция проверки наличия id отправившего в базе, но она нормально отрабатывает. проверку проходит, судя по указанию в ошибки падает именно на входе в функцию AddTag.

Как я понимаю надо как то проигнорировать это сообщения. И от куда оно вообще берется?


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