all repos — telegram-bot-api @ 05db49c9e3f67bf0cc7987a2543c65115d89b9ef

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