diff --git a/bot.go b/bot.go index e6c2cc8..65f6755 100644 --- a/bot.go +++ b/bot.go @@ -552,18 +552,23 @@ func (bot *BotAPI) ListenForWebhook(pattern string) UpdatesChannel { ch := make(chan Update, bot.Buffer) http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { - bytes, _ := ioutil.ReadAll(r.Body) - r.Body.Close() - - var update Update - json.Unmarshal(bytes, &update) - - ch <- update + ch <- bot.HandleUpdate(w, r) }) return ch } +// HandleUpdate parses and returns update received via webhook +func (bot *BotAPI) HandleUpdate(res http.ResponseWriter, req *http.Request) Update { + bytes, _ := ioutil.ReadAll(req.Body) + req.Body.Close() + + var update Update + json.Unmarshal(bytes, &update) + + return update +} + // AnswerInlineQuery sends a response to an inline query. // // Note that you must respond to an inline query within 30 seconds. diff --git a/bot_test.go b/bot_test.go index 60f3e65..2e9d07a 100644 --- a/bot_test.go +++ b/bot_test.go @@ -593,6 +593,35 @@ func ExampleNewWebhook() { } } +func ExampleWebhookHandler() { + bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") + if err != nil { + log.Fatal(err) + } + + bot.Debug = true + + log.Printf("Authorized on account %s", bot.Self.UserName) + + _, err = bot.SetWebhook(tgbotapi.NewWebhookWithCert("https://www.google.com:8443/"+bot.Token, "cert.pem")) + if err != nil { + log.Fatal(err) + } + info, err := bot.GetWebhookInfo() + if err != nil { + log.Fatal(err) + } + if info.LastErrorDate != 0 { + log.Printf("[Telegram callback failed]%s", info.LastErrorMessage) + } + + http.HandleFunc("/" + bot.Token, func(w http.ResponseWriter, r *http.Request) { + log.Printf("%+v\n", bot.HandleUpdate(w, r)) + }) + + go http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil) +} + func ExampleAnswerInlineQuery() { bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") // create new bot if err != nil {