all repos — telegram-bot-api @ 65947daaab88cefc8f87b936cb1fafb60d09115d

Golang bindings for the Telegram Bot API

configs.go (view raw)

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