Merge pull request #23 from OvyFlash/bot-api-7.3 Bot API 7.3 implementation
@@ -553,13 +553,13 @@ return err
} // GetChat gets information about a chat. -func (bot *BotAPI) GetChat(config ChatInfoConfig) (Chat, error) { +func (bot *BotAPI) GetChat(config ChatInfoConfig) (ChatFullInfo, error) { resp, err := bot.Request(config) if err != nil { - return Chat{}, err + return ChatFullInfo{}, err } - var chat Chat + var chat ChatFullInfo err = json.Unmarshal(resp.Result, &chat) return chat, err
@@ -933,7 +933,7 @@
func TestPolls(t *testing.T) { bot, _ := getBot(t) - poll := NewPoll(SupergroupChatID, "Are polls working?", "Yes", "No") + poll := NewPoll(SupergroupChatID, "Are polls working?", NewPollOption("Yes"), NewPollOption("No")) msg, err := bot.Send(poll) if err != nil {
@@ -829,6 +829,7 @@ type EditMessageLiveLocationConfig struct {
BaseEdit Latitude float64 // required Longitude float64 // required + LivePeriod int //optional HorizontalAccuracy float64 // optional Heading int // optional ProximityAlertRadius int // optional@@ -841,6 +842,7 @@ params.AddNonZeroFloat("latitude", config.Latitude)
params.AddNonZeroFloat("longitude", config.Longitude) params.AddNonZeroFloat("horizontal_accuracy", config.HorizontalAccuracy) params.AddNonZero("heading", config.Heading) + params.AddNonZero("live_period", config.LivePeriod) params.AddNonZero("proximity_alert_radius", config.ProximityAlertRadius) return params, err@@ -924,7 +926,9 @@ // SendPollConfig allows you to send a poll.
type SendPollConfig struct { BaseChat Question string - Options []string + QuestionParseMode string // optional + QuestionEntities []MessageEntity // optional + Options []InputPollOption IsAnonymous bool Type string AllowsMultipleAnswers bool@@ -944,6 +948,10 @@ return params, err
} params["question"] = config.Question + params.AddNonEmpty("question_parse_mode", config.QuestionParseMode) + if err = params.AddInterface("question_entities", config.QuestionEntities); err != nil { + return params, err + } if err = params.AddInterface("options", config.Options); err != nil { return params, err }
@@ -933,7 +933,7 @@ }
} // NewPoll allows you to create a new poll. -func NewPoll(chatID int64, question string, options ...string) SendPollConfig { +func NewPoll(chatID int64, question string, options ...InputPollOption) SendPollConfig { return SendPollConfig{ BaseChat: BaseChat{ ChatConfig: ChatConfig{ChatID: chatID},@@ -941,6 +941,13 @@ },
Question: question, Options: options, IsAnonymous: true, // This is Telegram's default. + } +} + +// NewPollOption allows you to create poll option +func NewPollOption(text string) InputPollOption { + return InputPollOption{ + Text: text, } }
@@ -311,6 +311,11 @@ // IsForum is true if the supergroup chat is a forum (has topics enabled)
// // optional IsForum bool `json:"is_forum,omitempty"` +} + +// ChatFullInfo contains full information about a chat. +type ChatFullInfo struct { + Chat // Photo is a chat photo Photo *ChatPhoto `json:"photo"` // If non-empty, the list of all active chat usernames;@@ -355,6 +360,8 @@ // Always returned in getChat.
// // optional AccentColorID int `json:"accent_color_id,omitempty"` + // The maximum number of reactions that can be set on a message in the chat + MaxReactionCount int `json:"max_reaction_count"` // BackgroundCustomEmojiID is a custom emoji identifier of emoji chosen by // the chat for the reply header and link preview background. // Returned only in getChat.@@ -833,6 +840,10 @@ // BoostAdded is a service message: user boosted the chat
// // optional BoostAdded *ChatBoostAdded `json:"boost_added,omitempty"` + // Service message: chat background set + // + // optional + ChatBackgroundSet *ChatBackground `json:"chat_background_set,omitempty"` // ForumTopicCreated is a service message: forum topic created // // optional@@ -1528,10 +1539,31 @@ // PollOption contains information about one answer option in a poll.
type PollOption struct { // Text is the option text, 1-100 characters Text string `json:"text"` + // Special entities that appear in the option text. + // Currently, only custom emoji entities are allowed in poll option texts + // + // optional + TextEntities []MessageEntity `json:"text_entities,omitempty"` // VoterCount is the number of users that voted for this option VoterCount int `json:"voter_count"` } +// InputPollOption contains information about one answer option in a poll to send. +type InputPollOption struct { + // Option text, 1-100 characters + Text string `json:"text"` + // Mode for parsing entities in the text. See formatting options for more details. + // Currently, only custom emoji entities are allowed + // + // optional + TextParseMode string `json:"text_parse_mode,omitempty"` + // A JSON-serialized list of special entities that appear in the poll option text. + // It can be specified instead of text_parse_mode + // + // optional + TextEntities []MessageEntity `json:"text_entities,omitempty"` +} + // PollAnswer represents an answer of a user in a non-anonymous poll. type PollAnswer struct { // PollID is the unique poll identifier@@ -1557,6 +1589,11 @@ // ID is the unique poll identifier
ID string `json:"id"` // Question is the poll question, 1-255 characters Question string `json:"question"` + // Special entities that appear in the question. + // Currently, only custom emoji entities are allowed in poll questions + // + // optional + QuestionEntities []MessageEntity `json:"question_entities,omitempty"` // Options is the list of poll options Options []PollOption `json:"options"` // TotalVoterCount is the total numbers of users who voted in the poll@@ -1610,6 +1647,7 @@ // optional
HorizontalAccuracy float64 `json:"horizontal_accuracy,omitempty"` // LivePeriod is time relative to the message sending date, during which the // location can be updated, in seconds. For active live locations only. + // Use 0x7FFFFFFF (2147483647 - max positive Int) to edit indefinitely // // optional LivePeriod int `json:"live_period,omitempty"`@@ -1684,6 +1722,86 @@ // BoostCount is a number of boosts added by the user
BoostCount int `json:"boost_count"` } +// BackgroundFill describes the way a background is filled based on the selected colors. +// Currently, it can be one of: +// - BackgroundFillSolid +// - BackgroundFillGradient +// - BackgroundFillFreeformGradient +type BackgroundFill struct { + // Type of the background fill, can be: + // - solid + // - gradient + // - freeform_gradient + Type string `json:"type"` + // BackgroundFillSolid only. + // The color of the background fill in the RGB24 format + Color int `json:"color"` + // BackgroundFillGradient only. + // Top color of the gradient in the RGB24 format + TopColor int `json:"top_color"` + // BackgroundFillGradient only. + // Bottom color of the gradient in the RGB24 format + BottomColor int `json:"bottom_color"` + // BackgroundFillGradient only. + // Clockwise rotation angle of the background fill in degrees; 0-359 + RotationAngle int `json:"rotation_angle"` + // BackgroundFillFreeformGradient only. + // A list of the 3 or 4 base colors that are used to generate the freeform gradient in the RGB24 format + Colors []int `json:"colors"` +} + +// BackgroundType describes the type of a background. Currently, it can be one of: +// - BackgroundTypeFill +// - BackgroundTypeWallpaper +// - BackgroundTypePattern +// - BackgroundTypeChatTheme +type BackgroundType struct { + // Type of the background. + // Currently, it can be one of: + // - fill + // - wallpaper + // - pattern + // - chat_theme + Type string `json:"type"` + // BackgroundTypeFill and BackgroundTypePattern only. + // The background fill or fill that is combined with the pattern + Fill BackgroundFill `json:"fill"` + // BackgroundTypeFill and BackgroundTypeWallpaper only. + // Dimming of the background in dark themes, as a percentage; 0-100 + DarkThemeDimming int `json:"dark_theme_dimming"` + // BackgroundTypeWallpaper and BackgroundTypePattern only. + // Document with the wallpaper / pattern + Document Document `json:"document"` + // BackgroundTypeWallpaper only. + // True, if the wallpaper is downscaled to fit in a 450x450 square and then box-blurred with radius 12 + // + // optional + IsBlurred bool `json:"is_blurred,omitempty"` + // BackgroundTypeWallpaper and BackgroundTypePattern only. + // True, if the background moves slightly when the device is tilted + // + // optional + IsMoving bool `json:"is_moving,omitempty"` + // BackgroundTypePattern only. + // Intensity of the pattern when it is shown above the filled background; 0-100 + Intensity int `json:"intensity"` + // BackgroundTypePattern only. + // True, if the background fill must be applied only to the pattern itself. + // All other pixels are black in this case. For dark themes only + // + // optional + IsInverted bool `json:"is_inverted,omitempty"` + // BackgroundTypeChatTheme only. + // Name of the chat theme, which is usually an emoji + ThemeName string `json:"theme_name"` +} + +// ChatBackground represents a chat background. +type ChatBackground struct { + // Type of the background + Type BackgroundType `json:"type"` +} + // ForumTopicCreated represents a service message about a new forum topic // created in the chat. type ForumTopicCreated struct {@@ -2702,6 +2820,12 @@ // for joining by invite link events only.
// // optional InviteLink *ChatInviteLink `json:"invite_link,omitempty"` + // ViaJoinRequest is true, if the user joined the chat + // after sending a direct join request + // and being approved by an administrator + // + // optional + ViaJoinRequest bool `json:"via_join_request,omitempty"` // ViaChatFolderInviteLink is True, if the user joined the chat // via a chat folder invite link //