Skip to content

Commit fd052b7

Browse files
committed
feat: forward message, copy message methods
1 parent a8c8320 commit fd052b7

15 files changed

+335
-1
lines changed

chat_action.go

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package telebot

chat_action_func.go

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package telebot
2+
3+
func (b *bot) SendChatAction(recipient Recipient, action ChatAction) error {
4+
params := sendChatActionRequest{
5+
ChatID: recipient.Recipient(),
6+
Action: action,
7+
}
8+
9+
_, err := b.sendMethodRequest(methodSendChatAction, params)
10+
return err
11+
}

chat_action_type.go

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package telebot
2+
3+
type ChatAction string
4+
5+
const (
6+
ChatTyping ChatAction = "typing"
7+
ChatUploadPhoto ChatAction = "upload_photo"
8+
ChatRecordVideo ChatAction = "record_video"
9+
ChatUploadVideo ChatAction = "upload_video"
10+
ChatRecordVoice ChatAction = "record_voice"
11+
ChatUploadVoice ChatAction = "upload_voice"
12+
ChatActionUploadDocument ChatAction = "upload_document"
13+
ChatActionChooseSticker ChatAction = "choose_sticker"
14+
ChatActionFindLocation ChatAction = "find_location"
15+
ChatActionRecordVideoNote ChatAction = "record_video_note"
16+
ChatActionUploadVideoNote ChatAction = "upload_video_note"
17+
)
18+
19+
type sendChatActionRequest struct {
20+
ChatID string `json:"chat_id"`
21+
Action ChatAction `json:"action"`
22+
}

forward.go

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package telebot

forward_func.go

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package telebot
2+
3+
import (
4+
"encoding/json"
5+
)
6+
7+
func (b *bot) Forward(to Recipient, From Recipient, messageID int, opts ...any) (*Message, error) {
8+
params := forwardMessageRequest{
9+
ChatID: to.Recipient(),
10+
FromChat: From.Recipient(),
11+
MessageID: messageID,
12+
}
13+
14+
for _, opt := range opts {
15+
switch v := opt.(type) {
16+
case Option:
17+
switch v {
18+
case Silent:
19+
params.DisableNotification = toPtr(true)
20+
case Protected:
21+
params.Protect = toPtr(true)
22+
}
23+
case *MessageThreadID:
24+
params.MessageThreadID = v
25+
}
26+
}
27+
28+
req, err := b.sendMethodRequest(methodForwardMessage, params)
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
var resp struct {
34+
Result Message
35+
}
36+
if err = json.Unmarshal(req, &resp); err != nil {
37+
return nil, err
38+
}
39+
40+
return &resp.Result, nil
41+
}
42+
43+
func (b *bot) Forwards(to Recipient, From Recipient, messageIDs []int, opts ...any) ([]int, error) {
44+
params := forwardMessageRequest{
45+
ChatID: to.Recipient(),
46+
FromChat: From.Recipient(),
47+
MessageIDs: messageIDs,
48+
}
49+
50+
for _, opt := range opts {
51+
switch v := opt.(type) {
52+
case Option:
53+
switch v {
54+
case Silent:
55+
params.DisableNotification = toPtr(true)
56+
case Protected:
57+
params.Protect = toPtr(true)
58+
}
59+
case *MessageThreadID:
60+
params.MessageThreadID = v
61+
}
62+
}
63+
64+
req, err := b.sendMethodRequest(methodForwardMessages, params)
65+
if err != nil {
66+
return nil, err
67+
}
68+
69+
var resp struct {
70+
Result []int
71+
}
72+
if err = json.Unmarshal(req, &resp); err != nil {
73+
return nil, err
74+
}
75+
76+
return resp.Result, nil
77+
}
78+
79+
func (b *bot) Copy(to Recipient, from Recipient, messageIDs []int, opts ...any) ([]int, error) {
80+
params := copyMessageRequest{
81+
ChatID: to.Recipient(),
82+
FromChat: from.Recipient(),
83+
MessageIDs: messageIDs,
84+
}
85+
86+
for _, opt := range opts {
87+
switch v := opt.(type) {
88+
case Option:
89+
switch v {
90+
case Silent:
91+
params.DisableNotification = toPtr(true)
92+
case Protected:
93+
params.Protect = toPtr(true)
94+
case RemoveCaption:
95+
params.RemoveCaption = toPtr(true)
96+
}
97+
case *MessageThreadID:
98+
params.MessageThreadID = v
99+
}
100+
}
101+
102+
req, err := b.sendMethodRequest(methodCopyMessages, params)
103+
if err != nil {
104+
return nil, err
105+
}
106+
107+
var resp struct {
108+
Result []int
109+
}
110+
111+
if err = json.Unmarshal(req, &resp); err != nil {
112+
return nil, err
113+
}
114+
115+
return resp.Result, nil
116+
}

forward_type.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package telebot
2+
3+
type MessageThreadID int
4+
5+
type forwardMessageRequest struct {
6+
ChatID any `json:"chat_id"`
7+
FromChat string `json:"from_chat_id"`
8+
MessageID int `json:"message_id,omitempty"`
9+
MessageIDs []int `json:"message_ids,omitempty"`
10+
MessageThreadID *MessageThreadID `json:"message_thread_id,omitempty"`
11+
Protect *bool `json:"protect_content,omitempty"`
12+
DisableNotification *bool `json:"disable_notification,omitempty"`
13+
}
14+
15+
type copyMessageRequest struct {
16+
ChatID any `json:"chat_id"`
17+
FromChat string `json:"from_chat_id"`
18+
MessageID int `json:"message_id,omitempty"`
19+
MessageIDs []int `json:"message_ids,omitempty"`
20+
MessageThreadID *MessageThreadID `json:"message_thread_id,omitempty"`
21+
22+
Caption *string `json:"caption,omitempty"`
23+
RemoveCaption *bool `json:"remove_caption,omitempty"`
24+
ParseMode *ParseMode `json:"parse_mode,omitempty"`
25+
CaptionEntities []Entity `json:"caption_entities,omitempty"`
26+
DisableNotification *bool `json:"disable_notification,omitempty"`
27+
Protect *bool `json:"protect_content,omitempty"`
28+
ReplyParams *ReplyParameters `json:"reply_parameters,omitempty"`
29+
ReplyMarkup *ReplyMarkup `json:"reply_markup,omitempty"`
30+
}

http_client_type.go

+3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ const (
1818
methodStopMessageLiveLocation
1919
methodEditMessageReplyMarkup
2020
methodStopPoll
21+
methodDeleteMessage
2122
methodDeleteMessages
23+
methodForwardMessage
2224
methodForwardMessages
25+
methodCopyMessage
2326
methodCopyMessages
2427
methodSendPhoto
2528
methodSendAudio

message_func.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type sendMessageParams struct {
1616
Text string `json:"text" validate:"required,max=4096"`
1717

1818
// ParseMode is the mode for parsing entities in the message text. See formatting options for more details.
19-
ParseMode *string `json:"parse_mode,omitempty"`
19+
ParseMode *ParseMode `json:"parse_mode,omitempty"`
2020

2121
// Entities is a JSON-serialized list of special entities that appear in message text,
2222
// which can be specified instead of ParseMode.

message_type.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package telebot
2+
3+
type ParseMode string
4+
5+
const (
6+
ParseModeDefault = ""
7+
ParseModeMarkdown = "Markdown"
8+
ParseModeMarkdownV2 = "MarkdownV2"
9+
ParseModeHTML = "HTML"
10+
)

options.go

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const (
3737

3838
// HasSpoiler = SendOptions.HasSpoiler
3939
HasSpoiler
40+
41+
RemoveCaption
4042
)
4143

4244
// Placeholder is used to set input field placeholder as a send option.

reaction.go

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package telebot

reaction_func.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package telebot
2+
3+
import "errors"
4+
5+
func (b *bot) SetMessageReaction(chatId Recipient, messageID int, options ...any) error {
6+
params := setMessageReactionRequest{
7+
ChatID: chatId.Recipient(),
8+
MessageID: messageID,
9+
Reaction: []ReactionType{},
10+
}
11+
12+
for _, option := range options {
13+
switch value := option.(type) {
14+
case ReactionType:
15+
params.Reaction = append(params.Reaction, value)
16+
break
17+
case []ReactionType:
18+
params.Reaction = append(params.Reaction, value...)
19+
break
20+
case bool:
21+
params.IsBig = value
22+
default:
23+
return errors.New("telebot: invalid option type for SetMessageReaction method")
24+
}
25+
}
26+
27+
_, err := b.sendMethodRequest(methodSetMessageReaction, params)
28+
return err
29+
}

reaction_type.go

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package telebot
2+
3+
type Emoji string
4+
5+
const (
6+
EmojiLike Emoji = "👍"
7+
EmojiDislike Emoji = "👎"
8+
EmojiHeart Emoji = "❤"
9+
EmojiFire Emoji = "🔥"
10+
EmojiLove Emoji = "🥰"
11+
EmojiClap Emoji = "👏"
12+
EmojiSmile Emoji = "😁"
13+
EmojiThink Emoji = "🤔"
14+
EmojiMindBlown Emoji = "🤯"
15+
EmojiScream Emoji = "😱"
16+
EmojiAngry Emoji = "🤬"
17+
EmojiCry Emoji = "😢"
18+
EmojiParty Emoji = "🎉"
19+
EmojiExcited Emoji = "🤩"
20+
EmojiVomit Emoji = "🤮"
21+
EmojiPoop Emoji = "💩"
22+
EmojiPray Emoji = "🙏"
23+
EmojiOk Emoji = "👌"
24+
EmojiDove Emoji = "🕊"
25+
EmojiClown Emoji = "🤡"
26+
EmojiYawn Emoji = "🥱"
27+
EmojiDrunk Emoji = "🥴"
28+
EmojiHeartEyes Emoji = "😍"
29+
EmojiDolphin Emoji = "🐳"
30+
EmojiHeartFire Emoji = "❤‍🔥"
31+
EmojiMoon Emoji = "🌚"
32+
EmojiHotdog Emoji = "🌭"
33+
EmojiHundred Emoji = "💯"
34+
EmojiLaugh Emoji = "🤣"
35+
EmojiLightning Emoji = "⚡"
36+
EmojiBanana Emoji = "🍌"
37+
EmojiTrophy Emoji = "🏆"
38+
EmojiBroken Emoji = "💔"
39+
EmojiSkeptical Emoji = "🤨"
40+
EmojiNeutral Emoji = "😐"
41+
EmojiStrawberry Emoji = "🍓"
42+
EmojiChampagne Emoji = "🍾"
43+
EmojiKiss Emoji = "💋"
44+
EmojiFuckYou Emoji = "🖕"
45+
EmojiEvil Emoji = "😈"
46+
EmojiSleep Emoji = "😴"
47+
EmojiCrying Emoji = "😭"
48+
EmojiNerd Emoji = "🤓"
49+
EmojiGhost Emoji = "👻"
50+
EmojiComputer Emoji = "👨‍💻"
51+
EmojiEyes Emoji = "👀"
52+
EmojiJackO Emoji = "🎃"
53+
EmojiSeeNoEvil Emoji = "🙈"
54+
EmojiAngel Emoji = "😇"
55+
EmojiFearful Emoji = "😨"
56+
EmojiHandshake Emoji = "🤝"
57+
EmojiWriting Emoji = "✍"
58+
EmojiHugging Emoji = "🤗"
59+
EmojiSmiling Emoji = "🫡"
60+
EmojiSanta Emoji = "🎅"
61+
EmojiChristmas Emoji = "🎄"
62+
EmojiSnowman Emoji = "☃"
63+
EmojiNailPolish Emoji = "💅"
64+
EmojiZany Emoji = "🤪"
65+
EmojiMoai Emoji = "🗿"
66+
EmojiCool Emoji = "🆒"
67+
EmojiHearts Emoji = "💘"
68+
EmojiHearNoEvil Emoji = "🙉"
69+
EmojiUnicorn Emoji = "🦄"
70+
EmojiKissing Emoji = "😘"
71+
EmojiPill Emoji = "💊"
72+
EmojiSayNoEvil Emoji = "🙊"
73+
EmojiSunglasses Emoji = "😎"
74+
EmojiAlien Emoji = "👾"
75+
EmojiMan Emoji = "🤷‍♂"
76+
EmojiWoman Emoji = "🤷"
77+
EmojiWoman2 Emoji = "🤷‍♀"
78+
EmojiAngry2 Emoji = "😡"
79+
)
80+
81+
type ReactionTypeType string
82+
83+
const (
84+
ReactionTypeTypeEmoji ReactionTypeType = "emoji"
85+
ReactionTypeTypeCustomEmoji ReactionTypeType = "custom_emoji"
86+
)
87+
88+
type ReactionType struct {
89+
Type ReactionTypeType `json:"type"`
90+
Emoji Emoji `json:"emoji,omitempty"`
91+
CustomEmojiID string `json:"custom_emoji_id,omitempty"`
92+
}
93+
94+
type setMessageReactionRequest struct {
95+
ChatID any `json:"chat_id"`
96+
MessageID int `json:"message_id"`
97+
Reaction []ReactionType `json:"reaction,omitempty"`
98+
IsBig bool `json:"is_big,omitempty"`
99+
}

telebot_type.go

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ type Bot interface {
3434
// SendMessage sends a text message.
3535
SendMessage(recipient Recipient, text string, options ...Option) (*Message, error)
3636

37+
SendChatAction(recipient Recipient, action ChatAction) error
38+
39+
SetMessageReaction(recipient Recipient, messageID int, options ...any) error
40+
3741
GetFile(fileID string) (*File, error)
3842

3943
GetUserProfilePhotos(userID int64, offset, limit int) (*UserProfilePhotos, error)

util.go

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package telebot
2+
3+
func toPtr[T any](v T) *T {
4+
return &v
5+
}

0 commit comments

Comments
 (0)