diff --git a/const.go b/const.go index 00e4eb1..b47233b 100644 --- a/const.go +++ b/const.go @@ -3,7 +3,7 @@ package telegram import "github.com/Masterminds/semver" // Version represents current version of Telegram API supported by this package -var Version = semver.MustParse("4.6.0") //nolint: gochecknoglobals +var Version = semver.MustParse("4.7.0") //nolint: gochecknoglobals // Action represents available and supported status actions of bot const ( @@ -82,6 +82,7 @@ const ( MethodGetFile string = "getFile" MethodGetGameHighScores string = "getGameHighScores" MethodGetMe string = "getMe" + MethodGetMyCommands string = "getMyCommands" MethodGetStickerSet string = "getStickerSet" MethodGetUpdates string = "getUpdates" MethodGetUserProfilePhotos string = "getUserProfilePhotos" @@ -95,6 +96,7 @@ const ( MethodSendAudio string = "sendAudio" MethodSendChatAction string = "sendChatAction" MethodSendContact string = "sendContact" + MethodSendDice string = "sendDice" MethodSendDocument string = "sendDocument" MethodSendGame string = "sendGame" MethodSendInvoice string = "sendInvoice" @@ -115,8 +117,10 @@ const ( MethodSetChatStickerSet string = "setChatStickerSet" MethodSetChatTitle string = "setChatTitle" MethodSetGameScore string = "setGameScore" + MethodSetMyCommands string = "setMyCommands" MethodSetPassportDataErrors string = "setPassportDataErrors" MethodSetStickerPositionInSet string = "setStickerPositionInSet" + MethodSetStickerSetThumb string = "setStickerSetThumb" MethodSetWebhook string = "setWebhook" MethodStopMessageLiveLocation string = "stopMessageLiveLocation" MethodStopPoll string = "stopPoll" diff --git a/methods.go b/methods.go index aac31b7..ee0a669 100644 --- a/methods.go +++ b/methods.go @@ -432,7 +432,22 @@ type ( ReplyMarkup ReplyMarkup `json:"reply_markup,omitempty"` } - // SendChatAction represents data for SendChatAction method. + // SendDice represents data for SendDice method. + SendDice struct { + // Unique identifier for the target chat or username of the target channel (in the format @channelusername) + ChatID int64 `json:"chat_id"` + + // Sends the message silently. Users will receive a notification with no sound. + DisableNotification bool `json:"disable_notification,omitempty"` + + // If the message is a reply, ID of the original message + ReplyToMessageID int `json:"reply_to_message_id,omitempty"` + + // Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user. + ReplyMarkup ReplyMarkup `json:"reply_markup,omitempty"` + } + + // SendChatAction represents data for SendChat method. SendChatAction struct { // Unique identifier for the target chat ChatID int64 `json:"chat_id"` @@ -672,6 +687,13 @@ type ( // The maximum amount of time in seconds that the result of the callback query may be cached client-side. Telegram apps will support caching starting in version 3.14. Defaults to 0. CacheTime int `json:"cache_time,omitempty"` } + + // SetMyCommands represents data for SetMyCommands method. + SetMyCommands struct { + // A JSON-serialized list of bot commands to be set as the list of the bot's commands. At most 100 + // commands can be specified. + Commands []*BotCommand `json:"commands"` + } ) // GetMe testing your bot's auth token. Returns basic information about the bot in form of a User object. @@ -1343,6 +1365,28 @@ func (b Bot) SendPoll(p SendPoll) (*Message, error) { return result, nil } +// SendDice send a dice, which will have a random value from 1 to 6. On success, the sent Message is returned. (Yes, +// we're aware of the “proper” singular of die. But it's awkward, and we decided to help it change. One dice at a +// time!) +func (b Bot) SendDice(p SendDice) (*Message, error) { + src, err := b.Do(MethodSendDice, p) + if err != nil { + return nil, err + } + + resp := new(Response) + if err = b.marshler.Unmarshal(src, resp); err != nil { + return nil, err + } + + result := new(Message) + if err = b.marshler.Unmarshal(resp.Result, &result); err != nil { + return nil, err + } + + return result, nil +} + // SendChatAction tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns True on success. // // We only recommend using this method when a response from the bot will take a noticeable amount of time to arrive. @@ -1874,3 +1918,44 @@ func (b Bot) AnswerCallbackQuery(p AnswerCallbackQuery) (bool, error) { return result, nil } + +// SetMyCommands change the list of the bot's commands. Returns True on success. +func (b Bot) SetMyCommands(p SetMyCommands) (bool, error) { + src, err := b.Do(MethodSetMyCommands, p) + if err != nil { + return false, err + } + + resp := new(Response) + if err = b.marshler.Unmarshal(src, resp); err != nil { + return false, err + } + + var result bool + if err = b.marshler.Unmarshal(resp.Result, &result); err != nil { + return false, err + } + + return result, nil +} + +// GetMyCommands get the current list of the bot's commands. Requires no parameters. Returns Array of BotCommand on +// success. +func (b Bot) GetMyCommands() ([]*BotCommand, error) { + src, err := b.Do(MethodGetMyCommands, nil) + if err != nil { + return nil, err + } + + resp := new(Response) + if err = b.marshler.Unmarshal(src, resp); err != nil { + return nil, err + } + + var result []*BotCommand + if err = b.marshler.Unmarshal(resp.Result, &result); err != nil { + return nil, err + } + + return result, nil +} diff --git a/stickers.go b/stickers.go index a52720f..de00861 100644 --- a/stickers.go +++ b/stickers.go @@ -55,6 +55,9 @@ type ( // true, if the sticker set contains animated stickers IsAnimated bool `json:"is_animated"` + + // Sticker set thumbnail in the .WEBP or .TGS format + Thumb *PhotoSize `json:"thumb,omitempty"` } // MaskPosition describes the position on faces where a mask should be placed by default. @@ -114,8 +117,12 @@ type ( // Sticker set title, 1-64 characters Title string `json:"title"` - // Png image with the sticker, must be up to 512 kilobytes in size, dimensions must not exceed 512px, and either width or height must be exactly 512px. Pass a file_id as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. - PNGSticker *InputFile `json:"png_sticker"` + // PNG image with the sticker, must be up to 512 kilobytes in size, dimensions must not exceed 512px, and either width or height must be exactly 512px. Pass a file_id as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. + PNGSticker *InputFile `json:"png_sticker,omitempty"` + + // TGS animation with the sticker, uploaded using multipart/form-data. + // See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements + TGSSticker *InputFile `json:"tgs_sticker,omitempty"` // One or more emoji corresponding to the sticker Emojis string `json:"emojis"` @@ -134,9 +141,13 @@ type ( // Sticker set name Name string `json:"name"` - // Png image with the sticker, must be up to 512 kilobytes in size, dimensions must not exceed 512px, and either width or height must be exactly 512px. Pass a file_id as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. More info on Sending Files » + // PNG image with the sticker, must be up to 512 kilobytes in size, dimensions must not exceed 512px, and either width or height must be exactly 512px. Pass a file_id as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. More info on Sending Files » PNGSticker *InputFile `json:"png_sticker"` + // TGS animation with the sticker, uploaded using multipart/form-data. + // See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements + TGSSticker *InputFile `json:"tgs_sticker,omitempty"` + // One or more emoji corresponding to the sticker Emojis string `json:"emojis"` @@ -158,6 +169,24 @@ type ( // File identifier of the sticker Sticker string `json:"sticker"` } + + // SetStickerSetThumb represents data for SetStickerSetThumb method. + SetStickerSetThumb struct { + // Sticker set name + Name string `json:"name"` + + // User identifier of the sticker set owner + UserID int `json:"user_id"` + + // A PNG image with the thumbnail, must be up to 128 kilobytes in size and have width and height + // exactly 100px, or a TGS animation with the thumbnail up to 32 kilobytes in size; + // see https://core.telegram.org/animated_stickers#technical-requirements for animated sticker + // technical requirements. Pass a file_id as a String to send a file that already exists on the + // Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or + // upload a new one using multipart/form-data. More info on Sending Files ». Animated sticker set + // thumbnail can't be uploaded via HTTP URL. + Thumb *InputFile `json:"thumb,omitempty"` + } ) func NewSticker(chatID int64, sticker *InputFile) SendSticker { @@ -368,6 +397,41 @@ func (b *Bot) DeleteStickerFromSet(sticker string) (bool, error) { return result, nil } +// SetStickerSetThumb set the thumbnail of a sticker set. Animated thumbnails can be set for animated sticker sets +// only. Returns True on success. +func (b *Bot) SetStickerSetThumb(p SetStickerSetThumb) (bool, error) { + params := make(map[string]string) + params["name"] = p.Name + params["user_id"] = strconv.Itoa(p.UserID) + + var err error + if params["thumb"], err = b.marshler.MarshalToString(p.Thumb); err != nil { + return false, err + } + + files := make([]*InputFile, 0) + if p.Thumb.IsAttachment() { + files = append(files, p.Thumb) + } + + src, err := b.Upload(MethodSetStickerSetThumb, params, files...) + if err != nil { + return false, err + } + + resp := new(Response) + if err = b.marshler.Unmarshal(src, resp); err != nil { + return false, err + } + + var result bool + if err = b.marshler.Unmarshal(resp.Result, &result); err != nil { + return false, err + } + + return result, nil +} + // InSet checks that the current sticker in the stickers set. func (s Sticker) InSet() bool { return s.SetName != "" } diff --git a/types.go b/types.go index 813362c..7bf65d8 100644 --- a/types.go +++ b/types.go @@ -191,6 +191,9 @@ type ( // Message is a native poll, information about the poll Poll *Poll `json:"poll,omitempty"` + // Message is a dice with random value from 1 to 6 + Dice *Dice `json:"dice,omitempty"` + // New members that were added to the group or supergroup and information about them (the bot itself may be one of these members) NewChatMembers []*User `json:"new_chat_members,omitempty"` @@ -520,6 +523,13 @@ type ( CorrectOptionID int `json:"correct_option_id,omitempty"` } + // Dice represents a dice with random value from 1 to 6. (Yes, we're aware of the “proper” singular of die. + // But it's awkward, and we decided to help it change. One dice at a time!) + Dice struct { + // Value of the dice, 1-6 + Value int `json:"value"` + } + // UserProfilePhotos represent a user's profile pictures. UserProfilePhotos struct { // Total number of profile pictures the target user has @@ -772,6 +782,16 @@ type ( CanPinMessages bool `json:"can_pin_messages,omitempty"` } + // BotCommand represents a bot command. + BotCommand struct { + // Text of the command, 1-32 characters. Can contain only lowercase English letters, digits and + // underscores. + Command string `json:"command"` + + // Description of the command, 3-256 characters. + Description string `json:"description"` + } + // ResponseParameters contains information about why a request was unsuccessful. ResponseParameters struct { // The group has been migrated to a supergroup with the specified identifier. @@ -1192,6 +1212,8 @@ func (m Message) IsEvent() bool { m.IsSupergroupChatCreatedEvent() || m.IsNewChatPhotoEvent() } +func (m Message) IsDice() bool { return m.Dice != nil } + // IsBold checks that the current entity is a bold tag. func (e MessageEntity) IsBold() bool { return strings.EqualFold(e.Type, EntityBold) }