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
.
Как я понимаю надо как то проигнорировать это сообщения. И от куда оно вообще берется?