all repos — telegram-bot-api @ cb3a14a3b5d4216fd32fd6554cf3477616c697ed

Golang bindings for the Telegram Bot API

configs.go (view raw)

   1package tgbotapi
   2
   3import (
   4	"io"
   5	"net/url"
   6)
   7
   8// Telegram constants
   9const (
  10	// APIEndpoint is the endpoint for all API methods,
  11	// with formatting for Sprintf.
  12	APIEndpoint = "https://api.telegram.org/bot%s/%s"
  13	// FileEndpoint is the endpoint for downloading a file from Telegram.
  14	FileEndpoint = "https://api.telegram.org/file/bot%s/%s"
  15)
  16
  17// Constant values for ChatActions
  18const (
  19	ChatTyping         = "typing"
  20	ChatUploadPhoto    = "upload_photo"
  21	ChatRecordVideo    = "record_video"
  22	ChatUploadVideo    = "upload_video"
  23	ChatRecordAudio    = "record_audio"
  24	ChatUploadAudio    = "upload_audio"
  25	ChatUploadDocument = "upload_document"
  26	ChatFindLocation   = "find_location"
  27)
  28
  29// API errors
  30const (
  31	// ErrAPIForbidden happens when a token is bad
  32	ErrAPIForbidden = "forbidden"
  33)
  34
  35// Constant values for ParseMode in MessageConfig
  36const (
  37	ModeMarkdown = "Markdown"
  38	ModeHTML     = "HTML"
  39)
  40
  41// Library errors
  42const (
  43	// ErrBadFileType happens when you pass an unknown type
  44	ErrBadFileType = "bad file type"
  45	ErrBadURL      = "bad or empty url"
  46)
  47
  48// Chattable is any config type that can be sent.
  49type Chattable interface {
  50	params() (Params, error)
  51	method() string
  52}
  53
  54// Fileable is any config type that can be sent that includes a file.
  55type Fileable interface {
  56	Chattable
  57	name() string
  58	getFile() interface{}
  59	useExistingFile() bool
  60}
  61
  62// BaseChat is base type for all chat config types.
  63type BaseChat struct {
  64	ChatID              int64 // required
  65	ChannelUsername     string
  66	ReplyToMessageID    int
  67	ReplyMarkup         interface{}
  68	DisableNotification bool
  69}
  70
  71func (chat *BaseChat) params() (Params, error) {
  72	params := make(Params)
  73
  74	params.AddFirstValid("chat_id", chat.ChatID, chat.ChannelUsername)
  75	params.AddNonZero("reply_to_message_id", chat.ReplyToMessageID)
  76	params.AddBool("disable_notification", chat.DisableNotification)
  77
  78	err := params.AddInterface("reply_markup", chat.ReplyMarkup)
  79
  80	return params, err
  81}
  82
  83// BaseFile is a base type for all file config types.
  84type BaseFile struct {
  85	BaseChat
  86	File        interface{}
  87	FileID      string
  88	UseExisting bool
  89	MimeType    string
  90	FileSize    int
  91}
  92
  93func (file BaseFile) params() (Params, error) {
  94	params, err := file.BaseChat.params()
  95
  96	params.AddNonEmpty("mime_type", file.MimeType)
  97	params.AddNonZero("file_size", file.FileSize)
  98
  99	return params, err
 100}
 101
 102func (file BaseFile) getFile() interface{} {
 103	return file.File
 104}
 105
 106func (file BaseFile) useExistingFile() bool {
 107	return file.UseExisting
 108}
 109
 110// BaseEdit is base type of all chat edits.
 111type BaseEdit struct {
 112	ChatID          int64
 113	ChannelUsername string
 114	MessageID       int
 115	InlineMessageID string
 116	ReplyMarkup     *InlineKeyboardMarkup
 117}
 118
 119func (edit BaseEdit) params() (Params, error) {
 120	params := make(Params)
 121
 122	if edit.InlineMessageID != "" {
 123		params["inline_message_id"] = edit.InlineMessageID
 124	} else {
 125		params.AddFirstValid("chat_id", edit.ChatID, edit.ChannelUsername)
 126		params.AddNonZero("message_id", edit.MessageID)
 127	}
 128
 129	err := params.AddInterface("reply_markup", edit.ReplyMarkup)
 130
 131	return params, err
 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}
 141
 142func (config MessageConfig) params() (Params, error) {
 143	params, err := config.BaseChat.params()
 144	if err != nil {
 145		return params, err
 146	}
 147
 148	params.AddNonEmpty("text", config.Text)
 149	params.AddBool("disable_web_page_preview", config.DisableWebPagePreview)
 150	params.AddNonEmpty("parse_mode", config.ParseMode)
 151
 152	return params, nil
 153}
 154
 155func (config MessageConfig) method() string {
 156	return "sendMessage"
 157}
 158
 159// ForwardConfig contains information about a ForwardMessage request.
 160type ForwardConfig struct {
 161	BaseChat
 162	FromChatID          int64 // required
 163	FromChannelUsername string
 164	MessageID           int // required
 165}
 166
 167func (config ForwardConfig) params() (Params, error) {
 168	params, err := config.BaseChat.params()
 169	if err != nil {
 170		return params, err
 171	}
 172
 173	params.AddNonZero64("from_chat_id", config.FromChatID)
 174	params.AddNonZero("message_id", config.MessageID)
 175
 176	return params, nil
 177}
 178
 179func (config ForwardConfig) method() string {
 180	return "forwardMessage"
 181}
 182
 183// PhotoConfig contains information about a SendPhoto request.
 184type PhotoConfig struct {
 185	BaseFile
 186	Caption   string
 187	ParseMode string
 188}
 189
 190func (config PhotoConfig) params() (Params, error) {
 191	params, err := config.BaseFile.params()
 192
 193	params.AddNonEmpty(config.name(), config.FileID)
 194	params.AddNonEmpty("caption", config.Caption)
 195	params.AddNonEmpty("parse_mode", config.ParseMode)
 196
 197	return params, err
 198}
 199
 200func (config PhotoConfig) name() string {
 201	return "photo"
 202}
 203
 204func (config PhotoConfig) method() string {
 205	return "sendPhoto"
 206}
 207
 208// AudioConfig contains information about a SendAudio request.
 209type AudioConfig struct {
 210	BaseFile
 211	Caption   string
 212	ParseMode string
 213	Duration  int
 214	Performer string
 215	Title     string
 216}
 217
 218func (config AudioConfig) params() (Params, error) {
 219	params, err := config.BaseChat.params()
 220	if err != nil {
 221		return params, err
 222	}
 223
 224	params.AddNonEmpty(config.name(), config.FileID)
 225	params.AddNonZero("duration", config.Duration)
 226	params.AddNonEmpty("performer", config.Performer)
 227	params.AddNonEmpty("title", config.Title)
 228	params.AddNonEmpty("caption", config.Caption)
 229	params.AddNonEmpty("parse_mode", config.ParseMode)
 230
 231	return params, nil
 232}
 233
 234func (config AudioConfig) name() string {
 235	return "audio"
 236}
 237
 238func (config AudioConfig) method() string {
 239	return "sendAudio"
 240}
 241
 242// DocumentConfig contains information about a SendDocument request.
 243type DocumentConfig struct {
 244	BaseFile
 245	Caption   string
 246	ParseMode string
 247}
 248
 249func (config DocumentConfig) params() (Params, error) {
 250	params, err := config.BaseFile.params()
 251
 252	params.AddNonEmpty(config.name(), config.FileID)
 253	params.AddNonEmpty("caption", config.Caption)
 254	params.AddNonEmpty("parse_mode", config.ParseMode)
 255
 256	return params, err
 257}
 258
 259func (config DocumentConfig) name() string {
 260	return "document"
 261}
 262
 263func (config DocumentConfig) method() string {
 264	return "sendDocument"
 265}
 266
 267// StickerConfig contains information about a SendSticker request.
 268type StickerConfig struct {
 269	BaseFile
 270}
 271
 272func (config StickerConfig) params() (Params, error) {
 273	params, err := config.BaseChat.params()
 274
 275	params.AddNonEmpty(config.name(), config.FileID)
 276
 277	return params, err
 278}
 279
 280func (config StickerConfig) name() string {
 281	return "sticker"
 282}
 283
 284func (config StickerConfig) method() string {
 285	return "sendSticker"
 286}
 287
 288// VideoConfig contains information about a SendVideo request.
 289type VideoConfig struct {
 290	BaseFile
 291	Duration          int
 292	Caption           string
 293	ParseMode         string
 294	SupportsStreaming bool
 295}
 296
 297func (config VideoConfig) params() (Params, error) {
 298	params, err := config.BaseChat.params()
 299
 300	params.AddNonEmpty(config.name(), config.FileID)
 301	params.AddNonZero("duration", config.Duration)
 302	params.AddNonEmpty("caption", config.Caption)
 303	params.AddNonEmpty("parse_mode", config.ParseMode)
 304	params.AddBool("supports_streaming", config.SupportsStreaming)
 305
 306	return params, err
 307}
 308
 309func (config VideoConfig) name() string {
 310	return "video"
 311}
 312
 313func (config VideoConfig) method() string {
 314	return "sendVideo"
 315}
 316
 317// AnimationConfig contains information about a SendAnimation request.
 318type AnimationConfig struct {
 319	BaseFile
 320	Duration  int
 321	Caption   string
 322	ParseMode string
 323}
 324
 325func (config AnimationConfig) params() (Params, error) {
 326	params, err := config.BaseChat.params()
 327
 328	params.AddNonEmpty(config.name(), config.FileID)
 329	params.AddNonZero("duration", config.Duration)
 330	params.AddNonEmpty("caption", config.Caption)
 331	params.AddNonEmpty("parse_mode", config.ParseMode)
 332
 333	return params, err
 334}
 335
 336func (config AnimationConfig) name() string {
 337	return "animation"
 338}
 339
 340func (config AnimationConfig) method() string {
 341	return "sendAnimation"
 342}
 343
 344// VideoNoteConfig contains information about a SendVideoNote request.
 345type VideoNoteConfig struct {
 346	BaseFile
 347	Duration int
 348	Length   int
 349}
 350
 351func (config VideoNoteConfig) params() (Params, error) {
 352	params, err := config.BaseChat.params()
 353
 354	params.AddNonEmpty(config.name(), config.FileID)
 355	params.AddNonZero("duration", config.Duration)
 356	params.AddNonZero("length", config.Length)
 357
 358	return params, err
 359}
 360
 361func (config VideoNoteConfig) name() string {
 362	return "video_note"
 363}
 364
 365func (config VideoNoteConfig) method() string {
 366	return "sendVideoNote"
 367}
 368
 369// VoiceConfig contains information about a SendVoice request.
 370type VoiceConfig struct {
 371	BaseFile
 372	Caption   string
 373	ParseMode string
 374	Duration  int
 375}
 376
 377func (config VoiceConfig) params() (Params, error) {
 378	params, err := config.BaseChat.params()
 379
 380	params.AddNonEmpty(config.name(), config.FileID)
 381	params.AddNonZero("duration", config.Duration)
 382	params.AddNonEmpty("caption", config.Caption)
 383	params.AddNonEmpty("parse_mode", config.ParseMode)
 384
 385	return params, err
 386}
 387
 388func (config VoiceConfig) name() string {
 389	return "voice"
 390}
 391
 392func (config VoiceConfig) method() string {
 393	return "sendVoice"
 394}
 395
 396// LocationConfig contains information about a SendLocation request.
 397type LocationConfig struct {
 398	BaseChat
 399	Latitude   float64 // required
 400	Longitude  float64 // required
 401	LivePeriod int     // optional
 402}
 403
 404func (config LocationConfig) params() (Params, error) {
 405	params, err := config.BaseChat.params()
 406
 407	params.AddNonZeroFloat("latitude", config.Latitude)
 408	params.AddNonZeroFloat("longitude", config.Longitude)
 409	params.AddNonZero("live_period", config.LivePeriod)
 410
 411	return params, err
 412}
 413
 414func (config LocationConfig) method() string {
 415	return "sendLocation"
 416}
 417
 418// EditMessageLiveLocationConfig allows you to update a live location.
 419type EditMessageLiveLocationConfig struct {
 420	BaseEdit
 421	Latitude  float64 // required
 422	Longitude float64 // required
 423}
 424
 425func (config EditMessageLiveLocationConfig) params() (Params, error) {
 426	params, err := config.BaseEdit.params()
 427
 428	params.AddNonZeroFloat("latitude", config.Latitude)
 429	params.AddNonZeroFloat("longitude", config.Longitude)
 430
 431	return params, err
 432}
 433
 434func (config EditMessageLiveLocationConfig) method() string {
 435	return "editMessageLiveLocation"
 436}
 437
 438// StopMessageLiveLocationConfig stops updating a live location.
 439type StopMessageLiveLocationConfig struct {
 440	BaseEdit
 441}
 442
 443func (config StopMessageLiveLocationConfig) params() (Params, error) {
 444	return config.BaseEdit.params()
 445}
 446
 447func (config StopMessageLiveLocationConfig) method() string {
 448	return "stopMessageLiveLocation"
 449}
 450
 451// VenueConfig contains information about a SendVenue request.
 452type VenueConfig struct {
 453	BaseChat
 454	Latitude     float64 // required
 455	Longitude    float64 // required
 456	Title        string  // required
 457	Address      string  // required
 458	FoursquareID string
 459}
 460
 461func (config VenueConfig) params() (Params, error) {
 462	params, err := config.BaseChat.params()
 463
 464	params.AddNonZeroFloat("latitude", config.Latitude)
 465	params.AddNonZeroFloat("longitude", config.Longitude)
 466	params["title"] = config.Title
 467	params["address"] = config.Address
 468	params.AddNonEmpty("foursquare_id", config.FoursquareID)
 469
 470	return params, err
 471}
 472
 473func (config VenueConfig) method() string {
 474	return "sendVenue"
 475}
 476
 477// ContactConfig allows you to send a contact.
 478type ContactConfig struct {
 479	BaseChat
 480	PhoneNumber string
 481	FirstName   string
 482	LastName    string
 483	VCard       string
 484}
 485
 486func (config ContactConfig) params() (Params, error) {
 487	params, err := config.BaseChat.params()
 488
 489	params["phone_number"] = config.PhoneNumber
 490	params["first_name"] = config.FirstName
 491
 492	params.AddNonEmpty("last_name", config.LastName)
 493	params.AddNonEmpty("vcard", config.VCard)
 494
 495	return params, err
 496}
 497
 498func (config ContactConfig) method() string {
 499	return "sendContact"
 500}
 501
 502// GameConfig allows you to send a game.
 503type GameConfig struct {
 504	BaseChat
 505	GameShortName string
 506}
 507
 508func (config GameConfig) params() (Params, error) {
 509	params, err := config.BaseChat.params()
 510
 511	params["game_short_name"] = config.GameShortName
 512
 513	return params, err
 514}
 515
 516func (config GameConfig) method() string {
 517	return "sendGame"
 518}
 519
 520// SetGameScoreConfig allows you to update the game score in a chat.
 521type SetGameScoreConfig struct {
 522	UserID             int
 523	Score              int
 524	Force              bool
 525	DisableEditMessage bool
 526	ChatID             int64
 527	ChannelUsername    string
 528	MessageID          int
 529	InlineMessageID    string
 530}
 531
 532func (config SetGameScoreConfig) params() (Params, error) {
 533	params := make(Params)
 534
 535	params.AddNonZero("user_id", config.UserID)
 536	params.AddNonZero("scrore", config.Score)
 537	params.AddBool("disable_edit_message", config.DisableEditMessage)
 538
 539	if config.InlineMessageID != "" {
 540		params["inline_message_id"] = config.InlineMessageID
 541	} else {
 542		params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
 543		params.AddNonZero("message_id", config.MessageID)
 544	}
 545
 546	return params, nil
 547}
 548
 549func (config SetGameScoreConfig) method() string {
 550	return "setGameScore"
 551}
 552
 553// GetGameHighScoresConfig allows you to fetch the high scores for a game.
 554type GetGameHighScoresConfig struct {
 555	UserID          int
 556	ChatID          int
 557	ChannelUsername string
 558	MessageID       int
 559	InlineMessageID string
 560}
 561
 562func (config GetGameHighScoresConfig) params() (Params, error) {
 563	params := make(Params)
 564
 565	params.AddNonZero("user_id", config.UserID)
 566
 567	if config.InlineMessageID != "" {
 568		params["inline_message_id"] = config.InlineMessageID
 569	} else {
 570		params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
 571		params.AddNonZero("message_id", config.MessageID)
 572	}
 573
 574	return params, nil
 575}
 576
 577func (config GetGameHighScoresConfig) method() string {
 578	return "getGameHighScores"
 579}
 580
 581// ChatActionConfig contains information about a SendChatAction request.
 582type ChatActionConfig struct {
 583	BaseChat
 584	Action string // required
 585}
 586
 587func (config ChatActionConfig) params() (Params, error) {
 588	params, err := config.BaseChat.params()
 589
 590	params["action"] = config.Action
 591
 592	return params, err
 593}
 594
 595func (config ChatActionConfig) method() string {
 596	return "sendChatAction"
 597}
 598
 599// EditMessageTextConfig allows you to modify the text in a message.
 600type EditMessageTextConfig struct {
 601	BaseEdit
 602	Text                  string
 603	ParseMode             string
 604	DisableWebPagePreview bool
 605}
 606
 607func (config EditMessageTextConfig) params() (Params, error) {
 608	params, err := config.BaseEdit.params()
 609
 610	params["text"] = config.Text
 611	params.AddNonEmpty("parse_mode", config.ParseMode)
 612	params.AddBool("disable_web_page_preview", config.DisableWebPagePreview)
 613
 614	return params, err
 615}
 616
 617func (config EditMessageTextConfig) method() string {
 618	return "editMessageText"
 619}
 620
 621// EditMessageCaptionConfig allows you to modify the caption of a message.
 622type EditMessageCaptionConfig struct {
 623	BaseEdit
 624	Caption   string
 625	ParseMode string
 626}
 627
 628func (config EditMessageCaptionConfig) params() (Params, error) {
 629	params, err := config.BaseEdit.params()
 630
 631	params["caption"] = config.Caption
 632	params.AddNonEmpty("parse_mode", config.ParseMode)
 633
 634	return params, err
 635}
 636
 637func (config EditMessageCaptionConfig) method() string {
 638	return "editMessageCaption"
 639}
 640
 641// EditMessageMediaConfig contains information about editing a message's media.
 642type EditMessageMediaConfig struct {
 643	BaseEdit
 644
 645	Media interface{}
 646}
 647
 648func (EditMessageMediaConfig) method() string {
 649	return "editMessageMedia"
 650}
 651
 652func (config EditMessageMediaConfig) params() (Params, error) {
 653	params, err := config.BaseEdit.params()
 654
 655	params.AddInterface("media", config.Media)
 656
 657	return params, err
 658}
 659
 660// EditMessageReplyMarkupConfig allows you to modify the reply markup
 661// of a message.
 662type EditMessageReplyMarkupConfig struct {
 663	BaseEdit
 664}
 665
 666func (config EditMessageReplyMarkupConfig) params() (Params, error) {
 667	return config.BaseEdit.params()
 668}
 669
 670func (config EditMessageReplyMarkupConfig) method() string {
 671	return "editMessageReplyMarkup"
 672}
 673
 674// UserProfilePhotosConfig contains information about a
 675// GetUserProfilePhotos request.
 676type UserProfilePhotosConfig struct {
 677	UserID int
 678	Offset int
 679	Limit  int
 680}
 681
 682func (UserProfilePhotosConfig) method() string {
 683	return "getUserProfilePhotos"
 684}
 685
 686func (config UserProfilePhotosConfig) params() (Params, error) {
 687	params := make(Params)
 688
 689	params.AddNonZero("user_id", config.UserID)
 690	params.AddNonZero("offset", config.Offset)
 691	params.AddNonZero("limit", config.Limit)
 692
 693	return params, nil
 694}
 695
 696// FileConfig has information about a file hosted on Telegram.
 697type FileConfig struct {
 698	FileID string
 699}
 700
 701func (FileConfig) method() string {
 702	return "getFile"
 703}
 704
 705func (config FileConfig) params() (Params, error) {
 706	params := make(Params)
 707
 708	params["file_id"] = config.FileID
 709
 710	return params, nil
 711}
 712
 713// UpdateConfig contains information about a GetUpdates request.
 714type UpdateConfig struct {
 715	Offset  int
 716	Limit   int
 717	Timeout int
 718}
 719
 720func (UpdateConfig) method() string {
 721	return "getUpdates"
 722}
 723
 724func (config UpdateConfig) params() (Params, error) {
 725	params := make(Params)
 726
 727	params.AddNonZero("offset", config.Offset)
 728	params.AddNonZero("limit", config.Limit)
 729	params.AddNonZero("timeout", config.Timeout)
 730
 731	return params, nil
 732}
 733
 734// WebhookConfig contains information about a SetWebhook request.
 735type WebhookConfig struct {
 736	URL            *url.URL
 737	Certificate    interface{}
 738	MaxConnections int
 739	AllowedUpdates []string
 740}
 741
 742func (config WebhookConfig) method() string {
 743	return "setWebhook"
 744}
 745
 746func (config WebhookConfig) params() (Params, error) {
 747	params := make(Params)
 748
 749	if config.URL != nil {
 750		params["url"] = config.URL.String()
 751	}
 752
 753	params.AddNonZero("max_connections", config.MaxConnections)
 754	params.AddInterface("allowed_updates", config.AllowedUpdates)
 755
 756	return params, nil
 757}
 758
 759func (config WebhookConfig) name() string {
 760	return "certificate"
 761}
 762
 763func (config WebhookConfig) getFile() interface{} {
 764	return config.Certificate
 765}
 766
 767func (config WebhookConfig) useExistingFile() bool {
 768	return config.URL != nil
 769}
 770
 771// RemoveWebhookConfig is a helper to remove a webhook.
 772type RemoveWebhookConfig struct {
 773}
 774
 775func (config RemoveWebhookConfig) method() string {
 776	return "setWebhook"
 777}
 778
 779func (config RemoveWebhookConfig) params() (Params, error) {
 780	return nil, nil
 781}
 782
 783// FileBytes contains information about a set of bytes to upload
 784// as a File.
 785type FileBytes struct {
 786	Name  string
 787	Bytes []byte
 788}
 789
 790// FileReader contains information about a reader to upload as a File.
 791// If Size is -1, it will read the entire Reader into memory to
 792// calculate a Size.
 793type FileReader struct {
 794	Name   string
 795	Reader io.Reader
 796	Size   int64
 797}
 798
 799// InlineConfig contains information on making an InlineQuery response.
 800type InlineConfig struct {
 801	InlineQueryID     string        `json:"inline_query_id"`
 802	Results           []interface{} `json:"results"`
 803	CacheTime         int           `json:"cache_time"`
 804	IsPersonal        bool          `json:"is_personal"`
 805	NextOffset        string        `json:"next_offset"`
 806	SwitchPMText      string        `json:"switch_pm_text"`
 807	SwitchPMParameter string        `json:"switch_pm_parameter"`
 808}
 809
 810func (config InlineConfig) method() string {
 811	return "answerInlineQuery"
 812}
 813
 814func (config InlineConfig) params() (Params, error) {
 815	params := make(Params)
 816
 817	params["inline_query_id"] = config.InlineQueryID
 818	params.AddNonZero("cache_time", config.CacheTime)
 819	params.AddBool("is_personal", config.IsPersonal)
 820	params.AddNonEmpty("next_offset", config.NextOffset)
 821	params.AddNonEmpty("switch_pm_text", config.SwitchPMText)
 822	params.AddNonEmpty("switch_pm_parameter", config.SwitchPMParameter)
 823
 824	if err := params.AddInterface("results", config.Results); err != nil {
 825		return params, err
 826	}
 827
 828	return params, nil
 829}
 830
 831// CallbackConfig contains information on making a CallbackQuery response.
 832type CallbackConfig struct {
 833	CallbackQueryID string `json:"callback_query_id"`
 834	Text            string `json:"text"`
 835	ShowAlert       bool   `json:"show_alert"`
 836	URL             string `json:"url"`
 837	CacheTime       int    `json:"cache_time"`
 838}
 839
 840func (config CallbackConfig) method() string {
 841	return "answerCallbackQuery"
 842}
 843
 844func (config CallbackConfig) params() (Params, error) {
 845	params := make(Params)
 846
 847	params["callback_query_id"] = config.CallbackQueryID
 848	params.AddNonEmpty("text", config.Text)
 849	params.AddBool("show_alert", config.ShowAlert)
 850	params.AddNonEmpty("url", config.URL)
 851	params.AddNonZero("cache_time", config.CacheTime)
 852
 853	return params, nil
 854}
 855
 856// ChatMemberConfig contains information about a user in a chat for use
 857// with administrative functions such as kicking or unbanning a user.
 858type ChatMemberConfig struct {
 859	ChatID             int64
 860	SuperGroupUsername string
 861	ChannelUsername    string
 862	UserID             int
 863}
 864
 865// UnbanChatMemberConfig allows you to unban a user.
 866type UnbanChatMemberConfig struct {
 867	ChatMemberConfig
 868}
 869
 870func (config UnbanChatMemberConfig) method() string {
 871	return "unbanChatMember"
 872}
 873
 874func (config UnbanChatMemberConfig) params() (Params, error) {
 875	params := make(Params)
 876
 877	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername, config.ChannelUsername)
 878	params.AddNonZero("user_id", config.UserID)
 879
 880	return params, nil
 881}
 882
 883// KickChatMemberConfig contains extra fields to kick user
 884type KickChatMemberConfig struct {
 885	ChatMemberConfig
 886	UntilDate int64
 887}
 888
 889func (config KickChatMemberConfig) method() string {
 890	return "kickChatMember"
 891}
 892
 893func (config KickChatMemberConfig) params() (Params, error) {
 894	params := make(Params)
 895
 896	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername)
 897	params.AddNonZero("user_id", config.UserID)
 898	params.AddNonZero64("until_date", config.UntilDate)
 899
 900	return params, nil
 901}
 902
 903// RestrictChatMemberConfig contains fields to restrict members of chat
 904type RestrictChatMemberConfig struct {
 905	ChatMemberConfig
 906	UntilDate             int64
 907	CanSendMessages       *bool
 908	CanSendMediaMessages  *bool
 909	CanSendOtherMessages  *bool
 910	CanAddWebPagePreviews *bool
 911}
 912
 913func (config RestrictChatMemberConfig) method() string {
 914	return "restrictChatMember"
 915}
 916
 917func (config RestrictChatMemberConfig) params() (Params, error) {
 918	params := make(Params)
 919
 920	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername, config.ChannelUsername)
 921	params.AddNonZero("user_id", config.UserID)
 922
 923	params.AddNonNilBool("can_send_messages", config.CanSendMessages)
 924	params.AddNonNilBool("can_send_media_messages", config.CanSendMediaMessages)
 925	params.AddNonNilBool("can_send_other_messages", config.CanSendOtherMessages)
 926	params.AddNonNilBool("can_add_web_page_previews", config.CanAddWebPagePreviews)
 927	params.AddNonZero64("until_date", config.UntilDate)
 928
 929	return params, nil
 930}
 931
 932// PromoteChatMemberConfig contains fields to promote members of chat
 933type PromoteChatMemberConfig struct {
 934	ChatMemberConfig
 935	CanChangeInfo      *bool
 936	CanPostMessages    *bool
 937	CanEditMessages    *bool
 938	CanDeleteMessages  *bool
 939	CanInviteUsers     *bool
 940	CanRestrictMembers *bool
 941	CanPinMessages     *bool
 942	CanPromoteMembers  *bool
 943}
 944
 945func (config PromoteChatMemberConfig) method() string {
 946	return "promoteChatMember"
 947}
 948
 949func (config PromoteChatMemberConfig) params() (Params, error) {
 950	params := make(Params)
 951
 952	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername, config.ChannelUsername)
 953	params.AddNonZero("user_id", config.UserID)
 954
 955	params.AddNonNilBool("can_change_info", config.CanChangeInfo)
 956	params.AddNonNilBool("can_post_messages", config.CanPostMessages)
 957	params.AddNonNilBool("can_edit_messages", config.CanEditMessages)
 958	params.AddNonNilBool("can_delete_messages", config.CanDeleteMessages)
 959	params.AddNonNilBool("can_invite_users", config.CanInviteUsers)
 960	params.AddNonNilBool("can_restrict_members", config.CanRestrictMembers)
 961	params.AddNonNilBool("can_pin_messages", config.CanPinMessages)
 962	params.AddNonNilBool("can_promote_members", config.CanPromoteMembers)
 963
 964	return params, nil
 965}
 966
 967// ChatConfig contains information about getting information on a chat.
 968type ChatConfig struct {
 969	ChatID             int64
 970	SuperGroupUsername string
 971}
 972
 973func (config ChatConfig) params() (Params, error) {
 974	params := make(Params)
 975
 976	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername)
 977
 978	return params, nil
 979}
 980
 981// ChatInfoConfig contains information about getting chat information.
 982type ChatInfoConfig struct {
 983	ChatConfig
 984}
 985
 986func (ChatInfoConfig) method() string {
 987	return "getChat"
 988}
 989
 990// ChatMemberCountConfig contains information about getting the number of users in a chat.
 991type ChatMemberCountConfig struct {
 992	ChatConfig
 993}
 994
 995func (ChatMemberCountConfig) method() string {
 996	return "getChatMembersCount"
 997}
 998
 999// ChatAdministratorsConfig contains information about getting chat administrators.
1000type ChatAdministratorsConfig struct {
1001	ChatConfig
1002}
1003
1004func (ChatAdministratorsConfig) method() string {
1005	return "getChatAdministrators"
1006}
1007
1008// ChatInviteLinkConfig contains information about getting a chat link.
1009//
1010// Note that generating a new link will revoke any previous links.
1011type ChatInviteLinkConfig struct {
1012	ChatConfig
1013}
1014
1015func (ChatInviteLinkConfig) method() string {
1016	return "exportChatInviteLink"
1017}
1018
1019func (config ChatInviteLinkConfig) params() (Params, error) {
1020	params := make(Params)
1021
1022	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername)
1023
1024	return params, nil
1025}
1026
1027// LeaveChatConfig allows you to leave a chat.
1028type LeaveChatConfig struct {
1029	ChatID          int64
1030	ChannelUsername string
1031}
1032
1033func (config LeaveChatConfig) method() string {
1034	return "leaveChat"
1035}
1036
1037func (config LeaveChatConfig) params() (Params, error) {
1038	params := make(Params)
1039
1040	params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
1041
1042	return params, nil
1043}
1044
1045// ChatConfigWithUser contains information about a chat and a user.
1046type ChatConfigWithUser struct {
1047	ChatID             int64
1048	SuperGroupUsername string
1049	UserID             int
1050}
1051
1052func (config ChatConfigWithUser) params() (Params, error) {
1053	params := make(Params)
1054
1055	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername)
1056	params.AddNonZero("user_id", config.UserID)
1057
1058	return params, nil
1059}
1060
1061// GetChatMemberConfig is information about getting a specific member in a chat.
1062type GetChatMemberConfig struct {
1063	ChatConfigWithUser
1064}
1065
1066func (GetChatMemberConfig) method() string {
1067	return "getChatMember"
1068}
1069
1070// InvoiceConfig contains information for sendInvoice request.
1071type InvoiceConfig struct {
1072	BaseChat
1073	Title                     string         // required
1074	Description               string         // required
1075	Payload                   string         // required
1076	ProviderToken             string         // required
1077	StartParameter            string         // required
1078	Currency                  string         // required
1079	Prices                    []LabeledPrice // required
1080	ProviderData              string
1081	PhotoURL                  string
1082	PhotoSize                 int
1083	PhotoWidth                int
1084	PhotoHeight               int
1085	NeedName                  bool
1086	NeedPhoneNumber           bool
1087	NeedEmail                 bool
1088	NeedShippingAddress       bool
1089	SendPhoneNumberToProvider bool
1090	SendEmailToProvider       bool
1091	IsFlexible                bool
1092}
1093
1094func (config InvoiceConfig) params() (Params, error) {
1095	params, err := config.BaseChat.params()
1096	if err != nil {
1097		return params, err
1098	}
1099
1100	params["title"] = config.Title
1101	params["description"] = config.Description
1102	params["payload"] = config.Payload
1103	params["provider_token"] = config.ProviderToken
1104	params["start_parameter"] = config.StartParameter
1105	params["currency"] = config.Currency
1106
1107	if err = params.AddInterface("prices", config.Prices); err != nil {
1108		return params, err
1109	}
1110
1111	params.AddNonEmpty("provider_data", config.ProviderData)
1112	params.AddNonEmpty("photo_url", config.PhotoURL)
1113	params.AddNonZero("photo_size", config.PhotoSize)
1114	params.AddNonZero("photo_width", config.PhotoWidth)
1115	params.AddNonZero("photo_height", config.PhotoHeight)
1116	params.AddBool("need_name", config.NeedName)
1117	params.AddBool("need_phone_number", config.NeedPhoneNumber)
1118	params.AddBool("need_email", config.NeedEmail)
1119	params.AddBool("need_shipping_address", config.NeedShippingAddress)
1120	params.AddBool("is_flexible", config.IsFlexible)
1121	params.AddBool("send_phone_number_to_provider", config.SendPhoneNumberToProvider)
1122	params.AddBool("send_email_to_provider", config.SendEmailToProvider)
1123
1124	return params, nil
1125}
1126
1127func (config InvoiceConfig) method() string {
1128	return "sendInvoice"
1129}
1130
1131// ShippingConfig contains information for answerShippingQuery request.
1132type ShippingConfig struct {
1133	ShippingQueryID string // required
1134	OK              bool   // required
1135	ShippingOptions []ShippingOption
1136	ErrorMessage    string
1137}
1138
1139// PreCheckoutConfig conatins information for answerPreCheckoutQuery request.
1140type PreCheckoutConfig struct {
1141	PreCheckoutQueryID string // required
1142	OK                 bool   // required
1143	ErrorMessage       string
1144}
1145
1146// DeleteMessageConfig contains information of a message in a chat to delete.
1147type DeleteMessageConfig struct {
1148	ChatID    int64
1149	MessageID int
1150}
1151
1152func (config DeleteMessageConfig) method() string {
1153	return "deleteMessage"
1154}
1155
1156func (config DeleteMessageConfig) params() (Params, error) {
1157	params := make(Params)
1158
1159	params.AddNonZero64("chat_id", config.ChatID)
1160	params.AddNonZero("message_id", config.MessageID)
1161
1162	return params, nil
1163}
1164
1165// PinChatMessageConfig contains information of a message in a chat to pin.
1166type PinChatMessageConfig struct {
1167	ChatID              int64
1168	ChannelUsername     string
1169	MessageID           int
1170	DisableNotification bool
1171}
1172
1173func (config PinChatMessageConfig) method() string {
1174	return "pinChatMessage"
1175}
1176
1177func (config PinChatMessageConfig) params() (Params, error) {
1178	params := make(Params)
1179
1180	params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
1181	params.AddNonZero("message_id", config.MessageID)
1182	params.AddBool("disable_notification", config.DisableNotification)
1183
1184	return params, nil
1185}
1186
1187// UnpinChatMessageConfig contains information of chat to unpin.
1188type UnpinChatMessageConfig struct {
1189	ChatID          int64
1190	ChannelUsername string
1191}
1192
1193func (config UnpinChatMessageConfig) method() string {
1194	return "unpinChatMessage"
1195}
1196
1197func (config UnpinChatMessageConfig) params() (Params, error) {
1198	params := make(Params)
1199
1200	params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
1201
1202	return params, nil
1203}
1204
1205// SetChatPhotoConfig allows you to set a group, supergroup, or channel's photo.
1206type SetChatPhotoConfig struct {
1207	BaseFile
1208}
1209
1210func (config SetChatPhotoConfig) method() string {
1211	return "setChatPhoto"
1212}
1213
1214func (config SetChatPhotoConfig) name() string {
1215	return "photo"
1216}
1217
1218func (config SetChatPhotoConfig) getFile() interface{} {
1219	return config.File
1220}
1221
1222func (config SetChatPhotoConfig) useExistingFile() bool {
1223	return config.UseExisting
1224}
1225
1226// DeleteChatPhotoConfig allows you to delete a group, supergroup, or channel's photo.
1227type DeleteChatPhotoConfig struct {
1228	ChatID          int64
1229	ChannelUsername string
1230}
1231
1232func (config DeleteChatPhotoConfig) method() string {
1233	return "deleteChatPhoto"
1234}
1235
1236func (config DeleteChatPhotoConfig) params() (Params, error) {
1237	params := make(Params)
1238
1239	params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
1240
1241	return params, nil
1242}
1243
1244// SetChatTitleConfig allows you to set the title of something other than a private chat.
1245type SetChatTitleConfig struct {
1246	ChatID          int64
1247	ChannelUsername string
1248
1249	Title string
1250}
1251
1252func (config SetChatTitleConfig) method() string {
1253	return "setChatTitle"
1254}
1255
1256func (config SetChatTitleConfig) params() (Params, error) {
1257	params := make(Params)
1258
1259	params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
1260	params["title"] = config.Title
1261
1262	return params, nil
1263}
1264
1265// SetChatDescriptionConfig allows you to set the description of a supergroup or channel.
1266type SetChatDescriptionConfig struct {
1267	ChatID          int64
1268	ChannelUsername string
1269
1270	Description string
1271}
1272
1273func (config SetChatDescriptionConfig) method() string {
1274	return "setChatDescription"
1275}
1276
1277func (config SetChatDescriptionConfig) params() (Params, error) {
1278	params := make(Params)
1279
1280	params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
1281	params["description"] = config.Description
1282
1283	return params, nil
1284}
1285
1286// GetStickerSetConfig allows you to get the stickers in a set.
1287type GetStickerSetConfig struct {
1288	Name string
1289}
1290
1291func (config GetStickerSetConfig) method() string {
1292	return "getStickerSet"
1293}
1294
1295func (config GetStickerSetConfig) params() (Params, error) {
1296	params := make(Params)
1297
1298	params["name"] = config.Name
1299
1300	return params, nil
1301}
1302
1303// UploadStickerConfig allows you to upload a sticker for use in a set later.
1304type UploadStickerConfig struct {
1305	UserID     int64
1306	PNGSticker interface{}
1307}
1308
1309func (config UploadStickerConfig) method() string {
1310	return "uploadStickerFile"
1311}
1312
1313func (config UploadStickerConfig) params() (Params, error) {
1314	params := make(Params)
1315
1316	params.AddNonZero64("user_id", config.UserID)
1317
1318	return params, nil
1319}
1320
1321func (config UploadStickerConfig) name() string {
1322	return "png_sticker"
1323}
1324
1325func (config UploadStickerConfig) getFile() interface{} {
1326	return config.PNGSticker
1327}
1328
1329func (config UploadStickerConfig) useExistingFile() bool {
1330	_, ok := config.PNGSticker.(string)
1331
1332	return ok
1333}
1334
1335// NewStickerSetConfig allows creating a new sticker set.
1336type NewStickerSetConfig struct {
1337	UserID        int64
1338	Name          string
1339	Title         string
1340	PNGSticker    interface{}
1341	Emojis        string
1342	ContainsMasks bool
1343	MaskPosition  *MaskPosition
1344}
1345
1346func (config NewStickerSetConfig) method() string {
1347	return "createNewStickerSet"
1348}
1349
1350func (config NewStickerSetConfig) params() (Params, error) {
1351	params := make(Params)
1352
1353	params.AddNonZero64("user_id", config.UserID)
1354	params["name"] = config.Name
1355	params["title"] = config.Title
1356
1357	if sticker, ok := config.PNGSticker.(string); ok {
1358		params[config.name()] = sticker
1359	}
1360
1361	params["emojis"] = config.Emojis
1362
1363	params.AddBool("contains_masks", config.ContainsMasks)
1364
1365	err := params.AddInterface("mask_position", config.MaskPosition)
1366
1367	return params, err
1368}
1369
1370func (config NewStickerSetConfig) getFile() interface{} {
1371	return config.PNGSticker
1372}
1373
1374func (config NewStickerSetConfig) name() string {
1375	return "png_sticker"
1376}
1377
1378func (config NewStickerSetConfig) useExistingFile() bool {
1379	_, ok := config.PNGSticker.(string)
1380
1381	return ok
1382}
1383
1384// AddStickerConfig allows you to add a sticker to a set.
1385type AddStickerConfig struct {
1386	UserID       int64
1387	Name         string
1388	PNGSticker   interface{}
1389	Emojis       string
1390	MaskPosition *MaskPosition
1391}
1392
1393func (config AddStickerConfig) method() string {
1394	return "addStickerToSet"
1395}
1396
1397func (config AddStickerConfig) params() (Params, error) {
1398	params := make(Params)
1399
1400	params.AddNonZero64("user_id", config.UserID)
1401	params["name"] = config.Name
1402	params["emojis"] = config.Emojis
1403
1404	if sticker, ok := config.PNGSticker.(string); ok {
1405		params[config.name()] = sticker
1406	}
1407
1408	err := params.AddInterface("mask_position", config.MaskPosition)
1409
1410	return params, err
1411}
1412
1413func (config AddStickerConfig) name() string {
1414	return "png_sticker"
1415}
1416
1417func (config AddStickerConfig) getFile() interface{} {
1418	return config.PNGSticker
1419}
1420
1421func (config AddStickerConfig) useExistingFile() bool {
1422	_, ok := config.PNGSticker.(string)
1423
1424	return ok
1425}
1426
1427// SetStickerPositionConfig allows you to change the position of a sticker in a set.
1428type SetStickerPositionConfig struct {
1429	Sticker  string
1430	Position int
1431}
1432
1433func (config SetStickerPositionConfig) method() string {
1434	return "setStickerPositionInSet"
1435}
1436
1437func (config SetStickerPositionConfig) params() (Params, error) {
1438	params := make(Params)
1439
1440	params["sticker"] = config.Sticker
1441	params.AddNonZero("position", config.Position)
1442
1443	return params, nil
1444}
1445
1446// DeleteStickerConfig allows you to delete a sticker from a set.
1447type DeleteStickerConfig struct {
1448	Sticker string
1449}
1450
1451func (config DeleteStickerConfig) method() string {
1452	return "deleteStickerFromSet"
1453}
1454
1455func (config DeleteStickerConfig) params() (Params, error) {
1456	params := make(Params)
1457
1458	params["sticker"] = config.Sticker
1459
1460	return params, nil
1461}
1462
1463// SetChatStickerSetConfig allows you to set the sticker set for a supergroup.
1464type SetChatStickerSetConfig struct {
1465	ChatID             int64
1466	SuperGroupUsername string
1467
1468	StickerSetName string
1469}
1470
1471func (config SetChatStickerSetConfig) method() string {
1472	return "setChatStickerSet"
1473}
1474
1475func (config SetChatStickerSetConfig) params() (Params, error) {
1476	params := make(Params)
1477
1478	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername)
1479	params["sticker_set_name"] = config.StickerSetName
1480
1481	return params, nil
1482}
1483
1484// DeleteChatStickerSetConfig allows you to remove a supergroup's sticker set.
1485type DeleteChatStickerSetConfig struct {
1486	ChatID             int64
1487	SuperGroupUsername string
1488}
1489
1490func (config DeleteChatStickerSetConfig) method() string {
1491	return "deleteChatStickerSet"
1492}
1493
1494func (config DeleteChatStickerSetConfig) params() (Params, error) {
1495	params := make(Params)
1496
1497	params.AddFirstValid("chat_id", config.ChatID, config.SuperGroupUsername)
1498
1499	return params, nil
1500}
1501
1502// MediaGroupConfig allows you to send a group of media.
1503//
1504// Media consist of InputMedia items (InputMediaPhoto, InputMediaVideo).
1505type MediaGroupConfig struct {
1506	ChatID          int64
1507	ChannelUsername string
1508
1509	Media               []interface{}
1510	DisableNotification bool
1511	ReplyToMessageID    int
1512}
1513
1514func (config MediaGroupConfig) method() string {
1515	return "sendMediaGroup"
1516}
1517
1518func (config MediaGroupConfig) params() (Params, error) {
1519	params := make(Params)
1520
1521	params.AddFirstValid("chat_id", config.ChatID, config.ChannelUsername)
1522	if err := params.AddInterface("media", config.Media); err != nil {
1523		return params, nil
1524	}
1525	params.AddBool("disable_notification", config.DisableNotification)
1526	params.AddNonZero("reply_to_message_id", config.ReplyToMessageID)
1527
1528	return params, nil
1529}