all repos — telegram-bot-api @ ab39746be5ff2a4a9989b3b529896cb9ffbeed78

Golang bindings for the Telegram Bot API

helpers.go (view raw)

  1package tgbotapi
  2
  3import (
  4	"net/url"
  5)
  6
  7// NewMessage creates a new Message.
  8//
  9// chatID is where to send it, text is the message text.
 10func NewMessage(chatID int64, text string) MessageConfig {
 11	return MessageConfig{
 12		BaseChat: BaseChat{
 13			ChatID:           chatID,
 14			ReplyToMessageID: 0,
 15		},
 16		Text:                  text,
 17		DisableWebPagePreview: false,
 18	}
 19}
 20
 21// NewDeleteMessage creates a request to delete a message.
 22func NewDeleteMessage(chatID int64, messageID int) DeleteMessageConfig {
 23	return DeleteMessageConfig{
 24		ChatID:    chatID,
 25		MessageID: messageID,
 26	}
 27}
 28
 29// NewMessageToChannel creates a new Message that is sent to a channel
 30// by username.
 31//
 32// username is the username of the channel, text is the message text.
 33func NewMessageToChannel(username string, text string) MessageConfig {
 34	return MessageConfig{
 35		BaseChat: BaseChat{
 36			ChannelUsername: username,
 37		},
 38		Text: text,
 39	}
 40}
 41
 42// NewForward creates a new forward.
 43//
 44// chatID is where to send it, fromChatID is the source chat,
 45// and messageID is the ID of the original message.
 46func NewForward(chatID int64, fromChatID int64, messageID int) ForwardConfig {
 47	return ForwardConfig{
 48		BaseChat:   BaseChat{ChatID: chatID},
 49		FromChatID: fromChatID,
 50		MessageID:  messageID,
 51	}
 52}
 53
 54// NewPhotoUpload creates a new photo uploader.
 55//
 56// chatID is where to send it, file is a string path to the file,
 57// FileReader, or FileBytes.
 58//
 59// Note that you must send animated GIFs as a document.
 60func NewPhotoUpload(chatID int64, file interface{}) PhotoConfig {
 61	return PhotoConfig{
 62		BaseFile: BaseFile{
 63			BaseChat:    BaseChat{ChatID: chatID},
 64			File:        file,
 65			UseExisting: false,
 66		},
 67	}
 68}
 69
 70// NewPhotoUploadToChannel creates a new photo uploader to send a photo to a channel.
 71//
 72// username is the username of the channel, file is a string path to the file,
 73// FileReader, or FileBytes.
 74//
 75// Note that you must send animated GIFs as a document.
 76func NewPhotoUploadToChannel(username string, file interface{}) PhotoConfig {
 77	return PhotoConfig{
 78		BaseFile: BaseFile{
 79			BaseChat: BaseChat{
 80				ChannelUsername: username,
 81			},
 82			File:        file,
 83			UseExisting: false,
 84		},
 85	}
 86}
 87
 88// NewPhotoShare shares an existing photo.
 89// You may use this to reshare an existing photo without reuploading it.
 90//
 91// chatID is where to send it, fileID is the ID of the file
 92// already uploaded.
 93func NewPhotoShare(chatID int64, fileID string) PhotoConfig {
 94	return PhotoConfig{
 95		BaseFile: BaseFile{
 96			BaseChat:    BaseChat{ChatID: chatID},
 97			FileID:      fileID,
 98			UseExisting: true,
 99		},
100	}
101}
102
103// NewAudioUpload creates a new audio uploader.
104//
105// chatID is where to send it, file is a string path to the file,
106// FileReader, or FileBytes.
107func NewAudioUpload(chatID int64, file interface{}) AudioConfig {
108	return AudioConfig{
109		BaseFile: BaseFile{
110			BaseChat:    BaseChat{ChatID: chatID},
111			File:        file,
112			UseExisting: false,
113		},
114	}
115}
116
117// NewAudioShare shares an existing audio file.
118// You may use this to reshare an existing audio file without
119// reuploading it.
120//
121// chatID is where to send it, fileID is the ID of the audio
122// already uploaded.
123func NewAudioShare(chatID int64, fileID string) AudioConfig {
124	return AudioConfig{
125		BaseFile: BaseFile{
126			BaseChat:    BaseChat{ChatID: chatID},
127			FileID:      fileID,
128			UseExisting: true,
129		},
130	}
131}
132
133// NewDocumentUpload creates a new document uploader.
134//
135// chatID is where to send it, file is a string path to the file,
136// FileReader, or FileBytes.
137func NewDocumentUpload(chatID int64, file interface{}) DocumentConfig {
138	return DocumentConfig{
139		BaseFile: BaseFile{
140			BaseChat:    BaseChat{ChatID: chatID},
141			File:        file,
142			UseExisting: false,
143		},
144	}
145}
146
147// NewDocumentShare shares an existing document.
148// You may use this to reshare an existing document without
149// reuploading it.
150//
151// chatID is where to send it, fileID is the ID of the document
152// already uploaded.
153func NewDocumentShare(chatID int64, fileID string) DocumentConfig {
154	return DocumentConfig{
155		BaseFile: BaseFile{
156			BaseChat:    BaseChat{ChatID: chatID},
157			FileID:      fileID,
158			UseExisting: true,
159		},
160	}
161}
162
163// NewStickerUpload creates a new sticker uploader.
164//
165// chatID is where to send it, file is a string path to the file,
166// FileReader, or FileBytes.
167func NewStickerUpload(chatID int64, file interface{}) StickerConfig {
168	return StickerConfig{
169		BaseFile: BaseFile{
170			BaseChat:    BaseChat{ChatID: chatID},
171			File:        file,
172			UseExisting: false,
173		},
174	}
175}
176
177// NewStickerShare shares an existing sticker.
178// You may use this to reshare an existing sticker without
179// reuploading it.
180//
181// chatID is where to send it, fileID is the ID of the sticker
182// already uploaded.
183func NewStickerShare(chatID int64, fileID string) StickerConfig {
184	return StickerConfig{
185		BaseFile: BaseFile{
186			BaseChat:    BaseChat{ChatID: chatID},
187			FileID:      fileID,
188			UseExisting: true,
189		},
190	}
191}
192
193// NewVideoUpload creates a new video uploader.
194//
195// chatID is where to send it, file is a string path to the file,
196// FileReader, or FileBytes.
197func NewVideoUpload(chatID int64, file interface{}) VideoConfig {
198	return VideoConfig{
199		BaseFile: BaseFile{
200			BaseChat:    BaseChat{ChatID: chatID},
201			File:        file,
202			UseExisting: false,
203		},
204	}
205}
206
207// NewVideoShare shares an existing video.
208// You may use this to reshare an existing video without reuploading it.
209//
210// chatID is where to send it, fileID is the ID of the video
211// already uploaded.
212func NewVideoShare(chatID int64, fileID string) VideoConfig {
213	return VideoConfig{
214		BaseFile: BaseFile{
215			BaseChat:    BaseChat{ChatID: chatID},
216			FileID:      fileID,
217			UseExisting: true,
218		},
219	}
220}
221
222// NewAnimationUpload creates a new animation uploader.
223//
224// chatID is where to send it, file is a string path to the file,
225// FileReader, or FileBytes.
226func NewAnimationUpload(chatID int64, file interface{}) AnimationConfig {
227	return AnimationConfig{
228		BaseFile: BaseFile{
229			BaseChat:    BaseChat{ChatID: chatID},
230			File:        file,
231			UseExisting: false,
232		},
233	}
234}
235
236// NewAnimationShare shares an existing animation.
237// You may use this to reshare an existing animation without reuploading it.
238//
239// chatID is where to send it, fileID is the ID of the animation
240// already uploaded.
241func NewAnimationShare(chatID int64, fileID string) AnimationConfig {
242	return AnimationConfig{
243		BaseFile: BaseFile{
244			BaseChat:    BaseChat{ChatID: chatID},
245			FileID:      fileID,
246			UseExisting: true,
247		},
248	}
249}
250
251// NewVideoNoteUpload creates a new video note uploader.
252//
253// chatID is where to send it, file is a string path to the file,
254// FileReader, or FileBytes.
255func NewVideoNoteUpload(chatID int64, length int, file interface{}) VideoNoteConfig {
256	return VideoNoteConfig{
257		BaseFile: BaseFile{
258			BaseChat:    BaseChat{ChatID: chatID},
259			File:        file,
260			UseExisting: false,
261		},
262		Length: length,
263	}
264}
265
266// NewVideoNoteShare shares an existing video.
267// You may use this to reshare an existing video without reuploading it.
268//
269// chatID is where to send it, fileID is the ID of the video
270// already uploaded.
271func NewVideoNoteShare(chatID int64, length int, fileID string) VideoNoteConfig {
272	return VideoNoteConfig{
273		BaseFile: BaseFile{
274			BaseChat:    BaseChat{ChatID: chatID},
275			FileID:      fileID,
276			UseExisting: true,
277		},
278		Length: length,
279	}
280}
281
282// NewVoiceUpload creates a new voice uploader.
283//
284// chatID is where to send it, file is a string path to the file,
285// FileReader, or FileBytes.
286func NewVoiceUpload(chatID int64, file interface{}) VoiceConfig {
287	return VoiceConfig{
288		BaseFile: BaseFile{
289			BaseChat:    BaseChat{ChatID: chatID},
290			File:        file,
291			UseExisting: false,
292		},
293	}
294}
295
296// NewVoiceShare shares an existing voice.
297// You may use this to reshare an existing voice without reuploading it.
298//
299// chatID is where to send it, fileID is the ID of the video
300// already uploaded.
301func NewVoiceShare(chatID int64, fileID string) VoiceConfig {
302	return VoiceConfig{
303		BaseFile: BaseFile{
304			BaseChat:    BaseChat{ChatID: chatID},
305			FileID:      fileID,
306			UseExisting: true,
307		},
308	}
309}
310
311// NewMediaGroup creates a new media group. Files should be an array of
312// two to ten InputMediaPhoto or InputMediaVideo.
313func NewMediaGroup(chatID int64, files []interface{}) MediaGroupConfig {
314	return MediaGroupConfig{
315		ChatID: chatID,
316		Media:  files,
317	}
318}
319
320// NewInputMediaPhoto creates a new InputMediaPhoto.
321func NewInputMediaPhoto(media string) InputMediaPhoto {
322	return InputMediaPhoto{
323		BaseInputMedia{
324			Type:  "photo",
325			Media: media,
326		},
327	}
328}
329
330// NewInputMediaVideo creates a new InputMediaVideo.
331func NewInputMediaVideo(media string) InputMediaVideo {
332	return InputMediaVideo{
333		BaseInputMedia: BaseInputMedia{
334			Type:  "video",
335			Media: media,
336		},
337	}
338}
339
340// NewInputMediaAnimation creates a new InputMediaAnimation.
341func NewInputMediaAnimation(media string) InputMediaAnimation {
342	return InputMediaAnimation{
343		BaseInputMedia: BaseInputMedia{
344			Type:  "animation",
345			Media: media,
346		},
347	}
348}
349
350// NewInputMediaAudio creates a new InputMediaAudio.
351func NewInputMediaAudio(media string) InputMediaAudio {
352	return InputMediaAudio{
353		BaseInputMedia: BaseInputMedia{
354			Type:  "audio",
355			Media: media,
356		},
357	}
358}
359
360// NewInputMediaDocument creates a new InputMediaDocument.
361func NewInputMediaDocument(media string) InputMediaDocument {
362	return InputMediaDocument{
363		BaseInputMedia: BaseInputMedia{
364			Type:  "document",
365			Media: media,
366		},
367	}
368}
369
370// NewContact allows you to send a shared contact.
371func NewContact(chatID int64, phoneNumber, firstName string) ContactConfig {
372	return ContactConfig{
373		BaseChat: BaseChat{
374			ChatID: chatID,
375		},
376		PhoneNumber: phoneNumber,
377		FirstName:   firstName,
378	}
379}
380
381// NewLocation shares your location.
382//
383// chatID is where to send it, latitude and longitude are coordinates.
384func NewLocation(chatID int64, latitude float64, longitude float64) LocationConfig {
385	return LocationConfig{
386		BaseChat: BaseChat{
387			ChatID: chatID,
388		},
389		Latitude:  latitude,
390		Longitude: longitude,
391	}
392}
393
394// NewVenue allows you to send a venue and its location.
395func NewVenue(chatID int64, title, address string, latitude, longitude float64) VenueConfig {
396	return VenueConfig{
397		BaseChat: BaseChat{
398			ChatID: chatID,
399		},
400		Title:     title,
401		Address:   address,
402		Latitude:  latitude,
403		Longitude: longitude,
404	}
405}
406
407// NewChatAction sets a chat action.
408// Actions last for 5 seconds, or until your next action.
409//
410// chatID is where to send it, action should be set via Chat constants.
411func NewChatAction(chatID int64, action string) ChatActionConfig {
412	return ChatActionConfig{
413		BaseChat: BaseChat{ChatID: chatID},
414		Action:   action,
415	}
416}
417
418// NewUserProfilePhotos gets user profile photos.
419//
420// userID is the ID of the user you wish to get profile photos from.
421func NewUserProfilePhotos(userID int) UserProfilePhotosConfig {
422	return UserProfilePhotosConfig{
423		UserID: userID,
424		Offset: 0,
425		Limit:  0,
426	}
427}
428
429// NewUpdate gets updates since the last Offset.
430//
431// offset is the last Update ID to include.
432// You likely want to set this to the last Update ID plus 1.
433func NewUpdate(offset int) UpdateConfig {
434	return UpdateConfig{
435		Offset:  offset,
436		Limit:   0,
437		Timeout: 0,
438	}
439}
440
441// NewWebhook creates a new webhook.
442//
443// link is the url parsable link you wish to get the updates.
444func NewWebhook(link string) WebhookConfig {
445	u, _ := url.Parse(link)
446
447	return WebhookConfig{
448		URL: u,
449	}
450}
451
452// NewWebhookWithCert creates a new webhook with a certificate.
453//
454// link is the url you wish to get webhooks,
455// file contains a string to a file, FileReader, or FileBytes.
456func NewWebhookWithCert(link string, file interface{}) WebhookConfig {
457	u, _ := url.Parse(link)
458
459	return WebhookConfig{
460		URL:         u,
461		Certificate: file,
462	}
463}
464
465// NewInlineQueryResultArticle creates a new inline query article.
466func NewInlineQueryResultArticle(id, title, messageText string) InlineQueryResultArticle {
467	return InlineQueryResultArticle{
468		Type:  "article",
469		ID:    id,
470		Title: title,
471		InputMessageContent: InputTextMessageContent{
472			Text: messageText,
473		},
474	}
475}
476
477// NewInlineQueryResultArticleMarkdown creates a new inline query article with Markdown parsing.
478func NewInlineQueryResultArticleMarkdown(id, title, messageText string) InlineQueryResultArticle {
479	return InlineQueryResultArticle{
480		Type:  "article",
481		ID:    id,
482		Title: title,
483		InputMessageContent: InputTextMessageContent{
484			Text:      messageText,
485			ParseMode: "Markdown",
486		},
487	}
488}
489
490// NewInlineQueryResultArticleHTML creates a new inline query article with HTML parsing.
491func NewInlineQueryResultArticleHTML(id, title, messageText string) InlineQueryResultArticle {
492	return InlineQueryResultArticle{
493		Type:  "article",
494		ID:    id,
495		Title: title,
496		InputMessageContent: InputTextMessageContent{
497			Text:      messageText,
498			ParseMode: "HTML",
499		},
500	}
501}
502
503// NewInlineQueryResultGIF creates a new inline query GIF.
504func NewInlineQueryResultGIF(id, url string) InlineQueryResultGIF {
505	return InlineQueryResultGIF{
506		Type: "gif",
507		ID:   id,
508		URL:  url,
509	}
510}
511
512// NewInlineQueryResultMPEG4GIF creates a new inline query MPEG4 GIF.
513func NewInlineQueryResultMPEG4GIF(id, url string) InlineQueryResultMPEG4GIF {
514	return InlineQueryResultMPEG4GIF{
515		Type: "mpeg4_gif",
516		ID:   id,
517		URL:  url,
518	}
519}
520
521// NewInlineQueryResultPhoto creates a new inline query photo.
522func NewInlineQueryResultPhoto(id, url string) InlineQueryResultPhoto {
523	return InlineQueryResultPhoto{
524		Type: "photo",
525		ID:   id,
526		URL:  url,
527	}
528}
529
530// NewInlineQueryResultPhotoWithThumb creates a new inline query photo.
531func NewInlineQueryResultPhotoWithThumb(id, url, thumb string) InlineQueryResultPhoto {
532	return InlineQueryResultPhoto{
533		Type:     "photo",
534		ID:       id,
535		URL:      url,
536		ThumbURL: thumb,
537	}
538}
539
540// NewInlineQueryResultVideo creates a new inline query video.
541func NewInlineQueryResultVideo(id, url string) InlineQueryResultVideo {
542	return InlineQueryResultVideo{
543		Type: "video",
544		ID:   id,
545		URL:  url,
546	}
547}
548
549// NewInlineQueryResultAudio creates a new inline query audio.
550func NewInlineQueryResultAudio(id, url, title string) InlineQueryResultAudio {
551	return InlineQueryResultAudio{
552		Type:  "audio",
553		ID:    id,
554		URL:   url,
555		Title: title,
556	}
557}
558
559// NewInlineQueryResultVoice creates a new inline query voice.
560func NewInlineQueryResultVoice(id, url, title string) InlineQueryResultVoice {
561	return InlineQueryResultVoice{
562		Type:  "voice",
563		ID:    id,
564		URL:   url,
565		Title: title,
566	}
567}
568
569// NewInlineQueryResultDocument creates a new inline query document.
570func NewInlineQueryResultDocument(id, url, title, mimeType string) InlineQueryResultDocument {
571	return InlineQueryResultDocument{
572		Type:     "document",
573		ID:       id,
574		URL:      url,
575		Title:    title,
576		MimeType: mimeType,
577	}
578}
579
580// NewInlineQueryResultLocation creates a new inline query location.
581func NewInlineQueryResultLocation(id, title string, latitude, longitude float64) InlineQueryResultLocation {
582	return InlineQueryResultLocation{
583		Type:      "location",
584		ID:        id,
585		Title:     title,
586		Latitude:  latitude,
587		Longitude: longitude,
588	}
589}
590
591// NewEditMessageText allows you to edit the text of a message.
592func NewEditMessageText(chatID int64, messageID int, text string) EditMessageTextConfig {
593	return EditMessageTextConfig{
594		BaseEdit: BaseEdit{
595			ChatID:    chatID,
596			MessageID: messageID,
597		},
598		Text: text,
599	}
600}
601
602// NewEditMessageCaption allows you to edit the caption of a message.
603func NewEditMessageCaption(chatID int64, messageID int, caption string) EditMessageCaptionConfig {
604	return EditMessageCaptionConfig{
605		BaseEdit: BaseEdit{
606			ChatID:    chatID,
607			MessageID: messageID,
608		},
609		Caption: caption,
610	}
611}
612
613// NewEditMessageReplyMarkup allows you to edit the inline
614// keyboard markup.
615func NewEditMessageReplyMarkup(chatID int64, messageID int, replyMarkup InlineKeyboardMarkup) EditMessageReplyMarkupConfig {
616	return EditMessageReplyMarkupConfig{
617		BaseEdit: BaseEdit{
618			ChatID:      chatID,
619			MessageID:   messageID,
620			ReplyMarkup: &replyMarkup,
621		},
622	}
623}
624
625// NewHideKeyboard hides the keyboard, with the option for being selective
626// or hiding for everyone.
627func NewHideKeyboard(selective bool) ReplyKeyboardHide {
628	log.Println("NewHideKeyboard is deprecated, please use NewRemoveKeyboard")
629
630	return ReplyKeyboardHide{
631		HideKeyboard: true,
632		Selective:    selective,
633	}
634}
635
636// NewRemoveKeyboard hides the keyboard, with the option for being selective
637// or hiding for everyone.
638func NewRemoveKeyboard(selective bool) ReplyKeyboardRemove {
639	return ReplyKeyboardRemove{
640		RemoveKeyboard: true,
641		Selective:      selective,
642	}
643}
644
645// NewKeyboardButton creates a regular keyboard button.
646func NewKeyboardButton(text string) KeyboardButton {
647	return KeyboardButton{
648		Text: text,
649	}
650}
651
652// NewKeyboardButtonContact creates a keyboard button that requests
653// user contact information upon click.
654func NewKeyboardButtonContact(text string) KeyboardButton {
655	return KeyboardButton{
656		Text:           text,
657		RequestContact: true,
658	}
659}
660
661// NewKeyboardButtonLocation creates a keyboard button that requests
662// user location information upon click.
663func NewKeyboardButtonLocation(text string) KeyboardButton {
664	return KeyboardButton{
665		Text:            text,
666		RequestLocation: true,
667	}
668}
669
670// NewKeyboardButtonRow creates a row of keyboard buttons.
671func NewKeyboardButtonRow(buttons ...KeyboardButton) []KeyboardButton {
672	var row []KeyboardButton
673
674	row = append(row, buttons...)
675
676	return row
677}
678
679// NewReplyKeyboard creates a new regular keyboard with sane defaults.
680func NewReplyKeyboard(rows ...[]KeyboardButton) ReplyKeyboardMarkup {
681	var keyboard [][]KeyboardButton
682
683	keyboard = append(keyboard, rows...)
684
685	return ReplyKeyboardMarkup{
686		ResizeKeyboard: true,
687		Keyboard:       keyboard,
688	}
689}
690
691// NewInlineKeyboardButtonData creates an inline keyboard button with text
692// and data for a callback.
693func NewInlineKeyboardButtonData(text, data string) InlineKeyboardButton {
694	return InlineKeyboardButton{
695		Text:         text,
696		CallbackData: &data,
697	}
698}
699
700// NewInlineKeyboardButtonURL creates an inline keyboard button with text
701// which goes to a URL.
702func NewInlineKeyboardButtonURL(text, url string) InlineKeyboardButton {
703	return InlineKeyboardButton{
704		Text: text,
705		URL:  &url,
706	}
707}
708
709// NewInlineKeyboardButtonSwitch creates an inline keyboard button with
710// text which allows the user to switch to a chat or return to a chat.
711func NewInlineKeyboardButtonSwitch(text, sw string) InlineKeyboardButton {
712	return InlineKeyboardButton{
713		Text:              text,
714		SwitchInlineQuery: &sw,
715	}
716}
717
718// NewInlineKeyboardRow creates an inline keyboard row with buttons.
719func NewInlineKeyboardRow(buttons ...InlineKeyboardButton) []InlineKeyboardButton {
720	var row []InlineKeyboardButton
721
722	row = append(row, buttons...)
723
724	return row
725}
726
727// NewInlineKeyboardMarkup creates a new inline keyboard.
728func NewInlineKeyboardMarkup(rows ...[]InlineKeyboardButton) InlineKeyboardMarkup {
729	var keyboard [][]InlineKeyboardButton
730
731	keyboard = append(keyboard, rows...)
732
733	return InlineKeyboardMarkup{
734		InlineKeyboard: keyboard,
735	}
736}
737
738// NewCallback creates a new callback message.
739func NewCallback(id, text string) CallbackConfig {
740	return CallbackConfig{
741		CallbackQueryID: id,
742		Text:            text,
743		ShowAlert:       false,
744	}
745}
746
747// NewCallbackWithAlert creates a new callback message that alerts
748// the user.
749func NewCallbackWithAlert(id, text string) CallbackConfig {
750	return CallbackConfig{
751		CallbackQueryID: id,
752		Text:            text,
753		ShowAlert:       true,
754	}
755}
756
757// NewInvoice creates a new Invoice request to the user.
758func NewInvoice(chatID int64, title, description, payload, providerToken, startParameter, currency string, prices []LabeledPrice) InvoiceConfig {
759	return InvoiceConfig{
760		BaseChat:       BaseChat{ChatID: chatID},
761		Title:          title,
762		Description:    description,
763		Payload:        payload,
764		ProviderToken:  providerToken,
765		StartParameter: startParameter,
766		Currency:       currency,
767		Prices:         prices}
768}
769
770// NewSetChatPhotoUpload creates a new chat photo uploader.
771//
772// chatID is where to send it, file is a string path to the file,
773// FileReader, or FileBytes.
774//
775// Note that you must send animated GIFs as a document.
776func NewSetChatPhotoUpload(chatID int64, file interface{}) SetChatPhotoConfig {
777	return SetChatPhotoConfig{
778		BaseFile: BaseFile{
779			BaseChat:    BaseChat{ChatID: chatID},
780			File:        file,
781			UseExisting: false,
782		},
783	}
784}
785
786// NewSetChatPhotoShare shares an existing photo.
787// You may use this to reshare an existing photo without reuploading it.
788//
789// chatID is where to send it, fileID is the ID of the file
790// already uploaded.
791func NewSetChatPhotoShare(chatID int64, fileID string) SetChatPhotoConfig {
792	return SetChatPhotoConfig{
793		BaseFile: BaseFile{
794			BaseChat:    BaseChat{ChatID: chatID},
795			FileID:      fileID,
796			UseExisting: true,
797		},
798	}
799}
800
801// NewChatTitle allows you to update the title of a chat.
802func NewChatTitle(chatID int64, title string) SetChatTitleConfig {
803	return SetChatTitleConfig{
804		ChatID: chatID,
805		Title:  title,
806	}
807}
808
809// NewChatDescription allows you to update the description of a chat.
810func NewChatDescription(chatID int64, description string) SetChatDescriptionConfig {
811	return SetChatDescriptionConfig{
812		ChatID:      chatID,
813		Description: description,
814	}
815}
816
817// NewChatPhoto allows you to update the photo for a chat.
818func NewChatPhoto(chatID int64, photo interface{}) SetChatPhotoConfig {
819	return SetChatPhotoConfig{
820		BaseFile: BaseFile{
821			BaseChat: BaseChat{
822				ChatID: chatID,
823			},
824			File: photo,
825		},
826	}
827}
828
829// NewDeleteChatPhoto allows you to delete the photo for a chat.
830func NewDeleteChatPhoto(chatID int64, photo interface{}) DeleteChatPhotoConfig {
831	return DeleteChatPhotoConfig{
832		ChatID: chatID,
833	}
834}
835
836// NewPoll allows you to create a new poll.
837func NewPoll(chatID int64, question string, options ...string) SendPollConfig {
838	return SendPollConfig{
839		BaseChat: BaseChat{
840			ChatID: chatID,
841		},
842		Question: question,
843		Options:  options,
844	}
845}
846
847// NewStopPoll allows you to stop a poll.
848func NewStopPoll(chatID int64, messageID int) StopPollConfig {
849	return StopPollConfig{
850		BaseEdit{
851			ChatID:    chatID,
852			MessageID: messageID,
853		},
854	}
855}