From 0a57807db79efce7f6719fbb2c0e0f83fda79aec Mon Sep 17 00:00:00 2001 From: Syfaro Date: Thu, 24 Nov 2016 23:50:35 -0600 Subject: [PATCH] Additional changes for Telegram API updates. --- bot.go | 1 + bot_test.go | 44 +++++++++++++++++++++++++++++++++++++++++--- configs.go | 24 ++++++++++++++++-------- helpers.go | 13 +++++++++++++ types.go | 13 +++++++++++-- 5 files changed, 82 insertions(+), 13 deletions(-) diff --git a/bot.go b/bot.go index fb6deea1..24d7777e 100644 --- a/bot.go +++ b/bot.go @@ -525,6 +525,7 @@ func (bot *BotAPI) AnswerCallbackQuery(config CallbackConfig) (APIResponse, erro if config.URL != "" { v.Add("url", config.URL) } + v.Add("cache_time", strconv.Itoa(config.CacheTime)) bot.debugLog("answerCallbackQuery", v, nil) diff --git a/bot_test.go b/bot_test.go index 3f84d764..3ae19b43 100644 --- a/bot_test.go +++ b/bot_test.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "testing" + "time" ) const ( @@ -25,6 +26,7 @@ func getBot(t *testing.T) (*tgbotapi.BotAPI, error) { bot, err := tgbotapi.NewBotAPI(TestToken) if err != nil { + t.Error(err) t.Fail() } @@ -35,6 +37,7 @@ func TestNewBotAPI_notoken(t *testing.T) { _, err := tgbotapi.NewBotAPI("") if err == nil { + t.Error(err) t.Fail() } } @@ -47,6 +50,7 @@ func TestGetUpdates(t *testing.T) { _, err := bot.GetUpdates(u) if err != nil { + t.Error(err) t.Fail() } } @@ -59,6 +63,7 @@ func TestSendWithMessage(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -71,6 +76,7 @@ func TestSendWithMessageReply(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -82,6 +88,7 @@ func TestSendWithMessageForward(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -94,6 +101,7 @@ func TestSendWithNewPhoto(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -109,6 +117,7 @@ func TestSendWithNewPhotoWithFileBytes(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -124,6 +133,7 @@ func TestSendWithNewPhotoWithFileReader(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -137,6 +147,7 @@ func TestSendWithNewPhotoReply(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -149,6 +160,7 @@ func TestSendWithExistingPhoto(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -160,6 +172,7 @@ func TestSendWithNewDocument(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -171,6 +184,7 @@ func TestSendWithExistingDocument(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -187,6 +201,7 @@ func TestSendWithNewAudio(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -202,6 +217,7 @@ func TestSendWithExistingAudio(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -214,6 +230,7 @@ func TestSendWithNewVoice(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -226,6 +243,7 @@ func TestSendWithExistingVoice(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -236,6 +254,7 @@ func TestSendWithContact(t *testing.T) { contact := tgbotapi.NewContact(ChatID, "5551234567", "Test") if _, err := bot.Send(contact); err != nil { + t.Error(err) t.Fail() } } @@ -246,6 +265,7 @@ func TestSendWithLocation(t *testing.T) { _, err := bot.Send(tgbotapi.NewLocation(ChatID, 40, 40)) if err != nil { + t.Error(err) t.Fail() } } @@ -256,6 +276,7 @@ func TestSendWithVenue(t *testing.T) { venue := tgbotapi.NewVenue(ChatID, "A Test Location", "123 Test Street", 40, 40) if _, err := bot.Send(venue); err != nil { + t.Error(err) t.Fail() } } @@ -270,6 +291,7 @@ func TestSendWithNewVideo(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -284,6 +306,7 @@ func TestSendWithExistingVideo(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -296,6 +319,7 @@ func TestSendWithNewSticker(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -308,6 +332,7 @@ func TestSendWithExistingSticker(t *testing.T) { _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -316,10 +341,11 @@ func TestSendWithNewStickerAndKeyboardHide(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewStickerUpload(ChatID, "tests/image.jpg") - msg.ReplyMarkup = tgbotapi.ReplyKeyboardHide{true, false} + msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{true, false} _, err := bot.Send(msg) if err != nil { + t.Error(err) t.Fail() } } @@ -328,12 +354,12 @@ func TestSendWithExistingStickerAndKeyboardHide(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewStickerShare(ChatID, ExistingStickerFileID) - msg.ReplyMarkup = tgbotapi.ReplyKeyboardHide{true, false} + msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{true, false} _, err := bot.Send(msg) if err != nil { - + t.Error(err) t.Fail() } } @@ -346,6 +372,7 @@ func TestGetFile(t *testing.T) { _, err := bot.GetFile(file) if err != nil { + t.Error(err) t.Fail() } } @@ -356,6 +383,7 @@ func TestSendChatConfig(t *testing.T) { _, err := bot.Send(tgbotapi.NewChatAction(ChatID, tgbotapi.ChatTyping)) if err != nil { + t.Error(err) t.Fail() } } @@ -365,6 +393,7 @@ func TestSendEditMessage(t *testing.T) { msg, err := bot.Send(tgbotapi.NewMessage(ChatID, "Testing editing.")) if err != nil { + t.Error(err) t.Fail() } @@ -378,6 +407,7 @@ func TestSendEditMessage(t *testing.T) { _, err = bot.Send(edit) if err != nil { + t.Error(err) t.Fail() } } @@ -387,6 +417,7 @@ func TestGetUserProfilePhotos(t *testing.T) { _, err := bot.GetUserProfilePhotos(tgbotapi.NewUserProfilePhotos(ChatID)) if err != nil { + t.Error(err) t.Fail() } } @@ -394,11 +425,14 @@ func TestGetUserProfilePhotos(t *testing.T) { func TestSetWebhookWithCert(t *testing.T) { bot, _ := getBot(t) + time.Sleep(time.Second * 2) + bot.RemoveWebhook() wh := tgbotapi.NewWebhookWithCert("https://example.com/tgbotapi-test/"+bot.Token, "tests/cert.pem") _, err := bot.SetWebhook(wh) if err != nil { + t.Error(err) t.Fail() } @@ -408,11 +442,14 @@ func TestSetWebhookWithCert(t *testing.T) { func TestSetWebhookWithoutCert(t *testing.T) { bot, _ := getBot(t) + time.Sleep(time.Second * 2) + bot.RemoveWebhook() wh := tgbotapi.NewWebhook("https://example.com/tgbotapi-test/" + bot.Token) _, err := bot.SetWebhook(wh) if err != nil { + t.Error(err) t.Fail() } @@ -427,6 +464,7 @@ func TestUpdatesChan(t *testing.T) { _, err := bot.GetUpdatesChan(ucfg) if err != nil { + t.Error(err) t.Fail() } } diff --git a/configs.go b/configs.go index 6d09b22c..be8b4e5b 100644 --- a/configs.go +++ b/configs.go @@ -296,6 +296,9 @@ func (config AudioConfig) values() (url.Values, error) { if config.Title != "" { v.Add("title", config.Title) } + if config.Caption != "" { + v.Add("caption", config.Caption) + } return v, nil } @@ -314,6 +317,9 @@ func (config AudioConfig) params() (map[string]string, error) { if config.Title != "" { params["title"] = config.Title } + if config.Caption != "" { + params["caption"] = config.Caption + } return params, nil } @@ -561,13 +567,14 @@ func (config GameConfig) method() string { // SetGameScoreConfig allows you to update the game score in a chat. type SetGameScoreConfig struct { - UserID int - Score int - ChatID int - ChannelUsername string - MessageID int - InlineMessageID string - EditMessage bool + UserID int + Score int + Force bool + DisableEditMessage bool + ChatID int + ChannelUsername string + MessageID int + InlineMessageID string } func (config SetGameScoreConfig) values() (url.Values, error) { @@ -585,7 +592,7 @@ func (config SetGameScoreConfig) values() (url.Values, error) { } else { v.Add("inline_message_id", config.InlineMessageID) } - v.Add("edit_message", strconv.FormatBool(config.EditMessage)) + v.Add("disable_edit_message", strconv.FormatBool(config.DisableEditMessage)) return v, nil } @@ -756,6 +763,7 @@ type CallbackConfig struct { Text string `json:"text"` ShowAlert bool `json:"show_alert"` URL string `json:"url"` + CacheTime int `json:"cache_time"` } // ChatMemberConfig contains information about a user in a chat for use diff --git a/helpers.go b/helpers.go index 53e50052..476eeeb0 100644 --- a/helpers.go +++ b/helpers.go @@ -1,6 +1,7 @@ package tgbotapi import ( + "log" "net/url" ) @@ -20,6 +21,7 @@ func NewMessage(chatID int64, text string) MessageConfig { // NewMessageToChannel creates a new Message that is sent to a channel // by username. +// // username is the username of the channel, text is the message text. func NewMessageToChannel(username string, text string) MessageConfig { return MessageConfig{ @@ -479,12 +481,23 @@ func NewEditMessageReplyMarkup(chatID int64, messageID int, replyMarkup InlineKe // NewHideKeyboard hides the keyboard, with the option for being selective // or hiding for everyone. func NewHideKeyboard(selective bool) ReplyKeyboardHide { + log.Println("NewHideKeyboard is deprecated, please use NewRemoveKeyboard") + return ReplyKeyboardHide{ HideKeyboard: true, Selective: selective, } } +// NewRemoveKeyboard hides the keyboard, with the option for being selective +// or hiding for everyone. +func NewRemoveKeyboard(selective bool) ReplyKeyboardRemove { + return ReplyKeyboardRemove{ + RemoveKeyboard: true, + Selective: selective, + } +} + // NewKeyboardButton creates a regular keyboard button. func NewKeyboardButton(text string) KeyboardButton { return KeyboardButton{ diff --git a/types.go b/types.go index 327bbef2..b43f4a05 100644 --- a/types.go +++ b/types.go @@ -21,8 +21,8 @@ type APIResponse struct { // ResponseParameters are various errors that can be returned in APIResponse. type ResponseParameters struct { - MigrateToChatID int `json:"migrate_to_chat_id"` // optional - RetryAfter int `json:"retry_after"` // optional + MigrateToChatID int64 `json:"migrate_to_chat_id"` // optional + RetryAfter int `json:"retry_after"` // optional } // Update is an update response, from GetUpdates. @@ -30,6 +30,8 @@ type Update struct { UpdateID int `json:"update_id"` Message *Message `json:"message"` EditedMessage *Message `json:"edited_message"` + ChannelPost *Message `json:"channel_post"` + EditedChannelPost *Message `json:"edited_channel_post"` InlineQuery *InlineQuery `json:"inline_query"` ChosenInlineResult *ChosenInlineResult `json:"chosen_inline_result"` CallbackQuery *CallbackQuery `json:"callback_query"` @@ -111,6 +113,7 @@ type Message struct { Chat *Chat `json:"chat"` ForwardFrom *User `json:"forward_from"` // optional ForwardFromChat *Chat `json:"forward_from_chat"` // optional + ForwardFromMessageID int `json:"forward_from_message_id"` // optional ForwardDate int `json:"forward_date"` // optional ReplyToMessage *Message `json:"reply_to_message"` // optional EditDate int `json:"edit_date"` // optional @@ -323,6 +326,12 @@ type ReplyKeyboardHide struct { Selective bool `json:"selective"` // optional } +// ReplyKeyboardRemove allows the Bot to hide a custom keyboard. +type ReplyKeyboardRemove struct { + RemoveKeyboard bool `json:"remove_keyboard"` + Selective bool `json:"selective"` +} + // InlineKeyboardMarkup is a custom keyboard presented for an inline bot. type InlineKeyboardMarkup struct { InlineKeyboard [][]InlineKeyboardButton `json:"inline_keyboard"`