(new): rich message support
Golang lint / lint (pull_request) Successful in 1m20s
Golang lint / lint (push) Successful in 4m8s

(fix): runtime reliability
(tests): regression coverage
(doc): v1.1 release notes
This commit is contained in:
2026-08-12 16:34:44 +03:00
parent 48ddf66540
commit f03a081ed6
83 changed files with 6122 additions and 1925 deletions
+216 -17
View File
@@ -10,6 +10,10 @@ type SendMessage struct {
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int64 `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Text string `json:"text"`
ParseMode ParseMode `json:"parse_mode,omitempty"`
@@ -29,7 +33,7 @@ type SendMessage struct {
// Since: Bot API 1.0
// See https://core.telegram.org/bots/api#sendmessage
func (api *API) SendMessage(params SendMessage) (Message, error) {
req := NewRequestWithChatID[Message, SendMessage]("sendMessage", params, params.ChatID)
req := NewRequestWithChatID[Message]("sendMessage", params, params.ChatID)
return req.Do(api)
}
@@ -38,7 +42,7 @@ func (api *API) SendMessage(params SendMessage) (Message, error) {
// It executes the same request but uses ctx for cancellation and deadlines.
// See https://core.telegram.org/bots/api#sendmessage
func (api *API) SendMessageWithContext(ctx context.Context, params SendMessage) (Message, error) {
req := NewRequestWithChatID[Message, SendMessage]("sendMessage", params, params.ChatID)
req := NewRequestWithChatID[Message]("sendMessage", params, params.ChatID)
return req.DoWithContext(ctx, api)
}
@@ -200,6 +204,10 @@ type SendLocation struct {
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
@@ -243,6 +251,10 @@ type SendVenue struct {
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
@@ -288,6 +300,10 @@ type SendContact struct {
ChatID int64 `json:"chat_id"`
MessageThreadID int `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int `json:"direct_messages_topic_id,omitempty"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id,omitempty"` // Since: Bot API 10.2
// CallbackQueryID identifies the callback query that triggered an ephemeral response.
CallbackQueryID string `json:"callback_query_id,omitempty"` // Since: Bot API 10.2
PhoneNumber string `json:"phone_number"`
FirstName string `json:"first_name"`
@@ -551,8 +567,9 @@ type EditMessageText struct {
ParseMode ParseMode `json:"parse_mode,omitempty"`
Entities []MessageEntity `json:"entities,omitempty"`
LinkPreviewOptions *LinkPreviewOptions `json:"link_preview_options,omitempty"`
RichMessage *InputRichMessage `json:"rich_message,omitempty"` // Since: Bot API 10.1; required if Text is not specified
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// RichMessage contains structured rich-message content.
RichMessage *InputRichMessage `json:"rich_message,omitempty"` // Since: Bot API 10.1; required if Text is not specified
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// EditMessageText edits text messages.
@@ -1095,19 +1112,31 @@ func (api *API) DeleteMessageReactionWithContext(ctx context.Context, params Del
// Since: Bot API 10.1
// See https://core.telegram.org/bots/api#sendrichmessage
type SendRichMessage struct {
BusinessConnectionID string `json:"business_connection_id,omitempty"`
ChatID int64 `json:"chat_id"`
MessageThreadID int64 `json:"message_thread_id,omitempty"`
DirectMessagesTopicID int64 `json:"direct_messages_topic_id,omitempty"`
// BusinessConnectionID identifies the business connection used to send the message.
BusinessConnectionID string `json:"business_connection_id,omitempty"`
// ChatID identifies the target chat.
ChatID int64 `json:"chat_id"`
// MessageThreadID identifies the target message thread.
MessageThreadID int64 `json:"message_thread_id,omitempty"`
// DirectMessagesTopicID identifies the target direct-messages topic.
DirectMessagesTopicID int64 `json:"direct_messages_topic_id,omitempty"`
RichMessage InputRichMessage `json:"rich_message"`
DisableNotification bool `json:"disable_notification,omitempty"`
ProtectContent bool `json:"protect_content,omitempty"`
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
MessageEffectID string `json:"message_effect_id,omitempty"`
// RichMessage contains structured rich-message content.
RichMessage InputRichMessage `json:"rich_message"`
// DisableNotification requests delivery without a notification sound.
DisableNotification bool `json:"disable_notification,omitempty"`
// ProtectContent prevents forwarding and saving the sent content.
ProtectContent bool `json:"protect_content,omitempty"`
// AllowPaidBroadcast permits high-throughput delivery using paid broadcast capacity.
AllowPaidBroadcast bool `json:"allow_paid_broadcast,omitempty"`
// MessageEffectID identifies the message effect to apply.
MessageEffectID string `json:"message_effect_id,omitempty"`
// SuggestedPostParameters contains parameters for a suggested channel post.
SuggestedPostParameters *SuggestedPostParameters `json:"suggested_post_parameters,omitempty"`
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
// ReplyParameters describes the message being replied to.
ReplyParameters *ReplyParameters `json:"reply_parameters,omitempty"`
// ReplyMarkup defines the message's inline keyboard.
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
}
// SendRichMessage sends a rich formatted message.
@@ -1131,11 +1160,14 @@ func (api *API) SendRichMessageWithContext(ctx context.Context, params SendRichM
// Since: Bot API 10.1
// See https://core.telegram.org/bots/api#sendrichmessagedraft
type SendRichMessageDraft struct {
ChatID int64 `json:"chat_id"`
// ChatID identifies the target chat.
ChatID int64 `json:"chat_id"`
// MessageThreadID identifies the target message thread.
MessageThreadID int64 `json:"message_thread_id,omitempty"`
// DraftID must be non-zero; changes to drafts with the same identifier are animated.
DraftID int64 `json:"draft_id"`
DraftID int64 `json:"draft_id"`
// RichMessage contains structured rich-message content.
RichMessage InputRichMessage `json:"rich_message"`
}
@@ -1158,3 +1190,170 @@ func (api *API) SendRichMessageDraftWithContext(ctx context.Context, params Send
req := NewRequestWithChatID[bool]("sendRichMessageDraft", params, params.ChatID)
return req.DoWithContext(ctx, api)
}
// EditEphemeralMessageText holds parameters for editing an ephemeral text message.
//
// Since: Bot API 10.2
type EditEphemeralMessageText struct {
// ChatID identifies the target chat.
ChatID int64 `json:"chat_id"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id"`
// EphemeralMessageID identifies the ephemeral message.
EphemeralMessageID int64 `json:"ephemeral_message_id"`
// Text contains the formatted or plain text content.
Text string `json:"text"`
// ParseMode selects the formatting syntax used by the text or caption.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// Entities describes explicit formatting entities in Text.
Entities []MessageEntity `json:"entities,omitempty"`
// LinkPreviewOptions controls link preview generation for Text.
LinkPreviewOptions *LinkPreviewOptions `json:"link_preview_options,omitempty"`
// ReplyMarkup defines the message's inline keyboard.
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
}
// EditEphemeralMessageText edits an ephemeral text message.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageText(params EditEphemeralMessageText) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageText", params, params.ChatID)
return req.Do(api)
}
// EditEphemeralMessageTextWithContext is the context-aware variant of EditEphemeralMessageText.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageTextWithContext(ctx context.Context, params EditEphemeralMessageText) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageText", params, params.ChatID)
return req.DoWithContext(ctx, api)
}
// EditEphemeralMessageMedia holds parameters for editing ephemeral message media.
// New files cannot be uploaded; use a file ID or URL.
//
// Since: Bot API 10.2
type EditEphemeralMessageMedia struct {
// ChatID identifies the target chat.
ChatID int64 `json:"chat_id"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id"`
// EphemeralMessageID identifies the ephemeral message.
EphemeralMessageID int64 `json:"ephemeral_message_id"`
// Media contains or identifies media associated with the value.
Media InputMedia `json:"media"`
// ReplyMarkup defines the message's inline keyboard.
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
}
// EditEphemeralMessageMedia edits the media of an ephemeral message.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageMedia(params EditEphemeralMessageMedia) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageMedia", params, params.ChatID)
return req.Do(api)
}
// EditEphemeralMessageMediaWithContext is the context-aware variant of EditEphemeralMessageMedia.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageMediaWithContext(ctx context.Context, params EditEphemeralMessageMedia) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageMedia", params, params.ChatID)
return req.DoWithContext(ctx, api)
}
// EditEphemeralMessageCaption holds parameters for editing an ephemeral message caption.
//
// Since: Bot API 10.2
type EditEphemeralMessageCaption struct {
// ChatID identifies the target chat.
ChatID int64 `json:"chat_id"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id"`
// EphemeralMessageID identifies the ephemeral message.
EphemeralMessageID int64 `json:"ephemeral_message_id"`
// Caption contains the media or block caption.
Caption string `json:"caption,omitempty"`
// ParseMode selects the formatting syntax used by the text or caption.
ParseMode ParseMode `json:"parse_mode,omitempty"`
// CaptionEntities describes formatting entities in Caption.
CaptionEntities []MessageEntity `json:"caption_entities,omitempty"`
// ReplyMarkup defines the message's inline keyboard.
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
}
// EditEphemeralMessageCaption edits an ephemeral message caption.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageCaption(params EditEphemeralMessageCaption) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageCaption", params, params.ChatID)
return req.Do(api)
}
// EditEphemeralMessageCaptionWithContext is the context-aware variant of EditEphemeralMessageCaption.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageCaptionWithContext(ctx context.Context, params EditEphemeralMessageCaption) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageCaption", params, params.ChatID)
return req.DoWithContext(ctx, api)
}
// EditEphemeralMessageReplyMarkup holds parameters for editing an ephemeral message's inline keyboard.
//
// Since: Bot API 10.2
type EditEphemeralMessageReplyMarkup struct {
// ChatID identifies the target chat.
ChatID int64 `json:"chat_id"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id"`
// EphemeralMessageID identifies the ephemeral message.
EphemeralMessageID int64 `json:"ephemeral_message_id"`
// ReplyMarkup defines the message's inline keyboard.
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
}
// EditEphemeralMessageReplyMarkup edits an ephemeral message's inline keyboard.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageReplyMarkup(params EditEphemeralMessageReplyMarkup) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageReplyMarkup", params, params.ChatID)
return req.Do(api)
}
// EditEphemeralMessageReplyMarkupWithContext is the context-aware variant of EditEphemeralMessageReplyMarkup.
//
// Since: Bot API 10.2
func (api *API) EditEphemeralMessageReplyMarkupWithContext(ctx context.Context, params EditEphemeralMessageReplyMarkup) (bool, error) {
req := NewRequestWithChatID[bool]("editEphemeralMessageReplyMarkup", params, params.ChatID)
return req.DoWithContext(ctx, api)
}
// DeleteEphemeralMessage holds parameters for deleting an ephemeral message.
//
// Since: Bot API 10.2
type DeleteEphemeralMessage struct {
// ChatID identifies the target chat.
ChatID int64 `json:"chat_id"`
// ReceiverUserID identifies the user who can see the ephemeral message.
ReceiverUserID int64 `json:"receiver_user_id"`
// EphemeralMessageID identifies the ephemeral message.
EphemeralMessageID int64 `json:"ephemeral_message_id"`
}
// DeleteEphemeralMessage deletes an ephemeral message.
//
// Since: Bot API 10.2
func (api *API) DeleteEphemeralMessage(params DeleteEphemeralMessage) (bool, error) {
req := NewRequestWithChatID[bool]("deleteEphemeralMessage", params, params.ChatID)
return req.Do(api)
}
// DeleteEphemeralMessageWithContext is the context-aware variant of DeleteEphemeralMessage.
//
// Since: Bot API 10.2
func (api *API) DeleteEphemeralMessageWithContext(ctx context.Context, params DeleteEphemeralMessage) (bool, error) {
req := NewRequestWithChatID[bool]("deleteEphemeralMessage", params, params.ChatID)
return req.DoWithContext(ctx, api)
}