Additional changes for Telegram API updates.

bot-api-6.1
Syfaro 2016-11-24 23:50:35 -06:00
parent f3a33ae6f1
commit 0a57807db7
5 changed files with 82 additions and 13 deletions

1
bot.go
View File

@ -525,6 +525,7 @@ func (bot *BotAPI) AnswerCallbackQuery(config CallbackConfig) (APIResponse, erro
if config.URL != "" { if config.URL != "" {
v.Add("url", config.URL) v.Add("url", config.URL)
} }
v.Add("cache_time", strconv.Itoa(config.CacheTime))
bot.debugLog("answerCallbackQuery", v, nil) bot.debugLog("answerCallbackQuery", v, nil)

View File

@ -7,6 +7,7 @@ import (
"net/http" "net/http"
"os" "os"
"testing" "testing"
"time"
) )
const ( const (
@ -25,6 +26,7 @@ func getBot(t *testing.T) (*tgbotapi.BotAPI, error) {
bot, err := tgbotapi.NewBotAPI(TestToken) bot, err := tgbotapi.NewBotAPI(TestToken)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
@ -35,6 +37,7 @@ func TestNewBotAPI_notoken(t *testing.T) {
_, err := tgbotapi.NewBotAPI("") _, err := tgbotapi.NewBotAPI("")
if err == nil { if err == nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -47,6 +50,7 @@ func TestGetUpdates(t *testing.T) {
_, err := bot.GetUpdates(u) _, err := bot.GetUpdates(u)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -59,6 +63,7 @@ func TestSendWithMessage(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -71,6 +76,7 @@ func TestSendWithMessageReply(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -82,6 +88,7 @@ func TestSendWithMessageForward(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -94,6 +101,7 @@ func TestSendWithNewPhoto(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -109,6 +117,7 @@ func TestSendWithNewPhotoWithFileBytes(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -124,6 +133,7 @@ func TestSendWithNewPhotoWithFileReader(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -137,6 +147,7 @@ func TestSendWithNewPhotoReply(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -149,6 +160,7 @@ func TestSendWithExistingPhoto(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -160,6 +172,7 @@ func TestSendWithNewDocument(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -171,6 +184,7 @@ func TestSendWithExistingDocument(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -187,6 +201,7 @@ func TestSendWithNewAudio(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -202,6 +217,7 @@ func TestSendWithExistingAudio(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -214,6 +230,7 @@ func TestSendWithNewVoice(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -226,6 +243,7 @@ func TestSendWithExistingVoice(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -236,6 +254,7 @@ func TestSendWithContact(t *testing.T) {
contact := tgbotapi.NewContact(ChatID, "5551234567", "Test") contact := tgbotapi.NewContact(ChatID, "5551234567", "Test")
if _, err := bot.Send(contact); err != nil { if _, err := bot.Send(contact); err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -246,6 +265,7 @@ func TestSendWithLocation(t *testing.T) {
_, err := bot.Send(tgbotapi.NewLocation(ChatID, 40, 40)) _, err := bot.Send(tgbotapi.NewLocation(ChatID, 40, 40))
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -256,6 +276,7 @@ func TestSendWithVenue(t *testing.T) {
venue := tgbotapi.NewVenue(ChatID, "A Test Location", "123 Test Street", 40, 40) venue := tgbotapi.NewVenue(ChatID, "A Test Location", "123 Test Street", 40, 40)
if _, err := bot.Send(venue); err != nil { if _, err := bot.Send(venue); err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -270,6 +291,7 @@ func TestSendWithNewVideo(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -284,6 +306,7 @@ func TestSendWithExistingVideo(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -296,6 +319,7 @@ func TestSendWithNewSticker(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -308,6 +332,7 @@ func TestSendWithExistingSticker(t *testing.T) {
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -316,10 +341,11 @@ func TestSendWithNewStickerAndKeyboardHide(t *testing.T) {
bot, _ := getBot(t) bot, _ := getBot(t)
msg := tgbotapi.NewStickerUpload(ChatID, "tests/image.jpg") msg := tgbotapi.NewStickerUpload(ChatID, "tests/image.jpg")
msg.ReplyMarkup = tgbotapi.ReplyKeyboardHide{true, false} msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{true, false}
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -328,12 +354,12 @@ func TestSendWithExistingStickerAndKeyboardHide(t *testing.T) {
bot, _ := getBot(t) bot, _ := getBot(t)
msg := tgbotapi.NewStickerShare(ChatID, ExistingStickerFileID) msg := tgbotapi.NewStickerShare(ChatID, ExistingStickerFileID)
msg.ReplyMarkup = tgbotapi.ReplyKeyboardHide{true, false} msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{true, false}
_, err := bot.Send(msg) _, err := bot.Send(msg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -346,6 +372,7 @@ func TestGetFile(t *testing.T) {
_, err := bot.GetFile(file) _, err := bot.GetFile(file)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -356,6 +383,7 @@ func TestSendChatConfig(t *testing.T) {
_, err := bot.Send(tgbotapi.NewChatAction(ChatID, tgbotapi.ChatTyping)) _, err := bot.Send(tgbotapi.NewChatAction(ChatID, tgbotapi.ChatTyping))
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -365,6 +393,7 @@ func TestSendEditMessage(t *testing.T) {
msg, err := bot.Send(tgbotapi.NewMessage(ChatID, "Testing editing.")) msg, err := bot.Send(tgbotapi.NewMessage(ChatID, "Testing editing."))
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
@ -378,6 +407,7 @@ func TestSendEditMessage(t *testing.T) {
_, err = bot.Send(edit) _, err = bot.Send(edit)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -387,6 +417,7 @@ func TestGetUserProfilePhotos(t *testing.T) {
_, err := bot.GetUserProfilePhotos(tgbotapi.NewUserProfilePhotos(ChatID)) _, err := bot.GetUserProfilePhotos(tgbotapi.NewUserProfilePhotos(ChatID))
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }
@ -394,11 +425,14 @@ func TestGetUserProfilePhotos(t *testing.T) {
func TestSetWebhookWithCert(t *testing.T) { func TestSetWebhookWithCert(t *testing.T) {
bot, _ := getBot(t) bot, _ := getBot(t)
time.Sleep(time.Second * 2)
bot.RemoveWebhook() bot.RemoveWebhook()
wh := tgbotapi.NewWebhookWithCert("https://example.com/tgbotapi-test/"+bot.Token, "tests/cert.pem") wh := tgbotapi.NewWebhookWithCert("https://example.com/tgbotapi-test/"+bot.Token, "tests/cert.pem")
_, err := bot.SetWebhook(wh) _, err := bot.SetWebhook(wh)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
@ -408,11 +442,14 @@ func TestSetWebhookWithCert(t *testing.T) {
func TestSetWebhookWithoutCert(t *testing.T) { func TestSetWebhookWithoutCert(t *testing.T) {
bot, _ := getBot(t) bot, _ := getBot(t)
time.Sleep(time.Second * 2)
bot.RemoveWebhook() bot.RemoveWebhook()
wh := tgbotapi.NewWebhook("https://example.com/tgbotapi-test/" + bot.Token) wh := tgbotapi.NewWebhook("https://example.com/tgbotapi-test/" + bot.Token)
_, err := bot.SetWebhook(wh) _, err := bot.SetWebhook(wh)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
@ -427,6 +464,7 @@ func TestUpdatesChan(t *testing.T) {
_, err := bot.GetUpdatesChan(ucfg) _, err := bot.GetUpdatesChan(ucfg)
if err != nil { if err != nil {
t.Error(err)
t.Fail() t.Fail()
} }
} }

View File

@ -296,6 +296,9 @@ func (config AudioConfig) values() (url.Values, error) {
if config.Title != "" { if config.Title != "" {
v.Add("title", config.Title) v.Add("title", config.Title)
} }
if config.Caption != "" {
v.Add("caption", config.Caption)
}
return v, nil return v, nil
} }
@ -314,6 +317,9 @@ func (config AudioConfig) params() (map[string]string, error) {
if config.Title != "" { if config.Title != "" {
params["title"] = config.Title params["title"] = config.Title
} }
if config.Caption != "" {
params["caption"] = config.Caption
}
return params, nil return params, nil
} }
@ -561,13 +567,14 @@ func (config GameConfig) method() string {
// SetGameScoreConfig allows you to update the game score in a chat. // SetGameScoreConfig allows you to update the game score in a chat.
type SetGameScoreConfig struct { type SetGameScoreConfig struct {
UserID int UserID int
Score int Score int
ChatID int Force bool
ChannelUsername string DisableEditMessage bool
MessageID int ChatID int
InlineMessageID string ChannelUsername string
EditMessage bool MessageID int
InlineMessageID string
} }
func (config SetGameScoreConfig) values() (url.Values, error) { func (config SetGameScoreConfig) values() (url.Values, error) {
@ -585,7 +592,7 @@ func (config SetGameScoreConfig) values() (url.Values, error) {
} else { } else {
v.Add("inline_message_id", config.InlineMessageID) 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 return v, nil
} }
@ -756,6 +763,7 @@ type CallbackConfig struct {
Text string `json:"text"` Text string `json:"text"`
ShowAlert bool `json:"show_alert"` ShowAlert bool `json:"show_alert"`
URL string `json:"url"` URL string `json:"url"`
CacheTime int `json:"cache_time"`
} }
// ChatMemberConfig contains information about a user in a chat for use // ChatMemberConfig contains information about a user in a chat for use

View File

@ -1,6 +1,7 @@
package tgbotapi package tgbotapi
import ( import (
"log"
"net/url" "net/url"
) )
@ -20,6 +21,7 @@ func NewMessage(chatID int64, text string) MessageConfig {
// NewMessageToChannel creates a new Message that is sent to a channel // NewMessageToChannel creates a new Message that is sent to a channel
// by username. // by username.
//
// username is the username of the channel, text is the message text. // username is the username of the channel, text is the message text.
func NewMessageToChannel(username string, text string) MessageConfig { func NewMessageToChannel(username string, text string) MessageConfig {
return 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 // NewHideKeyboard hides the keyboard, with the option for being selective
// or hiding for everyone. // or hiding for everyone.
func NewHideKeyboard(selective bool) ReplyKeyboardHide { func NewHideKeyboard(selective bool) ReplyKeyboardHide {
log.Println("NewHideKeyboard is deprecated, please use NewRemoveKeyboard")
return ReplyKeyboardHide{ return ReplyKeyboardHide{
HideKeyboard: true, HideKeyboard: true,
Selective: selective, 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. // NewKeyboardButton creates a regular keyboard button.
func NewKeyboardButton(text string) KeyboardButton { func NewKeyboardButton(text string) KeyboardButton {
return KeyboardButton{ return KeyboardButton{

View File

@ -21,8 +21,8 @@ type APIResponse struct {
// ResponseParameters are various errors that can be returned in APIResponse. // ResponseParameters are various errors that can be returned in APIResponse.
type ResponseParameters struct { type ResponseParameters struct {
MigrateToChatID int `json:"migrate_to_chat_id"` // optional MigrateToChatID int64 `json:"migrate_to_chat_id"` // optional
RetryAfter int `json:"retry_after"` // optional RetryAfter int `json:"retry_after"` // optional
} }
// Update is an update response, from GetUpdates. // Update is an update response, from GetUpdates.
@ -30,6 +30,8 @@ type Update struct {
UpdateID int `json:"update_id"` UpdateID int `json:"update_id"`
Message *Message `json:"message"` Message *Message `json:"message"`
EditedMessage *Message `json:"edited_message"` EditedMessage *Message `json:"edited_message"`
ChannelPost *Message `json:"channel_post"`
EditedChannelPost *Message `json:"edited_channel_post"`
InlineQuery *InlineQuery `json:"inline_query"` InlineQuery *InlineQuery `json:"inline_query"`
ChosenInlineResult *ChosenInlineResult `json:"chosen_inline_result"` ChosenInlineResult *ChosenInlineResult `json:"chosen_inline_result"`
CallbackQuery *CallbackQuery `json:"callback_query"` CallbackQuery *CallbackQuery `json:"callback_query"`
@ -111,6 +113,7 @@ type Message struct {
Chat *Chat `json:"chat"` Chat *Chat `json:"chat"`
ForwardFrom *User `json:"forward_from"` // optional ForwardFrom *User `json:"forward_from"` // optional
ForwardFromChat *Chat `json:"forward_from_chat"` // optional ForwardFromChat *Chat `json:"forward_from_chat"` // optional
ForwardFromMessageID int `json:"forward_from_message_id"` // optional
ForwardDate int `json:"forward_date"` // optional ForwardDate int `json:"forward_date"` // optional
ReplyToMessage *Message `json:"reply_to_message"` // optional ReplyToMessage *Message `json:"reply_to_message"` // optional
EditDate int `json:"edit_date"` // optional EditDate int `json:"edit_date"` // optional
@ -323,6 +326,12 @@ type ReplyKeyboardHide struct {
Selective bool `json:"selective"` // optional 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. // InlineKeyboardMarkup is a custom keyboard presented for an inline bot.
type InlineKeyboardMarkup struct { type InlineKeyboardMarkup struct {
InlineKeyboard [][]InlineKeyboardButton `json:"inline_keyboard"` InlineKeyboard [][]InlineKeyboardButton `json:"inline_keyboard"`