all repos — telegram-bot-api @ 1ae7803be06a7a521004632d8aa02dbc38c068f8

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
 41// Chattable represents any event in chat(MessageConfig, PhotoConfig, ChatActionConfig and others)
 42type Chattable interface {
 43	Values() (url.Values, error)
 44	Method() string
 45}
 46
 47// Fileable represents any file event(PhotoConfig, DocumentConfig, AudioConfig, VoiceConfig, VideoConfig, StickerConfig)
 48type Fileable interface {
 49	Chattable
 50	Params() (map[string]string, error)
 51	Name() string
 52	GetFile() interface{}
 53	UseExistingFile() bool
 54}
 55
 56// BaseChat is base struct for all chat events (Message, Photo and so on)
 57type BaseChat struct {
 58	ChatID           int
 59	ChannelUsername  string
 60	ReplyToMessageID int
 61	ReplyMarkup      interface{}
 62}
 63
 64// Values returns url.Values representation of BaseChat
 65func (chat *BaseChat) Values() (url.Values, error) {
 66	v := url.Values{}
 67	if chat.ChannelUsername != "" {
 68		v.Add("chat_id", chat.ChannelUsername)
 69	} else {
 70		v.Add("chat_id", strconv.Itoa(chat.ChatID))
 71	}
 72
 73	if chat.ReplyToMessageID != 0 {
 74		v.Add("reply_to_message_id", strconv.Itoa(chat.ReplyToMessageID))
 75	}
 76
 77	if chat.ReplyMarkup != nil {
 78		data, err := json.Marshal(chat.ReplyMarkup)
 79		if err != nil {
 80			return v, err
 81		}
 82
 83		v.Add("reply_markup", string(data))
 84	}
 85
 86	return v, nil
 87}
 88
 89// BaseFile is base struct for all file events (PhotoConfig, DocumentConfig, AudioConfig, VoiceConfig, VideoConfig, StickerConfig)
 90type BaseFile struct {
 91	BaseChat
 92	FilePath    string
 93	File        interface{}
 94	FileID      string
 95	UseExisting bool
 96	MimeType    string
 97	FileSize    int
 98}
 99
100// Params returns map[string]string representation of BaseFile
101func (file BaseFile) Params() (map[string]string, error) {
102	params := make(map[string]string)
103
104	if file.ChannelUsername != "" {
105		params["chat_id"] = file.ChannelUsername
106	} else {
107		params["chat_id"] = strconv.Itoa(file.ChatID)
108	}
109
110	if file.ReplyToMessageID != 0 {
111		params["reply_to_message_id"] = strconv.Itoa(file.ReplyToMessageID)
112	}
113
114	if file.ReplyMarkup != nil {
115		data, err := json.Marshal(file.ReplyMarkup)
116		if err != nil {
117			return params, err
118		}
119
120		params["reply_markup"] = string(data)
121	}
122
123	if len(file.MimeType) > 0 {
124		params["mime_type"] = file.MimeType
125	}
126
127	if file.FileSize > 0 {
128		params["file_size"] = strconv.Itoa(file.FileSize)
129	}
130
131	return params, nil
132}
133
134// GetFile returns abstract representation of File inside BaseFile
135func (file BaseFile) GetFile() interface{} {
136	var result interface{}
137	if file.FilePath == "" {
138		result = file.File
139	} else {
140		result = file.FilePath
141	}
142
143	return result
144}
145
146// UseExistingFile returns true if BaseFile contains already uploaded file by FileID
147func (file BaseFile) UseExistingFile() bool {
148	return file.UseExisting
149}
150
151// MessageConfig contains information about a SendMessage request.
152type MessageConfig struct {
153	BaseChat
154	Text                  string
155	ParseMode             string
156	DisableWebPagePreview bool
157}
158
159// Values returns url.Values representation of MessageConfig
160func (config MessageConfig) Values() (url.Values, error) {
161	v, _ := config.BaseChat.Values()
162	v.Add("text", config.Text)
163	v.Add("disable_web_page_preview", strconv.FormatBool(config.DisableWebPagePreview))
164	if config.ParseMode != "" {
165		v.Add("parse_mode", config.ParseMode)
166	}
167
168	return v, nil
169}
170
171// Method returns Telegram API method name for sending Message
172func (config MessageConfig) Method() string {
173	return "SendMessage"
174}
175
176// ForwardConfig contains information about a ForwardMessage request.
177type ForwardConfig struct {
178	BaseChat
179	FromChatID          int
180	FromChannelUsername string
181	MessageID           int
182}
183
184// Values returns url.Values representation of ForwardConfig
185func (config ForwardConfig) Values() (url.Values, error) {
186	v, _ := config.BaseChat.Values()
187	v.Add("from_chat_id", strconv.Itoa(config.FromChatID))
188	v.Add("message_id", strconv.Itoa(config.MessageID))
189	return v, nil
190}
191
192// Method returns Telegram API method name for sending Forward
193func (config ForwardConfig) Method() string {
194	return "forwardMessage"
195}
196
197// PhotoConfig contains information about a SendPhoto request.
198type PhotoConfig struct {
199	BaseFile
200	Caption string
201}
202
203// Params returns map[string]string representation of PhotoConfig
204func (config PhotoConfig) Params() (map[string]string, error) {
205	params, _ := config.BaseFile.Params()
206
207	if config.Caption != "" {
208		params["caption"] = config.Caption
209	}
210
211	return params, nil
212}
213
214// Values returns url.Values representation of PhotoConfig
215func (config PhotoConfig) Values() (url.Values, error) {
216	v, _ := config.BaseChat.Values()
217
218	v.Add(config.Name(), config.FileID)
219	if config.Caption != "" {
220		v.Add("caption", config.Caption)
221	}
222	return v, nil
223}
224
225// Name return field name for uploading file
226func (config PhotoConfig) Name() string {
227	return "photo"
228}
229
230// Method returns Telegram API method name for sending Photo
231func (config PhotoConfig) Method() string {
232	return "SendPhoto"
233}
234
235// AudioConfig contains information about a SendAudio request.
236type AudioConfig struct {
237	BaseFile
238	Duration  int
239	Performer string
240	Title     string
241}
242
243// Values returns url.Values representation of AudioConfig
244func (config AudioConfig) Values() (url.Values, error) {
245	v, _ := config.BaseChat.Values()
246
247	v.Add(config.Name(), config.FileID)
248	if config.Duration != 0 {
249		v.Add("duration", strconv.Itoa(config.Duration))
250	}
251
252	if config.Performer != "" {
253		v.Add("performer", config.Performer)
254	}
255	if config.Title != "" {
256		v.Add("title", config.Title)
257	}
258
259	return v, nil
260}
261
262// Params returns map[string]string representation of AudioConfig
263func (config AudioConfig) Params() (map[string]string, error) {
264	params, _ := config.BaseFile.Params()
265
266	if config.Duration != 0 {
267		params["duration"] = strconv.Itoa(config.Duration)
268	}
269
270	if config.Performer != "" {
271		params["performer"] = config.Performer
272	}
273	if config.Title != "" {
274		params["title"] = config.Title
275	}
276
277	return params, nil
278}
279
280// Name return field name for uploading file
281func (config AudioConfig) Name() string {
282	return "audio"
283}
284
285// Method returns Telegram API method name for sending Audio
286func (config AudioConfig) Method() string {
287	return "SendAudio"
288}
289
290// DocumentConfig contains information about a SendDocument request.
291type DocumentConfig struct {
292	BaseFile
293}
294
295// Values returns url.Values representation of DocumentConfig
296func (config DocumentConfig) Values() (url.Values, error) {
297	v, _ := config.BaseChat.Values()
298
299	v.Add(config.Name(), config.FileID)
300
301	return v, nil
302}
303
304// Params returns map[string]string representation of DocumentConfig
305func (config DocumentConfig) Params() (map[string]string, error) {
306	params, _ := config.BaseFile.Params()
307
308	return params, nil
309}
310
311// Name return field name for uploading file
312func (config DocumentConfig) Name() string {
313	return "document"
314}
315
316// Method returns Telegram API method name for sending Document
317func (config DocumentConfig) Method() string {
318	return "sendDocument"
319}
320
321// StickerConfig contains information about a SendSticker request.
322type StickerConfig struct {
323	BaseFile
324}
325
326// Values returns url.Values representation of StickerConfig
327func (config StickerConfig) Values() (url.Values, error) {
328	v, _ := config.BaseChat.Values()
329
330	v.Add(config.Name(), config.FileID)
331
332	return v, nil
333}
334
335// Params returns map[string]string representation of StickerConfig
336func (config StickerConfig) Params() (map[string]string, error) {
337	params, _ := config.BaseFile.Params()
338
339	return params, nil
340}
341
342// Name return field name for uploading file
343func (config StickerConfig) Name() string {
344	return "sticker"
345}
346
347// Method returns Telegram API method name for sending Sticker
348func (config StickerConfig) Method() string {
349	return "sendSticker"
350}
351
352// VideoConfig contains information about a SendVideo request.
353type VideoConfig struct {
354	BaseFile
355	Duration int
356	Caption  string
357}
358
359// Values returns url.Values representation of VideoConfig
360func (config VideoConfig) Values() (url.Values, error) {
361	v, _ := config.BaseChat.Values()
362
363	v.Add(config.Name(), config.FileID)
364	if config.Duration != 0 {
365		v.Add("duration", strconv.Itoa(config.Duration))
366	}
367	if config.Caption != "" {
368		v.Add("caption", config.Caption)
369	}
370
371	return v, nil
372}
373
374// Params returns map[string]string representation of VideoConfig
375func (config VideoConfig) Params() (map[string]string, error) {
376	params, _ := config.BaseFile.Params()
377
378	return params, nil
379}
380
381// Name return field name for uploading file
382func (config VideoConfig) Name() string {
383	return "video"
384}
385
386// Method returns Telegram API method name for sending Video
387func (config VideoConfig) Method() string {
388	return "sendVideo"
389}
390
391// VoiceConfig contains information about a SendVoice request.
392type VoiceConfig struct {
393	BaseFile
394	Duration int
395}
396
397// Values returns url.Values representation of VoiceConfig
398func (config VoiceConfig) Values() (url.Values, error) {
399	v, _ := config.BaseChat.Values()
400
401	v.Add(config.Name(), config.FileID)
402	if config.Duration != 0 {
403		v.Add("duration", strconv.Itoa(config.Duration))
404	}
405
406	return v, nil
407}
408
409// Params returns map[string]string representation of VoiceConfig
410func (config VoiceConfig) Params() (map[string]string, error) {
411	params, _ := config.BaseFile.Params()
412
413	if config.Duration != 0 {
414		params["duration"] = strconv.Itoa(config.Duration)
415	}
416
417	return params, nil
418}
419
420// Name return field name for uploading file
421func (config VoiceConfig) Name() string {
422	return "voice"
423}
424
425// Method returns Telegram API method name for sending Voice
426func (config VoiceConfig) Method() string {
427	return "sendVoice"
428}
429
430// LocationConfig contains information about a SendLocation request.
431type LocationConfig struct {
432	BaseChat
433	Latitude  float64
434	Longitude float64
435}
436
437// Values returns url.Values representation of LocationConfig
438func (config LocationConfig) Values() (url.Values, error) {
439	v, _ := config.BaseChat.Values()
440
441	v.Add("latitude", strconv.FormatFloat(config.Latitude, 'f', 6, 64))
442	v.Add("longitude", strconv.FormatFloat(config.Longitude, 'f', 6, 64))
443
444	return v, nil
445}
446
447// Method returns Telegram API method name for sending Location
448func (config LocationConfig) Method() string {
449	return "sendLocation"
450}
451
452// ChatActionConfig contains information about a SendChatAction request.
453type ChatActionConfig struct {
454	BaseChat
455	Action string
456}
457
458// Values returns url.Values representation of ChatActionConfig
459func (config ChatActionConfig) Values() (url.Values, error) {
460	v, _ := config.BaseChat.Values()
461	v.Add("action", config.Action)
462	return v, nil
463}
464
465// Method returns Telegram API method name for sending ChatAction
466func (config ChatActionConfig) Method() string {
467	return "sendChatAction"
468}
469
470// UserProfilePhotosConfig contains information about a GetUserProfilePhotos request.
471type UserProfilePhotosConfig struct {
472	UserID int
473	Offset int
474	Limit  int
475}
476
477// FileConfig has information about a file hosted on Telegram
478type FileConfig struct {
479	FileID string
480}
481
482// UpdateConfig contains information about a GetUpdates request.
483type UpdateConfig struct {
484	Offset  int
485	Limit   int
486	Timeout int
487}
488
489// WebhookConfig contains information about a SetWebhook request.
490type WebhookConfig struct {
491	URL         *url.URL
492	Certificate interface{}
493}
494
495// FileBytes contains information about a set of bytes to upload as a File.
496type FileBytes struct {
497	Name  string
498	Bytes []byte
499}
500
501// FileReader contains information about a reader to upload as a File.
502// If Size is -1, it will read the entire Reader into memory to calculate a Size.
503type FileReader struct {
504	Name   string
505	Reader io.Reader
506	Size   int64
507}
508
509// InlineConfig contains information on making an InlineQuery response.
510type InlineConfig struct {
511	InlineQueryID string              `json:"inline_query_id"`
512	Results       []InlineQueryResult `json:"results"`
513	CacheTime     int                 `json:"cache_time"`
514	IsPersonal    bool                `json:"is_personal"`
515	NextOffset    string              `json:"next_offset"`
516}