all repos — telegram-bot-api @ 653939995c6ca92d40a9aa0cdad74378c598dd67

Golang bindings for the Telegram Bot API

configs.go (view raw)

  1package tgbotapi
  2
  3import (
  4	"encoding/json"
  5	"io"
  6	"net/url"
  7	"strconv"
  8)
  9
 10// Telegram constants
 11const (
 12	// APIEndpoint is the endpoint for all API methods, with formatting for Sprintf
 13	APIEndpoint = "https://api.telegram.org/bot%s/%s"
 14	// FileEndpoint is the endpoint for downloading a file from Telegram
 15	FileEndpoint = "https://api.telegram.org/file/bot%s/%s"
 16)
 17
 18// Constant values for ChatActions
 19const (
 20	ChatTyping         = "typing"
 21	ChatUploadPhoto    = "upload_photo"
 22	ChatRecordVideo    = "record_video"
 23	ChatUploadVideo    = "upload_video"
 24	ChatRecordAudio    = "record_audio"
 25	ChatUploadAudio    = "upload_audio"
 26	ChatUploadDocument = "upload_document"
 27	ChatFindLocation   = "find_location"
 28)
 29
 30// API errors
 31const (
 32	// APIForbidden happens when a token is bad
 33	APIForbidden = "forbidden"
 34)
 35
 36// Constant values for ParseMode in MessageConfig
 37const (
 38	ModeMarkdown = "Markdown"
 39)
 40
 41type Chattable interface {
 42	Values() (url.Values, error)
 43	Method() string
 44}
 45
 46type Fileable interface {
 47	Chattable
 48	Params() (map[string]string, error)
 49	Name() string
 50	GetFile() interface{}
 51	UseExistingFile() bool
 52}
 53
 54// Base struct for all chat event(Message, Photo and so on)
 55type BaseChat struct {
 56	ChatID           int
 57	ChannelUsername  string
 58	ReplyToMessageID int
 59	ReplyMarkup      interface{}
 60}
 61
 62func (chat *BaseChat) Values() (url.Values, error) {
 63	v := url.Values{}
 64	if chat.ChannelUsername != "" {
 65		v.Add("chat_id", chat.ChannelUsername)
 66	} else {
 67		v.Add("chat_id", strconv.Itoa(chat.ChatID))
 68	}
 69
 70	if chat.ReplyToMessageID != 0 {
 71		v.Add("reply_to_message_id", strconv.Itoa(chat.ReplyToMessageID))
 72	}
 73
 74	if chat.ReplyMarkup != nil {
 75		data, err := json.Marshal(chat.ReplyMarkup)
 76		if err != nil {
 77			return v, err
 78		}
 79
 80		v.Add("reply_markup", string(data))
 81	}
 82
 83	return v, nil
 84}
 85
 86type BaseFile struct {
 87	BaseChat
 88	FilePath    string
 89	File        interface{}
 90	FileID      string
 91	UseExisting bool
 92}
 93
 94func (file BaseFile) Params() (map[string]string, error) {
 95	params := make(map[string]string)
 96
 97	if file.ChannelUsername != "" {
 98		params["chat_id"] = file.ChannelUsername
 99	} else {
100		params["chat_id"] = strconv.Itoa(file.ChatID)
101	}
102
103	if file.ReplyToMessageID != 0 {
104		params["reply_to_message_id"] = strconv.Itoa(file.ReplyToMessageID)
105	}
106
107	if file.ReplyMarkup != nil {
108		data, err := json.Marshal(file.ReplyMarkup)
109		if err != nil {
110			return params, err
111		}
112
113		params["reply_markup"] = string(data)
114	}
115
116	return params, nil
117}
118
119func (file BaseFile) GetFile() interface{} {
120	var result interface{}
121	if file.FilePath == "" {
122		result = file.File
123	} else {
124		result = file.FilePath
125	}
126
127	return result
128}
129
130func (file BaseFile) UseExistingFile() bool {
131	return file.UseExisting
132}
133
134// MessageConfig contains information about a SendMessage request.
135type MessageConfig struct {
136	BaseChat
137	Text                  string
138	ParseMode             string
139	DisableWebPagePreview bool
140	ReplyMarkup           interface{}
141}
142
143func (config MessageConfig) Values() (url.Values, error) {
144	v, _ := config.BaseChat.Values()
145	v.Add("text", config.Text)
146	v.Add("disable_web_page_preview", strconv.FormatBool(config.DisableWebPagePreview))
147	if config.ParseMode != "" {
148		v.Add("parse_mode", config.ParseMode)
149	}
150
151	return v, nil
152}
153
154func (config MessageConfig) Method() string {
155	return "SendMessage"
156}
157
158// ForwardConfig contains information about a ForwardMessage request.
159type ForwardConfig struct {
160	BaseChat
161	FromChatID          int
162	FromChannelUsername string
163	MessageID           int
164}
165
166func (config ForwardConfig) Values() (url.Values, error) {
167	v, _ := config.BaseChat.Values()
168	v.Add("from_chat_id", strconv.Itoa(config.FromChatID))
169	v.Add("message_id", strconv.Itoa(config.MessageID))
170	return v, nil
171}
172
173func (config ForwardConfig) Method() string {
174	return "forwardMessage"
175}
176
177// PhotoConfig contains information about a SendPhoto request.
178type PhotoConfig struct {
179	BaseFile
180	Caption string
181}
182
183func (config PhotoConfig) Params() (map[string]string, error) {
184	params, _ := config.BaseFile.Params()
185
186	if config.Caption != "" {
187		params["caption"] = config.Caption
188	}
189
190	return params, nil
191}
192
193func (config PhotoConfig) Values() (url.Values, error) {
194	v, _ := config.BaseChat.Values()
195
196	v.Add(config.Name(), config.FileID)
197	if config.Caption != "" {
198		v.Add("caption", config.Caption)
199	}
200	return v, nil
201}
202
203func (config PhotoConfig) Name() string {
204	return "photo"
205}
206
207func (config PhotoConfig) Method() string {
208	return "SendPhoto"
209}
210
211// AudioConfig contains information about a SendAudio request.
212type AudioConfig struct {
213	BaseFile
214	Duration  int
215	Performer string
216	Title     string
217}
218
219func (config AudioConfig) Values() (url.Values, error) {
220	v, _ := config.BaseChat.Values()
221
222	v.Add(config.Name(), config.FileID)
223	if config.Duration != 0 {
224		v.Add("duration", strconv.Itoa(config.Duration))
225	}
226
227	if config.Performer != "" {
228		v.Add("performer", config.Performer)
229	}
230	if config.Title != "" {
231		v.Add("title", config.Title)
232	}
233
234	return v, nil
235}
236
237func (config AudioConfig) Params() (map[string]string, error) {
238	params, _ := config.BaseFile.Params()
239
240	if config.Duration != 0 {
241		params["duration"] = strconv.Itoa(config.Duration)
242	}
243
244	if config.Performer != "" {
245		params["performer"] = config.Performer
246	}
247	if config.Title != "" {
248		params["title"] = config.Title
249	}
250
251	return params, nil
252}
253
254func (config AudioConfig) Name() string {
255	return "audio"
256}
257
258func (config AudioConfig) Method() string {
259	return "SendAudio"
260}
261
262// DocumentConfig contains information about a SendDocument request.
263type DocumentConfig struct {
264	BaseFile
265}
266
267func (config DocumentConfig) Values() (url.Values, error) {
268	v, _ := config.BaseChat.Values()
269
270	v.Add(config.Name(), config.FileID)
271
272	return v, nil
273}
274
275func (config DocumentConfig) Params() (map[string]string, error) {
276	params, _ := config.BaseFile.Params()
277
278	return params, nil
279}
280
281func (config DocumentConfig) Name() string {
282	return "document"
283}
284
285func (config DocumentConfig) Method() string {
286	return "sendDocument"
287}
288
289// StickerConfig contains information about a SendSticker request.
290type StickerConfig struct {
291	BaseFile
292}
293
294func (config StickerConfig) Values() (url.Values, error) {
295	v, _ := config.BaseChat.Values()
296
297	v.Add(config.Name(), config.FileID)
298
299	return v, nil
300}
301
302func (config StickerConfig) Params() (map[string]string, error) {
303	params, _ := config.BaseFile.Params()
304
305	return params, nil
306}
307
308func (config StickerConfig) Name() string {
309	return "sticker"
310}
311
312func (config StickerConfig) Method() string {
313	return "sendSticker"
314}
315
316// VideoConfig contains information about a SendVideo request.
317type VideoConfig struct {
318	BaseFile
319	Duration int
320	Caption  string
321}
322
323func (config VideoConfig) Values() (url.Values, error) {
324	v, _ := config.BaseChat.Values()
325
326	v.Add(config.Name(), config.FileID)
327	if config.Duration != 0 {
328		v.Add("duration", strconv.Itoa(config.Duration))
329	}
330	if config.Caption != "" {
331		v.Add("caption", config.Caption)
332	}
333
334	return v, nil
335}
336
337func (config VideoConfig) Params() (map[string]string, error) {
338	params, _ := config.BaseFile.Params()
339
340	return params, nil
341}
342
343func (config VideoConfig) Name() string {
344	return "video"
345}
346
347func (config VideoConfig) Method() string {
348	return "sendVideo"
349}
350
351// VoiceConfig contains information about a SendVoice request.
352type VoiceConfig struct {
353	BaseFile
354	Duration int
355}
356
357func (config VoiceConfig) Values() (url.Values, error) {
358	v, _ := config.BaseChat.Values()
359
360	v.Add(config.Name(), config.FileID)
361	if config.Duration != 0 {
362		v.Add("duration", strconv.Itoa(config.Duration))
363	}
364
365	return v, nil
366}
367
368func (config VoiceConfig) Params() (map[string]string, error) {
369	params, _ := config.BaseFile.Params()
370
371	if config.Duration != 0 {
372		params["duration"] = strconv.Itoa(config.Duration)
373	}
374
375	return params, nil
376}
377
378func (config VoiceConfig) Name() string {
379	return "voice"
380}
381
382func (config VoiceConfig) Method() string {
383	return "sendVoice"
384}
385
386// LocationConfig contains information about a SendLocation request.
387type LocationConfig struct {
388	BaseChat
389	Latitude  float64
390	Longitude float64
391}
392
393func (config LocationConfig) Values() (url.Values, error) {
394	v, _ := config.BaseChat.Values()
395
396	v.Add("latitude", strconv.FormatFloat(config.Latitude, 'f', 6, 64))
397	v.Add("longitude", strconv.FormatFloat(config.Longitude, 'f', 6, 64))
398
399	return v, nil
400}
401
402func (config LocationConfig) Method() string {
403	return "sendLocation"
404}
405
406// ChatActionConfig contains information about a SendChatAction request.
407type ChatActionConfig struct {
408	BaseChat
409	Action string
410}
411
412func (config ChatActionConfig) Values() (url.Values, error) {
413	v, _ := config.BaseChat.Values()
414	v.Add("action", config.Action)
415	return v, nil
416}
417
418func (config ChatActionConfig) Method() string {
419	return "sendChatAction"
420}
421
422// UserProfilePhotosConfig contains information about a GetUserProfilePhotos request.
423type UserProfilePhotosConfig struct {
424	UserID int
425	Offset int
426	Limit  int
427}
428
429// FileConfig has information about a file hosted on Telegram
430type FileConfig struct {
431	FileID string
432}
433
434// UpdateConfig contains information about a GetUpdates request.
435type UpdateConfig struct {
436	Offset  int
437	Limit   int
438	Timeout int
439}
440
441// WebhookConfig contains information about a SetWebhook request.
442type WebhookConfig struct {
443	URL         *url.URL
444	Certificate interface{}
445}
446
447// FileBytes contains information about a set of bytes to upload as a File.
448type FileBytes struct {
449	Name  string
450	Bytes []byte
451}
452
453// FileReader contains information about a reader to upload as a File.
454// If Size is -1, it will read the entire Reader into memory to calculate a Size.
455type FileReader struct {
456	Name   string
457	Reader io.Reader
458	Size   int64
459}