Petr
Fastumkruk
Доброе утро всем)
Fastumkruk
var message = update.Message.Text if strings.Index(message, "/start") != -1 { msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Сообщение") buttons := tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("Тестовая кнопка", "data"), ), ) msg.ReplyMarkup = buttons bot.Send(msg) } // Как обработать сообщение Inline ?
Владимир
Например, вот так: https://github.com/fat0troll/i2_bot/blob/master/lib/router/inline.go
Владимир
if update.InlineQuery != nil { results := make([]interface{}, 0) article := tgbotapi.NewInlineQueryResultArticle("0", "Команда боту @PokememBroBot:", "/me") article.Description = "Получить статистику" results = append(results, article) inlineConf := tgbotapi.InlineConfig{ InlineQueryID: update.InlineQuery.ID, IsPersonal: true, CacheTime: 0, Results: results, } _, err = bot.AnswerInlineQuery(inlineConf) if err != nil { log.Error(err.Error()) } }
Kirill
@toby3d помогёшь людям?
Maxim
@toby3d помогёшь людям?
Ну, по мере возможностей. А что?
Владимир
При нажатии этой кнопки, в update.InlineQuery пусто.
какой update приходит в ответ на нажатие кнопки (и приходит ли вообще?)
Maxim
@toby3d помогёшь людям?
Куда помогать?
Владимир
Просто пусто.
Ну у вас должен быть update.CallbackQuery != nil или update.InlineQuery != nil
Kirill
Куда помогать?
выше чувак бота пишет, похоже. судя по всему, к сожалению, не на твоей либе
Maxim
Обп пустые
Как соединение открываете?
Maxim
Что в параметрах GetUpdates?
Kirill
пошла жара 🙃
Владимир
выше чувак бота пишет, похоже. судя по всему, к сожалению, не на твоей либе
а чем отличается либа от @toby3d и вот эта → https://github.com/go-telegram-bot-api/telegram-bot-api?
Владимир
Эта устарела, официально
можно ссылку на вашу?
Maxim
можно ссылку на вашу?
https://github.com/toby3d/telegram
Fastumkruk
Что в параметрах GetUpdates?
func Bot() { proxyUrl, err := url.Parse("http://user:123456@1.18.2.4:23690") myClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} bot, err := tgbotapi.NewBotAPIWithClient(BotToken, myClient) //, myClient if err != nil { panic(err) } bot.Debug = false u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates, err := bot.GetUpdatesChan(u) if err != nil { panic("Update Bot") } for update := range updates { if update.Message == nil { continue } var message = update.Message.Text if strings.Index(message, "/start") != -1 { msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Сообщение") buttons := tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("Тестовая кнопка", "data"), ), ) msg.ReplyMarkup = buttons bot.Send(msg) } } //for updates }
Владимир
https://github.com/toby3d/telegram
благодарю, оставил в закладках, использую для следующего телеграм-бота
Kirill
так, коллеги, скидываете больше двух-трех строк - пользуйтесь gist.github.com или play.golang.org. лучше последним.
Maxim
так, коллеги, скидываете больше двух-трех строк - пользуйтесь gist.github.com или play.golang.org. лучше последним.
В крайнем случае оборачивать в соответствующие форматирующие теги телеги
Fastumkruk
Ну, такое... Какие обновления прилетают?
Обычные сообщения, нормально обрабатываються.
Maxim
Обычные сообщения, нормально обрабатываються.
Так, что отправляете, какого результата ждёте, что для этого делаете?
Maxim
Без кода, в двух словах
Fastumkruk
Без кода, в двух словах
Делаю инлайн кнопку, не получаеться обработать ее нажатие.
Fastumkruk
Выше код скидывал, кнопка приходит
Maxim
В цикле обновлений кейс telegram.CallbackQuery != nil присутствуетт?
Fastumkruk
В цикле обновлений кейс telegram.CallbackQuery != nil присутствуетт?
for update := range updates { if update.Message == nil { continue } Я так понимаю, только для обычных обновлений этот цикл. * В какие теги прятать код?
Kirill
три вот таких тега
Kirill
это многострочный
Maxim
Лучше юзать switch для множественных кейсов: for update := range updates { switch { case update.Message != nil: // Пришло обычное сообщение case update.CallbackQuery != nil: // Пришло событие кнопки default: // Пришло какое-то иное обновление, рисуем его кишочки в консоли log.Printf("%#v", update) } }
Maxim
%#v
Да, сорян
Maxim
%#v
Забыл обернуть, кстати :В
Kirill
Забыл обернуть, кстати :В
Я думал удалить сообщение, как ты поправишь
Fastumkruk
@Fastumkruk хоть подайте знак какой
Я разбираюсь, смотрю, код правлю.
Fastumkruk
@Fastumkruk хоть подайте знак какой
for update := range updates { switch { case update.Message != nil: // Пришло обычное сообщение case update.InlineQuery != nil: //update.InlineQuery тут теперь не пусто // Пришло событие кнопки default: // Пришло какое-то иное обновление, рисуем его кишочки в консоли log.Printf("%#v", update) } Но при попытке обработать инлайн апдэйт, получаю panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x58 pc=0x619663]
Fastumkruk
Указатель на какой-то участок кода есть в логах паники?
var message = update.Message.Text тут ошибка panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x58 pc=0x619663]
Fastumkruk
Раньше небыло ее
Maxim
var message = update.Message.Text тут ошибка panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x58 pc=0x619663]
Скорее всего пытаетесь получить поле текста из Message, который в этот момент nil
Fastumkruk
Скорее всего пытаетесь получить поле текста из Message, который в этот момент nil
Закоментил эту строку и все что с ней связанно, оставил только обработку inline. Теперь не падает. Но не то что надо.
Maxim
Событие нажатия кнопки приходит, верно?
Maxim
Вы хотите её перехватывать и что-то делать, насколько я понял
Fastumkruk
Вы хотите её перехватывать и что-то делать, насколько я понял
Верно, но нужно что бы обычне команды тоже работали.
Maxim
Обычные команды идут в update.Message. События кнопок - в update.CallbackQuery
Maxim
На всякий случай отмечу что это два кардинально разных обновления и обрабатывая одно обновление нельзя что-то получить из соседнего
Maxim
Т.е. если пришло событиие кнопки, то обновление сообщения будет пустым. Что, как бэ, логично
Maxim
Вы ограничены только в пределах того типа обновлений что вы получили в данной итерации цикла
Maxim
switch { case update.Message != nil: msg := update.Message // в этом кейсе работаете только с msg case update.CallbackQuery != nil: call := update.CallbackQuery // в этом кейсе работаете только с call }
Maxim
update.CallbackQuery - Пусто тут)
И должно быть пусто, если приходят обычные сообщения
Fastumkruk
И должно быть пусто, если приходят обычные сообщения
И не должно быть пусто, когда жмякаешь инлайн кнопку) Скорее всего я где то, что то не углядел. Я думаю, что получил достаточно информации, что бы самостоятельно продолжить) спасибо)
Maxim
И не должно быть пусто, когда жмякаешь инлайн кнопку) Скорее всего я где то, что то не углядел. Я думаю, что получил достаточно информации, что бы самостоятельно продолжить) спасибо)
Напоследок - попробуйте при создании канала с обновлениями явно указать в параметрах GetUpdates в поле AllowedUpdates например: ["message", "edited_channel_post", "callback_query"]
Maxim
Остальные типы обновлений кроме указанных в параметре просто не будут приходить. Возможно вы где-то потеряли "callback_query"
Maxim
Ваша сильно отличаеться?
Не сравнивал, если честно
Fastumkruk
Хорошо, спасибо за ответы.
Władimir (Zae)
а как ребутать систему так чтобы данные не терялись? например у меня есть сервер на который я отправляю настройки и он их парсит и пишет в файл, а после этого шлю запрос на ребут. если я шлю запрос через секунду после записи мои записанные настройки в файл не применяются, версия файла остается старой
Władimir (Zae)
ребутаю так https://play.golang.org/p/AMTBAVtCj9P
Władimir (Zae)
?