Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,182 @@ func (bot *BotAPI) Send(c Chattable) (Message, error) {
return message, err
}

// DeleteMessage deletes a message
func (bot *BotAPI) DeleteMessage(chatID int64, messageID int) error {
req := NewDeleteMessage(chatID, messageID)
_, err := bot.Request(req)
return err
}
Comment on lines +307 to +312

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please keep the deletion facade, but make it config-based so it remains consistent with the rest of BotAPI and preserves the full existing request contract. Both Telegram methods return Boolean results, and the existing single/batch config pair should have a symmetric typed facade.

Suggested change
// DeleteMessage deletes a message
func (bot *BotAPI) DeleteMessage(chatID int64, messageID int) error {
req := NewDeleteMessage(chatID, messageID)
_, err := bot.Request(req)
return err
}
// DeleteMessage deletes a message.
func (bot *BotAPI) DeleteMessage(config DeleteMessageConfig) (bool, error) {
return bot.requestBool(config)
}
// DeleteMessages deletes multiple messages in the same chat.
func (bot *BotAPI) DeleteMessages(config DeleteMessagesConfig) (bool, error) {
return bot.requestBool(config)
}


func (bot *BotAPI) EditMessageText(chatID int64, messageID int, text string) (Message, error) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These primitive signatures are not consistent with the library interface. For non-inline edits, bot.Send(EditMessage*Config) already provides the typed Message path; inline edits use Request because Telegram returns True instead of a Message. These wrappers duplicate helper constructors while discarding ChannelUsername/SuperGroupUsername, BusinessConnectionID, InlineMessageID, parse mode, entities, rich content, link preview options, and optional markup. They also create multiple BotAPI methods (Photo, Video, Audio, etc.) for the single Telegram editMessageMedia endpoint, while the rest of the typed surface is organized around endpoint configs. Please remove this family from the PR, or introduce it separately as one config-based facade per Telegram endpoint with an explicit Message | True result and tests for both variants. A complete endpoint-level design would also need to account for the existing live-location edit configs.

req := NewEditMessageText(chatID, messageID, text)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageReplyMarkup(chatID int64, messageID int, replyMarkup InlineKeyboardMarkup) (Message, error) {
req := NewEditMessageReplyMarkup(chatID, messageID, replyMarkup)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageMedia(chatID int64, messageID int, media InputMedia) (Message, error) {
req := NewEditMessageMedia(chatID, messageID, media)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageMediaAndMarkup(chatID int64, messageID int, media InputMedia, replyMarkup InlineKeyboardMarkup) (Message, error) {
req := NewEditMessageMediaAndMarkup(chatID, messageID, media, replyMarkup)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessagePhoto(chatID int64, messageID int, media InputMediaPhoto) (Message, error) {
req := NewEditMessagePhoto(chatID, messageID, media)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageVideo(chatID int64, messageID int, media InputMediaVideo) (Message, error) {
req := NewEditMessageVideo(chatID, messageID, media)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageAnimation(chatID int64, messageID int, media InputMediaAnimation) (Message, error) {
req := NewEditMessageAnimation(chatID, messageID, media)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageAudio(chatID int64, messageID int, media InputMediaAudio) (Message, error) {
req := NewEditMessageAudio(chatID, messageID, media)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageDocument(chatID int64, messageID int, media InputMediaDocument) (Message, error) {
req := NewEditMessageDocument(chatID, messageID, media)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageCaption(chatID int64, messageID int, caption string) (Message, error) {
req := NewEditMessageCaption(chatID, messageID, caption)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageTextAndMarkup(chatID int64, messageID int, text string, replyMarkup InlineKeyboardMarkup) (Message, error) {
req := NewEditMessageTextAndMarkup(chatID, messageID, text, replyMarkup)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageCaptionAndMarkup(chatID int64, messageID int, caption string, replyMarkup InlineKeyboardMarkup) (Message, error) {
req := NewEditMessageCaptionAndMarkup(chatID, messageID, caption, replyMarkup)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) EditMessageChecklist(chatID int64, messageID int, checklist InputChecklist) (Message, error) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

editMessageChecklist requires business_connection_id, but this method calls NewEditMessageChecklist(chatID, messageID, checklist), which does not set it, and the primitive signature offers no way to supply it. As written, the facade cannot construct a valid Telegram request. If this facade is kept, it should accept EditMessageChecklistConfig and return (Message, error); the config preserves the required business connection and optional reply markup.

req := NewEditMessageChecklist(chatID, messageID, checklist)
resp, err := bot.Request(req)
if err != nil {
return Message{}, err
}

var message Message
err = json.Unmarshal(resp.Result, &message)

return message, err
}

func (bot *BotAPI) requestBool(c Chattable) (bool, error) {
resp, err := bot.Request(c)
if err != nil {
Expand Down
32 changes: 32 additions & 0 deletions helper_methods.go
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,22 @@ func NewEditMessageMedia(chatID int64, messageID int, inputMedia InputMedia) Edi
}
}

// NewEditMessageMediaAndMarkup allows you to edit media and keyboard content of a message
func NewEditMessageMediaAndMarkup(chatID int64, messageID int, inputMedia InputMedia, replyMarkup InlineKeyboardMarkup) EditMessageMediaConfig {
return EditMessageMediaConfig{
BaseEdit: BaseEdit{
BaseChatMessage: BaseChatMessage{
ChatConfig: ChatConfig{
ChatID: chatID,
},
MessageID: messageID,
},
ReplyMarkup: &replyMarkup,
},
Media: inputMedia,
}
}

// NewEditMessagePhoto allows you to edit the photo content of a message.
func NewEditMessagePhoto(chatID int64, messageID int, inputPhoto InputMediaPhoto) EditMessageMediaConfig {
return NewEditMessageMedia(chatID, messageID, &inputPhoto)
Expand Down Expand Up @@ -895,6 +911,22 @@ func NewEditMessageCaption(chatID int64, messageID int, caption string) EditMess
}
}

// NewEditMessageCaptionAndMarkup allows you to edit the caption and reply markup of a message.
func NewEditMessageCaptionAndMarkup(chatID int64, messageID int, caption string, replyMarkup InlineKeyboardMarkup) EditMessageCaptionConfig {
return EditMessageCaptionConfig{
BaseEdit: BaseEdit{
BaseChatMessage: BaseChatMessage{
ChatConfig: ChatConfig{
ChatID: chatID,
},
MessageID: messageID,
},
ReplyMarkup: &replyMarkup,
},
Caption: caption,
}
}

// NewEditMessageReplyMarkup allows you to edit the inline
// keyboard markup.
func NewEditMessageReplyMarkup(chatID int64, messageID int, replyMarkup InlineKeyboardMarkup) EditMessageReplyMarkupConfig {
Expand Down
10 changes: 7 additions & 3 deletions helper_structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,14 @@ func (edit BaseEdit) params() (Params, error) {
}
params.Merge(p1)
}
if edit.ReplyMarkup != nil {
err := params.AddInterface("reply_markup", edit.ReplyMarkup)
if err != nil {
return params, err
}
}

err := params.AddInterface("reply_markup", edit.ReplyMarkup)

return params, err
return params, nil
}

// BaseEphemeralMessage identifies an ephemeral message received by a user.
Expand Down