all repos — telegram-bot-api @ 0a3a1c8716c4cd8d26a262af9f12dcbab7f3f28c

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