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,
13 // with formatting for Sprintf.
14 APIEndpoint = "https://api.telegram.org/bot%s/%s"
15 // FileEndpoint is the endpoint for downloading a file from Telegram.
16 FileEndpoint = "https://api.telegram.org/file/bot%s/%s"
17)
18
19// Constant values for ChatActions
20const (
21 ChatTyping = "typing"
22 ChatUploadPhoto = "upload_photo"
23 ChatRecordVideo = "record_video"
24 ChatUploadVideo = "upload_video"
25 ChatRecordAudio = "record_audio"
26 ChatUploadAudio = "upload_audio"
27 ChatUploadDocument = "upload_document"
28 ChatFindLocation = "find_location"
29)
30
31// API errors
32const (
33 // ErrAPIForbidden happens when a token is bad
34 ErrAPIForbidden = "forbidden"
35)
36
37// Constant values for ParseMode in MessageConfig
38const (
39 ModeMarkdown = "Markdown"
40 ModeHTML = "HTML"
41)
42
43// Library errors
44const (
45 // ErrBadFileType happens when you pass an unknown type
46 ErrBadFileType = "bad file type"
47 ErrBadURL = "bad or empty url"
48)
49
50// Chattable is any config type that can be sent.
51type Chattable interface {
52 values() (url.Values, error)
53 method() string
54}
55
56// Fileable is any config type that can be sent that includes a file.
57type Fileable interface {
58 Chattable
59 params() (map[string]string, error)
60 name() string
61 getFile() interface{}
62 useExistingFile() bool
63}
64
65// BaseChat is base type for all chat config types.
66type BaseChat struct {
67 ChatID int64 // required
68 ChannelUsername string
69 ReplyToMessageID int
70 ReplyMarkup interface{}
71 DisableNotification bool
72}
73
74// values returns url.Values representation of BaseChat
75func (chat *BaseChat) values() (url.Values, error) {
76 v := url.Values{}
77 if chat.ChannelUsername != "" {
78 v.Add("chat_id", chat.ChannelUsername)
79 } else {
80 v.Add("chat_id", strconv.FormatInt(chat.ChatID, 10))
81 }
82
83 if chat.ReplyToMessageID != 0 {
84 v.Add("reply_to_message_id", strconv.Itoa(chat.ReplyToMessageID))
85 }
86
87 if chat.ReplyMarkup != nil {
88 data, err := json.Marshal(chat.ReplyMarkup)
89 if err != nil {
90 return v, err
91 }
92
93 v.Add("reply_markup", string(data))
94 }
95
96 v.Add("disable_notification", strconv.FormatBool(chat.DisableNotification))
97
98 return v, nil
99}
100
101// BaseFile is a base type for all file config types.
102type BaseFile struct {
103 BaseChat
104 File interface{}
105 FileID string
106 UseExisting bool
107 MimeType string
108 FileSize int
109}
110
111// params returns a map[string]string representation of BaseFile.
112func (file BaseFile) params() (map[string]string, error) {
113 params := make(map[string]string)
114
115 if file.ChannelUsername != "" {
116 params["chat_id"] = file.ChannelUsername
117 } else {
118 params["chat_id"] = strconv.FormatInt(file.ChatID, 10)
119 }
120
121 if file.ReplyToMessageID != 0 {
122 params["reply_to_message_id"] = strconv.Itoa(file.ReplyToMessageID)
123 }
124
125 if file.ReplyMarkup != nil {
126 data, err := json.Marshal(file.ReplyMarkup)
127 if err != nil {
128 return params, err
129 }
130
131 params["reply_markup"] = string(data)
132 }
133
134 if file.MimeType != "" {
135 params["mime_type"] = file.MimeType
136 }
137
138 if file.FileSize > 0 {
139 params["file_size"] = strconv.Itoa(file.FileSize)
140 }
141
142 params["disable_notification"] = strconv.FormatBool(file.DisableNotification)
143
144 return params, nil
145}
146
147// getFile returns the file.
148func (file BaseFile) getFile() interface{} {
149 return file.File
150}
151
152// useExistingFile returns if the BaseFile has already been uploaded.
153func (file BaseFile) useExistingFile() bool {
154 return file.UseExisting
155}
156
157// BaseEdit is base type of all chat edits.
158type BaseEdit struct {
159 ChatID int64
160 ChannelUsername string
161 MessageID int
162 InlineMessageID string
163 ReplyMarkup *InlineKeyboardMarkup
164}
165
166func (edit BaseEdit) values() (url.Values, error) {
167 v := url.Values{}
168
169 if edit.InlineMessageID == "" {
170 if edit.ChannelUsername != "" {
171 v.Add("chat_id", edit.ChannelUsername)
172 } else {
173 v.Add("chat_id", strconv.FormatInt(edit.ChatID, 10))
174 }
175 v.Add("message_id", strconv.Itoa(edit.MessageID))
176 } else {
177 v.Add("inline_message_id", edit.InlineMessageID)
178 }
179
180 if edit.ReplyMarkup != nil {
181 data, err := json.Marshal(edit.ReplyMarkup)
182 if err != nil {
183 return v, err
184 }
185 v.Add("reply_markup", string(data))
186 }
187
188 return v, nil
189}
190
191// MessageConfig contains information about a SendMessage request.
192type MessageConfig struct {
193 BaseChat
194 Text string
195 ParseMode string
196 DisableWebPagePreview bool
197}
198
199// values returns a url.Values representation of MessageConfig.
200func (config MessageConfig) values() (url.Values, error) {
201 v, err := config.BaseChat.values()
202 if err != nil {
203 return v, err
204 }
205 v.Add("text", config.Text)
206 v.Add("disable_web_page_preview", strconv.FormatBool(config.DisableWebPagePreview))
207 if config.ParseMode != "" {
208 v.Add("parse_mode", config.ParseMode)
209 }
210
211 return v, nil
212}
213
214// method returns Telegram API method name for sending Message.
215func (config MessageConfig) method() string {
216 return "sendMessage"
217}
218
219// ForwardConfig contains information about a ForwardMessage request.
220type ForwardConfig struct {
221 BaseChat
222 FromChatID int64 // required
223 FromChannelUsername string
224 MessageID int // required
225}
226
227// values returns a url.Values representation of ForwardConfig.
228func (config ForwardConfig) values() (url.Values, error) {
229 v, err := config.BaseChat.values()
230 if err != nil {
231 return v, err
232 }
233 v.Add("from_chat_id", strconv.FormatInt(config.FromChatID, 10))
234 v.Add("message_id", strconv.Itoa(config.MessageID))
235 return v, nil
236}
237
238// method returns Telegram API method name for sending Forward.
239func (config ForwardConfig) method() string {
240 return "forwardMessage"
241}
242
243// PhotoConfig contains information about a SendPhoto request.
244type PhotoConfig struct {
245 BaseFile
246 Caption string
247}
248
249// Params returns a map[string]string representation of PhotoConfig.
250func (config PhotoConfig) params() (map[string]string, error) {
251 params, _ := config.BaseFile.params()
252
253 if config.Caption != "" {
254 params["caption"] = config.Caption
255 }
256
257 return params, nil
258}
259
260// Values returns a url.Values representation of PhotoConfig.
261func (config PhotoConfig) values() (url.Values, error) {
262 v, err := config.BaseChat.values()
263 if err != nil {
264 return v, err
265 }
266
267 v.Add(config.name(), config.FileID)
268 if config.Caption != "" {
269 v.Add("caption", config.Caption)
270 }
271 return v, nil
272}
273
274// name returns the field name for the Photo.
275func (config PhotoConfig) name() string {
276 return "photo"
277}
278
279// method returns Telegram API method name for sending Photo.
280func (config PhotoConfig) method() string {
281 return "sendPhoto"
282}
283
284// AudioConfig contains information about a SendAudio request.
285type AudioConfig struct {
286 BaseFile
287 Caption string
288 Duration int
289 Performer string
290 Title string
291}
292
293// values returns a url.Values representation of AudioConfig.
294func (config AudioConfig) values() (url.Values, error) {
295 v, err := config.BaseChat.values()
296 if err != nil {
297 return v, err
298 }
299
300 v.Add(config.name(), config.FileID)
301 if config.Duration != 0 {
302 v.Add("duration", strconv.Itoa(config.Duration))
303 }
304
305 if config.Performer != "" {
306 v.Add("performer", config.Performer)
307 }
308 if config.Title != "" {
309 v.Add("title", config.Title)
310 }
311 if config.Caption != "" {
312 v.Add("caption", config.Caption)
313 }
314
315 return v, nil
316}
317
318// params returns a map[string]string representation of AudioConfig.
319func (config AudioConfig) params() (map[string]string, error) {
320 params, _ := config.BaseFile.params()
321
322 if config.Duration != 0 {
323 params["duration"] = strconv.Itoa(config.Duration)
324 }
325
326 if config.Performer != "" {
327 params["performer"] = config.Performer
328 }
329 if config.Title != "" {
330 params["title"] = config.Title
331 }
332 if config.Caption != "" {
333 params["caption"] = config.Caption
334 }
335
336 return params, nil
337}
338
339// name returns the field name for the Audio.
340func (config AudioConfig) name() string {
341 return "audio"
342}
343
344// method returns Telegram API method name for sending Audio.
345func (config AudioConfig) method() string {
346 return "sendAudio"
347}
348
349// DocumentConfig contains information about a SendDocument request.
350type DocumentConfig struct {
351 BaseFile
352 Caption string
353}
354
355// values returns a url.Values representation of DocumentConfig.
356func (config DocumentConfig) values() (url.Values, error) {
357 v, err := config.BaseChat.values()
358 if err != nil {
359 return v, err
360 }
361
362 v.Add(config.name(), config.FileID)
363 if config.Caption != "" {
364 v.Add("caption", config.Caption)
365 }
366
367 return v, nil
368}
369
370// params returns a map[string]string representation of DocumentConfig.
371func (config DocumentConfig) params() (map[string]string, error) {
372 params, _ := config.BaseFile.params()
373
374 if config.Caption != "" {
375 params["caption"] = config.Caption
376 }
377
378 return params, nil
379}
380
381// name returns the field name for the Document.
382func (config DocumentConfig) name() string {
383 return "document"
384}
385
386// method returns Telegram API method name for sending Document.
387func (config DocumentConfig) method() string {
388 return "sendDocument"
389}
390
391// StickerConfig contains information about a SendSticker request.
392type StickerConfig struct {
393 BaseFile
394}
395
396// values returns a url.Values representation of StickerConfig.
397func (config StickerConfig) values() (url.Values, error) {
398 v, err := config.BaseChat.values()
399 if err != nil {
400 return v, err
401 }
402
403 v.Add(config.name(), config.FileID)
404
405 return v, nil
406}
407
408// params returns a map[string]string representation of StickerConfig.
409func (config StickerConfig) params() (map[string]string, error) {
410 params, _ := config.BaseFile.params()
411
412 return params, nil
413}
414
415// name returns the field name for the Sticker.
416func (config StickerConfig) name() string {
417 return "sticker"
418}
419
420// method returns Telegram API method name for sending Sticker.
421func (config StickerConfig) method() string {
422 return "sendSticker"
423}
424
425// VideoConfig contains information about a SendVideo request.
426type VideoConfig struct {
427 BaseFile
428 Duration int
429 Caption string
430}
431
432// values returns a url.Values representation of VideoConfig.
433func (config VideoConfig) values() (url.Values, error) {
434 v, err := config.BaseChat.values()
435 if err != nil {
436 return v, err
437 }
438
439 v.Add(config.name(), config.FileID)
440 if config.Duration != 0 {
441 v.Add("duration", strconv.Itoa(config.Duration))
442 }
443 if config.Caption != "" {
444 v.Add("caption", config.Caption)
445 }
446
447 return v, nil
448}
449
450// params returns a map[string]string representation of VideoConfig.
451func (config VideoConfig) params() (map[string]string, error) {
452 params, _ := config.BaseFile.params()
453
454 if config.Caption != "" {
455 params["caption"] = config.Caption
456 }
457
458 return params, nil
459}
460
461// name returns the field name for the Video.
462func (config VideoConfig) name() string {
463 return "video"
464}
465
466// method returns Telegram API method name for sending Video.
467func (config VideoConfig) method() string {
468 return "sendVideo"
469}
470
471// VideoNoteConfig contains information about a SendVideoNote request.
472type VideoNoteConfig struct {
473 BaseFile
474 Duration int
475 Length int
476}
477
478// values returns a url.Values representation of VideoNoteConfig.
479func (config VideoNoteConfig) values() (url.Values, error) {
480 v, err := config.BaseChat.values()
481 if err != nil {
482 return v, err
483 }
484
485 v.Add(config.name(), config.FileID)
486 if config.Duration != 0 {
487 v.Add("duration", strconv.Itoa(config.Duration))
488 }
489
490 // Telegram API seems to have a bug, if no length is provided or it is 0, it will send an error response
491 if config.Length != 0 {
492 v.Add("length", strconv.Itoa(config.Length))
493 }
494
495 return v, nil
496}
497
498// params returns a map[string]string representation of VideoNoteConfig.
499func (config VideoNoteConfig) params() (map[string]string, error) {
500 params, _ := config.BaseFile.params()
501
502 if config.Length != 0 {
503 params["length"] = strconv.Itoa(config.Length)
504 }
505 if config.Duration != 0 {
506 params["duration"] = strconv.Itoa(config.Duration)
507 }
508
509 return params, nil
510}
511
512// name returns the field name for the VideoNote.
513func (config VideoNoteConfig) name() string {
514 return "video_note"
515}
516
517// method returns Telegram API method name for sending VideoNote.
518func (config VideoNoteConfig) method() string {
519 return "sendVideoNote"
520}
521
522// VoiceConfig contains information about a SendVoice request.
523type VoiceConfig struct {
524 BaseFile
525 Caption string
526 Duration int
527}
528
529// values returns a url.Values representation of VoiceConfig.
530func (config VoiceConfig) values() (url.Values, error) {
531 v, err := config.BaseChat.values()
532 if err != nil {
533 return v, err
534 }
535
536 v.Add(config.name(), config.FileID)
537 if config.Duration != 0 {
538 v.Add("duration", strconv.Itoa(config.Duration))
539 }
540 if config.Caption != "" {
541 v.Add("caption", config.Caption)
542 }
543
544 return v, nil
545}
546
547// params returns a map[string]string representation of VoiceConfig.
548func (config VoiceConfig) params() (map[string]string, error) {
549 params, _ := config.BaseFile.params()
550
551 if config.Duration != 0 {
552 params["duration"] = strconv.Itoa(config.Duration)
553 }
554 if config.Caption != "" {
555 params["caption"] = config.Caption
556 }
557
558 return params, nil
559}
560
561// name returns the field name for the Voice.
562func (config VoiceConfig) name() string {
563 return "voice"
564}
565
566// method returns Telegram API method name for sending Voice.
567func (config VoiceConfig) method() string {
568 return "sendVoice"
569}
570
571// LocationConfig contains information about a SendLocation request.
572type LocationConfig struct {
573 BaseChat
574 Latitude float64 // required
575 Longitude float64 // required
576 LivePeriod int // optional
577}
578
579// values returns a url.Values representation of LocationConfig.
580func (config LocationConfig) values() (url.Values, error) {
581 v, err := config.BaseChat.values()
582 if err != nil {
583 return v, err
584 }
585
586 v.Add("latitude", strconv.FormatFloat(config.Latitude, 'f', 6, 64))
587 v.Add("longitude", strconv.FormatFloat(config.Longitude, 'f', 6, 64))
588 if config.LivePeriod != 0 {
589 v.Add("live_period", strconv.Itoa(config.LivePeriod))
590 }
591
592 return v, nil
593}
594
595// method returns Telegram API method name for sending Location.
596func (config LocationConfig) method() string {
597 return "sendLocation"
598}
599
600// VenueConfig contains information about a SendVenue request.
601type VenueConfig struct {
602 BaseChat
603 Latitude float64 // required
604 Longitude float64 // required
605 Title string // required
606 Address string // required
607 FoursquareID string
608}
609
610func (config VenueConfig) values() (url.Values, error) {
611 v, err := config.BaseChat.values()
612 if err != nil {
613 return v, err
614 }
615
616 v.Add("latitude", strconv.FormatFloat(config.Latitude, 'f', 6, 64))
617 v.Add("longitude", strconv.FormatFloat(config.Longitude, 'f', 6, 64))
618 v.Add("title", config.Title)
619 v.Add("address", config.Address)
620 if config.FoursquareID != "" {
621 v.Add("foursquare_id", config.FoursquareID)
622 }
623
624 return v, nil
625}
626
627func (config VenueConfig) method() string {
628 return "sendVenue"
629}
630
631// ContactConfig allows you to send a contact.
632type ContactConfig struct {
633 BaseChat
634 PhoneNumber string
635 FirstName string
636 LastName string
637}
638
639func (config ContactConfig) values() (url.Values, error) {
640 v, err := config.BaseChat.values()
641 if err != nil {
642 return v, err
643 }
644
645 v.Add("phone_number", config.PhoneNumber)
646 v.Add("first_name", config.FirstName)
647 v.Add("last_name", config.LastName)
648
649 return v, nil
650}
651
652func (config ContactConfig) method() string {
653 return "sendContact"
654}
655
656// GameConfig allows you to send a game.
657type GameConfig struct {
658 BaseChat
659 GameShortName string
660}
661
662func (config GameConfig) values() (url.Values, error) {
663 v, err := config.BaseChat.values()
664 if err != nil {
665 return v, err
666 }
667
668 v.Add("game_short_name", config.GameShortName)
669
670 return v, nil
671}
672
673func (config GameConfig) method() string {
674 return "sendGame"
675}
676
677// SetGameScoreConfig allows you to update the game score in a chat.
678type SetGameScoreConfig struct {
679 UserID int
680 Score int
681 Force bool
682 DisableEditMessage bool
683 ChatID int
684 ChannelUsername string
685 MessageID int
686 InlineMessageID string
687}
688
689func (config SetGameScoreConfig) values() (url.Values, error) {
690 v := url.Values{}
691
692 v.Add("user_id", strconv.Itoa(config.UserID))
693 v.Add("score", strconv.Itoa(config.Score))
694 if config.InlineMessageID == "" {
695 if config.ChannelUsername == "" {
696 v.Add("chat_id", strconv.Itoa(config.ChatID))
697 } else {
698 v.Add("chat_id", config.ChannelUsername)
699 }
700 v.Add("message_id", strconv.Itoa(config.MessageID))
701 } else {
702 v.Add("inline_message_id", config.InlineMessageID)
703 }
704 v.Add("disable_edit_message", strconv.FormatBool(config.DisableEditMessage))
705
706 return v, nil
707}
708
709func (config SetGameScoreConfig) method() string {
710 return "setGameScore"
711}
712
713// GetGameHighScoresConfig allows you to fetch the high scores for a game.
714type GetGameHighScoresConfig struct {
715 UserID int
716 ChatID int
717 ChannelUsername string
718 MessageID int
719 InlineMessageID string
720}
721
722func (config GetGameHighScoresConfig) values() (url.Values, error) {
723 v := url.Values{}
724
725 v.Add("user_id", strconv.Itoa(config.UserID))
726 if config.InlineMessageID == "" {
727 if config.ChannelUsername == "" {
728 v.Add("chat_id", strconv.Itoa(config.ChatID))
729 } else {
730 v.Add("chat_id", config.ChannelUsername)
731 }
732 v.Add("message_id", strconv.Itoa(config.MessageID))
733 } else {
734 v.Add("inline_message_id", config.InlineMessageID)
735 }
736
737 return v, nil
738}
739
740func (config GetGameHighScoresConfig) method() string {
741 return "getGameHighScores"
742}
743
744// ChatActionConfig contains information about a SendChatAction request.
745type ChatActionConfig struct {
746 BaseChat
747 Action string // required
748}
749
750// values returns a url.Values representation of ChatActionConfig.
751func (config ChatActionConfig) values() (url.Values, error) {
752 v, err := config.BaseChat.values()
753 if err != nil {
754 return v, err
755 }
756 v.Add("action", config.Action)
757 return v, nil
758}
759
760// method returns Telegram API method name for sending ChatAction.
761func (config ChatActionConfig) method() string {
762 return "sendChatAction"
763}
764
765// EditMessageTextConfig allows you to modify the text in a message.
766type EditMessageTextConfig struct {
767 BaseEdit
768 Text string
769 ParseMode string
770 DisableWebPagePreview bool
771}
772
773func (config EditMessageTextConfig) values() (url.Values, error) {
774 v, err := config.BaseEdit.values()
775 if err != nil {
776 return v, err
777 }
778
779 v.Add("text", config.Text)
780 v.Add("parse_mode", config.ParseMode)
781 v.Add("disable_web_page_preview", strconv.FormatBool(config.DisableWebPagePreview))
782
783 return v, nil
784}
785
786func (config EditMessageTextConfig) method() string {
787 return "editMessageText"
788}
789
790// EditMessageCaptionConfig allows you to modify the caption of a message.
791type EditMessageCaptionConfig struct {
792 BaseEdit
793 Caption string
794}
795
796func (config EditMessageCaptionConfig) values() (url.Values, error) {
797 v, _ := config.BaseEdit.values()
798
799 v.Add("caption", config.Caption)
800
801 return v, nil
802}
803
804func (config EditMessageCaptionConfig) method() string {
805 return "editMessageCaption"
806}
807
808// EditMessageReplyMarkupConfig allows you to modify the reply markup
809// of a message.
810type EditMessageReplyMarkupConfig struct {
811 BaseEdit
812}
813
814func (config EditMessageReplyMarkupConfig) values() (url.Values, error) {
815 return config.BaseEdit.values()
816}
817
818func (config EditMessageReplyMarkupConfig) method() string {
819 return "editMessageReplyMarkup"
820}
821
822// UserProfilePhotosConfig contains information about a
823// GetUserProfilePhotos request.
824type UserProfilePhotosConfig struct {
825 UserID int
826 Offset int
827 Limit int
828}
829
830// FileConfig has information about a file hosted on Telegram.
831type FileConfig struct {
832 FileID string
833}
834
835// UpdateConfig contains information about a GetUpdates request.
836type UpdateConfig struct {
837 Offset int
838 Limit int
839 Timeout int
840}
841
842// WebhookConfig contains information about a SetWebhook request.
843type WebhookConfig struct {
844 URL *url.URL
845 Certificate interface{}
846 MaxConnections int
847}
848
849// FileBytes contains information about a set of bytes to upload
850// as a File.
851type FileBytes struct {
852 Name string
853 Bytes []byte
854}
855
856// FileReader contains information about a reader to upload as a File.
857// If Size is -1, it will read the entire Reader into memory to
858// calculate a Size.
859type FileReader struct {
860 Name string
861 Reader io.Reader
862 Size int64
863}
864
865// InlineConfig contains information on making an InlineQuery response.
866type InlineConfig struct {
867 InlineQueryID string `json:"inline_query_id"`
868 Results []interface{} `json:"results"`
869 CacheTime int `json:"cache_time"`
870 IsPersonal bool `json:"is_personal"`
871 NextOffset string `json:"next_offset"`
872 SwitchPMText string `json:"switch_pm_text"`
873 SwitchPMParameter string `json:"switch_pm_parameter"`
874}
875
876// CallbackConfig contains information on making a CallbackQuery response.
877type CallbackConfig struct {
878 CallbackQueryID string `json:"callback_query_id"`
879 Text string `json:"text"`
880 ShowAlert bool `json:"show_alert"`
881 URL string `json:"url"`
882 CacheTime int `json:"cache_time"`
883}
884
885// ChatMemberConfig contains information about a user in a chat for use
886// with administrative functions such as kicking or unbanning a user.
887type ChatMemberConfig struct {
888 ChatID int64
889 SuperGroupUsername string
890 ChannelUsername string
891 UserID int
892}
893
894// KickChatMemberConfig contains extra fields to kick user
895type KickChatMemberConfig struct {
896 ChatMemberConfig
897 UntilDate int64
898}
899
900// RestrictChatMemberConfig contains fields to restrict members of chat
901type RestrictChatMemberConfig struct {
902 ChatMemberConfig
903 UntilDate int64
904 CanSendMessages *bool
905 CanSendMediaMessages *bool
906 CanSendOtherMessages *bool
907 CanAddWebPagePreviews *bool
908}
909
910// PromoteChatMemberConfig contains fields to promote members of chat
911type PromoteChatMemberConfig struct {
912 ChatMemberConfig
913 CanChangeInfo *bool
914 CanPostMessages *bool
915 CanEditMessages *bool
916 CanDeleteMessages *bool
917 CanInviteUsers *bool
918 CanRestrictMembers *bool
919 CanPinMessages *bool
920 CanPromoteMembers *bool
921}
922
923// ChatConfig contains information about getting information on a chat.
924type ChatConfig struct {
925 ChatID int64
926 SuperGroupUsername string
927}
928
929// ChatConfigWithUser contains information about getting information on
930// a specific user within a chat.
931type ChatConfigWithUser struct {
932 ChatID int64
933 SuperGroupUsername string
934 UserID int
935}
936
937// InvoiceConfig contains information for sendInvoice request.
938type InvoiceConfig struct {
939 BaseChat
940 Title string // required
941 Description string // required
942 Payload string // required
943 ProviderToken string // required
944 StartParameter string // required
945 Currency string // required
946 Prices *[]LabeledPrice // required
947 PhotoURL string
948 PhotoSize int
949 PhotoWidth int
950 PhotoHeight int
951 NeedName bool
952 NeedPhoneNumber bool
953 NeedEmail bool
954 NeedShippingAddress bool
955 IsFlexible bool
956}
957
958func (config InvoiceConfig) values() (url.Values, error) {
959 v, err := config.BaseChat.values()
960 if err != nil {
961 return v, err
962 }
963 v.Add("title", config.Title)
964 v.Add("description", config.Description)
965 v.Add("payload", config.Payload)
966 v.Add("provider_token", config.ProviderToken)
967 v.Add("start_parameter", config.StartParameter)
968 v.Add("currency", config.Currency)
969 data, err := json.Marshal(config.Prices)
970 if err != nil {
971 return v, err
972 }
973 v.Add("prices", string(data))
974 if config.PhotoURL != "" {
975 v.Add("photo_url", config.PhotoURL)
976 }
977 if config.PhotoSize != 0 {
978 v.Add("photo_size", strconv.Itoa(config.PhotoSize))
979 }
980 if config.PhotoWidth != 0 {
981 v.Add("photo_width", strconv.Itoa(config.PhotoWidth))
982 }
983 if config.PhotoHeight != 0 {
984 v.Add("photo_height", strconv.Itoa(config.PhotoHeight))
985 }
986 if config.NeedName != false {
987 v.Add("need_name", strconv.FormatBool(config.NeedName))
988 }
989 if config.NeedPhoneNumber != false {
990 v.Add("need_phone_number", strconv.FormatBool(config.NeedPhoneNumber))
991 }
992 if config.NeedEmail != false {
993 v.Add("need_email", strconv.FormatBool(config.NeedEmail))
994 }
995 if config.NeedShippingAddress != false {
996 v.Add("need_shipping_address", strconv.FormatBool(config.NeedShippingAddress))
997 }
998 if config.IsFlexible != false {
999 v.Add("is_flexible", strconv.FormatBool(config.IsFlexible))
1000 }
1001
1002 return v, nil
1003}
1004
1005func (config InvoiceConfig) method() string {
1006 return "sendInvoice"
1007}
1008
1009// ShippingConfig contains information for answerShippingQuery request.
1010type ShippingConfig struct {
1011 ShippingQueryID string // required
1012 OK bool // required
1013 ShippingOptions *[]ShippingOption
1014 ErrorMessage string
1015}
1016
1017// PreCheckoutConfig conatins information for answerPreCheckoutQuery request.
1018type PreCheckoutConfig struct {
1019 PreCheckoutQueryID string // required
1020 OK bool // required
1021 ErrorMessage string
1022}
1023
1024// DeleteMessageConfig contains information of a message in a chat to delete.
1025type DeleteMessageConfig struct {
1026 ChatID int64
1027 MessageID int
1028}
1029
1030func (config DeleteMessageConfig) method() string {
1031 return "deleteMessage"
1032}
1033
1034func (config DeleteMessageConfig) values() (url.Values, error) {
1035 v := url.Values{}
1036
1037 v.Add("chat_id", strconv.FormatInt(config.ChatID, 10))
1038 v.Add("message_id", strconv.Itoa(config.MessageID))
1039
1040 return v, nil
1041}
1042
1043// PinChatMessageConfig contains information of a message in a chat to pin.
1044type PinChatMessageConfig struct {
1045 ChatID int64
1046 MessageID int
1047 DisableNotification bool
1048}
1049
1050func (config PinChatMessageConfig) method() string {
1051 return "pinChatMessage"
1052}
1053
1054func (config PinChatMessageConfig) values() (url.Values, error) {
1055 v := url.Values{}
1056
1057 v.Add("chat_id", strconv.FormatInt(config.ChatID, 10))
1058 v.Add("message_id", strconv.Itoa(config.MessageID))
1059 v.Add("disable_notification", strconv.FormatBool(config.DisableNotification))
1060
1061 return v, nil
1062}
1063
1064// UnpinChatMessageConfig contains information of chat to unpin.
1065type UnpinChatMessageConfig struct {
1066 ChatID int64
1067}
1068
1069func (config UnpinChatMessageConfig) method() string {
1070 return "unpinChatMessage"
1071}
1072
1073func (config UnpinChatMessageConfig) values() (url.Values, error) {
1074 v := url.Values{}
1075
1076 v.Add("chat_id", strconv.FormatInt(config.ChatID, 10))
1077
1078 return v, nil
1079}