-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmessages.go
More file actions
157 lines (140 loc) · 5.13 KB
/
messages.go
File metadata and controls
157 lines (140 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package maxigo
import (
"context"
"fmt"
"net/http"
"net/url"
"strconv"
"strings"
)
// SendMessage sends a message to a chat.
// Set body.DisableLinkPreview to true to prevent the server from generating link previews.
// Corresponds to POST /messages.
func (c *Client) SendMessage(ctx context.Context, chatID int64, body *NewMessageBody) (*Message, error) {
q := make(url.Values)
if chatID != 0 {
q.Set("chat_id", strconv.FormatInt(chatID, 10))
}
if body != nil && body.DisableLinkPreview {
q.Set("disable_link_preview", "true")
}
var result sendMessageResult
if err := c.do(ctx, "SendMessage", http.MethodPost, "/messages", q, body, &result); err != nil {
return nil, err
}
return &result.Message, nil
}
// SendMessageToUser sends a message directly to a user.
// Set body.DisableLinkPreview to true to prevent the server from generating link previews.
// Corresponds to POST /messages with user_id query parameter.
func (c *Client) SendMessageToUser(ctx context.Context, userID int64, body *NewMessageBody) (*Message, error) {
q := make(url.Values)
q.Set("user_id", strconv.FormatInt(userID, 10))
if body != nil && body.DisableLinkPreview {
q.Set("disable_link_preview", "true")
}
var result sendMessageResult
if err := c.do(ctx, "SendMessageToUser", http.MethodPost, "/messages", q, body, &result); err != nil {
return nil, err
}
return &result.Message, nil
}
// SendMessageToPhones sends a message to users by their phone numbers.
// Phone numbers should be in international format without the "+" prefix
// (e.g., "79001234567"). Only phone numbers registered in Max will receive
// the message. Use [Client.CheckPhoneNumbers] to verify numbers beforehand.
// Corresponds to POST /messages with phone_numbers query parameter.
func (c *Client) SendMessageToPhones(ctx context.Context, phoneNumbers []string, body *NewMessageBody) (*Message, error) {
q := make(url.Values)
q.Set("phone_numbers", strings.Join(phoneNumbers, ","))
if body != nil && body.DisableLinkPreview {
q.Set("disable_link_preview", "true")
}
var result sendMessageResult
if err := c.do(ctx, "SendMessageToPhones", http.MethodPost, "/messages", q, body, &result); err != nil {
return nil, err
}
return &result.Message, nil
}
// EditMessage edits an existing message.
// Corresponds to PUT /messages.
func (c *Client) EditMessage(ctx context.Context, messageID string, body *NewMessageBody) (*SimpleQueryResult, error) {
q := make(url.Values)
q.Set("message_id", messageID)
var result SimpleQueryResult
if err := c.do(ctx, "EditMessage", http.MethodPut, "/messages", q, body, &result); err != nil {
return nil, err
}
return &result, nil
}
// DeleteMessage deletes a message.
// Corresponds to DELETE /messages.
func (c *Client) DeleteMessage(ctx context.Context, messageID string) (*SimpleQueryResult, error) {
q := make(url.Values)
q.Set("message_id", messageID)
var result SimpleQueryResult
if err := c.do(ctx, "DeleteMessage", http.MethodDelete, "/messages", q, nil, &result); err != nil {
return nil, err
}
return &result, nil
}
// GetMessagesOpts holds optional parameters for [Client.GetMessages].
type GetMessagesOpts struct {
// ChatID filters messages by chat. Required unless MessageIDs is set.
ChatID int64
// Count limits the number of returned messages. 0 uses the server default.
Count int
// MessageIDs requests specific messages by their IDs.
MessageIDs []string
// From is the start timestamp (inclusive). Messages are returned in reverse
// chronological order, so From should be greater than To.
From int64
// To is the end timestamp (inclusive).
To int64
}
// GetMessages returns messages from a chat.
// Corresponds to GET /messages.
func (c *Client) GetMessages(ctx context.Context, opts GetMessagesOpts) (*MessageList, error) {
q := make(url.Values)
if opts.ChatID != 0 {
q.Set("chat_id", strconv.FormatInt(opts.ChatID, 10))
}
if opts.Count > 0 {
q.Set("count", strconv.Itoa(opts.Count))
}
if len(opts.MessageIDs) > 0 {
q.Set("message_ids", strings.Join(opts.MessageIDs, ","))
}
if opts.From != 0 {
q.Set("from", strconv.FormatInt(opts.From, 10))
}
if opts.To != 0 {
q.Set("to", strconv.FormatInt(opts.To, 10))
}
var result MessageList
if err := c.do(ctx, "GetMessages", http.MethodGet, "/messages", q, nil, &result); err != nil {
return nil, err
}
return &result, nil
}
// GetMessageByID returns a single message by its identifier.
// Corresponds to GET /messages/{messageId}.
func (c *Client) GetMessageByID(ctx context.Context, messageID string) (*Message, error) {
var result Message
path := fmt.Sprintf("/messages/%s", url.PathEscape(messageID))
if err := c.do(ctx, "GetMessageByID", http.MethodGet, path, nil, nil, &result); err != nil {
return nil, err
}
return &result, nil
}
// AnswerCallback sends a response to a callback button press.
// Corresponds to POST /answers.
func (c *Client) AnswerCallback(ctx context.Context, callbackID string, answer *CallbackAnswer) (*SimpleQueryResult, error) {
q := make(url.Values)
q.Set("callback_id", callbackID)
var result SimpleQueryResult
if err := c.do(ctx, "AnswerCallback", http.MethodPost, "/answers", q, answer, &result); err != nil {
return nil, err
}
return &result, nil
}