all repos — telegram-bot-api @ c6bf64c67d2d1002b7fbec45608fb914d176616c

Golang bindings for the Telegram Bot API

configs.go (view raw)

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