From 3b23208ee08d728da3e3c4ef740e1e8359998c19 Mon Sep 17 00:00:00 2001 From: Aleksandr Zelenin Date: Thu, 30 Aug 2018 17:55:42 +0300 Subject: [PATCH] init --- .gitignore | 3 + Makefile | 18 + README.md | 117 + client/authorization.go | 179 + client/client.go | 111 + client/extra.go | 20 + client/function.go | 6482 ++++++++++++++ client/tdlib.go | 188 + client/type.go | 17279 ++++++++++++++++++++++++++++++++++++++ client/unmarshaler.go | 7349 ++++++++++++++++ cmd/generate-code.go | 83 + cmd/generate-json.go | 53 + codegen/function.go | 112 + codegen/header.go | 3 + codegen/string.go | 26 + codegen/tdlib.go | 487 ++ codegen/type.go | 176 + codegen/unmarshaler.go | 102 + data/td_api.json | 13410 +++++++++++++++++++++++++++++ data/td_api.tl | 2885 +++++++ go.mod | 1 + tlparser/parser.go | 171 + tlparser/type.go | 33 + 23 files changed, 49288 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 client/authorization.go create mode 100644 client/client.go create mode 100644 client/extra.go create mode 100755 client/function.go create mode 100644 client/tdlib.go create mode 100755 client/type.go create mode 100755 client/unmarshaler.go create mode 100644 cmd/generate-code.go create mode 100644 cmd/generate-json.go create mode 100644 codegen/function.go create mode 100644 codegen/header.go create mode 100644 codegen/string.go create mode 100644 codegen/tdlib.go create mode 100644 codegen/type.go create mode 100644 codegen/unmarshaler.go create mode 100755 data/td_api.json create mode 100644 data/td_api.tl create mode 100644 go.mod create mode 100644 tlparser/parser.go create mode 100644 tlparser/type.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2be5f85 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +/.tdlib +/.cmd diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3a0bc91 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +TAG := v1.2.0 + +schema-update: + curl https://raw.githubusercontent.com/tdlib/td/${TAG}/td/generate/scheme/td_api.tl 2>/dev/null > ./data/td_api.tl + +generate-json: + go run ./cmd/generate-json.go \ + -input "./data/td_api.tl" \ + -output "./data/td_api.json" + +generate-code: + go run ./cmd/generate-code.go \ + -schema "./data/td_api.tl" \ + -outputDir "./client" \ + -package client \ + -functionFile function.go \ + -typeFile type.go \ + -unmarshalerFile unmarshaler.go diff --git a/README.md b/README.md new file mode 100644 index 0000000..29c75e0 --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +# go-tdlib + +Go wrapper for [TDLib (Telegram Database Library)](https://github.com/tdlib/td) with full support of TDLib v1.2.0 + +## TDLib installation + +### Ubuntu 18.04 / Debian 9 + +apt-get update -y +apt-get install -y \ + build-essential \ + ca-certificates \ + ccache \ + cmake \ + git \ + gperf \ + libssl-dev \ + libreadline-dev \ + zlib1g-dev +git clone --depth 1 -b "v1.2.0" "https://github.com/tdlib/td.git" ./tdlib-src +mkdir ./tdlib-src/build +cd ./tdlib-src/build +cmake -j$(getconf _NPROCESSORS_ONLN) -DCMAKE_BUILD_TYPE=Release .. +cmake -j$(getconf _NPROCESSORS_ONLN) --build . +make -j$(getconf _NPROCESSORS_ONLN) install +rm -rf ./../../tdlib-src + + +## Usage + +### Client + +[Register an application](https://my.telegram.org/apps) to obtain an api_id and api_hash + +```go +package main + +import ( + "log" + + "github.com/zelenin/go-tdlib/client" +) + +func main() { + client.SetLogVerbosityLevel(1) + client.SetLogFilePath("/dev/stderr") + + // client authorizer + authorizer := client.ClientAuthorizer() + go client.CliInteractor(authorizer) + + // or bot authorizer + botToken := "000000000:gsVCGG5YbikxYHC7bP5vRvmBqJ7Xz6vG6td" + authorizer := client.BotAuthorizer(botToken) + + const ( + apiId = 00000 + apiHash = "8pu9yg32qkuukj83ozaqo5zzjwhkxhnk" + ) + + authorizer.TdlibParameters <- &client.TdlibParameters{ + UseTestDc: false, + DatabaseDirectory: "./.tdlib/database", + FilesDirectory: "./.tdlib/files", + UseFileDatabase: true, + UseChatInfoDatabase: true, + UseMessageDatabase: true, + UseSecretChats: false, + ApiId: apiId, + ApiHash: apiHash, + SystemLanguageCode: "en", + DeviceModel: "Server", + SystemVersion: "1.0.0", + ApplicationVersion: "1.0.0", + EnableStorageOptimizer: true, + IgnoreFileNames: false, + } + + tdlibClient, err := client.NewClient(authorizer) + if err != nil { + log.Fatalf("NewClient error: %s", err) + } + + me, err := tdlibClient.GetMe() + if err != nil { + log.Fatalf("GetMe error: %s", err) + } + + log.Printf("Me: %s %s [%s]", me.FirstName, me.LastName, me.Username) +} + +``` + +### Receive updates + +```go +responses := make(chan client.Type, 100) +tdlibClient, err := client.NewClient(authorizer, client.WithListener(responses)) +if err != nil { + log.Fatalf("NewClient error: %s", err) +} + +for response := range responses { + if response.GetClass() == client.ClassUpdate { + log.Printf("%#v", response) + } +} +``` + +## Notes + +* WIP. Library API can be changed in the future +* The package includes a .tl-parser and generated [json-schema](https://github.com/zelenin/go-tdlib/tree/master/data) for creating libraries in other languages + +## Author + +[Aleksandr Zelenin](https://github.com/zelenin/), e-mail: [aleksandr@zelenin.me](mailto:aleksandr@zelenin.me) diff --git a/client/authorization.go b/client/authorization.go new file mode 100644 index 0000000..1812874 --- /dev/null +++ b/client/authorization.go @@ -0,0 +1,179 @@ +package client + +import ( + "errors" + "fmt" + "time" +) + +var ErrNotSupportedAuthorizationState = errors.New("not supported state") + +type AuthorizationStateHandler interface { + Handle(client *Client, state AuthorizationState) error +} + +func Authorize(client *Client, authorizationStateHandler AuthorizationStateHandler) error { + for { + state, err := client.GetAuthorizationState() + if err != nil { + return err + } + + err = authorizationStateHandler.Handle(client, state) + if err != nil { + return err + } + + if state.AuthorizationStateType() == TypeAuthorizationStateReady { + // dirty hack for db flush after authorization + time.Sleep(1 * time.Second) + return nil + } + } +} + +type clientAuthorizer struct { + TdlibParameters chan *TdlibParameters + PhoneNumber chan string + Code chan string + State chan AuthorizationState +} + +func ClientAuthorizer() *clientAuthorizer { + return &clientAuthorizer{ + TdlibParameters: make(chan *TdlibParameters, 1), + PhoneNumber: make(chan string, 1), + Code: make(chan string, 1), + State: make(chan AuthorizationState, 10), + } +} + +func (stateHandler *clientAuthorizer) Handle(client *Client, state AuthorizationState) error { + stateHandler.State <- state + + switch state.AuthorizationStateType() { + case TypeAuthorizationStateWaitTdlibParameters: + _, err := client.SetTdlibParameters(<-stateHandler.TdlibParameters) + return err + + case TypeAuthorizationStateWaitEncryptionKey: + _, err := client.CheckDatabaseEncryptionKey(nil) + return err + + case TypeAuthorizationStateWaitPhoneNumber: + _, err := client.SetAuthenticationPhoneNumber(<-stateHandler.PhoneNumber, false, false) + return err + + case TypeAuthorizationStateWaitCode: + _, err := client.CheckAuthenticationCode(<-stateHandler.Code, "", "") + return err + + case TypeAuthorizationStateWaitPassword: + return ErrNotSupportedAuthorizationState + + case TypeAuthorizationStateReady: + close(stateHandler.TdlibParameters) + close(stateHandler.PhoneNumber) + close(stateHandler.Code) + close(stateHandler.State) + + return nil + + case TypeAuthorizationStateLoggingOut: + return ErrNotSupportedAuthorizationState + + case TypeAuthorizationStateClosing: + return ErrNotSupportedAuthorizationState + + case TypeAuthorizationStateClosed: + return ErrNotSupportedAuthorizationState + } + + return ErrNotSupportedAuthorizationState +} + +func CliInteractor(clientAuthorizer *clientAuthorizer) { + for { + select { + case state := <-clientAuthorizer.State: + switch state.AuthorizationStateType() { + case TypeAuthorizationStateWaitPhoneNumber: + fmt.Println("Enter phone number: ") + var phoneNumber string + fmt.Scanln(&phoneNumber) + + clientAuthorizer.PhoneNumber <- phoneNumber + + case TypeAuthorizationStateWaitCode: + fmt.Println("Enter code: ") + var code string + fmt.Scanln(&code) + + clientAuthorizer.Code <- code + + case TypeAuthorizationStateReady: + return + } + } + } +} + +type botAuthorizer struct { + TdlibParameters chan *TdlibParameters + Token chan string + State chan AuthorizationState +} + +func BotAuthorizer(token string) *botAuthorizer { + botAuthorizer := &botAuthorizer{ + TdlibParameters: make(chan *TdlibParameters, 1), + Token: make(chan string, 1), + State: make(chan AuthorizationState, 10), + } + + botAuthorizer.Token <- token + + return botAuthorizer +} + +func (stateHandler *botAuthorizer) Handle(client *Client, state AuthorizationState) error { + stateHandler.State <- state + + switch state.AuthorizationStateType() { + case TypeAuthorizationStateWaitTdlibParameters: + _, err := client.SetTdlibParameters(<-stateHandler.TdlibParameters) + return err + + case TypeAuthorizationStateWaitEncryptionKey: + _, err := client.CheckDatabaseEncryptionKey(nil) + return err + + case TypeAuthorizationStateWaitPhoneNumber: + _, err := client.CheckAuthenticationBotToken(<-stateHandler.Token) + return err + + case TypeAuthorizationStateWaitCode: + return ErrNotSupportedAuthorizationState + + case TypeAuthorizationStateWaitPassword: + return ErrNotSupportedAuthorizationState + + case TypeAuthorizationStateReady: + close(stateHandler.TdlibParameters) + close(stateHandler.Token) + close(stateHandler.State) + + return nil + + case TypeAuthorizationStateLoggingOut: + return ErrNotSupportedAuthorizationState + + case TypeAuthorizationStateClosing: + return ErrNotSupportedAuthorizationState + + case TypeAuthorizationStateClosed: + return ErrNotSupportedAuthorizationState + } + + return ErrNotSupportedAuthorizationState +} diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..dfc0cb7 --- /dev/null +++ b/client/client.go @@ -0,0 +1,111 @@ +package client + +import ( + "errors" + "sync" + "time" +) + +type Client struct { + jsonClient *JsonClient + extraGenerator ExtraGenerator + catcher chan *Response + listeners []chan Type + catchersStore *sync.Map +} + +type Option func(*Client) + +func WithExtraGenerator(extraGenerator ExtraGenerator) Option { + return func(client *Client) { + client.extraGenerator = extraGenerator + } +} + +func WithListener(listener chan Type) Option { + return func(client *Client) { + client.listeners = append(client.listeners, listener) + } +} + +func NewClient(authorizationStateHandler AuthorizationStateHandler, options ...Option) (*Client, error) { + catchersListener := make(chan *Response, 1000) + + client := &Client{ + jsonClient: NewJsonClient(), + catcher: catchersListener, + listeners: []chan Type{}, + catchersStore: &sync.Map{}, + } + + for _, option := range options { + option(client) + } + + if client.extraGenerator == nil { + client.extraGenerator = UuidV4Generator() + } + + go client.receive() + go client.catch(catchersListener) + + err := Authorize(client, authorizationStateHandler) + if err != nil { + return nil, err + } + + return client, nil +} + +func (client *Client) receive() { + for { + resp, err := client.jsonClient.Receive(10) + if err != nil { + continue + } + client.catcher <- resp + + typ, err := UnmarshalType(resp.Data) + if err != nil { + continue + } + + for _, listener := range client.listeners { + listener <- typ + } + } +} + +func (client *Client) catch(updates chan *Response) { + for update := range updates { + if update.Extra != "" { + value, ok := client.catchersStore.Load(update.Extra) + if ok { + value.(chan *Response) <- update + } + } + } +} + +func (client *Client) Send(req Request) (*Response, error) { + req.Extra = client.extraGenerator() + + catcher := make(chan *Response, 1) + + client.catchersStore.Store(req.Extra, catcher) + + defer func() { + close(catcher) + client.catchersStore.Delete(req.Extra) + }() + + client.jsonClient.Send(req) + + select { + case response := <-catcher: + return response, nil + + case <-time.After(10 * time.Second): + return nil, errors.New("timeout") + } +} diff --git a/client/extra.go b/client/extra.go new file mode 100644 index 0000000..b77e6b6 --- /dev/null +++ b/client/extra.go @@ -0,0 +1,20 @@ +package client + +import ( + "fmt" + "math/rand" +) + +type ExtraGenerator func() string + +func UuidV4Generator() ExtraGenerator { + return func() string { + var uuid [16]byte + rand.Read(uuid[:]) + + uuid[6] = (uuid[6] & 0x0f) | 0x40 + uuid[8] = (uuid[8] & 0x3f) | 0x80 + + return fmt.Sprintf("%08x-%04x-%04x-%04x-%012x", uuid[:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:]) + } +} diff --git a/client/function.go b/client/function.go new file mode 100755 index 0000000..afa0d60 --- /dev/null +++ b/client/function.go @@ -0,0 +1,6482 @@ +// AUTOGENERATED + +package client + +import ( + "errors" +) + +// Returns the current authorization state; this is an offline request. For informational purposes only. Use updateAuthorizationState instead to maintain the current authorization state +func (client *Client) GetAuthorizationState() (AuthorizationState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getAuthorizationState", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + switch result.Type { + case TypeAuthorizationStateWaitTdlibParameters: + return UnmarshalAuthorizationStateWaitTdlibParameters(result.Data) + + case TypeAuthorizationStateWaitEncryptionKey: + return UnmarshalAuthorizationStateWaitEncryptionKey(result.Data) + + case TypeAuthorizationStateWaitPhoneNumber: + return UnmarshalAuthorizationStateWaitPhoneNumber(result.Data) + + case TypeAuthorizationStateWaitCode: + return UnmarshalAuthorizationStateWaitCode(result.Data) + + case TypeAuthorizationStateWaitPassword: + return UnmarshalAuthorizationStateWaitPassword(result.Data) + + case TypeAuthorizationStateReady: + return UnmarshalAuthorizationStateReady(result.Data) + + case TypeAuthorizationStateLoggingOut: + return UnmarshalAuthorizationStateLoggingOut(result.Data) + + case TypeAuthorizationStateClosing: + return UnmarshalAuthorizationStateClosing(result.Data) + + case TypeAuthorizationStateClosed: + return UnmarshalAuthorizationStateClosed(result.Data) + + default: + return nil, errors.New("invalid type") + } +} + +// Sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters +// +// @param parameters Parameters +func (client *Client) SetTdlibParameters(parameters *TdlibParameters) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setTdlibParameters", + }, + Data: map[string]interface{}{ + "parameters": parameters, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Checks the database encryption key for correctness. Works only when the current authorization state is authorizationStateWaitEncryptionKey +// +// @param encryptionKey Encryption key to check or set up +func (client *Client) CheckDatabaseEncryptionKey(encryptionKey []byte) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "checkDatabaseEncryptionKey", + }, + Data: map[string]interface{}{ + "encryption_key": encryptionKey, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber +// +// @param phoneNumber The phone number of the user, in international format +// @param allowFlashCall Pass true if the authentication code may be sent via flash call to the specified phone number +// @param isCurrentPhoneNumber Pass true if the phone number is used on the current device. Ignored if allow_flash_call is false +func (client *Client) SetAuthenticationPhoneNumber(phoneNumber string, allowFlashCall bool, isCurrentPhoneNumber bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setAuthenticationPhoneNumber", + }, + Data: map[string]interface{}{ + "phone_number": phoneNumber, + "allow_flash_call": allowFlashCall, + "is_current_phone_number": isCurrentPhoneNumber, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Re-sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode and the next_code_type of the result is not null +func (client *Client) ResendAuthenticationCode() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "resendAuthenticationCode", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode +// +// @param code The verification code received via SMS, Telegram message, phone call, or flash call +// @param firstName If the user is not yet registered, the first name of the user; 1-255 characters +// @param lastName If the user is not yet registered; the last name of the user; optional; 0-255 characters +func (client *Client) CheckAuthenticationCode(code string, firstName string, lastName string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "checkAuthenticationCode", + }, + Data: map[string]interface{}{ + "code": code, + "first_name": firstName, + "last_name": lastName, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Checks the authentication password for correctness. Works only when the current authorization state is authorizationStateWaitPassword +// +// @param password The password to check +func (client *Client) CheckAuthenticationPassword(password string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "checkAuthenticationPassword", + }, + Data: map[string]interface{}{ + "password": password, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Requests to send a password recovery code to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword +func (client *Client) RequestAuthenticationPasswordRecovery() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "requestAuthenticationPasswordRecovery", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Recovers the password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword +// +// @param recoveryCode Recovery code to check +func (client *Client) RecoverAuthenticationPassword(recoveryCode string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "recoverAuthenticationPassword", + }, + Data: map[string]interface{}{ + "recovery_code": recoveryCode, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in +// +// @param token The bot token +func (client *Client) CheckAuthenticationBotToken(token string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "checkAuthenticationBotToken", + }, + Data: map[string]interface{}{ + "token": token, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Closes the TDLib instance after a proper logout. Requires an available network connection. All local data will be destroyed. After the logout completes, updateAuthorizationState with authorizationStateClosed will be sent +func (client *Client) LogOut() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "logOut", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Closes the TDLib instance. All databases will be flushed to disk and properly closed. After the close completes, updateAuthorizationState with authorizationStateClosed will be sent +func (client *Client) Close() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "close", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Closes the TDLib instance, destroying all local data without a proper logout. The current user session will remain in the list of all active sessions. All local data will be destroyed. After the destruction completes updateAuthorizationState with authorizationStateClosed will be sent +func (client *Client) Destroy() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "destroy", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain +// +// @param newEncryptionKey New encryption key +func (client *Client) SetDatabaseEncryptionKey(newEncryptionKey []byte) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setDatabaseEncryptionKey", + }, + Data: map[string]interface{}{ + "new_encryption_key": newEncryptionKey, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the current state of 2-step verification +func (client *Client) GetPasswordState() (*PasswordState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getPasswordState", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPasswordState(result.Data) +} + +// Changes the password for the user. If a new recovery email address is specified, then the error EMAIL_UNCONFIRMED is returned and the password change will not be applied until the new recovery email address has been confirmed. The application should periodically call getPasswordState to check whether the new email address has been confirmed +// +// @param oldPassword Previous password of the user +// @param newPassword New password of the user; may be empty to remove the password +// @param newHint New password hint; may be empty +// @param setRecoveryEmailAddress Pass true if the recovery email address should be changed +// @param newRecoveryEmailAddress New recovery email address; may be empty +func (client *Client) SetPassword(oldPassword string, newPassword string, newHint string, setRecoveryEmailAddress bool, newRecoveryEmailAddress string) (*PasswordState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setPassword", + }, + Data: map[string]interface{}{ + "old_password": oldPassword, + "new_password": newPassword, + "new_hint": newHint, + "set_recovery_email_address": setRecoveryEmailAddress, + "new_recovery_email_address": newRecoveryEmailAddress, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPasswordState(result.Data) +} + +// Returns a recovery email address that was previously set up. This method can be used to verify a password provided by the user +// +// @param password The password for the current user +func (client *Client) GetRecoveryEmailAddress(password string) (*RecoveryEmailAddress, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getRecoveryEmailAddress", + }, + Data: map[string]interface{}{ + "password": password, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalRecoveryEmailAddress(result.Data) +} + +// Changes the recovery email address of the user. If a new recovery email address is specified, then the error EMAIL_UNCONFIRMED is returned and the email address will not be changed until the new email has been confirmed. The application should periodically call getPasswordState to check whether the email address has been confirmed. If new_recovery_email_address is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation +// +// @param password Password of the current user +// @param newRecoveryEmailAddress New recovery email address +func (client *Client) SetRecoveryEmailAddress(password string, newRecoveryEmailAddress string) (*PasswordState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setRecoveryEmailAddress", + }, + Data: map[string]interface{}{ + "password": password, + "new_recovery_email_address": newRecoveryEmailAddress, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPasswordState(result.Data) +} + +// Requests to send a password recovery code to an email address that was previously set up +func (client *Client) RequestPasswordRecovery() (*PasswordRecoveryInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "requestPasswordRecovery", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPasswordRecoveryInfo(result.Data) +} + +// Recovers the password using a recovery code sent to an email address that was previously set up +// +// @param recoveryCode Recovery code to check +func (client *Client) RecoverPassword(recoveryCode string) (*PasswordState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "recoverPassword", + }, + Data: map[string]interface{}{ + "recovery_code": recoveryCode, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPasswordState(result.Data) +} + +// Creates a new temporary password for processing payments +// +// @param password Persistent user password +// @param validFor Time during which the temporary password will be valid, in seconds; should be between 60 and 86400 +func (client *Client) CreateTemporaryPassword(password string, validFor int32) (*TemporaryPasswordState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createTemporaryPassword", + }, + Data: map[string]interface{}{ + "password": password, + "valid_for": validFor, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTemporaryPasswordState(result.Data) +} + +// Returns information about the current temporary password +func (client *Client) GetTemporaryPasswordState() (*TemporaryPasswordState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getTemporaryPasswordState", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTemporaryPasswordState(result.Data) +} + +// Handles a DC_UPDATE push service notification. Can be called before authorization +// +// @param dc Value of the "dc" parameter of the notification +// @param addr Value of the "addr" parameter of the notification +func (client *Client) ProcessDcUpdate(dc string, addr string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "processDcUpdate", + }, + Data: map[string]interface{}{ + "dc": dc, + "addr": addr, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the current user +func (client *Client) GetMe() (*User, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getMe", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUser(result.Data) +} + +// Returns information about a user by their identifier. This is an offline request if the current user is not a bot +// +// @param userId User identifier +func (client *Client) GetUser(userId int32) (*User, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getUser", + }, + Data: map[string]interface{}{ + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUser(result.Data) +} + +// Returns full information about a user by their identifier +// +// @param userId User identifier +func (client *Client) GetUserFullInfo(userId int32) (*UserFullInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getUserFullInfo", + }, + Data: map[string]interface{}{ + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUserFullInfo(result.Data) +} + +// Returns information about a basic group by its identifier. This is an offline request if the current user is not a bot +// +// @param basicGroupId Basic group identifier +func (client *Client) GetBasicGroup(basicGroupId int32) (*BasicGroup, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getBasicGroup", + }, + Data: map[string]interface{}{ + "basic_group_id": basicGroupId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalBasicGroup(result.Data) +} + +// Returns full information about a basic group by its identifier +// +// @param basicGroupId Basic group identifier +func (client *Client) GetBasicGroupFullInfo(basicGroupId int32) (*BasicGroupFullInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getBasicGroupFullInfo", + }, + Data: map[string]interface{}{ + "basic_group_id": basicGroupId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalBasicGroupFullInfo(result.Data) +} + +// Returns information about a supergroup or channel by its identifier. This is an offline request if the current user is not a bot +// +// @param supergroupId Supergroup or channel identifier +func (client *Client) GetSupergroup(supergroupId int32) (*Supergroup, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getSupergroup", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalSupergroup(result.Data) +} + +// Returns full information about a supergroup or channel by its identifier, cached for up to 1 minute +// +// @param supergroupId Supergroup or channel identifier +func (client *Client) GetSupergroupFullInfo(supergroupId int32) (*SupergroupFullInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getSupergroupFullInfo", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalSupergroupFullInfo(result.Data) +} + +// Returns information about a secret chat by its identifier. This is an offline request +// +// @param secretChatId Secret chat identifier +func (client *Client) GetSecretChat(secretChatId int32) (*SecretChat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getSecretChat", + }, + Data: map[string]interface{}{ + "secret_chat_id": secretChatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalSecretChat(result.Data) +} + +// Returns information about a chat by its identifier, this is an offline request if the current user is not a bot +// +// @param chatId Chat identifier +func (client *Client) GetChat(chatId int64) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChat", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Returns information about a message +// +// @param chatId Identifier of the chat the message belongs to +// @param messageId Identifier of the message to get +func (client *Client) GetMessage(chatId int64, messageId int64) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getMessage", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Returns information about a message that is replied by given message +// +// @param chatId Identifier of the chat the message belongs to +// @param messageId Identifier of the message reply to which get +func (client *Client) GetRepliedMessage(chatId int64, messageId int64) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getRepliedMessage", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Returns information about a pinned chat message +// +// @param chatId Identifier of the chat the message belongs to +func (client *Client) GetChatPinnedMessage(chatId int64) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChatPinnedMessage", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Returns information about messages. If a message is not found, returns null on the corresponding position of the result +// +// @param chatId Identifier of the chat the messages belong to +// @param messageIds Identifiers of the messages to get +func (client *Client) GetMessages(chatId int64, messageIds []int64) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getMessages", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_ids": messageIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Returns information about a file; this is an offline request +// +// @param fileId Identifier of the file to get +func (client *Client) GetFile(fileId int32) (*File, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getFile", + }, + Data: map[string]interface{}{ + "file_id": fileId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalFile(result.Data) +} + +// Returns information about a file by its remote ID; this is an offline request. Can be used to register a URL as a file for further uploading, or sending as a message +// +// @param remoteFileId Remote identifier of the file to get +// @param fileType File type, if known +func (client *Client) GetRemoteFile(remoteFileId string, fileType FileType) (*File, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getRemoteFile", + }, + Data: map[string]interface{}{ + "remote_file_id": remoteFileId, + "file_type": fileType, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalFile(result.Data) +} + +// Returns an ordered list of chats. Chats are sorted by the pair (order, chat_id) in decreasing order. (For example, to get a list of chats from the beginning, the offset_order should be equal to 2^63 - 1). For optimal performance the number of returned chats is chosen by the library. +// +// @param offsetOrder Chat order to return chats from +// @param offsetChatId Chat identifier to return chats from +// @param limit The maximum number of chats to be returned. It is possible that fewer chats than the limit are returned even if the end of the list is not reached +func (client *Client) GetChats(offsetOrder JsonInt64, offsetChatId int64, limit int32) (*Chats, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChats", + }, + Data: map[string]interface{}{ + "offset_order": offsetOrder, + "offset_chat_id": offsetChatId, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChats(result.Data) +} + +// Searches a public chat by its username. Currently only private chats, supergroups and channels can be public. Returns the chat if found; otherwise an error is returned +// +// @param username Username to be resolved +func (client *Client) SearchPublicChat(username string) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchPublicChat", + }, + Data: map[string]interface{}{ + "username": username, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Searches public chats by looking for specified query in their username and title. Currently only private chats, supergroups and channels can be public. Returns a meaningful number of results. Returns nothing if the length of the searched username prefix is less than 5. Excludes private chats with contacts and chats from the chat list from the results +// +// @param query Query to search for +func (client *Client) SearchPublicChats(query string) (*Chats, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchPublicChats", + }, + Data: map[string]interface{}{ + "query": query, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChats(result.Data) +} + +// Searches for the specified query in the title and username of already known chats, this is an offline request. Returns chats in the order seen in the chat list +// +// @param query Query to search for. If the query is empty, returns up to 20 recently found chats +// @param limit Maximum number of chats to be returned +func (client *Client) SearchChats(query string, limit int32) (*Chats, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchChats", + }, + Data: map[string]interface{}{ + "query": query, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChats(result.Data) +} + +// Searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the chat list +// +// @param query Query to search for +// @param limit Maximum number of chats to be returned +func (client *Client) SearchChatsOnServer(query string, limit int32) (*Chats, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchChatsOnServer", + }, + Data: map[string]interface{}{ + "query": query, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChats(result.Data) +} + +// Returns a list of frequently used chats. Supported only if the chat info database is enabled +// +// @param category Category of chats to be returned +// @param limit Maximum number of chats to be returned; up to 30 +func (client *Client) GetTopChats(category TopChatCategory, limit int32) (*Chats, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getTopChats", + }, + Data: map[string]interface{}{ + "category": category, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChats(result.Data) +} + +// Removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled +// +// @param category Category of frequently used chats +// @param chatId Chat identifier +func (client *Client) RemoveTopChat(category TopChatCategory, chatId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeTopChat", + }, + Data: map[string]interface{}{ + "category": category, + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first +// +// @param chatId Identifier of the chat to add +func (client *Client) AddRecentlyFoundChat(chatId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addRecentlyFoundChat", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Removes a chat from the list of recently found chats +// +// @param chatId Identifier of the chat to be removed +func (client *Client) RemoveRecentlyFoundChat(chatId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeRecentlyFoundChat", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Clears the list of recently found chats +func (client *Client) ClearRecentlyFoundChats() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "clearRecentlyFoundChats", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Checks whether a username can be set for a chat +// +// @param chatId Chat identifier; should be identifier of a supergroup chat, or a channel chat, or a private chat with self, or zero if chat is being created +// @param username Username to be checked +func (client *Client) CheckChatUsername(chatId JsonInt64, username string) (CheckChatUsernameResult, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "checkChatUsername", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "username": username, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + switch result.Type { + case TypeCheckChatUsernameResultOk: + return UnmarshalCheckChatUsernameResultOk(result.Data) + + case TypeCheckChatUsernameResultUsernameInvalid: + return UnmarshalCheckChatUsernameResultUsernameInvalid(result.Data) + + case TypeCheckChatUsernameResultUsernameOccupied: + return UnmarshalCheckChatUsernameResultUsernameOccupied(result.Data) + + case TypeCheckChatUsernameResultPublicChatsTooMuch: + return UnmarshalCheckChatUsernameResultPublicChatsTooMuch(result.Data) + + case TypeCheckChatUsernameResultPublicGroupsUnavailable: + return UnmarshalCheckChatUsernameResultPublicGroupsUnavailable(result.Data) + + default: + return nil, errors.New("invalid type") + } +} + +// Returns a list of public chats created by the user +func (client *Client) GetCreatedPublicChats() (*Chats, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getCreatedPublicChats", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChats(result.Data) +} + +// Returns a list of common chats with a given user. Chats are sorted by their type and creation date +// +// @param userId User identifier +// @param offsetChatId Chat identifier starting from which to return chats; use 0 for the first request +// @param limit Maximum number of chats to be returned; up to 100 +func (client *Client) GetGroupsInCommon(userId int32, offsetChatId int64, limit int32) (*Chats, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getGroupsInCommon", + }, + Data: map[string]interface{}{ + "user_id": userId, + "offset_chat_id": offsetChatId, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChats(result.Data) +} + +// Returns messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing message_id). For optimal performance the number of returned messages is chosen by the library. This is an offline request if only_local is true +// +// @param chatId Chat identifier +// @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the beginning (i.e., from oldest to newest) +// @param offset Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages +// @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +// @param onlyLocal If true, returns only messages that are available locally without sending network requests +func (client *Client) GetChatHistory(chatId int64, fromMessageId int64, offset int32, limit int32, onlyLocal bool) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChatHistory", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "from_message_id": fromMessageId, + "offset": offset, + "limit": limit, + "only_local": onlyLocal, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Deletes all messages in the chat only for the user. Cannot be used in channels and public supergroups +// +// @param chatId Chat identifier +// @param removeFromChatList Pass true if the chat should be removed from the chats list +func (client *Client) DeleteChatHistory(chatId int64, removeFromChatList bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteChatHistory", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "remove_from_chat_list": removeFromChatList, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing message_id. Cannot be used in secret chats with a non-empty query (searchSecretMessages should be used instead), or without an enabled message database. For optimal performance the number of returned messages is chosen by the library +// +// @param chatId Identifier of the chat in which to search messages +// @param query Query to search for +// @param senderUserId If not 0, only messages sent by the specified user will be returned. Not supported in secret chats +// @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the beginning +// @param offset Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages +// @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +// @param filter Filter for message content in the search results +func (client *Client) SearchChatMessages(chatId int64, query string, senderUserId int32, fromMessageId int64, offset int32, limit int32, filter SearchMessagesFilter) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchChatMessages", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "query": query, + "sender_user_id": senderUserId, + "from_message_id": fromMessageId, + "offset": offset, + "limit": limit, + "filter": filter, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chat_id, message_id)). For optimal performance the number of returned messages is chosen by the library +// +// @param query Query to search for +// @param offsetDate The date of the message starting from which the results should be fetched. Use 0 or any date in the future to get results from the beginning +// @param offsetChatId The chat identifier of the last found message, or 0 for the first request +// @param offsetMessageId The message identifier of the last found message, or 0 for the first request +// @param limit The maximum number of messages to be returned, up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +func (client *Client) SearchMessages(query string, offsetDate int32, offsetChatId int64, offsetMessageId int64, limit int32) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchMessages", + }, + Data: map[string]interface{}{ + "query": query, + "offset_date": offsetDate, + "offset_chat_id": offsetChatId, + "offset_message_id": offsetMessageId, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance the number of returned messages is chosen by the library +// +// @param chatId Identifier of the chat in which to search. Specify 0 to search in all secret chats +// @param query Query to search for. If empty, searchChatMessages should be used instead +// @param fromSearchId The identifier from the result of a previous request, use 0 to get results from the beginning +// @param limit Maximum number of messages to be returned; up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +// @param filter A filter for the content of messages in the search results +func (client *Client) SearchSecretMessages(chatId int64, query string, fromSearchId JsonInt64, limit int32, filter SearchMessagesFilter) (*FoundMessages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchSecretMessages", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "query": query, + "from_search_id": fromSearchId, + "limit": limit, + "filter": filter, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalFoundMessages(result.Data) +} + +// Searches for call messages. Returns the results in reverse chronological order (i. e., in order of decreasing message_id). For optimal performance the number of returned messages is chosen by the library +// +// @param fromMessageId Identifier of the message from which to search; use 0 to get results from the beginning +// @param limit The maximum number of messages to be returned; up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +// @param onlyMissed If true, returns only messages with missed calls +func (client *Client) SearchCallMessages(fromMessageId int64, limit int32, onlyMissed bool) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchCallMessages", + }, + Data: map[string]interface{}{ + "from_message_id": fromMessageId, + "limit": limit, + "only_missed": onlyMissed, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user +// +// @param chatId Chat identifier +// @param limit Maximum number of messages to be returned +func (client *Client) SearchChatRecentLocationMessages(chatId int64, limit int32) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchChatRecentLocationMessages", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Returns all active live locations that should be updated by the client. The list is persistent across application restarts only if the message database is used +func (client *Client) GetActiveLiveLocationMessages() (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getActiveLiveLocationMessages", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Returns the last message sent in a chat no later than the specified date +// +// @param chatId Chat identifier +// @param date Point in time (Unix timestamp) relative to which to search for messages +func (client *Client) GetChatMessageByDate(chatId int64, date int32) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChatMessageByDate", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "date": date, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Returns a public HTTPS link to a message. Available only for messages in public supergroups and channels +// +// @param chatId Identifier of the chat to which the message belongs +// @param messageId Identifier of the message +// @param forAlbum Pass true if a link for a whole media album should be returned +func (client *Client) GetPublicMessageLink(chatId int64, messageId int64, forAlbum bool) (*PublicMessageLink, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getPublicMessageLink", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "for_album": forAlbum, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPublicMessageLink(result.Data) +} + +// Sends a message. Returns the sent message +// +// @param chatId Target chat +// @param replyToMessageId Identifier of the message to reply to or 0 +// @param disableNotification Pass true to disable notification for the message. Not supported in secret chats +// @param fromBackground Pass true if the message is sent from the background +// @param replyMarkup Markup for replying to the message; for bots only +// @param inputMessageContent The content of the message to be sent +func (client *Client) SendMessage(chatId int64, replyToMessageId int64, disableNotification bool, fromBackground bool, replyMarkup ReplyMarkup, inputMessageContent InputMessageContent) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendMessage", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "reply_to_message_id": replyToMessageId, + "disable_notification": disableNotification, + "from_background": fromBackground, + "reply_markup": replyMarkup, + "input_message_content": inputMessageContent, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Sends messages grouped together into an album. Currently only photo and video messages can be grouped into an album. Returns sent messages +// +// @param chatId Target chat +// @param replyToMessageId Identifier of a message to reply to or 0 +// @param disableNotification Pass true to disable notification for the messages. Not supported in secret chats +// @param fromBackground Pass true if the messages are sent from the background +// @param inputMessageContents Contents of messages to be sent +func (client *Client) SendMessageAlbum(chatId int64, replyToMessageId int64, disableNotification bool, fromBackground bool, inputMessageContents []InputMessageContent) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendMessageAlbum", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "reply_to_message_id": replyToMessageId, + "disable_notification": disableNotification, + "from_background": fromBackground, + "input_message_contents": inputMessageContents, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Invites a bot to a chat (if it is not yet a member) and sends it the /start command. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message +// +// @param botUserId Identifier of the bot +// @param chatId Identifier of the target chat +// @param parameter A hidden parameter sent to the bot for deep linking purposes (https://api.telegram.org/bots#deep-linking) +func (client *Client) SendBotStartMessage(botUserId int32, chatId int64, parameter string) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendBotStartMessage", + }, + Data: map[string]interface{}{ + "bot_user_id": botUserId, + "chat_id": chatId, + "parameter": parameter, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message +// +// @param chatId Target chat +// @param replyToMessageId Identifier of a message to reply to or 0 +// @param disableNotification Pass true to disable notification for the message. Not supported in secret chats +// @param fromBackground Pass true if the message is sent from background +// @param queryId Identifier of the inline query +// @param resultId Identifier of the inline result +func (client *Client) SendInlineQueryResultMessage(chatId int64, replyToMessageId int64, disableNotification bool, fromBackground bool, queryId JsonInt64, resultId string) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendInlineQueryResultMessage", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "reply_to_message_id": replyToMessageId, + "disable_notification": disableNotification, + "from_background": fromBackground, + "query_id": queryId, + "result_id": resultId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in message_ids. If a message can't be forwarded, null will be returned instead of the message +// +// @param chatId Identifier of the chat to which to forward messages +// @param fromChatId Identifier of the chat from which to forward messages +// @param messageIds Identifiers of the messages to forward +// @param disableNotification Pass true to disable notification for the message, doesn't work if messages are forwarded to a secret chat +// @param fromBackground Pass true if the message is sent from the background +// @param asAlbum True, if the messages should be grouped into an album after forwarding. For this to work, no more than 10 messages may be forwarded, and all of them must be photo or video messages +func (client *Client) ForwardMessages(chatId int64, fromChatId int64, messageIds []int64, disableNotification bool, fromBackground bool, asAlbum bool) (*Messages, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "forwardMessages", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "from_chat_id": fromChatId, + "message_ids": messageIds, + "disable_notification": disableNotification, + "from_background": fromBackground, + "as_album": asAlbum, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessages(result.Data) +} + +// Changes the current TTL setting (sets a new self-destruct timer) in a secret chat and sends the corresponding message +// +// @param chatId Chat identifier +// @param ttl New TTL value, in seconds +func (client *Client) SendChatSetTtlMessage(chatId int64, ttl int32) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendChatSetTtlMessage", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "ttl": ttl, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Sends a notification about a screenshot taken in a chat. Supported only in private and secret chats +// +// @param chatId Chat identifier +func (client *Client) SendChatScreenshotTakenNotification(chatId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendChatScreenshotTakenNotification", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Deletes messages +// +// @param chatId Chat identifier +// @param messageIds Identifiers of the messages to be deleted +// @param revoke Pass true to try to delete outgoing messages for all chat members (may fail if messages are too old). Always true for supergroups, channels and secret chats +func (client *Client) DeleteMessages(chatId int64, messageIds []int64, revoke bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteMessages", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_ids": messageIds, + "revoke": revoke, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Deletes all messages sent by the specified user to a chat. Supported only in supergroups; requires can_delete_messages administrator privileges +// +// @param chatId Chat identifier +// @param userId User identifier +func (client *Client) DeleteChatMessagesFromUser(chatId int64, userId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteChatMessagesFromUser", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Edits the text of a message (or a text of a game message). Non-bot users can edit messages for a limited period of time. Returns the edited message after the edit is completed on the server side +// +// @param chatId The chat the message belongs to +// @param messageId Identifier of the message +// @param replyMarkup The new message reply markup; for bots only +// @param inputMessageContent New text content of the message. Should be of type InputMessageText +func (client *Client) EditMessageText(chatId int64, messageId int64, replyMarkup ReplyMarkup, inputMessageContent InputMessageContent) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editMessageText", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "reply_markup": replyMarkup, + "input_message_content": inputMessageContent, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed server-side +// +// @param chatId The chat the message belongs to +// @param messageId Identifier of the message +// @param replyMarkup Tew message reply markup; for bots only +// @param location New location content of the message; may be null. Pass null to stop sharing the live location +func (client *Client) EditMessageLiveLocation(chatId int64, messageId int64, replyMarkup ReplyMarkup, location *Location) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editMessageLiveLocation", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "reply_markup": replyMarkup, + "location": location, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Edits the message content caption. Non-bots can edit messages for a limited period of time. Returns the edited message after the edit is completed server-side +// +// @param chatId The chat the message belongs to +// @param messageId Identifier of the message +// @param replyMarkup The new message reply markup; for bots only +// @param caption New message content caption; 0-200 characters +func (client *Client) EditMessageCaption(chatId int64, messageId int64, replyMarkup ReplyMarkup, caption *FormattedText) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editMessageCaption", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "reply_markup": replyMarkup, + "caption": caption, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Edits the message reply markup; for bots only. Returns the edited message after the edit is completed server-side +// +// @param chatId The chat the message belongs to +// @param messageId Identifier of the message +// @param replyMarkup New message reply markup +func (client *Client) EditMessageReplyMarkup(chatId int64, messageId int64, replyMarkup ReplyMarkup) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editMessageReplyMarkup", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "reply_markup": replyMarkup, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Edits the text of an inline text or game message sent via a bot; for bots only +// +// @param inlineMessageId Inline message identifier +// @param replyMarkup New message reply markup +// @param inputMessageContent New text content of the message. Should be of type InputMessageText +func (client *Client) EditInlineMessageText(inlineMessageId string, replyMarkup ReplyMarkup, inputMessageContent InputMessageContent) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editInlineMessageText", + }, + Data: map[string]interface{}{ + "inline_message_id": inlineMessageId, + "reply_markup": replyMarkup, + "input_message_content": inputMessageContent, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Edits the content of a live location in an inline message sent via a bot; for bots only +// +// @param inlineMessageId Inline message identifier +// @param replyMarkup New message reply markup +// @param location New location content of the message; may be null. Pass null to stop sharing the live location +func (client *Client) EditInlineMessageLiveLocation(inlineMessageId string, replyMarkup ReplyMarkup, location *Location) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editInlineMessageLiveLocation", + }, + Data: map[string]interface{}{ + "inline_message_id": inlineMessageId, + "reply_markup": replyMarkup, + "location": location, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Edits the caption of an inline message sent via a bot; for bots only +// +// @param inlineMessageId Inline message identifier +// @param replyMarkup New message reply markup +// @param caption New message content caption; 0-200 characters +func (client *Client) EditInlineMessageCaption(inlineMessageId string, replyMarkup ReplyMarkup, caption *FormattedText) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editInlineMessageCaption", + }, + Data: map[string]interface{}{ + "inline_message_id": inlineMessageId, + "reply_markup": replyMarkup, + "caption": caption, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Edits the reply markup of an inline message sent via a bot; for bots only +// +// @param inlineMessageId Inline message identifier +// @param replyMarkup New message reply markup +func (client *Client) EditInlineMessageReplyMarkup(inlineMessageId string, replyMarkup ReplyMarkup) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "editInlineMessageReplyMarkup", + }, + Data: map[string]interface{}{ + "inline_message_id": inlineMessageId, + "reply_markup": replyMarkup, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns all entities (mentions, hashtags, cashtags, bot commands, URLs, and email addresses) contained in the text. This is an offline method. Can be called before authorization. Can be called synchronously +// +// @param text The text in which to look for entites +func (client *Client) GetTextEntities(text string) (*TextEntities, error) { + result, err := client.jsonClient.Execute(Request{ + meta: meta{ + Type: "getTextEntities", + }, + Data: map[string]interface{}{ + "text": text, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTextEntities(result.Data) +} + +// Parses Bold, Italic, Code, Pre, PreCode and TextUrl entities contained in the text. This is an offline method. Can be called before authorization. Can be called synchronously +// +// @param text The text which should be parsed +// @param parseMode Text parse mode +func (client *Client) ParseTextEntities(text string, parseMode TextParseMode) (*FormattedText, error) { + result, err := client.jsonClient.Execute(Request{ + meta: meta{ + Type: "parseTextEntities", + }, + Data: map[string]interface{}{ + "text": text, + "parse_mode": parseMode, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalFormattedText(result.Data) +} + +// Returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. This is an offline method. Can be called before authorization. Can be called synchronously +// +// @param fileName The name of the file or path to the file +func (client *Client) GetFileMimeType(fileName string) (*Text, error) { + result, err := client.jsonClient.Execute(Request{ + meta: meta{ + Type: "getFileMimeType", + }, + Data: map[string]interface{}{ + "file_name": fileName, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalText(result.Data) +} + +// Returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. This is an offline method. Can be called before authorization. Can be called synchronously +// +// @param mimeType The MIME type of the file +func (client *Client) GetFileExtension(mimeType string) (*Text, error) { + result, err := client.jsonClient.Execute(Request{ + meta: meta{ + Type: "getFileExtension", + }, + Data: map[string]interface{}{ + "mime_type": mimeType, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalText(result.Data) +} + +// Sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires +// +// @param botUserId The identifier of the target bot +// @param chatId Identifier of the chat, where the query was sent +// @param userLocation Location of the user, only if needed +// @param query Text of the query +// @param offset Offset of the first entry to return +func (client *Client) GetInlineQueryResults(botUserId int32, chatId int64, userLocation *Location, query string, offset string) (*InlineQueryResults, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getInlineQueryResults", + }, + Data: map[string]interface{}{ + "bot_user_id": botUserId, + "chat_id": chatId, + "user_location": userLocation, + "query": query, + "offset": offset, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalInlineQueryResults(result.Data) +} + +// Sets the result of an inline query; for bots only +// +// @param inlineQueryId Identifier of the inline query +// @param isPersonal True, if the result of the query can be cached for the specified user +// @param results The results of the query +// @param cacheTime Allowed time to cache the results of the query, in seconds +// @param nextOffset Offset for the next inline query; pass an empty string if there are no more results +// @param switchPmText If non-empty, this text should be shown on the button that opens a private chat with the bot and sends a start message to the bot with the parameter switch_pm_parameter +// @param switchPmParameter The parameter for the bot start message +func (client *Client) AnswerInlineQuery(inlineQueryId JsonInt64, isPersonal bool, results []InputInlineQueryResult, cacheTime int32, nextOffset string, switchPmText string, switchPmParameter string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "answerInlineQuery", + }, + Data: map[string]interface{}{ + "inline_query_id": inlineQueryId, + "is_personal": isPersonal, + "results": results, + "cache_time": cacheTime, + "next_offset": nextOffset, + "switch_pm_text": switchPmText, + "switch_pm_parameter": switchPmParameter, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires +// +// @param chatId Identifier of the chat with the message +// @param messageId Identifier of the message from which the query originated +// @param payload Query payload +func (client *Client) GetCallbackQueryAnswer(chatId int64, messageId int64, payload CallbackQueryPayload) (*CallbackQueryAnswer, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getCallbackQueryAnswer", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "payload": payload, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalCallbackQueryAnswer(result.Data) +} + +// Sets the result of a callback query; for bots only +// +// @param callbackQueryId Identifier of the callback query +// @param text Text of the answer +// @param showAlert If true, an alert should be shown to the user instead of a toast notification +// @param url URL to be opened +// @param cacheTime Time during which the result of the query can be cached, in seconds +func (client *Client) AnswerCallbackQuery(callbackQueryId JsonInt64, text string, showAlert bool, url string, cacheTime int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "answerCallbackQuery", + }, + Data: map[string]interface{}{ + "callback_query_id": callbackQueryId, + "text": text, + "show_alert": showAlert, + "url": url, + "cache_time": cacheTime, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sets the result of a shipping query; for bots only +// +// @param shippingQueryId Identifier of the shipping query +// @param shippingOptions Available shipping options +// @param errorMessage An error message, empty on success +func (client *Client) AnswerShippingQuery(shippingQueryId JsonInt64, shippingOptions []*ShippingOption, errorMessage string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "answerShippingQuery", + }, + Data: map[string]interface{}{ + "shipping_query_id": shippingQueryId, + "shipping_options": shippingOptions, + "error_message": errorMessage, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sets the result of a pre-checkout query; for bots only +// +// @param preCheckoutQueryId Identifier of the pre-checkout query +// @param errorMessage An error message, empty on success +func (client *Client) AnswerPreCheckoutQuery(preCheckoutQueryId JsonInt64, errorMessage string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "answerPreCheckoutQuery", + }, + Data: map[string]interface{}{ + "pre_checkout_query_id": preCheckoutQueryId, + "error_message": errorMessage, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Updates the game score of the specified user in the game; for bots only +// +// @param chatId The chat to which the message with the game +// @param messageId Identifier of the message +// @param editMessage True, if the message should be edited +// @param userId User identifier +// @param score The new score +// @param force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table +func (client *Client) SetGameScore(chatId int64, messageId int64, editMessage bool, userId int32, score int32, force bool) (*Message, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setGameScore", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "edit_message": editMessage, + "user_id": userId, + "score": score, + "force": force, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalMessage(result.Data) +} + +// Updates the game score of the specified user in a game; for bots only +// +// @param inlineMessageId Inline message identifier +// @param editMessage True, if the message should be edited +// @param userId User identifier +// @param score The new score +// @param force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table +func (client *Client) SetInlineGameScore(inlineMessageId string, editMessage bool, userId int32, score int32, force bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setInlineGameScore", + }, + Data: map[string]interface{}{ + "inline_message_id": inlineMessageId, + "edit_message": editMessage, + "user_id": userId, + "score": score, + "force": force, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only +// +// @param chatId The chat that contains the message with the game +// @param messageId Identifier of the message +// @param userId User identifier +func (client *Client) GetGameHighScores(chatId int64, messageId int64, userId int32) (*GameHighScores, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getGameHighScores", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalGameHighScores(result.Data) +} + +// Returns game high scores and some part of the high score table in the range of the specified user; for bots only +// +// @param inlineMessageId Inline message identifier +// @param userId User identifier +func (client *Client) GetInlineGameHighScores(inlineMessageId string, userId int32) (*GameHighScores, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getInlineGameHighScores", + }, + Data: map[string]interface{}{ + "inline_message_id": inlineMessageId, + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalGameHighScores(result.Data) +} + +// Deletes the default reply markup from a chat. Must be called after a one-time keyboard or a ForceReply reply markup has been used. UpdateChatReplyMarkup will be sent if the reply markup will be changed +// +// @param chatId Chat identifier +// @param messageId The message identifier of the used keyboard +func (client *Client) DeleteChatReplyMarkup(chatId int64, messageId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteChatReplyMarkup", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sends a notification about user activity in a chat +// +// @param chatId Chat identifier +// @param action The action description +func (client *Client) SendChatAction(chatId int64, action ChatAction) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendChatAction", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "action": action, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// This method should be called if the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats) +// +// @param chatId Chat identifier +func (client *Client) OpenChat(chatId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "openChat", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// This method should be called if the chat is closed by the user. Many useful activities depend on the chat being opened or closed +// +// @param chatId Chat identifier +func (client *Client) CloseChat(chatId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "closeChat", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// This method should be called if messages are being viewed by the user. Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels) +// +// @param chatId Chat identifier +// @param messageIds The identifiers of the messages being viewed +// @param forceRead True, if messages in closed chats should be marked as read +func (client *Client) ViewMessages(chatId int64, messageIds []int64, forceRead bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "viewMessages", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_ids": messageIds, + "force_read": forceRead, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// This method should be called if the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed +// +// @param chatId Chat identifier of the message +// @param messageId Identifier of the message with the opened content +func (client *Client) OpenMessageContent(chatId int64, messageId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "openMessageContent", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Marks all mentions in a chat as read +// +// @param chatId Chat identifier +func (client *Client) ReadAllChatMentions(chatId int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "readAllChatMentions", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns an existing chat corresponding to a given user +// +// @param userId User identifier +// @param force If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect +func (client *Client) CreatePrivateChat(userId int32, force bool) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createPrivateChat", + }, + Data: map[string]interface{}{ + "user_id": userId, + "force": force, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Returns an existing chat corresponding to a known basic group +// +// @param basicGroupId Basic group identifier +// @param force If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect +func (client *Client) CreateBasicGroupChat(basicGroupId int32, force bool) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createBasicGroupChat", + }, + Data: map[string]interface{}{ + "basic_group_id": basicGroupId, + "force": force, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Returns an existing chat corresponding to a known supergroup or channel +// +// @param supergroupId Supergroup or channel identifier +// @param force If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect +func (client *Client) CreateSupergroupChat(supergroupId int32, force bool) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createSupergroupChat", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "force": force, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Returns an existing chat corresponding to a known secret chat +// +// @param secretChatId Secret chat identifier +func (client *Client) CreateSecretChat(secretChatId int32) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createSecretChat", + }, + Data: map[string]interface{}{ + "secret_chat_id": secretChatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns the newly created chat +// +// @param userIds Identifiers of users to be added to the basic group +// @param title Title of the new basic group; 1-255 characters +func (client *Client) CreateNewBasicGroupChat(userIds []int32, title string) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createNewBasicGroupChat", + }, + Data: map[string]interface{}{ + "user_ids": userIds, + "title": title, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat +// +// @param title Title of the new chat; 1-255 characters +// @param isChannel True, if a channel chat should be created +// @param description Chat description; 0-255 characters +func (client *Client) CreateNewSupergroupChat(title string, isChannel bool, description string) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createNewSupergroupChat", + }, + Data: map[string]interface{}{ + "title": title, + "is_channel": isChannel, + "description": description, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Creates a new secret chat. Returns the newly created chat +// +// @param userId Identifier of the target user +func (client *Client) CreateNewSecretChat(userId int32) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createNewSecretChat", + }, + Data: map[string]interface{}{ + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom. Deactivates the original basic group +// +// @param chatId Identifier of the chat to upgrade +func (client *Client) UpgradeBasicGroupChatToSupergroupChat(chatId int64) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "upgradeBasicGroupChatToSupergroupChat", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Changes the chat title. Supported only for basic groups, supergroups and channels. Requires administrator rights in basic groups and the appropriate administrator rights in supergroups and channels. The title will not be changed until the request to the server has been completed +// +// @param chatId Chat identifier +// @param title New title of the chat; 1-255 characters +func (client *Client) SetChatTitle(chatId int64, title string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setChatTitle", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "title": title, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires administrator rights in basic groups and the appropriate administrator rights in supergroups and channels. The photo will not be changed before request to the server has been completed +// +// @param chatId Chat identifier +// @param photo New chat photo. You can use a zero InputFileId to delete the chat photo. Files that are accessible only by HTTP URL are not acceptable +func (client *Client) SetChatPhoto(chatId int64, photo InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setChatPhoto", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "photo": photo, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the draft message in a chat +// +// @param chatId Chat identifier +// @param draftMessage New draft message; may be null +func (client *Client) SetChatDraftMessage(chatId int64, draftMessage *DraftMessage) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setChatDraftMessage", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "draft_message": draftMessage, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the pinned state of a chat. You can pin up to GetOption("pinned_chat_count_max") non-secret chats and the same number of secret chats +// +// @param chatId Chat identifier +// @param isPinned New value of is_pinned +func (client *Client) ToggleChatIsPinned(chatId int64, isPinned bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "toggleChatIsPinned", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "is_pinned": isPinned, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes client data associated with a chat +// +// @param chatId Chat identifier +// @param clientData New value of client_data +func (client *Client) SetChatClientData(chatId int64, clientData string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setChatClientData", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "client_data": clientData, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Adds a new member to a chat. Members can't be added to private or secret chats. Members will not be added until the chat state has been synchronized with the server +// +// @param chatId Chat identifier +// @param userId Identifier of the user +// @param forwardLimit The number of earlier messages from the chat to be forwarded to the new member; up to 300. Ignored for supergroups and channels +func (client *Client) AddChatMember(chatId int64, userId int32, forwardLimit int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addChatMember", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "user_id": userId, + "forward_limit": forwardLimit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Adds multiple new members to a chat. Currently this option is only available for supergroups and channels. This option can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Members will not be added until the chat state has been synchronized with the server +// +// @param chatId Chat identifier +// @param userIds Identifiers of the users to be added to the chat +func (client *Client) AddChatMembers(chatId int64, userIds []int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addChatMembers", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "user_ids": userIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the status of a chat member, needs appropriate privileges. This function is currently not suitable for adding new members to the chat; instead, use addChatMember. The chat member status will not be changed until it has been synchronized with the server +// +// @param chatId Chat identifier +// @param userId User identifier +// @param status The new status of the member in the chat +func (client *Client) SetChatMemberStatus(chatId int64, userId int32, status ChatMemberStatus) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setChatMemberStatus", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "user_id": userId, + "status": status, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns information about a single member of a chat +// +// @param chatId Chat identifier +// @param userId User identifier +func (client *Client) GetChatMember(chatId int64, userId int32) (*ChatMember, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChatMember", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChatMember(result.Data) +} + +// Searches for a specified query in the first name, last name and username of the members of a specified chat. Requires administrator rights in channels +// +// @param chatId Chat identifier +// @param query Query to search for +// @param limit The maximum number of users to be returned +func (client *Client) SearchChatMembers(chatId int64, query string, limit int32) (*ChatMembers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchChatMembers", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "query": query, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChatMembers(result.Data) +} + +// Returns a list of users who are administrators of the chat +// +// @param chatId Chat identifier +func (client *Client) GetChatAdministrators(chatId int64) (*Users, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChatAdministrators", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUsers(result.Data) +} + +// Changes the order of pinned chats +// +// @param chatIds The new list of pinned chats +func (client *Client) SetPinnedChats(chatIds []int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setPinnedChats", + }, + Data: map[string]interface{}{ + "chat_ids": chatIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Asynchronously downloads a file from the cloud. updateFile will be used to notify about the download progress and successful completion of the download. Returns file state just after the download has been started +// +// @param fileId Identifier of the file to download +// @param priority Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile was called will be downloaded first +func (client *Client) DownloadFile(fileId int32, priority int32) (*File, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "downloadFile", + }, + Data: map[string]interface{}{ + "file_id": fileId, + "priority": priority, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalFile(result.Data) +} + +// Stops the downloading of a file. If a file has already been downloaded, does nothing +// +// @param fileId Identifier of a file to stop downloading +// @param onlyIfPending Pass true to stop downloading only if it hasn't been started, i.e. request hasn't been sent to server +func (client *Client) CancelDownloadFile(fileId int32, onlyIfPending bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "cancelDownloadFile", + }, + Data: map[string]interface{}{ + "file_id": fileId, + "only_if_pending": onlyIfPending, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Asynchronously uploads a file to the cloud without sending it in a message. updateFile will be used to notify about upload progress and successful completion of the upload. The file will not have a persistent remote identifier until it will be sent in a message +// +// @param file File to upload +// @param fileType File type +// @param priority Priority of the upload (1-32). The higher the priority, the earlier the file will be uploaded. If the priorities of two files are equal, then the first one for which uploadFile was called will be uploaded first +func (client *Client) UploadFile(file InputFile, fileType FileType, priority int32) (*File, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "uploadFile", + }, + Data: map[string]interface{}{ + "file": file, + "file_type": fileType, + "priority": priority, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalFile(result.Data) +} + +// Stops the uploading of a file. Supported only for files uploaded by using uploadFile. For other files the behavior is undefined +// +// @param fileId Identifier of the file to stop uploading +func (client *Client) CancelUploadFile(fileId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "cancelUploadFile", + }, + Data: map[string]interface{}{ + "file_id": fileId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// The next part of a file was generated +// +// @param generationId The identifier of the generation process +// @param expectedSize Expected size of the generated file, in bytes; 0 if unknown +// @param localPrefixSize The number of bytes already generated +func (client *Client) SetFileGenerationProgress(generationId JsonInt64, expectedSize int32, localPrefixSize int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setFileGenerationProgress", + }, + Data: map[string]interface{}{ + "generation_id": generationId, + "expected_size": expectedSize, + "local_prefix_size": localPrefixSize, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Finishes the file generation +// +// @param generationId The identifier of the generation process +// @param error If set, means that file generation has failed and should be terminated +func (client *Client) FinishFileGeneration(generationId JsonInt64, error *Error) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "finishFileGeneration", + }, + Data: map[string]interface{}{ + "generation_id": generationId, + "error": error, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Deletes a file from the TDLib file cache +// +// @param fileId Identifier of the file to delete +func (client *Client) DeleteFile(fileId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteFile", + }, + Data: map[string]interface{}{ + "file_id": fileId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Generates a new invite link for a chat; the previously generated link is revoked. Available for basic groups, supergroups, and channels. In basic groups this can be called only by the group's creator; in supergroups and channels this requires appropriate administrator rights +// +// @param chatId Chat identifier +func (client *Client) GenerateChatInviteLink(chatId int64) (*ChatInviteLink, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "generateChatInviteLink", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChatInviteLink(result.Data) +} + +// Checks the validity of an invite link for a chat and returns information about the corresponding chat +// +// @param inviteLink Invite link to be checked; should begin with "https://t.me/joinchat/", "https://telegram.me/joinchat/", or "https://telegram.dog/joinchat/" +func (client *Client) CheckChatInviteLink(inviteLink string) (*ChatInviteLinkInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "checkChatInviteLink", + }, + Data: map[string]interface{}{ + "invite_link": inviteLink, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChatInviteLinkInfo(result.Data) +} + +// Uses an invite link to add the current user to the chat if possible. The new member will not be added until the chat state has been synchronized with the server +// +// @param inviteLink Invite link to import; should begin with "https://t.me/joinchat/", "https://telegram.me/joinchat/", or "https://telegram.dog/joinchat/" +func (client *Client) JoinChatByInviteLink(inviteLink string) (*Chat, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "joinChatByInviteLink", + }, + Data: map[string]interface{}{ + "invite_link": inviteLink, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChat(result.Data) +} + +// Creates a new call +// +// @param userId Identifier of the user to be called +// @param protocol Description of the call protocols supported by the client +func (client *Client) CreateCall(userId int32, protocol *CallProtocol) (*CallId, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createCall", + }, + Data: map[string]interface{}{ + "user_id": userId, + "protocol": protocol, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalCallId(result.Data) +} + +// Accepts an incoming call +// +// @param callId Call identifier +// @param protocol Description of the call protocols supported by the client +func (client *Client) AcceptCall(callId int32, protocol *CallProtocol) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "acceptCall", + }, + Data: map[string]interface{}{ + "call_id": callId, + "protocol": protocol, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Discards a call +// +// @param callId Call identifier +// @param isDisconnected True, if the user was disconnected +// @param duration The call duration, in seconds +// @param connectionId Identifier of the connection used during the call +func (client *Client) DiscardCall(callId int32, isDisconnected bool, duration int32, connectionId JsonInt64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "discardCall", + }, + Data: map[string]interface{}{ + "call_id": callId, + "is_disconnected": isDisconnected, + "duration": duration, + "connection_id": connectionId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sends a call rating +// +// @param callId Call identifier +// @param rating Call rating; 1-5 +// @param comment An optional user comment if the rating is less than 5 +func (client *Client) SendCallRating(callId int32, rating int32, comment string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendCallRating", + }, + Data: map[string]interface{}{ + "call_id": callId, + "rating": rating, + "comment": comment, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sends debug information for a call +// +// @param callId Call identifier +// @param debugInformation Debug information in application-specific format +func (client *Client) SendCallDebugInformation(callId int32, debugInformation string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendCallDebugInformation", + }, + Data: map[string]interface{}{ + "call_id": callId, + "debug_information": debugInformation, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Adds a user to the blacklist +// +// @param userId User identifier +func (client *Client) BlockUser(userId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "blockUser", + }, + Data: map[string]interface{}{ + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Removes a user from the blacklist +// +// @param userId User identifier +func (client *Client) UnblockUser(userId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "unblockUser", + }, + Data: map[string]interface{}{ + "user_id": userId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns users that were blocked by the current user +// +// @param offset Number of users to skip in the result; must be non-negative +// @param limit Maximum number of users to return; up to 100 +func (client *Client) GetBlockedUsers(offset int32, limit int32) (*Users, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getBlockedUsers", + }, + Data: map[string]interface{}{ + "offset": offset, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUsers(result.Data) +} + +// Adds new contacts or edits existing contacts; contacts' user identifiers are ignored +// +// @param contacts The list of contacts to import or edit +func (client *Client) ImportContacts(contacts []*Contact) (*ImportedContacts, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "importContacts", + }, + Data: map[string]interface{}{ + "contacts": contacts, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalImportedContacts(result.Data) +} + +// Searches for the specified query in the first names, last names and usernames of the known user contacts +// +// @param query Query to search for; can be empty to return all contacts +// @param limit Maximum number of users to be returned +func (client *Client) SearchContacts(query string, limit int32) (*Users, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchContacts", + }, + Data: map[string]interface{}{ + "query": query, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUsers(result.Data) +} + +// Removes users from the contacts list +// +// @param userIds Identifiers of users to be deleted +func (client *Client) RemoveContacts(userIds []int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeContacts", + }, + Data: map[string]interface{}{ + "user_ids": userIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the total number of imported contacts +func (client *Client) GetImportedContactCount() (*Count, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getImportedContactCount", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalCount(result.Data) +} + +// Changes imported contacts using the list of current user contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time +// +// @param contacts The new list of contacts +func (client *Client) ChangeImportedContacts(contacts []*Contact) (*ImportedContacts, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "changeImportedContacts", + }, + Data: map[string]interface{}{ + "contacts": contacts, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalImportedContacts(result.Data) +} + +// Clears all imported contacts +func (client *Client) ClearImportedContacts() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "clearImportedContacts", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the profile photos of a user. The result of this query may be outdated: some photos might have been deleted already +// +// @param userId User identifier +// @param offset The number of photos to skip; must be non-negative +// @param limit Maximum number of photos to be returned; up to 100 +func (client *Client) GetUserProfilePhotos(userId int32, offset int32, limit int32) (*UserProfilePhotos, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getUserProfilePhotos", + }, + Data: map[string]interface{}{ + "user_id": userId, + "offset": offset, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUserProfilePhotos(result.Data) +} + +// Returns stickers from the installed sticker sets that correspond to a given emoji. If the emoji is not empty, favorite and recently used stickers may also be returned +// +// @param emoji String representation of emoji. If empty, returns all known installed stickers +// @param limit Maximum number of stickers to be returned +func (client *Client) GetStickers(emoji string, limit int32) (*Stickers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getStickers", + }, + Data: map[string]interface{}{ + "emoji": emoji, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickers(result.Data) +} + +// Searches for stickers from public sticker sets that correspond to a given emoji +// +// @param emoji String representation of emoji; must be non-empty +// @param limit Maximum number of stickers to be returned +func (client *Client) SearchStickers(emoji string, limit int32) (*Stickers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchStickers", + }, + Data: map[string]interface{}{ + "emoji": emoji, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickers(result.Data) +} + +// Returns a list of installed sticker sets +// +// @param isMasks Pass true to return mask sticker sets; pass false to return ordinary sticker sets +func (client *Client) GetInstalledStickerSets(isMasks bool) (*StickerSets, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getInstalledStickerSets", + }, + Data: map[string]interface{}{ + "is_masks": isMasks, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSets(result.Data) +} + +// Returns a list of archived sticker sets +// +// @param isMasks Pass true to return mask stickers sets; pass false to return ordinary sticker sets +// @param offsetStickerSetId Identifier of the sticker set from which to return the result +// @param limit Maximum number of sticker sets to return +func (client *Client) GetArchivedStickerSets(isMasks bool, offsetStickerSetId JsonInt64, limit int32) (*StickerSets, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getArchivedStickerSets", + }, + Data: map[string]interface{}{ + "is_masks": isMasks, + "offset_sticker_set_id": offsetStickerSetId, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSets(result.Data) +} + +// Returns a list of trending sticker sets +func (client *Client) GetTrendingStickerSets() (*StickerSets, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getTrendingStickerSets", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSets(result.Data) +} + +// Returns a list of sticker sets attached to a file. Currently only photos and videos can have attached sticker sets +// +// @param fileId File identifier +func (client *Client) GetAttachedStickerSets(fileId int32) (*StickerSets, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getAttachedStickerSets", + }, + Data: map[string]interface{}{ + "file_id": fileId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSets(result.Data) +} + +// Returns information about a sticker set by its identifier +// +// @param setId Identifier of the sticker set +func (client *Client) GetStickerSet(setId JsonInt64) (*StickerSet, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getStickerSet", + }, + Data: map[string]interface{}{ + "set_id": setId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSet(result.Data) +} + +// Searches for a sticker set by its name +// +// @param name Name of the sticker set +func (client *Client) SearchStickerSet(name string) (*StickerSet, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchStickerSet", + }, + Data: map[string]interface{}{ + "name": name, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSet(result.Data) +} + +// Searches for installed sticker sets by looking for specified query in their title and name +// +// @param isMasks Pass true to return mask sticker sets; pass false to return ordinary sticker sets +// @param query Query to search for +// @param limit Maximum number of sticker sets to return +func (client *Client) SearchInstalledStickerSets(isMasks bool, query string, limit int32) (*StickerSets, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchInstalledStickerSets", + }, + Data: map[string]interface{}{ + "is_masks": isMasks, + "query": query, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSets(result.Data) +} + +// Searches for ordinary sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results +// +// @param query Query to search for +func (client *Client) SearchStickerSets(query string) (*StickerSets, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchStickerSets", + }, + Data: map[string]interface{}{ + "query": query, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSets(result.Data) +} + +// Installs/uninstalls or activates/archives a sticker set +// +// @param setId Identifier of the sticker set +// @param isInstalled The new value of is_installed +// @param isArchived The new value of is_archived. A sticker set can't be installed and archived simultaneously +func (client *Client) ChangeStickerSet(setId JsonInt64, isInstalled bool, isArchived bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "changeStickerSet", + }, + Data: map[string]interface{}{ + "set_id": setId, + "is_installed": isInstalled, + "is_archived": isArchived, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Informs the server that some trending sticker sets have been viewed by the user +// +// @param stickerSetIds Identifiers of viewed trending sticker sets +func (client *Client) ViewTrendingStickerSets(stickerSetIds []JsonInt64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "viewTrendingStickerSets", + }, + Data: map[string]interface{}{ + "sticker_set_ids": stickerSetIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the order of installed sticker sets +// +// @param isMasks Pass true to change the order of mask sticker sets; pass false to change the order of ordinary sticker sets +// @param stickerSetIds Identifiers of installed sticker sets in the new correct order +func (client *Client) ReorderInstalledStickerSets(isMasks bool, stickerSetIds []JsonInt64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "reorderInstalledStickerSets", + }, + Data: map[string]interface{}{ + "is_masks": isMasks, + "sticker_set_ids": stickerSetIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns a list of recently used stickers +// +// @param isAttached Pass true to return stickers and masks that were recently attached to photos or video files; pass false to return recently sent stickers +func (client *Client) GetRecentStickers(isAttached bool) (*Stickers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getRecentStickers", + }, + Data: map[string]interface{}{ + "is_attached": isAttached, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickers(result.Data) +} + +// Manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set can be added to this list +// +// @param isAttached Pass true to add the sticker to the list of stickers recently attached to photo or video files; pass false to add the sticker to the list of recently sent stickers +// @param sticker Sticker file to add +func (client *Client) AddRecentSticker(isAttached bool, sticker InputFile) (*Stickers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addRecentSticker", + }, + Data: map[string]interface{}{ + "is_attached": isAttached, + "sticker": sticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickers(result.Data) +} + +// Removes a sticker from the list of recently used stickers +// +// @param isAttached Pass true to remove the sticker from the list of stickers recently attached to photo or video files; pass false to remove the sticker from the list of recently sent stickers +// @param sticker Sticker file to delete +func (client *Client) RemoveRecentSticker(isAttached bool, sticker InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeRecentSticker", + }, + Data: map[string]interface{}{ + "is_attached": isAttached, + "sticker": sticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Clears the list of recently used stickers +// +// @param isAttached Pass true to clear the list of stickers recently attached to photo or video files; pass false to clear the list of recently sent stickers +func (client *Client) ClearRecentStickers(isAttached bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "clearRecentStickers", + }, + Data: map[string]interface{}{ + "is_attached": isAttached, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns favorite stickers +func (client *Client) GetFavoriteStickers() (*Stickers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getFavoriteStickers", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickers(result.Data) +} + +// Adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set can be added to this list +// +// @param sticker Sticker file to add +func (client *Client) AddFavoriteSticker(sticker InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addFavoriteSticker", + }, + Data: map[string]interface{}{ + "sticker": sticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Removes a sticker from the list of favorite stickers +// +// @param sticker Sticker file to delete from the list +func (client *Client) RemoveFavoriteSticker(sticker InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeFavoriteSticker", + }, + Data: map[string]interface{}{ + "sticker": sticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns emoji corresponding to a sticker +// +// @param sticker Sticker file identifier +func (client *Client) GetStickerEmojis(sticker InputFile) (*StickerEmojis, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getStickerEmojis", + }, + Data: map[string]interface{}{ + "sticker": sticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerEmojis(result.Data) +} + +// Returns saved animations +func (client *Client) GetSavedAnimations() (*Animations, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getSavedAnimations", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalAnimations(result.Data) +} + +// Manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type "video/mp4" can be added to the list +// +// @param animation The animation file to be added. Only animations known to the server (i.e. successfully sent via a message) can be added to the list +func (client *Client) AddSavedAnimation(animation InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addSavedAnimation", + }, + Data: map[string]interface{}{ + "animation": animation, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Removes an animation from the list of saved animations +// +// @param animation Animation file to be removed +func (client *Client) RemoveSavedAnimation(animation InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeSavedAnimation", + }, + Data: map[string]interface{}{ + "animation": animation, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns up to 20 recently used inline bots in the order of their last usage +func (client *Client) GetRecentInlineBots() (*Users, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getRecentInlineBots", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUsers(result.Data) +} + +// Searches for recently used hashtags by their prefix +// +// @param prefix Hashtag prefix to search for +// @param limit Maximum number of hashtags to be returned +func (client *Client) SearchHashtags(prefix string, limit int32) (*Hashtags, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "searchHashtags", + }, + Data: map[string]interface{}{ + "prefix": prefix, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalHashtags(result.Data) +} + +// Removes a hashtag from the list of recently used hashtags +// +// @param hashtag Hashtag to delete +func (client *Client) RemoveRecentHashtag(hashtag string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeRecentHashtag", + }, + Data: map[string]interface{}{ + "hashtag": hashtag, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns a web page preview by the text of the message. Do not call this function too often. Returns a 404 error if the web page has no preview +// +// @param text Message text with formatting +func (client *Client) GetWebPagePreview(text *FormattedText) (*WebPage, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getWebPagePreview", + }, + Data: map[string]interface{}{ + "text": text, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalWebPage(result.Data) +} + +// Returns an instant view version of a web page if available. Returns a 404 error if the web page has no instant view page +// +// @param url The web page URL +// @param forceFull If true, the full instant view for the web page will be returned +func (client *Client) GetWebPageInstantView(url string, forceFull bool) (*WebPageInstantView, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getWebPageInstantView", + }, + Data: map[string]interface{}{ + "url": url, + "force_full": forceFull, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalWebPageInstantView(result.Data) +} + +// Returns the notification settings for a given scope +// +// @param scope Scope for which to return the notification settings information +func (client *Client) GetNotificationSettings(scope NotificationSettingsScope) (*NotificationSettings, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getNotificationSettings", + }, + Data: map[string]interface{}{ + "scope": scope, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalNotificationSettings(result.Data) +} + +// Changes notification settings for a given scope +// +// @param scope Scope for which to change the notification settings +// @param notificationSettings The new notification settings for the given scope +func (client *Client) SetNotificationSettings(scope NotificationSettingsScope, notificationSettings *NotificationSettings) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setNotificationSettings", + }, + Data: map[string]interface{}{ + "scope": scope, + "notification_settings": notificationSettings, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Resets all notification settings to their default values. By default, the only muted chats are supergroups, the sound is set to "default" and message previews are shown +func (client *Client) ResetAllNotificationSettings() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "resetAllNotificationSettings", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Uploads a new profile photo for the current user. If something changes, updateUser will be sent +// +// @param photo Profile photo to set. inputFileId and inputFileRemote may still be unsupported +func (client *Client) SetProfilePhoto(photo InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setProfilePhoto", + }, + Data: map[string]interface{}{ + "photo": photo, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Deletes a profile photo. If something changes, updateUser will be sent +// +// @param profilePhotoId Identifier of the profile photo to delete +func (client *Client) DeleteProfilePhoto(profilePhotoId JsonInt64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteProfilePhoto", + }, + Data: map[string]interface{}{ + "profile_photo_id": profilePhotoId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the first and last name of the current user. If something changes, updateUser will be sent +// +// @param firstName The new value of the first name for the user; 1-255 characters +// @param lastName The new value of the optional last name for the user; 0-255 characters +func (client *Client) SetName(firstName string, lastName string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setName", + }, + Data: map[string]interface{}{ + "first_name": firstName, + "last_name": lastName, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the bio of the current user +// +// @param bio The new value of the user bio; 0-70 characters without line feeds +func (client *Client) SetBio(bio string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setBio", + }, + Data: map[string]interface{}{ + "bio": bio, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the username of the current user. If something changes, updateUser will be sent +// +// @param username The new value of the username. Use an empty string to remove the username +func (client *Client) SetUsername(username string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setUsername", + }, + Data: map[string]interface{}{ + "username": username, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the phone number of the user and sends an authentication code to the user's new phone number. On success, returns information about the sent code +// +// @param phoneNumber The new phone number of the user in international format +// @param allowFlashCall Pass true if the code can be sent via flash call to the specified phone number +// @param isCurrentPhoneNumber Pass true if the phone number is used on the current device. Ignored if allow_flash_call is false +func (client *Client) ChangePhoneNumber(phoneNumber string, allowFlashCall bool, isCurrentPhoneNumber bool) (*AuthenticationCodeInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "changePhoneNumber", + }, + Data: map[string]interface{}{ + "phone_number": phoneNumber, + "allow_flash_call": allowFlashCall, + "is_current_phone_number": isCurrentPhoneNumber, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalAuthenticationCodeInfo(result.Data) +} + +// Re-sends the authentication code sent to confirm a new phone number for the user. Works only if the previously received authenticationCodeInfo next_code_type was not null +func (client *Client) ResendChangePhoneNumberCode() (*AuthenticationCodeInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "resendChangePhoneNumberCode", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalAuthenticationCodeInfo(result.Data) +} + +// Checks the authentication code sent to confirm a new phone number of the user +// +// @param code Verification code received by SMS, phone call or flash call +func (client *Client) CheckChangePhoneNumberCode(code string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "checkChangePhoneNumberCode", + }, + Data: map[string]interface{}{ + "code": code, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns all active sessions of the current user +func (client *Client) GetActiveSessions() (*Sessions, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getActiveSessions", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalSessions(result.Data) +} + +// Terminates a session of the current user +// +// @param sessionId Session identifier +func (client *Client) TerminateSession(sessionId JsonInt64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "terminateSession", + }, + Data: map[string]interface{}{ + "session_id": sessionId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Terminates all other sessions of the current user +func (client *Client) TerminateAllOtherSessions() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "terminateAllOtherSessions", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns all website where the current user used Telegram to log in +func (client *Client) GetConnectedWebsites() (*ConnectedWebsites, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getConnectedWebsites", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalConnectedWebsites(result.Data) +} + +// Disconnects website from the current user's Telegram account +// +// @param websiteId Website identifier +func (client *Client) DisconnectWebsite(websiteId JsonInt64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "disconnectWebsite", + }, + Data: map[string]interface{}{ + "website_id": websiteId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Disconnects all websites from the current user's Telegram account +func (client *Client) DisconnectAllWebsites() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "disconnectAllWebsites", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Toggles the "All members are admins" setting in basic groups; requires creator privileges in the group +// +// @param basicGroupId Identifier of the basic group +// @param everyoneIsAdministrator New value of everyone_is_administrator +func (client *Client) ToggleBasicGroupAdministrators(basicGroupId int32, everyoneIsAdministrator bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "toggleBasicGroupAdministrators", + }, + Data: map[string]interface{}{ + "basic_group_id": basicGroupId, + "everyone_is_administrator": everyoneIsAdministrator, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the username of a supergroup or channel, requires creator privileges in the supergroup or channel +// +// @param supergroupId Identifier of the supergroup or channel +// @param username New value of the username. Use an empty string to remove the username +func (client *Client) SetSupergroupUsername(supergroupId int32, username string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setSupergroupUsername", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "username": username, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the sticker set of a supergroup; requires appropriate rights in the supergroup +// +// @param supergroupId Identifier of the supergroup +// @param stickerSetId New value of the supergroup sticker set identifier. Use 0 to remove the supergroup sticker set +func (client *Client) SetSupergroupStickerSet(supergroupId int32, stickerSetId JsonInt64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setSupergroupStickerSet", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "sticker_set_id": stickerSetId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Toggles whether all members of a supergroup can add new members; requires appropriate administrator rights in the supergroup. +// +// @param supergroupId Identifier of the supergroup +// @param anyoneCanInvite New value of anyone_can_invite +func (client *Client) ToggleSupergroupInvites(supergroupId int32, anyoneCanInvite bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "toggleSupergroupInvites", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "anyone_can_invite": anyoneCanInvite, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Toggles sender signatures messages sent in a channel; requires appropriate administrator rights in the channel. +// +// @param supergroupId Identifier of the channel +// @param signMessages New value of sign_messages +func (client *Client) ToggleSupergroupSignMessages(supergroupId int32, signMessages bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "toggleSupergroupSignMessages", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "sign_messages": signMessages, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Toggles whether the message history of a supergroup is available to new members; requires appropriate administrator rights in the supergroup. +// +// @param supergroupId The identifier of the supergroup +// @param isAllHistoryAvailable The new value of is_all_history_available +func (client *Client) ToggleSupergroupIsAllHistoryAvailable(supergroupId int32, isAllHistoryAvailable bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "toggleSupergroupIsAllHistoryAvailable", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "is_all_history_available": isAllHistoryAvailable, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes information about a supergroup or channel; requires appropriate administrator rights +// +// @param supergroupId Identifier of the supergroup or channel +// @param description New supergroup or channel description; 0-255 characters +func (client *Client) SetSupergroupDescription(supergroupId int32, description string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setSupergroupDescription", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "description": description, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Pins a message in a supergroup or channel; requires appropriate administrator rights in the supergroup or channel +// +// @param supergroupId Identifier of the supergroup or channel +// @param messageId Identifier of the new pinned message +// @param disableNotification True, if there should be no notification about the pinned message +func (client *Client) PinSupergroupMessage(supergroupId int32, messageId int64, disableNotification bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "pinSupergroupMessage", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "message_id": messageId, + "disable_notification": disableNotification, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Removes the pinned message from a supergroup or channel; requires appropriate administrator rights in the supergroup or channel +// +// @param supergroupId Identifier of the supergroup or channel +func (client *Client) UnpinSupergroupMessage(supergroupId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "unpinSupergroupMessage", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Reports some messages from a user in a supergroup as spam +// +// @param supergroupId Supergroup identifier +// @param userId User identifier +// @param messageIds Identifiers of messages sent in the supergroup by the user. This list must be non-empty +func (client *Client) ReportSupergroupSpam(supergroupId int32, userId int32, messageIds []int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "reportSupergroupSpam", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "user_id": userId, + "message_ids": messageIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns information about members or banned users in a supergroup or channel. Can be used only if SupergroupFullInfo.can_get_members == true; additionally, administrator privileges may be required for some filters +// +// @param supergroupId Identifier of the supergroup or channel +// @param filter The type of users to return. By default, supergroupMembersRecent +// @param offset Number of users to skip +// @param limit The maximum number of users be returned; up to 200 +func (client *Client) GetSupergroupMembers(supergroupId int32, filter SupergroupMembersFilter, offset int32, limit int32) (*ChatMembers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getSupergroupMembers", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + "filter": filter, + "offset": offset, + "limit": limit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChatMembers(result.Data) +} + +// Deletes a supergroup or channel along with all messages in the corresponding chat. This will release the supergroup or channel username and remove all members; requires creator privileges in the supergroup or channel. Chats with more than 1000 members can't be deleted using this method +// +// @param supergroupId Identifier of the supergroup or channel +func (client *Client) DeleteSupergroup(supergroupId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteSupergroup", + }, + Data: map[string]interface{}{ + "supergroup_id": supergroupId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Closes a secret chat, effectively transfering its state to secretChatStateClosed +// +// @param secretChatId Secret chat identifier +func (client *Client) CloseSecretChat(secretChatId int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "closeSecretChat", + }, + Data: map[string]interface{}{ + "secret_chat_id": secretChatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only in supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i. e., in order of decreasing event_id) +// +// @param chatId Chat identifier +// @param query Search query by which to filter events +// @param fromEventId Identifier of an event from which to return results. Use 0 to get results from the latest events +// @param limit Maximum number of events to return; up to 100 +// @param filters The types of events to return. By default, all types will be returned +// @param userIds User identifiers by which to filter events. By default, events relating to all users will be returned +func (client *Client) GetChatEventLog(chatId int64, query string, fromEventId JsonInt64, limit int32, filters *ChatEventLogFilters, userIds []int32) (*ChatEvents, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChatEventLog", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "query": query, + "from_event_id": fromEventId, + "limit": limit, + "filters": filters, + "user_ids": userIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChatEvents(result.Data) +} + +// Returns an invoice payment form. This method should be called when the user presses inlineKeyboardButtonBuy +// +// @param chatId Chat identifier of the Invoice message +// @param messageId Message identifier +func (client *Client) GetPaymentForm(chatId int64, messageId int64) (*PaymentForm, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getPaymentForm", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPaymentForm(result.Data) +} + +// Validates the order information provided by a user and returns the available shipping options for a flexible invoice +// +// @param chatId Chat identifier of the Invoice message +// @param messageId Message identifier +// @param orderInfo The order information, provided by the user +// @param allowSave True, if the order information can be saved +func (client *Client) ValidateOrderInfo(chatId int64, messageId int64, orderInfo *OrderInfo, allowSave bool) (*ValidatedOrderInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "validateOrderInfo", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "order_info": orderInfo, + "allow_save": allowSave, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalValidatedOrderInfo(result.Data) +} + +// Sends a filled-out payment form to the bot for final verification +// +// @param chatId Chat identifier of the Invoice message +// @param messageId Message identifier +// @param orderInfoId Identifier returned by ValidateOrderInfo, or an empty string +// @param shippingOptionId Identifier of a chosen shipping option, if applicable +// @param credentials The credentials chosen by user for payment +func (client *Client) SendPaymentForm(chatId int64, messageId int64, orderInfoId string, shippingOptionId string, credentials InputCredentials) (*PaymentResult, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendPaymentForm", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + "order_info_id": orderInfoId, + "shipping_option_id": shippingOptionId, + "credentials": credentials, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPaymentResult(result.Data) +} + +// Returns information about a successful payment +// +// @param chatId Chat identifier of the PaymentSuccessful message +// @param messageId Message identifier +func (client *Client) GetPaymentReceipt(chatId int64, messageId int64) (*PaymentReceipt, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getPaymentReceipt", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "message_id": messageId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalPaymentReceipt(result.Data) +} + +// Returns saved order info, if any +func (client *Client) GetSavedOrderInfo() (*OrderInfo, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getSavedOrderInfo", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOrderInfo(result.Data) +} + +// Deletes saved order info +func (client *Client) DeleteSavedOrderInfo() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteSavedOrderInfo", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Deletes saved credentials for all payment provider bots +func (client *Client) DeleteSavedCredentials() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteSavedCredentials", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns a user that can be contacted to get support +func (client *Client) GetSupportUser() (*User, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getSupportUser", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUser(result.Data) +} + +// Returns background wallpapers +func (client *Client) GetWallpapers() (*Wallpapers, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getWallpapers", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalWallpapers(result.Data) +} + +// Registers the currently used device for receiving push notifications +// +// @param deviceToken Device token +// @param otherUserIds List of at most 100 user identifiers of other users currently using the client +func (client *Client) RegisterDevice(deviceToken DeviceToken, otherUserIds []int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "registerDevice", + }, + Data: map[string]interface{}{ + "device_token": deviceToken, + "other_user_ids": otherUserIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns t.me URLs recently visited by a newly registered user +// +// @param referrer Google Play referrer to identify the user +func (client *Client) GetRecentlyVisitedTMeUrls(referrer string) (*TMeUrls, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getRecentlyVisitedTMeUrls", + }, + Data: map[string]interface{}{ + "referrer": referrer, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTMeUrls(result.Data) +} + +// Changes user privacy settings +// +// @param setting The privacy setting +// @param rules The new privacy rules +func (client *Client) SetUserPrivacySettingRules(setting UserPrivacySetting, rules *UserPrivacySettingRules) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setUserPrivacySettingRules", + }, + Data: map[string]interface{}{ + "setting": setting, + "rules": rules, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the current privacy settings +// +// @param setting The privacy setting +func (client *Client) GetUserPrivacySettingRules(setting UserPrivacySetting) (*UserPrivacySettingRules, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getUserPrivacySettingRules", + }, + Data: map[string]interface{}{ + "setting": setting, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalUserPrivacySettingRules(result.Data) +} + +// Returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization +// +// @param name The name of the option +func (client *Client) GetOption(name string) (OptionValue, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getOption", + }, + Data: map[string]interface{}{ + "name": name, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + switch result.Type { + case TypeOptionValueBoolean: + return UnmarshalOptionValueBoolean(result.Data) + + case TypeOptionValueEmpty: + return UnmarshalOptionValueEmpty(result.Data) + + case TypeOptionValueInteger: + return UnmarshalOptionValueInteger(result.Data) + + case TypeOptionValueString: + return UnmarshalOptionValueString(result.Data) + + default: + return nil, errors.New("invalid type") + } +} + +// Sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization +// +// @param name The name of the option +// @param value The new value of the option +func (client *Client) SetOption(name string, value OptionValue) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setOption", + }, + Data: map[string]interface{}{ + "name": name, + "value": value, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Changes the period of inactivity after which the account of the current user will automatically be deleted +// +// @param ttl New account TTL +func (client *Client) SetAccountTtl(ttl *AccountTtl) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setAccountTtl", + }, + Data: map[string]interface{}{ + "ttl": ttl, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the period of inactivity after which the account of the current user will automatically be deleted +func (client *Client) GetAccountTtl() (*AccountTtl, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getAccountTtl", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalAccountTtl(result.Data) +} + +// Deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account +// +// @param reason The reason why the account was deleted; optional +func (client *Client) DeleteAccount(reason string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "deleteAccount", + }, + Data: map[string]interface{}{ + "reason": reason, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns information on whether the current chat can be reported as spam +// +// @param chatId Chat identifier +func (client *Client) GetChatReportSpamState(chatId int64) (*ChatReportSpamState, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getChatReportSpamState", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalChatReportSpamState(result.Data) +} + +// Used to let the server know whether a chat is spam or not. Can be used only if ChatReportSpamState.can_report_spam is true. After this request, ChatReportSpamState.can_report_spam becomes false forever +// +// @param chatId Chat identifier +// @param isSpamChat If true, the chat will be reported as spam; otherwise it will be marked as not spam +func (client *Client) ChangeChatReportSpamState(chatId int64, isSpamChat bool) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "changeChatReportSpamState", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "is_spam_chat": isSpamChat, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Reports a chat to the Telegram moderators. Supported only for supergroups, channels, or private chats with bots, since other chats can't be checked by moderators +// +// @param chatId Chat identifier +// @param reason The reason for reporting the chat +// @param messageIds Identifiers of reported messages, if any +func (client *Client) ReportChat(chatId int64, reason ChatReportReason, messageIds []int64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "reportChat", + }, + Data: map[string]interface{}{ + "chat_id": chatId, + "reason": reason, + "message_ids": messageIds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns storage usage statistics +// +// @param chatLimit Maximum number of chats with the largest storage usage for which separate statistics should be returned. All other chats will be grouped in entries with chat_id == 0. If the chat info database is not used, the chat_limit is ignored and is always set to 0 +func (client *Client) GetStorageStatistics(chatLimit int32) (*StorageStatistics, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getStorageStatistics", + }, + Data: map[string]interface{}{ + "chat_limit": chatLimit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStorageStatistics(result.Data) +} + +// Quickly returns approximate storage usage statistics +func (client *Client) GetStorageStatisticsFast() (*StorageStatisticsFast, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getStorageStatisticsFast", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStorageStatisticsFast(result.Data) +} + +// Optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted +// +// @param size Limit on the total size of files after deletion. Pass -1 to use the default limit +// @param ttl Limit on the time that has passed since the last time a file was accessed (or creation time for some filesystems). Pass -1 to use the default limit +// @param count Limit on the total count of files after deletion. Pass -1 to use the default limit +// @param immunityDelay The amount of time after the creation of a file during which it can't be deleted, in seconds. Pass -1 to use the default value +// @param fileTypes If not empty, only files with the given type(s) are considered. By default, all types except thumbnails, profile photos, stickers and wallpapers are deleted +// @param chatIds If not empty, only files from the given chats are considered. Use 0 as chat identifier to delete files not belonging to any chat (e.g., profile photos) +// @param excludeChatIds If not empty, files from the given chats are excluded. Use 0 as chat identifier to exclude all files not belonging to any chat (e.g., profile photos) +// @param chatLimit Same as in getStorageStatistics. Affects only returned statistics +func (client *Client) OptimizeStorage(size int64, ttl int32, count int32, immunityDelay int32, fileTypes []FileType, chatIds []int64, excludeChatIds []int64, chatLimit int32) (*StorageStatistics, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "optimizeStorage", + }, + Data: map[string]interface{}{ + "size": size, + "ttl": ttl, + "count": count, + "immunity_delay": immunityDelay, + "file_types": fileTypes, + "chat_ids": chatIds, + "exclude_chat_ids": excludeChatIds, + "chat_limit": chatLimit, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStorageStatistics(result.Data) +} + +// Sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it should be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics +// +// @param typeParam The new network type. By default, networkTypeOther +func (client *Client) SetNetworkType(typeParam NetworkType) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setNetworkType", + }, + Data: map[string]interface{}{ + "type": typeParam, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns network data usage statistics. Can be called before authorization +// +// @param onlyCurrent If true, returns only data for the current library launch +func (client *Client) GetNetworkStatistics(onlyCurrent bool) (*NetworkStatistics, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getNetworkStatistics", + }, + Data: map[string]interface{}{ + "only_current": onlyCurrent, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalNetworkStatistics(result.Data) +} + +// Adds the specified data to data usage statistics. Can be called before authorization +// +// @param entry The network statistics entry with the data to be added to statistics +func (client *Client) AddNetworkStatistics(entry NetworkStatisticsEntry) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addNetworkStatistics", + }, + Data: map[string]interface{}{ + "entry": entry, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Resets all network data usage statistics to zero. Can be called before authorization +func (client *Client) ResetNetworkStatistics() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "resetNetworkStatistics", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only +// +// @param pendingUpdateCount The number of pending updates +// @param errorMessage The last error message +func (client *Client) SetBotUpdatesStatus(pendingUpdateCount int32, errorMessage string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setBotUpdatesStatus", + }, + Data: map[string]interface{}{ + "pending_update_count": pendingUpdateCount, + "error_message": errorMessage, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Uploads a PNG image with a sticker; for bots only; returns the uploaded file +// +// @param userId Sticker file owner +// @param pngSticker PNG image with the sticker; must be up to 512 kB in size and fit in 512x512 square +func (client *Client) UploadStickerFile(userId int32, pngSticker InputFile) (*File, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "uploadStickerFile", + }, + Data: map[string]interface{}{ + "user_id": userId, + "png_sticker": pngSticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalFile(result.Data) +} + +// Creates a new sticker set; for bots only. Returns the newly created sticker set +// +// @param userId Sticker set owner +// @param title Sticker set title; 1-64 characters +// @param name Sticker set name. Can contain only English letters, digits and underscores. Must end with *"_by_"* (** is case insensitive); 1-64 characters +// @param isMasks True, if stickers are masks +// @param stickers List of stickers to be added to the set +func (client *Client) CreateNewStickerSet(userId int32, title string, name string, isMasks bool, stickers []*InputSticker) (*StickerSet, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "createNewStickerSet", + }, + Data: map[string]interface{}{ + "user_id": userId, + "title": title, + "name": name, + "is_masks": isMasks, + "stickers": stickers, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSet(result.Data) +} + +// Adds a new sticker to a set; for bots only. Returns the sticker set +// +// @param userId Sticker set owner +// @param name Sticker set name +// @param sticker Sticker to add to the set +func (client *Client) AddStickerToSet(userId int32, name string, sticker *InputSticker) (*StickerSet, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "addStickerToSet", + }, + Data: map[string]interface{}{ + "user_id": userId, + "name": name, + "sticker": sticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalStickerSet(result.Data) +} + +// Changes the position of a sticker in the set to which it belongs; for bots only. The sticker set must have been created by the bot +// +// @param sticker Sticker +// @param position New position of the sticker in the set, zero-based +func (client *Client) SetStickerPositionInSet(sticker InputFile, position int32) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setStickerPositionInSet", + }, + Data: map[string]interface{}{ + "sticker": sticker, + "position": position, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Removes a sticker from the set to which it belongs; for bots only. The sticker set must have been created by the bot +// +// @param sticker Sticker +func (client *Client) RemoveStickerFromSet(sticker InputFile) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "removeStickerFromSet", + }, + Data: map[string]interface{}{ + "sticker": sticker, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Sends a custom request; for bots only +// +// @param method The method name +// @param parameters JSON-serialized method parameters +func (client *Client) SendCustomRequest(method string, parameters string) (*CustomRequestResult, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "sendCustomRequest", + }, + Data: map[string]interface{}{ + "method": method, + "parameters": parameters, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalCustomRequestResult(result.Data) +} + +// Answers a custom query; for bots only +// +// @param customQueryId Identifier of a custom query +// @param data JSON-serialized answer to the query +func (client *Client) AnswerCustomQuery(customQueryId JsonInt64, data string) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "answerCustomQuery", + }, + Data: map[string]interface{}{ + "custom_query_id": customQueryId, + "data": data, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Succeeds after a specified amount of time has passed. Can be called before authorization +// +// @param seconds Number of seconds before the function returns +func (client *Client) SetAlarm(seconds float64) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setAlarm", + }, + Data: map[string]interface{}{ + "seconds": seconds, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Uses current user IP to found his country. Returns two-letter ISO 3166-1 alpha-2 country code. Can be called before authorization +func (client *Client) GetCountryCode() (*Text, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getCountryCode", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalText(result.Data) +} + +// Returns the default text for invitation messages to be used as a placeholder when the current user invites friends to Telegram +func (client *Client) GetInviteText() (*Text, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getInviteText", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalText(result.Data) +} + +// Returns the terms of service. Can be called before authorization +func (client *Client) GetTermsOfService() (*Text, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getTermsOfService", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalText(result.Data) +} + +// Sets the proxy server for network requests. Can be called before authorization +// +// @param proxy Proxy server to use. Specify null to remove the proxy server +func (client *Client) SetProxy(proxy Proxy) (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "setProxy", + }, + Data: map[string]interface{}{ + "proxy": proxy, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the proxy that is currently set up. Can be called before authorization +func (client *Client) GetProxy() (Proxy, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "getProxy", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + switch result.Type { + case TypeProxyEmpty: + return UnmarshalProxyEmpty(result.Data) + + case TypeProxySocks5: + return UnmarshalProxySocks5(result.Data) + + default: + return nil, errors.New("invalid type") + } +} + +// Does nothing; for testing only +func (client *Client) TestCallEmpty() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testCallEmpty", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Returns the received string; for testing only +// +// @param x String to return +func (client *Client) TestCallString(x string) (*TestString, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testCallString", + }, + Data: map[string]interface{}{ + "x": x, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTestString(result.Data) +} + +// Returns the received bytes; for testing only +// +// @param x Bytes to return +func (client *Client) TestCallBytes(x []byte) (*TestBytes, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testCallBytes", + }, + Data: map[string]interface{}{ + "x": x, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTestBytes(result.Data) +} + +// Returns the received vector of numbers; for testing only +// +// @param x Vector of numbers to return +func (client *Client) TestCallVectorInt(x []int32) (*TestVectorInt, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testCallVectorInt", + }, + Data: map[string]interface{}{ + "x": x, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTestVectorInt(result.Data) +} + +// Returns the received vector of objects containing a number; for testing only +// +// @param x Vector of objects to return +func (client *Client) TestCallVectorIntObject(x []*TestInt) (*TestVectorIntObject, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testCallVectorIntObject", + }, + Data: map[string]interface{}{ + "x": x, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTestVectorIntObject(result.Data) +} + +// For testing only request. Returns the received vector of strings; for testing only +// +// @param x Vector of strings to return +func (client *Client) TestCallVectorString(x []string) (*TestVectorString, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testCallVectorString", + }, + Data: map[string]interface{}{ + "x": x, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTestVectorString(result.Data) +} + +// Returns the received vector of objects containing a string; for testing only +// +// @param x Vector of objects to return +func (client *Client) TestCallVectorStringObject(x []*TestString) (*TestVectorStringObject, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testCallVectorStringObject", + }, + Data: map[string]interface{}{ + "x": x, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTestVectorStringObject(result.Data) +} + +// Returns the squared received number; for testing only +// +// @param x Number to square +func (client *Client) TestSquareInt(x int32) (*TestInt, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testSquareInt", + }, + Data: map[string]interface{}{ + "x": x, + }, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalTestInt(result.Data) +} + +// Sends a simple network request to the Telegram servers; for testing only +func (client *Client) TestNetwork() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testNetwork", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Forces an updates.getDifference call to the Telegram servers; for testing only +func (client *Client) TestGetDifference() (*Ok, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testGetDifference", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalOk(result.Data) +} + +// Does nothing and ensures that the Update object is used; for testing only +func (client *Client) TestUseUpdate() (Update, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testUseUpdate", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + switch result.Type { + case TypeUpdateAuthorizationState: + return UnmarshalUpdateAuthorizationState(result.Data) + + case TypeUpdateNewMessage: + return UnmarshalUpdateNewMessage(result.Data) + + case TypeUpdateMessageSendAcknowledged: + return UnmarshalUpdateMessageSendAcknowledged(result.Data) + + case TypeUpdateMessageSendSucceeded: + return UnmarshalUpdateMessageSendSucceeded(result.Data) + + case TypeUpdateMessageSendFailed: + return UnmarshalUpdateMessageSendFailed(result.Data) + + case TypeUpdateMessageContent: + return UnmarshalUpdateMessageContent(result.Data) + + case TypeUpdateMessageEdited: + return UnmarshalUpdateMessageEdited(result.Data) + + case TypeUpdateMessageViews: + return UnmarshalUpdateMessageViews(result.Data) + + case TypeUpdateMessageContentOpened: + return UnmarshalUpdateMessageContentOpened(result.Data) + + case TypeUpdateMessageMentionRead: + return UnmarshalUpdateMessageMentionRead(result.Data) + + case TypeUpdateNewChat: + return UnmarshalUpdateNewChat(result.Data) + + case TypeUpdateChatTitle: + return UnmarshalUpdateChatTitle(result.Data) + + case TypeUpdateChatPhoto: + return UnmarshalUpdateChatPhoto(result.Data) + + case TypeUpdateChatLastMessage: + return UnmarshalUpdateChatLastMessage(result.Data) + + case TypeUpdateChatOrder: + return UnmarshalUpdateChatOrder(result.Data) + + case TypeUpdateChatIsPinned: + return UnmarshalUpdateChatIsPinned(result.Data) + + case TypeUpdateChatReadInbox: + return UnmarshalUpdateChatReadInbox(result.Data) + + case TypeUpdateChatReadOutbox: + return UnmarshalUpdateChatReadOutbox(result.Data) + + case TypeUpdateChatUnreadMentionCount: + return UnmarshalUpdateChatUnreadMentionCount(result.Data) + + case TypeUpdateNotificationSettings: + return UnmarshalUpdateNotificationSettings(result.Data) + + case TypeUpdateChatReplyMarkup: + return UnmarshalUpdateChatReplyMarkup(result.Data) + + case TypeUpdateChatDraftMessage: + return UnmarshalUpdateChatDraftMessage(result.Data) + + case TypeUpdateDeleteMessages: + return UnmarshalUpdateDeleteMessages(result.Data) + + case TypeUpdateUserChatAction: + return UnmarshalUpdateUserChatAction(result.Data) + + case TypeUpdateUserStatus: + return UnmarshalUpdateUserStatus(result.Data) + + case TypeUpdateUser: + return UnmarshalUpdateUser(result.Data) + + case TypeUpdateBasicGroup: + return UnmarshalUpdateBasicGroup(result.Data) + + case TypeUpdateSupergroup: + return UnmarshalUpdateSupergroup(result.Data) + + case TypeUpdateSecretChat: + return UnmarshalUpdateSecretChat(result.Data) + + case TypeUpdateUserFullInfo: + return UnmarshalUpdateUserFullInfo(result.Data) + + case TypeUpdateBasicGroupFullInfo: + return UnmarshalUpdateBasicGroupFullInfo(result.Data) + + case TypeUpdateSupergroupFullInfo: + return UnmarshalUpdateSupergroupFullInfo(result.Data) + + case TypeUpdateServiceNotification: + return UnmarshalUpdateServiceNotification(result.Data) + + case TypeUpdateFile: + return UnmarshalUpdateFile(result.Data) + + case TypeUpdateFileGenerationStart: + return UnmarshalUpdateFileGenerationStart(result.Data) + + case TypeUpdateFileGenerationStop: + return UnmarshalUpdateFileGenerationStop(result.Data) + + case TypeUpdateCall: + return UnmarshalUpdateCall(result.Data) + + case TypeUpdateUserPrivacySettingRules: + return UnmarshalUpdateUserPrivacySettingRules(result.Data) + + case TypeUpdateUnreadMessageCount: + return UnmarshalUpdateUnreadMessageCount(result.Data) + + case TypeUpdateOption: + return UnmarshalUpdateOption(result.Data) + + case TypeUpdateInstalledStickerSets: + return UnmarshalUpdateInstalledStickerSets(result.Data) + + case TypeUpdateTrendingStickerSets: + return UnmarshalUpdateTrendingStickerSets(result.Data) + + case TypeUpdateRecentStickers: + return UnmarshalUpdateRecentStickers(result.Data) + + case TypeUpdateFavoriteStickers: + return UnmarshalUpdateFavoriteStickers(result.Data) + + case TypeUpdateSavedAnimations: + return UnmarshalUpdateSavedAnimations(result.Data) + + case TypeUpdateConnectionState: + return UnmarshalUpdateConnectionState(result.Data) + + case TypeUpdateNewInlineQuery: + return UnmarshalUpdateNewInlineQuery(result.Data) + + case TypeUpdateNewChosenInlineResult: + return UnmarshalUpdateNewChosenInlineResult(result.Data) + + case TypeUpdateNewCallbackQuery: + return UnmarshalUpdateNewCallbackQuery(result.Data) + + case TypeUpdateNewInlineCallbackQuery: + return UnmarshalUpdateNewInlineCallbackQuery(result.Data) + + case TypeUpdateNewShippingQuery: + return UnmarshalUpdateNewShippingQuery(result.Data) + + case TypeUpdateNewPreCheckoutQuery: + return UnmarshalUpdateNewPreCheckoutQuery(result.Data) + + case TypeUpdateNewCustomEvent: + return UnmarshalUpdateNewCustomEvent(result.Data) + + case TypeUpdateNewCustomQuery: + return UnmarshalUpdateNewCustomQuery(result.Data) + + default: + return nil, errors.New("invalid type") + } +} + +// Does nothing and ensures that the Error object is used; for testing only +func (client *Client) TestUseError() (*Error, error) { + result, err := client.Send(Request{ + meta: meta{ + Type: "testUseError", + }, + Data: map[string]interface{}{}, + }) + if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + + return UnmarshalError(result.Data) +} diff --git a/client/tdlib.go b/client/tdlib.go new file mode 100644 index 0000000..c482c8d --- /dev/null +++ b/client/tdlib.go @@ -0,0 +1,188 @@ +package client + +// #cgo linux CFLAGS: -I/usr/local/include +// #cgo darwin CFLAGS: -I/usr/local/include +// #cgo windows CFLAGS: -IC:/src/td -IC:/src/td/build +// #cgo linux LDFLAGS: -L/usr/local/lib -ltdjson_static -ltdjson_private -ltdclient -ltdcore -ltdactor -ltddb -ltdsqlite -ltdnet -ltdutils -lstdc++ -lssl -lcrypto -ldl -lz -lm +// #cgo darwin LDFLAGS: -L/usr/local/lib -L/usr/local/opt/openssl/lib -ltdjson_static -ltdjson_private -ltdclient -ltdcore -ltdactor -ltddb -ltdsqlite -ltdnet -ltdutils -lstdc++ -lssl -lcrypto -ldl -lz -lm +// #cgo windows LDFLAGS: -LC:/src/td/build/Debug -ltdjson +// #include +// #include +// #include +import "C" + +import ( + "encoding/json" + "errors" + "fmt" + "strconv" + "unsafe" +) + +type JsonClient struct { + jsonClient unsafe.Pointer +} + +func NewJsonClient() *JsonClient { + jsonClient := &JsonClient{ + jsonClient: C.td_json_client_create(), + } + + return jsonClient +} + +// Sends request to the TDLib client. May be called from any thread. +func (jsonClient *JsonClient) Send(req Request) { + data, _ := json.Marshal(req) + + query := C.CString(string(data)) + defer C.free(unsafe.Pointer(query)) + + C.td_json_client_send(jsonClient.jsonClient, query) +} + +// Receives incoming updates and request responses from the TDLib client. May be called from any thread, but +// shouldn't be called simultaneously from two different threads. +// Returned pointer will be deallocated by TDLib during next call to td_json_client_receive or td_json_client_execute +// in the same thread, so it can't be used after that. +func (jsonClient *JsonClient) Receive(timeout float64) (*Response, error) { + result := C.td_json_client_receive(jsonClient.jsonClient, C.double(timeout)) + if result == nil { + return nil, errors.New("timeout") + } + + data := []byte(C.GoString(result)) + + var resp Response + + err := json.Unmarshal(data, &resp) + if err != nil { + return nil, err + } + + resp.Data = data + + return &resp, nil +} + +// Synchronously executes TDLib request. May be called from any thread. +// Only a few requests can be executed synchronously. +// Returned pointer will be deallocated by TDLib during next call to td_json_client_receive or td_json_client_execute +// in the same thread, so it can't be used after that. +func (jsonClient *JsonClient) Execute(req Request) (*Response, error) { + data, _ := json.Marshal(req) + + query := C.CString(string(data)) + defer C.free(unsafe.Pointer(query)) + + result := C.td_json_client_execute(jsonClient.jsonClient, query) + if result == nil { + return nil, errors.New("request can't be parsed") + } + + data = []byte(C.GoString(result)) + + var resp Response + + err := json.Unmarshal(data, &resp) + if err != nil { + return nil, err + } + + resp.Data = data + + return &resp, nil +} + +// Destroys the TDLib client instance. After this is called the client instance shouldn't be used anymore. +func (jsonClient *JsonClient) DestroyInstance() { + C.td_json_client_destroy(jsonClient.jsonClient) +} + +// Sets the path to the file where the internal TDLib log will be written. +// By default TDLib writes logs to stderr or an OS specific log. +// Use this method to write the log to a file instead. +func SetLogFilePath(filePath string) { + query := C.CString(filePath) + defer C.free(unsafe.Pointer(query)) + + C.td_set_log_file_path(query) +} + +// Sets maximum size of the file to where the internal TDLib log is written before the file will be auto-rotated. +// Unused if log is not written to a file. Defaults to 10 MB. +func SetLogMaxFileSize(maxFileSize int64) { + C.td_set_log_max_file_size(C.longlong(maxFileSize)) +} + +// Sets the verbosity level of the internal logging of TDLib. +// By default the TDLib uses a log verbosity level of 5 +func SetLogVerbosityLevel(newVerbosityLevel int) { + C.td_set_log_verbosity_level(C.int(newVerbosityLevel)) +} + +type meta struct { + Type string `json:"@type"` + Extra string `json:"@extra"` +} + +type Request struct { + meta + Data map[string]interface{} +} + +func (req Request) MarshalJSON() ([]byte, error) { + req.Data["@type"] = req.Type + req.Data["@extra"] = req.Extra + + return json.Marshal(req.Data) +} + +type Response struct { + meta + Data json.RawMessage +} + +type ResponseError struct { + Err *Error +} + +func (responseError ResponseError) Error() string { + return fmt.Sprintf("Code: %d. Message: %s", responseError.Err.Code, responseError.Err.Message) +} + +func buildResponseError(data json.RawMessage) error { + respErr, err := UnmarshalError(data) + if err != nil { + return err + } + + return ResponseError{ + Err: respErr, + } +} + +// JsonInt64 alias for int64, in order to deal with json big number problem +type JsonInt64 int64 + +// MarshalJSON marshals to json +func (jsonInt64 *JsonInt64) MarshalJSON() ([]byte, error) { + return []byte(strconv.FormatInt(int64(*jsonInt64), 10)), nil +} + +// UnmarshalJSON unmarshals from json +func (jsonInt64 *JsonInt64) UnmarshalJSON(data []byte) error { + jsonBigInt, err := strconv.ParseInt(string(data[1:len(data)-1]), 10, 64) + if err != nil { + return err + } + + *jsonInt64 = JsonInt64(jsonBigInt) + + return nil +} + +type Type interface { + GetType() string + GetClass() string +} diff --git a/client/type.go b/client/type.go new file mode 100755 index 0000000..d3550aa --- /dev/null +++ b/client/type.go @@ -0,0 +1,17279 @@ +// AUTOGENERATED + +package client + +import ( + "encoding/json" +) + +const ( + ClassAuthenticationCodeType = "AuthenticationCodeType" + ClassAuthorizationState = "AuthorizationState" + ClassInputFile = "InputFile" + ClassMaskPoint = "MaskPoint" + ClassLinkState = "LinkState" + ClassUserType = "UserType" + ClassChatMemberStatus = "ChatMemberStatus" + ClassSupergroupMembersFilter = "SupergroupMembersFilter" + ClassSecretChatState = "SecretChatState" + ClassMessageForwardInfo = "MessageForwardInfo" + ClassMessageSendingState = "MessageSendingState" + ClassNotificationSettingsScope = "NotificationSettingsScope" + ClassChatType = "ChatType" + ClassKeyboardButtonType = "KeyboardButtonType" + ClassInlineKeyboardButtonType = "InlineKeyboardButtonType" + ClassReplyMarkup = "ReplyMarkup" + ClassRichText = "RichText" + ClassPageBlock = "PageBlock" + ClassInputCredentials = "InputCredentials" + ClassMessageContent = "MessageContent" + ClassTextEntityType = "TextEntityType" + ClassInputMessageContent = "InputMessageContent" + ClassSearchMessagesFilter = "SearchMessagesFilter" + ClassChatAction = "ChatAction" + ClassUserStatus = "UserStatus" + ClassCallDiscardReason = "CallDiscardReason" + ClassCallState = "CallState" + ClassInputInlineQueryResult = "InputInlineQueryResult" + ClassInlineQueryResult = "InlineQueryResult" + ClassCallbackQueryPayload = "CallbackQueryPayload" + ClassChatEventAction = "ChatEventAction" + ClassDeviceToken = "DeviceToken" + ClassCheckChatUsernameResult = "CheckChatUsernameResult" + ClassOptionValue = "OptionValue" + ClassUserPrivacySettingRule = "UserPrivacySettingRule" + ClassUserPrivacySetting = "UserPrivacySetting" + ClassChatReportReason = "ChatReportReason" + ClassFileType = "FileType" + ClassNetworkType = "NetworkType" + ClassNetworkStatisticsEntry = "NetworkStatisticsEntry" + ClassConnectionState = "ConnectionState" + ClassTopChatCategory = "TopChatCategory" + ClassTMeUrlType = "TMeUrlType" + ClassTextParseMode = "TextParseMode" + ClassProxy = "Proxy" + ClassUpdate = "Update" + ClassError = "Error" + ClassOk = "Ok" + ClassTdlibParameters = "TdlibParameters" + ClassAuthenticationCodeInfo = "AuthenticationCodeInfo" + ClassPasswordState = "PasswordState" + ClassPasswordRecoveryInfo = "PasswordRecoveryInfo" + ClassRecoveryEmailAddress = "RecoveryEmailAddress" + ClassTemporaryPasswordState = "TemporaryPasswordState" + ClassLocalFile = "LocalFile" + ClassRemoteFile = "RemoteFile" + ClassFile = "File" + ClassPhotoSize = "PhotoSize" + ClassMaskPosition = "MaskPosition" + ClassTextEntity = "TextEntity" + ClassTextEntities = "TextEntities" + ClassFormattedText = "FormattedText" + ClassAnimation = "Animation" + ClassAudio = "Audio" + ClassDocument = "Document" + ClassPhoto = "Photo" + ClassSticker = "Sticker" + ClassVideo = "Video" + ClassVideoNote = "VideoNote" + ClassVoiceNote = "VoiceNote" + ClassContact = "Contact" + ClassLocation = "Location" + ClassVenue = "Venue" + ClassGame = "Game" + ClassProfilePhoto = "ProfilePhoto" + ClassChatPhoto = "ChatPhoto" + ClassBotCommand = "BotCommand" + ClassBotInfo = "BotInfo" + ClassUser = "User" + ClassUserFullInfo = "UserFullInfo" + ClassUserProfilePhotos = "UserProfilePhotos" + ClassUsers = "Users" + ClassChatMember = "ChatMember" + ClassChatMembers = "ChatMembers" + ClassBasicGroup = "BasicGroup" + ClassBasicGroupFullInfo = "BasicGroupFullInfo" + ClassSupergroup = "Supergroup" + ClassSupergroupFullInfo = "SupergroupFullInfo" + ClassSecretChat = "SecretChat" + ClassMessage = "Message" + ClassMessages = "Messages" + ClassFoundMessages = "FoundMessages" + ClassNotificationSettings = "NotificationSettings" + ClassDraftMessage = "DraftMessage" + ClassChat = "Chat" + ClassChats = "Chats" + ClassChatInviteLink = "ChatInviteLink" + ClassChatInviteLinkInfo = "ChatInviteLinkInfo" + ClassKeyboardButton = "KeyboardButton" + ClassInlineKeyboardButton = "InlineKeyboardButton" + ClassWebPageInstantView = "WebPageInstantView" + ClassWebPage = "WebPage" + ClassLabeledPricePart = "LabeledPricePart" + ClassInvoice = "Invoice" + ClassShippingAddress = "ShippingAddress" + ClassOrderInfo = "OrderInfo" + ClassShippingOption = "ShippingOption" + ClassSavedCredentials = "SavedCredentials" + ClassPaymentsProviderStripe = "PaymentsProviderStripe" + ClassPaymentForm = "PaymentForm" + ClassValidatedOrderInfo = "ValidatedOrderInfo" + ClassPaymentResult = "PaymentResult" + ClassPaymentReceipt = "PaymentReceipt" + ClassInputThumbnail = "InputThumbnail" + ClassStickers = "Stickers" + ClassStickerEmojis = "StickerEmojis" + ClassStickerSet = "StickerSet" + ClassStickerSetInfo = "StickerSetInfo" + ClassStickerSets = "StickerSets" + ClassCallProtocol = "CallProtocol" + ClassCallConnection = "CallConnection" + ClassCallId = "CallId" + ClassCall = "Call" + ClassAnimations = "Animations" + ClassImportedContacts = "ImportedContacts" + ClassInlineQueryResults = "InlineQueryResults" + ClassCallbackQueryAnswer = "CallbackQueryAnswer" + ClassCustomRequestResult = "CustomRequestResult" + ClassGameHighScore = "GameHighScore" + ClassGameHighScores = "GameHighScores" + ClassChatEvent = "ChatEvent" + ClassChatEvents = "ChatEvents" + ClassChatEventLogFilters = "ChatEventLogFilters" + ClassWallpaper = "Wallpaper" + ClassWallpapers = "Wallpapers" + ClassHashtags = "Hashtags" + ClassUserPrivacySettingRules = "UserPrivacySettingRules" + ClassAccountTtl = "AccountTtl" + ClassSession = "Session" + ClassSessions = "Sessions" + ClassConnectedWebsite = "ConnectedWebsite" + ClassConnectedWebsites = "ConnectedWebsites" + ClassChatReportSpamState = "ChatReportSpamState" + ClassPublicMessageLink = "PublicMessageLink" + ClassStorageStatisticsByFileType = "StorageStatisticsByFileType" + ClassStorageStatisticsByChat = "StorageStatisticsByChat" + ClassStorageStatistics = "StorageStatistics" + ClassStorageStatisticsFast = "StorageStatisticsFast" + ClassNetworkStatistics = "NetworkStatistics" + ClassTMeUrl = "TMeUrl" + ClassTMeUrls = "TMeUrls" + ClassCount = "Count" + ClassText = "Text" + ClassInputSticker = "InputSticker" + ClassTestInt = "TestInt" + ClassTestString = "TestString" + ClassTestBytes = "TestBytes" + ClassTestVectorInt = "TestVectorInt" + ClassTestVectorIntObject = "TestVectorIntObject" + ClassTestVectorString = "TestVectorString" + ClassTestVectorStringObject = "TestVectorStringObject" +) + +const ( + TypeError = "error" + TypeOk = "ok" + TypeTdlibParameters = "tdlibParameters" + TypeAuthenticationCodeTypeTelegramMessage = "authenticationCodeTypeTelegramMessage" + TypeAuthenticationCodeTypeSms = "authenticationCodeTypeSms" + TypeAuthenticationCodeTypeCall = "authenticationCodeTypeCall" + TypeAuthenticationCodeTypeFlashCall = "authenticationCodeTypeFlashCall" + TypeAuthenticationCodeInfo = "authenticationCodeInfo" + TypeAuthorizationStateWaitTdlibParameters = "authorizationStateWaitTdlibParameters" + TypeAuthorizationStateWaitEncryptionKey = "authorizationStateWaitEncryptionKey" + TypeAuthorizationStateWaitPhoneNumber = "authorizationStateWaitPhoneNumber" + TypeAuthorizationStateWaitCode = "authorizationStateWaitCode" + TypeAuthorizationStateWaitPassword = "authorizationStateWaitPassword" + TypeAuthorizationStateReady = "authorizationStateReady" + TypeAuthorizationStateLoggingOut = "authorizationStateLoggingOut" + TypeAuthorizationStateClosing = "authorizationStateClosing" + TypeAuthorizationStateClosed = "authorizationStateClosed" + TypePasswordState = "passwordState" + TypePasswordRecoveryInfo = "passwordRecoveryInfo" + TypeRecoveryEmailAddress = "recoveryEmailAddress" + TypeTemporaryPasswordState = "temporaryPasswordState" + TypeLocalFile = "localFile" + TypeRemoteFile = "remoteFile" + TypeFile = "file" + TypeInputFileId = "inputFileId" + TypeInputFileRemote = "inputFileRemote" + TypeInputFileLocal = "inputFileLocal" + TypeInputFileGenerated = "inputFileGenerated" + TypePhotoSize = "photoSize" + TypeMaskPointForehead = "maskPointForehead" + TypeMaskPointEyes = "maskPointEyes" + TypeMaskPointMouth = "maskPointMouth" + TypeMaskPointChin = "maskPointChin" + TypeMaskPosition = "maskPosition" + TypeTextEntity = "textEntity" + TypeTextEntities = "textEntities" + TypeFormattedText = "formattedText" + TypeAnimation = "animation" + TypeAudio = "audio" + TypeDocument = "document" + TypePhoto = "photo" + TypeSticker = "sticker" + TypeVideo = "video" + TypeVideoNote = "videoNote" + TypeVoiceNote = "voiceNote" + TypeContact = "contact" + TypeLocation = "location" + TypeVenue = "venue" + TypeGame = "game" + TypeProfilePhoto = "profilePhoto" + TypeChatPhoto = "chatPhoto" + TypeLinkStateNone = "linkStateNone" + TypeLinkStateKnowsPhoneNumber = "linkStateKnowsPhoneNumber" + TypeLinkStateIsContact = "linkStateIsContact" + TypeUserTypeRegular = "userTypeRegular" + TypeUserTypeDeleted = "userTypeDeleted" + TypeUserTypeBot = "userTypeBot" + TypeUserTypeUnknown = "userTypeUnknown" + TypeBotCommand = "botCommand" + TypeBotInfo = "botInfo" + TypeUser = "user" + TypeUserFullInfo = "userFullInfo" + TypeUserProfilePhotos = "userProfilePhotos" + TypeUsers = "users" + TypeChatMemberStatusCreator = "chatMemberStatusCreator" + TypeChatMemberStatusAdministrator = "chatMemberStatusAdministrator" + TypeChatMemberStatusMember = "chatMemberStatusMember" + TypeChatMemberStatusRestricted = "chatMemberStatusRestricted" + TypeChatMemberStatusLeft = "chatMemberStatusLeft" + TypeChatMemberStatusBanned = "chatMemberStatusBanned" + TypeChatMember = "chatMember" + TypeChatMembers = "chatMembers" + TypeSupergroupMembersFilterRecent = "supergroupMembersFilterRecent" + TypeSupergroupMembersFilterAdministrators = "supergroupMembersFilterAdministrators" + TypeSupergroupMembersFilterSearch = "supergroupMembersFilterSearch" + TypeSupergroupMembersFilterRestricted = "supergroupMembersFilterRestricted" + TypeSupergroupMembersFilterBanned = "supergroupMembersFilterBanned" + TypeSupergroupMembersFilterBots = "supergroupMembersFilterBots" + TypeBasicGroup = "basicGroup" + TypeBasicGroupFullInfo = "basicGroupFullInfo" + TypeSupergroup = "supergroup" + TypeSupergroupFullInfo = "supergroupFullInfo" + TypeSecretChatStatePending = "secretChatStatePending" + TypeSecretChatStateReady = "secretChatStateReady" + TypeSecretChatStateClosed = "secretChatStateClosed" + TypeSecretChat = "secretChat" + TypeMessageForwardedFromUser = "messageForwardedFromUser" + TypeMessageForwardedPost = "messageForwardedPost" + TypeMessageSendingStatePending = "messageSendingStatePending" + TypeMessageSendingStateFailed = "messageSendingStateFailed" + TypeMessage = "message" + TypeMessages = "messages" + TypeFoundMessages = "foundMessages" + TypeNotificationSettingsScopeChat = "notificationSettingsScopeChat" + TypeNotificationSettingsScopePrivateChats = "notificationSettingsScopePrivateChats" + TypeNotificationSettingsScopeBasicGroupChats = "notificationSettingsScopeBasicGroupChats" + TypeNotificationSettingsScopeAllChats = "notificationSettingsScopeAllChats" + TypeNotificationSettings = "notificationSettings" + TypeDraftMessage = "draftMessage" + TypeChatTypePrivate = "chatTypePrivate" + TypeChatTypeBasicGroup = "chatTypeBasicGroup" + TypeChatTypeSupergroup = "chatTypeSupergroup" + TypeChatTypeSecret = "chatTypeSecret" + TypeChat = "chat" + TypeChats = "chats" + TypeChatInviteLink = "chatInviteLink" + TypeChatInviteLinkInfo = "chatInviteLinkInfo" + TypeKeyboardButtonTypeText = "keyboardButtonTypeText" + TypeKeyboardButtonTypeRequestPhoneNumber = "keyboardButtonTypeRequestPhoneNumber" + TypeKeyboardButtonTypeRequestLocation = "keyboardButtonTypeRequestLocation" + TypeKeyboardButton = "keyboardButton" + TypeInlineKeyboardButtonTypeUrl = "inlineKeyboardButtonTypeUrl" + TypeInlineKeyboardButtonTypeCallback = "inlineKeyboardButtonTypeCallback" + TypeInlineKeyboardButtonTypeCallbackGame = "inlineKeyboardButtonTypeCallbackGame" + TypeInlineKeyboardButtonTypeSwitchInline = "inlineKeyboardButtonTypeSwitchInline" + TypeInlineKeyboardButtonTypeBuy = "inlineKeyboardButtonTypeBuy" + TypeInlineKeyboardButton = "inlineKeyboardButton" + TypeReplyMarkupRemoveKeyboard = "replyMarkupRemoveKeyboard" + TypeReplyMarkupForceReply = "replyMarkupForceReply" + TypeReplyMarkupShowKeyboard = "replyMarkupShowKeyboard" + TypeReplyMarkupInlineKeyboard = "replyMarkupInlineKeyboard" + TypeRichTextPlain = "richTextPlain" + TypeRichTextBold = "richTextBold" + TypeRichTextItalic = "richTextItalic" + TypeRichTextUnderline = "richTextUnderline" + TypeRichTextStrikethrough = "richTextStrikethrough" + TypeRichTextFixed = "richTextFixed" + TypeRichTextUrl = "richTextUrl" + TypeRichTextEmailAddress = "richTextEmailAddress" + TypeRichTexts = "richTexts" + TypePageBlockTitle = "pageBlockTitle" + TypePageBlockSubtitle = "pageBlockSubtitle" + TypePageBlockAuthorDate = "pageBlockAuthorDate" + TypePageBlockHeader = "pageBlockHeader" + TypePageBlockSubheader = "pageBlockSubheader" + TypePageBlockParagraph = "pageBlockParagraph" + TypePageBlockPreformatted = "pageBlockPreformatted" + TypePageBlockFooter = "pageBlockFooter" + TypePageBlockDivider = "pageBlockDivider" + TypePageBlockAnchor = "pageBlockAnchor" + TypePageBlockList = "pageBlockList" + TypePageBlockBlockQuote = "pageBlockBlockQuote" + TypePageBlockPullQuote = "pageBlockPullQuote" + TypePageBlockAnimation = "pageBlockAnimation" + TypePageBlockAudio = "pageBlockAudio" + TypePageBlockPhoto = "pageBlockPhoto" + TypePageBlockVideo = "pageBlockVideo" + TypePageBlockCover = "pageBlockCover" + TypePageBlockEmbedded = "pageBlockEmbedded" + TypePageBlockEmbeddedPost = "pageBlockEmbeddedPost" + TypePageBlockCollage = "pageBlockCollage" + TypePageBlockSlideshow = "pageBlockSlideshow" + TypePageBlockChatLink = "pageBlockChatLink" + TypeWebPageInstantView = "webPageInstantView" + TypeWebPage = "webPage" + TypeLabeledPricePart = "labeledPricePart" + TypeInvoice = "invoice" + TypeShippingAddress = "shippingAddress" + TypeOrderInfo = "orderInfo" + TypeShippingOption = "shippingOption" + TypeSavedCredentials = "savedCredentials" + TypeInputCredentialsSaved = "inputCredentialsSaved" + TypeInputCredentialsNew = "inputCredentialsNew" + TypeInputCredentialsAndroidPay = "inputCredentialsAndroidPay" + TypeInputCredentialsApplePay = "inputCredentialsApplePay" + TypePaymentsProviderStripe = "paymentsProviderStripe" + TypePaymentForm = "paymentForm" + TypeValidatedOrderInfo = "validatedOrderInfo" + TypePaymentResult = "paymentResult" + TypePaymentReceipt = "paymentReceipt" + TypeMessageText = "messageText" + TypeMessageAnimation = "messageAnimation" + TypeMessageAudio = "messageAudio" + TypeMessageDocument = "messageDocument" + TypeMessagePhoto = "messagePhoto" + TypeMessageExpiredPhoto = "messageExpiredPhoto" + TypeMessageSticker = "messageSticker" + TypeMessageVideo = "messageVideo" + TypeMessageExpiredVideo = "messageExpiredVideo" + TypeMessageVideoNote = "messageVideoNote" + TypeMessageVoiceNote = "messageVoiceNote" + TypeMessageLocation = "messageLocation" + TypeMessageVenue = "messageVenue" + TypeMessageContact = "messageContact" + TypeMessageGame = "messageGame" + TypeMessageInvoice = "messageInvoice" + TypeMessageCall = "messageCall" + TypeMessageBasicGroupChatCreate = "messageBasicGroupChatCreate" + TypeMessageSupergroupChatCreate = "messageSupergroupChatCreate" + TypeMessageChatChangeTitle = "messageChatChangeTitle" + TypeMessageChatChangePhoto = "messageChatChangePhoto" + TypeMessageChatDeletePhoto = "messageChatDeletePhoto" + TypeMessageChatAddMembers = "messageChatAddMembers" + TypeMessageChatJoinByLink = "messageChatJoinByLink" + TypeMessageChatDeleteMember = "messageChatDeleteMember" + TypeMessageChatUpgradeTo = "messageChatUpgradeTo" + TypeMessageChatUpgradeFrom = "messageChatUpgradeFrom" + TypeMessagePinMessage = "messagePinMessage" + TypeMessageScreenshotTaken = "messageScreenshotTaken" + TypeMessageChatSetTtl = "messageChatSetTtl" + TypeMessageCustomServiceAction = "messageCustomServiceAction" + TypeMessageGameScore = "messageGameScore" + TypeMessagePaymentSuccessful = "messagePaymentSuccessful" + TypeMessagePaymentSuccessfulBot = "messagePaymentSuccessfulBot" + TypeMessageContactRegistered = "messageContactRegistered" + TypeMessageWebsiteConnected = "messageWebsiteConnected" + TypeMessageUnsupported = "messageUnsupported" + TypeTextEntityTypeMention = "textEntityTypeMention" + TypeTextEntityTypeHashtag = "textEntityTypeHashtag" + TypeTextEntityTypeCashtag = "textEntityTypeCashtag" + TypeTextEntityTypeBotCommand = "textEntityTypeBotCommand" + TypeTextEntityTypeUrl = "textEntityTypeUrl" + TypeTextEntityTypeEmailAddress = "textEntityTypeEmailAddress" + TypeTextEntityTypeBold = "textEntityTypeBold" + TypeTextEntityTypeItalic = "textEntityTypeItalic" + TypeTextEntityTypeCode = "textEntityTypeCode" + TypeTextEntityTypePre = "textEntityTypePre" + TypeTextEntityTypePreCode = "textEntityTypePreCode" + TypeTextEntityTypeTextUrl = "textEntityTypeTextUrl" + TypeTextEntityTypeMentionName = "textEntityTypeMentionName" + TypeTextEntityTypePhoneNumber = "textEntityTypePhoneNumber" + TypeInputThumbnail = "inputThumbnail" + TypeInputMessageText = "inputMessageText" + TypeInputMessageAnimation = "inputMessageAnimation" + TypeInputMessageAudio = "inputMessageAudio" + TypeInputMessageDocument = "inputMessageDocument" + TypeInputMessagePhoto = "inputMessagePhoto" + TypeInputMessageSticker = "inputMessageSticker" + TypeInputMessageVideo = "inputMessageVideo" + TypeInputMessageVideoNote = "inputMessageVideoNote" + TypeInputMessageVoiceNote = "inputMessageVoiceNote" + TypeInputMessageLocation = "inputMessageLocation" + TypeInputMessageVenue = "inputMessageVenue" + TypeInputMessageContact = "inputMessageContact" + TypeInputMessageGame = "inputMessageGame" + TypeInputMessageInvoice = "inputMessageInvoice" + TypeInputMessageForwarded = "inputMessageForwarded" + TypeSearchMessagesFilterEmpty = "searchMessagesFilterEmpty" + TypeSearchMessagesFilterAnimation = "searchMessagesFilterAnimation" + TypeSearchMessagesFilterAudio = "searchMessagesFilterAudio" + TypeSearchMessagesFilterDocument = "searchMessagesFilterDocument" + TypeSearchMessagesFilterPhoto = "searchMessagesFilterPhoto" + TypeSearchMessagesFilterVideo = "searchMessagesFilterVideo" + TypeSearchMessagesFilterVoiceNote = "searchMessagesFilterVoiceNote" + TypeSearchMessagesFilterPhotoAndVideo = "searchMessagesFilterPhotoAndVideo" + TypeSearchMessagesFilterUrl = "searchMessagesFilterUrl" + TypeSearchMessagesFilterChatPhoto = "searchMessagesFilterChatPhoto" + TypeSearchMessagesFilterCall = "searchMessagesFilterCall" + TypeSearchMessagesFilterMissedCall = "searchMessagesFilterMissedCall" + TypeSearchMessagesFilterVideoNote = "searchMessagesFilterVideoNote" + TypeSearchMessagesFilterVoiceAndVideoNote = "searchMessagesFilterVoiceAndVideoNote" + TypeSearchMessagesFilterMention = "searchMessagesFilterMention" + TypeSearchMessagesFilterUnreadMention = "searchMessagesFilterUnreadMention" + TypeChatActionTyping = "chatActionTyping" + TypeChatActionRecordingVideo = "chatActionRecordingVideo" + TypeChatActionUploadingVideo = "chatActionUploadingVideo" + TypeChatActionRecordingVoiceNote = "chatActionRecordingVoiceNote" + TypeChatActionUploadingVoiceNote = "chatActionUploadingVoiceNote" + TypeChatActionUploadingPhoto = "chatActionUploadingPhoto" + TypeChatActionUploadingDocument = "chatActionUploadingDocument" + TypeChatActionChoosingLocation = "chatActionChoosingLocation" + TypeChatActionChoosingContact = "chatActionChoosingContact" + TypeChatActionStartPlayingGame = "chatActionStartPlayingGame" + TypeChatActionRecordingVideoNote = "chatActionRecordingVideoNote" + TypeChatActionUploadingVideoNote = "chatActionUploadingVideoNote" + TypeChatActionCancel = "chatActionCancel" + TypeUserStatusEmpty = "userStatusEmpty" + TypeUserStatusOnline = "userStatusOnline" + TypeUserStatusOffline = "userStatusOffline" + TypeUserStatusRecently = "userStatusRecently" + TypeUserStatusLastWeek = "userStatusLastWeek" + TypeUserStatusLastMonth = "userStatusLastMonth" + TypeStickers = "stickers" + TypeStickerEmojis = "stickerEmojis" + TypeStickerSet = "stickerSet" + TypeStickerSetInfo = "stickerSetInfo" + TypeStickerSets = "stickerSets" + TypeCallDiscardReasonEmpty = "callDiscardReasonEmpty" + TypeCallDiscardReasonMissed = "callDiscardReasonMissed" + TypeCallDiscardReasonDeclined = "callDiscardReasonDeclined" + TypeCallDiscardReasonDisconnected = "callDiscardReasonDisconnected" + TypeCallDiscardReasonHungUp = "callDiscardReasonHungUp" + TypeCallProtocol = "callProtocol" + TypeCallConnection = "callConnection" + TypeCallId = "callId" + TypeCallStatePending = "callStatePending" + TypeCallStateExchangingKeys = "callStateExchangingKeys" + TypeCallStateReady = "callStateReady" + TypeCallStateHangingUp = "callStateHangingUp" + TypeCallStateDiscarded = "callStateDiscarded" + TypeCallStateError = "callStateError" + TypeCall = "call" + TypeAnimations = "animations" + TypeImportedContacts = "importedContacts" + TypeInputInlineQueryResultAnimatedGif = "inputInlineQueryResultAnimatedGif" + TypeInputInlineQueryResultAnimatedMpeg4 = "inputInlineQueryResultAnimatedMpeg4" + TypeInputInlineQueryResultArticle = "inputInlineQueryResultArticle" + TypeInputInlineQueryResultAudio = "inputInlineQueryResultAudio" + TypeInputInlineQueryResultContact = "inputInlineQueryResultContact" + TypeInputInlineQueryResultDocument = "inputInlineQueryResultDocument" + TypeInputInlineQueryResultGame = "inputInlineQueryResultGame" + TypeInputInlineQueryResultLocation = "inputInlineQueryResultLocation" + TypeInputInlineQueryResultPhoto = "inputInlineQueryResultPhoto" + TypeInputInlineQueryResultSticker = "inputInlineQueryResultSticker" + TypeInputInlineQueryResultVenue = "inputInlineQueryResultVenue" + TypeInputInlineQueryResultVideo = "inputInlineQueryResultVideo" + TypeInputInlineQueryResultVoiceNote = "inputInlineQueryResultVoiceNote" + TypeInlineQueryResultArticle = "inlineQueryResultArticle" + TypeInlineQueryResultContact = "inlineQueryResultContact" + TypeInlineQueryResultLocation = "inlineQueryResultLocation" + TypeInlineQueryResultVenue = "inlineQueryResultVenue" + TypeInlineQueryResultGame = "inlineQueryResultGame" + TypeInlineQueryResultAnimation = "inlineQueryResultAnimation" + TypeInlineQueryResultAudio = "inlineQueryResultAudio" + TypeInlineQueryResultDocument = "inlineQueryResultDocument" + TypeInlineQueryResultPhoto = "inlineQueryResultPhoto" + TypeInlineQueryResultSticker = "inlineQueryResultSticker" + TypeInlineQueryResultVideo = "inlineQueryResultVideo" + TypeInlineQueryResultVoiceNote = "inlineQueryResultVoiceNote" + TypeInlineQueryResults = "inlineQueryResults" + TypeCallbackQueryPayloadData = "callbackQueryPayloadData" + TypeCallbackQueryPayloadGame = "callbackQueryPayloadGame" + TypeCallbackQueryAnswer = "callbackQueryAnswer" + TypeCustomRequestResult = "customRequestResult" + TypeGameHighScore = "gameHighScore" + TypeGameHighScores = "gameHighScores" + TypeChatEventMessageEdited = "chatEventMessageEdited" + TypeChatEventMessageDeleted = "chatEventMessageDeleted" + TypeChatEventMessagePinned = "chatEventMessagePinned" + TypeChatEventMessageUnpinned = "chatEventMessageUnpinned" + TypeChatEventMemberJoined = "chatEventMemberJoined" + TypeChatEventMemberLeft = "chatEventMemberLeft" + TypeChatEventMemberInvited = "chatEventMemberInvited" + TypeChatEventMemberPromoted = "chatEventMemberPromoted" + TypeChatEventMemberRestricted = "chatEventMemberRestricted" + TypeChatEventTitleChanged = "chatEventTitleChanged" + TypeChatEventDescriptionChanged = "chatEventDescriptionChanged" + TypeChatEventUsernameChanged = "chatEventUsernameChanged" + TypeChatEventPhotoChanged = "chatEventPhotoChanged" + TypeChatEventInvitesToggled = "chatEventInvitesToggled" + TypeChatEventSignMessagesToggled = "chatEventSignMessagesToggled" + TypeChatEventStickerSetChanged = "chatEventStickerSetChanged" + TypeChatEventIsAllHistoryAvailableToggled = "chatEventIsAllHistoryAvailableToggled" + TypeChatEvent = "chatEvent" + TypeChatEvents = "chatEvents" + TypeChatEventLogFilters = "chatEventLogFilters" + TypeDeviceTokenGoogleCloudMessaging = "deviceTokenGoogleCloudMessaging" + TypeDeviceTokenApplePush = "deviceTokenApplePush" + TypeDeviceTokenApplePushVoIP = "deviceTokenApplePushVoIP" + TypeDeviceTokenWindowsPush = "deviceTokenWindowsPush" + TypeDeviceTokenMicrosoftPush = "deviceTokenMicrosoftPush" + TypeDeviceTokenMicrosoftPushVoIP = "deviceTokenMicrosoftPushVoIP" + TypeDeviceTokenWebPush = "deviceTokenWebPush" + TypeDeviceTokenSimplePush = "deviceTokenSimplePush" + TypeDeviceTokenUbuntuPush = "deviceTokenUbuntuPush" + TypeDeviceTokenBlackBerryPush = "deviceTokenBlackBerryPush" + TypeDeviceTokenTizenPush = "deviceTokenTizenPush" + TypeWallpaper = "wallpaper" + TypeWallpapers = "wallpapers" + TypeHashtags = "hashtags" + TypeCheckChatUsernameResultOk = "checkChatUsernameResultOk" + TypeCheckChatUsernameResultUsernameInvalid = "checkChatUsernameResultUsernameInvalid" + TypeCheckChatUsernameResultUsernameOccupied = "checkChatUsernameResultUsernameOccupied" + TypeCheckChatUsernameResultPublicChatsTooMuch = "checkChatUsernameResultPublicChatsTooMuch" + TypeCheckChatUsernameResultPublicGroupsUnavailable = "checkChatUsernameResultPublicGroupsUnavailable" + TypeOptionValueBoolean = "optionValueBoolean" + TypeOptionValueEmpty = "optionValueEmpty" + TypeOptionValueInteger = "optionValueInteger" + TypeOptionValueString = "optionValueString" + TypeUserPrivacySettingRuleAllowAll = "userPrivacySettingRuleAllowAll" + TypeUserPrivacySettingRuleAllowContacts = "userPrivacySettingRuleAllowContacts" + TypeUserPrivacySettingRuleAllowUsers = "userPrivacySettingRuleAllowUsers" + TypeUserPrivacySettingRuleRestrictAll = "userPrivacySettingRuleRestrictAll" + TypeUserPrivacySettingRuleRestrictContacts = "userPrivacySettingRuleRestrictContacts" + TypeUserPrivacySettingRuleRestrictUsers = "userPrivacySettingRuleRestrictUsers" + TypeUserPrivacySettingRules = "userPrivacySettingRules" + TypeUserPrivacySettingShowStatus = "userPrivacySettingShowStatus" + TypeUserPrivacySettingAllowChatInvites = "userPrivacySettingAllowChatInvites" + TypeUserPrivacySettingAllowCalls = "userPrivacySettingAllowCalls" + TypeAccountTtl = "accountTtl" + TypeSession = "session" + TypeSessions = "sessions" + TypeConnectedWebsite = "connectedWebsite" + TypeConnectedWebsites = "connectedWebsites" + TypeChatReportSpamState = "chatReportSpamState" + TypeChatReportReasonSpam = "chatReportReasonSpam" + TypeChatReportReasonViolence = "chatReportReasonViolence" + TypeChatReportReasonPornography = "chatReportReasonPornography" + TypeChatReportReasonCustom = "chatReportReasonCustom" + TypePublicMessageLink = "publicMessageLink" + TypeFileTypeNone = "fileTypeNone" + TypeFileTypeAnimation = "fileTypeAnimation" + TypeFileTypeAudio = "fileTypeAudio" + TypeFileTypeDocument = "fileTypeDocument" + TypeFileTypePhoto = "fileTypePhoto" + TypeFileTypeProfilePhoto = "fileTypeProfilePhoto" + TypeFileTypeSecret = "fileTypeSecret" + TypeFileTypeSticker = "fileTypeSticker" + TypeFileTypeThumbnail = "fileTypeThumbnail" + TypeFileTypeUnknown = "fileTypeUnknown" + TypeFileTypeVideo = "fileTypeVideo" + TypeFileTypeVideoNote = "fileTypeVideoNote" + TypeFileTypeVoiceNote = "fileTypeVoiceNote" + TypeFileTypeWallpaper = "fileTypeWallpaper" + TypeFileTypeSecretThumbnail = "fileTypeSecretThumbnail" + TypeStorageStatisticsByFileType = "storageStatisticsByFileType" + TypeStorageStatisticsByChat = "storageStatisticsByChat" + TypeStorageStatistics = "storageStatistics" + TypeStorageStatisticsFast = "storageStatisticsFast" + TypeNetworkTypeNone = "networkTypeNone" + TypeNetworkTypeMobile = "networkTypeMobile" + TypeNetworkTypeMobileRoaming = "networkTypeMobileRoaming" + TypeNetworkTypeWiFi = "networkTypeWiFi" + TypeNetworkTypeOther = "networkTypeOther" + TypeNetworkStatisticsEntryFile = "networkStatisticsEntryFile" + TypeNetworkStatisticsEntryCall = "networkStatisticsEntryCall" + TypeNetworkStatistics = "networkStatistics" + TypeConnectionStateWaitingForNetwork = "connectionStateWaitingForNetwork" + TypeConnectionStateConnectingToProxy = "connectionStateConnectingToProxy" + TypeConnectionStateConnecting = "connectionStateConnecting" + TypeConnectionStateUpdating = "connectionStateUpdating" + TypeConnectionStateReady = "connectionStateReady" + TypeTopChatCategoryUsers = "topChatCategoryUsers" + TypeTopChatCategoryBots = "topChatCategoryBots" + TypeTopChatCategoryGroups = "topChatCategoryGroups" + TypeTopChatCategoryChannels = "topChatCategoryChannels" + TypeTopChatCategoryInlineBots = "topChatCategoryInlineBots" + TypeTopChatCategoryCalls = "topChatCategoryCalls" + TypeTMeUrlTypeUser = "tMeUrlTypeUser" + TypeTMeUrlTypeSupergroup = "tMeUrlTypeSupergroup" + TypeTMeUrlTypeChatInvite = "tMeUrlTypeChatInvite" + TypeTMeUrlTypeStickerSet = "tMeUrlTypeStickerSet" + TypeTMeUrl = "tMeUrl" + TypeTMeUrls = "tMeUrls" + TypeCount = "count" + TypeText = "text" + TypeTextParseModeMarkdown = "textParseModeMarkdown" + TypeTextParseModeHTML = "textParseModeHTML" + TypeProxyEmpty = "proxyEmpty" + TypeProxySocks5 = "proxySocks5" + TypeInputSticker = "inputSticker" + TypeUpdateAuthorizationState = "updateAuthorizationState" + TypeUpdateNewMessage = "updateNewMessage" + TypeUpdateMessageSendAcknowledged = "updateMessageSendAcknowledged" + TypeUpdateMessageSendSucceeded = "updateMessageSendSucceeded" + TypeUpdateMessageSendFailed = "updateMessageSendFailed" + TypeUpdateMessageContent = "updateMessageContent" + TypeUpdateMessageEdited = "updateMessageEdited" + TypeUpdateMessageViews = "updateMessageViews" + TypeUpdateMessageContentOpened = "updateMessageContentOpened" + TypeUpdateMessageMentionRead = "updateMessageMentionRead" + TypeUpdateNewChat = "updateNewChat" + TypeUpdateChatTitle = "updateChatTitle" + TypeUpdateChatPhoto = "updateChatPhoto" + TypeUpdateChatLastMessage = "updateChatLastMessage" + TypeUpdateChatOrder = "updateChatOrder" + TypeUpdateChatIsPinned = "updateChatIsPinned" + TypeUpdateChatReadInbox = "updateChatReadInbox" + TypeUpdateChatReadOutbox = "updateChatReadOutbox" + TypeUpdateChatUnreadMentionCount = "updateChatUnreadMentionCount" + TypeUpdateNotificationSettings = "updateNotificationSettings" + TypeUpdateChatReplyMarkup = "updateChatReplyMarkup" + TypeUpdateChatDraftMessage = "updateChatDraftMessage" + TypeUpdateDeleteMessages = "updateDeleteMessages" + TypeUpdateUserChatAction = "updateUserChatAction" + TypeUpdateUserStatus = "updateUserStatus" + TypeUpdateUser = "updateUser" + TypeUpdateBasicGroup = "updateBasicGroup" + TypeUpdateSupergroup = "updateSupergroup" + TypeUpdateSecretChat = "updateSecretChat" + TypeUpdateUserFullInfo = "updateUserFullInfo" + TypeUpdateBasicGroupFullInfo = "updateBasicGroupFullInfo" + TypeUpdateSupergroupFullInfo = "updateSupergroupFullInfo" + TypeUpdateServiceNotification = "updateServiceNotification" + TypeUpdateFile = "updateFile" + TypeUpdateFileGenerationStart = "updateFileGenerationStart" + TypeUpdateFileGenerationStop = "updateFileGenerationStop" + TypeUpdateCall = "updateCall" + TypeUpdateUserPrivacySettingRules = "updateUserPrivacySettingRules" + TypeUpdateUnreadMessageCount = "updateUnreadMessageCount" + TypeUpdateOption = "updateOption" + TypeUpdateInstalledStickerSets = "updateInstalledStickerSets" + TypeUpdateTrendingStickerSets = "updateTrendingStickerSets" + TypeUpdateRecentStickers = "updateRecentStickers" + TypeUpdateFavoriteStickers = "updateFavoriteStickers" + TypeUpdateSavedAnimations = "updateSavedAnimations" + TypeUpdateConnectionState = "updateConnectionState" + TypeUpdateNewInlineQuery = "updateNewInlineQuery" + TypeUpdateNewChosenInlineResult = "updateNewChosenInlineResult" + TypeUpdateNewCallbackQuery = "updateNewCallbackQuery" + TypeUpdateNewInlineCallbackQuery = "updateNewInlineCallbackQuery" + TypeUpdateNewShippingQuery = "updateNewShippingQuery" + TypeUpdateNewPreCheckoutQuery = "updateNewPreCheckoutQuery" + TypeUpdateNewCustomEvent = "updateNewCustomEvent" + TypeUpdateNewCustomQuery = "updateNewCustomQuery" + TypeTestInt = "testInt" + TypeTestString = "testString" + TypeTestBytes = "testBytes" + TypeTestVectorInt = "testVectorInt" + TypeTestVectorIntObject = "testVectorIntObject" + TypeTestVectorString = "testVectorString" + TypeTestVectorStringObject = "testVectorStringObject" +) + +// Provides information about the method by which an authentication code is delivered to the user +type AuthenticationCodeType interface { + AuthenticationCodeTypeType() string +} + +// Represents the current authorization state of the client +type AuthorizationState interface { + AuthorizationStateType() string +} + +// Points to a file +type InputFile interface { + InputFileType() string +} + +// Part of the face, relative to which a mask should be placed +type MaskPoint interface { + MaskPointType() string +} + +// Represents the relationship between user A and user B. For incoming_link, user A is the current user; for outgoing_link, user B is the current user +type LinkState interface { + LinkStateType() string +} + +// Represents the type of the user. The following types are possible: regular users, deleted users and bots +type UserType interface { + UserTypeType() string +} + +// Provides information about the status of a member in a chat +type ChatMemberStatus interface { + ChatMemberStatusType() string +} + +// Specifies the kind of chat members to return in getSupergroupMembers +type SupergroupMembersFilter interface { + SupergroupMembersFilterType() string +} + +// Describes the current secret chat state +type SecretChatState interface { + SecretChatStateType() string +} + +// Contains information about the initial sender of a forwarded message +type MessageForwardInfo interface { + MessageForwardInfoType() string +} + +// Contains information about the sending state of the message +type MessageSendingState interface { + MessageSendingStateType() string +} + +// Describes the types of chats for which notification settings are applied +type NotificationSettingsScope interface { + NotificationSettingsScopeType() string +} + +// Describes the type of a chat +type ChatType interface { + ChatTypeType() string +} + +// Describes a keyboard button type +type KeyboardButtonType interface { + KeyboardButtonTypeType() string +} + +// Describes the type of an inline keyboard button +type InlineKeyboardButtonType interface { + InlineKeyboardButtonTypeType() string +} + +// Contains a description of a custom keyboard and actions that can be done with it to quickly reply to bots +type ReplyMarkup interface { + ReplyMarkupType() string +} + +// Describes a text object inside an instant-view web page +type RichText interface { + RichTextType() string +} + +// Describes a block of an instant view web page +type PageBlock interface { + PageBlockType() string +} + +// Contains information about the payment method chosen by the user +type InputCredentials interface { + InputCredentialsType() string +} + +// Contains the content of a message +type MessageContent interface { + MessageContentType() string +} + +// Represents a part of the text which must be formatted differently +type TextEntityType interface { + TextEntityTypeType() string +} + +// The content of a message to send +type InputMessageContent interface { + InputMessageContentType() string +} + +// Represents a filter for message search results +type SearchMessagesFilter interface { + SearchMessagesFilterType() string +} + +// Describes the different types of activity in a chat +type ChatAction interface { + ChatActionType() string +} + +// Describes the last time the user was online +type UserStatus interface { + UserStatusType() string +} + +// Describes the reason why a call was discarded +type CallDiscardReason interface { + CallDiscardReasonType() string +} + +// Describes the current call state +type CallState interface { + CallStateType() string +} + +// Represents a single result of an inline query; for bots only +type InputInlineQueryResult interface { + InputInlineQueryResultType() string +} + +// Represents a single result of an inline query +type InlineQueryResult interface { + InlineQueryResultType() string +} + +// Represents a payload of a callback query +type CallbackQueryPayload interface { + CallbackQueryPayloadType() string +} + +// Represents a chat event +type ChatEventAction interface { + ChatEventActionType() string +} + +// Represents a data needed to subscribe for push notifications. To use specific push notification service, you must specify the correct application platform and upload valid server authentication data at https://my.telegram.org +type DeviceToken interface { + DeviceTokenType() string +} + +// Represents result of checking whether a username can be set for a chat +type CheckChatUsernameResult interface { + CheckChatUsernameResultType() string +} + +// Represents the value of an option +type OptionValue interface { + OptionValueType() string +} + +// Represents a single rule for managing privacy settings +type UserPrivacySettingRule interface { + UserPrivacySettingRuleType() string +} + +// Describes available user privacy settings +type UserPrivacySetting interface { + UserPrivacySettingType() string +} + +// Describes the reason why a chat is reported +type ChatReportReason interface { + ChatReportReasonType() string +} + +// Represents the type of a file +type FileType interface { + FileTypeType() string +} + +// Represents the type of a network +type NetworkType interface { + NetworkTypeType() string +} + +// Contains statistics about network usage +type NetworkStatisticsEntry interface { + NetworkStatisticsEntryType() string +} + +// Describes the current state of the connection to Telegram servers +type ConnectionState interface { + ConnectionStateType() string +} + +// Represents the categories of chats for which a list of frequently used chats can be retrieved +type TopChatCategory interface { + TopChatCategoryType() string +} + +// Describes the type of a URL linking to an internal Telegram entity +type TMeUrlType interface { + TMeUrlTypeType() string +} + +// Describes the way the text should be parsed for TextEntities +type TextParseMode interface { + TextParseModeType() string +} + +// Contains information about a proxy server +type Proxy interface { + ProxyType() string +} + +// Contains notifications about data changes +type Update interface { + UpdateType() string +} + +// An object of this type can be returned on every function call, in case of an error +type Error struct { + meta + // Error code; subject to future changes. If the error code is 406, the error message must not be processed in any way and must not be displayed to the user + Code int32 `json:"code"` + // Error message; subject to future changes + Message string `json:"message"` +} + +func (entity *Error) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Error + + return json.Marshal((*stub)(entity)) +} + +func (*Error) GetClass() string { + return ClassError +} + +func (*Error) GetType() string { + return TypeError +} + +// An object of this type is returned on a successful function call for certain functions +type Ok struct{ + meta +} + +func (entity *Ok) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Ok + + return json.Marshal((*stub)(entity)) +} + +func (*Ok) GetClass() string { + return ClassOk +} + +func (*Ok) GetType() string { + return TypeOk +} + +// Contains parameters for TDLib initialization +type TdlibParameters struct { + meta + // If set to true, the Telegram test environment will be used instead of the production environment + UseTestDc bool `json:"use_test_dc"` + // The path to the directory for the persistent database; if empty, the current working directory will be used + DatabaseDirectory string `json:"database_directory"` + // The path to the directory for storing files; if empty, database_directory will be used + FilesDirectory string `json:"files_directory"` + // If set to true, information about downloaded and uploaded files will be saved between application restarts + UseFileDatabase bool `json:"use_file_database"` + // If set to true, the library will maintain a cache of users, basic groups, supergroups, channels and secret chats. Implies use_file_database + UseChatInfoDatabase bool `json:"use_chat_info_database"` + // If set to true, the library will maintain a cache of chats and messages. Implies use_chat_info_database + UseMessageDatabase bool `json:"use_message_database"` + // If set to true, support for secret chats will be enabled + UseSecretChats bool `json:"use_secret_chats"` + // Application identifier for Telegram API access, which can be obtained at https://my.telegram.org + ApiId int32 `json:"api_id"` + // Application identifier hash for Telegram API access, which can be obtained at https://my.telegram.org + ApiHash string `json:"api_hash"` + // IETF language tag of the user's operating system language; must be non-empty + SystemLanguageCode string `json:"system_language_code"` + // Model of the device the application is being run on; must be non-empty + DeviceModel string `json:"device_model"` + // Version of the operating system the application is being run on; must be non-empty + SystemVersion string `json:"system_version"` + // Application version; must be non-empty + ApplicationVersion string `json:"application_version"` + // If set to true, old files will automatically be deleted + EnableStorageOptimizer bool `json:"enable_storage_optimizer"` + // If set to true, original file names will be ignored. Otherwise, downloaded files will be saved under names as close as possible to the original name + IgnoreFileNames bool `json:"ignore_file_names"` +} + +func (entity *TdlibParameters) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TdlibParameters + + return json.Marshal((*stub)(entity)) +} + +func (*TdlibParameters) GetClass() string { + return ClassTdlibParameters +} + +func (*TdlibParameters) GetType() string { + return TypeTdlibParameters +} + +// An authentication code is delivered via a private Telegram message, which can be viewed in another client +type AuthenticationCodeTypeTelegramMessage struct { + meta + // Length of the code + Length int32 `json:"length"` +} + +func (entity *AuthenticationCodeTypeTelegramMessage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthenticationCodeTypeTelegramMessage + + return json.Marshal((*stub)(entity)) +} + +func (*AuthenticationCodeTypeTelegramMessage) GetClass() string { + return ClassAuthenticationCodeType +} + +func (*AuthenticationCodeTypeTelegramMessage) GetType() string { + return TypeAuthenticationCodeTypeTelegramMessage +} + +func (*AuthenticationCodeTypeTelegramMessage) AuthenticationCodeTypeType() string { + return TypeAuthenticationCodeTypeTelegramMessage +} + +// An authentication code is delivered via an SMS message to the specified phone number +type AuthenticationCodeTypeSms struct { + meta + // Length of the code + Length int32 `json:"length"` +} + +func (entity *AuthenticationCodeTypeSms) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthenticationCodeTypeSms + + return json.Marshal((*stub)(entity)) +} + +func (*AuthenticationCodeTypeSms) GetClass() string { + return ClassAuthenticationCodeType +} + +func (*AuthenticationCodeTypeSms) GetType() string { + return TypeAuthenticationCodeTypeSms +} + +func (*AuthenticationCodeTypeSms) AuthenticationCodeTypeType() string { + return TypeAuthenticationCodeTypeSms +} + +// An authentication code is delivered via a phone call to the specified phone number +type AuthenticationCodeTypeCall struct { + meta + // Length of the code + Length int32 `json:"length"` +} + +func (entity *AuthenticationCodeTypeCall) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthenticationCodeTypeCall + + return json.Marshal((*stub)(entity)) +} + +func (*AuthenticationCodeTypeCall) GetClass() string { + return ClassAuthenticationCodeType +} + +func (*AuthenticationCodeTypeCall) GetType() string { + return TypeAuthenticationCodeTypeCall +} + +func (*AuthenticationCodeTypeCall) AuthenticationCodeTypeType() string { + return TypeAuthenticationCodeTypeCall +} + +// An authentication code is delivered by an immediately cancelled call to the specified phone number. The number from which the call was made is the code +type AuthenticationCodeTypeFlashCall struct { + meta + // Pattern of the phone number from which the call will be made + Pattern string `json:"pattern"` +} + +func (entity *AuthenticationCodeTypeFlashCall) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthenticationCodeTypeFlashCall + + return json.Marshal((*stub)(entity)) +} + +func (*AuthenticationCodeTypeFlashCall) GetClass() string { + return ClassAuthenticationCodeType +} + +func (*AuthenticationCodeTypeFlashCall) GetType() string { + return TypeAuthenticationCodeTypeFlashCall +} + +func (*AuthenticationCodeTypeFlashCall) AuthenticationCodeTypeType() string { + return TypeAuthenticationCodeTypeFlashCall +} + +// Information about the authentication code that was sent +type AuthenticationCodeInfo struct { + meta + // A phone number that is being authenticated + PhoneNumber string `json:"phone_number"` + // Describes the way the code was sent to the user + Type AuthenticationCodeType `json:"type"` + // Describes the way the next code will be sent to the user; may be null + NextType AuthenticationCodeType `json:"next_type"` + // Timeout before the code should be re-sent, in seconds + Timeout int32 `json:"timeout"` +} + +func (entity *AuthenticationCodeInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthenticationCodeInfo + + return json.Marshal((*stub)(entity)) +} + +func (*AuthenticationCodeInfo) GetClass() string { + return ClassAuthenticationCodeInfo +} + +func (*AuthenticationCodeInfo) GetType() string { + return TypeAuthenticationCodeInfo +} + +func (authenticationCodeInfo *AuthenticationCodeInfo) UnmarshalJSON(data []byte) error { + var tmp struct { + PhoneNumber string `json:"phone_number"` + Type json.RawMessage `json:"type"` + NextType json.RawMessage `json:"next_type"` + Timeout int32 `json:"timeout"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + authenticationCodeInfo.PhoneNumber = tmp.PhoneNumber + authenticationCodeInfo.Timeout = tmp.Timeout + + fieldType, _ := UnmarshalAuthenticationCodeType(tmp.Type) + authenticationCodeInfo.Type = fieldType + + fieldNextType, _ := UnmarshalAuthenticationCodeType(tmp.NextType) + authenticationCodeInfo.NextType = fieldNextType + + return nil +} + +// TDLib needs TdlibParameters for initialization +type AuthorizationStateWaitTdlibParameters struct{ + meta +} + +func (entity *AuthorizationStateWaitTdlibParameters) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateWaitTdlibParameters + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateWaitTdlibParameters) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateWaitTdlibParameters) GetType() string { + return TypeAuthorizationStateWaitTdlibParameters +} + +func (*AuthorizationStateWaitTdlibParameters) AuthorizationStateType() string { + return TypeAuthorizationStateWaitTdlibParameters +} + +// TDLib needs an encryption key to decrypt the local database +type AuthorizationStateWaitEncryptionKey struct { + meta + // True, if the database is currently encrypted + IsEncrypted bool `json:"is_encrypted"` +} + +func (entity *AuthorizationStateWaitEncryptionKey) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateWaitEncryptionKey + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateWaitEncryptionKey) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateWaitEncryptionKey) GetType() string { + return TypeAuthorizationStateWaitEncryptionKey +} + +func (*AuthorizationStateWaitEncryptionKey) AuthorizationStateType() string { + return TypeAuthorizationStateWaitEncryptionKey +} + +// TDLib needs the user's phone number to authorize +type AuthorizationStateWaitPhoneNumber struct{ + meta +} + +func (entity *AuthorizationStateWaitPhoneNumber) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateWaitPhoneNumber + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateWaitPhoneNumber) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateWaitPhoneNumber) GetType() string { + return TypeAuthorizationStateWaitPhoneNumber +} + +func (*AuthorizationStateWaitPhoneNumber) AuthorizationStateType() string { + return TypeAuthorizationStateWaitPhoneNumber +} + +// TDLib needs the user's authentication code to finalize authorization +type AuthorizationStateWaitCode struct { + meta + // True, if the user is already registered + IsRegistered bool `json:"is_registered"` + // Information about the authorization code that was sent + CodeInfo *AuthenticationCodeInfo `json:"code_info"` +} + +func (entity *AuthorizationStateWaitCode) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateWaitCode + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateWaitCode) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateWaitCode) GetType() string { + return TypeAuthorizationStateWaitCode +} + +func (*AuthorizationStateWaitCode) AuthorizationStateType() string { + return TypeAuthorizationStateWaitCode +} + +// The user has been authorized, but needs to enter a password to start using the application +type AuthorizationStateWaitPassword struct { + meta + // Hint for the password; can be empty + PasswordHint string `json:"password_hint"` + // True if a recovery email address has been set up + HasRecoveryEmailAddress bool `json:"has_recovery_email_address"` + // Pattern of the email address to which the recovery email was sent; empty until a recovery email has been sent + RecoveryEmailAddressPattern string `json:"recovery_email_address_pattern"` +} + +func (entity *AuthorizationStateWaitPassword) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateWaitPassword + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateWaitPassword) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateWaitPassword) GetType() string { + return TypeAuthorizationStateWaitPassword +} + +func (*AuthorizationStateWaitPassword) AuthorizationStateType() string { + return TypeAuthorizationStateWaitPassword +} + +// The user has been successfully authorized. TDLib is now ready to answer queries +type AuthorizationStateReady struct{ + meta +} + +func (entity *AuthorizationStateReady) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateReady + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateReady) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateReady) GetType() string { + return TypeAuthorizationStateReady +} + +func (*AuthorizationStateReady) AuthorizationStateType() string { + return TypeAuthorizationStateReady +} + +// The user is currently logging out +type AuthorizationStateLoggingOut struct{ + meta +} + +func (entity *AuthorizationStateLoggingOut) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateLoggingOut + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateLoggingOut) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateLoggingOut) GetType() string { + return TypeAuthorizationStateLoggingOut +} + +func (*AuthorizationStateLoggingOut) AuthorizationStateType() string { + return TypeAuthorizationStateLoggingOut +} + +// TDLib is closing, all subsequent queries will be answered with the error 500. Note that closing TDLib can take a while. All resources will be freed only after authorizationStateClosed has been received +type AuthorizationStateClosing struct{ + meta +} + +func (entity *AuthorizationStateClosing) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateClosing + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateClosing) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateClosing) GetType() string { + return TypeAuthorizationStateClosing +} + +func (*AuthorizationStateClosing) AuthorizationStateType() string { + return TypeAuthorizationStateClosing +} + +// TDLib client is in its final state. All databases are closed and all resources are released. No other updates will be received after this. All queries will be responded to with error code 500. To continue working, one should create a new instance of the TDLib client +type AuthorizationStateClosed struct{ + meta +} + +func (entity *AuthorizationStateClosed) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AuthorizationStateClosed + + return json.Marshal((*stub)(entity)) +} + +func (*AuthorizationStateClosed) GetClass() string { + return ClassAuthorizationState +} + +func (*AuthorizationStateClosed) GetType() string { + return TypeAuthorizationStateClosed +} + +func (*AuthorizationStateClosed) AuthorizationStateType() string { + return TypeAuthorizationStateClosed +} + +// Represents the current state of 2-step verification +type PasswordState struct { + meta + // True if a 2-step verification password has been set up + HasPassword bool `json:"has_password"` + // Hint for the password; can be empty + PasswordHint string `json:"password_hint"` + // True if a recovery email has been set up + HasRecoveryEmailAddress bool `json:"has_recovery_email_address"` + // Pattern of the email address to which a confirmation email was sent + UnconfirmedRecoveryEmailAddressPattern string `json:"unconfirmed_recovery_email_address_pattern"` +} + +func (entity *PasswordState) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PasswordState + + return json.Marshal((*stub)(entity)) +} + +func (*PasswordState) GetClass() string { + return ClassPasswordState +} + +func (*PasswordState) GetType() string { + return TypePasswordState +} + +// Contains information available to the user after requesting password recovery +type PasswordRecoveryInfo struct { + meta + // Pattern of the email address to which a recovery email was sent + RecoveryEmailAddressPattern string `json:"recovery_email_address_pattern"` +} + +func (entity *PasswordRecoveryInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PasswordRecoveryInfo + + return json.Marshal((*stub)(entity)) +} + +func (*PasswordRecoveryInfo) GetClass() string { + return ClassPasswordRecoveryInfo +} + +func (*PasswordRecoveryInfo) GetType() string { + return TypePasswordRecoveryInfo +} + +// Contains information about the current recovery email address +type RecoveryEmailAddress struct { + meta + // Recovery email address + RecoveryEmailAddress string `json:"recovery_email_address"` +} + +func (entity *RecoveryEmailAddress) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RecoveryEmailAddress + + return json.Marshal((*stub)(entity)) +} + +func (*RecoveryEmailAddress) GetClass() string { + return ClassRecoveryEmailAddress +} + +func (*RecoveryEmailAddress) GetType() string { + return TypeRecoveryEmailAddress +} + +// Returns information about the availability of a temporary password, which can be used for payments +type TemporaryPasswordState struct { + meta + // True, if a temporary password is available + HasPassword bool `json:"has_password"` + // Time left before the temporary password expires, in seconds + ValidFor int32 `json:"valid_for"` +} + +func (entity *TemporaryPasswordState) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TemporaryPasswordState + + return json.Marshal((*stub)(entity)) +} + +func (*TemporaryPasswordState) GetClass() string { + return ClassTemporaryPasswordState +} + +func (*TemporaryPasswordState) GetType() string { + return TypeTemporaryPasswordState +} + +// Represents a local file +type LocalFile struct { + meta + // Local path to the locally available file part; may be empty + Path string `json:"path"` + // True, if it is possible to try to download or generate the file + CanBeDownloaded bool `json:"can_be_downloaded"` + // True, if the file can be deleted + CanBeDeleted bool `json:"can_be_deleted"` + // True, if the file is currently being downloaded (or a local copy is being generated by some other means) + IsDownloadingActive bool `json:"is_downloading_active"` + // True, if the local copy is fully available + IsDownloadingCompleted bool `json:"is_downloading_completed"` + // If is_downloading_completed is false, then only some prefix of the file is ready to be read. downloaded_prefix_size is the size of that prefix + DownloadedPrefixSize int32 `json:"downloaded_prefix_size"` + // Total downloaded file bytes. Should be used only for calculating download progress. The actual file size may be bigger, and some parts of it may contain garbage + DownloadedSize int32 `json:"downloaded_size"` +} + +func (entity *LocalFile) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub LocalFile + + return json.Marshal((*stub)(entity)) +} + +func (*LocalFile) GetClass() string { + return ClassLocalFile +} + +func (*LocalFile) GetType() string { + return TypeLocalFile +} + +// Represents a remote file +type RemoteFile struct { + meta + // Remote file identifier, may be empty. Can be used across application restarts or even from other devices for the current user. If the ID starts with "http://" or "https://", it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known. If downloadFile is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the client with the HTTP URL in the original_path and "#url#" as the conversion string. Clients should generate the file by downloading it to the specified location + Id string `json:"id"` + // True, if the file is currently being uploaded (or a remote copy is being generated by some other means) + IsUploadingActive bool `json:"is_uploading_active"` + // True, if a remote copy is fully available + IsUploadingCompleted bool `json:"is_uploading_completed"` + // Size of the remote available part of the file; 0 if unknown + UploadedSize int32 `json:"uploaded_size"` +} + +func (entity *RemoteFile) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RemoteFile + + return json.Marshal((*stub)(entity)) +} + +func (*RemoteFile) GetClass() string { + return ClassRemoteFile +} + +func (*RemoteFile) GetType() string { + return TypeRemoteFile +} + +// Represents a file +type File struct { + meta + // Unique file identifier + Id int32 `json:"id"` + // File size; 0 if unknown + Size int32 `json:"size"` + // Expected file size in case the exact file size is unknown, but an approximate size is known. Can be used to show download/upload progress + ExpectedSize int32 `json:"expected_size"` + // Information about the local copy of the file + Local *LocalFile `json:"local"` + // Information about the remote copy of the file + Remote *RemoteFile `json:"remote"` +} + +func (entity *File) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub File + + return json.Marshal((*stub)(entity)) +} + +func (*File) GetClass() string { + return ClassFile +} + +func (*File) GetType() string { + return TypeFile +} + +// A file defined by its unique ID +type InputFileId struct { + meta + // Unique file identifier + Id int32 `json:"id"` +} + +func (entity *InputFileId) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputFileId + + return json.Marshal((*stub)(entity)) +} + +func (*InputFileId) GetClass() string { + return ClassInputFile +} + +func (*InputFileId) GetType() string { + return TypeInputFileId +} + +func (*InputFileId) InputFileType() string { + return TypeInputFileId +} + +// A file defined by its remote ID +type InputFileRemote struct { + meta + // Remote file identifier + Id string `json:"id"` +} + +func (entity *InputFileRemote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputFileRemote + + return json.Marshal((*stub)(entity)) +} + +func (*InputFileRemote) GetClass() string { + return ClassInputFile +} + +func (*InputFileRemote) GetType() string { + return TypeInputFileRemote +} + +func (*InputFileRemote) InputFileType() string { + return TypeInputFileRemote +} + +// A file defined by a local path +type InputFileLocal struct { + meta + // Local path to the file + Path string `json:"path"` +} + +func (entity *InputFileLocal) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputFileLocal + + return json.Marshal((*stub)(entity)) +} + +func (*InputFileLocal) GetClass() string { + return ClassInputFile +} + +func (*InputFileLocal) GetType() string { + return TypeInputFileLocal +} + +func (*InputFileLocal) InputFileType() string { + return TypeInputFileLocal +} + +// A file generated by the client +type InputFileGenerated struct { + meta + // Local path to a file from which the file is generated, may be empty if there is no such file + OriginalPath string `json:"original_path"` + // String specifying the conversion applied to the original file; should be persistent across application restarts + Conversion string `json:"conversion"` + // Expected size of the generated file; 0 if unknown + ExpectedSize int32 `json:"expected_size"` +} + +func (entity *InputFileGenerated) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputFileGenerated + + return json.Marshal((*stub)(entity)) +} + +func (*InputFileGenerated) GetClass() string { + return ClassInputFile +} + +func (*InputFileGenerated) GetType() string { + return TypeInputFileGenerated +} + +func (*InputFileGenerated) InputFileType() string { + return TypeInputFileGenerated +} + +// Photo description +type PhotoSize struct { + meta + // Thumbnail type (see https://core.telegram.org/constructor/photoSize) + Type string `json:"type"` + // Information about the photo file + Photo *File `json:"photo"` + // Photo width + Width int32 `json:"width"` + // Photo height + Height int32 `json:"height"` +} + +func (entity *PhotoSize) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PhotoSize + + return json.Marshal((*stub)(entity)) +} + +func (*PhotoSize) GetClass() string { + return ClassPhotoSize +} + +func (*PhotoSize) GetType() string { + return TypePhotoSize +} + +// A mask should be placed relatively to the forehead +type MaskPointForehead struct{ + meta +} + +func (entity *MaskPointForehead) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MaskPointForehead + + return json.Marshal((*stub)(entity)) +} + +func (*MaskPointForehead) GetClass() string { + return ClassMaskPoint +} + +func (*MaskPointForehead) GetType() string { + return TypeMaskPointForehead +} + +func (*MaskPointForehead) MaskPointType() string { + return TypeMaskPointForehead +} + +// A mask should be placed relatively to the eyes +type MaskPointEyes struct{ + meta +} + +func (entity *MaskPointEyes) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MaskPointEyes + + return json.Marshal((*stub)(entity)) +} + +func (*MaskPointEyes) GetClass() string { + return ClassMaskPoint +} + +func (*MaskPointEyes) GetType() string { + return TypeMaskPointEyes +} + +func (*MaskPointEyes) MaskPointType() string { + return TypeMaskPointEyes +} + +// A mask should be placed relatively to the mouth +type MaskPointMouth struct{ + meta +} + +func (entity *MaskPointMouth) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MaskPointMouth + + return json.Marshal((*stub)(entity)) +} + +func (*MaskPointMouth) GetClass() string { + return ClassMaskPoint +} + +func (*MaskPointMouth) GetType() string { + return TypeMaskPointMouth +} + +func (*MaskPointMouth) MaskPointType() string { + return TypeMaskPointMouth +} + +// A mask should be placed relatively to the chin +type MaskPointChin struct{ + meta +} + +func (entity *MaskPointChin) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MaskPointChin + + return json.Marshal((*stub)(entity)) +} + +func (*MaskPointChin) GetClass() string { + return ClassMaskPoint +} + +func (*MaskPointChin) GetType() string { + return TypeMaskPointChin +} + +func (*MaskPointChin) MaskPointType() string { + return TypeMaskPointChin +} + +// Position on a photo where a mask should be placed +type MaskPosition struct { + meta + // Part of the face, relative to which the mask should be placed + Point MaskPoint `json:"point"` + // Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position) + XShift float64 `json:"x_shift"` + // Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. (For example, 1.0 will place the mask just below the default mask position) + YShift float64 `json:"y_shift"` + // Mask scaling coefficient. (For example, 2.0 means a doubled size) + Scale float64 `json:"scale"` +} + +func (entity *MaskPosition) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MaskPosition + + return json.Marshal((*stub)(entity)) +} + +func (*MaskPosition) GetClass() string { + return ClassMaskPosition +} + +func (*MaskPosition) GetType() string { + return TypeMaskPosition +} + +func (maskPosition *MaskPosition) UnmarshalJSON(data []byte) error { + var tmp struct { + Point json.RawMessage `json:"point"` + XShift float64 `json:"x_shift"` + YShift float64 `json:"y_shift"` + Scale float64 `json:"scale"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + maskPosition.XShift = tmp.XShift + maskPosition.YShift = tmp.YShift + maskPosition.Scale = tmp.Scale + + fieldPoint, _ := UnmarshalMaskPoint(tmp.Point) + maskPosition.Point = fieldPoint + + return nil +} + +// Represents a part of the text that needs to be formatted in some unusual way +type TextEntity struct { + meta + // Offset of the entity in UTF-16 code points + Offset int32 `json:"offset"` + // Length of the entity, in UTF-16 code points + Length int32 `json:"length"` + // Type of the entity + Type TextEntityType `json:"type"` +} + +func (entity *TextEntity) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntity + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntity) GetClass() string { + return ClassTextEntity +} + +func (*TextEntity) GetType() string { + return TypeTextEntity +} + +func (textEntity *TextEntity) UnmarshalJSON(data []byte) error { + var tmp struct { + Offset int32 `json:"offset"` + Length int32 `json:"length"` + Type json.RawMessage `json:"type"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + textEntity.Offset = tmp.Offset + textEntity.Length = tmp.Length + + fieldType, _ := UnmarshalTextEntityType(tmp.Type) + textEntity.Type = fieldType + + return nil +} + +// Contains a list of text entities +type TextEntities struct { + meta + // List of text entities + Entities []*TextEntity `json:"entities"` +} + +func (entity *TextEntities) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntities + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntities) GetClass() string { + return ClassTextEntities +} + +func (*TextEntities) GetType() string { + return TypeTextEntities +} + +// A text with some entities +type FormattedText struct { + meta + // The text + Text string `json:"text"` + // Entities contained in the text + Entities []*TextEntity `json:"entities"` +} + +func (entity *FormattedText) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FormattedText + + return json.Marshal((*stub)(entity)) +} + +func (*FormattedText) GetClass() string { + return ClassFormattedText +} + +func (*FormattedText) GetType() string { + return TypeFormattedText +} + +// Describes an animation file. The animation must be encoded in GIF or MPEG4 format +type Animation struct { + meta + // Duration of the animation, in seconds; as defined by the sender + Duration int32 `json:"duration"` + // Width of the animation + Width int32 `json:"width"` + // Height of the animation + Height int32 `json:"height"` + // Original name of the file; as defined by the sender + FileName string `json:"file_name"` + // MIME type of the file, usually "image/gif" or "video/mp4" + MimeType string `json:"mime_type"` + // Animation thumbnail; may be null + Thumbnail *PhotoSize `json:"thumbnail"` + // File containing the animation + Animation *File `json:"animation"` +} + +func (entity *Animation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Animation + + return json.Marshal((*stub)(entity)) +} + +func (*Animation) GetClass() string { + return ClassAnimation +} + +func (*Animation) GetType() string { + return TypeAnimation +} + +// Describes an audio file. Audio is usually in MP3 format +type Audio struct { + meta + // Duration of the audio, in seconds; as defined by the sender + Duration int32 `json:"duration"` + // Title of the audio; as defined by the sender + Title string `json:"title"` + // Performer of the audio; as defined by the sender + Performer string `json:"performer"` + // Original name of the file; as defined by the sender + FileName string `json:"file_name"` + // The MIME type of the file; as defined by the sender + MimeType string `json:"mime_type"` + // The thumbnail of the album cover; as defined by the sender. The full size thumbnail should be extracted from the downloaded file; may be null + AlbumCoverThumbnail *PhotoSize `json:"album_cover_thumbnail"` + // File containing the audio + Audio *File `json:"audio"` +} + +func (entity *Audio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Audio + + return json.Marshal((*stub)(entity)) +} + +func (*Audio) GetClass() string { + return ClassAudio +} + +func (*Audio) GetType() string { + return TypeAudio +} + +// Describes a document of any type +type Document struct { + meta + // Original name of the file; as defined by the sender + FileName string `json:"file_name"` + // MIME type of the file; as defined by the sender + MimeType string `json:"mime_type"` + // Document thumbnail; as defined by the sender; may be null + Thumbnail *PhotoSize `json:"thumbnail"` + // File containing the document + Document *File `json:"document"` +} + +func (entity *Document) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Document + + return json.Marshal((*stub)(entity)) +} + +func (*Document) GetClass() string { + return ClassDocument +} + +func (*Document) GetType() string { + return TypeDocument +} + +// Describes a photo +type Photo struct { + meta + // Photo identifier; 0 for deleted photos + Id JsonInt64 `json:"id"` + // True, if stickers were added to the photo + HasStickers bool `json:"has_stickers"` + // Available variants of the photo, in different sizes + Sizes []*PhotoSize `json:"sizes"` +} + +func (entity *Photo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Photo + + return json.Marshal((*stub)(entity)) +} + +func (*Photo) GetClass() string { + return ClassPhoto +} + +func (*Photo) GetType() string { + return TypePhoto +} + +// Describes a sticker +type Sticker struct { + meta + // The identifier of the sticker set to which the sticker belongs; 0 if none + SetId JsonInt64 `json:"set_id"` + // Sticker width; as defined by the sender + Width int32 `json:"width"` + // Sticker height; as defined by the sender + Height int32 `json:"height"` + // Emoji corresponding to the sticker + Emoji string `json:"emoji"` + // True, if the sticker is a mask + IsMask bool `json:"is_mask"` + // Position where the mask should be placed; may be null + MaskPosition *MaskPosition `json:"mask_position"` + // Sticker thumbnail in WEBP or JPEG format; may be null + Thumbnail *PhotoSize `json:"thumbnail"` + // File containing the sticker + Sticker *File `json:"sticker"` +} + +func (entity *Sticker) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Sticker + + return json.Marshal((*stub)(entity)) +} + +func (*Sticker) GetClass() string { + return ClassSticker +} + +func (*Sticker) GetType() string { + return TypeSticker +} + +// Describes a video file +type Video struct { + meta + // Duration of the video, in seconds; as defined by the sender + Duration int32 `json:"duration"` + // Video width; as defined by the sender + Width int32 `json:"width"` + // Video height; as defined by the sender + Height int32 `json:"height"` + // Original name of the file; as defined by the sender + FileName string `json:"file_name"` + // MIME type of the file; as defined by the sender + MimeType string `json:"mime_type"` + // True, if stickers were added to the photo + HasStickers bool `json:"has_stickers"` + // True, if the video should be tried to be streamed + SupportsStreaming bool `json:"supports_streaming"` + // Video thumbnail; as defined by the sender; may be null + Thumbnail *PhotoSize `json:"thumbnail"` + // File containing the video + Video *File `json:"video"` +} + +func (entity *Video) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Video + + return json.Marshal((*stub)(entity)) +} + +func (*Video) GetClass() string { + return ClassVideo +} + +func (*Video) GetType() string { + return TypeVideo +} + +// Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format +type VideoNote struct { + meta + // Duration of the video, in seconds; as defined by the sender + Duration int32 `json:"duration"` + // Video width and height; as defined by the sender + Length int32 `json:"length"` + // Video thumbnail; as defined by the sender; may be null + Thumbnail *PhotoSize `json:"thumbnail"` + // File containing the video + Video *File `json:"video"` +} + +func (entity *VideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub VideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*VideoNote) GetClass() string { + return ClassVideoNote +} + +func (*VideoNote) GetType() string { + return TypeVideoNote +} + +// Describes a voice note. The voice note must be encoded with the Opus codec, and stored inside an OGG container. Voice notes can have only a single audio channel +type VoiceNote struct { + meta + // Duration of the voice note, in seconds; as defined by the sender + Duration int32 `json:"duration"` + // A waveform representation of the voice note in 5-bit format + Waveform []byte `json:"waveform"` + // MIME type of the file; as defined by the sender + MimeType string `json:"mime_type"` + // File containing the voice note + Voice *File `json:"voice"` +} + +func (entity *VoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub VoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*VoiceNote) GetClass() string { + return ClassVoiceNote +} + +func (*VoiceNote) GetType() string { + return TypeVoiceNote +} + +// Describes a user contact +type Contact struct { + meta + // Phone number of the user + PhoneNumber string `json:"phone_number"` + // First name of the user; 1-255 characters in length + FirstName string `json:"first_name"` + // Last name of the user + LastName string `json:"last_name"` + // Identifier of the user, if known; otherwise 0 + UserId int32 `json:"user_id"` +} + +func (entity *Contact) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Contact + + return json.Marshal((*stub)(entity)) +} + +func (*Contact) GetClass() string { + return ClassContact +} + +func (*Contact) GetType() string { + return TypeContact +} + +// Describes a location on planet Earth +type Location struct { + meta + // Latitude of the location in degrees; as defined by the sender + Latitude float64 `json:"latitude"` + // Longitude of the location, in degrees; as defined by the sender + Longitude float64 `json:"longitude"` +} + +func (entity *Location) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Location + + return json.Marshal((*stub)(entity)) +} + +func (*Location) GetClass() string { + return ClassLocation +} + +func (*Location) GetType() string { + return TypeLocation +} + +// Describes a venue +type Venue struct { + meta + // Venue location; as defined by the sender + Location *Location `json:"location"` + // Venue name; as defined by the sender + Title string `json:"title"` + // Venue address; as defined by the sender + Address string `json:"address"` + // Provider of the venue database; as defined by the sender. Currently only "foursquare" needs to be supported + Provider string `json:"provider"` + // Identifier of the venue in the provider database; as defined by the sender + Id string `json:"id"` +} + +func (entity *Venue) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Venue + + return json.Marshal((*stub)(entity)) +} + +func (*Venue) GetClass() string { + return ClassVenue +} + +func (*Venue) GetType() string { + return TypeVenue +} + +// Describes a game +type Game struct { + meta + // Game ID + Id JsonInt64 `json:"id"` + // Game short name. To share a game use the URL https://t.me/{bot_username}?game={game_short_name} + ShortName string `json:"short_name"` + // Game title + Title string `json:"title"` + // Game text, usually containing scoreboards for a game + Text *FormattedText `json:"text"` + // Game description + Description string `json:"description"` + // Game photo + Photo *Photo `json:"photo"` + // Game animation; may be null + Animation *Animation `json:"animation"` +} + +func (entity *Game) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Game + + return json.Marshal((*stub)(entity)) +} + +func (*Game) GetClass() string { + return ClassGame +} + +func (*Game) GetType() string { + return TypeGame +} + +// Describes a user profile photo +type ProfilePhoto struct { + meta + // Photo identifier; 0 for an empty photo. Can be used to find a photo in a list of userProfilePhotos + Id JsonInt64 `json:"id"` + // A small (160x160) user profile photo + Small *File `json:"small"` + // A big (640x640) user profile photo + Big *File `json:"big"` +} + +func (entity *ProfilePhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ProfilePhoto + + return json.Marshal((*stub)(entity)) +} + +func (*ProfilePhoto) GetClass() string { + return ClassProfilePhoto +} + +func (*ProfilePhoto) GetType() string { + return TypeProfilePhoto +} + +// Describes the photo of a chat +type ChatPhoto struct { + meta + // A small (160x160) chat photo + Small *File `json:"small"` + // A big (640x640) chat photo + Big *File `json:"big"` +} + +func (entity *ChatPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*ChatPhoto) GetClass() string { + return ClassChatPhoto +} + +func (*ChatPhoto) GetType() string { + return TypeChatPhoto +} + +// The phone number of user A is not known to user B +type LinkStateNone struct{ + meta +} + +func (entity *LinkStateNone) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub LinkStateNone + + return json.Marshal((*stub)(entity)) +} + +func (*LinkStateNone) GetClass() string { + return ClassLinkState +} + +func (*LinkStateNone) GetType() string { + return TypeLinkStateNone +} + +func (*LinkStateNone) LinkStateType() string { + return TypeLinkStateNone +} + +// The phone number of user A is known but that number has not been saved to the contacts list of user B +type LinkStateKnowsPhoneNumber struct{ + meta +} + +func (entity *LinkStateKnowsPhoneNumber) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub LinkStateKnowsPhoneNumber + + return json.Marshal((*stub)(entity)) +} + +func (*LinkStateKnowsPhoneNumber) GetClass() string { + return ClassLinkState +} + +func (*LinkStateKnowsPhoneNumber) GetType() string { + return TypeLinkStateKnowsPhoneNumber +} + +func (*LinkStateKnowsPhoneNumber) LinkStateType() string { + return TypeLinkStateKnowsPhoneNumber +} + +// The phone number of user A has been saved to the contacts list of user B +type LinkStateIsContact struct{ + meta +} + +func (entity *LinkStateIsContact) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub LinkStateIsContact + + return json.Marshal((*stub)(entity)) +} + +func (*LinkStateIsContact) GetClass() string { + return ClassLinkState +} + +func (*LinkStateIsContact) GetType() string { + return TypeLinkStateIsContact +} + +func (*LinkStateIsContact) LinkStateType() string { + return TypeLinkStateIsContact +} + +// A regular user +type UserTypeRegular struct{ + meta +} + +func (entity *UserTypeRegular) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserTypeRegular + + return json.Marshal((*stub)(entity)) +} + +func (*UserTypeRegular) GetClass() string { + return ClassUserType +} + +func (*UserTypeRegular) GetType() string { + return TypeUserTypeRegular +} + +func (*UserTypeRegular) UserTypeType() string { + return TypeUserTypeRegular +} + +// A deleted user or deleted bot. No information on the user besides the user_id is available. It is not possible to perform any active actions on this type of user +type UserTypeDeleted struct{ + meta +} + +func (entity *UserTypeDeleted) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserTypeDeleted + + return json.Marshal((*stub)(entity)) +} + +func (*UserTypeDeleted) GetClass() string { + return ClassUserType +} + +func (*UserTypeDeleted) GetType() string { + return TypeUserTypeDeleted +} + +func (*UserTypeDeleted) UserTypeType() string { + return TypeUserTypeDeleted +} + +// A bot (see https://core.telegram.org/bots) +type UserTypeBot struct { + meta + // True, if the bot can be invited to basic group and supergroup chats + CanJoinGroups bool `json:"can_join_groups"` + // True, if the bot can read all messages in basic group or supergroup chats and not just those addressed to the bot. In private and channel chats a bot can always read all messages + CanReadAllGroupMessages bool `json:"can_read_all_group_messages"` + // True, if the bot supports inline queries + IsInline bool `json:"is_inline"` + // Placeholder for inline queries (displayed on the client input field) + InlineQueryPlaceholder string `json:"inline_query_placeholder"` + // True, if the location of the user should be sent with every inline query to this bot + NeedLocation bool `json:"need_location"` +} + +func (entity *UserTypeBot) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserTypeBot + + return json.Marshal((*stub)(entity)) +} + +func (*UserTypeBot) GetClass() string { + return ClassUserType +} + +func (*UserTypeBot) GetType() string { + return TypeUserTypeBot +} + +func (*UserTypeBot) UserTypeType() string { + return TypeUserTypeBot +} + +// No information on the user besides the user_id is available, yet this user has not been deleted. This object is extremely rare and must be handled like a deleted user. It is not possible to perform any actions on users of this type +type UserTypeUnknown struct{ + meta +} + +func (entity *UserTypeUnknown) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserTypeUnknown + + return json.Marshal((*stub)(entity)) +} + +func (*UserTypeUnknown) GetClass() string { + return ClassUserType +} + +func (*UserTypeUnknown) GetType() string { + return TypeUserTypeUnknown +} + +func (*UserTypeUnknown) UserTypeType() string { + return TypeUserTypeUnknown +} + +// Represents commands supported by a bot +type BotCommand struct { + meta + // Text of the bot command + Command string `json:"command"` + // Description of the bot command + Description string `json:"description"` +} + +func (entity *BotCommand) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub BotCommand + + return json.Marshal((*stub)(entity)) +} + +func (*BotCommand) GetClass() string { + return ClassBotCommand +} + +func (*BotCommand) GetType() string { + return TypeBotCommand +} + +// Provides information about a bot and its supported commands +type BotInfo struct { + meta + // Long description shown on the user info page + Description string `json:"description"` + // A list of commands supported by the bot + Commands []*BotCommand `json:"commands"` +} + +func (entity *BotInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub BotInfo + + return json.Marshal((*stub)(entity)) +} + +func (*BotInfo) GetClass() string { + return ClassBotInfo +} + +func (*BotInfo) GetType() string { + return TypeBotInfo +} + +// Represents a user +type User struct { + meta + // User identifier + Id int32 `json:"id"` + // First name of the user + FirstName string `json:"first_name"` + // Last name of the user + LastName string `json:"last_name"` + // Username of the user + Username string `json:"username"` + // Phone number of the user + PhoneNumber string `json:"phone_number"` + // Current online status of the user + Status UserStatus `json:"status"` + // Profile photo of the user; may be null + ProfilePhoto *ProfilePhoto `json:"profile_photo"` + // Relationship from the current user to the other user + OutgoingLink LinkState `json:"outgoing_link"` + // Relationship from the other user to the current user + IncomingLink LinkState `json:"incoming_link"` + // True, if the user is verified + IsVerified bool `json:"is_verified"` + // If non-empty, it contains the reason why access to this user must be restricted. The format of the string is "{type}: {description}". {type} contains the type of the restriction and at least one of the suffixes "-all", "-ios", "-android", or "-wp", which describe the platforms on which access should be restricted. (For example, "terms-ios-android". {description} contains a human-readable description of the restriction, which can be shown to the user) + RestrictionReason string `json:"restriction_reason"` + // If false, the user is inaccessible, and the only information known about the user is inside this class. It can't be passed to any method except GetUser + HaveAccess bool `json:"have_access"` + // Type of the user + Type UserType `json:"type"` + // IETF language tag of the user's language; only available to bots + LanguageCode string `json:"language_code"` +} + +func (entity *User) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub User + + return json.Marshal((*stub)(entity)) +} + +func (*User) GetClass() string { + return ClassUser +} + +func (*User) GetType() string { + return TypeUser +} + +func (user *User) UnmarshalJSON(data []byte) error { + var tmp struct { + Id int32 `json:"id"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Username string `json:"username"` + PhoneNumber string `json:"phone_number"` + Status json.RawMessage `json:"status"` + ProfilePhoto *ProfilePhoto `json:"profile_photo"` + OutgoingLink json.RawMessage `json:"outgoing_link"` + IncomingLink json.RawMessage `json:"incoming_link"` + IsVerified bool `json:"is_verified"` + RestrictionReason string `json:"restriction_reason"` + HaveAccess bool `json:"have_access"` + Type json.RawMessage `json:"type"` + LanguageCode string `json:"language_code"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + user.Id = tmp.Id + user.FirstName = tmp.FirstName + user.LastName = tmp.LastName + user.Username = tmp.Username + user.PhoneNumber = tmp.PhoneNumber + user.ProfilePhoto = tmp.ProfilePhoto + user.IsVerified = tmp.IsVerified + user.RestrictionReason = tmp.RestrictionReason + user.HaveAccess = tmp.HaveAccess + user.LanguageCode = tmp.LanguageCode + + fieldStatus, _ := UnmarshalUserStatus(tmp.Status) + user.Status = fieldStatus + + fieldOutgoingLink, _ := UnmarshalLinkState(tmp.OutgoingLink) + user.OutgoingLink = fieldOutgoingLink + + fieldIncomingLink, _ := UnmarshalLinkState(tmp.IncomingLink) + user.IncomingLink = fieldIncomingLink + + fieldType, _ := UnmarshalUserType(tmp.Type) + user.Type = fieldType + + return nil +} + +// Contains full information about a user (except the full list of profile photos) +type UserFullInfo struct { + meta + // True, if the user is blacklisted by the current user + IsBlocked bool `json:"is_blocked"` + // True, if the user can be called + CanBeCalled bool `json:"can_be_called"` + // True, if the user can't be called due to their privacy settings + HasPrivateCalls bool `json:"has_private_calls"` + // A short user bio + Bio string `json:"bio"` + // For bots, the text that is included with the link when users share the bot + ShareText string `json:"share_text"` + // Number of group chats where both the other user and the current user are a member; 0 for the current user + GroupInCommonCount int32 `json:"group_in_common_count"` + // If the user is a bot, information about the bot; may be null + BotInfo *BotInfo `json:"bot_info"` +} + +func (entity *UserFullInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserFullInfo + + return json.Marshal((*stub)(entity)) +} + +func (*UserFullInfo) GetClass() string { + return ClassUserFullInfo +} + +func (*UserFullInfo) GetType() string { + return TypeUserFullInfo +} + +// Contains part of the list of user photos +type UserProfilePhotos struct { + meta + // Total number of user profile photos + TotalCount int32 `json:"total_count"` + // A list of photos + Photos []*Photo `json:"photos"` +} + +func (entity *UserProfilePhotos) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserProfilePhotos + + return json.Marshal((*stub)(entity)) +} + +func (*UserProfilePhotos) GetClass() string { + return ClassUserProfilePhotos +} + +func (*UserProfilePhotos) GetType() string { + return TypeUserProfilePhotos +} + +// Represents a list of users +type Users struct { + meta + // Approximate total count of users found + TotalCount int32 `json:"total_count"` + // A list of user identifiers + UserIds []int32 `json:"user_ids"` +} + +func (entity *Users) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Users + + return json.Marshal((*stub)(entity)) +} + +func (*Users) GetClass() string { + return ClassUsers +} + +func (*Users) GetType() string { + return TypeUsers +} + +// The user is the creator of a chat and has all the administrator privileges +type ChatMemberStatusCreator struct { + meta + // True, if the user is a member of the chat + IsMember bool `json:"is_member"` +} + +func (entity *ChatMemberStatusCreator) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMemberStatusCreator + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMemberStatusCreator) GetClass() string { + return ClassChatMemberStatus +} + +func (*ChatMemberStatusCreator) GetType() string { + return TypeChatMemberStatusCreator +} + +func (*ChatMemberStatusCreator) ChatMemberStatusType() string { + return TypeChatMemberStatusCreator +} + +// The user is a member of a chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, and ban unprivileged members. In supergroups and channels, there are more detailed options for administrator privileges +type ChatMemberStatusAdministrator struct { + meta + // True, if the current user can edit the administrator privileges for the called user + CanBeEdited bool `json:"can_be_edited"` + // True, if the administrator can change the chat title, photo, and other settings + CanChangeInfo bool `json:"can_change_info"` + // True, if the administrator can create channel posts; applicable to channels only + CanPostMessages bool `json:"can_post_messages"` + // True, if the administrator can edit messages of other users and pin messages; applicable to channels only + CanEditMessages bool `json:"can_edit_messages"` + // True, if the administrator can delete messages of other users + CanDeleteMessages bool `json:"can_delete_messages"` + // True, if the administrator can invite new users to the chat + CanInviteUsers bool `json:"can_invite_users"` + // True, if the administrator can restrict, ban, or unban chat members + CanRestrictMembers bool `json:"can_restrict_members"` + // True, if the administrator can pin messages; applicable to supergroups only + CanPinMessages bool `json:"can_pin_messages"` + // True, if the administrator can add new administrators with a subset of his own privileges or demote administrators that were directly or indirectly promoted by him + CanPromoteMembers bool `json:"can_promote_members"` +} + +func (entity *ChatMemberStatusAdministrator) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMemberStatusAdministrator + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMemberStatusAdministrator) GetClass() string { + return ClassChatMemberStatus +} + +func (*ChatMemberStatusAdministrator) GetType() string { + return TypeChatMemberStatusAdministrator +} + +func (*ChatMemberStatusAdministrator) ChatMemberStatusType() string { + return TypeChatMemberStatusAdministrator +} + +// The user is a member of a chat, without any additional privileges or restrictions +type ChatMemberStatusMember struct{ + meta +} + +func (entity *ChatMemberStatusMember) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMemberStatusMember + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMemberStatusMember) GetClass() string { + return ClassChatMemberStatus +} + +func (*ChatMemberStatusMember) GetType() string { + return TypeChatMemberStatusMember +} + +func (*ChatMemberStatusMember) ChatMemberStatusType() string { + return TypeChatMemberStatusMember +} + +// The user is under certain restrictions in the chat. Not supported in basic groups and channels +type ChatMemberStatusRestricted struct { + meta + // True, if the user is a member of the chat + IsMember bool `json:"is_member"` + // Point in time (Unix timestamp) when restrictions will be lifted from the user; 0 if never. If the user is restricted for more than 366 days or for less than 30 seconds from the current time, the user is considered to be restricted forever + RestrictedUntilDate int32 `json:"restricted_until_date"` + // True, if the user can send text messages, contacts, locations, and venues + CanSendMessages bool `json:"can_send_messages"` + // True, if the user can send audio files, documents, photos, videos, video notes, and voice notes. Implies can_send_messages permissions + CanSendMediaMessages bool `json:"can_send_media_messages"` + // True, if the user can send animations, games, and stickers and use inline bots. Implies can_send_media_messages permissions + CanSendOtherMessages bool `json:"can_send_other_messages"` + // True, if the user may add a web page preview to his messages. Implies can_send_messages permissions + CanAddWebPagePreviews bool `json:"can_add_web_page_previews"` +} + +func (entity *ChatMemberStatusRestricted) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMemberStatusRestricted + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMemberStatusRestricted) GetClass() string { + return ClassChatMemberStatus +} + +func (*ChatMemberStatusRestricted) GetType() string { + return TypeChatMemberStatusRestricted +} + +func (*ChatMemberStatusRestricted) ChatMemberStatusType() string { + return TypeChatMemberStatusRestricted +} + +// The user is not a chat member +type ChatMemberStatusLeft struct{ + meta +} + +func (entity *ChatMemberStatusLeft) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMemberStatusLeft + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMemberStatusLeft) GetClass() string { + return ClassChatMemberStatus +} + +func (*ChatMemberStatusLeft) GetType() string { + return TypeChatMemberStatusLeft +} + +func (*ChatMemberStatusLeft) ChatMemberStatusType() string { + return TypeChatMemberStatusLeft +} + +// The user was banned (and hence is not a member of the chat). Implies the user can't return to the chat or view messages +type ChatMemberStatusBanned struct { + meta + // Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever + BannedUntilDate int32 `json:"banned_until_date"` +} + +func (entity *ChatMemberStatusBanned) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMemberStatusBanned + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMemberStatusBanned) GetClass() string { + return ClassChatMemberStatus +} + +func (*ChatMemberStatusBanned) GetType() string { + return TypeChatMemberStatusBanned +} + +func (*ChatMemberStatusBanned) ChatMemberStatusType() string { + return TypeChatMemberStatusBanned +} + +// A user with information about joining/leaving a chat +type ChatMember struct { + meta + // User identifier of the chat member + UserId int32 `json:"user_id"` + // Identifier of a user that invited/promoted/banned this member in the chat; 0 if unknown + InviterUserId int32 `json:"inviter_user_id"` + // Point in time (Unix timestamp) when the user joined a chat + JoinedChatDate int32 `json:"joined_chat_date"` + // Status of the member in the chat + Status ChatMemberStatus `json:"status"` + // If the user is a bot, information about the bot; may be null. Can be null even for a bot if the bot is not a chat member + BotInfo *BotInfo `json:"bot_info"` +} + +func (entity *ChatMember) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMember + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMember) GetClass() string { + return ClassChatMember +} + +func (*ChatMember) GetType() string { + return TypeChatMember +} + +func (chatMember *ChatMember) UnmarshalJSON(data []byte) error { + var tmp struct { + UserId int32 `json:"user_id"` + InviterUserId int32 `json:"inviter_user_id"` + JoinedChatDate int32 `json:"joined_chat_date"` + Status json.RawMessage `json:"status"` + BotInfo *BotInfo `json:"bot_info"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + chatMember.UserId = tmp.UserId + chatMember.InviterUserId = tmp.InviterUserId + chatMember.JoinedChatDate = tmp.JoinedChatDate + chatMember.BotInfo = tmp.BotInfo + + fieldStatus, _ := UnmarshalChatMemberStatus(tmp.Status) + chatMember.Status = fieldStatus + + return nil +} + +// Contains a list of chat members +type ChatMembers struct { + meta + // Approximate total count of chat members found + TotalCount int32 `json:"total_count"` + // A list of chat members + Members []*ChatMember `json:"members"` +} + +func (entity *ChatMembers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatMembers + + return json.Marshal((*stub)(entity)) +} + +func (*ChatMembers) GetClass() string { + return ClassChatMembers +} + +func (*ChatMembers) GetType() string { + return TypeChatMembers +} + +// Returns recently active users in reverse chronological order +type SupergroupMembersFilterRecent struct{ + meta +} + +func (entity *SupergroupMembersFilterRecent) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SupergroupMembersFilterRecent + + return json.Marshal((*stub)(entity)) +} + +func (*SupergroupMembersFilterRecent) GetClass() string { + return ClassSupergroupMembersFilter +} + +func (*SupergroupMembersFilterRecent) GetType() string { + return TypeSupergroupMembersFilterRecent +} + +func (*SupergroupMembersFilterRecent) SupergroupMembersFilterType() string { + return TypeSupergroupMembersFilterRecent +} + +// Returns the creator and administrators +type SupergroupMembersFilterAdministrators struct{ + meta +} + +func (entity *SupergroupMembersFilterAdministrators) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SupergroupMembersFilterAdministrators + + return json.Marshal((*stub)(entity)) +} + +func (*SupergroupMembersFilterAdministrators) GetClass() string { + return ClassSupergroupMembersFilter +} + +func (*SupergroupMembersFilterAdministrators) GetType() string { + return TypeSupergroupMembersFilterAdministrators +} + +func (*SupergroupMembersFilterAdministrators) SupergroupMembersFilterType() string { + return TypeSupergroupMembersFilterAdministrators +} + +// Used to search for supergroup or channel members via a (string) query +type SupergroupMembersFilterSearch struct { + meta + // Query to search for + Query string `json:"query"` +} + +func (entity *SupergroupMembersFilterSearch) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SupergroupMembersFilterSearch + + return json.Marshal((*stub)(entity)) +} + +func (*SupergroupMembersFilterSearch) GetClass() string { + return ClassSupergroupMembersFilter +} + +func (*SupergroupMembersFilterSearch) GetType() string { + return TypeSupergroupMembersFilterSearch +} + +func (*SupergroupMembersFilterSearch) SupergroupMembersFilterType() string { + return TypeSupergroupMembersFilterSearch +} + +// Returns restricted supergroup members; can be used only by administrators +type SupergroupMembersFilterRestricted struct { + meta + // Query to search for + Query string `json:"query"` +} + +func (entity *SupergroupMembersFilterRestricted) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SupergroupMembersFilterRestricted + + return json.Marshal((*stub)(entity)) +} + +func (*SupergroupMembersFilterRestricted) GetClass() string { + return ClassSupergroupMembersFilter +} + +func (*SupergroupMembersFilterRestricted) GetType() string { + return TypeSupergroupMembersFilterRestricted +} + +func (*SupergroupMembersFilterRestricted) SupergroupMembersFilterType() string { + return TypeSupergroupMembersFilterRestricted +} + +// Returns users banned from the supergroup or channel; can be used only by administrators +type SupergroupMembersFilterBanned struct { + meta + // Query to search for + Query string `json:"query"` +} + +func (entity *SupergroupMembersFilterBanned) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SupergroupMembersFilterBanned + + return json.Marshal((*stub)(entity)) +} + +func (*SupergroupMembersFilterBanned) GetClass() string { + return ClassSupergroupMembersFilter +} + +func (*SupergroupMembersFilterBanned) GetType() string { + return TypeSupergroupMembersFilterBanned +} + +func (*SupergroupMembersFilterBanned) SupergroupMembersFilterType() string { + return TypeSupergroupMembersFilterBanned +} + +// Returns bot members of the supergroup or channel +type SupergroupMembersFilterBots struct{ + meta +} + +func (entity *SupergroupMembersFilterBots) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SupergroupMembersFilterBots + + return json.Marshal((*stub)(entity)) +} + +func (*SupergroupMembersFilterBots) GetClass() string { + return ClassSupergroupMembersFilter +} + +func (*SupergroupMembersFilterBots) GetType() string { + return TypeSupergroupMembersFilterBots +} + +func (*SupergroupMembersFilterBots) SupergroupMembersFilterType() string { + return TypeSupergroupMembersFilterBots +} + +// Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users) +type BasicGroup struct { + meta + // Group identifier + Id int32 `json:"id"` + // Number of members in the group + MemberCount int32 `json:"member_count"` + // Status of the current user in the group + Status ChatMemberStatus `json:"status"` + // True, if all members have been granted administrator rights in the group + EveryoneIsAdministrator bool `json:"everyone_is_administrator"` + // True, if the group is active + IsActive bool `json:"is_active"` + // Identifier of the supergroup to which this group was upgraded; 0 if none + UpgradedToSupergroupId int32 `json:"upgraded_to_supergroup_id"` +} + +func (entity *BasicGroup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub BasicGroup + + return json.Marshal((*stub)(entity)) +} + +func (*BasicGroup) GetClass() string { + return ClassBasicGroup +} + +func (*BasicGroup) GetType() string { + return TypeBasicGroup +} + +func (basicGroup *BasicGroup) UnmarshalJSON(data []byte) error { + var tmp struct { + Id int32 `json:"id"` + MemberCount int32 `json:"member_count"` + Status json.RawMessage `json:"status"` + EveryoneIsAdministrator bool `json:"everyone_is_administrator"` + IsActive bool `json:"is_active"` + UpgradedToSupergroupId int32 `json:"upgraded_to_supergroup_id"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + basicGroup.Id = tmp.Id + basicGroup.MemberCount = tmp.MemberCount + basicGroup.EveryoneIsAdministrator = tmp.EveryoneIsAdministrator + basicGroup.IsActive = tmp.IsActive + basicGroup.UpgradedToSupergroupId = tmp.UpgradedToSupergroupId + + fieldStatus, _ := UnmarshalChatMemberStatus(tmp.Status) + basicGroup.Status = fieldStatus + + return nil +} + +// Contains full information about a basic group +type BasicGroupFullInfo struct { + meta + // User identifier of the creator of the group; 0 if unknown + CreatorUserId int32 `json:"creator_user_id"` + // Group members + Members []*ChatMember `json:"members"` + // Invite link for this group; available only for the group creator and only after it has been generated at least once + InviteLink string `json:"invite_link"` +} + +func (entity *BasicGroupFullInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub BasicGroupFullInfo + + return json.Marshal((*stub)(entity)) +} + +func (*BasicGroupFullInfo) GetClass() string { + return ClassBasicGroupFullInfo +} + +func (*BasicGroupFullInfo) GetType() string { + return TypeBasicGroupFullInfo +} + +// Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers +type Supergroup struct { + meta + // Supergroup or channel identifier + Id int32 `json:"id"` + // Username of the supergroup or channel; empty for private supergroups or channels + Username string `json:"username"` + // Point in time (Unix timestamp) when the current user joined, or the point in time when the supergroup or channel was created, in case the user is not a member + Date int32 `json:"date"` + // Status of the current user in the supergroup or channel + Status ChatMemberStatus `json:"status"` + // Member count; 0 if unknown. Currently it is guaranteed to be known only if the supergroup or channel was found through SearchPublicChats + MemberCount int32 `json:"member_count"` + // True, if any member of the supergroup can invite other members. This field has no meaning for channels + AnyoneCanInvite bool `json:"anyone_can_invite"` + // True, if messages sent to the channel should contain information about the sender. This field is only applicable to channels + SignMessages bool `json:"sign_messages"` + // True, if the supergroup is a channel + IsChannel bool `json:"is_channel"` + // True, if the supergroup or channel is verified + IsVerified bool `json:"is_verified"` + // If non-empty, contains the reason why access to this supergroup or channel must be restricted. Format of the string is "{type}: {description}". {type} Contains the type of the restriction and at least one of the suffixes "-all", "-ios", "-android", or "-wp", which describe the platforms on which access should be restricted. (For example, "terms-ios-android". {description} contains a human-readable description of the restriction, which can be shown to the user) + RestrictionReason string `json:"restriction_reason"` +} + +func (entity *Supergroup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Supergroup + + return json.Marshal((*stub)(entity)) +} + +func (*Supergroup) GetClass() string { + return ClassSupergroup +} + +func (*Supergroup) GetType() string { + return TypeSupergroup +} + +func (supergroup *Supergroup) UnmarshalJSON(data []byte) error { + var tmp struct { + Id int32 `json:"id"` + Username string `json:"username"` + Date int32 `json:"date"` + Status json.RawMessage `json:"status"` + MemberCount int32 `json:"member_count"` + AnyoneCanInvite bool `json:"anyone_can_invite"` + SignMessages bool `json:"sign_messages"` + IsChannel bool `json:"is_channel"` + IsVerified bool `json:"is_verified"` + RestrictionReason string `json:"restriction_reason"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + supergroup.Id = tmp.Id + supergroup.Username = tmp.Username + supergroup.Date = tmp.Date + supergroup.MemberCount = tmp.MemberCount + supergroup.AnyoneCanInvite = tmp.AnyoneCanInvite + supergroup.SignMessages = tmp.SignMessages + supergroup.IsChannel = tmp.IsChannel + supergroup.IsVerified = tmp.IsVerified + supergroup.RestrictionReason = tmp.RestrictionReason + + fieldStatus, _ := UnmarshalChatMemberStatus(tmp.Status) + supergroup.Status = fieldStatus + + return nil +} + +// Contains full information about a supergroup or channel +type SupergroupFullInfo struct { + meta + // Supergroup or channel description + Description string `json:"description"` + // Number of members in the supergroup or channel; 0 if unknown + MemberCount int32 `json:"member_count"` + // Number of privileged users in the supergroup or channel; 0 if unknown + AdministratorCount int32 `json:"administrator_count"` + // Number of restricted users in the supergroup; 0 if unknown + RestrictedCount int32 `json:"restricted_count"` + // Number of users banned from chat; 0 if unknown + BannedCount int32 `json:"banned_count"` + // True, if members of the chat can be retrieved + CanGetMembers bool `json:"can_get_members"` + // True, if the chat can be made public + CanSetUsername bool `json:"can_set_username"` + // True, if the supergroup sticker set can be changed + CanSetStickerSet bool `json:"can_set_sticker_set"` + // True, if new chat members will have access to old messages. In public supergroups and both public and private channels, old messages are always available, so this option affects only private supergroups. The value of this field is only available for chat administrators + IsAllHistoryAvailable bool `json:"is_all_history_available"` + // Identifier of the supergroup sticker set; 0 if none + StickerSetId JsonInt64 `json:"sticker_set_id"` + // Invite link for this chat + InviteLink string `json:"invite_link"` + // Identifier of the pinned message in the chat; 0 if none + PinnedMessageId int64 `json:"pinned_message_id"` + // Identifier of the basic group from which supergroup was upgraded; 0 if none + UpgradedFromBasicGroupId int32 `json:"upgraded_from_basic_group_id"` + // Identifier of the last message in the basic group from which supergroup was upgraded; 0 if none + UpgradedFromMaxMessageId int64 `json:"upgraded_from_max_message_id"` +} + +func (entity *SupergroupFullInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SupergroupFullInfo + + return json.Marshal((*stub)(entity)) +} + +func (*SupergroupFullInfo) GetClass() string { + return ClassSupergroupFullInfo +} + +func (*SupergroupFullInfo) GetType() string { + return TypeSupergroupFullInfo +} + +// The secret chat is not yet created; waiting for the other user to get online +type SecretChatStatePending struct{ + meta +} + +func (entity *SecretChatStatePending) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SecretChatStatePending + + return json.Marshal((*stub)(entity)) +} + +func (*SecretChatStatePending) GetClass() string { + return ClassSecretChatState +} + +func (*SecretChatStatePending) GetType() string { + return TypeSecretChatStatePending +} + +func (*SecretChatStatePending) SecretChatStateType() string { + return TypeSecretChatStatePending +} + +// The secret chat is ready to use +type SecretChatStateReady struct{ + meta +} + +func (entity *SecretChatStateReady) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SecretChatStateReady + + return json.Marshal((*stub)(entity)) +} + +func (*SecretChatStateReady) GetClass() string { + return ClassSecretChatState +} + +func (*SecretChatStateReady) GetType() string { + return TypeSecretChatStateReady +} + +func (*SecretChatStateReady) SecretChatStateType() string { + return TypeSecretChatStateReady +} + +// The secret chat is closed +type SecretChatStateClosed struct{ + meta +} + +func (entity *SecretChatStateClosed) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SecretChatStateClosed + + return json.Marshal((*stub)(entity)) +} + +func (*SecretChatStateClosed) GetClass() string { + return ClassSecretChatState +} + +func (*SecretChatStateClosed) GetType() string { + return TypeSecretChatStateClosed +} + +func (*SecretChatStateClosed) SecretChatStateType() string { + return TypeSecretChatStateClosed +} + +// Represents a secret chat +type SecretChat struct { + meta + // Secret chat identifier + Id int32 `json:"id"` + // Identifier of the chat partner + UserId int32 `json:"user_id"` + // State of the secret chat + State SecretChatState `json:"state"` + // True, if the chat was created by the current user; otherwise false + IsOutbound bool `json:"is_outbound"` + // Current message Time To Live setting (self-destruct timer) for the chat, in seconds + Ttl int32 `json:"ttl"` + // Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 bytes, which must be used to make a 12x12 square image with a color depth of 4. The first 16 bytes should be used to make a central 8x8 square, while the remaining 20 bytes should be used to construct a 2-pixel-wide border around that square. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers + KeyHash []byte `json:"key_hash"` + // Secret chat layer; determines features supported by the other client. Video notes are supported if the layer >= 66 + Layer int32 `json:"layer"` +} + +func (entity *SecretChat) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SecretChat + + return json.Marshal((*stub)(entity)) +} + +func (*SecretChat) GetClass() string { + return ClassSecretChat +} + +func (*SecretChat) GetType() string { + return TypeSecretChat +} + +func (secretChat *SecretChat) UnmarshalJSON(data []byte) error { + var tmp struct { + Id int32 `json:"id"` + UserId int32 `json:"user_id"` + State json.RawMessage `json:"state"` + IsOutbound bool `json:"is_outbound"` + Ttl int32 `json:"ttl"` + KeyHash []byte `json:"key_hash"` + Layer int32 `json:"layer"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + secretChat.Id = tmp.Id + secretChat.UserId = tmp.UserId + secretChat.IsOutbound = tmp.IsOutbound + secretChat.Ttl = tmp.Ttl + secretChat.KeyHash = tmp.KeyHash + secretChat.Layer = tmp.Layer + + fieldState, _ := UnmarshalSecretChatState(tmp.State) + secretChat.State = fieldState + + return nil +} + +// The message was originally written by a known user +type MessageForwardedFromUser struct { + meta + // Identifier of the user that originally sent this message + SenderUserId int32 `json:"sender_user_id"` + // Point in time (Unix timestamp) when the message was originally sent + Date int32 `json:"date"` + // For messages forwarded to the chat with the current user (saved messages), the identifier of the chat from which the message was forwarded; 0 if unknown + ForwardedFromChatId int64 `json:"forwarded_from_chat_id"` + // For messages forwarded to the chat with the current user (saved messages) the identifier of the original message from which the new message was forwarded; 0 if unknown + ForwardedFromMessageId int64 `json:"forwarded_from_message_id"` +} + +func (entity *MessageForwardedFromUser) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageForwardedFromUser + + return json.Marshal((*stub)(entity)) +} + +func (*MessageForwardedFromUser) GetClass() string { + return ClassMessageForwardInfo +} + +func (*MessageForwardedFromUser) GetType() string { + return TypeMessageForwardedFromUser +} + +func (*MessageForwardedFromUser) MessageForwardInfoType() string { + return TypeMessageForwardedFromUser +} + +// The message was originally a post in a channel +type MessageForwardedPost struct { + meta + // Identifier of the chat from which the message was forwarded + ChatId int64 `json:"chat_id"` + // Post author signature + AuthorSignature string `json:"author_signature"` + // Point in time (Unix timestamp) when the message was originally sent + Date int32 `json:"date"` + // Message identifier of the original message from which the new message was forwarded; 0 if unknown + MessageId int64 `json:"message_id"` + // For messages forwarded to the chat with the current user (saved messages), the identifier of the chat from which the message was forwarded; 0 if unknown + ForwardedFromChatId int64 `json:"forwarded_from_chat_id"` + // For messages forwarded to the chat with the current user (saved messages), the identifier of the original message from which the new message was forwarded; 0 if unknown + ForwardedFromMessageId int64 `json:"forwarded_from_message_id"` +} + +func (entity *MessageForwardedPost) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageForwardedPost + + return json.Marshal((*stub)(entity)) +} + +func (*MessageForwardedPost) GetClass() string { + return ClassMessageForwardInfo +} + +func (*MessageForwardedPost) GetType() string { + return TypeMessageForwardedPost +} + +func (*MessageForwardedPost) MessageForwardInfoType() string { + return TypeMessageForwardedPost +} + +// The message is being sent now, but has not yet been delivered to the server +type MessageSendingStatePending struct{ + meta +} + +func (entity *MessageSendingStatePending) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageSendingStatePending + + return json.Marshal((*stub)(entity)) +} + +func (*MessageSendingStatePending) GetClass() string { + return ClassMessageSendingState +} + +func (*MessageSendingStatePending) GetType() string { + return TypeMessageSendingStatePending +} + +func (*MessageSendingStatePending) MessageSendingStateType() string { + return TypeMessageSendingStatePending +} + +// The message failed to be sent +type MessageSendingStateFailed struct{ + meta +} + +func (entity *MessageSendingStateFailed) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageSendingStateFailed + + return json.Marshal((*stub)(entity)) +} + +func (*MessageSendingStateFailed) GetClass() string { + return ClassMessageSendingState +} + +func (*MessageSendingStateFailed) GetType() string { + return TypeMessageSendingStateFailed +} + +func (*MessageSendingStateFailed) MessageSendingStateType() string { + return TypeMessageSendingStateFailed +} + +// Describes a message +type Message struct { + meta + // Unique message identifier + Id int64 `json:"id"` + // Identifier of the user who sent the message; 0 if unknown. It is unknown for channel posts + SenderUserId int32 `json:"sender_user_id"` + // Chat identifier + ChatId int64 `json:"chat_id"` + // Information about the sending state of the message; may be null + SendingState MessageSendingState `json:"sending_state"` + // True, if the message is outgoing + IsOutgoing bool `json:"is_outgoing"` + // True, if the message can be edited + CanBeEdited bool `json:"can_be_edited"` + // True, if the message can be forwarded + CanBeForwarded bool `json:"can_be_forwarded"` + // True, if the message can be deleted only for the current user while other users will continue to see it + CanBeDeletedOnlyForSelf bool `json:"can_be_deleted_only_for_self"` + // True, if the message can be deleted for all users + CanBeDeletedForAllUsers bool `json:"can_be_deleted_for_all_users"` + // True, if the message is a channel post. All messages to channels are channel posts, all other messages are not channel posts + IsChannelPost bool `json:"is_channel_post"` + // True, if the message contains an unread mention for the current user + ContainsUnreadMention bool `json:"contains_unread_mention"` + // Point in time (Unix timestamp) when the message was sent + Date int32 `json:"date"` + // Point in time (Unix timestamp) when the message was last edited + EditDate int32 `json:"edit_date"` + // Information about the initial message sender; may be null + ForwardInfo MessageForwardInfo `json:"forward_info"` + // If non-zero, the identifier of the message this message is replying to; can be the identifier of a deleted message + ReplyToMessageId int64 `json:"reply_to_message_id"` + // For self-destructing messages, the message's TTL (Time To Live), in seconds; 0 if none. TDLib will send updateDeleteMessages or updateMessageContent once the TTL expires + Ttl int32 `json:"ttl"` + // Time left before the message expires, in seconds + TtlExpiresIn float64 `json:"ttl_expires_in"` + // If non-zero, the user identifier of the bot through which this message was sent + ViaBotUserId int32 `json:"via_bot_user_id"` + // For channel posts, optional author signature + AuthorSignature string `json:"author_signature"` + // Number of times this message was viewed + Views int32 `json:"views"` + // Unique identifier of an album this message belongs to. Only photos and videos can be grouped together in albums + MediaAlbumId JsonInt64 `json:"media_album_id"` + // Content of the message + Content MessageContent `json:"content"` + // Reply markup for the message; may be null + ReplyMarkup ReplyMarkup `json:"reply_markup"` +} + +func (entity *Message) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Message + + return json.Marshal((*stub)(entity)) +} + +func (*Message) GetClass() string { + return ClassMessage +} + +func (*Message) GetType() string { + return TypeMessage +} + +func (message *Message) UnmarshalJSON(data []byte) error { + var tmp struct { + Id int64 `json:"id"` + SenderUserId int32 `json:"sender_user_id"` + ChatId int64 `json:"chat_id"` + SendingState json.RawMessage `json:"sending_state"` + IsOutgoing bool `json:"is_outgoing"` + CanBeEdited bool `json:"can_be_edited"` + CanBeForwarded bool `json:"can_be_forwarded"` + CanBeDeletedOnlyForSelf bool `json:"can_be_deleted_only_for_self"` + CanBeDeletedForAllUsers bool `json:"can_be_deleted_for_all_users"` + IsChannelPost bool `json:"is_channel_post"` + ContainsUnreadMention bool `json:"contains_unread_mention"` + Date int32 `json:"date"` + EditDate int32 `json:"edit_date"` + ForwardInfo json.RawMessage `json:"forward_info"` + ReplyToMessageId int64 `json:"reply_to_message_id"` + Ttl int32 `json:"ttl"` + TtlExpiresIn float64 `json:"ttl_expires_in"` + ViaBotUserId int32 `json:"via_bot_user_id"` + AuthorSignature string `json:"author_signature"` + Views int32 `json:"views"` + MediaAlbumId JsonInt64 `json:"media_album_id"` + Content json.RawMessage `json:"content"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + message.Id = tmp.Id + message.SenderUserId = tmp.SenderUserId + message.ChatId = tmp.ChatId + message.IsOutgoing = tmp.IsOutgoing + message.CanBeEdited = tmp.CanBeEdited + message.CanBeForwarded = tmp.CanBeForwarded + message.CanBeDeletedOnlyForSelf = tmp.CanBeDeletedOnlyForSelf + message.CanBeDeletedForAllUsers = tmp.CanBeDeletedForAllUsers + message.IsChannelPost = tmp.IsChannelPost + message.ContainsUnreadMention = tmp.ContainsUnreadMention + message.Date = tmp.Date + message.EditDate = tmp.EditDate + message.ReplyToMessageId = tmp.ReplyToMessageId + message.Ttl = tmp.Ttl + message.TtlExpiresIn = tmp.TtlExpiresIn + message.ViaBotUserId = tmp.ViaBotUserId + message.AuthorSignature = tmp.AuthorSignature + message.Views = tmp.Views + message.MediaAlbumId = tmp.MediaAlbumId + + fieldSendingState, _ := UnmarshalMessageSendingState(tmp.SendingState) + message.SendingState = fieldSendingState + + fieldForwardInfo, _ := UnmarshalMessageForwardInfo(tmp.ForwardInfo) + message.ForwardInfo = fieldForwardInfo + + fieldContent, _ := UnmarshalMessageContent(tmp.Content) + message.Content = fieldContent + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + message.ReplyMarkup = fieldReplyMarkup + + return nil +} + +// Contains a list of messages +type Messages struct { + meta + // Approximate total count of messages found + TotalCount int32 `json:"total_count"` + // List of messages; messages may be null + Messages []*Message `json:"messages"` +} + +func (entity *Messages) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Messages + + return json.Marshal((*stub)(entity)) +} + +func (*Messages) GetClass() string { + return ClassMessages +} + +func (*Messages) GetType() string { + return TypeMessages +} + +// Contains a list of messages found by a search +type FoundMessages struct { + meta + // List of messages + Messages []*Message `json:"messages"` + // Value to pass as from_search_id to get more results + NextFromSearchId JsonInt64 `json:"next_from_search_id"` +} + +func (entity *FoundMessages) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FoundMessages + + return json.Marshal((*stub)(entity)) +} + +func (*FoundMessages) GetClass() string { + return ClassFoundMessages +} + +func (*FoundMessages) GetType() string { + return TypeFoundMessages +} + +// Notification settings applied to a particular chat +type NotificationSettingsScopeChat struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` +} + +func (entity *NotificationSettingsScopeChat) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NotificationSettingsScopeChat + + return json.Marshal((*stub)(entity)) +} + +func (*NotificationSettingsScopeChat) GetClass() string { + return ClassNotificationSettingsScope +} + +func (*NotificationSettingsScopeChat) GetType() string { + return TypeNotificationSettingsScopeChat +} + +func (*NotificationSettingsScopeChat) NotificationSettingsScopeType() string { + return TypeNotificationSettingsScopeChat +} + +// Notification settings applied to all private chats +type NotificationSettingsScopePrivateChats struct{ + meta +} + +func (entity *NotificationSettingsScopePrivateChats) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NotificationSettingsScopePrivateChats + + return json.Marshal((*stub)(entity)) +} + +func (*NotificationSettingsScopePrivateChats) GetClass() string { + return ClassNotificationSettingsScope +} + +func (*NotificationSettingsScopePrivateChats) GetType() string { + return TypeNotificationSettingsScopePrivateChats +} + +func (*NotificationSettingsScopePrivateChats) NotificationSettingsScopeType() string { + return TypeNotificationSettingsScopePrivateChats +} + +// Notification settings applied to all basic groups and channels. (Supergroups have no common settings) +type NotificationSettingsScopeBasicGroupChats struct{ + meta +} + +func (entity *NotificationSettingsScopeBasicGroupChats) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NotificationSettingsScopeBasicGroupChats + + return json.Marshal((*stub)(entity)) +} + +func (*NotificationSettingsScopeBasicGroupChats) GetClass() string { + return ClassNotificationSettingsScope +} + +func (*NotificationSettingsScopeBasicGroupChats) GetType() string { + return TypeNotificationSettingsScopeBasicGroupChats +} + +func (*NotificationSettingsScopeBasicGroupChats) NotificationSettingsScopeType() string { + return TypeNotificationSettingsScopeBasicGroupChats +} + +// Notification settings applied to all chats +type NotificationSettingsScopeAllChats struct{ + meta +} + +func (entity *NotificationSettingsScopeAllChats) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NotificationSettingsScopeAllChats + + return json.Marshal((*stub)(entity)) +} + +func (*NotificationSettingsScopeAllChats) GetClass() string { + return ClassNotificationSettingsScope +} + +func (*NotificationSettingsScopeAllChats) GetType() string { + return TypeNotificationSettingsScopeAllChats +} + +func (*NotificationSettingsScopeAllChats) NotificationSettingsScopeType() string { + return TypeNotificationSettingsScopeAllChats +} + +// Contains information about notification settings for a chat or several chats +type NotificationSettings struct { + meta + // Time left before notifications will be unmuted, in seconds + MuteFor int32 `json:"mute_for"` + // An audio file name for notification sounds; only applies to iOS applications + Sound string `json:"sound"` + // True, if message content should be displayed in notifications + ShowPreview bool `json:"show_preview"` +} + +func (entity *NotificationSettings) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NotificationSettings + + return json.Marshal((*stub)(entity)) +} + +func (*NotificationSettings) GetClass() string { + return ClassNotificationSettings +} + +func (*NotificationSettings) GetType() string { + return TypeNotificationSettings +} + +// Contains information about a message draft +type DraftMessage struct { + meta + // Identifier of the message to reply to; 0 if none + ReplyToMessageId int64 `json:"reply_to_message_id"` + // Content of the message draft; this should always be of type inputMessageText + InputMessageText InputMessageContent `json:"input_message_text"` +} + +func (entity *DraftMessage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DraftMessage + + return json.Marshal((*stub)(entity)) +} + +func (*DraftMessage) GetClass() string { + return ClassDraftMessage +} + +func (*DraftMessage) GetType() string { + return TypeDraftMessage +} + +func (draftMessage *DraftMessage) UnmarshalJSON(data []byte) error { + var tmp struct { + ReplyToMessageId int64 `json:"reply_to_message_id"` + InputMessageText json.RawMessage `json:"input_message_text"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + draftMessage.ReplyToMessageId = tmp.ReplyToMessageId + + fieldInputMessageText, _ := UnmarshalInputMessageContent(tmp.InputMessageText) + draftMessage.InputMessageText = fieldInputMessageText + + return nil +} + +// An ordinary chat with a user +type ChatTypePrivate struct { + meta + // User identifier + UserId int32 `json:"user_id"` +} + +func (entity *ChatTypePrivate) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatTypePrivate + + return json.Marshal((*stub)(entity)) +} + +func (*ChatTypePrivate) GetClass() string { + return ClassChatType +} + +func (*ChatTypePrivate) GetType() string { + return TypeChatTypePrivate +} + +func (*ChatTypePrivate) ChatTypeType() string { + return TypeChatTypePrivate +} + +// A basic group (i.e., a chat with 0-200 other users) +type ChatTypeBasicGroup struct { + meta + // Basic group identifier + BasicGroupId int32 `json:"basic_group_id"` +} + +func (entity *ChatTypeBasicGroup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatTypeBasicGroup + + return json.Marshal((*stub)(entity)) +} + +func (*ChatTypeBasicGroup) GetClass() string { + return ClassChatType +} + +func (*ChatTypeBasicGroup) GetType() string { + return TypeChatTypeBasicGroup +} + +func (*ChatTypeBasicGroup) ChatTypeType() string { + return TypeChatTypeBasicGroup +} + +// A supergroup (i.e. a chat with up to GetOption("supergroup_max_size") other users), or channel (with unlimited members) +type ChatTypeSupergroup struct { + meta + // Supergroup or channel identifier + SupergroupId int32 `json:"supergroup_id"` + // True, if the supergroup is a channel + IsChannel bool `json:"is_channel"` +} + +func (entity *ChatTypeSupergroup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatTypeSupergroup + + return json.Marshal((*stub)(entity)) +} + +func (*ChatTypeSupergroup) GetClass() string { + return ClassChatType +} + +func (*ChatTypeSupergroup) GetType() string { + return TypeChatTypeSupergroup +} + +func (*ChatTypeSupergroup) ChatTypeType() string { + return TypeChatTypeSupergroup +} + +// A secret chat with a user +type ChatTypeSecret struct { + meta + // Secret chat identifier + SecretChatId int32 `json:"secret_chat_id"` + // User identifier of the secret chat peer + UserId int32 `json:"user_id"` +} + +func (entity *ChatTypeSecret) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatTypeSecret + + return json.Marshal((*stub)(entity)) +} + +func (*ChatTypeSecret) GetClass() string { + return ClassChatType +} + +func (*ChatTypeSecret) GetType() string { + return TypeChatTypeSecret +} + +func (*ChatTypeSecret) ChatTypeType() string { + return TypeChatTypeSecret +} + +// A chat. (Can be a private chat, basic group, supergroup, or secret chat) +type Chat struct { + meta + // Chat unique identifier + Id int64 `json:"id"` + // Type of the chat + Type ChatType `json:"type"` + // Chat title + Title string `json:"title"` + // Chat photo; may be null + Photo *ChatPhoto `json:"photo"` + // Last message in the chat; may be null + LastMessage *Message `json:"last_message"` + // Descending parameter by which chats are sorted in the main chat list. If the order number of two chats is the same, they must be sorted in descending order by ID. If 0, the position of the chat in the list is undetermined + Order JsonInt64 `json:"order"` + // True, if the chat is pinned + IsPinned bool `json:"is_pinned"` + // True, if the chat can be reported to Telegram moderators through reportChat + CanBeReported bool `json:"can_be_reported"` + // Number of unread messages in the chat + UnreadCount int32 `json:"unread_count"` + // Identifier of the last read incoming message + LastReadInboxMessageId int64 `json:"last_read_inbox_message_id"` + // Identifier of the last read outgoing message + LastReadOutboxMessageId int64 `json:"last_read_outbox_message_id"` + // Number of unread messages with a mention/reply in the chat + UnreadMentionCount int32 `json:"unread_mention_count"` + // Notification settings for this chat + NotificationSettings *NotificationSettings `json:"notification_settings"` + // Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat + ReplyMarkupMessageId int64 `json:"reply_markup_message_id"` + // A draft of a message in the chat; may be null + DraftMessage *DraftMessage `json:"draft_message"` + // Contains client-specific data associated with the chat. (For example, the chat position or local chat notification settings can be stored here.) Persistent if a message database is used + ClientData string `json:"client_data"` +} + +func (entity *Chat) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Chat + + return json.Marshal((*stub)(entity)) +} + +func (*Chat) GetClass() string { + return ClassChat +} + +func (*Chat) GetType() string { + return TypeChat +} + +func (chat *Chat) UnmarshalJSON(data []byte) error { + var tmp struct { + Id int64 `json:"id"` + Type json.RawMessage `json:"type"` + Title string `json:"title"` + Photo *ChatPhoto `json:"photo"` + LastMessage *Message `json:"last_message"` + Order JsonInt64 `json:"order"` + IsPinned bool `json:"is_pinned"` + CanBeReported bool `json:"can_be_reported"` + UnreadCount int32 `json:"unread_count"` + LastReadInboxMessageId int64 `json:"last_read_inbox_message_id"` + LastReadOutboxMessageId int64 `json:"last_read_outbox_message_id"` + UnreadMentionCount int32 `json:"unread_mention_count"` + NotificationSettings *NotificationSettings `json:"notification_settings"` + ReplyMarkupMessageId int64 `json:"reply_markup_message_id"` + DraftMessage *DraftMessage `json:"draft_message"` + ClientData string `json:"client_data"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + chat.Id = tmp.Id + chat.Title = tmp.Title + chat.Photo = tmp.Photo + chat.LastMessage = tmp.LastMessage + chat.Order = tmp.Order + chat.IsPinned = tmp.IsPinned + chat.CanBeReported = tmp.CanBeReported + chat.UnreadCount = tmp.UnreadCount + chat.LastReadInboxMessageId = tmp.LastReadInboxMessageId + chat.LastReadOutboxMessageId = tmp.LastReadOutboxMessageId + chat.UnreadMentionCount = tmp.UnreadMentionCount + chat.NotificationSettings = tmp.NotificationSettings + chat.ReplyMarkupMessageId = tmp.ReplyMarkupMessageId + chat.DraftMessage = tmp.DraftMessage + chat.ClientData = tmp.ClientData + + fieldType, _ := UnmarshalChatType(tmp.Type) + chat.Type = fieldType + + return nil +} + +// Represents a list of chats +type Chats struct { + meta + // List of chat identifiers + ChatIds []int64 `json:"chat_ids"` +} + +func (entity *Chats) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Chats + + return json.Marshal((*stub)(entity)) +} + +func (*Chats) GetClass() string { + return ClassChats +} + +func (*Chats) GetType() string { + return TypeChats +} + +// Contains a chat invite link +type ChatInviteLink struct { + meta + // Chat invite link + InviteLink string `json:"invite_link"` +} + +func (entity *ChatInviteLink) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatInviteLink + + return json.Marshal((*stub)(entity)) +} + +func (*ChatInviteLink) GetClass() string { + return ClassChatInviteLink +} + +func (*ChatInviteLink) GetType() string { + return TypeChatInviteLink +} + +// Contains information about a chat invite link +type ChatInviteLinkInfo struct { + meta + // Chat identifier of the invite link; 0 if the user is not a member of this chat + ChatId int64 `json:"chat_id"` + // Contains information about the type of the chat + Type ChatType `json:"type"` + // Title of the chat + Title string `json:"title"` + // Chat photo; may be null + Photo *ChatPhoto `json:"photo"` + // Number of members + MemberCount int32 `json:"member_count"` + // User identifiers of some chat members that may be known to the current user + MemberUserIds []int32 `json:"member_user_ids"` + // True, if the chat is a public supergroup or channel with a username + IsPublic bool `json:"is_public"` +} + +func (entity *ChatInviteLinkInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatInviteLinkInfo + + return json.Marshal((*stub)(entity)) +} + +func (*ChatInviteLinkInfo) GetClass() string { + return ClassChatInviteLinkInfo +} + +func (*ChatInviteLinkInfo) GetType() string { + return TypeChatInviteLinkInfo +} + +func (chatInviteLinkInfo *ChatInviteLinkInfo) UnmarshalJSON(data []byte) error { + var tmp struct { + ChatId int64 `json:"chat_id"` + Type json.RawMessage `json:"type"` + Title string `json:"title"` + Photo *ChatPhoto `json:"photo"` + MemberCount int32 `json:"member_count"` + MemberUserIds []int32 `json:"member_user_ids"` + IsPublic bool `json:"is_public"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + chatInviteLinkInfo.ChatId = tmp.ChatId + chatInviteLinkInfo.Title = tmp.Title + chatInviteLinkInfo.Photo = tmp.Photo + chatInviteLinkInfo.MemberCount = tmp.MemberCount + chatInviteLinkInfo.MemberUserIds = tmp.MemberUserIds + chatInviteLinkInfo.IsPublic = tmp.IsPublic + + fieldType, _ := UnmarshalChatType(tmp.Type) + chatInviteLinkInfo.Type = fieldType + + return nil +} + +// A simple button, with text that should be sent when the button is pressed +type KeyboardButtonTypeText struct{ + meta +} + +func (entity *KeyboardButtonTypeText) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub KeyboardButtonTypeText + + return json.Marshal((*stub)(entity)) +} + +func (*KeyboardButtonTypeText) GetClass() string { + return ClassKeyboardButtonType +} + +func (*KeyboardButtonTypeText) GetType() string { + return TypeKeyboardButtonTypeText +} + +func (*KeyboardButtonTypeText) KeyboardButtonTypeType() string { + return TypeKeyboardButtonTypeText +} + +// A button that sends the user's phone number when pressed; available only in private chats +type KeyboardButtonTypeRequestPhoneNumber struct{ + meta +} + +func (entity *KeyboardButtonTypeRequestPhoneNumber) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub KeyboardButtonTypeRequestPhoneNumber + + return json.Marshal((*stub)(entity)) +} + +func (*KeyboardButtonTypeRequestPhoneNumber) GetClass() string { + return ClassKeyboardButtonType +} + +func (*KeyboardButtonTypeRequestPhoneNumber) GetType() string { + return TypeKeyboardButtonTypeRequestPhoneNumber +} + +func (*KeyboardButtonTypeRequestPhoneNumber) KeyboardButtonTypeType() string { + return TypeKeyboardButtonTypeRequestPhoneNumber +} + +// A button that sends the user's location when pressed; available only in private chats +type KeyboardButtonTypeRequestLocation struct{ + meta +} + +func (entity *KeyboardButtonTypeRequestLocation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub KeyboardButtonTypeRequestLocation + + return json.Marshal((*stub)(entity)) +} + +func (*KeyboardButtonTypeRequestLocation) GetClass() string { + return ClassKeyboardButtonType +} + +func (*KeyboardButtonTypeRequestLocation) GetType() string { + return TypeKeyboardButtonTypeRequestLocation +} + +func (*KeyboardButtonTypeRequestLocation) KeyboardButtonTypeType() string { + return TypeKeyboardButtonTypeRequestLocation +} + +// Represents a single button in a bot keyboard +type KeyboardButton struct { + meta + // Text of the button + Text string `json:"text"` + // Type of the button + Type KeyboardButtonType `json:"type"` +} + +func (entity *KeyboardButton) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub KeyboardButton + + return json.Marshal((*stub)(entity)) +} + +func (*KeyboardButton) GetClass() string { + return ClassKeyboardButton +} + +func (*KeyboardButton) GetType() string { + return TypeKeyboardButton +} + +func (keyboardButton *KeyboardButton) UnmarshalJSON(data []byte) error { + var tmp struct { + Text string `json:"text"` + Type json.RawMessage `json:"type"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + keyboardButton.Text = tmp.Text + + fieldType, _ := UnmarshalKeyboardButtonType(tmp.Type) + keyboardButton.Type = fieldType + + return nil +} + +// A button that opens a specified URL +type InlineKeyboardButtonTypeUrl struct { + meta + // URL to open + Url string `json:"url"` +} + +func (entity *InlineKeyboardButtonTypeUrl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineKeyboardButtonTypeUrl + + return json.Marshal((*stub)(entity)) +} + +func (*InlineKeyboardButtonTypeUrl) GetClass() string { + return ClassInlineKeyboardButtonType +} + +func (*InlineKeyboardButtonTypeUrl) GetType() string { + return TypeInlineKeyboardButtonTypeUrl +} + +func (*InlineKeyboardButtonTypeUrl) InlineKeyboardButtonTypeType() string { + return TypeInlineKeyboardButtonTypeUrl +} + +// A button that sends a special callback query to a bot +type InlineKeyboardButtonTypeCallback struct { + meta + // Data to be sent to the bot via a callback query + Data []byte `json:"data"` +} + +func (entity *InlineKeyboardButtonTypeCallback) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineKeyboardButtonTypeCallback + + return json.Marshal((*stub)(entity)) +} + +func (*InlineKeyboardButtonTypeCallback) GetClass() string { + return ClassInlineKeyboardButtonType +} + +func (*InlineKeyboardButtonTypeCallback) GetType() string { + return TypeInlineKeyboardButtonTypeCallback +} + +func (*InlineKeyboardButtonTypeCallback) InlineKeyboardButtonTypeType() string { + return TypeInlineKeyboardButtonTypeCallback +} + +// A button with a game that sends a special callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame +type InlineKeyboardButtonTypeCallbackGame struct{ + meta +} + +func (entity *InlineKeyboardButtonTypeCallbackGame) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineKeyboardButtonTypeCallbackGame + + return json.Marshal((*stub)(entity)) +} + +func (*InlineKeyboardButtonTypeCallbackGame) GetClass() string { + return ClassInlineKeyboardButtonType +} + +func (*InlineKeyboardButtonTypeCallbackGame) GetType() string { + return TypeInlineKeyboardButtonTypeCallbackGame +} + +func (*InlineKeyboardButtonTypeCallbackGame) InlineKeyboardButtonTypeType() string { + return TypeInlineKeyboardButtonTypeCallbackGame +} + +// A button that forces an inline query to the bot to be inserted in the input field +type InlineKeyboardButtonTypeSwitchInline struct { + meta + // Inline query to be sent to the bot + Query string `json:"query"` + // True, if the inline query should be sent from the current chat + InCurrentChat bool `json:"in_current_chat"` +} + +func (entity *InlineKeyboardButtonTypeSwitchInline) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineKeyboardButtonTypeSwitchInline + + return json.Marshal((*stub)(entity)) +} + +func (*InlineKeyboardButtonTypeSwitchInline) GetClass() string { + return ClassInlineKeyboardButtonType +} + +func (*InlineKeyboardButtonTypeSwitchInline) GetType() string { + return TypeInlineKeyboardButtonTypeSwitchInline +} + +func (*InlineKeyboardButtonTypeSwitchInline) InlineKeyboardButtonTypeType() string { + return TypeInlineKeyboardButtonTypeSwitchInline +} + +// A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice +type InlineKeyboardButtonTypeBuy struct{ + meta +} + +func (entity *InlineKeyboardButtonTypeBuy) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineKeyboardButtonTypeBuy + + return json.Marshal((*stub)(entity)) +} + +func (*InlineKeyboardButtonTypeBuy) GetClass() string { + return ClassInlineKeyboardButtonType +} + +func (*InlineKeyboardButtonTypeBuy) GetType() string { + return TypeInlineKeyboardButtonTypeBuy +} + +func (*InlineKeyboardButtonTypeBuy) InlineKeyboardButtonTypeType() string { + return TypeInlineKeyboardButtonTypeBuy +} + +// Represents a single button in an inline keyboard +type InlineKeyboardButton struct { + meta + // Text of the button + Text string `json:"text"` + // Type of the button + Type InlineKeyboardButtonType `json:"type"` +} + +func (entity *InlineKeyboardButton) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineKeyboardButton + + return json.Marshal((*stub)(entity)) +} + +func (*InlineKeyboardButton) GetClass() string { + return ClassInlineKeyboardButton +} + +func (*InlineKeyboardButton) GetType() string { + return TypeInlineKeyboardButton +} + +func (inlineKeyboardButton *InlineKeyboardButton) UnmarshalJSON(data []byte) error { + var tmp struct { + Text string `json:"text"` + Type json.RawMessage `json:"type"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inlineKeyboardButton.Text = tmp.Text + + fieldType, _ := UnmarshalInlineKeyboardButtonType(tmp.Type) + inlineKeyboardButton.Type = fieldType + + return nil +} + +// Instructs clients to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, UpdateChatReplyMarkup with message_id == 0 will be sent +type ReplyMarkupRemoveKeyboard struct { + meta + // True, if the keyboard is removed only for the mentioned users or the target user of a reply + IsPersonal bool `json:"is_personal"` +} + +func (entity *ReplyMarkupRemoveKeyboard) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ReplyMarkupRemoveKeyboard + + return json.Marshal((*stub)(entity)) +} + +func (*ReplyMarkupRemoveKeyboard) GetClass() string { + return ClassReplyMarkup +} + +func (*ReplyMarkupRemoveKeyboard) GetType() string { + return TypeReplyMarkupRemoveKeyboard +} + +func (*ReplyMarkupRemoveKeyboard) ReplyMarkupType() string { + return TypeReplyMarkupRemoveKeyboard +} + +// Instructs clients to force a reply to this message +type ReplyMarkupForceReply struct { + meta + // True, if a forced reply must automatically be shown to the current user. For outgoing messages, specify true to show the forced reply only for the mentioned users and for the target user of a reply + IsPersonal bool `json:"is_personal"` +} + +func (entity *ReplyMarkupForceReply) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ReplyMarkupForceReply + + return json.Marshal((*stub)(entity)) +} + +func (*ReplyMarkupForceReply) GetClass() string { + return ClassReplyMarkup +} + +func (*ReplyMarkupForceReply) GetType() string { + return TypeReplyMarkupForceReply +} + +func (*ReplyMarkupForceReply) ReplyMarkupType() string { + return TypeReplyMarkupForceReply +} + +// Contains a custom keyboard layout to quickly reply to bots +type ReplyMarkupShowKeyboard struct { + meta + // A list of rows of bot keyboard buttons + Rows [][]*KeyboardButton `json:"rows"` + // True, if the client needs to resize the keyboard vertically + ResizeKeyboard bool `json:"resize_keyboard"` + // True, if the client needs to hide the keyboard after use + OneTime bool `json:"one_time"` + // True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply + IsPersonal bool `json:"is_personal"` +} + +func (entity *ReplyMarkupShowKeyboard) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ReplyMarkupShowKeyboard + + return json.Marshal((*stub)(entity)) +} + +func (*ReplyMarkupShowKeyboard) GetClass() string { + return ClassReplyMarkup +} + +func (*ReplyMarkupShowKeyboard) GetType() string { + return TypeReplyMarkupShowKeyboard +} + +func (*ReplyMarkupShowKeyboard) ReplyMarkupType() string { + return TypeReplyMarkupShowKeyboard +} + +// Contains an inline keyboard layout +type ReplyMarkupInlineKeyboard struct { + meta + // A list of rows of inline keyboard buttons + Rows [][]*InlineKeyboardButton `json:"rows"` +} + +func (entity *ReplyMarkupInlineKeyboard) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ReplyMarkupInlineKeyboard + + return json.Marshal((*stub)(entity)) +} + +func (*ReplyMarkupInlineKeyboard) GetClass() string { + return ClassReplyMarkup +} + +func (*ReplyMarkupInlineKeyboard) GetType() string { + return TypeReplyMarkupInlineKeyboard +} + +func (*ReplyMarkupInlineKeyboard) ReplyMarkupType() string { + return TypeReplyMarkupInlineKeyboard +} + +// A plain text +type RichTextPlain struct { + meta + // Text + Text string `json:"text"` +} + +func (entity *RichTextPlain) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextPlain + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextPlain) GetClass() string { + return ClassRichText +} + +func (*RichTextPlain) GetType() string { + return TypeRichTextPlain +} + +func (*RichTextPlain) RichTextType() string { + return TypeRichTextPlain +} + +// A bold rich text +type RichTextBold struct { + meta + // Text + Text RichText `json:"text"` +} + +func (entity *RichTextBold) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextBold + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextBold) GetClass() string { + return ClassRichText +} + +func (*RichTextBold) GetType() string { + return TypeRichTextBold +} + +func (*RichTextBold) RichTextType() string { + return TypeRichTextBold +} + +func (richTextBold *RichTextBold) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + richTextBold.Text = fieldText + + return nil +} + +// An italicized rich text +type RichTextItalic struct { + meta + // Text + Text RichText `json:"text"` +} + +func (entity *RichTextItalic) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextItalic + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextItalic) GetClass() string { + return ClassRichText +} + +func (*RichTextItalic) GetType() string { + return TypeRichTextItalic +} + +func (*RichTextItalic) RichTextType() string { + return TypeRichTextItalic +} + +func (richTextItalic *RichTextItalic) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + richTextItalic.Text = fieldText + + return nil +} + +// An underlined rich text +type RichTextUnderline struct { + meta + // Text + Text RichText `json:"text"` +} + +func (entity *RichTextUnderline) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextUnderline + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextUnderline) GetClass() string { + return ClassRichText +} + +func (*RichTextUnderline) GetType() string { + return TypeRichTextUnderline +} + +func (*RichTextUnderline) RichTextType() string { + return TypeRichTextUnderline +} + +func (richTextUnderline *RichTextUnderline) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + richTextUnderline.Text = fieldText + + return nil +} + +// A strike-through rich text +type RichTextStrikethrough struct { + meta + // Text + Text RichText `json:"text"` +} + +func (entity *RichTextStrikethrough) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextStrikethrough + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextStrikethrough) GetClass() string { + return ClassRichText +} + +func (*RichTextStrikethrough) GetType() string { + return TypeRichTextStrikethrough +} + +func (*RichTextStrikethrough) RichTextType() string { + return TypeRichTextStrikethrough +} + +func (richTextStrikethrough *RichTextStrikethrough) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + richTextStrikethrough.Text = fieldText + + return nil +} + +// A fixed-width rich text +type RichTextFixed struct { + meta + // Text + Text RichText `json:"text"` +} + +func (entity *RichTextFixed) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextFixed + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextFixed) GetClass() string { + return ClassRichText +} + +func (*RichTextFixed) GetType() string { + return TypeRichTextFixed +} + +func (*RichTextFixed) RichTextType() string { + return TypeRichTextFixed +} + +func (richTextFixed *RichTextFixed) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + richTextFixed.Text = fieldText + + return nil +} + +// A rich text URL link +type RichTextUrl struct { + meta + // Text + Text RichText `json:"text"` + // URL + Url string `json:"url"` +} + +func (entity *RichTextUrl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextUrl + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextUrl) GetClass() string { + return ClassRichText +} + +func (*RichTextUrl) GetType() string { + return TypeRichTextUrl +} + +func (*RichTextUrl) RichTextType() string { + return TypeRichTextUrl +} + +func (richTextUrl *RichTextUrl) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + Url string `json:"url"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + richTextUrl.Url = tmp.Url + + fieldText, _ := UnmarshalRichText(tmp.Text) + richTextUrl.Text = fieldText + + return nil +} + +// A rich text email link +type RichTextEmailAddress struct { + meta + // Text + Text RichText `json:"text"` + // Email address + EmailAddress string `json:"email_address"` +} + +func (entity *RichTextEmailAddress) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTextEmailAddress + + return json.Marshal((*stub)(entity)) +} + +func (*RichTextEmailAddress) GetClass() string { + return ClassRichText +} + +func (*RichTextEmailAddress) GetType() string { + return TypeRichTextEmailAddress +} + +func (*RichTextEmailAddress) RichTextType() string { + return TypeRichTextEmailAddress +} + +func (richTextEmailAddress *RichTextEmailAddress) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + EmailAddress string `json:"email_address"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + richTextEmailAddress.EmailAddress = tmp.EmailAddress + + fieldText, _ := UnmarshalRichText(tmp.Text) + richTextEmailAddress.Text = fieldText + + return nil +} + +// A concatenation of rich texts +type RichTexts struct { + meta + // Texts + Texts []RichText `json:"texts"` +} + +func (entity *RichTexts) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub RichTexts + + return json.Marshal((*stub)(entity)) +} + +func (*RichTexts) GetClass() string { + return ClassRichText +} + +func (*RichTexts) GetType() string { + return TypeRichTexts +} + +func (*RichTexts) RichTextType() string { + return TypeRichTexts +} + +// The title of a page +type PageBlockTitle struct { + meta + // Title + Title RichText `json:"title"` +} + +func (entity *PageBlockTitle) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockTitle + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockTitle) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockTitle) GetType() string { + return TypePageBlockTitle +} + +func (*PageBlockTitle) PageBlockType() string { + return TypePageBlockTitle +} + +func (pageBlockTitle *PageBlockTitle) UnmarshalJSON(data []byte) error { + var tmp struct { + Title json.RawMessage `json:"title"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldTitle, _ := UnmarshalRichText(tmp.Title) + pageBlockTitle.Title = fieldTitle + + return nil +} + +// The subtitle of a page +type PageBlockSubtitle struct { + meta + // Subtitle + Subtitle RichText `json:"subtitle"` +} + +func (entity *PageBlockSubtitle) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockSubtitle + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockSubtitle) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockSubtitle) GetType() string { + return TypePageBlockSubtitle +} + +func (*PageBlockSubtitle) PageBlockType() string { + return TypePageBlockSubtitle +} + +func (pageBlockSubtitle *PageBlockSubtitle) UnmarshalJSON(data []byte) error { + var tmp struct { + Subtitle json.RawMessage `json:"subtitle"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldSubtitle, _ := UnmarshalRichText(tmp.Subtitle) + pageBlockSubtitle.Subtitle = fieldSubtitle + + return nil +} + +// The author and publishing date of a page +type PageBlockAuthorDate struct { + meta + // Author + Author RichText `json:"author"` + // Point in time (Unix timestamp) when the article was published; 0 if unknown + PublishDate int32 `json:"publish_date"` +} + +func (entity *PageBlockAuthorDate) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockAuthorDate + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockAuthorDate) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockAuthorDate) GetType() string { + return TypePageBlockAuthorDate +} + +func (*PageBlockAuthorDate) PageBlockType() string { + return TypePageBlockAuthorDate +} + +func (pageBlockAuthorDate *PageBlockAuthorDate) UnmarshalJSON(data []byte) error { + var tmp struct { + Author json.RawMessage `json:"author"` + PublishDate int32 `json:"publish_date"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockAuthorDate.PublishDate = tmp.PublishDate + + fieldAuthor, _ := UnmarshalRichText(tmp.Author) + pageBlockAuthorDate.Author = fieldAuthor + + return nil +} + +// A header +type PageBlockHeader struct { + meta + // Header + Header RichText `json:"header"` +} + +func (entity *PageBlockHeader) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockHeader + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockHeader) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockHeader) GetType() string { + return TypePageBlockHeader +} + +func (*PageBlockHeader) PageBlockType() string { + return TypePageBlockHeader +} + +func (pageBlockHeader *PageBlockHeader) UnmarshalJSON(data []byte) error { + var tmp struct { + Header json.RawMessage `json:"header"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldHeader, _ := UnmarshalRichText(tmp.Header) + pageBlockHeader.Header = fieldHeader + + return nil +} + +// A subheader +type PageBlockSubheader struct { + meta + // Subheader + Subheader RichText `json:"subheader"` +} + +func (entity *PageBlockSubheader) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockSubheader + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockSubheader) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockSubheader) GetType() string { + return TypePageBlockSubheader +} + +func (*PageBlockSubheader) PageBlockType() string { + return TypePageBlockSubheader +} + +func (pageBlockSubheader *PageBlockSubheader) UnmarshalJSON(data []byte) error { + var tmp struct { + Subheader json.RawMessage `json:"subheader"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldSubheader, _ := UnmarshalRichText(tmp.Subheader) + pageBlockSubheader.Subheader = fieldSubheader + + return nil +} + +// A text paragraph +type PageBlockParagraph struct { + meta + // Paragraph text + Text RichText `json:"text"` +} + +func (entity *PageBlockParagraph) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockParagraph + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockParagraph) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockParagraph) GetType() string { + return TypePageBlockParagraph +} + +func (*PageBlockParagraph) PageBlockType() string { + return TypePageBlockParagraph +} + +func (pageBlockParagraph *PageBlockParagraph) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + pageBlockParagraph.Text = fieldText + + return nil +} + +// A preformatted text paragraph +type PageBlockPreformatted struct { + meta + // Paragraph text + Text RichText `json:"text"` + // Programming language for which the text should be formatted + Language string `json:"language"` +} + +func (entity *PageBlockPreformatted) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockPreformatted + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockPreformatted) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockPreformatted) GetType() string { + return TypePageBlockPreformatted +} + +func (*PageBlockPreformatted) PageBlockType() string { + return TypePageBlockPreformatted +} + +func (pageBlockPreformatted *PageBlockPreformatted) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + Language string `json:"language"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockPreformatted.Language = tmp.Language + + fieldText, _ := UnmarshalRichText(tmp.Text) + pageBlockPreformatted.Text = fieldText + + return nil +} + +// The footer of a page +type PageBlockFooter struct { + meta + // Footer + Footer RichText `json:"footer"` +} + +func (entity *PageBlockFooter) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockFooter + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockFooter) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockFooter) GetType() string { + return TypePageBlockFooter +} + +func (*PageBlockFooter) PageBlockType() string { + return TypePageBlockFooter +} + +func (pageBlockFooter *PageBlockFooter) UnmarshalJSON(data []byte) error { + var tmp struct { + Footer json.RawMessage `json:"footer"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldFooter, _ := UnmarshalRichText(tmp.Footer) + pageBlockFooter.Footer = fieldFooter + + return nil +} + +// An empty block separating a page +type PageBlockDivider struct{ + meta +} + +func (entity *PageBlockDivider) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockDivider + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockDivider) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockDivider) GetType() string { + return TypePageBlockDivider +} + +func (*PageBlockDivider) PageBlockType() string { + return TypePageBlockDivider +} + +// An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor +type PageBlockAnchor struct { + meta + // Name of the anchor + Name string `json:"name"` +} + +func (entity *PageBlockAnchor) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockAnchor + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockAnchor) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockAnchor) GetType() string { + return TypePageBlockAnchor +} + +func (*PageBlockAnchor) PageBlockType() string { + return TypePageBlockAnchor +} + +// A list of texts +type PageBlockList struct { + meta + // Texts + Items []RichText `json:"items"` + // True, if the items should be marked with numbers + IsOrdered bool `json:"is_ordered"` +} + +func (entity *PageBlockList) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockList + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockList) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockList) GetType() string { + return TypePageBlockList +} + +func (*PageBlockList) PageBlockType() string { + return TypePageBlockList +} + +// A block quote +type PageBlockBlockQuote struct { + meta + // Quote text + Text RichText `json:"text"` + // Quote caption + Caption RichText `json:"caption"` +} + +func (entity *PageBlockBlockQuote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockBlockQuote + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockBlockQuote) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockBlockQuote) GetType() string { + return TypePageBlockBlockQuote +} + +func (*PageBlockBlockQuote) PageBlockType() string { + return TypePageBlockBlockQuote +} + +func (pageBlockBlockQuote *PageBlockBlockQuote) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + Caption json.RawMessage `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + pageBlockBlockQuote.Text = fieldText + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockBlockQuote.Caption = fieldCaption + + return nil +} + +// A pull quote +type PageBlockPullQuote struct { + meta + // Quote text + Text RichText `json:"text"` + // Quote caption + Caption RichText `json:"caption"` +} + +func (entity *PageBlockPullQuote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockPullQuote + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockPullQuote) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockPullQuote) GetType() string { + return TypePageBlockPullQuote +} + +func (*PageBlockPullQuote) PageBlockType() string { + return TypePageBlockPullQuote +} + +func (pageBlockPullQuote *PageBlockPullQuote) UnmarshalJSON(data []byte) error { + var tmp struct { + Text json.RawMessage `json:"text"` + Caption json.RawMessage `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldText, _ := UnmarshalRichText(tmp.Text) + pageBlockPullQuote.Text = fieldText + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockPullQuote.Caption = fieldCaption + + return nil +} + +// An animation +type PageBlockAnimation struct { + meta + // Animation file; may be null + Animation *Animation `json:"animation"` + // Animation caption + Caption RichText `json:"caption"` + // True, if the animation should be played automatically + NeedAutoplay bool `json:"need_autoplay"` +} + +func (entity *PageBlockAnimation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockAnimation + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockAnimation) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockAnimation) GetType() string { + return TypePageBlockAnimation +} + +func (*PageBlockAnimation) PageBlockType() string { + return TypePageBlockAnimation +} + +func (pageBlockAnimation *PageBlockAnimation) UnmarshalJSON(data []byte) error { + var tmp struct { + Animation *Animation `json:"animation"` + Caption json.RawMessage `json:"caption"` + NeedAutoplay bool `json:"need_autoplay"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockAnimation.Animation = tmp.Animation + pageBlockAnimation.NeedAutoplay = tmp.NeedAutoplay + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockAnimation.Caption = fieldCaption + + return nil +} + +// An audio file +type PageBlockAudio struct { + meta + // Audio file; may be null + Audio *Audio `json:"audio"` + // Audio file caption + Caption RichText `json:"caption"` +} + +func (entity *PageBlockAudio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockAudio + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockAudio) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockAudio) GetType() string { + return TypePageBlockAudio +} + +func (*PageBlockAudio) PageBlockType() string { + return TypePageBlockAudio +} + +func (pageBlockAudio *PageBlockAudio) UnmarshalJSON(data []byte) error { + var tmp struct { + Audio *Audio `json:"audio"` + Caption json.RawMessage `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockAudio.Audio = tmp.Audio + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockAudio.Caption = fieldCaption + + return nil +} + +// A photo +type PageBlockPhoto struct { + meta + // Photo file; may be null + Photo *Photo `json:"photo"` + // Photo caption + Caption RichText `json:"caption"` +} + +func (entity *PageBlockPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockPhoto) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockPhoto) GetType() string { + return TypePageBlockPhoto +} + +func (*PageBlockPhoto) PageBlockType() string { + return TypePageBlockPhoto +} + +func (pageBlockPhoto *PageBlockPhoto) UnmarshalJSON(data []byte) error { + var tmp struct { + Photo *Photo `json:"photo"` + Caption json.RawMessage `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockPhoto.Photo = tmp.Photo + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockPhoto.Caption = fieldCaption + + return nil +} + +// A video +type PageBlockVideo struct { + meta + // Video file; may be null + Video *Video `json:"video"` + // Video caption + Caption RichText `json:"caption"` + // True, if the video should be played automatically + NeedAutoplay bool `json:"need_autoplay"` + // True, if the video should be looped + IsLooped bool `json:"is_looped"` +} + +func (entity *PageBlockVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockVideo + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockVideo) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockVideo) GetType() string { + return TypePageBlockVideo +} + +func (*PageBlockVideo) PageBlockType() string { + return TypePageBlockVideo +} + +func (pageBlockVideo *PageBlockVideo) UnmarshalJSON(data []byte) error { + var tmp struct { + Video *Video `json:"video"` + Caption json.RawMessage `json:"caption"` + NeedAutoplay bool `json:"need_autoplay"` + IsLooped bool `json:"is_looped"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockVideo.Video = tmp.Video + pageBlockVideo.NeedAutoplay = tmp.NeedAutoplay + pageBlockVideo.IsLooped = tmp.IsLooped + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockVideo.Caption = fieldCaption + + return nil +} + +// A page cover +type PageBlockCover struct { + meta + // Cover + Cover PageBlock `json:"cover"` +} + +func (entity *PageBlockCover) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockCover + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockCover) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockCover) GetType() string { + return TypePageBlockCover +} + +func (*PageBlockCover) PageBlockType() string { + return TypePageBlockCover +} + +func (pageBlockCover *PageBlockCover) UnmarshalJSON(data []byte) error { + var tmp struct { + Cover json.RawMessage `json:"cover"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldCover, _ := UnmarshalPageBlock(tmp.Cover) + pageBlockCover.Cover = fieldCover + + return nil +} + +// An embedded web page +type PageBlockEmbedded struct { + meta + // Web page URL, if available + Url string `json:"url"` + // HTML-markup of the embedded page + Html string `json:"html"` + // Poster photo, if available; may be null + PosterPhoto *Photo `json:"poster_photo"` + // Block width + Width int32 `json:"width"` + // Block height + Height int32 `json:"height"` + // Block caption + Caption RichText `json:"caption"` + // True, if the block should be full width + IsFullWidth bool `json:"is_full_width"` + // True, if scrolling should be allowed + AllowScrolling bool `json:"allow_scrolling"` +} + +func (entity *PageBlockEmbedded) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockEmbedded + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockEmbedded) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockEmbedded) GetType() string { + return TypePageBlockEmbedded +} + +func (*PageBlockEmbedded) PageBlockType() string { + return TypePageBlockEmbedded +} + +func (pageBlockEmbedded *PageBlockEmbedded) UnmarshalJSON(data []byte) error { + var tmp struct { + Url string `json:"url"` + Html string `json:"html"` + PosterPhoto *Photo `json:"poster_photo"` + Width int32 `json:"width"` + Height int32 `json:"height"` + Caption json.RawMessage `json:"caption"` + IsFullWidth bool `json:"is_full_width"` + AllowScrolling bool `json:"allow_scrolling"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockEmbedded.Url = tmp.Url + pageBlockEmbedded.Html = tmp.Html + pageBlockEmbedded.PosterPhoto = tmp.PosterPhoto + pageBlockEmbedded.Width = tmp.Width + pageBlockEmbedded.Height = tmp.Height + pageBlockEmbedded.IsFullWidth = tmp.IsFullWidth + pageBlockEmbedded.AllowScrolling = tmp.AllowScrolling + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockEmbedded.Caption = fieldCaption + + return nil +} + +// An embedded post +type PageBlockEmbeddedPost struct { + meta + // Web page URL + Url string `json:"url"` + // Post author + Author string `json:"author"` + // Post author photo + AuthorPhoto *Photo `json:"author_photo"` + // Point in time (Unix timestamp) when the post was created; 0 if unknown + Date int32 `json:"date"` + // Post content + PageBlocks []PageBlock `json:"page_blocks"` + // Post caption + Caption RichText `json:"caption"` +} + +func (entity *PageBlockEmbeddedPost) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockEmbeddedPost + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockEmbeddedPost) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockEmbeddedPost) GetType() string { + return TypePageBlockEmbeddedPost +} + +func (*PageBlockEmbeddedPost) PageBlockType() string { + return TypePageBlockEmbeddedPost +} + +func (pageBlockEmbeddedPost *PageBlockEmbeddedPost) UnmarshalJSON(data []byte) error { + var tmp struct { + Url string `json:"url"` + Author string `json:"author"` + AuthorPhoto *Photo `json:"author_photo"` + Date int32 `json:"date"` + PageBlocks []PageBlock `json:"page_blocks"` + Caption json.RawMessage `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockEmbeddedPost.Url = tmp.Url + pageBlockEmbeddedPost.Author = tmp.Author + pageBlockEmbeddedPost.AuthorPhoto = tmp.AuthorPhoto + pageBlockEmbeddedPost.Date = tmp.Date + pageBlockEmbeddedPost.PageBlocks = tmp.PageBlocks + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockEmbeddedPost.Caption = fieldCaption + + return nil +} + +// A collage +type PageBlockCollage struct { + meta + // Collage item contents + PageBlocks []PageBlock `json:"page_blocks"` + // Block caption + Caption RichText `json:"caption"` +} + +func (entity *PageBlockCollage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockCollage + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockCollage) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockCollage) GetType() string { + return TypePageBlockCollage +} + +func (*PageBlockCollage) PageBlockType() string { + return TypePageBlockCollage +} + +func (pageBlockCollage *PageBlockCollage) UnmarshalJSON(data []byte) error { + var tmp struct { + PageBlocks []PageBlock `json:"page_blocks"` + Caption json.RawMessage `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockCollage.PageBlocks = tmp.PageBlocks + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockCollage.Caption = fieldCaption + + return nil +} + +// A slideshow +type PageBlockSlideshow struct { + meta + // Slideshow item contents + PageBlocks []PageBlock `json:"page_blocks"` + // Block caption + Caption RichText `json:"caption"` +} + +func (entity *PageBlockSlideshow) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockSlideshow + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockSlideshow) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockSlideshow) GetType() string { + return TypePageBlockSlideshow +} + +func (*PageBlockSlideshow) PageBlockType() string { + return TypePageBlockSlideshow +} + +func (pageBlockSlideshow *PageBlockSlideshow) UnmarshalJSON(data []byte) error { + var tmp struct { + PageBlocks []PageBlock `json:"page_blocks"` + Caption json.RawMessage `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + pageBlockSlideshow.PageBlocks = tmp.PageBlocks + + fieldCaption, _ := UnmarshalRichText(tmp.Caption) + pageBlockSlideshow.Caption = fieldCaption + + return nil +} + +// A link to a chat +type PageBlockChatLink struct { + meta + // Chat title + Title string `json:"title"` + // Chat photo; may be null + Photo *ChatPhoto `json:"photo"` + // Chat username, by which all other information about the chat should be resolved + Username string `json:"username"` +} + +func (entity *PageBlockChatLink) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PageBlockChatLink + + return json.Marshal((*stub)(entity)) +} + +func (*PageBlockChatLink) GetClass() string { + return ClassPageBlock +} + +func (*PageBlockChatLink) GetType() string { + return TypePageBlockChatLink +} + +func (*PageBlockChatLink) PageBlockType() string { + return TypePageBlockChatLink +} + +// Describes an instant view page for a web page +type WebPageInstantView struct { + meta + // Content of the web page + PageBlocks []PageBlock `json:"page_blocks"` + // True, if the instant view contains the full page. A network request might be needed to get the full web page instant view + IsFull bool `json:"is_full"` +} + +func (entity *WebPageInstantView) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub WebPageInstantView + + return json.Marshal((*stub)(entity)) +} + +func (*WebPageInstantView) GetClass() string { + return ClassWebPageInstantView +} + +func (*WebPageInstantView) GetType() string { + return TypeWebPageInstantView +} + +// Describes a web page preview +type WebPage struct { + meta + // Original URL of the link + Url string `json:"url"` + // URL to display + DisplayUrl string `json:"display_url"` + // Type of the web page. Can be: article, photo, audio, video, document, profile, app, or something else + Type string `json:"type"` + // Short name of the site (e.g., Google Docs, App Store) + SiteName string `json:"site_name"` + // Title of the content + Title string `json:"title"` + // Description of the content + Description string `json:"description"` + // Image representing the content; may be null + Photo *Photo `json:"photo"` + // URL to show in the embedded preview + EmbedUrl string `json:"embed_url"` + // MIME type of the embedded preview, (e.g., text/html or video/mp4) + EmbedType string `json:"embed_type"` + // Width of the embedded preview + EmbedWidth int32 `json:"embed_width"` + // Height of the embedded preview + EmbedHeight int32 `json:"embed_height"` + // Duration of the content, in seconds + Duration int32 `json:"duration"` + // Author of the content + Author string `json:"author"` + // Preview of the content as an animation, if available; may be null + Animation *Animation `json:"animation"` + // Preview of the content as an audio file, if available; may be null + Audio *Audio `json:"audio"` + // Preview of the content as a document, if available (currently only available for small PDF files and ZIP archives); may be null + Document *Document `json:"document"` + // Preview of the content as a sticker for small WEBP files, if available; may be null + Sticker *Sticker `json:"sticker"` + // Preview of the content as a video, if available; may be null + Video *Video `json:"video"` + // Preview of the content as a video note, if available; may be null + VideoNote *VideoNote `json:"video_note"` + // Preview of the content as a voice note, if available; may be null + VoiceNote *VoiceNote `json:"voice_note"` + // True, if the web page has an instant view + HasInstantView bool `json:"has_instant_view"` +} + +func (entity *WebPage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub WebPage + + return json.Marshal((*stub)(entity)) +} + +func (*WebPage) GetClass() string { + return ClassWebPage +} + +func (*WebPage) GetType() string { + return TypeWebPage +} + +// Portion of the price of a product (e.g., "delivery cost", "tax amount") +type LabeledPricePart struct { + meta + // Label for this portion of the product price + Label string `json:"label"` + // Currency amount in minimal quantity of the currency + Amount int64 `json:"amount"` +} + +func (entity *LabeledPricePart) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub LabeledPricePart + + return json.Marshal((*stub)(entity)) +} + +func (*LabeledPricePart) GetClass() string { + return ClassLabeledPricePart +} + +func (*LabeledPricePart) GetType() string { + return TypeLabeledPricePart +} + +// Product invoice +type Invoice struct { + meta + // ISO 4217 currency code + Currency string `json:"currency"` + // A list of objects used to calculate the total price of the product + PriceParts []*LabeledPricePart `json:"price_parts"` + // True, if the payment is a test payment + IsTest bool `json:"is_test"` + // True, if the user's name is needed for payment + NeedName bool `json:"need_name"` + // True, if the user's phone number is needed for payment + NeedPhoneNumber bool `json:"need_phone_number"` + // True, if the user's email address is needed for payment + NeedEmailAddress bool `json:"need_email_address"` + // True, if the user's shipping address is needed for payment + NeedShippingAddress bool `json:"need_shipping_address"` + // True, if the user's phone number will be sent to the provider + SendPhoneNumberToProvider bool `json:"send_phone_number_to_provider"` + // True, if the user's email address will be sent to the provider + SendEmailAddressToProvider bool `json:"send_email_address_to_provider"` + // True, if the total price depends on the shipping method + IsFlexible bool `json:"is_flexible"` +} + +func (entity *Invoice) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Invoice + + return json.Marshal((*stub)(entity)) +} + +func (*Invoice) GetClass() string { + return ClassInvoice +} + +func (*Invoice) GetType() string { + return TypeInvoice +} + +// Describes a shipping address +type ShippingAddress struct { + meta + // Two-letter ISO 3166-1 alpha-2 country code + CountryCode string `json:"country_code"` + // State, if applicable + State string `json:"state"` + // City + City string `json:"city"` + // First line of the address + StreetLine1 string `json:"street_line1"` + // Second line of the address + StreetLine2 string `json:"street_line2"` + // Address postal code + PostalCode string `json:"postal_code"` +} + +func (entity *ShippingAddress) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ShippingAddress + + return json.Marshal((*stub)(entity)) +} + +func (*ShippingAddress) GetClass() string { + return ClassShippingAddress +} + +func (*ShippingAddress) GetType() string { + return TypeShippingAddress +} + +// Order information +type OrderInfo struct { + meta + // Name of the user + Name string `json:"name"` + // Phone number of the user + PhoneNumber string `json:"phone_number"` + // Email address of the user + EmailAddress string `json:"email_address"` + // Shipping address for this order; may be null + ShippingAddress *ShippingAddress `json:"shipping_address"` +} + +func (entity *OrderInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub OrderInfo + + return json.Marshal((*stub)(entity)) +} + +func (*OrderInfo) GetClass() string { + return ClassOrderInfo +} + +func (*OrderInfo) GetType() string { + return TypeOrderInfo +} + +// One shipping option +type ShippingOption struct { + meta + // Shipping option identifier + Id string `json:"id"` + // Option title + Title string `json:"title"` + // A list of objects used to calculate the total shipping costs + PriceParts []*LabeledPricePart `json:"price_parts"` +} + +func (entity *ShippingOption) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ShippingOption + + return json.Marshal((*stub)(entity)) +} + +func (*ShippingOption) GetClass() string { + return ClassShippingOption +} + +func (*ShippingOption) GetType() string { + return TypeShippingOption +} + +// Contains information about saved card credentials +type SavedCredentials struct { + meta + // Unique identifier of the saved credentials + Id string `json:"id"` + // Title of the saved credentials + Title string `json:"title"` +} + +func (entity *SavedCredentials) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SavedCredentials + + return json.Marshal((*stub)(entity)) +} + +func (*SavedCredentials) GetClass() string { + return ClassSavedCredentials +} + +func (*SavedCredentials) GetType() string { + return TypeSavedCredentials +} + +// Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password +type InputCredentialsSaved struct { + meta + // Identifier of the saved credentials + SavedCredentialsId string `json:"saved_credentials_id"` +} + +func (entity *InputCredentialsSaved) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputCredentialsSaved + + return json.Marshal((*stub)(entity)) +} + +func (*InputCredentialsSaved) GetClass() string { + return ClassInputCredentials +} + +func (*InputCredentialsSaved) GetType() string { + return TypeInputCredentialsSaved +} + +func (*InputCredentialsSaved) InputCredentialsType() string { + return TypeInputCredentialsSaved +} + +// Applies if a user enters new credentials on a payment provider website +type InputCredentialsNew struct { + meta + // Contains JSON-encoded data with a credential identifier from the payment provider + Data string `json:"data"` + // True, if the credential identifier can be saved on the server side + AllowSave bool `json:"allow_save"` +} + +func (entity *InputCredentialsNew) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputCredentialsNew + + return json.Marshal((*stub)(entity)) +} + +func (*InputCredentialsNew) GetClass() string { + return ClassInputCredentials +} + +func (*InputCredentialsNew) GetType() string { + return TypeInputCredentialsNew +} + +func (*InputCredentialsNew) InputCredentialsType() string { + return TypeInputCredentialsNew +} + +// Applies if a user enters new credentials using Android Pay +type InputCredentialsAndroidPay struct { + meta + // JSON-encoded data with the credential identifier + Data string `json:"data"` +} + +func (entity *InputCredentialsAndroidPay) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputCredentialsAndroidPay + + return json.Marshal((*stub)(entity)) +} + +func (*InputCredentialsAndroidPay) GetClass() string { + return ClassInputCredentials +} + +func (*InputCredentialsAndroidPay) GetType() string { + return TypeInputCredentialsAndroidPay +} + +func (*InputCredentialsAndroidPay) InputCredentialsType() string { + return TypeInputCredentialsAndroidPay +} + +// Applies if a user enters new credentials using Apple Pay +type InputCredentialsApplePay struct { + meta + // JSON-encoded data with the credential identifier + Data string `json:"data"` +} + +func (entity *InputCredentialsApplePay) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputCredentialsApplePay + + return json.Marshal((*stub)(entity)) +} + +func (*InputCredentialsApplePay) GetClass() string { + return ClassInputCredentials +} + +func (*InputCredentialsApplePay) GetType() string { + return TypeInputCredentialsApplePay +} + +func (*InputCredentialsApplePay) InputCredentialsType() string { + return TypeInputCredentialsApplePay +} + +// Stripe payment provider +type PaymentsProviderStripe struct { + meta + // Stripe API publishable key + PublishableKey string `json:"publishable_key"` + // True, if the user country must be provided + NeedCountry bool `json:"need_country"` + // True, if the user ZIP/postal code must be provided + NeedPostalCode bool `json:"need_postal_code"` + // True, if the cardholder name must be provided + NeedCardholderName bool `json:"need_cardholder_name"` +} + +func (entity *PaymentsProviderStripe) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PaymentsProviderStripe + + return json.Marshal((*stub)(entity)) +} + +func (*PaymentsProviderStripe) GetClass() string { + return ClassPaymentsProviderStripe +} + +func (*PaymentsProviderStripe) GetType() string { + return TypePaymentsProviderStripe +} + +// Contains information about an invoice payment form +type PaymentForm struct { + meta + // Full information of the invoice + Invoice *Invoice `json:"invoice"` + // Payment form URL + Url string `json:"url"` + // Contains information about the payment provider, if available, to support it natively without the need for opening the URL; may be null + PaymentsProvider *PaymentsProviderStripe `json:"payments_provider"` + // Saved server-side order information; may be null + SavedOrderInfo *OrderInfo `json:"saved_order_info"` + // Contains information about saved card credentials; may be null + SavedCredentials *SavedCredentials `json:"saved_credentials"` + // True, if the user can choose to save credentials + CanSaveCredentials bool `json:"can_save_credentials"` + // True, if the user will be able to save credentials protected by a password they set up + NeedPassword bool `json:"need_password"` +} + +func (entity *PaymentForm) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PaymentForm + + return json.Marshal((*stub)(entity)) +} + +func (*PaymentForm) GetClass() string { + return ClassPaymentForm +} + +func (*PaymentForm) GetType() string { + return TypePaymentForm +} + +// Contains a temporary identifier of validated order information, which is stored for one hour. Also contains the available shipping options +type ValidatedOrderInfo struct { + meta + // Temporary identifier of the order information + OrderInfoId string `json:"order_info_id"` + // Available shipping options + ShippingOptions []*ShippingOption `json:"shipping_options"` +} + +func (entity *ValidatedOrderInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ValidatedOrderInfo + + return json.Marshal((*stub)(entity)) +} + +func (*ValidatedOrderInfo) GetClass() string { + return ClassValidatedOrderInfo +} + +func (*ValidatedOrderInfo) GetType() string { + return TypeValidatedOrderInfo +} + +// Contains the result of a payment request +type PaymentResult struct { + meta + // True, if the payment request was successful; otherwise the verification_url will be not empty + Success bool `json:"success"` + // URL for additional payment credentials verification + VerificationUrl string `json:"verification_url"` +} + +func (entity *PaymentResult) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PaymentResult + + return json.Marshal((*stub)(entity)) +} + +func (*PaymentResult) GetClass() string { + return ClassPaymentResult +} + +func (*PaymentResult) GetType() string { + return TypePaymentResult +} + +// Contains information about a successful payment +type PaymentReceipt struct { + meta + // Point in time (Unix timestamp) when the payment was made + Date int32 `json:"date"` + // User identifier of the payment provider bot + PaymentsProviderUserId int32 `json:"payments_provider_user_id"` + // Contains information about the invoice + Invoice *Invoice `json:"invoice"` + // Contains order information; may be null + OrderInfo *OrderInfo `json:"order_info"` + // Chosen shipping option; may be null + ShippingOption *ShippingOption `json:"shipping_option"` + // Title of the saved credentials + CredentialsTitle string `json:"credentials_title"` +} + +func (entity *PaymentReceipt) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PaymentReceipt + + return json.Marshal((*stub)(entity)) +} + +func (*PaymentReceipt) GetClass() string { + return ClassPaymentReceipt +} + +func (*PaymentReceipt) GetType() string { + return TypePaymentReceipt +} + +// A text message +type MessageText struct { + meta + // Text of the message + Text *FormattedText `json:"text"` + // A preview of the web page that's mentioned in the text; may be null + WebPage *WebPage `json:"web_page"` +} + +func (entity *MessageText) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageText + + return json.Marshal((*stub)(entity)) +} + +func (*MessageText) GetClass() string { + return ClassMessageContent +} + +func (*MessageText) GetType() string { + return TypeMessageText +} + +func (*MessageText) MessageContentType() string { + return TypeMessageText +} + +// An animation message (GIF-style). +type MessageAnimation struct { + meta + // Message content + Animation *Animation `json:"animation"` + // Animation caption + Caption *FormattedText `json:"caption"` + // True, if the animation thumbnail must be blurred and the animation must be shown only while tapped + IsSecret bool `json:"is_secret"` +} + +func (entity *MessageAnimation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageAnimation + + return json.Marshal((*stub)(entity)) +} + +func (*MessageAnimation) GetClass() string { + return ClassMessageContent +} + +func (*MessageAnimation) GetType() string { + return TypeMessageAnimation +} + +func (*MessageAnimation) MessageContentType() string { + return TypeMessageAnimation +} + +// An audio message +type MessageAudio struct { + meta + // Message content + Audio *Audio `json:"audio"` + // Audio caption + Caption *FormattedText `json:"caption"` +} + +func (entity *MessageAudio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageAudio + + return json.Marshal((*stub)(entity)) +} + +func (*MessageAudio) GetClass() string { + return ClassMessageContent +} + +func (*MessageAudio) GetType() string { + return TypeMessageAudio +} + +func (*MessageAudio) MessageContentType() string { + return TypeMessageAudio +} + +// A document message (general file) +type MessageDocument struct { + meta + // Message content + Document *Document `json:"document"` + // Document caption + Caption *FormattedText `json:"caption"` +} + +func (entity *MessageDocument) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageDocument + + return json.Marshal((*stub)(entity)) +} + +func (*MessageDocument) GetClass() string { + return ClassMessageContent +} + +func (*MessageDocument) GetType() string { + return TypeMessageDocument +} + +func (*MessageDocument) MessageContentType() string { + return TypeMessageDocument +} + +// A photo message +type MessagePhoto struct { + meta + // Message content + Photo *Photo `json:"photo"` + // Photo caption + Caption *FormattedText `json:"caption"` + // True, if the photo must be blurred and must be shown only while tapped + IsSecret bool `json:"is_secret"` +} + +func (entity *MessagePhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessagePhoto + + return json.Marshal((*stub)(entity)) +} + +func (*MessagePhoto) GetClass() string { + return ClassMessageContent +} + +func (*MessagePhoto) GetType() string { + return TypeMessagePhoto +} + +func (*MessagePhoto) MessageContentType() string { + return TypeMessagePhoto +} + +// An expired photo message (self-destructed after TTL has elapsed) +type MessageExpiredPhoto struct{ + meta +} + +func (entity *MessageExpiredPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageExpiredPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*MessageExpiredPhoto) GetClass() string { + return ClassMessageContent +} + +func (*MessageExpiredPhoto) GetType() string { + return TypeMessageExpiredPhoto +} + +func (*MessageExpiredPhoto) MessageContentType() string { + return TypeMessageExpiredPhoto +} + +// A sticker message +type MessageSticker struct { + meta + // Message content + Sticker *Sticker `json:"sticker"` +} + +func (entity *MessageSticker) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageSticker + + return json.Marshal((*stub)(entity)) +} + +func (*MessageSticker) GetClass() string { + return ClassMessageContent +} + +func (*MessageSticker) GetType() string { + return TypeMessageSticker +} + +func (*MessageSticker) MessageContentType() string { + return TypeMessageSticker +} + +// A video message +type MessageVideo struct { + meta + // Message content + Video *Video `json:"video"` + // Video caption + Caption *FormattedText `json:"caption"` + // True, if the video thumbnail must be blurred and the video must be shown only while tapped + IsSecret bool `json:"is_secret"` +} + +func (entity *MessageVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageVideo + + return json.Marshal((*stub)(entity)) +} + +func (*MessageVideo) GetClass() string { + return ClassMessageContent +} + +func (*MessageVideo) GetType() string { + return TypeMessageVideo +} + +func (*MessageVideo) MessageContentType() string { + return TypeMessageVideo +} + +// An expired video message (self-destructed after TTL has elapsed) +type MessageExpiredVideo struct{ + meta +} + +func (entity *MessageExpiredVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageExpiredVideo + + return json.Marshal((*stub)(entity)) +} + +func (*MessageExpiredVideo) GetClass() string { + return ClassMessageContent +} + +func (*MessageExpiredVideo) GetType() string { + return TypeMessageExpiredVideo +} + +func (*MessageExpiredVideo) MessageContentType() string { + return TypeMessageExpiredVideo +} + +// A video note message +type MessageVideoNote struct { + meta + // Message content + VideoNote *VideoNote `json:"video_note"` + // True, if at least one of the recipients has viewed the video note + IsViewed bool `json:"is_viewed"` + // True, if the video note thumbnail must be blurred and the video note must be shown only while tapped + IsSecret bool `json:"is_secret"` +} + +func (entity *MessageVideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageVideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*MessageVideoNote) GetClass() string { + return ClassMessageContent +} + +func (*MessageVideoNote) GetType() string { + return TypeMessageVideoNote +} + +func (*MessageVideoNote) MessageContentType() string { + return TypeMessageVideoNote +} + +// A voice note message +type MessageVoiceNote struct { + meta + // Message content + VoiceNote *VoiceNote `json:"voice_note"` + // Voice note caption + Caption *FormattedText `json:"caption"` + // True, if at least one of the recipients has listened to the voice note + IsListened bool `json:"is_listened"` +} + +func (entity *MessageVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*MessageVoiceNote) GetClass() string { + return ClassMessageContent +} + +func (*MessageVoiceNote) GetType() string { + return TypeMessageVoiceNote +} + +func (*MessageVoiceNote) MessageContentType() string { + return TypeMessageVoiceNote +} + +// A message with a location +type MessageLocation struct { + meta + // Message content + Location *Location `json:"location"` + // Time relative to the message sent date until which the location can be updated, in seconds + LivePeriod int32 `json:"live_period"` + // Left time for which the location can be updated, in seconds. updateMessageContent is not sent when this field changes + ExpiresIn int32 `json:"expires_in"` +} + +func (entity *MessageLocation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageLocation + + return json.Marshal((*stub)(entity)) +} + +func (*MessageLocation) GetClass() string { + return ClassMessageContent +} + +func (*MessageLocation) GetType() string { + return TypeMessageLocation +} + +func (*MessageLocation) MessageContentType() string { + return TypeMessageLocation +} + +// A message with information about a venue +type MessageVenue struct { + meta + // Message content + Venue *Venue `json:"venue"` +} + +func (entity *MessageVenue) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageVenue + + return json.Marshal((*stub)(entity)) +} + +func (*MessageVenue) GetClass() string { + return ClassMessageContent +} + +func (*MessageVenue) GetType() string { + return TypeMessageVenue +} + +func (*MessageVenue) MessageContentType() string { + return TypeMessageVenue +} + +// A message with a user contact +type MessageContact struct { + meta + // Message content + Contact *Contact `json:"contact"` +} + +func (entity *MessageContact) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageContact + + return json.Marshal((*stub)(entity)) +} + +func (*MessageContact) GetClass() string { + return ClassMessageContent +} + +func (*MessageContact) GetType() string { + return TypeMessageContact +} + +func (*MessageContact) MessageContentType() string { + return TypeMessageContact +} + +// A message with a game +type MessageGame struct { + meta + // Game + Game *Game `json:"game"` +} + +func (entity *MessageGame) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageGame + + return json.Marshal((*stub)(entity)) +} + +func (*MessageGame) GetClass() string { + return ClassMessageContent +} + +func (*MessageGame) GetType() string { + return TypeMessageGame +} + +func (*MessageGame) MessageContentType() string { + return TypeMessageGame +} + +// A message with an invoice from a bot +type MessageInvoice struct { + meta + // Product title + Title string `json:"title"` + // Product description + Description string `json:"description"` + // Product photo; may be null + Photo *Photo `json:"photo"` + // Currency for the product price + Currency string `json:"currency"` + // Product total price in the minimal quantity of the currency + TotalAmount int64 `json:"total_amount"` + // Unique invoice bot start_parameter. To share an invoice use the URL https://t.me/{bot_username}?start={start_parameter} + StartParameter string `json:"start_parameter"` + // True, if the invoice is a test invoice + IsTest bool `json:"is_test"` + // True, if the shipping address should be specified + NeedShippingAddress bool `json:"need_shipping_address"` + // The identifier of the message with the receipt, after the product has been purchased + ReceiptMessageId int64 `json:"receipt_message_id"` +} + +func (entity *MessageInvoice) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageInvoice + + return json.Marshal((*stub)(entity)) +} + +func (*MessageInvoice) GetClass() string { + return ClassMessageContent +} + +func (*MessageInvoice) GetType() string { + return TypeMessageInvoice +} + +func (*MessageInvoice) MessageContentType() string { + return TypeMessageInvoice +} + +// A message with information about an ended call +type MessageCall struct { + meta + // Reason why the call was discarded + DiscardReason CallDiscardReason `json:"discard_reason"` + // Call duration, in seconds + Duration int32 `json:"duration"` +} + +func (entity *MessageCall) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageCall + + return json.Marshal((*stub)(entity)) +} + +func (*MessageCall) GetClass() string { + return ClassMessageContent +} + +func (*MessageCall) GetType() string { + return TypeMessageCall +} + +func (*MessageCall) MessageContentType() string { + return TypeMessageCall +} + +func (messageCall *MessageCall) UnmarshalJSON(data []byte) error { + var tmp struct { + DiscardReason json.RawMessage `json:"discard_reason"` + Duration int32 `json:"duration"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + messageCall.Duration = tmp.Duration + + fieldDiscardReason, _ := UnmarshalCallDiscardReason(tmp.DiscardReason) + messageCall.DiscardReason = fieldDiscardReason + + return nil +} + +// A newly created basic group +type MessageBasicGroupChatCreate struct { + meta + // Title of the basic group + Title string `json:"title"` + // User identifiers of members in the basic group + MemberUserIds []int32 `json:"member_user_ids"` +} + +func (entity *MessageBasicGroupChatCreate) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageBasicGroupChatCreate + + return json.Marshal((*stub)(entity)) +} + +func (*MessageBasicGroupChatCreate) GetClass() string { + return ClassMessageContent +} + +func (*MessageBasicGroupChatCreate) GetType() string { + return TypeMessageBasicGroupChatCreate +} + +func (*MessageBasicGroupChatCreate) MessageContentType() string { + return TypeMessageBasicGroupChatCreate +} + +// A newly created supergroup or channel +type MessageSupergroupChatCreate struct { + meta + // Title of the supergroup or channel + Title string `json:"title"` +} + +func (entity *MessageSupergroupChatCreate) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageSupergroupChatCreate + + return json.Marshal((*stub)(entity)) +} + +func (*MessageSupergroupChatCreate) GetClass() string { + return ClassMessageContent +} + +func (*MessageSupergroupChatCreate) GetType() string { + return TypeMessageSupergroupChatCreate +} + +func (*MessageSupergroupChatCreate) MessageContentType() string { + return TypeMessageSupergroupChatCreate +} + +// An updated chat title +type MessageChatChangeTitle struct { + meta + // New chat title + Title string `json:"title"` +} + +func (entity *MessageChatChangeTitle) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatChangeTitle + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatChangeTitle) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatChangeTitle) GetType() string { + return TypeMessageChatChangeTitle +} + +func (*MessageChatChangeTitle) MessageContentType() string { + return TypeMessageChatChangeTitle +} + +// An updated chat photo +type MessageChatChangePhoto struct { + meta + // New chat photo + Photo *Photo `json:"photo"` +} + +func (entity *MessageChatChangePhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatChangePhoto + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatChangePhoto) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatChangePhoto) GetType() string { + return TypeMessageChatChangePhoto +} + +func (*MessageChatChangePhoto) MessageContentType() string { + return TypeMessageChatChangePhoto +} + +// A deleted chat photo +type MessageChatDeletePhoto struct{ + meta +} + +func (entity *MessageChatDeletePhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatDeletePhoto + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatDeletePhoto) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatDeletePhoto) GetType() string { + return TypeMessageChatDeletePhoto +} + +func (*MessageChatDeletePhoto) MessageContentType() string { + return TypeMessageChatDeletePhoto +} + +// New chat members were added +type MessageChatAddMembers struct { + meta + // User identifiers of the new members + MemberUserIds []int32 `json:"member_user_ids"` +} + +func (entity *MessageChatAddMembers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatAddMembers + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatAddMembers) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatAddMembers) GetType() string { + return TypeMessageChatAddMembers +} + +func (*MessageChatAddMembers) MessageContentType() string { + return TypeMessageChatAddMembers +} + +// A new member joined the chat by invite link +type MessageChatJoinByLink struct{ + meta +} + +func (entity *MessageChatJoinByLink) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatJoinByLink + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatJoinByLink) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatJoinByLink) GetType() string { + return TypeMessageChatJoinByLink +} + +func (*MessageChatJoinByLink) MessageContentType() string { + return TypeMessageChatJoinByLink +} + +// A chat member was deleted +type MessageChatDeleteMember struct { + meta + // User identifier of the deleted chat member + UserId int32 `json:"user_id"` +} + +func (entity *MessageChatDeleteMember) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatDeleteMember + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatDeleteMember) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatDeleteMember) GetType() string { + return TypeMessageChatDeleteMember +} + +func (*MessageChatDeleteMember) MessageContentType() string { + return TypeMessageChatDeleteMember +} + +// A basic group was upgraded to a supergroup and was deactivated as the result +type MessageChatUpgradeTo struct { + meta + // Identifier of the supergroup to which the basic group was upgraded + SupergroupId int32 `json:"supergroup_id"` +} + +func (entity *MessageChatUpgradeTo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatUpgradeTo + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatUpgradeTo) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatUpgradeTo) GetType() string { + return TypeMessageChatUpgradeTo +} + +func (*MessageChatUpgradeTo) MessageContentType() string { + return TypeMessageChatUpgradeTo +} + +// A supergroup has been created from a basic group +type MessageChatUpgradeFrom struct { + meta + // Title of the newly created supergroup + Title string `json:"title"` + // The identifier of the original basic group + BasicGroupId int32 `json:"basic_group_id"` +} + +func (entity *MessageChatUpgradeFrom) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatUpgradeFrom + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatUpgradeFrom) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatUpgradeFrom) GetType() string { + return TypeMessageChatUpgradeFrom +} + +func (*MessageChatUpgradeFrom) MessageContentType() string { + return TypeMessageChatUpgradeFrom +} + +// A message has been pinned +type MessagePinMessage struct { + meta + // Identifier of the pinned message, can be an identifier of a deleted message + MessageId int64 `json:"message_id"` +} + +func (entity *MessagePinMessage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessagePinMessage + + return json.Marshal((*stub)(entity)) +} + +func (*MessagePinMessage) GetClass() string { + return ClassMessageContent +} + +func (*MessagePinMessage) GetType() string { + return TypeMessagePinMessage +} + +func (*MessagePinMessage) MessageContentType() string { + return TypeMessagePinMessage +} + +// A screenshot of a message in the chat has been taken +type MessageScreenshotTaken struct{ + meta +} + +func (entity *MessageScreenshotTaken) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageScreenshotTaken + + return json.Marshal((*stub)(entity)) +} + +func (*MessageScreenshotTaken) GetClass() string { + return ClassMessageContent +} + +func (*MessageScreenshotTaken) GetType() string { + return TypeMessageScreenshotTaken +} + +func (*MessageScreenshotTaken) MessageContentType() string { + return TypeMessageScreenshotTaken +} + +// The TTL (Time To Live) setting messages in a secret chat has been changed +type MessageChatSetTtl struct { + meta + // New TTL + Ttl int32 `json:"ttl"` +} + +func (entity *MessageChatSetTtl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageChatSetTtl + + return json.Marshal((*stub)(entity)) +} + +func (*MessageChatSetTtl) GetClass() string { + return ClassMessageContent +} + +func (*MessageChatSetTtl) GetType() string { + return TypeMessageChatSetTtl +} + +func (*MessageChatSetTtl) MessageContentType() string { + return TypeMessageChatSetTtl +} + +// A non-standard action has happened in the chat +type MessageCustomServiceAction struct { + meta + // Message text to be shown in the chat + Text string `json:"text"` +} + +func (entity *MessageCustomServiceAction) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageCustomServiceAction + + return json.Marshal((*stub)(entity)) +} + +func (*MessageCustomServiceAction) GetClass() string { + return ClassMessageContent +} + +func (*MessageCustomServiceAction) GetType() string { + return TypeMessageCustomServiceAction +} + +func (*MessageCustomServiceAction) MessageContentType() string { + return TypeMessageCustomServiceAction +} + +// A new high score was achieved in a game +type MessageGameScore struct { + meta + // Identifier of the message with the game, can be an identifier of a deleted message + GameMessageId int64 `json:"game_message_id"` + // Identifier of the game, may be different from the games presented in the message with the game + GameId JsonInt64 `json:"game_id"` + // New score + Score int32 `json:"score"` +} + +func (entity *MessageGameScore) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageGameScore + + return json.Marshal((*stub)(entity)) +} + +func (*MessageGameScore) GetClass() string { + return ClassMessageContent +} + +func (*MessageGameScore) GetType() string { + return TypeMessageGameScore +} + +func (*MessageGameScore) MessageContentType() string { + return TypeMessageGameScore +} + +// A payment has been completed +type MessagePaymentSuccessful struct { + meta + // Identifier of the message with the corresponding invoice; can be an identifier of a deleted message + InvoiceMessageId int64 `json:"invoice_message_id"` + // Currency for the price of the product + Currency string `json:"currency"` + // Total price for the product, in the minimal quantity of the currency + TotalAmount int64 `json:"total_amount"` +} + +func (entity *MessagePaymentSuccessful) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessagePaymentSuccessful + + return json.Marshal((*stub)(entity)) +} + +func (*MessagePaymentSuccessful) GetClass() string { + return ClassMessageContent +} + +func (*MessagePaymentSuccessful) GetType() string { + return TypeMessagePaymentSuccessful +} + +func (*MessagePaymentSuccessful) MessageContentType() string { + return TypeMessagePaymentSuccessful +} + +// A payment has been completed; for bots only +type MessagePaymentSuccessfulBot struct { + meta + // Identifier of the message with the corresponding invoice; can be an identifier of a deleted message + InvoiceMessageId int64 `json:"invoice_message_id"` + // Currency for price of the product + Currency string `json:"currency"` + // Total price for the product, in the minimal quantity of the currency + TotalAmount int64 `json:"total_amount"` + // Invoice payload + InvoicePayload []byte `json:"invoice_payload"` + // Identifier of the shipping option chosen by the user, may be empty if not applicable + ShippingOptionId string `json:"shipping_option_id"` + // Information about the order; may be null + OrderInfo *OrderInfo `json:"order_info"` + // Telegram payment identifier + TelegramPaymentChargeId string `json:"telegram_payment_charge_id"` + // Provider payment identifier + ProviderPaymentChargeId string `json:"provider_payment_charge_id"` +} + +func (entity *MessagePaymentSuccessfulBot) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessagePaymentSuccessfulBot + + return json.Marshal((*stub)(entity)) +} + +func (*MessagePaymentSuccessfulBot) GetClass() string { + return ClassMessageContent +} + +func (*MessagePaymentSuccessfulBot) GetType() string { + return TypeMessagePaymentSuccessfulBot +} + +func (*MessagePaymentSuccessfulBot) MessageContentType() string { + return TypeMessagePaymentSuccessfulBot +} + +// A contact has registered with Telegram +type MessageContactRegistered struct{ + meta +} + +func (entity *MessageContactRegistered) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageContactRegistered + + return json.Marshal((*stub)(entity)) +} + +func (*MessageContactRegistered) GetClass() string { + return ClassMessageContent +} + +func (*MessageContactRegistered) GetType() string { + return TypeMessageContactRegistered +} + +func (*MessageContactRegistered) MessageContentType() string { + return TypeMessageContactRegistered +} + +// The current user has connected a website by logging in using Telegram Login Widget on it +type MessageWebsiteConnected struct { + meta + // Domain name of the connected website + DomainName string `json:"domain_name"` +} + +func (entity *MessageWebsiteConnected) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageWebsiteConnected + + return json.Marshal((*stub)(entity)) +} + +func (*MessageWebsiteConnected) GetClass() string { + return ClassMessageContent +} + +func (*MessageWebsiteConnected) GetType() string { + return TypeMessageWebsiteConnected +} + +func (*MessageWebsiteConnected) MessageContentType() string { + return TypeMessageWebsiteConnected +} + +// Message content that is not supported by the client +type MessageUnsupported struct{ + meta +} + +func (entity *MessageUnsupported) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub MessageUnsupported + + return json.Marshal((*stub)(entity)) +} + +func (*MessageUnsupported) GetClass() string { + return ClassMessageContent +} + +func (*MessageUnsupported) GetType() string { + return TypeMessageUnsupported +} + +func (*MessageUnsupported) MessageContentType() string { + return TypeMessageUnsupported +} + +// A mention of a user by their username +type TextEntityTypeMention struct{ + meta +} + +func (entity *TextEntityTypeMention) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeMention + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeMention) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeMention) GetType() string { + return TypeTextEntityTypeMention +} + +func (*TextEntityTypeMention) TextEntityTypeType() string { + return TypeTextEntityTypeMention +} + +// A hashtag text, beginning with "#" +type TextEntityTypeHashtag struct{ + meta +} + +func (entity *TextEntityTypeHashtag) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeHashtag + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeHashtag) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeHashtag) GetType() string { + return TypeTextEntityTypeHashtag +} + +func (*TextEntityTypeHashtag) TextEntityTypeType() string { + return TypeTextEntityTypeHashtag +} + +// A cashtag text, beginning with "$" and consisting of capital english letters (i.e. "$USD") +type TextEntityTypeCashtag struct{ + meta +} + +func (entity *TextEntityTypeCashtag) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeCashtag + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeCashtag) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeCashtag) GetType() string { + return TypeTextEntityTypeCashtag +} + +func (*TextEntityTypeCashtag) TextEntityTypeType() string { + return TypeTextEntityTypeCashtag +} + +// A bot command, beginning with "/". This shouldn't be highlighted if there are no bots in the chat +type TextEntityTypeBotCommand struct{ + meta +} + +func (entity *TextEntityTypeBotCommand) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeBotCommand + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeBotCommand) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeBotCommand) GetType() string { + return TypeTextEntityTypeBotCommand +} + +func (*TextEntityTypeBotCommand) TextEntityTypeType() string { + return TypeTextEntityTypeBotCommand +} + +// An HTTP URL +type TextEntityTypeUrl struct{ + meta +} + +func (entity *TextEntityTypeUrl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeUrl + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeUrl) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeUrl) GetType() string { + return TypeTextEntityTypeUrl +} + +func (*TextEntityTypeUrl) TextEntityTypeType() string { + return TypeTextEntityTypeUrl +} + +// An email address +type TextEntityTypeEmailAddress struct{ + meta +} + +func (entity *TextEntityTypeEmailAddress) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeEmailAddress + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeEmailAddress) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeEmailAddress) GetType() string { + return TypeTextEntityTypeEmailAddress +} + +func (*TextEntityTypeEmailAddress) TextEntityTypeType() string { + return TypeTextEntityTypeEmailAddress +} + +// A bold text +type TextEntityTypeBold struct{ + meta +} + +func (entity *TextEntityTypeBold) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeBold + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeBold) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeBold) GetType() string { + return TypeTextEntityTypeBold +} + +func (*TextEntityTypeBold) TextEntityTypeType() string { + return TypeTextEntityTypeBold +} + +// An italic text +type TextEntityTypeItalic struct{ + meta +} + +func (entity *TextEntityTypeItalic) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeItalic + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeItalic) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeItalic) GetType() string { + return TypeTextEntityTypeItalic +} + +func (*TextEntityTypeItalic) TextEntityTypeType() string { + return TypeTextEntityTypeItalic +} + +// Text that must be formatted as if inside a code HTML tag +type TextEntityTypeCode struct{ + meta +} + +func (entity *TextEntityTypeCode) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeCode + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeCode) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeCode) GetType() string { + return TypeTextEntityTypeCode +} + +func (*TextEntityTypeCode) TextEntityTypeType() string { + return TypeTextEntityTypeCode +} + +// Text that must be formatted as if inside a pre HTML tag +type TextEntityTypePre struct{ + meta +} + +func (entity *TextEntityTypePre) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypePre + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypePre) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypePre) GetType() string { + return TypeTextEntityTypePre +} + +func (*TextEntityTypePre) TextEntityTypeType() string { + return TypeTextEntityTypePre +} + +// Text that must be formatted as if inside pre, and code HTML tags +type TextEntityTypePreCode struct { + meta + // Programming language of the code; as defined by the sender + Language string `json:"language"` +} + +func (entity *TextEntityTypePreCode) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypePreCode + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypePreCode) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypePreCode) GetType() string { + return TypeTextEntityTypePreCode +} + +func (*TextEntityTypePreCode) TextEntityTypeType() string { + return TypeTextEntityTypePreCode +} + +// A text description shown instead of a raw URL +type TextEntityTypeTextUrl struct { + meta + // URL to be opened when the link is clicked + Url string `json:"url"` +} + +func (entity *TextEntityTypeTextUrl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeTextUrl + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeTextUrl) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeTextUrl) GetType() string { + return TypeTextEntityTypeTextUrl +} + +func (*TextEntityTypeTextUrl) TextEntityTypeType() string { + return TypeTextEntityTypeTextUrl +} + +// A text shows instead of a raw mention of the user (e.g., when the user has no username) +type TextEntityTypeMentionName struct { + meta + // Identifier of the mentioned user + UserId int32 `json:"user_id"` +} + +func (entity *TextEntityTypeMentionName) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypeMentionName + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypeMentionName) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypeMentionName) GetType() string { + return TypeTextEntityTypeMentionName +} + +func (*TextEntityTypeMentionName) TextEntityTypeType() string { + return TypeTextEntityTypeMentionName +} + +// A phone number +type TextEntityTypePhoneNumber struct{ + meta +} + +func (entity *TextEntityTypePhoneNumber) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextEntityTypePhoneNumber + + return json.Marshal((*stub)(entity)) +} + +func (*TextEntityTypePhoneNumber) GetClass() string { + return ClassTextEntityType +} + +func (*TextEntityTypePhoneNumber) GetType() string { + return TypeTextEntityTypePhoneNumber +} + +func (*TextEntityTypePhoneNumber) TextEntityTypeType() string { + return TypeTextEntityTypePhoneNumber +} + +// A thumbnail to be sent along with a file; should be in JPEG or WEBP format for stickers, and less than 200 kB in size +type InputThumbnail struct { + meta + // Thumbnail file to send. Sending thumbnails by file_id is currently not supported + Thumbnail InputFile `json:"thumbnail"` + // Thumbnail width, usually shouldn't exceed 90. Use 0 if unknown + Width int32 `json:"width"` + // Thumbnail height, usually shouldn't exceed 90. Use 0 if unknown + Height int32 `json:"height"` +} + +func (entity *InputThumbnail) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputThumbnail + + return json.Marshal((*stub)(entity)) +} + +func (*InputThumbnail) GetClass() string { + return ClassInputThumbnail +} + +func (*InputThumbnail) GetType() string { + return TypeInputThumbnail +} + +func (inputThumbnail *InputThumbnail) UnmarshalJSON(data []byte) error { + var tmp struct { + Thumbnail json.RawMessage `json:"thumbnail"` + Width int32 `json:"width"` + Height int32 `json:"height"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputThumbnail.Width = tmp.Width + inputThumbnail.Height = tmp.Height + + fieldThumbnail, _ := UnmarshalInputFile(tmp.Thumbnail) + inputThumbnail.Thumbnail = fieldThumbnail + + return nil +} + +// A text message +type InputMessageText struct { + meta + // Formatted text to be sent. Only Bold, Italic, Code, Pre, PreCode and TextUrl entities are allowed to be specified manually + Text *FormattedText `json:"text"` + // True, if rich web page previews for URLs in the message text should be disabled + DisableWebPagePreview bool `json:"disable_web_page_preview"` + // True, if a chat message draft should be deleted + ClearDraft bool `json:"clear_draft"` +} + +func (entity *InputMessageText) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageText + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageText) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageText) GetType() string { + return TypeInputMessageText +} + +func (*InputMessageText) InputMessageContentType() string { + return TypeInputMessageText +} + +// An animation message (GIF-style). +type InputMessageAnimation struct { + meta + // Animation file to be sent + Animation InputFile `json:"animation"` + // Animation thumbnail, if available + Thumbnail *InputThumbnail `json:"thumbnail"` + // Duration of the animation, in seconds + Duration int32 `json:"duration"` + // Width of the animation; may be replaced by the server + Width int32 `json:"width"` + // Height of the animation; may be replaced by the server + Height int32 `json:"height"` + // Animation caption; 0-200 characters + Caption *FormattedText `json:"caption"` +} + +func (entity *InputMessageAnimation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageAnimation + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageAnimation) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageAnimation) GetType() string { + return TypeInputMessageAnimation +} + +func (*InputMessageAnimation) InputMessageContentType() string { + return TypeInputMessageAnimation +} + +func (inputMessageAnimation *InputMessageAnimation) UnmarshalJSON(data []byte) error { + var tmp struct { + Animation json.RawMessage `json:"animation"` + Thumbnail *InputThumbnail `json:"thumbnail"` + Duration int32 `json:"duration"` + Width int32 `json:"width"` + Height int32 `json:"height"` + Caption *FormattedText `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessageAnimation.Thumbnail = tmp.Thumbnail + inputMessageAnimation.Duration = tmp.Duration + inputMessageAnimation.Width = tmp.Width + inputMessageAnimation.Height = tmp.Height + inputMessageAnimation.Caption = tmp.Caption + + fieldAnimation, _ := UnmarshalInputFile(tmp.Animation) + inputMessageAnimation.Animation = fieldAnimation + + return nil +} + +// An audio message +type InputMessageAudio struct { + meta + // Audio file to be sent + Audio InputFile `json:"audio"` + // Thumbnail of the cover for the album, if available + AlbumCoverThumbnail *InputThumbnail `json:"album_cover_thumbnail"` + // Duration of the audio, in seconds; may be replaced by the server + Duration int32 `json:"duration"` + // Title of the audio; 0-64 characters; may be replaced by the server + Title string `json:"title"` + // Performer of the audio; 0-64 characters, may be replaced by the server + Performer string `json:"performer"` + // Audio caption; 0-200 characters + Caption *FormattedText `json:"caption"` +} + +func (entity *InputMessageAudio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageAudio + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageAudio) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageAudio) GetType() string { + return TypeInputMessageAudio +} + +func (*InputMessageAudio) InputMessageContentType() string { + return TypeInputMessageAudio +} + +func (inputMessageAudio *InputMessageAudio) UnmarshalJSON(data []byte) error { + var tmp struct { + Audio json.RawMessage `json:"audio"` + AlbumCoverThumbnail *InputThumbnail `json:"album_cover_thumbnail"` + Duration int32 `json:"duration"` + Title string `json:"title"` + Performer string `json:"performer"` + Caption *FormattedText `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessageAudio.AlbumCoverThumbnail = tmp.AlbumCoverThumbnail + inputMessageAudio.Duration = tmp.Duration + inputMessageAudio.Title = tmp.Title + inputMessageAudio.Performer = tmp.Performer + inputMessageAudio.Caption = tmp.Caption + + fieldAudio, _ := UnmarshalInputFile(tmp.Audio) + inputMessageAudio.Audio = fieldAudio + + return nil +} + +// A document message (general file) +type InputMessageDocument struct { + meta + // Document to be sent + Document InputFile `json:"document"` + // Document thumbnail, if available + Thumbnail *InputThumbnail `json:"thumbnail"` + // Document caption; 0-200 characters + Caption *FormattedText `json:"caption"` +} + +func (entity *InputMessageDocument) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageDocument + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageDocument) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageDocument) GetType() string { + return TypeInputMessageDocument +} + +func (*InputMessageDocument) InputMessageContentType() string { + return TypeInputMessageDocument +} + +func (inputMessageDocument *InputMessageDocument) UnmarshalJSON(data []byte) error { + var tmp struct { + Document json.RawMessage `json:"document"` + Thumbnail *InputThumbnail `json:"thumbnail"` + Caption *FormattedText `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessageDocument.Thumbnail = tmp.Thumbnail + inputMessageDocument.Caption = tmp.Caption + + fieldDocument, _ := UnmarshalInputFile(tmp.Document) + inputMessageDocument.Document = fieldDocument + + return nil +} + +// A photo message +type InputMessagePhoto struct { + meta + // Photo to send + Photo InputFile `json:"photo"` + // Photo thumbnail to be sent, this is sent to the other party in secret chats only + Thumbnail *InputThumbnail `json:"thumbnail"` + // File identifiers of the stickers added to the photo, if applicable + AddedStickerFileIds []int32 `json:"added_sticker_file_ids"` + // Photo width + Width int32 `json:"width"` + // Photo height + Height int32 `json:"height"` + // Photo caption; 0-200 characters + Caption *FormattedText `json:"caption"` + // Photo TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats + Ttl int32 `json:"ttl"` +} + +func (entity *InputMessagePhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessagePhoto + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessagePhoto) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessagePhoto) GetType() string { + return TypeInputMessagePhoto +} + +func (*InputMessagePhoto) InputMessageContentType() string { + return TypeInputMessagePhoto +} + +func (inputMessagePhoto *InputMessagePhoto) UnmarshalJSON(data []byte) error { + var tmp struct { + Photo json.RawMessage `json:"photo"` + Thumbnail *InputThumbnail `json:"thumbnail"` + AddedStickerFileIds []int32 `json:"added_sticker_file_ids"` + Width int32 `json:"width"` + Height int32 `json:"height"` + Caption *FormattedText `json:"caption"` + Ttl int32 `json:"ttl"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessagePhoto.Thumbnail = tmp.Thumbnail + inputMessagePhoto.AddedStickerFileIds = tmp.AddedStickerFileIds + inputMessagePhoto.Width = tmp.Width + inputMessagePhoto.Height = tmp.Height + inputMessagePhoto.Caption = tmp.Caption + inputMessagePhoto.Ttl = tmp.Ttl + + fieldPhoto, _ := UnmarshalInputFile(tmp.Photo) + inputMessagePhoto.Photo = fieldPhoto + + return nil +} + +// A sticker message +type InputMessageSticker struct { + meta + // Sticker to be sent + Sticker InputFile `json:"sticker"` + // Sticker thumbnail, if available + Thumbnail *InputThumbnail `json:"thumbnail"` + // Sticker width + Width int32 `json:"width"` + // Sticker height + Height int32 `json:"height"` +} + +func (entity *InputMessageSticker) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageSticker + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageSticker) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageSticker) GetType() string { + return TypeInputMessageSticker +} + +func (*InputMessageSticker) InputMessageContentType() string { + return TypeInputMessageSticker +} + +func (inputMessageSticker *InputMessageSticker) UnmarshalJSON(data []byte) error { + var tmp struct { + Sticker json.RawMessage `json:"sticker"` + Thumbnail *InputThumbnail `json:"thumbnail"` + Width int32 `json:"width"` + Height int32 `json:"height"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessageSticker.Thumbnail = tmp.Thumbnail + inputMessageSticker.Width = tmp.Width + inputMessageSticker.Height = tmp.Height + + fieldSticker, _ := UnmarshalInputFile(tmp.Sticker) + inputMessageSticker.Sticker = fieldSticker + + return nil +} + +// A video message +type InputMessageVideo struct { + meta + // Video to be sent + Video InputFile `json:"video"` + // Video thumbnail, if available + Thumbnail *InputThumbnail `json:"thumbnail"` + // File identifiers of the stickers added to the video, if applicable + AddedStickerFileIds []int32 `json:"added_sticker_file_ids"` + // Duration of the video, in seconds + Duration int32 `json:"duration"` + // Video width + Width int32 `json:"width"` + // Video height + Height int32 `json:"height"` + // True, if the video should be tried to be streamed + SupportsStreaming bool `json:"supports_streaming"` + // Video caption; 0-200 characters + Caption *FormattedText `json:"caption"` + // Video TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats + Ttl int32 `json:"ttl"` +} + +func (entity *InputMessageVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageVideo + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageVideo) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageVideo) GetType() string { + return TypeInputMessageVideo +} + +func (*InputMessageVideo) InputMessageContentType() string { + return TypeInputMessageVideo +} + +func (inputMessageVideo *InputMessageVideo) UnmarshalJSON(data []byte) error { + var tmp struct { + Video json.RawMessage `json:"video"` + Thumbnail *InputThumbnail `json:"thumbnail"` + AddedStickerFileIds []int32 `json:"added_sticker_file_ids"` + Duration int32 `json:"duration"` + Width int32 `json:"width"` + Height int32 `json:"height"` + SupportsStreaming bool `json:"supports_streaming"` + Caption *FormattedText `json:"caption"` + Ttl int32 `json:"ttl"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessageVideo.Thumbnail = tmp.Thumbnail + inputMessageVideo.AddedStickerFileIds = tmp.AddedStickerFileIds + inputMessageVideo.Duration = tmp.Duration + inputMessageVideo.Width = tmp.Width + inputMessageVideo.Height = tmp.Height + inputMessageVideo.SupportsStreaming = tmp.SupportsStreaming + inputMessageVideo.Caption = tmp.Caption + inputMessageVideo.Ttl = tmp.Ttl + + fieldVideo, _ := UnmarshalInputFile(tmp.Video) + inputMessageVideo.Video = fieldVideo + + return nil +} + +// A video note message +type InputMessageVideoNote struct { + meta + // Video note to be sent + VideoNote InputFile `json:"video_note"` + // Video thumbnail, if available + Thumbnail *InputThumbnail `json:"thumbnail"` + // Duration of the video, in seconds + Duration int32 `json:"duration"` + // Video width and height; must be positive and not greater than 640 + Length int32 `json:"length"` +} + +func (entity *InputMessageVideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageVideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageVideoNote) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageVideoNote) GetType() string { + return TypeInputMessageVideoNote +} + +func (*InputMessageVideoNote) InputMessageContentType() string { + return TypeInputMessageVideoNote +} + +func (inputMessageVideoNote *InputMessageVideoNote) UnmarshalJSON(data []byte) error { + var tmp struct { + VideoNote json.RawMessage `json:"video_note"` + Thumbnail *InputThumbnail `json:"thumbnail"` + Duration int32 `json:"duration"` + Length int32 `json:"length"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessageVideoNote.Thumbnail = tmp.Thumbnail + inputMessageVideoNote.Duration = tmp.Duration + inputMessageVideoNote.Length = tmp.Length + + fieldVideoNote, _ := UnmarshalInputFile(tmp.VideoNote) + inputMessageVideoNote.VideoNote = fieldVideoNote + + return nil +} + +// A voice note message +type InputMessageVoiceNote struct { + meta + // Voice note to be sent + VoiceNote InputFile `json:"voice_note"` + // Duration of the voice note, in seconds + Duration int32 `json:"duration"` + // Waveform representation of the voice note, in 5-bit format + Waveform []byte `json:"waveform"` + // Voice note caption; 0-200 characters + Caption *FormattedText `json:"caption"` +} + +func (entity *InputMessageVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageVoiceNote) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageVoiceNote) GetType() string { + return TypeInputMessageVoiceNote +} + +func (*InputMessageVoiceNote) InputMessageContentType() string { + return TypeInputMessageVoiceNote +} + +func (inputMessageVoiceNote *InputMessageVoiceNote) UnmarshalJSON(data []byte) error { + var tmp struct { + VoiceNote json.RawMessage `json:"voice_note"` + Duration int32 `json:"duration"` + Waveform []byte `json:"waveform"` + Caption *FormattedText `json:"caption"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputMessageVoiceNote.Duration = tmp.Duration + inputMessageVoiceNote.Waveform = tmp.Waveform + inputMessageVoiceNote.Caption = tmp.Caption + + fieldVoiceNote, _ := UnmarshalInputFile(tmp.VoiceNote) + inputMessageVoiceNote.VoiceNote = fieldVoiceNote + + return nil +} + +// A message with a location +type InputMessageLocation struct { + meta + // Location to be sent + Location *Location `json:"location"` + // Period for which the location can be updated, in seconds; should bebetween 60 and 86400 for a live location and 0 otherwise + LivePeriod int32 `json:"live_period"` +} + +func (entity *InputMessageLocation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageLocation + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageLocation) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageLocation) GetType() string { + return TypeInputMessageLocation +} + +func (*InputMessageLocation) InputMessageContentType() string { + return TypeInputMessageLocation +} + +// A message with information about a venue +type InputMessageVenue struct { + meta + // Venue to send + Venue *Venue `json:"venue"` +} + +func (entity *InputMessageVenue) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageVenue + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageVenue) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageVenue) GetType() string { + return TypeInputMessageVenue +} + +func (*InputMessageVenue) InputMessageContentType() string { + return TypeInputMessageVenue +} + +// A message containing a user contact +type InputMessageContact struct { + meta + // Contact to send + Contact *Contact `json:"contact"` +} + +func (entity *InputMessageContact) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageContact + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageContact) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageContact) GetType() string { + return TypeInputMessageContact +} + +func (*InputMessageContact) InputMessageContentType() string { + return TypeInputMessageContact +} + +// A message with a game; not supported for channels or secret chats +type InputMessageGame struct { + meta + // User identifier of the bot that owns the game + BotUserId int32 `json:"bot_user_id"` + // Short name of the game + GameShortName string `json:"game_short_name"` +} + +func (entity *InputMessageGame) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageGame + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageGame) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageGame) GetType() string { + return TypeInputMessageGame +} + +func (*InputMessageGame) InputMessageContentType() string { + return TypeInputMessageGame +} + +// A message with an invoice; can be used only by bots and only in private chats +type InputMessageInvoice struct { + meta + // Invoice + Invoice *Invoice `json:"invoice"` + // Product title; 1-32 characters + Title string `json:"title"` + // Product description; 0-255 characters + Description string `json:"description"` + // Product photo URL; optional + PhotoUrl string `json:"photo_url"` + // Product photo size + PhotoSize int32 `json:"photo_size"` + // Product photo width + PhotoWidth int32 `json:"photo_width"` + // Product photo height + PhotoHeight int32 `json:"photo_height"` + // The invoice payload + Payload []byte `json:"payload"` + // Payment provider token + ProviderToken string `json:"provider_token"` + // JSON-encoded data about the invoice, which will be shared with the payment provider + ProviderData string `json:"provider_data"` + // Unique invoice bot start_parameter for the generation of this invoice + StartParameter string `json:"start_parameter"` +} + +func (entity *InputMessageInvoice) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageInvoice + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageInvoice) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageInvoice) GetType() string { + return TypeInputMessageInvoice +} + +func (*InputMessageInvoice) InputMessageContentType() string { + return TypeInputMessageInvoice +} + +// A forwarded message +type InputMessageForwarded struct { + meta + // Identifier for the chat this forwarded message came from + FromChatId int64 `json:"from_chat_id"` + // Identifier of the message to forward + MessageId int64 `json:"message_id"` + // True, if a game message should be shared within a launched game; applies only to game messages + InGameShare bool `json:"in_game_share"` +} + +func (entity *InputMessageForwarded) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputMessageForwarded + + return json.Marshal((*stub)(entity)) +} + +func (*InputMessageForwarded) GetClass() string { + return ClassInputMessageContent +} + +func (*InputMessageForwarded) GetType() string { + return TypeInputMessageForwarded +} + +func (*InputMessageForwarded) InputMessageContentType() string { + return TypeInputMessageForwarded +} + +// Returns all found messages, no filter is applied +type SearchMessagesFilterEmpty struct{ + meta +} + +func (entity *SearchMessagesFilterEmpty) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterEmpty + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterEmpty) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterEmpty) GetType() string { + return TypeSearchMessagesFilterEmpty +} + +func (*SearchMessagesFilterEmpty) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterEmpty +} + +// Returns only animation messages +type SearchMessagesFilterAnimation struct{ + meta +} + +func (entity *SearchMessagesFilterAnimation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterAnimation + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterAnimation) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterAnimation) GetType() string { + return TypeSearchMessagesFilterAnimation +} + +func (*SearchMessagesFilterAnimation) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterAnimation +} + +// Returns only audio messages +type SearchMessagesFilterAudio struct{ + meta +} + +func (entity *SearchMessagesFilterAudio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterAudio + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterAudio) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterAudio) GetType() string { + return TypeSearchMessagesFilterAudio +} + +func (*SearchMessagesFilterAudio) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterAudio +} + +// Returns only document messages +type SearchMessagesFilterDocument struct{ + meta +} + +func (entity *SearchMessagesFilterDocument) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterDocument + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterDocument) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterDocument) GetType() string { + return TypeSearchMessagesFilterDocument +} + +func (*SearchMessagesFilterDocument) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterDocument +} + +// Returns only photo messages +type SearchMessagesFilterPhoto struct{ + meta +} + +func (entity *SearchMessagesFilterPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterPhoto) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterPhoto) GetType() string { + return TypeSearchMessagesFilterPhoto +} + +func (*SearchMessagesFilterPhoto) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterPhoto +} + +// Returns only video messages +type SearchMessagesFilterVideo struct{ + meta +} + +func (entity *SearchMessagesFilterVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterVideo + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterVideo) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterVideo) GetType() string { + return TypeSearchMessagesFilterVideo +} + +func (*SearchMessagesFilterVideo) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterVideo +} + +// Returns only voice note messages +type SearchMessagesFilterVoiceNote struct{ + meta +} + +func (entity *SearchMessagesFilterVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterVoiceNote) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterVoiceNote) GetType() string { + return TypeSearchMessagesFilterVoiceNote +} + +func (*SearchMessagesFilterVoiceNote) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterVoiceNote +} + +// Returns only photo and video messages +type SearchMessagesFilterPhotoAndVideo struct{ + meta +} + +func (entity *SearchMessagesFilterPhotoAndVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterPhotoAndVideo + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterPhotoAndVideo) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterPhotoAndVideo) GetType() string { + return TypeSearchMessagesFilterPhotoAndVideo +} + +func (*SearchMessagesFilterPhotoAndVideo) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterPhotoAndVideo +} + +// Returns only messages containing URLs +type SearchMessagesFilterUrl struct{ + meta +} + +func (entity *SearchMessagesFilterUrl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterUrl + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterUrl) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterUrl) GetType() string { + return TypeSearchMessagesFilterUrl +} + +func (*SearchMessagesFilterUrl) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterUrl +} + +// Returns only messages containing chat photos +type SearchMessagesFilterChatPhoto struct{ + meta +} + +func (entity *SearchMessagesFilterChatPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterChatPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterChatPhoto) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterChatPhoto) GetType() string { + return TypeSearchMessagesFilterChatPhoto +} + +func (*SearchMessagesFilterChatPhoto) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterChatPhoto +} + +// Returns only call messages +type SearchMessagesFilterCall struct{ + meta +} + +func (entity *SearchMessagesFilterCall) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterCall + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterCall) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterCall) GetType() string { + return TypeSearchMessagesFilterCall +} + +func (*SearchMessagesFilterCall) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterCall +} + +// Returns only incoming call messages with missed/declined discard reasons +type SearchMessagesFilterMissedCall struct{ + meta +} + +func (entity *SearchMessagesFilterMissedCall) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterMissedCall + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterMissedCall) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterMissedCall) GetType() string { + return TypeSearchMessagesFilterMissedCall +} + +func (*SearchMessagesFilterMissedCall) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterMissedCall +} + +// Returns only video note messages +type SearchMessagesFilterVideoNote struct{ + meta +} + +func (entity *SearchMessagesFilterVideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterVideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterVideoNote) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterVideoNote) GetType() string { + return TypeSearchMessagesFilterVideoNote +} + +func (*SearchMessagesFilterVideoNote) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterVideoNote +} + +// Returns only voice and video note messages +type SearchMessagesFilterVoiceAndVideoNote struct{ + meta +} + +func (entity *SearchMessagesFilterVoiceAndVideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterVoiceAndVideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterVoiceAndVideoNote) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterVoiceAndVideoNote) GetType() string { + return TypeSearchMessagesFilterVoiceAndVideoNote +} + +func (*SearchMessagesFilterVoiceAndVideoNote) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterVoiceAndVideoNote +} + +// Returns only messages with mentions of the current user, or messages that are replies to their messages +type SearchMessagesFilterMention struct{ + meta +} + +func (entity *SearchMessagesFilterMention) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterMention + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterMention) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterMention) GetType() string { + return TypeSearchMessagesFilterMention +} + +func (*SearchMessagesFilterMention) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterMention +} + +// Returns only messages with unread mentions of the current user or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query or by the sending user +type SearchMessagesFilterUnreadMention struct{ + meta +} + +func (entity *SearchMessagesFilterUnreadMention) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub SearchMessagesFilterUnreadMention + + return json.Marshal((*stub)(entity)) +} + +func (*SearchMessagesFilterUnreadMention) GetClass() string { + return ClassSearchMessagesFilter +} + +func (*SearchMessagesFilterUnreadMention) GetType() string { + return TypeSearchMessagesFilterUnreadMention +} + +func (*SearchMessagesFilterUnreadMention) SearchMessagesFilterType() string { + return TypeSearchMessagesFilterUnreadMention +} + +// The user is typing a message +type ChatActionTyping struct{ + meta +} + +func (entity *ChatActionTyping) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionTyping + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionTyping) GetClass() string { + return ClassChatAction +} + +func (*ChatActionTyping) GetType() string { + return TypeChatActionTyping +} + +func (*ChatActionTyping) ChatActionType() string { + return TypeChatActionTyping +} + +// The user is recording a video +type ChatActionRecordingVideo struct{ + meta +} + +func (entity *ChatActionRecordingVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionRecordingVideo + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionRecordingVideo) GetClass() string { + return ClassChatAction +} + +func (*ChatActionRecordingVideo) GetType() string { + return TypeChatActionRecordingVideo +} + +func (*ChatActionRecordingVideo) ChatActionType() string { + return TypeChatActionRecordingVideo +} + +// The user is uploading a video +type ChatActionUploadingVideo struct { + meta + // Upload progress, as a percentage + Progress int32 `json:"progress"` +} + +func (entity *ChatActionUploadingVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionUploadingVideo + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionUploadingVideo) GetClass() string { + return ClassChatAction +} + +func (*ChatActionUploadingVideo) GetType() string { + return TypeChatActionUploadingVideo +} + +func (*ChatActionUploadingVideo) ChatActionType() string { + return TypeChatActionUploadingVideo +} + +// The user is recording a voice note +type ChatActionRecordingVoiceNote struct{ + meta +} + +func (entity *ChatActionRecordingVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionRecordingVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionRecordingVoiceNote) GetClass() string { + return ClassChatAction +} + +func (*ChatActionRecordingVoiceNote) GetType() string { + return TypeChatActionRecordingVoiceNote +} + +func (*ChatActionRecordingVoiceNote) ChatActionType() string { + return TypeChatActionRecordingVoiceNote +} + +// The user is uploading a voice note +type ChatActionUploadingVoiceNote struct { + meta + // Upload progress, as a percentage + Progress int32 `json:"progress"` +} + +func (entity *ChatActionUploadingVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionUploadingVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionUploadingVoiceNote) GetClass() string { + return ClassChatAction +} + +func (*ChatActionUploadingVoiceNote) GetType() string { + return TypeChatActionUploadingVoiceNote +} + +func (*ChatActionUploadingVoiceNote) ChatActionType() string { + return TypeChatActionUploadingVoiceNote +} + +// The user is uploading a photo +type ChatActionUploadingPhoto struct { + meta + // Upload progress, as a percentage + Progress int32 `json:"progress"` +} + +func (entity *ChatActionUploadingPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionUploadingPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionUploadingPhoto) GetClass() string { + return ClassChatAction +} + +func (*ChatActionUploadingPhoto) GetType() string { + return TypeChatActionUploadingPhoto +} + +func (*ChatActionUploadingPhoto) ChatActionType() string { + return TypeChatActionUploadingPhoto +} + +// The user is uploading a document +type ChatActionUploadingDocument struct { + meta + // Upload progress, as a percentage + Progress int32 `json:"progress"` +} + +func (entity *ChatActionUploadingDocument) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionUploadingDocument + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionUploadingDocument) GetClass() string { + return ClassChatAction +} + +func (*ChatActionUploadingDocument) GetType() string { + return TypeChatActionUploadingDocument +} + +func (*ChatActionUploadingDocument) ChatActionType() string { + return TypeChatActionUploadingDocument +} + +// The user is picking a location or venue to send +type ChatActionChoosingLocation struct{ + meta +} + +func (entity *ChatActionChoosingLocation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionChoosingLocation + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionChoosingLocation) GetClass() string { + return ClassChatAction +} + +func (*ChatActionChoosingLocation) GetType() string { + return TypeChatActionChoosingLocation +} + +func (*ChatActionChoosingLocation) ChatActionType() string { + return TypeChatActionChoosingLocation +} + +// The user is picking a contact to send +type ChatActionChoosingContact struct{ + meta +} + +func (entity *ChatActionChoosingContact) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionChoosingContact + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionChoosingContact) GetClass() string { + return ClassChatAction +} + +func (*ChatActionChoosingContact) GetType() string { + return TypeChatActionChoosingContact +} + +func (*ChatActionChoosingContact) ChatActionType() string { + return TypeChatActionChoosingContact +} + +// The user has started to play a game +type ChatActionStartPlayingGame struct{ + meta +} + +func (entity *ChatActionStartPlayingGame) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionStartPlayingGame + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionStartPlayingGame) GetClass() string { + return ClassChatAction +} + +func (*ChatActionStartPlayingGame) GetType() string { + return TypeChatActionStartPlayingGame +} + +func (*ChatActionStartPlayingGame) ChatActionType() string { + return TypeChatActionStartPlayingGame +} + +// The user is recording a video note +type ChatActionRecordingVideoNote struct{ + meta +} + +func (entity *ChatActionRecordingVideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionRecordingVideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionRecordingVideoNote) GetClass() string { + return ClassChatAction +} + +func (*ChatActionRecordingVideoNote) GetType() string { + return TypeChatActionRecordingVideoNote +} + +func (*ChatActionRecordingVideoNote) ChatActionType() string { + return TypeChatActionRecordingVideoNote +} + +// The user is uploading a video note +type ChatActionUploadingVideoNote struct { + meta + // Upload progress, as a percentage + Progress int32 `json:"progress"` +} + +func (entity *ChatActionUploadingVideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionUploadingVideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionUploadingVideoNote) GetClass() string { + return ClassChatAction +} + +func (*ChatActionUploadingVideoNote) GetType() string { + return TypeChatActionUploadingVideoNote +} + +func (*ChatActionUploadingVideoNote) ChatActionType() string { + return TypeChatActionUploadingVideoNote +} + +// The user has cancelled the previous action +type ChatActionCancel struct{ + meta +} + +func (entity *ChatActionCancel) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatActionCancel + + return json.Marshal((*stub)(entity)) +} + +func (*ChatActionCancel) GetClass() string { + return ClassChatAction +} + +func (*ChatActionCancel) GetType() string { + return TypeChatActionCancel +} + +func (*ChatActionCancel) ChatActionType() string { + return TypeChatActionCancel +} + +// The user status was never changed +type UserStatusEmpty struct{ + meta +} + +func (entity *UserStatusEmpty) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserStatusEmpty + + return json.Marshal((*stub)(entity)) +} + +func (*UserStatusEmpty) GetClass() string { + return ClassUserStatus +} + +func (*UserStatusEmpty) GetType() string { + return TypeUserStatusEmpty +} + +func (*UserStatusEmpty) UserStatusType() string { + return TypeUserStatusEmpty +} + +// The user is online +type UserStatusOnline struct { + meta + // Point in time (Unix timestamp) when the user's online status will expire + Expires int32 `json:"expires"` +} + +func (entity *UserStatusOnline) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserStatusOnline + + return json.Marshal((*stub)(entity)) +} + +func (*UserStatusOnline) GetClass() string { + return ClassUserStatus +} + +func (*UserStatusOnline) GetType() string { + return TypeUserStatusOnline +} + +func (*UserStatusOnline) UserStatusType() string { + return TypeUserStatusOnline +} + +// The user is offline +type UserStatusOffline struct { + meta + // Point in time (Unix timestamp) when the user was last online + WasOnline int32 `json:"was_online"` +} + +func (entity *UserStatusOffline) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserStatusOffline + + return json.Marshal((*stub)(entity)) +} + +func (*UserStatusOffline) GetClass() string { + return ClassUserStatus +} + +func (*UserStatusOffline) GetType() string { + return TypeUserStatusOffline +} + +func (*UserStatusOffline) UserStatusType() string { + return TypeUserStatusOffline +} + +// The user was online recently +type UserStatusRecently struct{ + meta +} + +func (entity *UserStatusRecently) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserStatusRecently + + return json.Marshal((*stub)(entity)) +} + +func (*UserStatusRecently) GetClass() string { + return ClassUserStatus +} + +func (*UserStatusRecently) GetType() string { + return TypeUserStatusRecently +} + +func (*UserStatusRecently) UserStatusType() string { + return TypeUserStatusRecently +} + +// The user is offline, but was online last week +type UserStatusLastWeek struct{ + meta +} + +func (entity *UserStatusLastWeek) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserStatusLastWeek + + return json.Marshal((*stub)(entity)) +} + +func (*UserStatusLastWeek) GetClass() string { + return ClassUserStatus +} + +func (*UserStatusLastWeek) GetType() string { + return TypeUserStatusLastWeek +} + +func (*UserStatusLastWeek) UserStatusType() string { + return TypeUserStatusLastWeek +} + +// The user is offline, but was online last month +type UserStatusLastMonth struct{ + meta +} + +func (entity *UserStatusLastMonth) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserStatusLastMonth + + return json.Marshal((*stub)(entity)) +} + +func (*UserStatusLastMonth) GetClass() string { + return ClassUserStatus +} + +func (*UserStatusLastMonth) GetType() string { + return TypeUserStatusLastMonth +} + +func (*UserStatusLastMonth) UserStatusType() string { + return TypeUserStatusLastMonth +} + +// Represents a list of stickers +type Stickers struct { + meta + // List of stickers + Stickers []*Sticker `json:"stickers"` +} + +func (entity *Stickers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Stickers + + return json.Marshal((*stub)(entity)) +} + +func (*Stickers) GetClass() string { + return ClassStickers +} + +func (*Stickers) GetType() string { + return TypeStickers +} + +// Represents a list of all emoji corresponding to a sticker in a sticker set. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object +type StickerEmojis struct { + meta + // List of emojis + Emojis []string `json:"emojis"` +} + +func (entity *StickerEmojis) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StickerEmojis + + return json.Marshal((*stub)(entity)) +} + +func (*StickerEmojis) GetClass() string { + return ClassStickerEmojis +} + +func (*StickerEmojis) GetType() string { + return TypeStickerEmojis +} + +// Represents a sticker set +type StickerSet struct { + meta + // Identifier of the sticker set + Id JsonInt64 `json:"id"` + // Title of the sticker set + Title string `json:"title"` + // Name of the sticker set + Name string `json:"name"` + // True, if the sticker set has been installed by the current user + IsInstalled bool `json:"is_installed"` + // True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously + IsArchived bool `json:"is_archived"` + // True, if the sticker set is official + IsOfficial bool `json:"is_official"` + // True, if the stickers in the set are masks + IsMasks bool `json:"is_masks"` + // True for already viewed trending sticker sets + IsViewed bool `json:"is_viewed"` + // List of stickers in this set + Stickers []*Sticker `json:"stickers"` + // A list of emoji corresponding to the stickers in the same order + Emojis []*StickerEmojis `json:"emojis"` +} + +func (entity *StickerSet) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StickerSet + + return json.Marshal((*stub)(entity)) +} + +func (*StickerSet) GetClass() string { + return ClassStickerSet +} + +func (*StickerSet) GetType() string { + return TypeStickerSet +} + +// Represents short information about a sticker set +type StickerSetInfo struct { + meta + // Identifier of the sticker set + Id JsonInt64 `json:"id"` + // Title of the sticker set + Title string `json:"title"` + // Name of the sticker set + Name string `json:"name"` + // True, if the sticker set has been installed by current user + IsInstalled bool `json:"is_installed"` + // True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously + IsArchived bool `json:"is_archived"` + // True, if the sticker set is official + IsOfficial bool `json:"is_official"` + // True, if the stickers in the set are masks + IsMasks bool `json:"is_masks"` + // True for already viewed trending sticker sets + IsViewed bool `json:"is_viewed"` + // Total number of stickers in the set + Size int32 `json:"size"` + // Contains up to the first 5 stickers from the set, depending on the context. If the client needs more stickers the full set should be requested + Covers []*Sticker `json:"covers"` +} + +func (entity *StickerSetInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StickerSetInfo + + return json.Marshal((*stub)(entity)) +} + +func (*StickerSetInfo) GetClass() string { + return ClassStickerSetInfo +} + +func (*StickerSetInfo) GetType() string { + return TypeStickerSetInfo +} + +// Represents a list of sticker sets +type StickerSets struct { + meta + // Approximate total number of sticker sets found + TotalCount int32 `json:"total_count"` + // List of sticker sets + Sets []*StickerSetInfo `json:"sets"` +} + +func (entity *StickerSets) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StickerSets + + return json.Marshal((*stub)(entity)) +} + +func (*StickerSets) GetClass() string { + return ClassStickerSets +} + +func (*StickerSets) GetType() string { + return TypeStickerSets +} + +// The call wasn't discarded, or the reason is unknown +type CallDiscardReasonEmpty struct{ + meta +} + +func (entity *CallDiscardReasonEmpty) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallDiscardReasonEmpty + + return json.Marshal((*stub)(entity)) +} + +func (*CallDiscardReasonEmpty) GetClass() string { + return ClassCallDiscardReason +} + +func (*CallDiscardReasonEmpty) GetType() string { + return TypeCallDiscardReasonEmpty +} + +func (*CallDiscardReasonEmpty) CallDiscardReasonType() string { + return TypeCallDiscardReasonEmpty +} + +// The call was ended before the conversation started. It was cancelled by the caller or missed by the other party +type CallDiscardReasonMissed struct{ + meta +} + +func (entity *CallDiscardReasonMissed) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallDiscardReasonMissed + + return json.Marshal((*stub)(entity)) +} + +func (*CallDiscardReasonMissed) GetClass() string { + return ClassCallDiscardReason +} + +func (*CallDiscardReasonMissed) GetType() string { + return TypeCallDiscardReasonMissed +} + +func (*CallDiscardReasonMissed) CallDiscardReasonType() string { + return TypeCallDiscardReasonMissed +} + +// The call was ended before the conversation started. It was declined by the other party +type CallDiscardReasonDeclined struct{ + meta +} + +func (entity *CallDiscardReasonDeclined) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallDiscardReasonDeclined + + return json.Marshal((*stub)(entity)) +} + +func (*CallDiscardReasonDeclined) GetClass() string { + return ClassCallDiscardReason +} + +func (*CallDiscardReasonDeclined) GetType() string { + return TypeCallDiscardReasonDeclined +} + +func (*CallDiscardReasonDeclined) CallDiscardReasonType() string { + return TypeCallDiscardReasonDeclined +} + +// The call was ended during the conversation because the users were disconnected +type CallDiscardReasonDisconnected struct{ + meta +} + +func (entity *CallDiscardReasonDisconnected) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallDiscardReasonDisconnected + + return json.Marshal((*stub)(entity)) +} + +func (*CallDiscardReasonDisconnected) GetClass() string { + return ClassCallDiscardReason +} + +func (*CallDiscardReasonDisconnected) GetType() string { + return TypeCallDiscardReasonDisconnected +} + +func (*CallDiscardReasonDisconnected) CallDiscardReasonType() string { + return TypeCallDiscardReasonDisconnected +} + +// The call was ended because one of the parties hung up +type CallDiscardReasonHungUp struct{ + meta +} + +func (entity *CallDiscardReasonHungUp) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallDiscardReasonHungUp + + return json.Marshal((*stub)(entity)) +} + +func (*CallDiscardReasonHungUp) GetClass() string { + return ClassCallDiscardReason +} + +func (*CallDiscardReasonHungUp) GetType() string { + return TypeCallDiscardReasonHungUp +} + +func (*CallDiscardReasonHungUp) CallDiscardReasonType() string { + return TypeCallDiscardReasonHungUp +} + +// Specifies the supported call protocols +type CallProtocol struct { + meta + // True, if UDP peer-to-peer connections are supported + UdpP2p bool `json:"udp_p2p"` + // True, if connection through UDP reflectors is supported + UdpReflector bool `json:"udp_reflector"` + // Minimum supported API layer; use 65 + MinLayer int32 `json:"min_layer"` + // Maximum supported API layer; use 65 + MaxLayer int32 `json:"max_layer"` +} + +func (entity *CallProtocol) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallProtocol + + return json.Marshal((*stub)(entity)) +} + +func (*CallProtocol) GetClass() string { + return ClassCallProtocol +} + +func (*CallProtocol) GetType() string { + return TypeCallProtocol +} + +// Describes the address of UDP reflectors +type CallConnection struct { + meta + // Reflector identifier + Id JsonInt64 `json:"id"` + // IPv4 reflector address + Ip string `json:"ip"` + // IPv6 reflector address + Ipv6 string `json:"ipv6"` + // Reflector port number + Port int32 `json:"port"` + // Connection peer tag + PeerTag []byte `json:"peer_tag"` +} + +func (entity *CallConnection) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallConnection + + return json.Marshal((*stub)(entity)) +} + +func (*CallConnection) GetClass() string { + return ClassCallConnection +} + +func (*CallConnection) GetType() string { + return TypeCallConnection +} + +// Contains the call identifier +type CallId struct { + meta + // Call identifier + Id int32 `json:"id"` +} + +func (entity *CallId) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallId + + return json.Marshal((*stub)(entity)) +} + +func (*CallId) GetClass() string { + return ClassCallId +} + +func (*CallId) GetType() string { + return TypeCallId +} + +// The call is pending, waiting to be accepted by a user +type CallStatePending struct { + meta + // True, if the call has already been created by the server + IsCreated bool `json:"is_created"` + // True, if the call has already been received by the other party + IsReceived bool `json:"is_received"` +} + +func (entity *CallStatePending) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallStatePending + + return json.Marshal((*stub)(entity)) +} + +func (*CallStatePending) GetClass() string { + return ClassCallState +} + +func (*CallStatePending) GetType() string { + return TypeCallStatePending +} + +func (*CallStatePending) CallStateType() string { + return TypeCallStatePending +} + +// The call has been answered and encryption keys are being exchanged +type CallStateExchangingKeys struct{ + meta +} + +func (entity *CallStateExchangingKeys) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallStateExchangingKeys + + return json.Marshal((*stub)(entity)) +} + +func (*CallStateExchangingKeys) GetClass() string { + return ClassCallState +} + +func (*CallStateExchangingKeys) GetType() string { + return TypeCallStateExchangingKeys +} + +func (*CallStateExchangingKeys) CallStateType() string { + return TypeCallStateExchangingKeys +} + +// The call is ready to use +type CallStateReady struct { + meta + // Call protocols supported by the peer + Protocol *CallProtocol `json:"protocol"` + // Available UDP reflectors + Connections []*CallConnection `json:"connections"` + // A JSON-encoded call config + Config string `json:"config"` + // Call encryption key + EncryptionKey []byte `json:"encryption_key"` + // Encryption key emojis fingerprint + Emojis []string `json:"emojis"` +} + +func (entity *CallStateReady) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallStateReady + + return json.Marshal((*stub)(entity)) +} + +func (*CallStateReady) GetClass() string { + return ClassCallState +} + +func (*CallStateReady) GetType() string { + return TypeCallStateReady +} + +func (*CallStateReady) CallStateType() string { + return TypeCallStateReady +} + +// The call is hanging up after discardCall has been called +type CallStateHangingUp struct{ + meta +} + +func (entity *CallStateHangingUp) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallStateHangingUp + + return json.Marshal((*stub)(entity)) +} + +func (*CallStateHangingUp) GetClass() string { + return ClassCallState +} + +func (*CallStateHangingUp) GetType() string { + return TypeCallStateHangingUp +} + +func (*CallStateHangingUp) CallStateType() string { + return TypeCallStateHangingUp +} + +// The call has ended successfully +type CallStateDiscarded struct { + meta + // The reason, why the call has ended + Reason CallDiscardReason `json:"reason"` + // True, if the call rating should be sent to the server + NeedRating bool `json:"need_rating"` + // True, if the call debug information should be sent to the server + NeedDebugInformation bool `json:"need_debug_information"` +} + +func (entity *CallStateDiscarded) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallStateDiscarded + + return json.Marshal((*stub)(entity)) +} + +func (*CallStateDiscarded) GetClass() string { + return ClassCallState +} + +func (*CallStateDiscarded) GetType() string { + return TypeCallStateDiscarded +} + +func (*CallStateDiscarded) CallStateType() string { + return TypeCallStateDiscarded +} + +func (callStateDiscarded *CallStateDiscarded) UnmarshalJSON(data []byte) error { + var tmp struct { + Reason json.RawMessage `json:"reason"` + NeedRating bool `json:"need_rating"` + NeedDebugInformation bool `json:"need_debug_information"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + callStateDiscarded.NeedRating = tmp.NeedRating + callStateDiscarded.NeedDebugInformation = tmp.NeedDebugInformation + + fieldReason, _ := UnmarshalCallDiscardReason(tmp.Reason) + callStateDiscarded.Reason = fieldReason + + return nil +} + +// The call has ended with an error +type CallStateError struct { + meta + // Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout + Error *Error `json:"error"` +} + +func (entity *CallStateError) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallStateError + + return json.Marshal((*stub)(entity)) +} + +func (*CallStateError) GetClass() string { + return ClassCallState +} + +func (*CallStateError) GetType() string { + return TypeCallStateError +} + +func (*CallStateError) CallStateType() string { + return TypeCallStateError +} + +// Describes a call +type Call struct { + meta + // Call identifier, not persistent + Id int32 `json:"id"` + // Peer user identifier + UserId int32 `json:"user_id"` + // True, if the call is outgoing + IsOutgoing bool `json:"is_outgoing"` + // Call state + State CallState `json:"state"` +} + +func (entity *Call) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Call + + return json.Marshal((*stub)(entity)) +} + +func (*Call) GetClass() string { + return ClassCall +} + +func (*Call) GetType() string { + return TypeCall +} + +func (call *Call) UnmarshalJSON(data []byte) error { + var tmp struct { + Id int32 `json:"id"` + UserId int32 `json:"user_id"` + IsOutgoing bool `json:"is_outgoing"` + State json.RawMessage `json:"state"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + call.Id = tmp.Id + call.UserId = tmp.UserId + call.IsOutgoing = tmp.IsOutgoing + + fieldState, _ := UnmarshalCallState(tmp.State) + call.State = fieldState + + return nil +} + +// Represents a list of animations +type Animations struct { + meta + // List of animations + Animations []*Animation `json:"animations"` +} + +func (entity *Animations) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Animations + + return json.Marshal((*stub)(entity)) +} + +func (*Animations) GetClass() string { + return ClassAnimations +} + +func (*Animations) GetType() string { + return TypeAnimations +} + +// Represents the result of an ImportContacts request +type ImportedContacts struct { + meta + // User identifiers of the imported contacts in the same order as they were specified in the request; 0 if the contact is not yet a registered user + UserIds []int32 `json:"user_ids"` + // The number of users that imported the corresponding contact; 0 for already registered users or if unavailable + ImporterCount []int32 `json:"importer_count"` +} + +func (entity *ImportedContacts) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ImportedContacts + + return json.Marshal((*stub)(entity)) +} + +func (*ImportedContacts) GetClass() string { + return ClassImportedContacts +} + +func (*ImportedContacts) GetType() string { + return TypeImportedContacts +} + +// Represents a link to an animated GIF +type InputInlineQueryResultAnimatedGif struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Title of the query result + Title string `json:"title"` + // URL of the static result thumbnail (JPEG or GIF), if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // The URL of the GIF-file (file size must not exceed 1MB) + GifUrl string `json:"gif_url"` + // Duration of the GIF, in seconds + GifDuration int32 `json:"gif_duration"` + // Width of the GIF + GifWidth int32 `json:"gif_width"` + // Height of the GIF + GifHeight int32 `json:"gif_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAnimation, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultAnimatedGif) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultAnimatedGif + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultAnimatedGif) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultAnimatedGif) GetType() string { + return TypeInputInlineQueryResultAnimatedGif +} + +func (*InputInlineQueryResultAnimatedGif) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultAnimatedGif +} + +func (inputInlineQueryResultAnimatedGif *InputInlineQueryResultAnimatedGif) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Title string `json:"title"` + ThumbnailUrl string `json:"thumbnail_url"` + GifUrl string `json:"gif_url"` + GifDuration int32 `json:"gif_duration"` + GifWidth int32 `json:"gif_width"` + GifHeight int32 `json:"gif_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultAnimatedGif.Id = tmp.Id + inputInlineQueryResultAnimatedGif.Title = tmp.Title + inputInlineQueryResultAnimatedGif.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultAnimatedGif.GifUrl = tmp.GifUrl + inputInlineQueryResultAnimatedGif.GifDuration = tmp.GifDuration + inputInlineQueryResultAnimatedGif.GifWidth = tmp.GifWidth + inputInlineQueryResultAnimatedGif.GifHeight = tmp.GifHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultAnimatedGif.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultAnimatedGif.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to an animated (i.e. without sound) H.264/MPEG-4 AVC video +type InputInlineQueryResultAnimatedMpeg4 struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Title of the result + Title string `json:"title"` + // URL of the static result thumbnail (JPEG or GIF), if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // The URL of the MPEG4-file (file size must not exceed 1MB) + Mpeg4Url string `json:"mpeg4_url"` + // Duration of the video, in seconds + Mpeg4Duration int32 `json:"mpeg4_duration"` + // Width of the video + Mpeg4Width int32 `json:"mpeg4_width"` + // Height of the video + Mpeg4Height int32 `json:"mpeg4_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAnimation, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultAnimatedMpeg4) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultAnimatedMpeg4 + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultAnimatedMpeg4) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultAnimatedMpeg4) GetType() string { + return TypeInputInlineQueryResultAnimatedMpeg4 +} + +func (*InputInlineQueryResultAnimatedMpeg4) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultAnimatedMpeg4 +} + +func (inputInlineQueryResultAnimatedMpeg4 *InputInlineQueryResultAnimatedMpeg4) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Title string `json:"title"` + ThumbnailUrl string `json:"thumbnail_url"` + Mpeg4Url string `json:"mpeg4_url"` + Mpeg4Duration int32 `json:"mpeg4_duration"` + Mpeg4Width int32 `json:"mpeg4_width"` + Mpeg4Height int32 `json:"mpeg4_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultAnimatedMpeg4.Id = tmp.Id + inputInlineQueryResultAnimatedMpeg4.Title = tmp.Title + inputInlineQueryResultAnimatedMpeg4.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultAnimatedMpeg4.Mpeg4Url = tmp.Mpeg4Url + inputInlineQueryResultAnimatedMpeg4.Mpeg4Duration = tmp.Mpeg4Duration + inputInlineQueryResultAnimatedMpeg4.Mpeg4Width = tmp.Mpeg4Width + inputInlineQueryResultAnimatedMpeg4.Mpeg4Height = tmp.Mpeg4Height + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultAnimatedMpeg4.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultAnimatedMpeg4.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to an article or web page +type InputInlineQueryResultArticle struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // URL of the result, if it exists + Url string `json:"url"` + // True, if the URL must be not shown + HideUrl bool `json:"hide_url"` + // Title of the result + Title string `json:"title"` + // A short description of the result + Description string `json:"description"` + // URL of the result thumbnail, if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // Thumbnail width, if known + ThumbnailWidth int32 `json:"thumbnail_width"` + // Thumbnail height, if known + ThumbnailHeight int32 `json:"thumbnail_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultArticle) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultArticle + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultArticle) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultArticle) GetType() string { + return TypeInputInlineQueryResultArticle +} + +func (*InputInlineQueryResultArticle) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultArticle +} + +func (inputInlineQueryResultArticle *InputInlineQueryResultArticle) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Url string `json:"url"` + HideUrl bool `json:"hide_url"` + Title string `json:"title"` + Description string `json:"description"` + ThumbnailUrl string `json:"thumbnail_url"` + ThumbnailWidth int32 `json:"thumbnail_width"` + ThumbnailHeight int32 `json:"thumbnail_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultArticle.Id = tmp.Id + inputInlineQueryResultArticle.Url = tmp.Url + inputInlineQueryResultArticle.HideUrl = tmp.HideUrl + inputInlineQueryResultArticle.Title = tmp.Title + inputInlineQueryResultArticle.Description = tmp.Description + inputInlineQueryResultArticle.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultArticle.ThumbnailWidth = tmp.ThumbnailWidth + inputInlineQueryResultArticle.ThumbnailHeight = tmp.ThumbnailHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultArticle.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultArticle.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to an MP3 audio file +type InputInlineQueryResultAudio struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Title of the audio file + Title string `json:"title"` + // Performer of the audio file + Performer string `json:"performer"` + // The URL of the audio file + AudioUrl string `json:"audio_url"` + // Audio file duration, in seconds + AudioDuration int32 `json:"audio_duration"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAudio, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultAudio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultAudio + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultAudio) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultAudio) GetType() string { + return TypeInputInlineQueryResultAudio +} + +func (*InputInlineQueryResultAudio) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultAudio +} + +func (inputInlineQueryResultAudio *InputInlineQueryResultAudio) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Title string `json:"title"` + Performer string `json:"performer"` + AudioUrl string `json:"audio_url"` + AudioDuration int32 `json:"audio_duration"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultAudio.Id = tmp.Id + inputInlineQueryResultAudio.Title = tmp.Title + inputInlineQueryResultAudio.Performer = tmp.Performer + inputInlineQueryResultAudio.AudioUrl = tmp.AudioUrl + inputInlineQueryResultAudio.AudioDuration = tmp.AudioDuration + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultAudio.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultAudio.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a user contact +type InputInlineQueryResultContact struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // User contact + Contact *Contact `json:"contact"` + // URL of the result thumbnail, if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // Thumbnail width, if known + ThumbnailWidth int32 `json:"thumbnail_width"` + // Thumbnail height, if known + ThumbnailHeight int32 `json:"thumbnail_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultContact) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultContact + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultContact) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultContact) GetType() string { + return TypeInputInlineQueryResultContact +} + +func (*InputInlineQueryResultContact) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultContact +} + +func (inputInlineQueryResultContact *InputInlineQueryResultContact) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Contact *Contact `json:"contact"` + ThumbnailUrl string `json:"thumbnail_url"` + ThumbnailWidth int32 `json:"thumbnail_width"` + ThumbnailHeight int32 `json:"thumbnail_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultContact.Id = tmp.Id + inputInlineQueryResultContact.Contact = tmp.Contact + inputInlineQueryResultContact.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultContact.ThumbnailWidth = tmp.ThumbnailWidth + inputInlineQueryResultContact.ThumbnailHeight = tmp.ThumbnailHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultContact.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultContact.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to a file +type InputInlineQueryResultDocument struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Title of the resulting file + Title string `json:"title"` + // Short description of the result, if known + Description string `json:"description"` + // URL of the file + DocumentUrl string `json:"document_url"` + // MIME type of the file content; only "application/pdf" and "application/zip" are currently allowed + MimeType string `json:"mime_type"` + // The URL of the file thumbnail, if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // Width of the thumbnail + ThumbnailWidth int32 `json:"thumbnail_width"` + // Height of the thumbnail + ThumbnailHeight int32 `json:"thumbnail_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageDocument, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultDocument) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultDocument + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultDocument) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultDocument) GetType() string { + return TypeInputInlineQueryResultDocument +} + +func (*InputInlineQueryResultDocument) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultDocument +} + +func (inputInlineQueryResultDocument *InputInlineQueryResultDocument) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Title string `json:"title"` + Description string `json:"description"` + DocumentUrl string `json:"document_url"` + MimeType string `json:"mime_type"` + ThumbnailUrl string `json:"thumbnail_url"` + ThumbnailWidth int32 `json:"thumbnail_width"` + ThumbnailHeight int32 `json:"thumbnail_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultDocument.Id = tmp.Id + inputInlineQueryResultDocument.Title = tmp.Title + inputInlineQueryResultDocument.Description = tmp.Description + inputInlineQueryResultDocument.DocumentUrl = tmp.DocumentUrl + inputInlineQueryResultDocument.MimeType = tmp.MimeType + inputInlineQueryResultDocument.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultDocument.ThumbnailWidth = tmp.ThumbnailWidth + inputInlineQueryResultDocument.ThumbnailHeight = tmp.ThumbnailHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultDocument.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultDocument.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a game +type InputInlineQueryResultGame struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Short name of the game + GameShortName string `json:"game_short_name"` + // Message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` +} + +func (entity *InputInlineQueryResultGame) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultGame + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultGame) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultGame) GetType() string { + return TypeInputInlineQueryResultGame +} + +func (*InputInlineQueryResultGame) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultGame +} + +func (inputInlineQueryResultGame *InputInlineQueryResultGame) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + GameShortName string `json:"game_short_name"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultGame.Id = tmp.Id + inputInlineQueryResultGame.GameShortName = tmp.GameShortName + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultGame.ReplyMarkup = fieldReplyMarkup + + return nil +} + +// Represents a point on the map +type InputInlineQueryResultLocation struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Location result + Location *Location `json:"location"` + // Amount of time relative to the message sent time until the location can be updated, in seconds + LivePeriod int32 `json:"live_period"` + // Title of the result + Title string `json:"title"` + // URL of the result thumbnail, if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // Thumbnail width, if known + ThumbnailWidth int32 `json:"thumbnail_width"` + // Thumbnail height, if known + ThumbnailHeight int32 `json:"thumbnail_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultLocation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultLocation + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultLocation) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultLocation) GetType() string { + return TypeInputInlineQueryResultLocation +} + +func (*InputInlineQueryResultLocation) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultLocation +} + +func (inputInlineQueryResultLocation *InputInlineQueryResultLocation) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Location *Location `json:"location"` + LivePeriod int32 `json:"live_period"` + Title string `json:"title"` + ThumbnailUrl string `json:"thumbnail_url"` + ThumbnailWidth int32 `json:"thumbnail_width"` + ThumbnailHeight int32 `json:"thumbnail_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultLocation.Id = tmp.Id + inputInlineQueryResultLocation.Location = tmp.Location + inputInlineQueryResultLocation.LivePeriod = tmp.LivePeriod + inputInlineQueryResultLocation.Title = tmp.Title + inputInlineQueryResultLocation.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultLocation.ThumbnailWidth = tmp.ThumbnailWidth + inputInlineQueryResultLocation.ThumbnailHeight = tmp.ThumbnailHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultLocation.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultLocation.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents link to a JPEG image +type InputInlineQueryResultPhoto struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Title of the result, if known + Title string `json:"title"` + // A short description of the result, if known + Description string `json:"description"` + // URL of the photo thumbnail, if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // The URL of the JPEG photo (photo size must not exceed 5MB) + PhotoUrl string `json:"photo_url"` + // Width of the photo + PhotoWidth int32 `json:"photo_width"` + // Height of the photo + PhotoHeight int32 `json:"photo_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessagePhoto, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultPhoto) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultPhoto) GetType() string { + return TypeInputInlineQueryResultPhoto +} + +func (*InputInlineQueryResultPhoto) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultPhoto +} + +func (inputInlineQueryResultPhoto *InputInlineQueryResultPhoto) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Title string `json:"title"` + Description string `json:"description"` + ThumbnailUrl string `json:"thumbnail_url"` + PhotoUrl string `json:"photo_url"` + PhotoWidth int32 `json:"photo_width"` + PhotoHeight int32 `json:"photo_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultPhoto.Id = tmp.Id + inputInlineQueryResultPhoto.Title = tmp.Title + inputInlineQueryResultPhoto.Description = tmp.Description + inputInlineQueryResultPhoto.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultPhoto.PhotoUrl = tmp.PhotoUrl + inputInlineQueryResultPhoto.PhotoWidth = tmp.PhotoWidth + inputInlineQueryResultPhoto.PhotoHeight = tmp.PhotoHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultPhoto.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultPhoto.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to a WEBP sticker +type InputInlineQueryResultSticker struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // URL of the sticker thumbnail, if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // The URL of the WEBP sticker (sticker file size must not exceed 5MB) + StickerUrl string `json:"sticker_url"` + // Width of the sticker + StickerWidth int32 `json:"sticker_width"` + // Height of the sticker + StickerHeight int32 `json:"sticker_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, inputMessageSticker, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultSticker) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultSticker + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultSticker) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultSticker) GetType() string { + return TypeInputInlineQueryResultSticker +} + +func (*InputInlineQueryResultSticker) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultSticker +} + +func (inputInlineQueryResultSticker *InputInlineQueryResultSticker) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + ThumbnailUrl string `json:"thumbnail_url"` + StickerUrl string `json:"sticker_url"` + StickerWidth int32 `json:"sticker_width"` + StickerHeight int32 `json:"sticker_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultSticker.Id = tmp.Id + inputInlineQueryResultSticker.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultSticker.StickerUrl = tmp.StickerUrl + inputInlineQueryResultSticker.StickerWidth = tmp.StickerWidth + inputInlineQueryResultSticker.StickerHeight = tmp.StickerHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultSticker.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultSticker.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents information about a venue +type InputInlineQueryResultVenue struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Venue result + Venue *Venue `json:"venue"` + // URL of the result thumbnail, if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // Thumbnail width, if known + ThumbnailWidth int32 `json:"thumbnail_width"` + // Thumbnail height, if known + ThumbnailHeight int32 `json:"thumbnail_height"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultVenue) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultVenue + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultVenue) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultVenue) GetType() string { + return TypeInputInlineQueryResultVenue +} + +func (*InputInlineQueryResultVenue) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultVenue +} + +func (inputInlineQueryResultVenue *InputInlineQueryResultVenue) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Venue *Venue `json:"venue"` + ThumbnailUrl string `json:"thumbnail_url"` + ThumbnailWidth int32 `json:"thumbnail_width"` + ThumbnailHeight int32 `json:"thumbnail_height"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultVenue.Id = tmp.Id + inputInlineQueryResultVenue.Venue = tmp.Venue + inputInlineQueryResultVenue.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultVenue.ThumbnailWidth = tmp.ThumbnailWidth + inputInlineQueryResultVenue.ThumbnailHeight = tmp.ThumbnailHeight + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultVenue.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultVenue.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to a page containing an embedded video player or a video file +type InputInlineQueryResultVideo struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Title of the result + Title string `json:"title"` + // A short description of the result, if known + Description string `json:"description"` + // The URL of the video thumbnail (JPEG), if it exists + ThumbnailUrl string `json:"thumbnail_url"` + // URL of the embedded video player or video file + VideoUrl string `json:"video_url"` + // MIME type of the content of the video URL, only "text/html" or "video/mp4" are currently supported + MimeType string `json:"mime_type"` + // Width of the video + VideoWidth int32 `json:"video_width"` + // Height of the video + VideoHeight int32 `json:"video_height"` + // Video duration, in seconds + VideoDuration int32 `json:"video_duration"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageVideo, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultVideo + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultVideo) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultVideo) GetType() string { + return TypeInputInlineQueryResultVideo +} + +func (*InputInlineQueryResultVideo) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultVideo +} + +func (inputInlineQueryResultVideo *InputInlineQueryResultVideo) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Title string `json:"title"` + Description string `json:"description"` + ThumbnailUrl string `json:"thumbnail_url"` + VideoUrl string `json:"video_url"` + MimeType string `json:"mime_type"` + VideoWidth int32 `json:"video_width"` + VideoHeight int32 `json:"video_height"` + VideoDuration int32 `json:"video_duration"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultVideo.Id = tmp.Id + inputInlineQueryResultVideo.Title = tmp.Title + inputInlineQueryResultVideo.Description = tmp.Description + inputInlineQueryResultVideo.ThumbnailUrl = tmp.ThumbnailUrl + inputInlineQueryResultVideo.VideoUrl = tmp.VideoUrl + inputInlineQueryResultVideo.MimeType = tmp.MimeType + inputInlineQueryResultVideo.VideoWidth = tmp.VideoWidth + inputInlineQueryResultVideo.VideoHeight = tmp.VideoHeight + inputInlineQueryResultVideo.VideoDuration = tmp.VideoDuration + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultVideo.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultVideo.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to an opus-encoded audio file within an OGG container, single channel audio +type InputInlineQueryResultVoiceNote struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Title of the voice note + Title string `json:"title"` + // The URL of the voice note file + VoiceNoteUrl string `json:"voice_note_url"` + // Duration of the voice note, in seconds + VoiceNoteDuration int32 `json:"voice_note_duration"` + // The message reply markup. Must be of type replyMarkupInlineKeyboard or null + ReplyMarkup ReplyMarkup `json:"reply_markup"` + // The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageVoiceNote, InputMessageLocation, InputMessageVenue or InputMessageContact + InputMessageContent InputMessageContent `json:"input_message_content"` +} + +func (entity *InputInlineQueryResultVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputInlineQueryResultVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*InputInlineQueryResultVoiceNote) GetClass() string { + return ClassInputInlineQueryResult +} + +func (*InputInlineQueryResultVoiceNote) GetType() string { + return TypeInputInlineQueryResultVoiceNote +} + +func (*InputInlineQueryResultVoiceNote) InputInlineQueryResultType() string { + return TypeInputInlineQueryResultVoiceNote +} + +func (inputInlineQueryResultVoiceNote *InputInlineQueryResultVoiceNote) UnmarshalJSON(data []byte) error { + var tmp struct { + Id string `json:"id"` + Title string `json:"title"` + VoiceNoteUrl string `json:"voice_note_url"` + VoiceNoteDuration int32 `json:"voice_note_duration"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + InputMessageContent json.RawMessage `json:"input_message_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputInlineQueryResultVoiceNote.Id = tmp.Id + inputInlineQueryResultVoiceNote.Title = tmp.Title + inputInlineQueryResultVoiceNote.VoiceNoteUrl = tmp.VoiceNoteUrl + inputInlineQueryResultVoiceNote.VoiceNoteDuration = tmp.VoiceNoteDuration + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + inputInlineQueryResultVoiceNote.ReplyMarkup = fieldReplyMarkup + + fieldInputMessageContent, _ := UnmarshalInputMessageContent(tmp.InputMessageContent) + inputInlineQueryResultVoiceNote.InputMessageContent = fieldInputMessageContent + + return nil +} + +// Represents a link to an article or web page +type InlineQueryResultArticle struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // URL of the result, if it exists + Url string `json:"url"` + // True, if the URL must be not shown + HideUrl bool `json:"hide_url"` + // Title of the result + Title string `json:"title"` + // A short description of the result + Description string `json:"description"` + // Result thumbnail; may be null + Thumbnail *PhotoSize `json:"thumbnail"` +} + +func (entity *InlineQueryResultArticle) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultArticle + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultArticle) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultArticle) GetType() string { + return TypeInlineQueryResultArticle +} + +func (*InlineQueryResultArticle) InlineQueryResultType() string { + return TypeInlineQueryResultArticle +} + +// Represents a user contact +type InlineQueryResultContact struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // A user contact + Contact *Contact `json:"contact"` + // Result thumbnail; may be null + Thumbnail *PhotoSize `json:"thumbnail"` +} + +func (entity *InlineQueryResultContact) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultContact + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultContact) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultContact) GetType() string { + return TypeInlineQueryResultContact +} + +func (*InlineQueryResultContact) InlineQueryResultType() string { + return TypeInlineQueryResultContact +} + +// Represents a point on the map +type InlineQueryResultLocation struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Location result + Location *Location `json:"location"` + // Title of the result + Title string `json:"title"` + // Result thumbnail; may be null + Thumbnail *PhotoSize `json:"thumbnail"` +} + +func (entity *InlineQueryResultLocation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultLocation + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultLocation) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultLocation) GetType() string { + return TypeInlineQueryResultLocation +} + +func (*InlineQueryResultLocation) InlineQueryResultType() string { + return TypeInlineQueryResultLocation +} + +// Represents information about a venue +type InlineQueryResultVenue struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Venue result + Venue *Venue `json:"venue"` + // Result thumbnail; may be null + Thumbnail *PhotoSize `json:"thumbnail"` +} + +func (entity *InlineQueryResultVenue) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultVenue + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultVenue) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultVenue) GetType() string { + return TypeInlineQueryResultVenue +} + +func (*InlineQueryResultVenue) InlineQueryResultType() string { + return TypeInlineQueryResultVenue +} + +// Represents information about a game +type InlineQueryResultGame struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Game result + Game *Game `json:"game"` +} + +func (entity *InlineQueryResultGame) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultGame + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultGame) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultGame) GetType() string { + return TypeInlineQueryResultGame +} + +func (*InlineQueryResultGame) InlineQueryResultType() string { + return TypeInlineQueryResultGame +} + +// Represents an animation file +type InlineQueryResultAnimation struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Animation file + Animation *Animation `json:"animation"` + // Animation title + Title string `json:"title"` +} + +func (entity *InlineQueryResultAnimation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultAnimation + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultAnimation) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultAnimation) GetType() string { + return TypeInlineQueryResultAnimation +} + +func (*InlineQueryResultAnimation) InlineQueryResultType() string { + return TypeInlineQueryResultAnimation +} + +// Represents an audio file +type InlineQueryResultAudio struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Audio file + Audio *Audio `json:"audio"` +} + +func (entity *InlineQueryResultAudio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultAudio + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultAudio) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultAudio) GetType() string { + return TypeInlineQueryResultAudio +} + +func (*InlineQueryResultAudio) InlineQueryResultType() string { + return TypeInlineQueryResultAudio +} + +// Represents a document +type InlineQueryResultDocument struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Document + Document *Document `json:"document"` + // Document title + Title string `json:"title"` + // Document description + Description string `json:"description"` +} + +func (entity *InlineQueryResultDocument) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultDocument + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultDocument) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultDocument) GetType() string { + return TypeInlineQueryResultDocument +} + +func (*InlineQueryResultDocument) InlineQueryResultType() string { + return TypeInlineQueryResultDocument +} + +// Represents a photo +type InlineQueryResultPhoto struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Photo + Photo *Photo `json:"photo"` + // Title of the result, if known + Title string `json:"title"` + // A short description of the result, if known + Description string `json:"description"` +} + +func (entity *InlineQueryResultPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultPhoto) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultPhoto) GetType() string { + return TypeInlineQueryResultPhoto +} + +func (*InlineQueryResultPhoto) InlineQueryResultType() string { + return TypeInlineQueryResultPhoto +} + +// Represents a sticker +type InlineQueryResultSticker struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Sticker + Sticker *Sticker `json:"sticker"` +} + +func (entity *InlineQueryResultSticker) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultSticker + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultSticker) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultSticker) GetType() string { + return TypeInlineQueryResultSticker +} + +func (*InlineQueryResultSticker) InlineQueryResultType() string { + return TypeInlineQueryResultSticker +} + +// Represents a video +type InlineQueryResultVideo struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Video + Video *Video `json:"video"` + // Title of the video + Title string `json:"title"` + // Description of the video + Description string `json:"description"` +} + +func (entity *InlineQueryResultVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultVideo + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultVideo) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultVideo) GetType() string { + return TypeInlineQueryResultVideo +} + +func (*InlineQueryResultVideo) InlineQueryResultType() string { + return TypeInlineQueryResultVideo +} + +// Represents a voice note +type InlineQueryResultVoiceNote struct { + meta + // Unique identifier of the query result + Id string `json:"id"` + // Voice note + VoiceNote *VoiceNote `json:"voice_note"` + // Title of the voice note + Title string `json:"title"` +} + +func (entity *InlineQueryResultVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResultVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResultVoiceNote) GetClass() string { + return ClassInlineQueryResult +} + +func (*InlineQueryResultVoiceNote) GetType() string { + return TypeInlineQueryResultVoiceNote +} + +func (*InlineQueryResultVoiceNote) InlineQueryResultType() string { + return TypeInlineQueryResultVoiceNote +} + +// Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query +type InlineQueryResults struct { + meta + // Unique identifier of the inline query + InlineQueryId JsonInt64 `json:"inline_query_id"` + // The offset for the next request. If empty, there are no more results + NextOffset string `json:"next_offset"` + // Results of the query + Results []InlineQueryResult `json:"results"` + // If non-empty, this text should be shown on the button, which opens a private chat with the bot and sends the bot a start message with the switch_pm_parameter + SwitchPmText string `json:"switch_pm_text"` + // Parameter for the bot start message + SwitchPmParameter string `json:"switch_pm_parameter"` +} + +func (entity *InlineQueryResults) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InlineQueryResults + + return json.Marshal((*stub)(entity)) +} + +func (*InlineQueryResults) GetClass() string { + return ClassInlineQueryResults +} + +func (*InlineQueryResults) GetType() string { + return TypeInlineQueryResults +} + +// The payload from a general callback button +type CallbackQueryPayloadData struct { + meta + // Data that was attached to the callback button + Data []byte `json:"data"` +} + +func (entity *CallbackQueryPayloadData) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallbackQueryPayloadData + + return json.Marshal((*stub)(entity)) +} + +func (*CallbackQueryPayloadData) GetClass() string { + return ClassCallbackQueryPayload +} + +func (*CallbackQueryPayloadData) GetType() string { + return TypeCallbackQueryPayloadData +} + +func (*CallbackQueryPayloadData) CallbackQueryPayloadType() string { + return TypeCallbackQueryPayloadData +} + +// The payload from a game callback button +type CallbackQueryPayloadGame struct { + meta + // A short name of the game that was attached to the callback button + GameShortName string `json:"game_short_name"` +} + +func (entity *CallbackQueryPayloadGame) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallbackQueryPayloadGame + + return json.Marshal((*stub)(entity)) +} + +func (*CallbackQueryPayloadGame) GetClass() string { + return ClassCallbackQueryPayload +} + +func (*CallbackQueryPayloadGame) GetType() string { + return TypeCallbackQueryPayloadGame +} + +func (*CallbackQueryPayloadGame) CallbackQueryPayloadType() string { + return TypeCallbackQueryPayloadGame +} + +// Contains a bot's answer to a callback query +type CallbackQueryAnswer struct { + meta + // Text of the answer + Text string `json:"text"` + // True, if an alert should be shown to the user instead of a toast notification + ShowAlert bool `json:"show_alert"` + // URL to be opened + Url string `json:"url"` +} + +func (entity *CallbackQueryAnswer) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CallbackQueryAnswer + + return json.Marshal((*stub)(entity)) +} + +func (*CallbackQueryAnswer) GetClass() string { + return ClassCallbackQueryAnswer +} + +func (*CallbackQueryAnswer) GetType() string { + return TypeCallbackQueryAnswer +} + +// Contains the result of a custom request +type CustomRequestResult struct { + meta + // A JSON-serialized result + Result string `json:"result"` +} + +func (entity *CustomRequestResult) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CustomRequestResult + + return json.Marshal((*stub)(entity)) +} + +func (*CustomRequestResult) GetClass() string { + return ClassCustomRequestResult +} + +func (*CustomRequestResult) GetType() string { + return TypeCustomRequestResult +} + +// Contains one row of the game high score table +type GameHighScore struct { + meta + // Position in the high score table + Position int32 `json:"position"` + // User identifier + UserId int32 `json:"user_id"` + // User score + Score int32 `json:"score"` +} + +func (entity *GameHighScore) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub GameHighScore + + return json.Marshal((*stub)(entity)) +} + +func (*GameHighScore) GetClass() string { + return ClassGameHighScore +} + +func (*GameHighScore) GetType() string { + return TypeGameHighScore +} + +// Contains a list of game high scores +type GameHighScores struct { + meta + // A list of game high scores + Scores []*GameHighScore `json:"scores"` +} + +func (entity *GameHighScores) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub GameHighScores + + return json.Marshal((*stub)(entity)) +} + +func (*GameHighScores) GetClass() string { + return ClassGameHighScores +} + +func (*GameHighScores) GetType() string { + return TypeGameHighScores +} + +// A message was edited +type ChatEventMessageEdited struct { + meta + // The original message before the edit + OldMessage *Message `json:"old_message"` + // The message after it was edited + NewMessage *Message `json:"new_message"` +} + +func (entity *ChatEventMessageEdited) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMessageEdited + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMessageEdited) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMessageEdited) GetType() string { + return TypeChatEventMessageEdited +} + +func (*ChatEventMessageEdited) ChatEventActionType() string { + return TypeChatEventMessageEdited +} + +// A message was deleted +type ChatEventMessageDeleted struct { + meta + // Deleted message + Message *Message `json:"message"` +} + +func (entity *ChatEventMessageDeleted) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMessageDeleted + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMessageDeleted) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMessageDeleted) GetType() string { + return TypeChatEventMessageDeleted +} + +func (*ChatEventMessageDeleted) ChatEventActionType() string { + return TypeChatEventMessageDeleted +} + +// A message was pinned +type ChatEventMessagePinned struct { + meta + // Pinned message + Message *Message `json:"message"` +} + +func (entity *ChatEventMessagePinned) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMessagePinned + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMessagePinned) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMessagePinned) GetType() string { + return TypeChatEventMessagePinned +} + +func (*ChatEventMessagePinned) ChatEventActionType() string { + return TypeChatEventMessagePinned +} + +// A message was unpinned +type ChatEventMessageUnpinned struct{ + meta +} + +func (entity *ChatEventMessageUnpinned) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMessageUnpinned + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMessageUnpinned) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMessageUnpinned) GetType() string { + return TypeChatEventMessageUnpinned +} + +func (*ChatEventMessageUnpinned) ChatEventActionType() string { + return TypeChatEventMessageUnpinned +} + +// A new member joined the chat +type ChatEventMemberJoined struct{ + meta +} + +func (entity *ChatEventMemberJoined) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMemberJoined + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMemberJoined) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMemberJoined) GetType() string { + return TypeChatEventMemberJoined +} + +func (*ChatEventMemberJoined) ChatEventActionType() string { + return TypeChatEventMemberJoined +} + +// A member left the chat +type ChatEventMemberLeft struct{ + meta +} + +func (entity *ChatEventMemberLeft) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMemberLeft + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMemberLeft) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMemberLeft) GetType() string { + return TypeChatEventMemberLeft +} + +func (*ChatEventMemberLeft) ChatEventActionType() string { + return TypeChatEventMemberLeft +} + +// A new chat member was invited +type ChatEventMemberInvited struct { + meta + // New member user identifier + UserId int32 `json:"user_id"` + // New member status + Status ChatMemberStatus `json:"status"` +} + +func (entity *ChatEventMemberInvited) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMemberInvited + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMemberInvited) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMemberInvited) GetType() string { + return TypeChatEventMemberInvited +} + +func (*ChatEventMemberInvited) ChatEventActionType() string { + return TypeChatEventMemberInvited +} + +func (chatEventMemberInvited *ChatEventMemberInvited) UnmarshalJSON(data []byte) error { + var tmp struct { + UserId int32 `json:"user_id"` + Status json.RawMessage `json:"status"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + chatEventMemberInvited.UserId = tmp.UserId + + fieldStatus, _ := UnmarshalChatMemberStatus(tmp.Status) + chatEventMemberInvited.Status = fieldStatus + + return nil +} + +// A chat member has gained/lost administrator status, or the list of their administrator privileges has changed +type ChatEventMemberPromoted struct { + meta + // Chat member user identifier + UserId int32 `json:"user_id"` + // Previous status of the chat member + OldStatus ChatMemberStatus `json:"old_status"` + // New status of the chat member + NewStatus ChatMemberStatus `json:"new_status"` +} + +func (entity *ChatEventMemberPromoted) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMemberPromoted + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMemberPromoted) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMemberPromoted) GetType() string { + return TypeChatEventMemberPromoted +} + +func (*ChatEventMemberPromoted) ChatEventActionType() string { + return TypeChatEventMemberPromoted +} + +func (chatEventMemberPromoted *ChatEventMemberPromoted) UnmarshalJSON(data []byte) error { + var tmp struct { + UserId int32 `json:"user_id"` + OldStatus json.RawMessage `json:"old_status"` + NewStatus json.RawMessage `json:"new_status"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + chatEventMemberPromoted.UserId = tmp.UserId + + fieldOldStatus, _ := UnmarshalChatMemberStatus(tmp.OldStatus) + chatEventMemberPromoted.OldStatus = fieldOldStatus + + fieldNewStatus, _ := UnmarshalChatMemberStatus(tmp.NewStatus) + chatEventMemberPromoted.NewStatus = fieldNewStatus + + return nil +} + +// A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed +type ChatEventMemberRestricted struct { + meta + // Chat member user identifier + UserId int32 `json:"user_id"` + // Previous status of the chat member + OldStatus ChatMemberStatus `json:"old_status"` + // New status of the chat member + NewStatus ChatMemberStatus `json:"new_status"` +} + +func (entity *ChatEventMemberRestricted) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventMemberRestricted + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventMemberRestricted) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventMemberRestricted) GetType() string { + return TypeChatEventMemberRestricted +} + +func (*ChatEventMemberRestricted) ChatEventActionType() string { + return TypeChatEventMemberRestricted +} + +func (chatEventMemberRestricted *ChatEventMemberRestricted) UnmarshalJSON(data []byte) error { + var tmp struct { + UserId int32 `json:"user_id"` + OldStatus json.RawMessage `json:"old_status"` + NewStatus json.RawMessage `json:"new_status"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + chatEventMemberRestricted.UserId = tmp.UserId + + fieldOldStatus, _ := UnmarshalChatMemberStatus(tmp.OldStatus) + chatEventMemberRestricted.OldStatus = fieldOldStatus + + fieldNewStatus, _ := UnmarshalChatMemberStatus(tmp.NewStatus) + chatEventMemberRestricted.NewStatus = fieldNewStatus + + return nil +} + +// The chat title was changed +type ChatEventTitleChanged struct { + meta + // Previous chat title + OldTitle string `json:"old_title"` + // New chat title + NewTitle string `json:"new_title"` +} + +func (entity *ChatEventTitleChanged) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventTitleChanged + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventTitleChanged) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventTitleChanged) GetType() string { + return TypeChatEventTitleChanged +} + +func (*ChatEventTitleChanged) ChatEventActionType() string { + return TypeChatEventTitleChanged +} + +// The chat description was changed +type ChatEventDescriptionChanged struct { + meta + // Previous chat description + OldDescription string `json:"old_description"` + // New chat description + NewDescription string `json:"new_description"` +} + +func (entity *ChatEventDescriptionChanged) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventDescriptionChanged + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventDescriptionChanged) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventDescriptionChanged) GetType() string { + return TypeChatEventDescriptionChanged +} + +func (*ChatEventDescriptionChanged) ChatEventActionType() string { + return TypeChatEventDescriptionChanged +} + +// The chat username was changed +type ChatEventUsernameChanged struct { + meta + // Previous chat username + OldUsername string `json:"old_username"` + // New chat username + NewUsername string `json:"new_username"` +} + +func (entity *ChatEventUsernameChanged) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventUsernameChanged + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventUsernameChanged) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventUsernameChanged) GetType() string { + return TypeChatEventUsernameChanged +} + +func (*ChatEventUsernameChanged) ChatEventActionType() string { + return TypeChatEventUsernameChanged +} + +// The chat photo was changed +type ChatEventPhotoChanged struct { + meta + // Previous chat photo value; may be null + OldPhoto *ChatPhoto `json:"old_photo"` + // New chat photo value; may be null + NewPhoto *ChatPhoto `json:"new_photo"` +} + +func (entity *ChatEventPhotoChanged) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventPhotoChanged + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventPhotoChanged) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventPhotoChanged) GetType() string { + return TypeChatEventPhotoChanged +} + +func (*ChatEventPhotoChanged) ChatEventActionType() string { + return TypeChatEventPhotoChanged +} + +// The anyone_can_invite setting of a supergroup chat was toggled +type ChatEventInvitesToggled struct { + meta + // New value of anyone_can_invite + AnyoneCanInvite bool `json:"anyone_can_invite"` +} + +func (entity *ChatEventInvitesToggled) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventInvitesToggled + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventInvitesToggled) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventInvitesToggled) GetType() string { + return TypeChatEventInvitesToggled +} + +func (*ChatEventInvitesToggled) ChatEventActionType() string { + return TypeChatEventInvitesToggled +} + +// The sign_messages setting of a channel was toggled +type ChatEventSignMessagesToggled struct { + meta + // New value of sign_messages + SignMessages bool `json:"sign_messages"` +} + +func (entity *ChatEventSignMessagesToggled) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventSignMessagesToggled + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventSignMessagesToggled) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventSignMessagesToggled) GetType() string { + return TypeChatEventSignMessagesToggled +} + +func (*ChatEventSignMessagesToggled) ChatEventActionType() string { + return TypeChatEventSignMessagesToggled +} + +// The supergroup sticker set was changed +type ChatEventStickerSetChanged struct { + meta + // Previous identifier of the chat sticker set; 0 if none + OldStickerSetId JsonInt64 `json:"old_sticker_set_id"` + // New identifier of the chat sticker set; 0 if none + NewStickerSetId JsonInt64 `json:"new_sticker_set_id"` +} + +func (entity *ChatEventStickerSetChanged) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventStickerSetChanged + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventStickerSetChanged) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventStickerSetChanged) GetType() string { + return TypeChatEventStickerSetChanged +} + +func (*ChatEventStickerSetChanged) ChatEventActionType() string { + return TypeChatEventStickerSetChanged +} + +// The is_all_history_available setting of a supergroup was toggled +type ChatEventIsAllHistoryAvailableToggled struct { + meta + // New value of is_all_history_available + IsAllHistoryAvailable bool `json:"is_all_history_available"` +} + +func (entity *ChatEventIsAllHistoryAvailableToggled) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventIsAllHistoryAvailableToggled + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventIsAllHistoryAvailableToggled) GetClass() string { + return ClassChatEventAction +} + +func (*ChatEventIsAllHistoryAvailableToggled) GetType() string { + return TypeChatEventIsAllHistoryAvailableToggled +} + +func (*ChatEventIsAllHistoryAvailableToggled) ChatEventActionType() string { + return TypeChatEventIsAllHistoryAvailableToggled +} + +// Represents a chat event +type ChatEvent struct { + meta + // Chat event identifier + Id JsonInt64 `json:"id"` + // Point in time (Unix timestamp) when the event happened + Date int32 `json:"date"` + // Identifier of the user who performed the action that triggered the event + UserId int32 `json:"user_id"` + // Action performed by the user + Action ChatEventAction `json:"action"` +} + +func (entity *ChatEvent) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEvent + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEvent) GetClass() string { + return ClassChatEvent +} + +func (*ChatEvent) GetType() string { + return TypeChatEvent +} + +func (chatEvent *ChatEvent) UnmarshalJSON(data []byte) error { + var tmp struct { + Id JsonInt64 `json:"id"` + Date int32 `json:"date"` + UserId int32 `json:"user_id"` + Action json.RawMessage `json:"action"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + chatEvent.Id = tmp.Id + chatEvent.Date = tmp.Date + chatEvent.UserId = tmp.UserId + + fieldAction, _ := UnmarshalChatEventAction(tmp.Action) + chatEvent.Action = fieldAction + + return nil +} + +// Contains a list of chat events +type ChatEvents struct { + meta + // List of events + Events []*ChatEvent `json:"events"` +} + +func (entity *ChatEvents) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEvents + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEvents) GetClass() string { + return ClassChatEvents +} + +func (*ChatEvents) GetType() string { + return TypeChatEvents +} + +// Represents a set of filters used to obtain a chat event log +type ChatEventLogFilters struct { + meta + // True, if message edits should be returned + MessageEdits bool `json:"message_edits"` + // True, if message deletions should be returned + MessageDeletions bool `json:"message_deletions"` + // True, if pin/unpin events should be returned + MessagePins bool `json:"message_pins"` + // True, if members joining events should be returned + MemberJoins bool `json:"member_joins"` + // True, if members leaving events should be returned + MemberLeaves bool `json:"member_leaves"` + // True, if invited member events should be returned + MemberInvites bool `json:"member_invites"` + // True, if member promotion/demotion events should be returned + MemberPromotions bool `json:"member_promotions"` + // True, if member restricted/unrestricted/banned/unbanned events should be returned + MemberRestrictions bool `json:"member_restrictions"` + // True, if changes in chat information should be returned + InfoChanges bool `json:"info_changes"` + // True, if changes in chat settings should be returned + SettingChanges bool `json:"setting_changes"` +} + +func (entity *ChatEventLogFilters) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatEventLogFilters + + return json.Marshal((*stub)(entity)) +} + +func (*ChatEventLogFilters) GetClass() string { + return ClassChatEventLogFilters +} + +func (*ChatEventLogFilters) GetType() string { + return TypeChatEventLogFilters +} + +// A token for Google Cloud Messaging +type DeviceTokenGoogleCloudMessaging struct { + meta + // Device registration token, may be empty to de-register a device + Token string `json:"token"` +} + +func (entity *DeviceTokenGoogleCloudMessaging) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenGoogleCloudMessaging + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenGoogleCloudMessaging) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenGoogleCloudMessaging) GetType() string { + return TypeDeviceTokenGoogleCloudMessaging +} + +func (*DeviceTokenGoogleCloudMessaging) DeviceTokenType() string { + return TypeDeviceTokenGoogleCloudMessaging +} + +// A token for Apple Push Notification service +type DeviceTokenApplePush struct { + meta + // Device token, may be empty to de-register a device + DeviceToken string `json:"device_token"` + // True, if App Sandbox is enabled + IsAppSandbox bool `json:"is_app_sandbox"` +} + +func (entity *DeviceTokenApplePush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenApplePush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenApplePush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenApplePush) GetType() string { + return TypeDeviceTokenApplePush +} + +func (*DeviceTokenApplePush) DeviceTokenType() string { + return TypeDeviceTokenApplePush +} + +// A token for Apple Push Notification service VoIP notifications +type DeviceTokenApplePushVoIP struct { + meta + // Device token, may be empty to de-register a device + DeviceToken string `json:"device_token"` + // True, if App Sandbox is enabled + IsAppSandbox bool `json:"is_app_sandbox"` +} + +func (entity *DeviceTokenApplePushVoIP) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenApplePushVoIP + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenApplePushVoIP) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenApplePushVoIP) GetType() string { + return TypeDeviceTokenApplePushVoIP +} + +func (*DeviceTokenApplePushVoIP) DeviceTokenType() string { + return TypeDeviceTokenApplePushVoIP +} + +// A token for Windows Push Notification Services +type DeviceTokenWindowsPush struct { + meta + // The access token that will be used to send notifications, may be empty to de-register a device + AccessToken string `json:"access_token"` +} + +func (entity *DeviceTokenWindowsPush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenWindowsPush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenWindowsPush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenWindowsPush) GetType() string { + return TypeDeviceTokenWindowsPush +} + +func (*DeviceTokenWindowsPush) DeviceTokenType() string { + return TypeDeviceTokenWindowsPush +} + +// A token for Microsoft Push Notification Service +type DeviceTokenMicrosoftPush struct { + meta + // Push notification channel URI, may be empty to de-register a device + ChannelUri string `json:"channel_uri"` +} + +func (entity *DeviceTokenMicrosoftPush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenMicrosoftPush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenMicrosoftPush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenMicrosoftPush) GetType() string { + return TypeDeviceTokenMicrosoftPush +} + +func (*DeviceTokenMicrosoftPush) DeviceTokenType() string { + return TypeDeviceTokenMicrosoftPush +} + +// A token for Microsoft Push Notification Service VoIP channel +type DeviceTokenMicrosoftPushVoIP struct { + meta + // Push notification channel URI, may be empty to de-register a device + ChannelUri string `json:"channel_uri"` +} + +func (entity *DeviceTokenMicrosoftPushVoIP) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenMicrosoftPushVoIP + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenMicrosoftPushVoIP) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenMicrosoftPushVoIP) GetType() string { + return TypeDeviceTokenMicrosoftPushVoIP +} + +func (*DeviceTokenMicrosoftPushVoIP) DeviceTokenType() string { + return TypeDeviceTokenMicrosoftPushVoIP +} + +// A token for web Push API +type DeviceTokenWebPush struct { + meta + // Absolute URL exposed by the push service where the application server can send push messages, may be empty to de-register a device + Endpoint string `json:"endpoint"` + // Base64url-encoded P-256 elliptic curve Diffie-Hellman public key + P256dhBase64url string `json:"p256dh_base64url"` + // Base64url-encoded authentication secret + AuthBase64url string `json:"auth_base64url"` +} + +func (entity *DeviceTokenWebPush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenWebPush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenWebPush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenWebPush) GetType() string { + return TypeDeviceTokenWebPush +} + +func (*DeviceTokenWebPush) DeviceTokenType() string { + return TypeDeviceTokenWebPush +} + +// A token for Simple Push API for Firefox OS +type DeviceTokenSimplePush struct { + meta + // Absolute URL exposed by the push service where the application server can send push messages, may be empty to de-register a device + Endpoint string `json:"endpoint"` +} + +func (entity *DeviceTokenSimplePush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenSimplePush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenSimplePush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenSimplePush) GetType() string { + return TypeDeviceTokenSimplePush +} + +func (*DeviceTokenSimplePush) DeviceTokenType() string { + return TypeDeviceTokenSimplePush +} + +// A token for Ubuntu Push Client service +type DeviceTokenUbuntuPush struct { + meta + // Token, may be empty to de-register a device + Token string `json:"token"` +} + +func (entity *DeviceTokenUbuntuPush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenUbuntuPush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenUbuntuPush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenUbuntuPush) GetType() string { + return TypeDeviceTokenUbuntuPush +} + +func (*DeviceTokenUbuntuPush) DeviceTokenType() string { + return TypeDeviceTokenUbuntuPush +} + +// A token for BlackBerry Push Service +type DeviceTokenBlackBerryPush struct { + meta + // Token, may be empty to de-register a device + Token string `json:"token"` +} + +func (entity *DeviceTokenBlackBerryPush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenBlackBerryPush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenBlackBerryPush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenBlackBerryPush) GetType() string { + return TypeDeviceTokenBlackBerryPush +} + +func (*DeviceTokenBlackBerryPush) DeviceTokenType() string { + return TypeDeviceTokenBlackBerryPush +} + +// A token for Tizen Push Service +type DeviceTokenTizenPush struct { + meta + // Push service registration identifier, may be empty to de-register a device + RegId string `json:"reg_id"` +} + +func (entity *DeviceTokenTizenPush) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub DeviceTokenTizenPush + + return json.Marshal((*stub)(entity)) +} + +func (*DeviceTokenTizenPush) GetClass() string { + return ClassDeviceToken +} + +func (*DeviceTokenTizenPush) GetType() string { + return TypeDeviceTokenTizenPush +} + +func (*DeviceTokenTizenPush) DeviceTokenType() string { + return TypeDeviceTokenTizenPush +} + +// Contains information about a wallpaper +type Wallpaper struct { + meta + // Unique persistent wallpaper identifier + Id int32 `json:"id"` + // Available variants of the wallpaper in different sizes. These photos can only be downloaded; they can't be sent in a message + Sizes []*PhotoSize `json:"sizes"` + // Main color of the wallpaper in RGB24 format; should be treated as background color if no photos are specified + Color int32 `json:"color"` +} + +func (entity *Wallpaper) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Wallpaper + + return json.Marshal((*stub)(entity)) +} + +func (*Wallpaper) GetClass() string { + return ClassWallpaper +} + +func (*Wallpaper) GetType() string { + return TypeWallpaper +} + +// Contains a list of wallpapers +type Wallpapers struct { + meta + // A list of wallpapers + Wallpapers []*Wallpaper `json:"wallpapers"` +} + +func (entity *Wallpapers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Wallpapers + + return json.Marshal((*stub)(entity)) +} + +func (*Wallpapers) GetClass() string { + return ClassWallpapers +} + +func (*Wallpapers) GetType() string { + return TypeWallpapers +} + +// Contains a list of hashtags +type Hashtags struct { + meta + // A list of hashtags + Hashtags []string `json:"hashtags"` +} + +func (entity *Hashtags) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Hashtags + + return json.Marshal((*stub)(entity)) +} + +func (*Hashtags) GetClass() string { + return ClassHashtags +} + +func (*Hashtags) GetType() string { + return TypeHashtags +} + +// The username can be set +type CheckChatUsernameResultOk struct{ + meta +} + +func (entity *CheckChatUsernameResultOk) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CheckChatUsernameResultOk + + return json.Marshal((*stub)(entity)) +} + +func (*CheckChatUsernameResultOk) GetClass() string { + return ClassCheckChatUsernameResult +} + +func (*CheckChatUsernameResultOk) GetType() string { + return TypeCheckChatUsernameResultOk +} + +func (*CheckChatUsernameResultOk) CheckChatUsernameResultType() string { + return TypeCheckChatUsernameResultOk +} + +// The username is invalid +type CheckChatUsernameResultUsernameInvalid struct{ + meta +} + +func (entity *CheckChatUsernameResultUsernameInvalid) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CheckChatUsernameResultUsernameInvalid + + return json.Marshal((*stub)(entity)) +} + +func (*CheckChatUsernameResultUsernameInvalid) GetClass() string { + return ClassCheckChatUsernameResult +} + +func (*CheckChatUsernameResultUsernameInvalid) GetType() string { + return TypeCheckChatUsernameResultUsernameInvalid +} + +func (*CheckChatUsernameResultUsernameInvalid) CheckChatUsernameResultType() string { + return TypeCheckChatUsernameResultUsernameInvalid +} + +// The username is occupied +type CheckChatUsernameResultUsernameOccupied struct{ + meta +} + +func (entity *CheckChatUsernameResultUsernameOccupied) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CheckChatUsernameResultUsernameOccupied + + return json.Marshal((*stub)(entity)) +} + +func (*CheckChatUsernameResultUsernameOccupied) GetClass() string { + return ClassCheckChatUsernameResult +} + +func (*CheckChatUsernameResultUsernameOccupied) GetType() string { + return TypeCheckChatUsernameResultUsernameOccupied +} + +func (*CheckChatUsernameResultUsernameOccupied) CheckChatUsernameResultType() string { + return TypeCheckChatUsernameResultUsernameOccupied +} + +// The user has too much public chats, one of them should be made private first +type CheckChatUsernameResultPublicChatsTooMuch struct{ + meta +} + +func (entity *CheckChatUsernameResultPublicChatsTooMuch) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CheckChatUsernameResultPublicChatsTooMuch + + return json.Marshal((*stub)(entity)) +} + +func (*CheckChatUsernameResultPublicChatsTooMuch) GetClass() string { + return ClassCheckChatUsernameResult +} + +func (*CheckChatUsernameResultPublicChatsTooMuch) GetType() string { + return TypeCheckChatUsernameResultPublicChatsTooMuch +} + +func (*CheckChatUsernameResultPublicChatsTooMuch) CheckChatUsernameResultType() string { + return TypeCheckChatUsernameResultPublicChatsTooMuch +} + +// The user can't be a member of a public supergroup +type CheckChatUsernameResultPublicGroupsUnavailable struct{ + meta +} + +func (entity *CheckChatUsernameResultPublicGroupsUnavailable) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub CheckChatUsernameResultPublicGroupsUnavailable + + return json.Marshal((*stub)(entity)) +} + +func (*CheckChatUsernameResultPublicGroupsUnavailable) GetClass() string { + return ClassCheckChatUsernameResult +} + +func (*CheckChatUsernameResultPublicGroupsUnavailable) GetType() string { + return TypeCheckChatUsernameResultPublicGroupsUnavailable +} + +func (*CheckChatUsernameResultPublicGroupsUnavailable) CheckChatUsernameResultType() string { + return TypeCheckChatUsernameResultPublicGroupsUnavailable +} + +// Boolean option +type OptionValueBoolean struct { + meta + // The value of the option + Value bool `json:"value"` +} + +func (entity *OptionValueBoolean) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub OptionValueBoolean + + return json.Marshal((*stub)(entity)) +} + +func (*OptionValueBoolean) GetClass() string { + return ClassOptionValue +} + +func (*OptionValueBoolean) GetType() string { + return TypeOptionValueBoolean +} + +func (*OptionValueBoolean) OptionValueType() string { + return TypeOptionValueBoolean +} + +// An unknown option or an option which has a default value +type OptionValueEmpty struct{ + meta +} + +func (entity *OptionValueEmpty) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub OptionValueEmpty + + return json.Marshal((*stub)(entity)) +} + +func (*OptionValueEmpty) GetClass() string { + return ClassOptionValue +} + +func (*OptionValueEmpty) GetType() string { + return TypeOptionValueEmpty +} + +func (*OptionValueEmpty) OptionValueType() string { + return TypeOptionValueEmpty +} + +// An integer option +type OptionValueInteger struct { + meta + // The value of the option + Value int32 `json:"value"` +} + +func (entity *OptionValueInteger) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub OptionValueInteger + + return json.Marshal((*stub)(entity)) +} + +func (*OptionValueInteger) GetClass() string { + return ClassOptionValue +} + +func (*OptionValueInteger) GetType() string { + return TypeOptionValueInteger +} + +func (*OptionValueInteger) OptionValueType() string { + return TypeOptionValueInteger +} + +// A string option +type OptionValueString struct { + meta + // The value of the option + Value string `json:"value"` +} + +func (entity *OptionValueString) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub OptionValueString + + return json.Marshal((*stub)(entity)) +} + +func (*OptionValueString) GetClass() string { + return ClassOptionValue +} + +func (*OptionValueString) GetType() string { + return TypeOptionValueString +} + +func (*OptionValueString) OptionValueType() string { + return TypeOptionValueString +} + +// A rule to allow all users to do something +type UserPrivacySettingRuleAllowAll struct{ + meta +} + +func (entity *UserPrivacySettingRuleAllowAll) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingRuleAllowAll + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingRuleAllowAll) GetClass() string { + return ClassUserPrivacySettingRule +} + +func (*UserPrivacySettingRuleAllowAll) GetType() string { + return TypeUserPrivacySettingRuleAllowAll +} + +func (*UserPrivacySettingRuleAllowAll) UserPrivacySettingRuleType() string { + return TypeUserPrivacySettingRuleAllowAll +} + +// A rule to allow all of a user's contacts to do something +type UserPrivacySettingRuleAllowContacts struct{ + meta +} + +func (entity *UserPrivacySettingRuleAllowContacts) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingRuleAllowContacts + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingRuleAllowContacts) GetClass() string { + return ClassUserPrivacySettingRule +} + +func (*UserPrivacySettingRuleAllowContacts) GetType() string { + return TypeUserPrivacySettingRuleAllowContacts +} + +func (*UserPrivacySettingRuleAllowContacts) UserPrivacySettingRuleType() string { + return TypeUserPrivacySettingRuleAllowContacts +} + +// A rule to allow certain specified users to do something +type UserPrivacySettingRuleAllowUsers struct { + meta + // The user identifiers + UserIds []int32 `json:"user_ids"` +} + +func (entity *UserPrivacySettingRuleAllowUsers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingRuleAllowUsers + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingRuleAllowUsers) GetClass() string { + return ClassUserPrivacySettingRule +} + +func (*UserPrivacySettingRuleAllowUsers) GetType() string { + return TypeUserPrivacySettingRuleAllowUsers +} + +func (*UserPrivacySettingRuleAllowUsers) UserPrivacySettingRuleType() string { + return TypeUserPrivacySettingRuleAllowUsers +} + +// A rule to restrict all users from doing something +type UserPrivacySettingRuleRestrictAll struct{ + meta +} + +func (entity *UserPrivacySettingRuleRestrictAll) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingRuleRestrictAll + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingRuleRestrictAll) GetClass() string { + return ClassUserPrivacySettingRule +} + +func (*UserPrivacySettingRuleRestrictAll) GetType() string { + return TypeUserPrivacySettingRuleRestrictAll +} + +func (*UserPrivacySettingRuleRestrictAll) UserPrivacySettingRuleType() string { + return TypeUserPrivacySettingRuleRestrictAll +} + +// A rule to restrict all contacts of a user from doing something +type UserPrivacySettingRuleRestrictContacts struct{ + meta +} + +func (entity *UserPrivacySettingRuleRestrictContacts) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingRuleRestrictContacts + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingRuleRestrictContacts) GetClass() string { + return ClassUserPrivacySettingRule +} + +func (*UserPrivacySettingRuleRestrictContacts) GetType() string { + return TypeUserPrivacySettingRuleRestrictContacts +} + +func (*UserPrivacySettingRuleRestrictContacts) UserPrivacySettingRuleType() string { + return TypeUserPrivacySettingRuleRestrictContacts +} + +// A rule to restrict all specified users from doing something +type UserPrivacySettingRuleRestrictUsers struct { + meta + // The user identifiers + UserIds []int32 `json:"user_ids"` +} + +func (entity *UserPrivacySettingRuleRestrictUsers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingRuleRestrictUsers + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingRuleRestrictUsers) GetClass() string { + return ClassUserPrivacySettingRule +} + +func (*UserPrivacySettingRuleRestrictUsers) GetType() string { + return TypeUserPrivacySettingRuleRestrictUsers +} + +func (*UserPrivacySettingRuleRestrictUsers) UserPrivacySettingRuleType() string { + return TypeUserPrivacySettingRuleRestrictUsers +} + +// A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed +type UserPrivacySettingRules struct { + meta + // A list of rules + Rules []UserPrivacySettingRule `json:"rules"` +} + +func (entity *UserPrivacySettingRules) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingRules + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingRules) GetClass() string { + return ClassUserPrivacySettingRules +} + +func (*UserPrivacySettingRules) GetType() string { + return TypeUserPrivacySettingRules +} + +// A privacy setting for managing whether the user's online status is visible +type UserPrivacySettingShowStatus struct{ + meta +} + +func (entity *UserPrivacySettingShowStatus) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingShowStatus + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingShowStatus) GetClass() string { + return ClassUserPrivacySetting +} + +func (*UserPrivacySettingShowStatus) GetType() string { + return TypeUserPrivacySettingShowStatus +} + +func (*UserPrivacySettingShowStatus) UserPrivacySettingType() string { + return TypeUserPrivacySettingShowStatus +} + +// A privacy setting for managing whether the user can be invited to chats +type UserPrivacySettingAllowChatInvites struct{ + meta +} + +func (entity *UserPrivacySettingAllowChatInvites) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingAllowChatInvites + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingAllowChatInvites) GetClass() string { + return ClassUserPrivacySetting +} + +func (*UserPrivacySettingAllowChatInvites) GetType() string { + return TypeUserPrivacySettingAllowChatInvites +} + +func (*UserPrivacySettingAllowChatInvites) UserPrivacySettingType() string { + return TypeUserPrivacySettingAllowChatInvites +} + +// A privacy setting for managing whether the user can be called +type UserPrivacySettingAllowCalls struct{ + meta +} + +func (entity *UserPrivacySettingAllowCalls) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UserPrivacySettingAllowCalls + + return json.Marshal((*stub)(entity)) +} + +func (*UserPrivacySettingAllowCalls) GetClass() string { + return ClassUserPrivacySetting +} + +func (*UserPrivacySettingAllowCalls) GetType() string { + return TypeUserPrivacySettingAllowCalls +} + +func (*UserPrivacySettingAllowCalls) UserPrivacySettingType() string { + return TypeUserPrivacySettingAllowCalls +} + +// Contains information about the period of inactivity after which the current user's account will automatically be deleted +type AccountTtl struct { + meta + // Number of days of inactivity before the account will be flagged for deletion; should range from 30-366 days + Days int32 `json:"days"` +} + +func (entity *AccountTtl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub AccountTtl + + return json.Marshal((*stub)(entity)) +} + +func (*AccountTtl) GetClass() string { + return ClassAccountTtl +} + +func (*AccountTtl) GetType() string { + return TypeAccountTtl +} + +// Contains information about one session in a Telegram application used by the current user +type Session struct { + meta + // Session identifier + Id JsonInt64 `json:"id"` + // True, if this session is the current session + IsCurrent bool `json:"is_current"` + // Telegram API identifier, as provided by the application + ApiId int32 `json:"api_id"` + // Name of the application, as provided by the application + ApplicationName string `json:"application_name"` + // The version of the application, as provided by the application + ApplicationVersion string `json:"application_version"` + // True, if the application is an official application or uses the api_id of an official application + IsOfficialApplication bool `json:"is_official_application"` + // Model of the device the application has been run or is running on, as provided by the application + DeviceModel string `json:"device_model"` + // Operating system the application has been run or is running on, as provided by the application + Platform string `json:"platform"` + // Version of the operating system the application has been run or is running on, as provided by the application + SystemVersion string `json:"system_version"` + // Point in time (Unix timestamp) when the user has logged in + LogInDate int32 `json:"log_in_date"` + // Point in time (Unix timestamp) when the session was last used + LastActiveDate int32 `json:"last_active_date"` + // IP address from which the session was created, in human-readable format + Ip string `json:"ip"` + // A two-letter country code for the country from which the session was created, based on the IP address + Country string `json:"country"` + // Region code from which the session was created, based on the IP address + Region string `json:"region"` +} + +func (entity *Session) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Session + + return json.Marshal((*stub)(entity)) +} + +func (*Session) GetClass() string { + return ClassSession +} + +func (*Session) GetType() string { + return TypeSession +} + +// Contains a list of sessions +type Sessions struct { + meta + // List of sessions + Sessions []*Session `json:"sessions"` +} + +func (entity *Sessions) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Sessions + + return json.Marshal((*stub)(entity)) +} + +func (*Sessions) GetClass() string { + return ClassSessions +} + +func (*Sessions) GetType() string { + return TypeSessions +} + +// Contains information about one website the current user is logged in with Telegram +type ConnectedWebsite struct { + meta + // Website identifier + Id JsonInt64 `json:"id"` + // The domain name of the website + DomainName string `json:"domain_name"` + // User identifier of a bot linked with the website + BotUserId int32 `json:"bot_user_id"` + // The version of a browser used to log in + Browser string `json:"browser"` + // Operating system the browser is running on + Platform string `json:"platform"` + // Point in time (Unix timestamp) when the user was logged in + LogInDate int32 `json:"log_in_date"` + // Point in time (Unix timestamp) when obtained authorization was last used + LastActiveDate int32 `json:"last_active_date"` + // IP address from which the user was logged in, in human-readable format + Ip string `json:"ip"` + // Human-readable description of a country and a region, from which the user was logged in, based on the IP address + Location string `json:"location"` +} + +func (entity *ConnectedWebsite) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ConnectedWebsite + + return json.Marshal((*stub)(entity)) +} + +func (*ConnectedWebsite) GetClass() string { + return ClassConnectedWebsite +} + +func (*ConnectedWebsite) GetType() string { + return TypeConnectedWebsite +} + +// Contains a list of websites the current user is logged in with Telegram +type ConnectedWebsites struct { + meta + // List of connected websites + Websites []*ConnectedWebsite `json:"websites"` +} + +func (entity *ConnectedWebsites) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ConnectedWebsites + + return json.Marshal((*stub)(entity)) +} + +func (*ConnectedWebsites) GetClass() string { + return ClassConnectedWebsites +} + +func (*ConnectedWebsites) GetType() string { + return TypeConnectedWebsites +} + +// Contains information about the availability of the "Report spam" action for a chat +type ChatReportSpamState struct { + meta + // True, if a prompt with the "Report spam" action should be shown to the user + CanReportSpam bool `json:"can_report_spam"` +} + +func (entity *ChatReportSpamState) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatReportSpamState + + return json.Marshal((*stub)(entity)) +} + +func (*ChatReportSpamState) GetClass() string { + return ClassChatReportSpamState +} + +func (*ChatReportSpamState) GetType() string { + return TypeChatReportSpamState +} + +// The chat contains spam messages +type ChatReportReasonSpam struct{ + meta +} + +func (entity *ChatReportReasonSpam) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatReportReasonSpam + + return json.Marshal((*stub)(entity)) +} + +func (*ChatReportReasonSpam) GetClass() string { + return ClassChatReportReason +} + +func (*ChatReportReasonSpam) GetType() string { + return TypeChatReportReasonSpam +} + +func (*ChatReportReasonSpam) ChatReportReasonType() string { + return TypeChatReportReasonSpam +} + +// The chat promotes violence +type ChatReportReasonViolence struct{ + meta +} + +func (entity *ChatReportReasonViolence) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatReportReasonViolence + + return json.Marshal((*stub)(entity)) +} + +func (*ChatReportReasonViolence) GetClass() string { + return ClassChatReportReason +} + +func (*ChatReportReasonViolence) GetType() string { + return TypeChatReportReasonViolence +} + +func (*ChatReportReasonViolence) ChatReportReasonType() string { + return TypeChatReportReasonViolence +} + +// The chat contains pornographic messages +type ChatReportReasonPornography struct{ + meta +} + +func (entity *ChatReportReasonPornography) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatReportReasonPornography + + return json.Marshal((*stub)(entity)) +} + +func (*ChatReportReasonPornography) GetClass() string { + return ClassChatReportReason +} + +func (*ChatReportReasonPornography) GetType() string { + return TypeChatReportReasonPornography +} + +func (*ChatReportReasonPornography) ChatReportReasonType() string { + return TypeChatReportReasonPornography +} + +// A custom reason provided by the user +type ChatReportReasonCustom struct { + meta + // Report text + Text string `json:"text"` +} + +func (entity *ChatReportReasonCustom) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ChatReportReasonCustom + + return json.Marshal((*stub)(entity)) +} + +func (*ChatReportReasonCustom) GetClass() string { + return ClassChatReportReason +} + +func (*ChatReportReasonCustom) GetType() string { + return TypeChatReportReasonCustom +} + +func (*ChatReportReasonCustom) ChatReportReasonType() string { + return TypeChatReportReasonCustom +} + +// Contains a public HTTPS link to a message in a public supergroup or channel +type PublicMessageLink struct { + meta + // Message link + Link string `json:"link"` + // HTML-code for embedding the message + Html string `json:"html"` +} + +func (entity *PublicMessageLink) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub PublicMessageLink + + return json.Marshal((*stub)(entity)) +} + +func (*PublicMessageLink) GetClass() string { + return ClassPublicMessageLink +} + +func (*PublicMessageLink) GetType() string { + return TypePublicMessageLink +} + +// The data is not a file +type FileTypeNone struct{ + meta +} + +func (entity *FileTypeNone) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeNone + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeNone) GetClass() string { + return ClassFileType +} + +func (*FileTypeNone) GetType() string { + return TypeFileTypeNone +} + +func (*FileTypeNone) FileTypeType() string { + return TypeFileTypeNone +} + +// The file is an animation +type FileTypeAnimation struct{ + meta +} + +func (entity *FileTypeAnimation) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeAnimation + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeAnimation) GetClass() string { + return ClassFileType +} + +func (*FileTypeAnimation) GetType() string { + return TypeFileTypeAnimation +} + +func (*FileTypeAnimation) FileTypeType() string { + return TypeFileTypeAnimation +} + +// The file is an audio file +type FileTypeAudio struct{ + meta +} + +func (entity *FileTypeAudio) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeAudio + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeAudio) GetClass() string { + return ClassFileType +} + +func (*FileTypeAudio) GetType() string { + return TypeFileTypeAudio +} + +func (*FileTypeAudio) FileTypeType() string { + return TypeFileTypeAudio +} + +// The file is a document +type FileTypeDocument struct{ + meta +} + +func (entity *FileTypeDocument) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeDocument + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeDocument) GetClass() string { + return ClassFileType +} + +func (*FileTypeDocument) GetType() string { + return TypeFileTypeDocument +} + +func (*FileTypeDocument) FileTypeType() string { + return TypeFileTypeDocument +} + +// The file is a photo +type FileTypePhoto struct{ + meta +} + +func (entity *FileTypePhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypePhoto + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypePhoto) GetClass() string { + return ClassFileType +} + +func (*FileTypePhoto) GetType() string { + return TypeFileTypePhoto +} + +func (*FileTypePhoto) FileTypeType() string { + return TypeFileTypePhoto +} + +// The file is a profile photo +type FileTypeProfilePhoto struct{ + meta +} + +func (entity *FileTypeProfilePhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeProfilePhoto + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeProfilePhoto) GetClass() string { + return ClassFileType +} + +func (*FileTypeProfilePhoto) GetType() string { + return TypeFileTypeProfilePhoto +} + +func (*FileTypeProfilePhoto) FileTypeType() string { + return TypeFileTypeProfilePhoto +} + +// The file was sent to a secret chat (the file type is not known to the server) +type FileTypeSecret struct{ + meta +} + +func (entity *FileTypeSecret) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeSecret + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeSecret) GetClass() string { + return ClassFileType +} + +func (*FileTypeSecret) GetType() string { + return TypeFileTypeSecret +} + +func (*FileTypeSecret) FileTypeType() string { + return TypeFileTypeSecret +} + +// The file is a sticker +type FileTypeSticker struct{ + meta +} + +func (entity *FileTypeSticker) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeSticker + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeSticker) GetClass() string { + return ClassFileType +} + +func (*FileTypeSticker) GetType() string { + return TypeFileTypeSticker +} + +func (*FileTypeSticker) FileTypeType() string { + return TypeFileTypeSticker +} + +// The file is a thumbnail of another file +type FileTypeThumbnail struct{ + meta +} + +func (entity *FileTypeThumbnail) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeThumbnail + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeThumbnail) GetClass() string { + return ClassFileType +} + +func (*FileTypeThumbnail) GetType() string { + return TypeFileTypeThumbnail +} + +func (*FileTypeThumbnail) FileTypeType() string { + return TypeFileTypeThumbnail +} + +// The file type is not yet known +type FileTypeUnknown struct{ + meta +} + +func (entity *FileTypeUnknown) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeUnknown + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeUnknown) GetClass() string { + return ClassFileType +} + +func (*FileTypeUnknown) GetType() string { + return TypeFileTypeUnknown +} + +func (*FileTypeUnknown) FileTypeType() string { + return TypeFileTypeUnknown +} + +// The file is a video +type FileTypeVideo struct{ + meta +} + +func (entity *FileTypeVideo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeVideo + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeVideo) GetClass() string { + return ClassFileType +} + +func (*FileTypeVideo) GetType() string { + return TypeFileTypeVideo +} + +func (*FileTypeVideo) FileTypeType() string { + return TypeFileTypeVideo +} + +// The file is a video note +type FileTypeVideoNote struct{ + meta +} + +func (entity *FileTypeVideoNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeVideoNote + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeVideoNote) GetClass() string { + return ClassFileType +} + +func (*FileTypeVideoNote) GetType() string { + return TypeFileTypeVideoNote +} + +func (*FileTypeVideoNote) FileTypeType() string { + return TypeFileTypeVideoNote +} + +// The file is a voice note +type FileTypeVoiceNote struct{ + meta +} + +func (entity *FileTypeVoiceNote) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeVoiceNote + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeVoiceNote) GetClass() string { + return ClassFileType +} + +func (*FileTypeVoiceNote) GetType() string { + return TypeFileTypeVoiceNote +} + +func (*FileTypeVoiceNote) FileTypeType() string { + return TypeFileTypeVoiceNote +} + +// The file is a wallpaper +type FileTypeWallpaper struct{ + meta +} + +func (entity *FileTypeWallpaper) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeWallpaper + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeWallpaper) GetClass() string { + return ClassFileType +} + +func (*FileTypeWallpaper) GetType() string { + return TypeFileTypeWallpaper +} + +func (*FileTypeWallpaper) FileTypeType() string { + return TypeFileTypeWallpaper +} + +// The file is a thumbnail of a file from a secret chat +type FileTypeSecretThumbnail struct{ + meta +} + +func (entity *FileTypeSecretThumbnail) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub FileTypeSecretThumbnail + + return json.Marshal((*stub)(entity)) +} + +func (*FileTypeSecretThumbnail) GetClass() string { + return ClassFileType +} + +func (*FileTypeSecretThumbnail) GetType() string { + return TypeFileTypeSecretThumbnail +} + +func (*FileTypeSecretThumbnail) FileTypeType() string { + return TypeFileTypeSecretThumbnail +} + +// Contains the storage usage statistics for a specific file type +type StorageStatisticsByFileType struct { + meta + // File type + FileType FileType `json:"file_type"` + // Total size of the files + Size int64 `json:"size"` + // Total number of files + Count int32 `json:"count"` +} + +func (entity *StorageStatisticsByFileType) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StorageStatisticsByFileType + + return json.Marshal((*stub)(entity)) +} + +func (*StorageStatisticsByFileType) GetClass() string { + return ClassStorageStatisticsByFileType +} + +func (*StorageStatisticsByFileType) GetType() string { + return TypeStorageStatisticsByFileType +} + +func (storageStatisticsByFileType *StorageStatisticsByFileType) UnmarshalJSON(data []byte) error { + var tmp struct { + FileType json.RawMessage `json:"file_type"` + Size int64 `json:"size"` + Count int32 `json:"count"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + storageStatisticsByFileType.Size = tmp.Size + storageStatisticsByFileType.Count = tmp.Count + + fieldFileType, _ := UnmarshalFileType(tmp.FileType) + storageStatisticsByFileType.FileType = fieldFileType + + return nil +} + +// Contains the storage usage statistics for a specific chat +type StorageStatisticsByChat struct { + meta + // Chat identifier; 0 if none + ChatId int64 `json:"chat_id"` + // Total size of the files in the chat + Size int64 `json:"size"` + // Total number of files in the chat + Count int32 `json:"count"` + // Statistics split by file types + ByFileType []*StorageStatisticsByFileType `json:"by_file_type"` +} + +func (entity *StorageStatisticsByChat) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StorageStatisticsByChat + + return json.Marshal((*stub)(entity)) +} + +func (*StorageStatisticsByChat) GetClass() string { + return ClassStorageStatisticsByChat +} + +func (*StorageStatisticsByChat) GetType() string { + return TypeStorageStatisticsByChat +} + +// Contains the exact storage usage statistics split by chats and file type +type StorageStatistics struct { + meta + // Total size of files + Size int64 `json:"size"` + // Total number of files + Count int32 `json:"count"` + // Statistics split by chats + ByChat []*StorageStatisticsByChat `json:"by_chat"` +} + +func (entity *StorageStatistics) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StorageStatistics + + return json.Marshal((*stub)(entity)) +} + +func (*StorageStatistics) GetClass() string { + return ClassStorageStatistics +} + +func (*StorageStatistics) GetType() string { + return TypeStorageStatistics +} + +// Contains approximate storage usage statistics, excluding files of unknown file type +type StorageStatisticsFast struct { + meta + // Approximate total size of files + FilesSize int64 `json:"files_size"` + // Approximate number of files + FileCount int32 `json:"file_count"` + // Size of the database + DatabaseSize int64 `json:"database_size"` +} + +func (entity *StorageStatisticsFast) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub StorageStatisticsFast + + return json.Marshal((*stub)(entity)) +} + +func (*StorageStatisticsFast) GetClass() string { + return ClassStorageStatisticsFast +} + +func (*StorageStatisticsFast) GetType() string { + return TypeStorageStatisticsFast +} + +// The network is not available +type NetworkTypeNone struct{ + meta +} + +func (entity *NetworkTypeNone) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkTypeNone + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkTypeNone) GetClass() string { + return ClassNetworkType +} + +func (*NetworkTypeNone) GetType() string { + return TypeNetworkTypeNone +} + +func (*NetworkTypeNone) NetworkTypeType() string { + return TypeNetworkTypeNone +} + +// A mobile network +type NetworkTypeMobile struct{ + meta +} + +func (entity *NetworkTypeMobile) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkTypeMobile + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkTypeMobile) GetClass() string { + return ClassNetworkType +} + +func (*NetworkTypeMobile) GetType() string { + return TypeNetworkTypeMobile +} + +func (*NetworkTypeMobile) NetworkTypeType() string { + return TypeNetworkTypeMobile +} + +// A mobile roaming network +type NetworkTypeMobileRoaming struct{ + meta +} + +func (entity *NetworkTypeMobileRoaming) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkTypeMobileRoaming + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkTypeMobileRoaming) GetClass() string { + return ClassNetworkType +} + +func (*NetworkTypeMobileRoaming) GetType() string { + return TypeNetworkTypeMobileRoaming +} + +func (*NetworkTypeMobileRoaming) NetworkTypeType() string { + return TypeNetworkTypeMobileRoaming +} + +// A Wi-Fi network +type NetworkTypeWiFi struct{ + meta +} + +func (entity *NetworkTypeWiFi) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkTypeWiFi + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkTypeWiFi) GetClass() string { + return ClassNetworkType +} + +func (*NetworkTypeWiFi) GetType() string { + return TypeNetworkTypeWiFi +} + +func (*NetworkTypeWiFi) NetworkTypeType() string { + return TypeNetworkTypeWiFi +} + +// A different network type (e.g., Ethernet network) +type NetworkTypeOther struct{ + meta +} + +func (entity *NetworkTypeOther) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkTypeOther + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkTypeOther) GetClass() string { + return ClassNetworkType +} + +func (*NetworkTypeOther) GetType() string { + return TypeNetworkTypeOther +} + +func (*NetworkTypeOther) NetworkTypeType() string { + return TypeNetworkTypeOther +} + +// Contains information about the total amount of data that was used to send and receive files +type NetworkStatisticsEntryFile struct { + meta + // Type of the file the data is part of + FileType FileType `json:"file_type"` + // Type of the network the data was sent through. Call setNetworkType to maintain the actual network type + NetworkType NetworkType `json:"network_type"` + // Total number of bytes sent + SentBytes int64 `json:"sent_bytes"` + // Total number of bytes received + ReceivedBytes int64 `json:"received_bytes"` +} + +func (entity *NetworkStatisticsEntryFile) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkStatisticsEntryFile + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkStatisticsEntryFile) GetClass() string { + return ClassNetworkStatisticsEntry +} + +func (*NetworkStatisticsEntryFile) GetType() string { + return TypeNetworkStatisticsEntryFile +} + +func (*NetworkStatisticsEntryFile) NetworkStatisticsEntryType() string { + return TypeNetworkStatisticsEntryFile +} + +func (networkStatisticsEntryFile *NetworkStatisticsEntryFile) UnmarshalJSON(data []byte) error { + var tmp struct { + FileType json.RawMessage `json:"file_type"` + NetworkType json.RawMessage `json:"network_type"` + SentBytes int64 `json:"sent_bytes"` + ReceivedBytes int64 `json:"received_bytes"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + networkStatisticsEntryFile.SentBytes = tmp.SentBytes + networkStatisticsEntryFile.ReceivedBytes = tmp.ReceivedBytes + + fieldFileType, _ := UnmarshalFileType(tmp.FileType) + networkStatisticsEntryFile.FileType = fieldFileType + + fieldNetworkType, _ := UnmarshalNetworkType(tmp.NetworkType) + networkStatisticsEntryFile.NetworkType = fieldNetworkType + + return nil +} + +// Contains information about the total amount of data that was used for calls +type NetworkStatisticsEntryCall struct { + meta + // Type of the network the data was sent through. Call setNetworkType to maintain the actual network type + NetworkType NetworkType `json:"network_type"` + // Total number of bytes sent + SentBytes int64 `json:"sent_bytes"` + // Total number of bytes received + ReceivedBytes int64 `json:"received_bytes"` + // Total call duration, in seconds + Duration float64 `json:"duration"` +} + +func (entity *NetworkStatisticsEntryCall) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkStatisticsEntryCall + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkStatisticsEntryCall) GetClass() string { + return ClassNetworkStatisticsEntry +} + +func (*NetworkStatisticsEntryCall) GetType() string { + return TypeNetworkStatisticsEntryCall +} + +func (*NetworkStatisticsEntryCall) NetworkStatisticsEntryType() string { + return TypeNetworkStatisticsEntryCall +} + +func (networkStatisticsEntryCall *NetworkStatisticsEntryCall) UnmarshalJSON(data []byte) error { + var tmp struct { + NetworkType json.RawMessage `json:"network_type"` + SentBytes int64 `json:"sent_bytes"` + ReceivedBytes int64 `json:"received_bytes"` + Duration float64 `json:"duration"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + networkStatisticsEntryCall.SentBytes = tmp.SentBytes + networkStatisticsEntryCall.ReceivedBytes = tmp.ReceivedBytes + networkStatisticsEntryCall.Duration = tmp.Duration + + fieldNetworkType, _ := UnmarshalNetworkType(tmp.NetworkType) + networkStatisticsEntryCall.NetworkType = fieldNetworkType + + return nil +} + +// A full list of available network statistic entries +type NetworkStatistics struct { + meta + // Point in time (Unix timestamp) when the app began collecting statistics + SinceDate int32 `json:"since_date"` + // Network statistics entries + Entries []NetworkStatisticsEntry `json:"entries"` +} + +func (entity *NetworkStatistics) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub NetworkStatistics + + return json.Marshal((*stub)(entity)) +} + +func (*NetworkStatistics) GetClass() string { + return ClassNetworkStatistics +} + +func (*NetworkStatistics) GetType() string { + return TypeNetworkStatistics +} + +// Currently waiting for the network to become available. Use SetNetworkType to change the available network type +type ConnectionStateWaitingForNetwork struct{ + meta +} + +func (entity *ConnectionStateWaitingForNetwork) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ConnectionStateWaitingForNetwork + + return json.Marshal((*stub)(entity)) +} + +func (*ConnectionStateWaitingForNetwork) GetClass() string { + return ClassConnectionState +} + +func (*ConnectionStateWaitingForNetwork) GetType() string { + return TypeConnectionStateWaitingForNetwork +} + +func (*ConnectionStateWaitingForNetwork) ConnectionStateType() string { + return TypeConnectionStateWaitingForNetwork +} + +// Currently establishing a connection with a proxy server +type ConnectionStateConnectingToProxy struct{ + meta +} + +func (entity *ConnectionStateConnectingToProxy) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ConnectionStateConnectingToProxy + + return json.Marshal((*stub)(entity)) +} + +func (*ConnectionStateConnectingToProxy) GetClass() string { + return ClassConnectionState +} + +func (*ConnectionStateConnectingToProxy) GetType() string { + return TypeConnectionStateConnectingToProxy +} + +func (*ConnectionStateConnectingToProxy) ConnectionStateType() string { + return TypeConnectionStateConnectingToProxy +} + +// Currently establishing a connection to the Telegram servers +type ConnectionStateConnecting struct{ + meta +} + +func (entity *ConnectionStateConnecting) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ConnectionStateConnecting + + return json.Marshal((*stub)(entity)) +} + +func (*ConnectionStateConnecting) GetClass() string { + return ClassConnectionState +} + +func (*ConnectionStateConnecting) GetType() string { + return TypeConnectionStateConnecting +} + +func (*ConnectionStateConnecting) ConnectionStateType() string { + return TypeConnectionStateConnecting +} + +// Downloading data received while the client was offline +type ConnectionStateUpdating struct{ + meta +} + +func (entity *ConnectionStateUpdating) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ConnectionStateUpdating + + return json.Marshal((*stub)(entity)) +} + +func (*ConnectionStateUpdating) GetClass() string { + return ClassConnectionState +} + +func (*ConnectionStateUpdating) GetType() string { + return TypeConnectionStateUpdating +} + +func (*ConnectionStateUpdating) ConnectionStateType() string { + return TypeConnectionStateUpdating +} + +// There is a working connection to the Telegram servers +type ConnectionStateReady struct{ + meta +} + +func (entity *ConnectionStateReady) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ConnectionStateReady + + return json.Marshal((*stub)(entity)) +} + +func (*ConnectionStateReady) GetClass() string { + return ClassConnectionState +} + +func (*ConnectionStateReady) GetType() string { + return TypeConnectionStateReady +} + +func (*ConnectionStateReady) ConnectionStateType() string { + return TypeConnectionStateReady +} + +// A category containing frequently used private chats with non-bot users +type TopChatCategoryUsers struct{ + meta +} + +func (entity *TopChatCategoryUsers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TopChatCategoryUsers + + return json.Marshal((*stub)(entity)) +} + +func (*TopChatCategoryUsers) GetClass() string { + return ClassTopChatCategory +} + +func (*TopChatCategoryUsers) GetType() string { + return TypeTopChatCategoryUsers +} + +func (*TopChatCategoryUsers) TopChatCategoryType() string { + return TypeTopChatCategoryUsers +} + +// A category containing frequently used private chats with bot users +type TopChatCategoryBots struct{ + meta +} + +func (entity *TopChatCategoryBots) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TopChatCategoryBots + + return json.Marshal((*stub)(entity)) +} + +func (*TopChatCategoryBots) GetClass() string { + return ClassTopChatCategory +} + +func (*TopChatCategoryBots) GetType() string { + return TypeTopChatCategoryBots +} + +func (*TopChatCategoryBots) TopChatCategoryType() string { + return TypeTopChatCategoryBots +} + +// A category containing frequently used basic groups and supergroups +type TopChatCategoryGroups struct{ + meta +} + +func (entity *TopChatCategoryGroups) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TopChatCategoryGroups + + return json.Marshal((*stub)(entity)) +} + +func (*TopChatCategoryGroups) GetClass() string { + return ClassTopChatCategory +} + +func (*TopChatCategoryGroups) GetType() string { + return TypeTopChatCategoryGroups +} + +func (*TopChatCategoryGroups) TopChatCategoryType() string { + return TypeTopChatCategoryGroups +} + +// A category containing frequently used channels +type TopChatCategoryChannels struct{ + meta +} + +func (entity *TopChatCategoryChannels) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TopChatCategoryChannels + + return json.Marshal((*stub)(entity)) +} + +func (*TopChatCategoryChannels) GetClass() string { + return ClassTopChatCategory +} + +func (*TopChatCategoryChannels) GetType() string { + return TypeTopChatCategoryChannels +} + +func (*TopChatCategoryChannels) TopChatCategoryType() string { + return TypeTopChatCategoryChannels +} + +// A category containing frequently used chats with inline bots sorted by their usage in inline mode +type TopChatCategoryInlineBots struct{ + meta +} + +func (entity *TopChatCategoryInlineBots) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TopChatCategoryInlineBots + + return json.Marshal((*stub)(entity)) +} + +func (*TopChatCategoryInlineBots) GetClass() string { + return ClassTopChatCategory +} + +func (*TopChatCategoryInlineBots) GetType() string { + return TypeTopChatCategoryInlineBots +} + +func (*TopChatCategoryInlineBots) TopChatCategoryType() string { + return TypeTopChatCategoryInlineBots +} + +// A category containing frequently used chats used for calls +type TopChatCategoryCalls struct{ + meta +} + +func (entity *TopChatCategoryCalls) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TopChatCategoryCalls + + return json.Marshal((*stub)(entity)) +} + +func (*TopChatCategoryCalls) GetClass() string { + return ClassTopChatCategory +} + +func (*TopChatCategoryCalls) GetType() string { + return TypeTopChatCategoryCalls +} + +func (*TopChatCategoryCalls) TopChatCategoryType() string { + return TypeTopChatCategoryCalls +} + +// A URL linking to a user +type TMeUrlTypeUser struct { + meta + // Identifier of the user + UserId int32 `json:"user_id"` +} + +func (entity *TMeUrlTypeUser) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TMeUrlTypeUser + + return json.Marshal((*stub)(entity)) +} + +func (*TMeUrlTypeUser) GetClass() string { + return ClassTMeUrlType +} + +func (*TMeUrlTypeUser) GetType() string { + return TypeTMeUrlTypeUser +} + +func (*TMeUrlTypeUser) TMeUrlTypeType() string { + return TypeTMeUrlTypeUser +} + +// A URL linking to a public supergroup or channel +type TMeUrlTypeSupergroup struct { + meta + // Identifier of the supergroup or channel + SupergroupId int64 `json:"supergroup_id"` +} + +func (entity *TMeUrlTypeSupergroup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TMeUrlTypeSupergroup + + return json.Marshal((*stub)(entity)) +} + +func (*TMeUrlTypeSupergroup) GetClass() string { + return ClassTMeUrlType +} + +func (*TMeUrlTypeSupergroup) GetType() string { + return TypeTMeUrlTypeSupergroup +} + +func (*TMeUrlTypeSupergroup) TMeUrlTypeType() string { + return TypeTMeUrlTypeSupergroup +} + +// A chat invite link +type TMeUrlTypeChatInvite struct { + meta + // Chat invite link info + Info *ChatInviteLinkInfo `json:"info"` +} + +func (entity *TMeUrlTypeChatInvite) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TMeUrlTypeChatInvite + + return json.Marshal((*stub)(entity)) +} + +func (*TMeUrlTypeChatInvite) GetClass() string { + return ClassTMeUrlType +} + +func (*TMeUrlTypeChatInvite) GetType() string { + return TypeTMeUrlTypeChatInvite +} + +func (*TMeUrlTypeChatInvite) TMeUrlTypeType() string { + return TypeTMeUrlTypeChatInvite +} + +// A URL linking to a sticker set +type TMeUrlTypeStickerSet struct { + meta + // Identifier of the sticker set + StickerSetId JsonInt64 `json:"sticker_set_id"` +} + +func (entity *TMeUrlTypeStickerSet) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TMeUrlTypeStickerSet + + return json.Marshal((*stub)(entity)) +} + +func (*TMeUrlTypeStickerSet) GetClass() string { + return ClassTMeUrlType +} + +func (*TMeUrlTypeStickerSet) GetType() string { + return TypeTMeUrlTypeStickerSet +} + +func (*TMeUrlTypeStickerSet) TMeUrlTypeType() string { + return TypeTMeUrlTypeStickerSet +} + +// Represents a URL linking to an internal Telegram entity +type TMeUrl struct { + meta + // URL + Url string `json:"url"` + // Type of the URL + Type TMeUrlType `json:"type"` +} + +func (entity *TMeUrl) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TMeUrl + + return json.Marshal((*stub)(entity)) +} + +func (*TMeUrl) GetClass() string { + return ClassTMeUrl +} + +func (*TMeUrl) GetType() string { + return TypeTMeUrl +} + +func (tMeUrl *TMeUrl) UnmarshalJSON(data []byte) error { + var tmp struct { + Url string `json:"url"` + Type json.RawMessage `json:"type"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + tMeUrl.Url = tmp.Url + + fieldType, _ := UnmarshalTMeUrlType(tmp.Type) + tMeUrl.Type = fieldType + + return nil +} + +// Contains a list of t.me URLs +type TMeUrls struct { + meta + // List of URLs + Urls []*TMeUrl `json:"urls"` +} + +func (entity *TMeUrls) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TMeUrls + + return json.Marshal((*stub)(entity)) +} + +func (*TMeUrls) GetClass() string { + return ClassTMeUrls +} + +func (*TMeUrls) GetType() string { + return TypeTMeUrls +} + +// Contains a counter +type Count struct { + meta + // Count + Count int32 `json:"count"` +} + +func (entity *Count) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Count + + return json.Marshal((*stub)(entity)) +} + +func (*Count) GetClass() string { + return ClassCount +} + +func (*Count) GetType() string { + return TypeCount +} + +// Contains some text +type Text struct { + meta + // Text + Text string `json:"text"` +} + +func (entity *Text) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub Text + + return json.Marshal((*stub)(entity)) +} + +func (*Text) GetClass() string { + return ClassText +} + +func (*Text) GetType() string { + return TypeText +} + +// The text should be parsed in markdown-style +type TextParseModeMarkdown struct{ + meta +} + +func (entity *TextParseModeMarkdown) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextParseModeMarkdown + + return json.Marshal((*stub)(entity)) +} + +func (*TextParseModeMarkdown) GetClass() string { + return ClassTextParseMode +} + +func (*TextParseModeMarkdown) GetType() string { + return TypeTextParseModeMarkdown +} + +func (*TextParseModeMarkdown) TextParseModeType() string { + return TypeTextParseModeMarkdown +} + +// The text should be parsed in HTML-style +type TextParseModeHTML struct{ + meta +} + +func (entity *TextParseModeHTML) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TextParseModeHTML + + return json.Marshal((*stub)(entity)) +} + +func (*TextParseModeHTML) GetClass() string { + return ClassTextParseMode +} + +func (*TextParseModeHTML) GetType() string { + return TypeTextParseModeHTML +} + +func (*TextParseModeHTML) TextParseModeType() string { + return TypeTextParseModeHTML +} + +// An empty proxy server +type ProxyEmpty struct{ + meta +} + +func (entity *ProxyEmpty) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ProxyEmpty + + return json.Marshal((*stub)(entity)) +} + +func (*ProxyEmpty) GetClass() string { + return ClassProxy +} + +func (*ProxyEmpty) GetType() string { + return TypeProxyEmpty +} + +func (*ProxyEmpty) ProxyType() string { + return TypeProxyEmpty +} + +// A SOCKS5 proxy server +type ProxySocks5 struct { + meta + // Proxy server IP address + Server string `json:"server"` + // Proxy server port + Port int32 `json:"port"` + // Username for logging in + Username string `json:"username"` + // Password for logging in + Password string `json:"password"` +} + +func (entity *ProxySocks5) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub ProxySocks5 + + return json.Marshal((*stub)(entity)) +} + +func (*ProxySocks5) GetClass() string { + return ClassProxy +} + +func (*ProxySocks5) GetType() string { + return TypeProxySocks5 +} + +func (*ProxySocks5) ProxyType() string { + return TypeProxySocks5 +} + +// Describes a sticker that should be added to a sticker set +type InputSticker struct { + meta + // PNG image with the sticker; must be up to 512 kB in size and fit in a 512x512 square + PngSticker InputFile `json:"png_sticker"` + // Emoji corresponding to the sticker + Emojis string `json:"emojis"` + // For masks, position where the mask should be placed; may be null + MaskPosition *MaskPosition `json:"mask_position"` +} + +func (entity *InputSticker) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub InputSticker + + return json.Marshal((*stub)(entity)) +} + +func (*InputSticker) GetClass() string { + return ClassInputSticker +} + +func (*InputSticker) GetType() string { + return TypeInputSticker +} + +func (inputSticker *InputSticker) UnmarshalJSON(data []byte) error { + var tmp struct { + PngSticker json.RawMessage `json:"png_sticker"` + Emojis string `json:"emojis"` + MaskPosition *MaskPosition `json:"mask_position"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + inputSticker.Emojis = tmp.Emojis + inputSticker.MaskPosition = tmp.MaskPosition + + fieldPngSticker, _ := UnmarshalInputFile(tmp.PngSticker) + inputSticker.PngSticker = fieldPngSticker + + return nil +} + +// The user authorization state has changed +type UpdateAuthorizationState struct { + meta + // New authorization state + AuthorizationState AuthorizationState `json:"authorization_state"` +} + +func (entity *UpdateAuthorizationState) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateAuthorizationState + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateAuthorizationState) GetClass() string { + return ClassUpdate +} + +func (*UpdateAuthorizationState) GetType() string { + return TypeUpdateAuthorizationState +} + +func (*UpdateAuthorizationState) UpdateType() string { + return TypeUpdateAuthorizationState +} + +func (updateAuthorizationState *UpdateAuthorizationState) UnmarshalJSON(data []byte) error { + var tmp struct { + AuthorizationState json.RawMessage `json:"authorization_state"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldAuthorizationState, _ := UnmarshalAuthorizationState(tmp.AuthorizationState) + updateAuthorizationState.AuthorizationState = fieldAuthorizationState + + return nil +} + +// A new message was received; can also be an outgoing message +type UpdateNewMessage struct { + meta + // The new message + Message *Message `json:"message"` + // True, if this message must not generate a notification + DisableNotification bool `json:"disable_notification"` + // True, if the message contains a mention of the current user + ContainsMention bool `json:"contains_mention"` +} + +func (entity *UpdateNewMessage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewMessage + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewMessage) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewMessage) GetType() string { + return TypeUpdateNewMessage +} + +func (*UpdateNewMessage) UpdateType() string { + return TypeUpdateNewMessage +} + +// A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully or even that the send message request will be processed. This update will be sent only if the option "use_quick_ack" is set to true. This update may be sent multiple times for the same message +type UpdateMessageSendAcknowledged struct { + meta + // The chat identifier of the sent message + ChatId int64 `json:"chat_id"` + // A temporary message identifier + MessageId int64 `json:"message_id"` +} + +func (entity *UpdateMessageSendAcknowledged) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageSendAcknowledged + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageSendAcknowledged) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageSendAcknowledged) GetType() string { + return TypeUpdateMessageSendAcknowledged +} + +func (*UpdateMessageSendAcknowledged) UpdateType() string { + return TypeUpdateMessageSendAcknowledged +} + +// A message has been successfully sent +type UpdateMessageSendSucceeded struct { + meta + // Information about the sent message. Usually only the message identifier, date, and content are changed, but almost all other fields can also change + Message *Message `json:"message"` + // The previous temporary message identifier + OldMessageId int64 `json:"old_message_id"` +} + +func (entity *UpdateMessageSendSucceeded) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageSendSucceeded + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageSendSucceeded) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageSendSucceeded) GetType() string { + return TypeUpdateMessageSendSucceeded +} + +func (*UpdateMessageSendSucceeded) UpdateType() string { + return TypeUpdateMessageSendSucceeded +} + +// A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update +type UpdateMessageSendFailed struct { + meta + // Contains information about the message that failed to send + Message *Message `json:"message"` + // The previous temporary message identifier + OldMessageId int64 `json:"old_message_id"` + // An error code + ErrorCode int32 `json:"error_code"` + // Error message + ErrorMessage string `json:"error_message"` +} + +func (entity *UpdateMessageSendFailed) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageSendFailed + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageSendFailed) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageSendFailed) GetType() string { + return TypeUpdateMessageSendFailed +} + +func (*UpdateMessageSendFailed) UpdateType() string { + return TypeUpdateMessageSendFailed +} + +// The message content has changed +type UpdateMessageContent struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Message identifier + MessageId int64 `json:"message_id"` + // New message content + NewContent MessageContent `json:"new_content"` +} + +func (entity *UpdateMessageContent) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageContent + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageContent) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageContent) GetType() string { + return TypeUpdateMessageContent +} + +func (*UpdateMessageContent) UpdateType() string { + return TypeUpdateMessageContent +} + +func (updateMessageContent *UpdateMessageContent) UnmarshalJSON(data []byte) error { + var tmp struct { + ChatId int64 `json:"chat_id"` + MessageId int64 `json:"message_id"` + NewContent json.RawMessage `json:"new_content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateMessageContent.ChatId = tmp.ChatId + updateMessageContent.MessageId = tmp.MessageId + + fieldNewContent, _ := UnmarshalMessageContent(tmp.NewContent) + updateMessageContent.NewContent = fieldNewContent + + return nil +} + +// A message was edited. Changes in the message content will come in a separate updateMessageContent +type UpdateMessageEdited struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Message identifier + MessageId int64 `json:"message_id"` + // Point in time (Unix timestamp) when the message was edited + EditDate int32 `json:"edit_date"` + // New message reply markup; may be null + ReplyMarkup ReplyMarkup `json:"reply_markup"` +} + +func (entity *UpdateMessageEdited) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageEdited + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageEdited) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageEdited) GetType() string { + return TypeUpdateMessageEdited +} + +func (*UpdateMessageEdited) UpdateType() string { + return TypeUpdateMessageEdited +} + +func (updateMessageEdited *UpdateMessageEdited) UnmarshalJSON(data []byte) error { + var tmp struct { + ChatId int64 `json:"chat_id"` + MessageId int64 `json:"message_id"` + EditDate int32 `json:"edit_date"` + ReplyMarkup json.RawMessage `json:"reply_markup"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateMessageEdited.ChatId = tmp.ChatId + updateMessageEdited.MessageId = tmp.MessageId + updateMessageEdited.EditDate = tmp.EditDate + + fieldReplyMarkup, _ := UnmarshalReplyMarkup(tmp.ReplyMarkup) + updateMessageEdited.ReplyMarkup = fieldReplyMarkup + + return nil +} + +// The view count of the message has changed +type UpdateMessageViews struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Message identifier + MessageId int64 `json:"message_id"` + // New value of the view count + Views int32 `json:"views"` +} + +func (entity *UpdateMessageViews) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageViews + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageViews) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageViews) GetType() string { + return TypeUpdateMessageViews +} + +func (*UpdateMessageViews) UpdateType() string { + return TypeUpdateMessageViews +} + +// The message content was opened. Updates voice note messages to "listened", video note messages to "viewed" and starts the TTL timer for self-destructing messages +type UpdateMessageContentOpened struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Message identifier + MessageId int64 `json:"message_id"` +} + +func (entity *UpdateMessageContentOpened) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageContentOpened + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageContentOpened) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageContentOpened) GetType() string { + return TypeUpdateMessageContentOpened +} + +func (*UpdateMessageContentOpened) UpdateType() string { + return TypeUpdateMessageContentOpened +} + +// A message with an unread mention was read +type UpdateMessageMentionRead struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Message identifier + MessageId int64 `json:"message_id"` + // The new number of unread mention messages left in the chat + UnreadMentionCount int32 `json:"unread_mention_count"` +} + +func (entity *UpdateMessageMentionRead) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateMessageMentionRead + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateMessageMentionRead) GetClass() string { + return ClassUpdate +} + +func (*UpdateMessageMentionRead) GetType() string { + return TypeUpdateMessageMentionRead +} + +func (*UpdateMessageMentionRead) UpdateType() string { + return TypeUpdateMessageMentionRead +} + +// A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the client. The chat field changes will be reported through separate updates +type UpdateNewChat struct { + meta + // The chat + Chat *Chat `json:"chat"` +} + +func (entity *UpdateNewChat) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewChat + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewChat) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewChat) GetType() string { + return TypeUpdateNewChat +} + +func (*UpdateNewChat) UpdateType() string { + return TypeUpdateNewChat +} + +// The title of a chat was changed +type UpdateChatTitle struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // The new chat title + Title string `json:"title"` +} + +func (entity *UpdateChatTitle) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatTitle + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatTitle) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatTitle) GetType() string { + return TypeUpdateChatTitle +} + +func (*UpdateChatTitle) UpdateType() string { + return TypeUpdateChatTitle +} + +// A chat photo was changed +type UpdateChatPhoto struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // The new chat photo; may be null + Photo *ChatPhoto `json:"photo"` +} + +func (entity *UpdateChatPhoto) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatPhoto + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatPhoto) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatPhoto) GetType() string { + return TypeUpdateChatPhoto +} + +func (*UpdateChatPhoto) UpdateType() string { + return TypeUpdateChatPhoto +} + +// The last message of a chat was changed. If last_message is null then the last message in the chat became unknown. Some new unknown messages might be added to the chat in this case +type UpdateChatLastMessage struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // The new last message in the chat; may be null + LastMessage *Message `json:"last_message"` + // New value of the chat order + Order JsonInt64 `json:"order"` +} + +func (entity *UpdateChatLastMessage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatLastMessage + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatLastMessage) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatLastMessage) GetType() string { + return TypeUpdateChatLastMessage +} + +func (*UpdateChatLastMessage) UpdateType() string { + return TypeUpdateChatLastMessage +} + +// The order of the chat in the chats list has changed. Instead of this update updateChatLastMessage, updateChatIsPinned or updateChatDraftMessage might be sent +type UpdateChatOrder struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // New value of the order + Order JsonInt64 `json:"order"` +} + +func (entity *UpdateChatOrder) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatOrder + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatOrder) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatOrder) GetType() string { + return TypeUpdateChatOrder +} + +func (*UpdateChatOrder) UpdateType() string { + return TypeUpdateChatOrder +} + +// A chat was pinned or unpinned +type UpdateChatIsPinned struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // New value of is_pinned + IsPinned bool `json:"is_pinned"` + // New value of the chat order + Order JsonInt64 `json:"order"` +} + +func (entity *UpdateChatIsPinned) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatIsPinned + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatIsPinned) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatIsPinned) GetType() string { + return TypeUpdateChatIsPinned +} + +func (*UpdateChatIsPinned) UpdateType() string { + return TypeUpdateChatIsPinned +} + +// Incoming messages were read or number of unread messages has been changed +type UpdateChatReadInbox struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Identifier of the last read incoming message + LastReadInboxMessageId int64 `json:"last_read_inbox_message_id"` + // The number of unread messages left in the chat + UnreadCount int32 `json:"unread_count"` +} + +func (entity *UpdateChatReadInbox) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatReadInbox + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatReadInbox) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatReadInbox) GetType() string { + return TypeUpdateChatReadInbox +} + +func (*UpdateChatReadInbox) UpdateType() string { + return TypeUpdateChatReadInbox +} + +// Outgoing messages were read +type UpdateChatReadOutbox struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Identifier of last read outgoing message + LastReadOutboxMessageId int64 `json:"last_read_outbox_message_id"` +} + +func (entity *UpdateChatReadOutbox) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatReadOutbox + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatReadOutbox) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatReadOutbox) GetType() string { + return TypeUpdateChatReadOutbox +} + +func (*UpdateChatReadOutbox) UpdateType() string { + return TypeUpdateChatReadOutbox +} + +// The chat unread_mention_count has changed +type UpdateChatUnreadMentionCount struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // The number of unread mention messages left in the chat + UnreadMentionCount int32 `json:"unread_mention_count"` +} + +func (entity *UpdateChatUnreadMentionCount) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatUnreadMentionCount + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatUnreadMentionCount) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatUnreadMentionCount) GetType() string { + return TypeUpdateChatUnreadMentionCount +} + +func (*UpdateChatUnreadMentionCount) UpdateType() string { + return TypeUpdateChatUnreadMentionCount +} + +// Notification settings for some chats were updated +type UpdateNotificationSettings struct { + meta + // Types of chats for which notification settings were updated + Scope NotificationSettingsScope `json:"scope"` + // The new notification settings + NotificationSettings *NotificationSettings `json:"notification_settings"` +} + +func (entity *UpdateNotificationSettings) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNotificationSettings + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNotificationSettings) GetClass() string { + return ClassUpdate +} + +func (*UpdateNotificationSettings) GetType() string { + return TypeUpdateNotificationSettings +} + +func (*UpdateNotificationSettings) UpdateType() string { + return TypeUpdateNotificationSettings +} + +func (updateNotificationSettings *UpdateNotificationSettings) UnmarshalJSON(data []byte) error { + var tmp struct { + Scope json.RawMessage `json:"scope"` + NotificationSettings *NotificationSettings `json:"notification_settings"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateNotificationSettings.NotificationSettings = tmp.NotificationSettings + + fieldScope, _ := UnmarshalNotificationSettingsScope(tmp.Scope) + updateNotificationSettings.Scope = fieldScope + + return nil +} + +// The default chat reply markup was changed. Can occur because new messages with reply markup were received or because an old reply markup was hidden by the user +type UpdateChatReplyMarkup struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat + ReplyMarkupMessageId int64 `json:"reply_markup_message_id"` +} + +func (entity *UpdateChatReplyMarkup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatReplyMarkup + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatReplyMarkup) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatReplyMarkup) GetType() string { + return TypeUpdateChatReplyMarkup +} + +func (*UpdateChatReplyMarkup) UpdateType() string { + return TypeUpdateChatReplyMarkup +} + +// A draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update shouldn't be applied +type UpdateChatDraftMessage struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // The new draft message; may be null + DraftMessage *DraftMessage `json:"draft_message"` + // New value of the chat order + Order JsonInt64 `json:"order"` +} + +func (entity *UpdateChatDraftMessage) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateChatDraftMessage + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateChatDraftMessage) GetClass() string { + return ClassUpdate +} + +func (*UpdateChatDraftMessage) GetType() string { + return TypeUpdateChatDraftMessage +} + +func (*UpdateChatDraftMessage) UpdateType() string { + return TypeUpdateChatDraftMessage +} + +// Some messages were deleted +type UpdateDeleteMessages struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Identifiers of the deleted messages + MessageIds []int64 `json:"message_ids"` + // True, if the messages are permanently deleted by a user (as opposed to just becoming unaccessible) + IsPermanent bool `json:"is_permanent"` + // True, if the messages are deleted only from the cache and can possibly be retrieved again in the future + FromCache bool `json:"from_cache"` +} + +func (entity *UpdateDeleteMessages) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateDeleteMessages + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateDeleteMessages) GetClass() string { + return ClassUpdate +} + +func (*UpdateDeleteMessages) GetType() string { + return TypeUpdateDeleteMessages +} + +func (*UpdateDeleteMessages) UpdateType() string { + return TypeUpdateDeleteMessages +} + +// User activity in the chat has changed +type UpdateUserChatAction struct { + meta + // Chat identifier + ChatId int64 `json:"chat_id"` + // Identifier of a user performing an action + UserId int32 `json:"user_id"` + // The action description + Action ChatAction `json:"action"` +} + +func (entity *UpdateUserChatAction) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateUserChatAction + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateUserChatAction) GetClass() string { + return ClassUpdate +} + +func (*UpdateUserChatAction) GetType() string { + return TypeUpdateUserChatAction +} + +func (*UpdateUserChatAction) UpdateType() string { + return TypeUpdateUserChatAction +} + +func (updateUserChatAction *UpdateUserChatAction) UnmarshalJSON(data []byte) error { + var tmp struct { + ChatId int64 `json:"chat_id"` + UserId int32 `json:"user_id"` + Action json.RawMessage `json:"action"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateUserChatAction.ChatId = tmp.ChatId + updateUserChatAction.UserId = tmp.UserId + + fieldAction, _ := UnmarshalChatAction(tmp.Action) + updateUserChatAction.Action = fieldAction + + return nil +} + +// The user went online or offline +type UpdateUserStatus struct { + meta + // User identifier + UserId int32 `json:"user_id"` + // New status of the user + Status UserStatus `json:"status"` +} + +func (entity *UpdateUserStatus) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateUserStatus + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateUserStatus) GetClass() string { + return ClassUpdate +} + +func (*UpdateUserStatus) GetType() string { + return TypeUpdateUserStatus +} + +func (*UpdateUserStatus) UpdateType() string { + return TypeUpdateUserStatus +} + +func (updateUserStatus *UpdateUserStatus) UnmarshalJSON(data []byte) error { + var tmp struct { + UserId int32 `json:"user_id"` + Status json.RawMessage `json:"status"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateUserStatus.UserId = tmp.UserId + + fieldStatus, _ := UnmarshalUserStatus(tmp.Status) + updateUserStatus.Status = fieldStatus + + return nil +} + +// Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the client +type UpdateUser struct { + meta + // New data about the user + User *User `json:"user"` +} + +func (entity *UpdateUser) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateUser + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateUser) GetClass() string { + return ClassUpdate +} + +func (*UpdateUser) GetType() string { + return TypeUpdateUser +} + +func (*UpdateUser) UpdateType() string { + return TypeUpdateUser +} + +// Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the client +type UpdateBasicGroup struct { + meta + // New data about the group + BasicGroup *BasicGroup `json:"basic_group"` +} + +func (entity *UpdateBasicGroup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateBasicGroup + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateBasicGroup) GetClass() string { + return ClassUpdate +} + +func (*UpdateBasicGroup) GetType() string { + return TypeUpdateBasicGroup +} + +func (*UpdateBasicGroup) UpdateType() string { + return TypeUpdateBasicGroup +} + +// Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the client +type UpdateSupergroup struct { + meta + // New data about the supergroup + Supergroup *Supergroup `json:"supergroup"` +} + +func (entity *UpdateSupergroup) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateSupergroup + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateSupergroup) GetClass() string { + return ClassUpdate +} + +func (*UpdateSupergroup) GetType() string { + return TypeUpdateSupergroup +} + +func (*UpdateSupergroup) UpdateType() string { + return TypeUpdateSupergroup +} + +// Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the client +type UpdateSecretChat struct { + meta + // New data about the secret chat + SecretChat *SecretChat `json:"secret_chat"` +} + +func (entity *UpdateSecretChat) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateSecretChat + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateSecretChat) GetClass() string { + return ClassUpdate +} + +func (*UpdateSecretChat) GetType() string { + return TypeUpdateSecretChat +} + +func (*UpdateSecretChat) UpdateType() string { + return TypeUpdateSecretChat +} + +// Some data from userFullInfo has been changed +type UpdateUserFullInfo struct { + meta + // User identifier + UserId int32 `json:"user_id"` + // New full information about the user + UserFullInfo *UserFullInfo `json:"user_full_info"` +} + +func (entity *UpdateUserFullInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateUserFullInfo + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateUserFullInfo) GetClass() string { + return ClassUpdate +} + +func (*UpdateUserFullInfo) GetType() string { + return TypeUpdateUserFullInfo +} + +func (*UpdateUserFullInfo) UpdateType() string { + return TypeUpdateUserFullInfo +} + +// Some data from basicGroupFullInfo has been changed +type UpdateBasicGroupFullInfo struct { + meta + // Identifier of a basic group + BasicGroupId int32 `json:"basic_group_id"` + // New full information about the group + BasicGroupFullInfo *BasicGroupFullInfo `json:"basic_group_full_info"` +} + +func (entity *UpdateBasicGroupFullInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateBasicGroupFullInfo + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateBasicGroupFullInfo) GetClass() string { + return ClassUpdate +} + +func (*UpdateBasicGroupFullInfo) GetType() string { + return TypeUpdateBasicGroupFullInfo +} + +func (*UpdateBasicGroupFullInfo) UpdateType() string { + return TypeUpdateBasicGroupFullInfo +} + +// Some data from supergroupFullInfo has been changed +type UpdateSupergroupFullInfo struct { + meta + // Identifier of the supergroup or channel + SupergroupId int32 `json:"supergroup_id"` + // New full information about the supergroup + SupergroupFullInfo *SupergroupFullInfo `json:"supergroup_full_info"` +} + +func (entity *UpdateSupergroupFullInfo) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateSupergroupFullInfo + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateSupergroupFullInfo) GetClass() string { + return ClassUpdate +} + +func (*UpdateSupergroupFullInfo) GetType() string { + return TypeUpdateSupergroupFullInfo +} + +func (*UpdateSupergroupFullInfo) UpdateType() string { + return TypeUpdateSupergroupFullInfo +} + +// Service notification from the server. Upon receiving this the client must show a popup with the content of the notification +type UpdateServiceNotification struct { + meta + // Notification type + Type string `json:"type"` + // Notification content + Content MessageContent `json:"content"` +} + +func (entity *UpdateServiceNotification) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateServiceNotification + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateServiceNotification) GetClass() string { + return ClassUpdate +} + +func (*UpdateServiceNotification) GetType() string { + return TypeUpdateServiceNotification +} + +func (*UpdateServiceNotification) UpdateType() string { + return TypeUpdateServiceNotification +} + +func (updateServiceNotification *UpdateServiceNotification) UnmarshalJSON(data []byte) error { + var tmp struct { + Type string `json:"type"` + Content json.RawMessage `json:"content"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateServiceNotification.Type = tmp.Type + + fieldContent, _ := UnmarshalMessageContent(tmp.Content) + updateServiceNotification.Content = fieldContent + + return nil +} + +// Information about a file was updated +type UpdateFile struct { + meta + // New data about the file + File *File `json:"file"` +} + +func (entity *UpdateFile) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateFile + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateFile) GetClass() string { + return ClassUpdate +} + +func (*UpdateFile) GetType() string { + return TypeUpdateFile +} + +func (*UpdateFile) UpdateType() string { + return TypeUpdateFile +} + +// The file generation process needs to be started by the client +type UpdateFileGenerationStart struct { + meta + // Unique identifier for the generation process + GenerationId JsonInt64 `json:"generation_id"` + // The path to a file from which a new file is generated, may be empty + OriginalPath string `json:"original_path"` + // The path to a file that should be created and where the new file should be generated + DestinationPath string `json:"destination_path"` + // String specifying the conversion applied to the original file. If conversion is "#url#" than original_path contains a HTTP/HTTPS URL of a file, which should be downloaded by the client + Conversion string `json:"conversion"` +} + +func (entity *UpdateFileGenerationStart) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateFileGenerationStart + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateFileGenerationStart) GetClass() string { + return ClassUpdate +} + +func (*UpdateFileGenerationStart) GetType() string { + return TypeUpdateFileGenerationStart +} + +func (*UpdateFileGenerationStart) UpdateType() string { + return TypeUpdateFileGenerationStart +} + +// File generation is no longer needed +type UpdateFileGenerationStop struct { + meta + // Unique identifier for the generation process + GenerationId JsonInt64 `json:"generation_id"` +} + +func (entity *UpdateFileGenerationStop) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateFileGenerationStop + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateFileGenerationStop) GetClass() string { + return ClassUpdate +} + +func (*UpdateFileGenerationStop) GetType() string { + return TypeUpdateFileGenerationStop +} + +func (*UpdateFileGenerationStop) UpdateType() string { + return TypeUpdateFileGenerationStop +} + +// New call was created or information about a call was updated +type UpdateCall struct { + meta + // New data about a call + Call *Call `json:"call"` +} + +func (entity *UpdateCall) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateCall + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateCall) GetClass() string { + return ClassUpdate +} + +func (*UpdateCall) GetType() string { + return TypeUpdateCall +} + +func (*UpdateCall) UpdateType() string { + return TypeUpdateCall +} + +// Some privacy setting rules have been changed +type UpdateUserPrivacySettingRules struct { + meta + // The privacy setting + Setting UserPrivacySetting `json:"setting"` + // New privacy rules + Rules *UserPrivacySettingRules `json:"rules"` +} + +func (entity *UpdateUserPrivacySettingRules) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateUserPrivacySettingRules + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateUserPrivacySettingRules) GetClass() string { + return ClassUpdate +} + +func (*UpdateUserPrivacySettingRules) GetType() string { + return TypeUpdateUserPrivacySettingRules +} + +func (*UpdateUserPrivacySettingRules) UpdateType() string { + return TypeUpdateUserPrivacySettingRules +} + +func (updateUserPrivacySettingRules *UpdateUserPrivacySettingRules) UnmarshalJSON(data []byte) error { + var tmp struct { + Setting json.RawMessage `json:"setting"` + Rules *UserPrivacySettingRules `json:"rules"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateUserPrivacySettingRules.Rules = tmp.Rules + + fieldSetting, _ := UnmarshalUserPrivacySetting(tmp.Setting) + updateUserPrivacySettingRules.Setting = fieldSetting + + return nil +} + +// Number of unread messages has changed. This update is sent only if a message database is used +type UpdateUnreadMessageCount struct { + meta + // Total number of unread messages + UnreadCount int32 `json:"unread_count"` + // Total number of unread messages in unmuted chats + UnreadUnmutedCount int32 `json:"unread_unmuted_count"` +} + +func (entity *UpdateUnreadMessageCount) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateUnreadMessageCount + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateUnreadMessageCount) GetClass() string { + return ClassUpdate +} + +func (*UpdateUnreadMessageCount) GetType() string { + return TypeUpdateUnreadMessageCount +} + +func (*UpdateUnreadMessageCount) UpdateType() string { + return TypeUpdateUnreadMessageCount +} + +// An option changed its value +type UpdateOption struct { + meta + // The option name + Name string `json:"name"` + // The new option value + Value OptionValue `json:"value"` +} + +func (entity *UpdateOption) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateOption + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateOption) GetClass() string { + return ClassUpdate +} + +func (*UpdateOption) GetType() string { + return TypeUpdateOption +} + +func (*UpdateOption) UpdateType() string { + return TypeUpdateOption +} + +func (updateOption *UpdateOption) UnmarshalJSON(data []byte) error { + var tmp struct { + Name string `json:"name"` + Value json.RawMessage `json:"value"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateOption.Name = tmp.Name + + fieldValue, _ := UnmarshalOptionValue(tmp.Value) + updateOption.Value = fieldValue + + return nil +} + +// The list of installed sticker sets was updated +type UpdateInstalledStickerSets struct { + meta + // True, if the list of installed mask sticker sets was updated + IsMasks bool `json:"is_masks"` + // The new list of installed ordinary sticker sets + StickerSetIds []JsonInt64 `json:"sticker_set_ids"` +} + +func (entity *UpdateInstalledStickerSets) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateInstalledStickerSets + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateInstalledStickerSets) GetClass() string { + return ClassUpdate +} + +func (*UpdateInstalledStickerSets) GetType() string { + return TypeUpdateInstalledStickerSets +} + +func (*UpdateInstalledStickerSets) UpdateType() string { + return TypeUpdateInstalledStickerSets +} + +// The list of trending sticker sets was updated or some of them were viewed +type UpdateTrendingStickerSets struct { + meta + // The new list of trending sticker sets + StickerSets *StickerSets `json:"sticker_sets"` +} + +func (entity *UpdateTrendingStickerSets) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateTrendingStickerSets + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateTrendingStickerSets) GetClass() string { + return ClassUpdate +} + +func (*UpdateTrendingStickerSets) GetType() string { + return TypeUpdateTrendingStickerSets +} + +func (*UpdateTrendingStickerSets) UpdateType() string { + return TypeUpdateTrendingStickerSets +} + +// The list of recently used stickers was updated +type UpdateRecentStickers struct { + meta + // True, if the list of stickers attached to photo or video files was updated, otherwise the list of sent stickers is updated + IsAttached bool `json:"is_attached"` + // The new list of file identifiers of recently used stickers + StickerIds []int32 `json:"sticker_ids"` +} + +func (entity *UpdateRecentStickers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateRecentStickers + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateRecentStickers) GetClass() string { + return ClassUpdate +} + +func (*UpdateRecentStickers) GetType() string { + return TypeUpdateRecentStickers +} + +func (*UpdateRecentStickers) UpdateType() string { + return TypeUpdateRecentStickers +} + +// The list of favorite stickers was updated +type UpdateFavoriteStickers struct { + meta + // The new list of file identifiers of favorite stickers + StickerIds []int32 `json:"sticker_ids"` +} + +func (entity *UpdateFavoriteStickers) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateFavoriteStickers + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateFavoriteStickers) GetClass() string { + return ClassUpdate +} + +func (*UpdateFavoriteStickers) GetType() string { + return TypeUpdateFavoriteStickers +} + +func (*UpdateFavoriteStickers) UpdateType() string { + return TypeUpdateFavoriteStickers +} + +// The list of saved animations was updated +type UpdateSavedAnimations struct { + meta + // The new list of file identifiers of saved animations + AnimationIds []int32 `json:"animation_ids"` +} + +func (entity *UpdateSavedAnimations) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateSavedAnimations + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateSavedAnimations) GetClass() string { + return ClassUpdate +} + +func (*UpdateSavedAnimations) GetType() string { + return TypeUpdateSavedAnimations +} + +func (*UpdateSavedAnimations) UpdateType() string { + return TypeUpdateSavedAnimations +} + +// The connection state has changed +type UpdateConnectionState struct { + meta + // The new connection state + State ConnectionState `json:"state"` +} + +func (entity *UpdateConnectionState) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateConnectionState + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateConnectionState) GetClass() string { + return ClassUpdate +} + +func (*UpdateConnectionState) GetType() string { + return TypeUpdateConnectionState +} + +func (*UpdateConnectionState) UpdateType() string { + return TypeUpdateConnectionState +} + +func (updateConnectionState *UpdateConnectionState) UnmarshalJSON(data []byte) error { + var tmp struct { + State json.RawMessage `json:"state"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + fieldState, _ := UnmarshalConnectionState(tmp.State) + updateConnectionState.State = fieldState + + return nil +} + +// A new incoming inline query; for bots only +type UpdateNewInlineQuery struct { + meta + // Unique query identifier + Id JsonInt64 `json:"id"` + // Identifier of the user who sent the query + SenderUserId int32 `json:"sender_user_id"` + // User location, provided by the client; may be null + UserLocation *Location `json:"user_location"` + // Text of the query + Query string `json:"query"` + // Offset of the first entry to return + Offset string `json:"offset"` +} + +func (entity *UpdateNewInlineQuery) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewInlineQuery + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewInlineQuery) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewInlineQuery) GetType() string { + return TypeUpdateNewInlineQuery +} + +func (*UpdateNewInlineQuery) UpdateType() string { + return TypeUpdateNewInlineQuery +} + +// The user has chosen a result of an inline query; for bots only +type UpdateNewChosenInlineResult struct { + meta + // Identifier of the user who sent the query + SenderUserId int32 `json:"sender_user_id"` + // User location, provided by the client; may be null + UserLocation *Location `json:"user_location"` + // Text of the query + Query string `json:"query"` + // Identifier of the chosen result + ResultId string `json:"result_id"` + // Identifier of the sent inline message, if known + InlineMessageId string `json:"inline_message_id"` +} + +func (entity *UpdateNewChosenInlineResult) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewChosenInlineResult + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewChosenInlineResult) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewChosenInlineResult) GetType() string { + return TypeUpdateNewChosenInlineResult +} + +func (*UpdateNewChosenInlineResult) UpdateType() string { + return TypeUpdateNewChosenInlineResult +} + +// A new incoming callback query; for bots only +type UpdateNewCallbackQuery struct { + meta + // Unique query identifier + Id JsonInt64 `json:"id"` + // Identifier of the user who sent the query + SenderUserId int32 `json:"sender_user_id"` + // Identifier of the chat, in which the query was sent + ChatId int64 `json:"chat_id"` + // Identifier of the message, from which the query originated + MessageId int64 `json:"message_id"` + // Identifier that uniquely corresponds to the chat to which the message was sent + ChatInstance JsonInt64 `json:"chat_instance"` + // Query payload + Payload CallbackQueryPayload `json:"payload"` +} + +func (entity *UpdateNewCallbackQuery) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewCallbackQuery + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewCallbackQuery) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewCallbackQuery) GetType() string { + return TypeUpdateNewCallbackQuery +} + +func (*UpdateNewCallbackQuery) UpdateType() string { + return TypeUpdateNewCallbackQuery +} + +func (updateNewCallbackQuery *UpdateNewCallbackQuery) UnmarshalJSON(data []byte) error { + var tmp struct { + Id JsonInt64 `json:"id"` + SenderUserId int32 `json:"sender_user_id"` + ChatId int64 `json:"chat_id"` + MessageId int64 `json:"message_id"` + ChatInstance JsonInt64 `json:"chat_instance"` + Payload json.RawMessage `json:"payload"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateNewCallbackQuery.Id = tmp.Id + updateNewCallbackQuery.SenderUserId = tmp.SenderUserId + updateNewCallbackQuery.ChatId = tmp.ChatId + updateNewCallbackQuery.MessageId = tmp.MessageId + updateNewCallbackQuery.ChatInstance = tmp.ChatInstance + + fieldPayload, _ := UnmarshalCallbackQueryPayload(tmp.Payload) + updateNewCallbackQuery.Payload = fieldPayload + + return nil +} + +// A new incoming callback query from a message sent via a bot; for bots only +type UpdateNewInlineCallbackQuery struct { + meta + // Unique query identifier + Id JsonInt64 `json:"id"` + // Identifier of the user who sent the query + SenderUserId int32 `json:"sender_user_id"` + // Identifier of the inline message, from which the query originated + InlineMessageId string `json:"inline_message_id"` + // An identifier uniquely corresponding to the chat a message was sent to + ChatInstance JsonInt64 `json:"chat_instance"` + // Query payload + Payload CallbackQueryPayload `json:"payload"` +} + +func (entity *UpdateNewInlineCallbackQuery) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewInlineCallbackQuery + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewInlineCallbackQuery) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewInlineCallbackQuery) GetType() string { + return TypeUpdateNewInlineCallbackQuery +} + +func (*UpdateNewInlineCallbackQuery) UpdateType() string { + return TypeUpdateNewInlineCallbackQuery +} + +func (updateNewInlineCallbackQuery *UpdateNewInlineCallbackQuery) UnmarshalJSON(data []byte) error { + var tmp struct { + Id JsonInt64 `json:"id"` + SenderUserId int32 `json:"sender_user_id"` + InlineMessageId string `json:"inline_message_id"` + ChatInstance JsonInt64 `json:"chat_instance"` + Payload json.RawMessage `json:"payload"` + } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + updateNewInlineCallbackQuery.Id = tmp.Id + updateNewInlineCallbackQuery.SenderUserId = tmp.SenderUserId + updateNewInlineCallbackQuery.InlineMessageId = tmp.InlineMessageId + updateNewInlineCallbackQuery.ChatInstance = tmp.ChatInstance + + fieldPayload, _ := UnmarshalCallbackQueryPayload(tmp.Payload) + updateNewInlineCallbackQuery.Payload = fieldPayload + + return nil +} + +// A new incoming shipping query; for bots only. Only for invoices with flexible price +type UpdateNewShippingQuery struct { + meta + // Unique query identifier + Id JsonInt64 `json:"id"` + // Identifier of the user who sent the query + SenderUserId int32 `json:"sender_user_id"` + // Invoice payload + InvoicePayload string `json:"invoice_payload"` + // User shipping address + ShippingAddress *ShippingAddress `json:"shipping_address"` +} + +func (entity *UpdateNewShippingQuery) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewShippingQuery + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewShippingQuery) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewShippingQuery) GetType() string { + return TypeUpdateNewShippingQuery +} + +func (*UpdateNewShippingQuery) UpdateType() string { + return TypeUpdateNewShippingQuery +} + +// A new incoming pre-checkout query; for bots only. Contains full information about a checkout +type UpdateNewPreCheckoutQuery struct { + meta + // Unique query identifier + Id JsonInt64 `json:"id"` + // Identifier of the user who sent the query + SenderUserId int32 `json:"sender_user_id"` + // Currency for the product price + Currency string `json:"currency"` + // Total price for the product, in the minimal quantity of the currency + TotalAmount int64 `json:"total_amount"` + // Invoice payload + InvoicePayload []byte `json:"invoice_payload"` + // Identifier of a shipping option chosen by the user; may be empty if not applicable + ShippingOptionId string `json:"shipping_option_id"` + // Information about the order; may be null + OrderInfo *OrderInfo `json:"order_info"` +} + +func (entity *UpdateNewPreCheckoutQuery) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewPreCheckoutQuery + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewPreCheckoutQuery) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewPreCheckoutQuery) GetType() string { + return TypeUpdateNewPreCheckoutQuery +} + +func (*UpdateNewPreCheckoutQuery) UpdateType() string { + return TypeUpdateNewPreCheckoutQuery +} + +// A new incoming event; for bots only +type UpdateNewCustomEvent struct { + meta + // A JSON-serialized event + Event string `json:"event"` +} + +func (entity *UpdateNewCustomEvent) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewCustomEvent + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewCustomEvent) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewCustomEvent) GetType() string { + return TypeUpdateNewCustomEvent +} + +func (*UpdateNewCustomEvent) UpdateType() string { + return TypeUpdateNewCustomEvent +} + +// A new incoming query; for bots only +type UpdateNewCustomQuery struct { + meta + // The query identifier + Id JsonInt64 `json:"id"` + // JSON-serialized query data + Data string `json:"data"` + // Query timeout + Timeout int32 `json:"timeout"` +} + +func (entity *UpdateNewCustomQuery) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub UpdateNewCustomQuery + + return json.Marshal((*stub)(entity)) +} + +func (*UpdateNewCustomQuery) GetClass() string { + return ClassUpdate +} + +func (*UpdateNewCustomQuery) GetType() string { + return TypeUpdateNewCustomQuery +} + +func (*UpdateNewCustomQuery) UpdateType() string { + return TypeUpdateNewCustomQuery +} + +// A simple object containing a number; for testing only +type TestInt struct { + meta + // Number + Value int32 `json:"value"` +} + +func (entity *TestInt) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TestInt + + return json.Marshal((*stub)(entity)) +} + +func (*TestInt) GetClass() string { + return ClassTestInt +} + +func (*TestInt) GetType() string { + return TypeTestInt +} + +// A simple object containing a string; for testing only +type TestString struct { + meta + // String + Value string `json:"value"` +} + +func (entity *TestString) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TestString + + return json.Marshal((*stub)(entity)) +} + +func (*TestString) GetClass() string { + return ClassTestString +} + +func (*TestString) GetType() string { + return TypeTestString +} + +// A simple object containing a sequence of bytes; for testing only +type TestBytes struct { + meta + // Bytes + Value []byte `json:"value"` +} + +func (entity *TestBytes) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TestBytes + + return json.Marshal((*stub)(entity)) +} + +func (*TestBytes) GetClass() string { + return ClassTestBytes +} + +func (*TestBytes) GetType() string { + return TypeTestBytes +} + +// A simple object containing a vector of numbers; for testing only +type TestVectorInt struct { + meta + // Vector of numbers + Value []int32 `json:"value"` +} + +func (entity *TestVectorInt) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TestVectorInt + + return json.Marshal((*stub)(entity)) +} + +func (*TestVectorInt) GetClass() string { + return ClassTestVectorInt +} + +func (*TestVectorInt) GetType() string { + return TypeTestVectorInt +} + +// A simple object containing a vector of objects that hold a number; for testing only +type TestVectorIntObject struct { + meta + // Vector of objects + Value []*TestInt `json:"value"` +} + +func (entity *TestVectorIntObject) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TestVectorIntObject + + return json.Marshal((*stub)(entity)) +} + +func (*TestVectorIntObject) GetClass() string { + return ClassTestVectorIntObject +} + +func (*TestVectorIntObject) GetType() string { + return TypeTestVectorIntObject +} + +// A simple object containing a vector of strings; for testing only +type TestVectorString struct { + meta + // Vector of strings + Value []string `json:"value"` +} + +func (entity *TestVectorString) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TestVectorString + + return json.Marshal((*stub)(entity)) +} + +func (*TestVectorString) GetClass() string { + return ClassTestVectorString +} + +func (*TestVectorString) GetType() string { + return TypeTestVectorString +} + +// A simple object containing a vector of objects that hold a string; for testing only +type TestVectorStringObject struct { + meta + // Vector of objects + Value []*TestString `json:"value"` +} + +func (entity *TestVectorStringObject) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub TestVectorStringObject + + return json.Marshal((*stub)(entity)) +} + +func (*TestVectorStringObject) GetClass() string { + return ClassTestVectorStringObject +} + +func (*TestVectorStringObject) GetType() string { + return TypeTestVectorStringObject +} + diff --git a/client/unmarshaler.go b/client/unmarshaler.go new file mode 100755 index 0000000..8033502 --- /dev/null +++ b/client/unmarshaler.go @@ -0,0 +1,7349 @@ +// AUTOGENERATED + +package client + +import ( + "encoding/json" + "fmt" +) + +func UnmarshalAuthenticationCodeType(data json.RawMessage) (AuthenticationCodeType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeAuthenticationCodeTypeTelegramMessage: + return UnmarshalAuthenticationCodeTypeTelegramMessage(data) + + case TypeAuthenticationCodeTypeSms: + return UnmarshalAuthenticationCodeTypeSms(data) + + case TypeAuthenticationCodeTypeCall: + return UnmarshalAuthenticationCodeTypeCall(data) + + case TypeAuthenticationCodeTypeFlashCall: + return UnmarshalAuthenticationCodeTypeFlashCall(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalAuthorizationState(data json.RawMessage) (AuthorizationState, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeAuthorizationStateWaitTdlibParameters: + return UnmarshalAuthorizationStateWaitTdlibParameters(data) + + case TypeAuthorizationStateWaitEncryptionKey: + return UnmarshalAuthorizationStateWaitEncryptionKey(data) + + case TypeAuthorizationStateWaitPhoneNumber: + return UnmarshalAuthorizationStateWaitPhoneNumber(data) + + case TypeAuthorizationStateWaitCode: + return UnmarshalAuthorizationStateWaitCode(data) + + case TypeAuthorizationStateWaitPassword: + return UnmarshalAuthorizationStateWaitPassword(data) + + case TypeAuthorizationStateReady: + return UnmarshalAuthorizationStateReady(data) + + case TypeAuthorizationStateLoggingOut: + return UnmarshalAuthorizationStateLoggingOut(data) + + case TypeAuthorizationStateClosing: + return UnmarshalAuthorizationStateClosing(data) + + case TypeAuthorizationStateClosed: + return UnmarshalAuthorizationStateClosed(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalInputFile(data json.RawMessage) (InputFile, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeInputFileId: + return UnmarshalInputFileId(data) + + case TypeInputFileRemote: + return UnmarshalInputFileRemote(data) + + case TypeInputFileLocal: + return UnmarshalInputFileLocal(data) + + case TypeInputFileGenerated: + return UnmarshalInputFileGenerated(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalMaskPoint(data json.RawMessage) (MaskPoint, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeMaskPointForehead: + return UnmarshalMaskPointForehead(data) + + case TypeMaskPointEyes: + return UnmarshalMaskPointEyes(data) + + case TypeMaskPointMouth: + return UnmarshalMaskPointMouth(data) + + case TypeMaskPointChin: + return UnmarshalMaskPointChin(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalLinkState(data json.RawMessage) (LinkState, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeLinkStateNone: + return UnmarshalLinkStateNone(data) + + case TypeLinkStateKnowsPhoneNumber: + return UnmarshalLinkStateKnowsPhoneNumber(data) + + case TypeLinkStateIsContact: + return UnmarshalLinkStateIsContact(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalUserType(data json.RawMessage) (UserType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeUserTypeRegular: + return UnmarshalUserTypeRegular(data) + + case TypeUserTypeDeleted: + return UnmarshalUserTypeDeleted(data) + + case TypeUserTypeBot: + return UnmarshalUserTypeBot(data) + + case TypeUserTypeUnknown: + return UnmarshalUserTypeUnknown(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalChatMemberStatus(data json.RawMessage) (ChatMemberStatus, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeChatMemberStatusCreator: + return UnmarshalChatMemberStatusCreator(data) + + case TypeChatMemberStatusAdministrator: + return UnmarshalChatMemberStatusAdministrator(data) + + case TypeChatMemberStatusMember: + return UnmarshalChatMemberStatusMember(data) + + case TypeChatMemberStatusRestricted: + return UnmarshalChatMemberStatusRestricted(data) + + case TypeChatMemberStatusLeft: + return UnmarshalChatMemberStatusLeft(data) + + case TypeChatMemberStatusBanned: + return UnmarshalChatMemberStatusBanned(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalSupergroupMembersFilter(data json.RawMessage) (SupergroupMembersFilter, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeSupergroupMembersFilterRecent: + return UnmarshalSupergroupMembersFilterRecent(data) + + case TypeSupergroupMembersFilterAdministrators: + return UnmarshalSupergroupMembersFilterAdministrators(data) + + case TypeSupergroupMembersFilterSearch: + return UnmarshalSupergroupMembersFilterSearch(data) + + case TypeSupergroupMembersFilterRestricted: + return UnmarshalSupergroupMembersFilterRestricted(data) + + case TypeSupergroupMembersFilterBanned: + return UnmarshalSupergroupMembersFilterBanned(data) + + case TypeSupergroupMembersFilterBots: + return UnmarshalSupergroupMembersFilterBots(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalSecretChatState(data json.RawMessage) (SecretChatState, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeSecretChatStatePending: + return UnmarshalSecretChatStatePending(data) + + case TypeSecretChatStateReady: + return UnmarshalSecretChatStateReady(data) + + case TypeSecretChatStateClosed: + return UnmarshalSecretChatStateClosed(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalMessageForwardInfo(data json.RawMessage) (MessageForwardInfo, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeMessageForwardedFromUser: + return UnmarshalMessageForwardedFromUser(data) + + case TypeMessageForwardedPost: + return UnmarshalMessageForwardedPost(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalMessageSendingState(data json.RawMessage) (MessageSendingState, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeMessageSendingStatePending: + return UnmarshalMessageSendingStatePending(data) + + case TypeMessageSendingStateFailed: + return UnmarshalMessageSendingStateFailed(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalNotificationSettingsScope(data json.RawMessage) (NotificationSettingsScope, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeNotificationSettingsScopeChat: + return UnmarshalNotificationSettingsScopeChat(data) + + case TypeNotificationSettingsScopePrivateChats: + return UnmarshalNotificationSettingsScopePrivateChats(data) + + case TypeNotificationSettingsScopeBasicGroupChats: + return UnmarshalNotificationSettingsScopeBasicGroupChats(data) + + case TypeNotificationSettingsScopeAllChats: + return UnmarshalNotificationSettingsScopeAllChats(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalChatType(data json.RawMessage) (ChatType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeChatTypePrivate: + return UnmarshalChatTypePrivate(data) + + case TypeChatTypeBasicGroup: + return UnmarshalChatTypeBasicGroup(data) + + case TypeChatTypeSupergroup: + return UnmarshalChatTypeSupergroup(data) + + case TypeChatTypeSecret: + return UnmarshalChatTypeSecret(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalKeyboardButtonType(data json.RawMessage) (KeyboardButtonType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeKeyboardButtonTypeText: + return UnmarshalKeyboardButtonTypeText(data) + + case TypeKeyboardButtonTypeRequestPhoneNumber: + return UnmarshalKeyboardButtonTypeRequestPhoneNumber(data) + + case TypeKeyboardButtonTypeRequestLocation: + return UnmarshalKeyboardButtonTypeRequestLocation(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalInlineKeyboardButtonType(data json.RawMessage) (InlineKeyboardButtonType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeInlineKeyboardButtonTypeUrl: + return UnmarshalInlineKeyboardButtonTypeUrl(data) + + case TypeInlineKeyboardButtonTypeCallback: + return UnmarshalInlineKeyboardButtonTypeCallback(data) + + case TypeInlineKeyboardButtonTypeCallbackGame: + return UnmarshalInlineKeyboardButtonTypeCallbackGame(data) + + case TypeInlineKeyboardButtonTypeSwitchInline: + return UnmarshalInlineKeyboardButtonTypeSwitchInline(data) + + case TypeInlineKeyboardButtonTypeBuy: + return UnmarshalInlineKeyboardButtonTypeBuy(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalReplyMarkup(data json.RawMessage) (ReplyMarkup, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeReplyMarkupRemoveKeyboard: + return UnmarshalReplyMarkupRemoveKeyboard(data) + + case TypeReplyMarkupForceReply: + return UnmarshalReplyMarkupForceReply(data) + + case TypeReplyMarkupShowKeyboard: + return UnmarshalReplyMarkupShowKeyboard(data) + + case TypeReplyMarkupInlineKeyboard: + return UnmarshalReplyMarkupInlineKeyboard(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalRichText(data json.RawMessage) (RichText, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeRichTextPlain: + return UnmarshalRichTextPlain(data) + + case TypeRichTextBold: + return UnmarshalRichTextBold(data) + + case TypeRichTextItalic: + return UnmarshalRichTextItalic(data) + + case TypeRichTextUnderline: + return UnmarshalRichTextUnderline(data) + + case TypeRichTextStrikethrough: + return UnmarshalRichTextStrikethrough(data) + + case TypeRichTextFixed: + return UnmarshalRichTextFixed(data) + + case TypeRichTextUrl: + return UnmarshalRichTextUrl(data) + + case TypeRichTextEmailAddress: + return UnmarshalRichTextEmailAddress(data) + + case TypeRichTexts: + return UnmarshalRichTexts(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalPageBlock(data json.RawMessage) (PageBlock, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypePageBlockTitle: + return UnmarshalPageBlockTitle(data) + + case TypePageBlockSubtitle: + return UnmarshalPageBlockSubtitle(data) + + case TypePageBlockAuthorDate: + return UnmarshalPageBlockAuthorDate(data) + + case TypePageBlockHeader: + return UnmarshalPageBlockHeader(data) + + case TypePageBlockSubheader: + return UnmarshalPageBlockSubheader(data) + + case TypePageBlockParagraph: + return UnmarshalPageBlockParagraph(data) + + case TypePageBlockPreformatted: + return UnmarshalPageBlockPreformatted(data) + + case TypePageBlockFooter: + return UnmarshalPageBlockFooter(data) + + case TypePageBlockDivider: + return UnmarshalPageBlockDivider(data) + + case TypePageBlockAnchor: + return UnmarshalPageBlockAnchor(data) + + case TypePageBlockList: + return UnmarshalPageBlockList(data) + + case TypePageBlockBlockQuote: + return UnmarshalPageBlockBlockQuote(data) + + case TypePageBlockPullQuote: + return UnmarshalPageBlockPullQuote(data) + + case TypePageBlockAnimation: + return UnmarshalPageBlockAnimation(data) + + case TypePageBlockAudio: + return UnmarshalPageBlockAudio(data) + + case TypePageBlockPhoto: + return UnmarshalPageBlockPhoto(data) + + case TypePageBlockVideo: + return UnmarshalPageBlockVideo(data) + + case TypePageBlockCover: + return UnmarshalPageBlockCover(data) + + case TypePageBlockEmbedded: + return UnmarshalPageBlockEmbedded(data) + + case TypePageBlockEmbeddedPost: + return UnmarshalPageBlockEmbeddedPost(data) + + case TypePageBlockCollage: + return UnmarshalPageBlockCollage(data) + + case TypePageBlockSlideshow: + return UnmarshalPageBlockSlideshow(data) + + case TypePageBlockChatLink: + return UnmarshalPageBlockChatLink(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalInputCredentials(data json.RawMessage) (InputCredentials, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeInputCredentialsSaved: + return UnmarshalInputCredentialsSaved(data) + + case TypeInputCredentialsNew: + return UnmarshalInputCredentialsNew(data) + + case TypeInputCredentialsAndroidPay: + return UnmarshalInputCredentialsAndroidPay(data) + + case TypeInputCredentialsApplePay: + return UnmarshalInputCredentialsApplePay(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalMessageContent(data json.RawMessage) (MessageContent, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeMessageText: + return UnmarshalMessageText(data) + + case TypeMessageAnimation: + return UnmarshalMessageAnimation(data) + + case TypeMessageAudio: + return UnmarshalMessageAudio(data) + + case TypeMessageDocument: + return UnmarshalMessageDocument(data) + + case TypeMessagePhoto: + return UnmarshalMessagePhoto(data) + + case TypeMessageExpiredPhoto: + return UnmarshalMessageExpiredPhoto(data) + + case TypeMessageSticker: + return UnmarshalMessageSticker(data) + + case TypeMessageVideo: + return UnmarshalMessageVideo(data) + + case TypeMessageExpiredVideo: + return UnmarshalMessageExpiredVideo(data) + + case TypeMessageVideoNote: + return UnmarshalMessageVideoNote(data) + + case TypeMessageVoiceNote: + return UnmarshalMessageVoiceNote(data) + + case TypeMessageLocation: + return UnmarshalMessageLocation(data) + + case TypeMessageVenue: + return UnmarshalMessageVenue(data) + + case TypeMessageContact: + return UnmarshalMessageContact(data) + + case TypeMessageGame: + return UnmarshalMessageGame(data) + + case TypeMessageInvoice: + return UnmarshalMessageInvoice(data) + + case TypeMessageCall: + return UnmarshalMessageCall(data) + + case TypeMessageBasicGroupChatCreate: + return UnmarshalMessageBasicGroupChatCreate(data) + + case TypeMessageSupergroupChatCreate: + return UnmarshalMessageSupergroupChatCreate(data) + + case TypeMessageChatChangeTitle: + return UnmarshalMessageChatChangeTitle(data) + + case TypeMessageChatChangePhoto: + return UnmarshalMessageChatChangePhoto(data) + + case TypeMessageChatDeletePhoto: + return UnmarshalMessageChatDeletePhoto(data) + + case TypeMessageChatAddMembers: + return UnmarshalMessageChatAddMembers(data) + + case TypeMessageChatJoinByLink: + return UnmarshalMessageChatJoinByLink(data) + + case TypeMessageChatDeleteMember: + return UnmarshalMessageChatDeleteMember(data) + + case TypeMessageChatUpgradeTo: + return UnmarshalMessageChatUpgradeTo(data) + + case TypeMessageChatUpgradeFrom: + return UnmarshalMessageChatUpgradeFrom(data) + + case TypeMessagePinMessage: + return UnmarshalMessagePinMessage(data) + + case TypeMessageScreenshotTaken: + return UnmarshalMessageScreenshotTaken(data) + + case TypeMessageChatSetTtl: + return UnmarshalMessageChatSetTtl(data) + + case TypeMessageCustomServiceAction: + return UnmarshalMessageCustomServiceAction(data) + + case TypeMessageGameScore: + return UnmarshalMessageGameScore(data) + + case TypeMessagePaymentSuccessful: + return UnmarshalMessagePaymentSuccessful(data) + + case TypeMessagePaymentSuccessfulBot: + return UnmarshalMessagePaymentSuccessfulBot(data) + + case TypeMessageContactRegistered: + return UnmarshalMessageContactRegistered(data) + + case TypeMessageWebsiteConnected: + return UnmarshalMessageWebsiteConnected(data) + + case TypeMessageUnsupported: + return UnmarshalMessageUnsupported(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalTextEntityType(data json.RawMessage) (TextEntityType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeTextEntityTypeMention: + return UnmarshalTextEntityTypeMention(data) + + case TypeTextEntityTypeHashtag: + return UnmarshalTextEntityTypeHashtag(data) + + case TypeTextEntityTypeCashtag: + return UnmarshalTextEntityTypeCashtag(data) + + case TypeTextEntityTypeBotCommand: + return UnmarshalTextEntityTypeBotCommand(data) + + case TypeTextEntityTypeUrl: + return UnmarshalTextEntityTypeUrl(data) + + case TypeTextEntityTypeEmailAddress: + return UnmarshalTextEntityTypeEmailAddress(data) + + case TypeTextEntityTypeBold: + return UnmarshalTextEntityTypeBold(data) + + case TypeTextEntityTypeItalic: + return UnmarshalTextEntityTypeItalic(data) + + case TypeTextEntityTypeCode: + return UnmarshalTextEntityTypeCode(data) + + case TypeTextEntityTypePre: + return UnmarshalTextEntityTypePre(data) + + case TypeTextEntityTypePreCode: + return UnmarshalTextEntityTypePreCode(data) + + case TypeTextEntityTypeTextUrl: + return UnmarshalTextEntityTypeTextUrl(data) + + case TypeTextEntityTypeMentionName: + return UnmarshalTextEntityTypeMentionName(data) + + case TypeTextEntityTypePhoneNumber: + return UnmarshalTextEntityTypePhoneNumber(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalInputMessageContent(data json.RawMessage) (InputMessageContent, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeInputMessageText: + return UnmarshalInputMessageText(data) + + case TypeInputMessageAnimation: + return UnmarshalInputMessageAnimation(data) + + case TypeInputMessageAudio: + return UnmarshalInputMessageAudio(data) + + case TypeInputMessageDocument: + return UnmarshalInputMessageDocument(data) + + case TypeInputMessagePhoto: + return UnmarshalInputMessagePhoto(data) + + case TypeInputMessageSticker: + return UnmarshalInputMessageSticker(data) + + case TypeInputMessageVideo: + return UnmarshalInputMessageVideo(data) + + case TypeInputMessageVideoNote: + return UnmarshalInputMessageVideoNote(data) + + case TypeInputMessageVoiceNote: + return UnmarshalInputMessageVoiceNote(data) + + case TypeInputMessageLocation: + return UnmarshalInputMessageLocation(data) + + case TypeInputMessageVenue: + return UnmarshalInputMessageVenue(data) + + case TypeInputMessageContact: + return UnmarshalInputMessageContact(data) + + case TypeInputMessageGame: + return UnmarshalInputMessageGame(data) + + case TypeInputMessageInvoice: + return UnmarshalInputMessageInvoice(data) + + case TypeInputMessageForwarded: + return UnmarshalInputMessageForwarded(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalSearchMessagesFilter(data json.RawMessage) (SearchMessagesFilter, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeSearchMessagesFilterEmpty: + return UnmarshalSearchMessagesFilterEmpty(data) + + case TypeSearchMessagesFilterAnimation: + return UnmarshalSearchMessagesFilterAnimation(data) + + case TypeSearchMessagesFilterAudio: + return UnmarshalSearchMessagesFilterAudio(data) + + case TypeSearchMessagesFilterDocument: + return UnmarshalSearchMessagesFilterDocument(data) + + case TypeSearchMessagesFilterPhoto: + return UnmarshalSearchMessagesFilterPhoto(data) + + case TypeSearchMessagesFilterVideo: + return UnmarshalSearchMessagesFilterVideo(data) + + case TypeSearchMessagesFilterVoiceNote: + return UnmarshalSearchMessagesFilterVoiceNote(data) + + case TypeSearchMessagesFilterPhotoAndVideo: + return UnmarshalSearchMessagesFilterPhotoAndVideo(data) + + case TypeSearchMessagesFilterUrl: + return UnmarshalSearchMessagesFilterUrl(data) + + case TypeSearchMessagesFilterChatPhoto: + return UnmarshalSearchMessagesFilterChatPhoto(data) + + case TypeSearchMessagesFilterCall: + return UnmarshalSearchMessagesFilterCall(data) + + case TypeSearchMessagesFilterMissedCall: + return UnmarshalSearchMessagesFilterMissedCall(data) + + case TypeSearchMessagesFilterVideoNote: + return UnmarshalSearchMessagesFilterVideoNote(data) + + case TypeSearchMessagesFilterVoiceAndVideoNote: + return UnmarshalSearchMessagesFilterVoiceAndVideoNote(data) + + case TypeSearchMessagesFilterMention: + return UnmarshalSearchMessagesFilterMention(data) + + case TypeSearchMessagesFilterUnreadMention: + return UnmarshalSearchMessagesFilterUnreadMention(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalChatAction(data json.RawMessage) (ChatAction, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeChatActionTyping: + return UnmarshalChatActionTyping(data) + + case TypeChatActionRecordingVideo: + return UnmarshalChatActionRecordingVideo(data) + + case TypeChatActionUploadingVideo: + return UnmarshalChatActionUploadingVideo(data) + + case TypeChatActionRecordingVoiceNote: + return UnmarshalChatActionRecordingVoiceNote(data) + + case TypeChatActionUploadingVoiceNote: + return UnmarshalChatActionUploadingVoiceNote(data) + + case TypeChatActionUploadingPhoto: + return UnmarshalChatActionUploadingPhoto(data) + + case TypeChatActionUploadingDocument: + return UnmarshalChatActionUploadingDocument(data) + + case TypeChatActionChoosingLocation: + return UnmarshalChatActionChoosingLocation(data) + + case TypeChatActionChoosingContact: + return UnmarshalChatActionChoosingContact(data) + + case TypeChatActionStartPlayingGame: + return UnmarshalChatActionStartPlayingGame(data) + + case TypeChatActionRecordingVideoNote: + return UnmarshalChatActionRecordingVideoNote(data) + + case TypeChatActionUploadingVideoNote: + return UnmarshalChatActionUploadingVideoNote(data) + + case TypeChatActionCancel: + return UnmarshalChatActionCancel(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalUserStatus(data json.RawMessage) (UserStatus, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeUserStatusEmpty: + return UnmarshalUserStatusEmpty(data) + + case TypeUserStatusOnline: + return UnmarshalUserStatusOnline(data) + + case TypeUserStatusOffline: + return UnmarshalUserStatusOffline(data) + + case TypeUserStatusRecently: + return UnmarshalUserStatusRecently(data) + + case TypeUserStatusLastWeek: + return UnmarshalUserStatusLastWeek(data) + + case TypeUserStatusLastMonth: + return UnmarshalUserStatusLastMonth(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalCallDiscardReason(data json.RawMessage) (CallDiscardReason, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeCallDiscardReasonEmpty: + return UnmarshalCallDiscardReasonEmpty(data) + + case TypeCallDiscardReasonMissed: + return UnmarshalCallDiscardReasonMissed(data) + + case TypeCallDiscardReasonDeclined: + return UnmarshalCallDiscardReasonDeclined(data) + + case TypeCallDiscardReasonDisconnected: + return UnmarshalCallDiscardReasonDisconnected(data) + + case TypeCallDiscardReasonHungUp: + return UnmarshalCallDiscardReasonHungUp(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalCallState(data json.RawMessage) (CallState, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeCallStatePending: + return UnmarshalCallStatePending(data) + + case TypeCallStateExchangingKeys: + return UnmarshalCallStateExchangingKeys(data) + + case TypeCallStateReady: + return UnmarshalCallStateReady(data) + + case TypeCallStateHangingUp: + return UnmarshalCallStateHangingUp(data) + + case TypeCallStateDiscarded: + return UnmarshalCallStateDiscarded(data) + + case TypeCallStateError: + return UnmarshalCallStateError(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalInputInlineQueryResult(data json.RawMessage) (InputInlineQueryResult, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeInputInlineQueryResultAnimatedGif: + return UnmarshalInputInlineQueryResultAnimatedGif(data) + + case TypeInputInlineQueryResultAnimatedMpeg4: + return UnmarshalInputInlineQueryResultAnimatedMpeg4(data) + + case TypeInputInlineQueryResultArticle: + return UnmarshalInputInlineQueryResultArticle(data) + + case TypeInputInlineQueryResultAudio: + return UnmarshalInputInlineQueryResultAudio(data) + + case TypeInputInlineQueryResultContact: + return UnmarshalInputInlineQueryResultContact(data) + + case TypeInputInlineQueryResultDocument: + return UnmarshalInputInlineQueryResultDocument(data) + + case TypeInputInlineQueryResultGame: + return UnmarshalInputInlineQueryResultGame(data) + + case TypeInputInlineQueryResultLocation: + return UnmarshalInputInlineQueryResultLocation(data) + + case TypeInputInlineQueryResultPhoto: + return UnmarshalInputInlineQueryResultPhoto(data) + + case TypeInputInlineQueryResultSticker: + return UnmarshalInputInlineQueryResultSticker(data) + + case TypeInputInlineQueryResultVenue: + return UnmarshalInputInlineQueryResultVenue(data) + + case TypeInputInlineQueryResultVideo: + return UnmarshalInputInlineQueryResultVideo(data) + + case TypeInputInlineQueryResultVoiceNote: + return UnmarshalInputInlineQueryResultVoiceNote(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalInlineQueryResult(data json.RawMessage) (InlineQueryResult, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeInlineQueryResultArticle: + return UnmarshalInlineQueryResultArticle(data) + + case TypeInlineQueryResultContact: + return UnmarshalInlineQueryResultContact(data) + + case TypeInlineQueryResultLocation: + return UnmarshalInlineQueryResultLocation(data) + + case TypeInlineQueryResultVenue: + return UnmarshalInlineQueryResultVenue(data) + + case TypeInlineQueryResultGame: + return UnmarshalInlineQueryResultGame(data) + + case TypeInlineQueryResultAnimation: + return UnmarshalInlineQueryResultAnimation(data) + + case TypeInlineQueryResultAudio: + return UnmarshalInlineQueryResultAudio(data) + + case TypeInlineQueryResultDocument: + return UnmarshalInlineQueryResultDocument(data) + + case TypeInlineQueryResultPhoto: + return UnmarshalInlineQueryResultPhoto(data) + + case TypeInlineQueryResultSticker: + return UnmarshalInlineQueryResultSticker(data) + + case TypeInlineQueryResultVideo: + return UnmarshalInlineQueryResultVideo(data) + + case TypeInlineQueryResultVoiceNote: + return UnmarshalInlineQueryResultVoiceNote(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalCallbackQueryPayload(data json.RawMessage) (CallbackQueryPayload, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeCallbackQueryPayloadData: + return UnmarshalCallbackQueryPayloadData(data) + + case TypeCallbackQueryPayloadGame: + return UnmarshalCallbackQueryPayloadGame(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalChatEventAction(data json.RawMessage) (ChatEventAction, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeChatEventMessageEdited: + return UnmarshalChatEventMessageEdited(data) + + case TypeChatEventMessageDeleted: + return UnmarshalChatEventMessageDeleted(data) + + case TypeChatEventMessagePinned: + return UnmarshalChatEventMessagePinned(data) + + case TypeChatEventMessageUnpinned: + return UnmarshalChatEventMessageUnpinned(data) + + case TypeChatEventMemberJoined: + return UnmarshalChatEventMemberJoined(data) + + case TypeChatEventMemberLeft: + return UnmarshalChatEventMemberLeft(data) + + case TypeChatEventMemberInvited: + return UnmarshalChatEventMemberInvited(data) + + case TypeChatEventMemberPromoted: + return UnmarshalChatEventMemberPromoted(data) + + case TypeChatEventMemberRestricted: + return UnmarshalChatEventMemberRestricted(data) + + case TypeChatEventTitleChanged: + return UnmarshalChatEventTitleChanged(data) + + case TypeChatEventDescriptionChanged: + return UnmarshalChatEventDescriptionChanged(data) + + case TypeChatEventUsernameChanged: + return UnmarshalChatEventUsernameChanged(data) + + case TypeChatEventPhotoChanged: + return UnmarshalChatEventPhotoChanged(data) + + case TypeChatEventInvitesToggled: + return UnmarshalChatEventInvitesToggled(data) + + case TypeChatEventSignMessagesToggled: + return UnmarshalChatEventSignMessagesToggled(data) + + case TypeChatEventStickerSetChanged: + return UnmarshalChatEventStickerSetChanged(data) + + case TypeChatEventIsAllHistoryAvailableToggled: + return UnmarshalChatEventIsAllHistoryAvailableToggled(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalDeviceToken(data json.RawMessage) (DeviceToken, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeDeviceTokenGoogleCloudMessaging: + return UnmarshalDeviceTokenGoogleCloudMessaging(data) + + case TypeDeviceTokenApplePush: + return UnmarshalDeviceTokenApplePush(data) + + case TypeDeviceTokenApplePushVoIP: + return UnmarshalDeviceTokenApplePushVoIP(data) + + case TypeDeviceTokenWindowsPush: + return UnmarshalDeviceTokenWindowsPush(data) + + case TypeDeviceTokenMicrosoftPush: + return UnmarshalDeviceTokenMicrosoftPush(data) + + case TypeDeviceTokenMicrosoftPushVoIP: + return UnmarshalDeviceTokenMicrosoftPushVoIP(data) + + case TypeDeviceTokenWebPush: + return UnmarshalDeviceTokenWebPush(data) + + case TypeDeviceTokenSimplePush: + return UnmarshalDeviceTokenSimplePush(data) + + case TypeDeviceTokenUbuntuPush: + return UnmarshalDeviceTokenUbuntuPush(data) + + case TypeDeviceTokenBlackBerryPush: + return UnmarshalDeviceTokenBlackBerryPush(data) + + case TypeDeviceTokenTizenPush: + return UnmarshalDeviceTokenTizenPush(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalCheckChatUsernameResult(data json.RawMessage) (CheckChatUsernameResult, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeCheckChatUsernameResultOk: + return UnmarshalCheckChatUsernameResultOk(data) + + case TypeCheckChatUsernameResultUsernameInvalid: + return UnmarshalCheckChatUsernameResultUsernameInvalid(data) + + case TypeCheckChatUsernameResultUsernameOccupied: + return UnmarshalCheckChatUsernameResultUsernameOccupied(data) + + case TypeCheckChatUsernameResultPublicChatsTooMuch: + return UnmarshalCheckChatUsernameResultPublicChatsTooMuch(data) + + case TypeCheckChatUsernameResultPublicGroupsUnavailable: + return UnmarshalCheckChatUsernameResultPublicGroupsUnavailable(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalOptionValue(data json.RawMessage) (OptionValue, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeOptionValueBoolean: + return UnmarshalOptionValueBoolean(data) + + case TypeOptionValueEmpty: + return UnmarshalOptionValueEmpty(data) + + case TypeOptionValueInteger: + return UnmarshalOptionValueInteger(data) + + case TypeOptionValueString: + return UnmarshalOptionValueString(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalUserPrivacySettingRule(data json.RawMessage) (UserPrivacySettingRule, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeUserPrivacySettingRuleAllowAll: + return UnmarshalUserPrivacySettingRuleAllowAll(data) + + case TypeUserPrivacySettingRuleAllowContacts: + return UnmarshalUserPrivacySettingRuleAllowContacts(data) + + case TypeUserPrivacySettingRuleAllowUsers: + return UnmarshalUserPrivacySettingRuleAllowUsers(data) + + case TypeUserPrivacySettingRuleRestrictAll: + return UnmarshalUserPrivacySettingRuleRestrictAll(data) + + case TypeUserPrivacySettingRuleRestrictContacts: + return UnmarshalUserPrivacySettingRuleRestrictContacts(data) + + case TypeUserPrivacySettingRuleRestrictUsers: + return UnmarshalUserPrivacySettingRuleRestrictUsers(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalUserPrivacySetting(data json.RawMessage) (UserPrivacySetting, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeUserPrivacySettingShowStatus: + return UnmarshalUserPrivacySettingShowStatus(data) + + case TypeUserPrivacySettingAllowChatInvites: + return UnmarshalUserPrivacySettingAllowChatInvites(data) + + case TypeUserPrivacySettingAllowCalls: + return UnmarshalUserPrivacySettingAllowCalls(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalChatReportReason(data json.RawMessage) (ChatReportReason, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeChatReportReasonSpam: + return UnmarshalChatReportReasonSpam(data) + + case TypeChatReportReasonViolence: + return UnmarshalChatReportReasonViolence(data) + + case TypeChatReportReasonPornography: + return UnmarshalChatReportReasonPornography(data) + + case TypeChatReportReasonCustom: + return UnmarshalChatReportReasonCustom(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalFileType(data json.RawMessage) (FileType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeFileTypeNone: + return UnmarshalFileTypeNone(data) + + case TypeFileTypeAnimation: + return UnmarshalFileTypeAnimation(data) + + case TypeFileTypeAudio: + return UnmarshalFileTypeAudio(data) + + case TypeFileTypeDocument: + return UnmarshalFileTypeDocument(data) + + case TypeFileTypePhoto: + return UnmarshalFileTypePhoto(data) + + case TypeFileTypeProfilePhoto: + return UnmarshalFileTypeProfilePhoto(data) + + case TypeFileTypeSecret: + return UnmarshalFileTypeSecret(data) + + case TypeFileTypeSticker: + return UnmarshalFileTypeSticker(data) + + case TypeFileTypeThumbnail: + return UnmarshalFileTypeThumbnail(data) + + case TypeFileTypeUnknown: + return UnmarshalFileTypeUnknown(data) + + case TypeFileTypeVideo: + return UnmarshalFileTypeVideo(data) + + case TypeFileTypeVideoNote: + return UnmarshalFileTypeVideoNote(data) + + case TypeFileTypeVoiceNote: + return UnmarshalFileTypeVoiceNote(data) + + case TypeFileTypeWallpaper: + return UnmarshalFileTypeWallpaper(data) + + case TypeFileTypeSecretThumbnail: + return UnmarshalFileTypeSecretThumbnail(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalNetworkType(data json.RawMessage) (NetworkType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeNetworkTypeNone: + return UnmarshalNetworkTypeNone(data) + + case TypeNetworkTypeMobile: + return UnmarshalNetworkTypeMobile(data) + + case TypeNetworkTypeMobileRoaming: + return UnmarshalNetworkTypeMobileRoaming(data) + + case TypeNetworkTypeWiFi: + return UnmarshalNetworkTypeWiFi(data) + + case TypeNetworkTypeOther: + return UnmarshalNetworkTypeOther(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalNetworkStatisticsEntry(data json.RawMessage) (NetworkStatisticsEntry, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeNetworkStatisticsEntryFile: + return UnmarshalNetworkStatisticsEntryFile(data) + + case TypeNetworkStatisticsEntryCall: + return UnmarshalNetworkStatisticsEntryCall(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalConnectionState(data json.RawMessage) (ConnectionState, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeConnectionStateWaitingForNetwork: + return UnmarshalConnectionStateWaitingForNetwork(data) + + case TypeConnectionStateConnectingToProxy: + return UnmarshalConnectionStateConnectingToProxy(data) + + case TypeConnectionStateConnecting: + return UnmarshalConnectionStateConnecting(data) + + case TypeConnectionStateUpdating: + return UnmarshalConnectionStateUpdating(data) + + case TypeConnectionStateReady: + return UnmarshalConnectionStateReady(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalTopChatCategory(data json.RawMessage) (TopChatCategory, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeTopChatCategoryUsers: + return UnmarshalTopChatCategoryUsers(data) + + case TypeTopChatCategoryBots: + return UnmarshalTopChatCategoryBots(data) + + case TypeTopChatCategoryGroups: + return UnmarshalTopChatCategoryGroups(data) + + case TypeTopChatCategoryChannels: + return UnmarshalTopChatCategoryChannels(data) + + case TypeTopChatCategoryInlineBots: + return UnmarshalTopChatCategoryInlineBots(data) + + case TypeTopChatCategoryCalls: + return UnmarshalTopChatCategoryCalls(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalTMeUrlType(data json.RawMessage) (TMeUrlType, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeTMeUrlTypeUser: + return UnmarshalTMeUrlTypeUser(data) + + case TypeTMeUrlTypeSupergroup: + return UnmarshalTMeUrlTypeSupergroup(data) + + case TypeTMeUrlTypeChatInvite: + return UnmarshalTMeUrlTypeChatInvite(data) + + case TypeTMeUrlTypeStickerSet: + return UnmarshalTMeUrlTypeStickerSet(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalTextParseMode(data json.RawMessage) (TextParseMode, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeTextParseModeMarkdown: + return UnmarshalTextParseModeMarkdown(data) + + case TypeTextParseModeHTML: + return UnmarshalTextParseModeHTML(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalProxy(data json.RawMessage) (Proxy, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeProxyEmpty: + return UnmarshalProxyEmpty(data) + + case TypeProxySocks5: + return UnmarshalProxySocks5(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalUpdate(data json.RawMessage) (Update, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeUpdateAuthorizationState: + return UnmarshalUpdateAuthorizationState(data) + + case TypeUpdateNewMessage: + return UnmarshalUpdateNewMessage(data) + + case TypeUpdateMessageSendAcknowledged: + return UnmarshalUpdateMessageSendAcknowledged(data) + + case TypeUpdateMessageSendSucceeded: + return UnmarshalUpdateMessageSendSucceeded(data) + + case TypeUpdateMessageSendFailed: + return UnmarshalUpdateMessageSendFailed(data) + + case TypeUpdateMessageContent: + return UnmarshalUpdateMessageContent(data) + + case TypeUpdateMessageEdited: + return UnmarshalUpdateMessageEdited(data) + + case TypeUpdateMessageViews: + return UnmarshalUpdateMessageViews(data) + + case TypeUpdateMessageContentOpened: + return UnmarshalUpdateMessageContentOpened(data) + + case TypeUpdateMessageMentionRead: + return UnmarshalUpdateMessageMentionRead(data) + + case TypeUpdateNewChat: + return UnmarshalUpdateNewChat(data) + + case TypeUpdateChatTitle: + return UnmarshalUpdateChatTitle(data) + + case TypeUpdateChatPhoto: + return UnmarshalUpdateChatPhoto(data) + + case TypeUpdateChatLastMessage: + return UnmarshalUpdateChatLastMessage(data) + + case TypeUpdateChatOrder: + return UnmarshalUpdateChatOrder(data) + + case TypeUpdateChatIsPinned: + return UnmarshalUpdateChatIsPinned(data) + + case TypeUpdateChatReadInbox: + return UnmarshalUpdateChatReadInbox(data) + + case TypeUpdateChatReadOutbox: + return UnmarshalUpdateChatReadOutbox(data) + + case TypeUpdateChatUnreadMentionCount: + return UnmarshalUpdateChatUnreadMentionCount(data) + + case TypeUpdateNotificationSettings: + return UnmarshalUpdateNotificationSettings(data) + + case TypeUpdateChatReplyMarkup: + return UnmarshalUpdateChatReplyMarkup(data) + + case TypeUpdateChatDraftMessage: + return UnmarshalUpdateChatDraftMessage(data) + + case TypeUpdateDeleteMessages: + return UnmarshalUpdateDeleteMessages(data) + + case TypeUpdateUserChatAction: + return UnmarshalUpdateUserChatAction(data) + + case TypeUpdateUserStatus: + return UnmarshalUpdateUserStatus(data) + + case TypeUpdateUser: + return UnmarshalUpdateUser(data) + + case TypeUpdateBasicGroup: + return UnmarshalUpdateBasicGroup(data) + + case TypeUpdateSupergroup: + return UnmarshalUpdateSupergroup(data) + + case TypeUpdateSecretChat: + return UnmarshalUpdateSecretChat(data) + + case TypeUpdateUserFullInfo: + return UnmarshalUpdateUserFullInfo(data) + + case TypeUpdateBasicGroupFullInfo: + return UnmarshalUpdateBasicGroupFullInfo(data) + + case TypeUpdateSupergroupFullInfo: + return UnmarshalUpdateSupergroupFullInfo(data) + + case TypeUpdateServiceNotification: + return UnmarshalUpdateServiceNotification(data) + + case TypeUpdateFile: + return UnmarshalUpdateFile(data) + + case TypeUpdateFileGenerationStart: + return UnmarshalUpdateFileGenerationStart(data) + + case TypeUpdateFileGenerationStop: + return UnmarshalUpdateFileGenerationStop(data) + + case TypeUpdateCall: + return UnmarshalUpdateCall(data) + + case TypeUpdateUserPrivacySettingRules: + return UnmarshalUpdateUserPrivacySettingRules(data) + + case TypeUpdateUnreadMessageCount: + return UnmarshalUpdateUnreadMessageCount(data) + + case TypeUpdateOption: + return UnmarshalUpdateOption(data) + + case TypeUpdateInstalledStickerSets: + return UnmarshalUpdateInstalledStickerSets(data) + + case TypeUpdateTrendingStickerSets: + return UnmarshalUpdateTrendingStickerSets(data) + + case TypeUpdateRecentStickers: + return UnmarshalUpdateRecentStickers(data) + + case TypeUpdateFavoriteStickers: + return UnmarshalUpdateFavoriteStickers(data) + + case TypeUpdateSavedAnimations: + return UnmarshalUpdateSavedAnimations(data) + + case TypeUpdateConnectionState: + return UnmarshalUpdateConnectionState(data) + + case TypeUpdateNewInlineQuery: + return UnmarshalUpdateNewInlineQuery(data) + + case TypeUpdateNewChosenInlineResult: + return UnmarshalUpdateNewChosenInlineResult(data) + + case TypeUpdateNewCallbackQuery: + return UnmarshalUpdateNewCallbackQuery(data) + + case TypeUpdateNewInlineCallbackQuery: + return UnmarshalUpdateNewInlineCallbackQuery(data) + + case TypeUpdateNewShippingQuery: + return UnmarshalUpdateNewShippingQuery(data) + + case TypeUpdateNewPreCheckoutQuery: + return UnmarshalUpdateNewPreCheckoutQuery(data) + + case TypeUpdateNewCustomEvent: + return UnmarshalUpdateNewCustomEvent(data) + + case TypeUpdateNewCustomQuery: + return UnmarshalUpdateNewCustomQuery(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +func UnmarshalError(data json.RawMessage) (*Error, error) { + var resp Error + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalOk(data json.RawMessage) (*Ok, error) { + var resp Ok + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTdlibParameters(data json.RawMessage) (*TdlibParameters, error) { + var resp TdlibParameters + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthenticationCodeTypeTelegramMessage(data json.RawMessage) (*AuthenticationCodeTypeTelegramMessage, error) { + var resp AuthenticationCodeTypeTelegramMessage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthenticationCodeTypeSms(data json.RawMessage) (*AuthenticationCodeTypeSms, error) { + var resp AuthenticationCodeTypeSms + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthenticationCodeTypeCall(data json.RawMessage) (*AuthenticationCodeTypeCall, error) { + var resp AuthenticationCodeTypeCall + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthenticationCodeTypeFlashCall(data json.RawMessage) (*AuthenticationCodeTypeFlashCall, error) { + var resp AuthenticationCodeTypeFlashCall + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthenticationCodeInfo(data json.RawMessage) (*AuthenticationCodeInfo, error) { + var resp AuthenticationCodeInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateWaitTdlibParameters(data json.RawMessage) (*AuthorizationStateWaitTdlibParameters, error) { + var resp AuthorizationStateWaitTdlibParameters + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateWaitEncryptionKey(data json.RawMessage) (*AuthorizationStateWaitEncryptionKey, error) { + var resp AuthorizationStateWaitEncryptionKey + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateWaitPhoneNumber(data json.RawMessage) (*AuthorizationStateWaitPhoneNumber, error) { + var resp AuthorizationStateWaitPhoneNumber + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateWaitCode(data json.RawMessage) (*AuthorizationStateWaitCode, error) { + var resp AuthorizationStateWaitCode + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateWaitPassword(data json.RawMessage) (*AuthorizationStateWaitPassword, error) { + var resp AuthorizationStateWaitPassword + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateReady(data json.RawMessage) (*AuthorizationStateReady, error) { + var resp AuthorizationStateReady + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateLoggingOut(data json.RawMessage) (*AuthorizationStateLoggingOut, error) { + var resp AuthorizationStateLoggingOut + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateClosing(data json.RawMessage) (*AuthorizationStateClosing, error) { + var resp AuthorizationStateClosing + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAuthorizationStateClosed(data json.RawMessage) (*AuthorizationStateClosed, error) { + var resp AuthorizationStateClosed + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPasswordState(data json.RawMessage) (*PasswordState, error) { + var resp PasswordState + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPasswordRecoveryInfo(data json.RawMessage) (*PasswordRecoveryInfo, error) { + var resp PasswordRecoveryInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRecoveryEmailAddress(data json.RawMessage) (*RecoveryEmailAddress, error) { + var resp RecoveryEmailAddress + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTemporaryPasswordState(data json.RawMessage) (*TemporaryPasswordState, error) { + var resp TemporaryPasswordState + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalLocalFile(data json.RawMessage) (*LocalFile, error) { + var resp LocalFile + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRemoteFile(data json.RawMessage) (*RemoteFile, error) { + var resp RemoteFile + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFile(data json.RawMessage) (*File, error) { + var resp File + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputFileId(data json.RawMessage) (*InputFileId, error) { + var resp InputFileId + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputFileRemote(data json.RawMessage) (*InputFileRemote, error) { + var resp InputFileRemote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputFileLocal(data json.RawMessage) (*InputFileLocal, error) { + var resp InputFileLocal + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputFileGenerated(data json.RawMessage) (*InputFileGenerated, error) { + var resp InputFileGenerated + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPhotoSize(data json.RawMessage) (*PhotoSize, error) { + var resp PhotoSize + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMaskPointForehead(data json.RawMessage) (*MaskPointForehead, error) { + var resp MaskPointForehead + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMaskPointEyes(data json.RawMessage) (*MaskPointEyes, error) { + var resp MaskPointEyes + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMaskPointMouth(data json.RawMessage) (*MaskPointMouth, error) { + var resp MaskPointMouth + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMaskPointChin(data json.RawMessage) (*MaskPointChin, error) { + var resp MaskPointChin + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMaskPosition(data json.RawMessage) (*MaskPosition, error) { + var resp MaskPosition + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntity(data json.RawMessage) (*TextEntity, error) { + var resp TextEntity + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntities(data json.RawMessage) (*TextEntities, error) { + var resp TextEntities + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFormattedText(data json.RawMessage) (*FormattedText, error) { + var resp FormattedText + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAnimation(data json.RawMessage) (*Animation, error) { + var resp Animation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAudio(data json.RawMessage) (*Audio, error) { + var resp Audio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDocument(data json.RawMessage) (*Document, error) { + var resp Document + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPhoto(data json.RawMessage) (*Photo, error) { + var resp Photo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSticker(data json.RawMessage) (*Sticker, error) { + var resp Sticker + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalVideo(data json.RawMessage) (*Video, error) { + var resp Video + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalVideoNote(data json.RawMessage) (*VideoNote, error) { + var resp VideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalVoiceNote(data json.RawMessage) (*VoiceNote, error) { + var resp VoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalContact(data json.RawMessage) (*Contact, error) { + var resp Contact + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalLocation(data json.RawMessage) (*Location, error) { + var resp Location + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalVenue(data json.RawMessage) (*Venue, error) { + var resp Venue + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalGame(data json.RawMessage) (*Game, error) { + var resp Game + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalProfilePhoto(data json.RawMessage) (*ProfilePhoto, error) { + var resp ProfilePhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatPhoto(data json.RawMessage) (*ChatPhoto, error) { + var resp ChatPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalLinkStateNone(data json.RawMessage) (*LinkStateNone, error) { + var resp LinkStateNone + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalLinkStateKnowsPhoneNumber(data json.RawMessage) (*LinkStateKnowsPhoneNumber, error) { + var resp LinkStateKnowsPhoneNumber + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalLinkStateIsContact(data json.RawMessage) (*LinkStateIsContact, error) { + var resp LinkStateIsContact + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserTypeRegular(data json.RawMessage) (*UserTypeRegular, error) { + var resp UserTypeRegular + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserTypeDeleted(data json.RawMessage) (*UserTypeDeleted, error) { + var resp UserTypeDeleted + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserTypeBot(data json.RawMessage) (*UserTypeBot, error) { + var resp UserTypeBot + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserTypeUnknown(data json.RawMessage) (*UserTypeUnknown, error) { + var resp UserTypeUnknown + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalBotCommand(data json.RawMessage) (*BotCommand, error) { + var resp BotCommand + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalBotInfo(data json.RawMessage) (*BotInfo, error) { + var resp BotInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUser(data json.RawMessage) (*User, error) { + var resp User + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserFullInfo(data json.RawMessage) (*UserFullInfo, error) { + var resp UserFullInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserProfilePhotos(data json.RawMessage) (*UserProfilePhotos, error) { + var resp UserProfilePhotos + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUsers(data json.RawMessage) (*Users, error) { + var resp Users + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMemberStatusCreator(data json.RawMessage) (*ChatMemberStatusCreator, error) { + var resp ChatMemberStatusCreator + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMemberStatusAdministrator(data json.RawMessage) (*ChatMemberStatusAdministrator, error) { + var resp ChatMemberStatusAdministrator + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMemberStatusMember(data json.RawMessage) (*ChatMemberStatusMember, error) { + var resp ChatMemberStatusMember + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMemberStatusRestricted(data json.RawMessage) (*ChatMemberStatusRestricted, error) { + var resp ChatMemberStatusRestricted + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMemberStatusLeft(data json.RawMessage) (*ChatMemberStatusLeft, error) { + var resp ChatMemberStatusLeft + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMemberStatusBanned(data json.RawMessage) (*ChatMemberStatusBanned, error) { + var resp ChatMemberStatusBanned + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMember(data json.RawMessage) (*ChatMember, error) { + var resp ChatMember + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatMembers(data json.RawMessage) (*ChatMembers, error) { + var resp ChatMembers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroupMembersFilterRecent(data json.RawMessage) (*SupergroupMembersFilterRecent, error) { + var resp SupergroupMembersFilterRecent + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroupMembersFilterAdministrators(data json.RawMessage) (*SupergroupMembersFilterAdministrators, error) { + var resp SupergroupMembersFilterAdministrators + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroupMembersFilterSearch(data json.RawMessage) (*SupergroupMembersFilterSearch, error) { + var resp SupergroupMembersFilterSearch + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroupMembersFilterRestricted(data json.RawMessage) (*SupergroupMembersFilterRestricted, error) { + var resp SupergroupMembersFilterRestricted + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroupMembersFilterBanned(data json.RawMessage) (*SupergroupMembersFilterBanned, error) { + var resp SupergroupMembersFilterBanned + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroupMembersFilterBots(data json.RawMessage) (*SupergroupMembersFilterBots, error) { + var resp SupergroupMembersFilterBots + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalBasicGroup(data json.RawMessage) (*BasicGroup, error) { + var resp BasicGroup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalBasicGroupFullInfo(data json.RawMessage) (*BasicGroupFullInfo, error) { + var resp BasicGroupFullInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroup(data json.RawMessage) (*Supergroup, error) { + var resp Supergroup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSupergroupFullInfo(data json.RawMessage) (*SupergroupFullInfo, error) { + var resp SupergroupFullInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSecretChatStatePending(data json.RawMessage) (*SecretChatStatePending, error) { + var resp SecretChatStatePending + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSecretChatStateReady(data json.RawMessage) (*SecretChatStateReady, error) { + var resp SecretChatStateReady + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSecretChatStateClosed(data json.RawMessage) (*SecretChatStateClosed, error) { + var resp SecretChatStateClosed + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSecretChat(data json.RawMessage) (*SecretChat, error) { + var resp SecretChat + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageForwardedFromUser(data json.RawMessage) (*MessageForwardedFromUser, error) { + var resp MessageForwardedFromUser + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageForwardedPost(data json.RawMessage) (*MessageForwardedPost, error) { + var resp MessageForwardedPost + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageSendingStatePending(data json.RawMessage) (*MessageSendingStatePending, error) { + var resp MessageSendingStatePending + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageSendingStateFailed(data json.RawMessage) (*MessageSendingStateFailed, error) { + var resp MessageSendingStateFailed + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessage(data json.RawMessage) (*Message, error) { + var resp Message + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessages(data json.RawMessage) (*Messages, error) { + var resp Messages + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFoundMessages(data json.RawMessage) (*FoundMessages, error) { + var resp FoundMessages + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNotificationSettingsScopeChat(data json.RawMessage) (*NotificationSettingsScopeChat, error) { + var resp NotificationSettingsScopeChat + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNotificationSettingsScopePrivateChats(data json.RawMessage) (*NotificationSettingsScopePrivateChats, error) { + var resp NotificationSettingsScopePrivateChats + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNotificationSettingsScopeBasicGroupChats(data json.RawMessage) (*NotificationSettingsScopeBasicGroupChats, error) { + var resp NotificationSettingsScopeBasicGroupChats + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNotificationSettingsScopeAllChats(data json.RawMessage) (*NotificationSettingsScopeAllChats, error) { + var resp NotificationSettingsScopeAllChats + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNotificationSettings(data json.RawMessage) (*NotificationSettings, error) { + var resp NotificationSettings + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDraftMessage(data json.RawMessage) (*DraftMessage, error) { + var resp DraftMessage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatTypePrivate(data json.RawMessage) (*ChatTypePrivate, error) { + var resp ChatTypePrivate + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatTypeBasicGroup(data json.RawMessage) (*ChatTypeBasicGroup, error) { + var resp ChatTypeBasicGroup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatTypeSupergroup(data json.RawMessage) (*ChatTypeSupergroup, error) { + var resp ChatTypeSupergroup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatTypeSecret(data json.RawMessage) (*ChatTypeSecret, error) { + var resp ChatTypeSecret + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChat(data json.RawMessage) (*Chat, error) { + var resp Chat + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChats(data json.RawMessage) (*Chats, error) { + var resp Chats + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatInviteLink(data json.RawMessage) (*ChatInviteLink, error) { + var resp ChatInviteLink + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatInviteLinkInfo(data json.RawMessage) (*ChatInviteLinkInfo, error) { + var resp ChatInviteLinkInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalKeyboardButtonTypeText(data json.RawMessage) (*KeyboardButtonTypeText, error) { + var resp KeyboardButtonTypeText + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalKeyboardButtonTypeRequestPhoneNumber(data json.RawMessage) (*KeyboardButtonTypeRequestPhoneNumber, error) { + var resp KeyboardButtonTypeRequestPhoneNumber + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalKeyboardButtonTypeRequestLocation(data json.RawMessage) (*KeyboardButtonTypeRequestLocation, error) { + var resp KeyboardButtonTypeRequestLocation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalKeyboardButton(data json.RawMessage) (*KeyboardButton, error) { + var resp KeyboardButton + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineKeyboardButtonTypeUrl(data json.RawMessage) (*InlineKeyboardButtonTypeUrl, error) { + var resp InlineKeyboardButtonTypeUrl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineKeyboardButtonTypeCallback(data json.RawMessage) (*InlineKeyboardButtonTypeCallback, error) { + var resp InlineKeyboardButtonTypeCallback + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineKeyboardButtonTypeCallbackGame(data json.RawMessage) (*InlineKeyboardButtonTypeCallbackGame, error) { + var resp InlineKeyboardButtonTypeCallbackGame + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineKeyboardButtonTypeSwitchInline(data json.RawMessage) (*InlineKeyboardButtonTypeSwitchInline, error) { + var resp InlineKeyboardButtonTypeSwitchInline + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineKeyboardButtonTypeBuy(data json.RawMessage) (*InlineKeyboardButtonTypeBuy, error) { + var resp InlineKeyboardButtonTypeBuy + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineKeyboardButton(data json.RawMessage) (*InlineKeyboardButton, error) { + var resp InlineKeyboardButton + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalReplyMarkupRemoveKeyboard(data json.RawMessage) (*ReplyMarkupRemoveKeyboard, error) { + var resp ReplyMarkupRemoveKeyboard + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalReplyMarkupForceReply(data json.RawMessage) (*ReplyMarkupForceReply, error) { + var resp ReplyMarkupForceReply + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalReplyMarkupShowKeyboard(data json.RawMessage) (*ReplyMarkupShowKeyboard, error) { + var resp ReplyMarkupShowKeyboard + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalReplyMarkupInlineKeyboard(data json.RawMessage) (*ReplyMarkupInlineKeyboard, error) { + var resp ReplyMarkupInlineKeyboard + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextPlain(data json.RawMessage) (*RichTextPlain, error) { + var resp RichTextPlain + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextBold(data json.RawMessage) (*RichTextBold, error) { + var resp RichTextBold + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextItalic(data json.RawMessage) (*RichTextItalic, error) { + var resp RichTextItalic + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextUnderline(data json.RawMessage) (*RichTextUnderline, error) { + var resp RichTextUnderline + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextStrikethrough(data json.RawMessage) (*RichTextStrikethrough, error) { + var resp RichTextStrikethrough + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextFixed(data json.RawMessage) (*RichTextFixed, error) { + var resp RichTextFixed + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextUrl(data json.RawMessage) (*RichTextUrl, error) { + var resp RichTextUrl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTextEmailAddress(data json.RawMessage) (*RichTextEmailAddress, error) { + var resp RichTextEmailAddress + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalRichTexts(data json.RawMessage) (*RichTexts, error) { + var resp RichTexts + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockTitle(data json.RawMessage) (*PageBlockTitle, error) { + var resp PageBlockTitle + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockSubtitle(data json.RawMessage) (*PageBlockSubtitle, error) { + var resp PageBlockSubtitle + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockAuthorDate(data json.RawMessage) (*PageBlockAuthorDate, error) { + var resp PageBlockAuthorDate + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockHeader(data json.RawMessage) (*PageBlockHeader, error) { + var resp PageBlockHeader + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockSubheader(data json.RawMessage) (*PageBlockSubheader, error) { + var resp PageBlockSubheader + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockParagraph(data json.RawMessage) (*PageBlockParagraph, error) { + var resp PageBlockParagraph + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockPreformatted(data json.RawMessage) (*PageBlockPreformatted, error) { + var resp PageBlockPreformatted + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockFooter(data json.RawMessage) (*PageBlockFooter, error) { + var resp PageBlockFooter + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockDivider(data json.RawMessage) (*PageBlockDivider, error) { + var resp PageBlockDivider + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockAnchor(data json.RawMessage) (*PageBlockAnchor, error) { + var resp PageBlockAnchor + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockList(data json.RawMessage) (*PageBlockList, error) { + var resp PageBlockList + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockBlockQuote(data json.RawMessage) (*PageBlockBlockQuote, error) { + var resp PageBlockBlockQuote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockPullQuote(data json.RawMessage) (*PageBlockPullQuote, error) { + var resp PageBlockPullQuote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockAnimation(data json.RawMessage) (*PageBlockAnimation, error) { + var resp PageBlockAnimation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockAudio(data json.RawMessage) (*PageBlockAudio, error) { + var resp PageBlockAudio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockPhoto(data json.RawMessage) (*PageBlockPhoto, error) { + var resp PageBlockPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockVideo(data json.RawMessage) (*PageBlockVideo, error) { + var resp PageBlockVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockCover(data json.RawMessage) (*PageBlockCover, error) { + var resp PageBlockCover + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockEmbedded(data json.RawMessage) (*PageBlockEmbedded, error) { + var resp PageBlockEmbedded + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockEmbeddedPost(data json.RawMessage) (*PageBlockEmbeddedPost, error) { + var resp PageBlockEmbeddedPost + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockCollage(data json.RawMessage) (*PageBlockCollage, error) { + var resp PageBlockCollage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockSlideshow(data json.RawMessage) (*PageBlockSlideshow, error) { + var resp PageBlockSlideshow + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPageBlockChatLink(data json.RawMessage) (*PageBlockChatLink, error) { + var resp PageBlockChatLink + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalWebPageInstantView(data json.RawMessage) (*WebPageInstantView, error) { + var resp WebPageInstantView + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalWebPage(data json.RawMessage) (*WebPage, error) { + var resp WebPage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalLabeledPricePart(data json.RawMessage) (*LabeledPricePart, error) { + var resp LabeledPricePart + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInvoice(data json.RawMessage) (*Invoice, error) { + var resp Invoice + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalShippingAddress(data json.RawMessage) (*ShippingAddress, error) { + var resp ShippingAddress + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalOrderInfo(data json.RawMessage) (*OrderInfo, error) { + var resp OrderInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalShippingOption(data json.RawMessage) (*ShippingOption, error) { + var resp ShippingOption + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSavedCredentials(data json.RawMessage) (*SavedCredentials, error) { + var resp SavedCredentials + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputCredentialsSaved(data json.RawMessage) (*InputCredentialsSaved, error) { + var resp InputCredentialsSaved + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputCredentialsNew(data json.RawMessage) (*InputCredentialsNew, error) { + var resp InputCredentialsNew + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputCredentialsAndroidPay(data json.RawMessage) (*InputCredentialsAndroidPay, error) { + var resp InputCredentialsAndroidPay + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputCredentialsApplePay(data json.RawMessage) (*InputCredentialsApplePay, error) { + var resp InputCredentialsApplePay + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPaymentsProviderStripe(data json.RawMessage) (*PaymentsProviderStripe, error) { + var resp PaymentsProviderStripe + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPaymentForm(data json.RawMessage) (*PaymentForm, error) { + var resp PaymentForm + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalValidatedOrderInfo(data json.RawMessage) (*ValidatedOrderInfo, error) { + var resp ValidatedOrderInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPaymentResult(data json.RawMessage) (*PaymentResult, error) { + var resp PaymentResult + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPaymentReceipt(data json.RawMessage) (*PaymentReceipt, error) { + var resp PaymentReceipt + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageText(data json.RawMessage) (*MessageText, error) { + var resp MessageText + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageAnimation(data json.RawMessage) (*MessageAnimation, error) { + var resp MessageAnimation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageAudio(data json.RawMessage) (*MessageAudio, error) { + var resp MessageAudio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageDocument(data json.RawMessage) (*MessageDocument, error) { + var resp MessageDocument + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessagePhoto(data json.RawMessage) (*MessagePhoto, error) { + var resp MessagePhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageExpiredPhoto(data json.RawMessage) (*MessageExpiredPhoto, error) { + var resp MessageExpiredPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageSticker(data json.RawMessage) (*MessageSticker, error) { + var resp MessageSticker + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageVideo(data json.RawMessage) (*MessageVideo, error) { + var resp MessageVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageExpiredVideo(data json.RawMessage) (*MessageExpiredVideo, error) { + var resp MessageExpiredVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageVideoNote(data json.RawMessage) (*MessageVideoNote, error) { + var resp MessageVideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageVoiceNote(data json.RawMessage) (*MessageVoiceNote, error) { + var resp MessageVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageLocation(data json.RawMessage) (*MessageLocation, error) { + var resp MessageLocation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageVenue(data json.RawMessage) (*MessageVenue, error) { + var resp MessageVenue + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageContact(data json.RawMessage) (*MessageContact, error) { + var resp MessageContact + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageGame(data json.RawMessage) (*MessageGame, error) { + var resp MessageGame + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageInvoice(data json.RawMessage) (*MessageInvoice, error) { + var resp MessageInvoice + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageCall(data json.RawMessage) (*MessageCall, error) { + var resp MessageCall + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageBasicGroupChatCreate(data json.RawMessage) (*MessageBasicGroupChatCreate, error) { + var resp MessageBasicGroupChatCreate + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageSupergroupChatCreate(data json.RawMessage) (*MessageSupergroupChatCreate, error) { + var resp MessageSupergroupChatCreate + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatChangeTitle(data json.RawMessage) (*MessageChatChangeTitle, error) { + var resp MessageChatChangeTitle + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatChangePhoto(data json.RawMessage) (*MessageChatChangePhoto, error) { + var resp MessageChatChangePhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatDeletePhoto(data json.RawMessage) (*MessageChatDeletePhoto, error) { + var resp MessageChatDeletePhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatAddMembers(data json.RawMessage) (*MessageChatAddMembers, error) { + var resp MessageChatAddMembers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatJoinByLink(data json.RawMessage) (*MessageChatJoinByLink, error) { + var resp MessageChatJoinByLink + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatDeleteMember(data json.RawMessage) (*MessageChatDeleteMember, error) { + var resp MessageChatDeleteMember + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatUpgradeTo(data json.RawMessage) (*MessageChatUpgradeTo, error) { + var resp MessageChatUpgradeTo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatUpgradeFrom(data json.RawMessage) (*MessageChatUpgradeFrom, error) { + var resp MessageChatUpgradeFrom + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessagePinMessage(data json.RawMessage) (*MessagePinMessage, error) { + var resp MessagePinMessage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageScreenshotTaken(data json.RawMessage) (*MessageScreenshotTaken, error) { + var resp MessageScreenshotTaken + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageChatSetTtl(data json.RawMessage) (*MessageChatSetTtl, error) { + var resp MessageChatSetTtl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageCustomServiceAction(data json.RawMessage) (*MessageCustomServiceAction, error) { + var resp MessageCustomServiceAction + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageGameScore(data json.RawMessage) (*MessageGameScore, error) { + var resp MessageGameScore + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessagePaymentSuccessful(data json.RawMessage) (*MessagePaymentSuccessful, error) { + var resp MessagePaymentSuccessful + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessagePaymentSuccessfulBot(data json.RawMessage) (*MessagePaymentSuccessfulBot, error) { + var resp MessagePaymentSuccessfulBot + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageContactRegistered(data json.RawMessage) (*MessageContactRegistered, error) { + var resp MessageContactRegistered + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageWebsiteConnected(data json.RawMessage) (*MessageWebsiteConnected, error) { + var resp MessageWebsiteConnected + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalMessageUnsupported(data json.RawMessage) (*MessageUnsupported, error) { + var resp MessageUnsupported + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeMention(data json.RawMessage) (*TextEntityTypeMention, error) { + var resp TextEntityTypeMention + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeHashtag(data json.RawMessage) (*TextEntityTypeHashtag, error) { + var resp TextEntityTypeHashtag + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeCashtag(data json.RawMessage) (*TextEntityTypeCashtag, error) { + var resp TextEntityTypeCashtag + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeBotCommand(data json.RawMessage) (*TextEntityTypeBotCommand, error) { + var resp TextEntityTypeBotCommand + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeUrl(data json.RawMessage) (*TextEntityTypeUrl, error) { + var resp TextEntityTypeUrl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeEmailAddress(data json.RawMessage) (*TextEntityTypeEmailAddress, error) { + var resp TextEntityTypeEmailAddress + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeBold(data json.RawMessage) (*TextEntityTypeBold, error) { + var resp TextEntityTypeBold + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeItalic(data json.RawMessage) (*TextEntityTypeItalic, error) { + var resp TextEntityTypeItalic + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeCode(data json.RawMessage) (*TextEntityTypeCode, error) { + var resp TextEntityTypeCode + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypePre(data json.RawMessage) (*TextEntityTypePre, error) { + var resp TextEntityTypePre + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypePreCode(data json.RawMessage) (*TextEntityTypePreCode, error) { + var resp TextEntityTypePreCode + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeTextUrl(data json.RawMessage) (*TextEntityTypeTextUrl, error) { + var resp TextEntityTypeTextUrl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypeMentionName(data json.RawMessage) (*TextEntityTypeMentionName, error) { + var resp TextEntityTypeMentionName + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextEntityTypePhoneNumber(data json.RawMessage) (*TextEntityTypePhoneNumber, error) { + var resp TextEntityTypePhoneNumber + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputThumbnail(data json.RawMessage) (*InputThumbnail, error) { + var resp InputThumbnail + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageText(data json.RawMessage) (*InputMessageText, error) { + var resp InputMessageText + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageAnimation(data json.RawMessage) (*InputMessageAnimation, error) { + var resp InputMessageAnimation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageAudio(data json.RawMessage) (*InputMessageAudio, error) { + var resp InputMessageAudio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageDocument(data json.RawMessage) (*InputMessageDocument, error) { + var resp InputMessageDocument + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessagePhoto(data json.RawMessage) (*InputMessagePhoto, error) { + var resp InputMessagePhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageSticker(data json.RawMessage) (*InputMessageSticker, error) { + var resp InputMessageSticker + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageVideo(data json.RawMessage) (*InputMessageVideo, error) { + var resp InputMessageVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageVideoNote(data json.RawMessage) (*InputMessageVideoNote, error) { + var resp InputMessageVideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageVoiceNote(data json.RawMessage) (*InputMessageVoiceNote, error) { + var resp InputMessageVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageLocation(data json.RawMessage) (*InputMessageLocation, error) { + var resp InputMessageLocation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageVenue(data json.RawMessage) (*InputMessageVenue, error) { + var resp InputMessageVenue + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageContact(data json.RawMessage) (*InputMessageContact, error) { + var resp InputMessageContact + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageGame(data json.RawMessage) (*InputMessageGame, error) { + var resp InputMessageGame + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageInvoice(data json.RawMessage) (*InputMessageInvoice, error) { + var resp InputMessageInvoice + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputMessageForwarded(data json.RawMessage) (*InputMessageForwarded, error) { + var resp InputMessageForwarded + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterEmpty(data json.RawMessage) (*SearchMessagesFilterEmpty, error) { + var resp SearchMessagesFilterEmpty + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterAnimation(data json.RawMessage) (*SearchMessagesFilterAnimation, error) { + var resp SearchMessagesFilterAnimation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterAudio(data json.RawMessage) (*SearchMessagesFilterAudio, error) { + var resp SearchMessagesFilterAudio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterDocument(data json.RawMessage) (*SearchMessagesFilterDocument, error) { + var resp SearchMessagesFilterDocument + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterPhoto(data json.RawMessage) (*SearchMessagesFilterPhoto, error) { + var resp SearchMessagesFilterPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterVideo(data json.RawMessage) (*SearchMessagesFilterVideo, error) { + var resp SearchMessagesFilterVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterVoiceNote(data json.RawMessage) (*SearchMessagesFilterVoiceNote, error) { + var resp SearchMessagesFilterVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterPhotoAndVideo(data json.RawMessage) (*SearchMessagesFilterPhotoAndVideo, error) { + var resp SearchMessagesFilterPhotoAndVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterUrl(data json.RawMessage) (*SearchMessagesFilterUrl, error) { + var resp SearchMessagesFilterUrl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterChatPhoto(data json.RawMessage) (*SearchMessagesFilterChatPhoto, error) { + var resp SearchMessagesFilterChatPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterCall(data json.RawMessage) (*SearchMessagesFilterCall, error) { + var resp SearchMessagesFilterCall + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterMissedCall(data json.RawMessage) (*SearchMessagesFilterMissedCall, error) { + var resp SearchMessagesFilterMissedCall + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterVideoNote(data json.RawMessage) (*SearchMessagesFilterVideoNote, error) { + var resp SearchMessagesFilterVideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterVoiceAndVideoNote(data json.RawMessage) (*SearchMessagesFilterVoiceAndVideoNote, error) { + var resp SearchMessagesFilterVoiceAndVideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterMention(data json.RawMessage) (*SearchMessagesFilterMention, error) { + var resp SearchMessagesFilterMention + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSearchMessagesFilterUnreadMention(data json.RawMessage) (*SearchMessagesFilterUnreadMention, error) { + var resp SearchMessagesFilterUnreadMention + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionTyping(data json.RawMessage) (*ChatActionTyping, error) { + var resp ChatActionTyping + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionRecordingVideo(data json.RawMessage) (*ChatActionRecordingVideo, error) { + var resp ChatActionRecordingVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionUploadingVideo(data json.RawMessage) (*ChatActionUploadingVideo, error) { + var resp ChatActionUploadingVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionRecordingVoiceNote(data json.RawMessage) (*ChatActionRecordingVoiceNote, error) { + var resp ChatActionRecordingVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionUploadingVoiceNote(data json.RawMessage) (*ChatActionUploadingVoiceNote, error) { + var resp ChatActionUploadingVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionUploadingPhoto(data json.RawMessage) (*ChatActionUploadingPhoto, error) { + var resp ChatActionUploadingPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionUploadingDocument(data json.RawMessage) (*ChatActionUploadingDocument, error) { + var resp ChatActionUploadingDocument + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionChoosingLocation(data json.RawMessage) (*ChatActionChoosingLocation, error) { + var resp ChatActionChoosingLocation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionChoosingContact(data json.RawMessage) (*ChatActionChoosingContact, error) { + var resp ChatActionChoosingContact + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionStartPlayingGame(data json.RawMessage) (*ChatActionStartPlayingGame, error) { + var resp ChatActionStartPlayingGame + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionRecordingVideoNote(data json.RawMessage) (*ChatActionRecordingVideoNote, error) { + var resp ChatActionRecordingVideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionUploadingVideoNote(data json.RawMessage) (*ChatActionUploadingVideoNote, error) { + var resp ChatActionUploadingVideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatActionCancel(data json.RawMessage) (*ChatActionCancel, error) { + var resp ChatActionCancel + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserStatusEmpty(data json.RawMessage) (*UserStatusEmpty, error) { + var resp UserStatusEmpty + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserStatusOnline(data json.RawMessage) (*UserStatusOnline, error) { + var resp UserStatusOnline + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserStatusOffline(data json.RawMessage) (*UserStatusOffline, error) { + var resp UserStatusOffline + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserStatusRecently(data json.RawMessage) (*UserStatusRecently, error) { + var resp UserStatusRecently + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserStatusLastWeek(data json.RawMessage) (*UserStatusLastWeek, error) { + var resp UserStatusLastWeek + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserStatusLastMonth(data json.RawMessage) (*UserStatusLastMonth, error) { + var resp UserStatusLastMonth + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStickers(data json.RawMessage) (*Stickers, error) { + var resp Stickers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStickerEmojis(data json.RawMessage) (*StickerEmojis, error) { + var resp StickerEmojis + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStickerSet(data json.RawMessage) (*StickerSet, error) { + var resp StickerSet + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStickerSetInfo(data json.RawMessage) (*StickerSetInfo, error) { + var resp StickerSetInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStickerSets(data json.RawMessage) (*StickerSets, error) { + var resp StickerSets + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallDiscardReasonEmpty(data json.RawMessage) (*CallDiscardReasonEmpty, error) { + var resp CallDiscardReasonEmpty + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallDiscardReasonMissed(data json.RawMessage) (*CallDiscardReasonMissed, error) { + var resp CallDiscardReasonMissed + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallDiscardReasonDeclined(data json.RawMessage) (*CallDiscardReasonDeclined, error) { + var resp CallDiscardReasonDeclined + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallDiscardReasonDisconnected(data json.RawMessage) (*CallDiscardReasonDisconnected, error) { + var resp CallDiscardReasonDisconnected + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallDiscardReasonHungUp(data json.RawMessage) (*CallDiscardReasonHungUp, error) { + var resp CallDiscardReasonHungUp + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallProtocol(data json.RawMessage) (*CallProtocol, error) { + var resp CallProtocol + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallConnection(data json.RawMessage) (*CallConnection, error) { + var resp CallConnection + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallId(data json.RawMessage) (*CallId, error) { + var resp CallId + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallStatePending(data json.RawMessage) (*CallStatePending, error) { + var resp CallStatePending + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallStateExchangingKeys(data json.RawMessage) (*CallStateExchangingKeys, error) { + var resp CallStateExchangingKeys + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallStateReady(data json.RawMessage) (*CallStateReady, error) { + var resp CallStateReady + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallStateHangingUp(data json.RawMessage) (*CallStateHangingUp, error) { + var resp CallStateHangingUp + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallStateDiscarded(data json.RawMessage) (*CallStateDiscarded, error) { + var resp CallStateDiscarded + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallStateError(data json.RawMessage) (*CallStateError, error) { + var resp CallStateError + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCall(data json.RawMessage) (*Call, error) { + var resp Call + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAnimations(data json.RawMessage) (*Animations, error) { + var resp Animations + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalImportedContacts(data json.RawMessage) (*ImportedContacts, error) { + var resp ImportedContacts + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultAnimatedGif(data json.RawMessage) (*InputInlineQueryResultAnimatedGif, error) { + var resp InputInlineQueryResultAnimatedGif + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultAnimatedMpeg4(data json.RawMessage) (*InputInlineQueryResultAnimatedMpeg4, error) { + var resp InputInlineQueryResultAnimatedMpeg4 + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultArticle(data json.RawMessage) (*InputInlineQueryResultArticle, error) { + var resp InputInlineQueryResultArticle + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultAudio(data json.RawMessage) (*InputInlineQueryResultAudio, error) { + var resp InputInlineQueryResultAudio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultContact(data json.RawMessage) (*InputInlineQueryResultContact, error) { + var resp InputInlineQueryResultContact + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultDocument(data json.RawMessage) (*InputInlineQueryResultDocument, error) { + var resp InputInlineQueryResultDocument + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultGame(data json.RawMessage) (*InputInlineQueryResultGame, error) { + var resp InputInlineQueryResultGame + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultLocation(data json.RawMessage) (*InputInlineQueryResultLocation, error) { + var resp InputInlineQueryResultLocation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultPhoto(data json.RawMessage) (*InputInlineQueryResultPhoto, error) { + var resp InputInlineQueryResultPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultSticker(data json.RawMessage) (*InputInlineQueryResultSticker, error) { + var resp InputInlineQueryResultSticker + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultVenue(data json.RawMessage) (*InputInlineQueryResultVenue, error) { + var resp InputInlineQueryResultVenue + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultVideo(data json.RawMessage) (*InputInlineQueryResultVideo, error) { + var resp InputInlineQueryResultVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputInlineQueryResultVoiceNote(data json.RawMessage) (*InputInlineQueryResultVoiceNote, error) { + var resp InputInlineQueryResultVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultArticle(data json.RawMessage) (*InlineQueryResultArticle, error) { + var resp InlineQueryResultArticle + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultContact(data json.RawMessage) (*InlineQueryResultContact, error) { + var resp InlineQueryResultContact + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultLocation(data json.RawMessage) (*InlineQueryResultLocation, error) { + var resp InlineQueryResultLocation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultVenue(data json.RawMessage) (*InlineQueryResultVenue, error) { + var resp InlineQueryResultVenue + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultGame(data json.RawMessage) (*InlineQueryResultGame, error) { + var resp InlineQueryResultGame + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultAnimation(data json.RawMessage) (*InlineQueryResultAnimation, error) { + var resp InlineQueryResultAnimation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultAudio(data json.RawMessage) (*InlineQueryResultAudio, error) { + var resp InlineQueryResultAudio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultDocument(data json.RawMessage) (*InlineQueryResultDocument, error) { + var resp InlineQueryResultDocument + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultPhoto(data json.RawMessage) (*InlineQueryResultPhoto, error) { + var resp InlineQueryResultPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultSticker(data json.RawMessage) (*InlineQueryResultSticker, error) { + var resp InlineQueryResultSticker + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultVideo(data json.RawMessage) (*InlineQueryResultVideo, error) { + var resp InlineQueryResultVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResultVoiceNote(data json.RawMessage) (*InlineQueryResultVoiceNote, error) { + var resp InlineQueryResultVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInlineQueryResults(data json.RawMessage) (*InlineQueryResults, error) { + var resp InlineQueryResults + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallbackQueryPayloadData(data json.RawMessage) (*CallbackQueryPayloadData, error) { + var resp CallbackQueryPayloadData + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallbackQueryPayloadGame(data json.RawMessage) (*CallbackQueryPayloadGame, error) { + var resp CallbackQueryPayloadGame + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCallbackQueryAnswer(data json.RawMessage) (*CallbackQueryAnswer, error) { + var resp CallbackQueryAnswer + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCustomRequestResult(data json.RawMessage) (*CustomRequestResult, error) { + var resp CustomRequestResult + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalGameHighScore(data json.RawMessage) (*GameHighScore, error) { + var resp GameHighScore + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalGameHighScores(data json.RawMessage) (*GameHighScores, error) { + var resp GameHighScores + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMessageEdited(data json.RawMessage) (*ChatEventMessageEdited, error) { + var resp ChatEventMessageEdited + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMessageDeleted(data json.RawMessage) (*ChatEventMessageDeleted, error) { + var resp ChatEventMessageDeleted + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMessagePinned(data json.RawMessage) (*ChatEventMessagePinned, error) { + var resp ChatEventMessagePinned + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMessageUnpinned(data json.RawMessage) (*ChatEventMessageUnpinned, error) { + var resp ChatEventMessageUnpinned + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMemberJoined(data json.RawMessage) (*ChatEventMemberJoined, error) { + var resp ChatEventMemberJoined + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMemberLeft(data json.RawMessage) (*ChatEventMemberLeft, error) { + var resp ChatEventMemberLeft + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMemberInvited(data json.RawMessage) (*ChatEventMemberInvited, error) { + var resp ChatEventMemberInvited + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMemberPromoted(data json.RawMessage) (*ChatEventMemberPromoted, error) { + var resp ChatEventMemberPromoted + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventMemberRestricted(data json.RawMessage) (*ChatEventMemberRestricted, error) { + var resp ChatEventMemberRestricted + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventTitleChanged(data json.RawMessage) (*ChatEventTitleChanged, error) { + var resp ChatEventTitleChanged + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventDescriptionChanged(data json.RawMessage) (*ChatEventDescriptionChanged, error) { + var resp ChatEventDescriptionChanged + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventUsernameChanged(data json.RawMessage) (*ChatEventUsernameChanged, error) { + var resp ChatEventUsernameChanged + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventPhotoChanged(data json.RawMessage) (*ChatEventPhotoChanged, error) { + var resp ChatEventPhotoChanged + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventInvitesToggled(data json.RawMessage) (*ChatEventInvitesToggled, error) { + var resp ChatEventInvitesToggled + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventSignMessagesToggled(data json.RawMessage) (*ChatEventSignMessagesToggled, error) { + var resp ChatEventSignMessagesToggled + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventStickerSetChanged(data json.RawMessage) (*ChatEventStickerSetChanged, error) { + var resp ChatEventStickerSetChanged + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventIsAllHistoryAvailableToggled(data json.RawMessage) (*ChatEventIsAllHistoryAvailableToggled, error) { + var resp ChatEventIsAllHistoryAvailableToggled + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEvent(data json.RawMessage) (*ChatEvent, error) { + var resp ChatEvent + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEvents(data json.RawMessage) (*ChatEvents, error) { + var resp ChatEvents + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatEventLogFilters(data json.RawMessage) (*ChatEventLogFilters, error) { + var resp ChatEventLogFilters + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenGoogleCloudMessaging(data json.RawMessage) (*DeviceTokenGoogleCloudMessaging, error) { + var resp DeviceTokenGoogleCloudMessaging + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenApplePush(data json.RawMessage) (*DeviceTokenApplePush, error) { + var resp DeviceTokenApplePush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenApplePushVoIP(data json.RawMessage) (*DeviceTokenApplePushVoIP, error) { + var resp DeviceTokenApplePushVoIP + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenWindowsPush(data json.RawMessage) (*DeviceTokenWindowsPush, error) { + var resp DeviceTokenWindowsPush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenMicrosoftPush(data json.RawMessage) (*DeviceTokenMicrosoftPush, error) { + var resp DeviceTokenMicrosoftPush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenMicrosoftPushVoIP(data json.RawMessage) (*DeviceTokenMicrosoftPushVoIP, error) { + var resp DeviceTokenMicrosoftPushVoIP + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenWebPush(data json.RawMessage) (*DeviceTokenWebPush, error) { + var resp DeviceTokenWebPush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenSimplePush(data json.RawMessage) (*DeviceTokenSimplePush, error) { + var resp DeviceTokenSimplePush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenUbuntuPush(data json.RawMessage) (*DeviceTokenUbuntuPush, error) { + var resp DeviceTokenUbuntuPush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenBlackBerryPush(data json.RawMessage) (*DeviceTokenBlackBerryPush, error) { + var resp DeviceTokenBlackBerryPush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalDeviceTokenTizenPush(data json.RawMessage) (*DeviceTokenTizenPush, error) { + var resp DeviceTokenTizenPush + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalWallpaper(data json.RawMessage) (*Wallpaper, error) { + var resp Wallpaper + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalWallpapers(data json.RawMessage) (*Wallpapers, error) { + var resp Wallpapers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalHashtags(data json.RawMessage) (*Hashtags, error) { + var resp Hashtags + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCheckChatUsernameResultOk(data json.RawMessage) (*CheckChatUsernameResultOk, error) { + var resp CheckChatUsernameResultOk + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCheckChatUsernameResultUsernameInvalid(data json.RawMessage) (*CheckChatUsernameResultUsernameInvalid, error) { + var resp CheckChatUsernameResultUsernameInvalid + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCheckChatUsernameResultUsernameOccupied(data json.RawMessage) (*CheckChatUsernameResultUsernameOccupied, error) { + var resp CheckChatUsernameResultUsernameOccupied + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCheckChatUsernameResultPublicChatsTooMuch(data json.RawMessage) (*CheckChatUsernameResultPublicChatsTooMuch, error) { + var resp CheckChatUsernameResultPublicChatsTooMuch + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCheckChatUsernameResultPublicGroupsUnavailable(data json.RawMessage) (*CheckChatUsernameResultPublicGroupsUnavailable, error) { + var resp CheckChatUsernameResultPublicGroupsUnavailable + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalOptionValueBoolean(data json.RawMessage) (*OptionValueBoolean, error) { + var resp OptionValueBoolean + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalOptionValueEmpty(data json.RawMessage) (*OptionValueEmpty, error) { + var resp OptionValueEmpty + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalOptionValueInteger(data json.RawMessage) (*OptionValueInteger, error) { + var resp OptionValueInteger + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalOptionValueString(data json.RawMessage) (*OptionValueString, error) { + var resp OptionValueString + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingRuleAllowAll(data json.RawMessage) (*UserPrivacySettingRuleAllowAll, error) { + var resp UserPrivacySettingRuleAllowAll + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingRuleAllowContacts(data json.RawMessage) (*UserPrivacySettingRuleAllowContacts, error) { + var resp UserPrivacySettingRuleAllowContacts + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingRuleAllowUsers(data json.RawMessage) (*UserPrivacySettingRuleAllowUsers, error) { + var resp UserPrivacySettingRuleAllowUsers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingRuleRestrictAll(data json.RawMessage) (*UserPrivacySettingRuleRestrictAll, error) { + var resp UserPrivacySettingRuleRestrictAll + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingRuleRestrictContacts(data json.RawMessage) (*UserPrivacySettingRuleRestrictContacts, error) { + var resp UserPrivacySettingRuleRestrictContacts + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingRuleRestrictUsers(data json.RawMessage) (*UserPrivacySettingRuleRestrictUsers, error) { + var resp UserPrivacySettingRuleRestrictUsers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingRules(data json.RawMessage) (*UserPrivacySettingRules, error) { + var resp UserPrivacySettingRules + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingShowStatus(data json.RawMessage) (*UserPrivacySettingShowStatus, error) { + var resp UserPrivacySettingShowStatus + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingAllowChatInvites(data json.RawMessage) (*UserPrivacySettingAllowChatInvites, error) { + var resp UserPrivacySettingAllowChatInvites + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUserPrivacySettingAllowCalls(data json.RawMessage) (*UserPrivacySettingAllowCalls, error) { + var resp UserPrivacySettingAllowCalls + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalAccountTtl(data json.RawMessage) (*AccountTtl, error) { + var resp AccountTtl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSession(data json.RawMessage) (*Session, error) { + var resp Session + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalSessions(data json.RawMessage) (*Sessions, error) { + var resp Sessions + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalConnectedWebsite(data json.RawMessage) (*ConnectedWebsite, error) { + var resp ConnectedWebsite + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalConnectedWebsites(data json.RawMessage) (*ConnectedWebsites, error) { + var resp ConnectedWebsites + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatReportSpamState(data json.RawMessage) (*ChatReportSpamState, error) { + var resp ChatReportSpamState + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatReportReasonSpam(data json.RawMessage) (*ChatReportReasonSpam, error) { + var resp ChatReportReasonSpam + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatReportReasonViolence(data json.RawMessage) (*ChatReportReasonViolence, error) { + var resp ChatReportReasonViolence + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatReportReasonPornography(data json.RawMessage) (*ChatReportReasonPornography, error) { + var resp ChatReportReasonPornography + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalChatReportReasonCustom(data json.RawMessage) (*ChatReportReasonCustom, error) { + var resp ChatReportReasonCustom + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalPublicMessageLink(data json.RawMessage) (*PublicMessageLink, error) { + var resp PublicMessageLink + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeNone(data json.RawMessage) (*FileTypeNone, error) { + var resp FileTypeNone + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeAnimation(data json.RawMessage) (*FileTypeAnimation, error) { + var resp FileTypeAnimation + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeAudio(data json.RawMessage) (*FileTypeAudio, error) { + var resp FileTypeAudio + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeDocument(data json.RawMessage) (*FileTypeDocument, error) { + var resp FileTypeDocument + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypePhoto(data json.RawMessage) (*FileTypePhoto, error) { + var resp FileTypePhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeProfilePhoto(data json.RawMessage) (*FileTypeProfilePhoto, error) { + var resp FileTypeProfilePhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeSecret(data json.RawMessage) (*FileTypeSecret, error) { + var resp FileTypeSecret + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeSticker(data json.RawMessage) (*FileTypeSticker, error) { + var resp FileTypeSticker + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeThumbnail(data json.RawMessage) (*FileTypeThumbnail, error) { + var resp FileTypeThumbnail + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeUnknown(data json.RawMessage) (*FileTypeUnknown, error) { + var resp FileTypeUnknown + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeVideo(data json.RawMessage) (*FileTypeVideo, error) { + var resp FileTypeVideo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeVideoNote(data json.RawMessage) (*FileTypeVideoNote, error) { + var resp FileTypeVideoNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeVoiceNote(data json.RawMessage) (*FileTypeVoiceNote, error) { + var resp FileTypeVoiceNote + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeWallpaper(data json.RawMessage) (*FileTypeWallpaper, error) { + var resp FileTypeWallpaper + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalFileTypeSecretThumbnail(data json.RawMessage) (*FileTypeSecretThumbnail, error) { + var resp FileTypeSecretThumbnail + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStorageStatisticsByFileType(data json.RawMessage) (*StorageStatisticsByFileType, error) { + var resp StorageStatisticsByFileType + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStorageStatisticsByChat(data json.RawMessage) (*StorageStatisticsByChat, error) { + var resp StorageStatisticsByChat + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStorageStatistics(data json.RawMessage) (*StorageStatistics, error) { + var resp StorageStatistics + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalStorageStatisticsFast(data json.RawMessage) (*StorageStatisticsFast, error) { + var resp StorageStatisticsFast + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkTypeNone(data json.RawMessage) (*NetworkTypeNone, error) { + var resp NetworkTypeNone + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkTypeMobile(data json.RawMessage) (*NetworkTypeMobile, error) { + var resp NetworkTypeMobile + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkTypeMobileRoaming(data json.RawMessage) (*NetworkTypeMobileRoaming, error) { + var resp NetworkTypeMobileRoaming + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkTypeWiFi(data json.RawMessage) (*NetworkTypeWiFi, error) { + var resp NetworkTypeWiFi + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkTypeOther(data json.RawMessage) (*NetworkTypeOther, error) { + var resp NetworkTypeOther + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkStatisticsEntryFile(data json.RawMessage) (*NetworkStatisticsEntryFile, error) { + var resp NetworkStatisticsEntryFile + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkStatisticsEntryCall(data json.RawMessage) (*NetworkStatisticsEntryCall, error) { + var resp NetworkStatisticsEntryCall + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalNetworkStatistics(data json.RawMessage) (*NetworkStatistics, error) { + var resp NetworkStatistics + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalConnectionStateWaitingForNetwork(data json.RawMessage) (*ConnectionStateWaitingForNetwork, error) { + var resp ConnectionStateWaitingForNetwork + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalConnectionStateConnectingToProxy(data json.RawMessage) (*ConnectionStateConnectingToProxy, error) { + var resp ConnectionStateConnectingToProxy + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalConnectionStateConnecting(data json.RawMessage) (*ConnectionStateConnecting, error) { + var resp ConnectionStateConnecting + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalConnectionStateUpdating(data json.RawMessage) (*ConnectionStateUpdating, error) { + var resp ConnectionStateUpdating + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalConnectionStateReady(data json.RawMessage) (*ConnectionStateReady, error) { + var resp ConnectionStateReady + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTopChatCategoryUsers(data json.RawMessage) (*TopChatCategoryUsers, error) { + var resp TopChatCategoryUsers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTopChatCategoryBots(data json.RawMessage) (*TopChatCategoryBots, error) { + var resp TopChatCategoryBots + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTopChatCategoryGroups(data json.RawMessage) (*TopChatCategoryGroups, error) { + var resp TopChatCategoryGroups + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTopChatCategoryChannels(data json.RawMessage) (*TopChatCategoryChannels, error) { + var resp TopChatCategoryChannels + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTopChatCategoryInlineBots(data json.RawMessage) (*TopChatCategoryInlineBots, error) { + var resp TopChatCategoryInlineBots + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTopChatCategoryCalls(data json.RawMessage) (*TopChatCategoryCalls, error) { + var resp TopChatCategoryCalls + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTMeUrlTypeUser(data json.RawMessage) (*TMeUrlTypeUser, error) { + var resp TMeUrlTypeUser + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTMeUrlTypeSupergroup(data json.RawMessage) (*TMeUrlTypeSupergroup, error) { + var resp TMeUrlTypeSupergroup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTMeUrlTypeChatInvite(data json.RawMessage) (*TMeUrlTypeChatInvite, error) { + var resp TMeUrlTypeChatInvite + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTMeUrlTypeStickerSet(data json.RawMessage) (*TMeUrlTypeStickerSet, error) { + var resp TMeUrlTypeStickerSet + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTMeUrl(data json.RawMessage) (*TMeUrl, error) { + var resp TMeUrl + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTMeUrls(data json.RawMessage) (*TMeUrls, error) { + var resp TMeUrls + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalCount(data json.RawMessage) (*Count, error) { + var resp Count + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalText(data json.RawMessage) (*Text, error) { + var resp Text + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextParseModeMarkdown(data json.RawMessage) (*TextParseModeMarkdown, error) { + var resp TextParseModeMarkdown + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTextParseModeHTML(data json.RawMessage) (*TextParseModeHTML, error) { + var resp TextParseModeHTML + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalProxyEmpty(data json.RawMessage) (*ProxyEmpty, error) { + var resp ProxyEmpty + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalProxySocks5(data json.RawMessage) (*ProxySocks5, error) { + var resp ProxySocks5 + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalInputSticker(data json.RawMessage) (*InputSticker, error) { + var resp InputSticker + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateAuthorizationState(data json.RawMessage) (*UpdateAuthorizationState, error) { + var resp UpdateAuthorizationState + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewMessage(data json.RawMessage) (*UpdateNewMessage, error) { + var resp UpdateNewMessage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageSendAcknowledged(data json.RawMessage) (*UpdateMessageSendAcknowledged, error) { + var resp UpdateMessageSendAcknowledged + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageSendSucceeded(data json.RawMessage) (*UpdateMessageSendSucceeded, error) { + var resp UpdateMessageSendSucceeded + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageSendFailed(data json.RawMessage) (*UpdateMessageSendFailed, error) { + var resp UpdateMessageSendFailed + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageContent(data json.RawMessage) (*UpdateMessageContent, error) { + var resp UpdateMessageContent + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageEdited(data json.RawMessage) (*UpdateMessageEdited, error) { + var resp UpdateMessageEdited + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageViews(data json.RawMessage) (*UpdateMessageViews, error) { + var resp UpdateMessageViews + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageContentOpened(data json.RawMessage) (*UpdateMessageContentOpened, error) { + var resp UpdateMessageContentOpened + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateMessageMentionRead(data json.RawMessage) (*UpdateMessageMentionRead, error) { + var resp UpdateMessageMentionRead + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewChat(data json.RawMessage) (*UpdateNewChat, error) { + var resp UpdateNewChat + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatTitle(data json.RawMessage) (*UpdateChatTitle, error) { + var resp UpdateChatTitle + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatPhoto(data json.RawMessage) (*UpdateChatPhoto, error) { + var resp UpdateChatPhoto + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatLastMessage(data json.RawMessage) (*UpdateChatLastMessage, error) { + var resp UpdateChatLastMessage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatOrder(data json.RawMessage) (*UpdateChatOrder, error) { + var resp UpdateChatOrder + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatIsPinned(data json.RawMessage) (*UpdateChatIsPinned, error) { + var resp UpdateChatIsPinned + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatReadInbox(data json.RawMessage) (*UpdateChatReadInbox, error) { + var resp UpdateChatReadInbox + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatReadOutbox(data json.RawMessage) (*UpdateChatReadOutbox, error) { + var resp UpdateChatReadOutbox + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatUnreadMentionCount(data json.RawMessage) (*UpdateChatUnreadMentionCount, error) { + var resp UpdateChatUnreadMentionCount + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNotificationSettings(data json.RawMessage) (*UpdateNotificationSettings, error) { + var resp UpdateNotificationSettings + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatReplyMarkup(data json.RawMessage) (*UpdateChatReplyMarkup, error) { + var resp UpdateChatReplyMarkup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateChatDraftMessage(data json.RawMessage) (*UpdateChatDraftMessage, error) { + var resp UpdateChatDraftMessage + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateDeleteMessages(data json.RawMessage) (*UpdateDeleteMessages, error) { + var resp UpdateDeleteMessages + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateUserChatAction(data json.RawMessage) (*UpdateUserChatAction, error) { + var resp UpdateUserChatAction + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateUserStatus(data json.RawMessage) (*UpdateUserStatus, error) { + var resp UpdateUserStatus + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateUser(data json.RawMessage) (*UpdateUser, error) { + var resp UpdateUser + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateBasicGroup(data json.RawMessage) (*UpdateBasicGroup, error) { + var resp UpdateBasicGroup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateSupergroup(data json.RawMessage) (*UpdateSupergroup, error) { + var resp UpdateSupergroup + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateSecretChat(data json.RawMessage) (*UpdateSecretChat, error) { + var resp UpdateSecretChat + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateUserFullInfo(data json.RawMessage) (*UpdateUserFullInfo, error) { + var resp UpdateUserFullInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateBasicGroupFullInfo(data json.RawMessage) (*UpdateBasicGroupFullInfo, error) { + var resp UpdateBasicGroupFullInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateSupergroupFullInfo(data json.RawMessage) (*UpdateSupergroupFullInfo, error) { + var resp UpdateSupergroupFullInfo + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateServiceNotification(data json.RawMessage) (*UpdateServiceNotification, error) { + var resp UpdateServiceNotification + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateFile(data json.RawMessage) (*UpdateFile, error) { + var resp UpdateFile + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateFileGenerationStart(data json.RawMessage) (*UpdateFileGenerationStart, error) { + var resp UpdateFileGenerationStart + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateFileGenerationStop(data json.RawMessage) (*UpdateFileGenerationStop, error) { + var resp UpdateFileGenerationStop + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateCall(data json.RawMessage) (*UpdateCall, error) { + var resp UpdateCall + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateUserPrivacySettingRules(data json.RawMessage) (*UpdateUserPrivacySettingRules, error) { + var resp UpdateUserPrivacySettingRules + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateUnreadMessageCount(data json.RawMessage) (*UpdateUnreadMessageCount, error) { + var resp UpdateUnreadMessageCount + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateOption(data json.RawMessage) (*UpdateOption, error) { + var resp UpdateOption + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateInstalledStickerSets(data json.RawMessage) (*UpdateInstalledStickerSets, error) { + var resp UpdateInstalledStickerSets + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateTrendingStickerSets(data json.RawMessage) (*UpdateTrendingStickerSets, error) { + var resp UpdateTrendingStickerSets + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateRecentStickers(data json.RawMessage) (*UpdateRecentStickers, error) { + var resp UpdateRecentStickers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateFavoriteStickers(data json.RawMessage) (*UpdateFavoriteStickers, error) { + var resp UpdateFavoriteStickers + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateSavedAnimations(data json.RawMessage) (*UpdateSavedAnimations, error) { + var resp UpdateSavedAnimations + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateConnectionState(data json.RawMessage) (*UpdateConnectionState, error) { + var resp UpdateConnectionState + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewInlineQuery(data json.RawMessage) (*UpdateNewInlineQuery, error) { + var resp UpdateNewInlineQuery + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewChosenInlineResult(data json.RawMessage) (*UpdateNewChosenInlineResult, error) { + var resp UpdateNewChosenInlineResult + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewCallbackQuery(data json.RawMessage) (*UpdateNewCallbackQuery, error) { + var resp UpdateNewCallbackQuery + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewInlineCallbackQuery(data json.RawMessage) (*UpdateNewInlineCallbackQuery, error) { + var resp UpdateNewInlineCallbackQuery + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewShippingQuery(data json.RawMessage) (*UpdateNewShippingQuery, error) { + var resp UpdateNewShippingQuery + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewPreCheckoutQuery(data json.RawMessage) (*UpdateNewPreCheckoutQuery, error) { + var resp UpdateNewPreCheckoutQuery + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewCustomEvent(data json.RawMessage) (*UpdateNewCustomEvent, error) { + var resp UpdateNewCustomEvent + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalUpdateNewCustomQuery(data json.RawMessage) (*UpdateNewCustomQuery, error) { + var resp UpdateNewCustomQuery + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTestInt(data json.RawMessage) (*TestInt, error) { + var resp TestInt + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTestString(data json.RawMessage) (*TestString, error) { + var resp TestString + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTestBytes(data json.RawMessage) (*TestBytes, error) { + var resp TestBytes + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTestVectorInt(data json.RawMessage) (*TestVectorInt, error) { + var resp TestVectorInt + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTestVectorIntObject(data json.RawMessage) (*TestVectorIntObject, error) { + var resp TestVectorIntObject + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTestVectorString(data json.RawMessage) (*TestVectorString, error) { + var resp TestVectorString + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalTestVectorStringObject(data json.RawMessage) (*TestVectorStringObject, error) { + var resp TestVectorStringObject + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +func UnmarshalType(data json.RawMessage) (Type, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { + case TypeError: + return UnmarshalError(data) + + case TypeOk: + return UnmarshalOk(data) + + case TypeTdlibParameters: + return UnmarshalTdlibParameters(data) + + case TypeAuthenticationCodeTypeTelegramMessage: + return UnmarshalAuthenticationCodeTypeTelegramMessage(data) + + case TypeAuthenticationCodeTypeSms: + return UnmarshalAuthenticationCodeTypeSms(data) + + case TypeAuthenticationCodeTypeCall: + return UnmarshalAuthenticationCodeTypeCall(data) + + case TypeAuthenticationCodeTypeFlashCall: + return UnmarshalAuthenticationCodeTypeFlashCall(data) + + case TypeAuthenticationCodeInfo: + return UnmarshalAuthenticationCodeInfo(data) + + case TypeAuthorizationStateWaitTdlibParameters: + return UnmarshalAuthorizationStateWaitTdlibParameters(data) + + case TypeAuthorizationStateWaitEncryptionKey: + return UnmarshalAuthorizationStateWaitEncryptionKey(data) + + case TypeAuthorizationStateWaitPhoneNumber: + return UnmarshalAuthorizationStateWaitPhoneNumber(data) + + case TypeAuthorizationStateWaitCode: + return UnmarshalAuthorizationStateWaitCode(data) + + case TypeAuthorizationStateWaitPassword: + return UnmarshalAuthorizationStateWaitPassword(data) + + case TypeAuthorizationStateReady: + return UnmarshalAuthorizationStateReady(data) + + case TypeAuthorizationStateLoggingOut: + return UnmarshalAuthorizationStateLoggingOut(data) + + case TypeAuthorizationStateClosing: + return UnmarshalAuthorizationStateClosing(data) + + case TypeAuthorizationStateClosed: + return UnmarshalAuthorizationStateClosed(data) + + case TypePasswordState: + return UnmarshalPasswordState(data) + + case TypePasswordRecoveryInfo: + return UnmarshalPasswordRecoveryInfo(data) + + case TypeRecoveryEmailAddress: + return UnmarshalRecoveryEmailAddress(data) + + case TypeTemporaryPasswordState: + return UnmarshalTemporaryPasswordState(data) + + case TypeLocalFile: + return UnmarshalLocalFile(data) + + case TypeRemoteFile: + return UnmarshalRemoteFile(data) + + case TypeFile: + return UnmarshalFile(data) + + case TypeInputFileId: + return UnmarshalInputFileId(data) + + case TypeInputFileRemote: + return UnmarshalInputFileRemote(data) + + case TypeInputFileLocal: + return UnmarshalInputFileLocal(data) + + case TypeInputFileGenerated: + return UnmarshalInputFileGenerated(data) + + case TypePhotoSize: + return UnmarshalPhotoSize(data) + + case TypeMaskPointForehead: + return UnmarshalMaskPointForehead(data) + + case TypeMaskPointEyes: + return UnmarshalMaskPointEyes(data) + + case TypeMaskPointMouth: + return UnmarshalMaskPointMouth(data) + + case TypeMaskPointChin: + return UnmarshalMaskPointChin(data) + + case TypeMaskPosition: + return UnmarshalMaskPosition(data) + + case TypeTextEntity: + return UnmarshalTextEntity(data) + + case TypeTextEntities: + return UnmarshalTextEntities(data) + + case TypeFormattedText: + return UnmarshalFormattedText(data) + + case TypeAnimation: + return UnmarshalAnimation(data) + + case TypeAudio: + return UnmarshalAudio(data) + + case TypeDocument: + return UnmarshalDocument(data) + + case TypePhoto: + return UnmarshalPhoto(data) + + case TypeSticker: + return UnmarshalSticker(data) + + case TypeVideo: + return UnmarshalVideo(data) + + case TypeVideoNote: + return UnmarshalVideoNote(data) + + case TypeVoiceNote: + return UnmarshalVoiceNote(data) + + case TypeContact: + return UnmarshalContact(data) + + case TypeLocation: + return UnmarshalLocation(data) + + case TypeVenue: + return UnmarshalVenue(data) + + case TypeGame: + return UnmarshalGame(data) + + case TypeProfilePhoto: + return UnmarshalProfilePhoto(data) + + case TypeChatPhoto: + return UnmarshalChatPhoto(data) + + case TypeLinkStateNone: + return UnmarshalLinkStateNone(data) + + case TypeLinkStateKnowsPhoneNumber: + return UnmarshalLinkStateKnowsPhoneNumber(data) + + case TypeLinkStateIsContact: + return UnmarshalLinkStateIsContact(data) + + case TypeUserTypeRegular: + return UnmarshalUserTypeRegular(data) + + case TypeUserTypeDeleted: + return UnmarshalUserTypeDeleted(data) + + case TypeUserTypeBot: + return UnmarshalUserTypeBot(data) + + case TypeUserTypeUnknown: + return UnmarshalUserTypeUnknown(data) + + case TypeBotCommand: + return UnmarshalBotCommand(data) + + case TypeBotInfo: + return UnmarshalBotInfo(data) + + case TypeUser: + return UnmarshalUser(data) + + case TypeUserFullInfo: + return UnmarshalUserFullInfo(data) + + case TypeUserProfilePhotos: + return UnmarshalUserProfilePhotos(data) + + case TypeUsers: + return UnmarshalUsers(data) + + case TypeChatMemberStatusCreator: + return UnmarshalChatMemberStatusCreator(data) + + case TypeChatMemberStatusAdministrator: + return UnmarshalChatMemberStatusAdministrator(data) + + case TypeChatMemberStatusMember: + return UnmarshalChatMemberStatusMember(data) + + case TypeChatMemberStatusRestricted: + return UnmarshalChatMemberStatusRestricted(data) + + case TypeChatMemberStatusLeft: + return UnmarshalChatMemberStatusLeft(data) + + case TypeChatMemberStatusBanned: + return UnmarshalChatMemberStatusBanned(data) + + case TypeChatMember: + return UnmarshalChatMember(data) + + case TypeChatMembers: + return UnmarshalChatMembers(data) + + case TypeSupergroupMembersFilterRecent: + return UnmarshalSupergroupMembersFilterRecent(data) + + case TypeSupergroupMembersFilterAdministrators: + return UnmarshalSupergroupMembersFilterAdministrators(data) + + case TypeSupergroupMembersFilterSearch: + return UnmarshalSupergroupMembersFilterSearch(data) + + case TypeSupergroupMembersFilterRestricted: + return UnmarshalSupergroupMembersFilterRestricted(data) + + case TypeSupergroupMembersFilterBanned: + return UnmarshalSupergroupMembersFilterBanned(data) + + case TypeSupergroupMembersFilterBots: + return UnmarshalSupergroupMembersFilterBots(data) + + case TypeBasicGroup: + return UnmarshalBasicGroup(data) + + case TypeBasicGroupFullInfo: + return UnmarshalBasicGroupFullInfo(data) + + case TypeSupergroup: + return UnmarshalSupergroup(data) + + case TypeSupergroupFullInfo: + return UnmarshalSupergroupFullInfo(data) + + case TypeSecretChatStatePending: + return UnmarshalSecretChatStatePending(data) + + case TypeSecretChatStateReady: + return UnmarshalSecretChatStateReady(data) + + case TypeSecretChatStateClosed: + return UnmarshalSecretChatStateClosed(data) + + case TypeSecretChat: + return UnmarshalSecretChat(data) + + case TypeMessageForwardedFromUser: + return UnmarshalMessageForwardedFromUser(data) + + case TypeMessageForwardedPost: + return UnmarshalMessageForwardedPost(data) + + case TypeMessageSendingStatePending: + return UnmarshalMessageSendingStatePending(data) + + case TypeMessageSendingStateFailed: + return UnmarshalMessageSendingStateFailed(data) + + case TypeMessage: + return UnmarshalMessage(data) + + case TypeMessages: + return UnmarshalMessages(data) + + case TypeFoundMessages: + return UnmarshalFoundMessages(data) + + case TypeNotificationSettingsScopeChat: + return UnmarshalNotificationSettingsScopeChat(data) + + case TypeNotificationSettingsScopePrivateChats: + return UnmarshalNotificationSettingsScopePrivateChats(data) + + case TypeNotificationSettingsScopeBasicGroupChats: + return UnmarshalNotificationSettingsScopeBasicGroupChats(data) + + case TypeNotificationSettingsScopeAllChats: + return UnmarshalNotificationSettingsScopeAllChats(data) + + case TypeNotificationSettings: + return UnmarshalNotificationSettings(data) + + case TypeDraftMessage: + return UnmarshalDraftMessage(data) + + case TypeChatTypePrivate: + return UnmarshalChatTypePrivate(data) + + case TypeChatTypeBasicGroup: + return UnmarshalChatTypeBasicGroup(data) + + case TypeChatTypeSupergroup: + return UnmarshalChatTypeSupergroup(data) + + case TypeChatTypeSecret: + return UnmarshalChatTypeSecret(data) + + case TypeChat: + return UnmarshalChat(data) + + case TypeChats: + return UnmarshalChats(data) + + case TypeChatInviteLink: + return UnmarshalChatInviteLink(data) + + case TypeChatInviteLinkInfo: + return UnmarshalChatInviteLinkInfo(data) + + case TypeKeyboardButtonTypeText: + return UnmarshalKeyboardButtonTypeText(data) + + case TypeKeyboardButtonTypeRequestPhoneNumber: + return UnmarshalKeyboardButtonTypeRequestPhoneNumber(data) + + case TypeKeyboardButtonTypeRequestLocation: + return UnmarshalKeyboardButtonTypeRequestLocation(data) + + case TypeKeyboardButton: + return UnmarshalKeyboardButton(data) + + case TypeInlineKeyboardButtonTypeUrl: + return UnmarshalInlineKeyboardButtonTypeUrl(data) + + case TypeInlineKeyboardButtonTypeCallback: + return UnmarshalInlineKeyboardButtonTypeCallback(data) + + case TypeInlineKeyboardButtonTypeCallbackGame: + return UnmarshalInlineKeyboardButtonTypeCallbackGame(data) + + case TypeInlineKeyboardButtonTypeSwitchInline: + return UnmarshalInlineKeyboardButtonTypeSwitchInline(data) + + case TypeInlineKeyboardButtonTypeBuy: + return UnmarshalInlineKeyboardButtonTypeBuy(data) + + case TypeInlineKeyboardButton: + return UnmarshalInlineKeyboardButton(data) + + case TypeReplyMarkupRemoveKeyboard: + return UnmarshalReplyMarkupRemoveKeyboard(data) + + case TypeReplyMarkupForceReply: + return UnmarshalReplyMarkupForceReply(data) + + case TypeReplyMarkupShowKeyboard: + return UnmarshalReplyMarkupShowKeyboard(data) + + case TypeReplyMarkupInlineKeyboard: + return UnmarshalReplyMarkupInlineKeyboard(data) + + case TypeRichTextPlain: + return UnmarshalRichTextPlain(data) + + case TypeRichTextBold: + return UnmarshalRichTextBold(data) + + case TypeRichTextItalic: + return UnmarshalRichTextItalic(data) + + case TypeRichTextUnderline: + return UnmarshalRichTextUnderline(data) + + case TypeRichTextStrikethrough: + return UnmarshalRichTextStrikethrough(data) + + case TypeRichTextFixed: + return UnmarshalRichTextFixed(data) + + case TypeRichTextUrl: + return UnmarshalRichTextUrl(data) + + case TypeRichTextEmailAddress: + return UnmarshalRichTextEmailAddress(data) + + case TypeRichTexts: + return UnmarshalRichTexts(data) + + case TypePageBlockTitle: + return UnmarshalPageBlockTitle(data) + + case TypePageBlockSubtitle: + return UnmarshalPageBlockSubtitle(data) + + case TypePageBlockAuthorDate: + return UnmarshalPageBlockAuthorDate(data) + + case TypePageBlockHeader: + return UnmarshalPageBlockHeader(data) + + case TypePageBlockSubheader: + return UnmarshalPageBlockSubheader(data) + + case TypePageBlockParagraph: + return UnmarshalPageBlockParagraph(data) + + case TypePageBlockPreformatted: + return UnmarshalPageBlockPreformatted(data) + + case TypePageBlockFooter: + return UnmarshalPageBlockFooter(data) + + case TypePageBlockDivider: + return UnmarshalPageBlockDivider(data) + + case TypePageBlockAnchor: + return UnmarshalPageBlockAnchor(data) + + case TypePageBlockList: + return UnmarshalPageBlockList(data) + + case TypePageBlockBlockQuote: + return UnmarshalPageBlockBlockQuote(data) + + case TypePageBlockPullQuote: + return UnmarshalPageBlockPullQuote(data) + + case TypePageBlockAnimation: + return UnmarshalPageBlockAnimation(data) + + case TypePageBlockAudio: + return UnmarshalPageBlockAudio(data) + + case TypePageBlockPhoto: + return UnmarshalPageBlockPhoto(data) + + case TypePageBlockVideo: + return UnmarshalPageBlockVideo(data) + + case TypePageBlockCover: + return UnmarshalPageBlockCover(data) + + case TypePageBlockEmbedded: + return UnmarshalPageBlockEmbedded(data) + + case TypePageBlockEmbeddedPost: + return UnmarshalPageBlockEmbeddedPost(data) + + case TypePageBlockCollage: + return UnmarshalPageBlockCollage(data) + + case TypePageBlockSlideshow: + return UnmarshalPageBlockSlideshow(data) + + case TypePageBlockChatLink: + return UnmarshalPageBlockChatLink(data) + + case TypeWebPageInstantView: + return UnmarshalWebPageInstantView(data) + + case TypeWebPage: + return UnmarshalWebPage(data) + + case TypeLabeledPricePart: + return UnmarshalLabeledPricePart(data) + + case TypeInvoice: + return UnmarshalInvoice(data) + + case TypeShippingAddress: + return UnmarshalShippingAddress(data) + + case TypeOrderInfo: + return UnmarshalOrderInfo(data) + + case TypeShippingOption: + return UnmarshalShippingOption(data) + + case TypeSavedCredentials: + return UnmarshalSavedCredentials(data) + + case TypeInputCredentialsSaved: + return UnmarshalInputCredentialsSaved(data) + + case TypeInputCredentialsNew: + return UnmarshalInputCredentialsNew(data) + + case TypeInputCredentialsAndroidPay: + return UnmarshalInputCredentialsAndroidPay(data) + + case TypeInputCredentialsApplePay: + return UnmarshalInputCredentialsApplePay(data) + + case TypePaymentsProviderStripe: + return UnmarshalPaymentsProviderStripe(data) + + case TypePaymentForm: + return UnmarshalPaymentForm(data) + + case TypeValidatedOrderInfo: + return UnmarshalValidatedOrderInfo(data) + + case TypePaymentResult: + return UnmarshalPaymentResult(data) + + case TypePaymentReceipt: + return UnmarshalPaymentReceipt(data) + + case TypeMessageText: + return UnmarshalMessageText(data) + + case TypeMessageAnimation: + return UnmarshalMessageAnimation(data) + + case TypeMessageAudio: + return UnmarshalMessageAudio(data) + + case TypeMessageDocument: + return UnmarshalMessageDocument(data) + + case TypeMessagePhoto: + return UnmarshalMessagePhoto(data) + + case TypeMessageExpiredPhoto: + return UnmarshalMessageExpiredPhoto(data) + + case TypeMessageSticker: + return UnmarshalMessageSticker(data) + + case TypeMessageVideo: + return UnmarshalMessageVideo(data) + + case TypeMessageExpiredVideo: + return UnmarshalMessageExpiredVideo(data) + + case TypeMessageVideoNote: + return UnmarshalMessageVideoNote(data) + + case TypeMessageVoiceNote: + return UnmarshalMessageVoiceNote(data) + + case TypeMessageLocation: + return UnmarshalMessageLocation(data) + + case TypeMessageVenue: + return UnmarshalMessageVenue(data) + + case TypeMessageContact: + return UnmarshalMessageContact(data) + + case TypeMessageGame: + return UnmarshalMessageGame(data) + + case TypeMessageInvoice: + return UnmarshalMessageInvoice(data) + + case TypeMessageCall: + return UnmarshalMessageCall(data) + + case TypeMessageBasicGroupChatCreate: + return UnmarshalMessageBasicGroupChatCreate(data) + + case TypeMessageSupergroupChatCreate: + return UnmarshalMessageSupergroupChatCreate(data) + + case TypeMessageChatChangeTitle: + return UnmarshalMessageChatChangeTitle(data) + + case TypeMessageChatChangePhoto: + return UnmarshalMessageChatChangePhoto(data) + + case TypeMessageChatDeletePhoto: + return UnmarshalMessageChatDeletePhoto(data) + + case TypeMessageChatAddMembers: + return UnmarshalMessageChatAddMembers(data) + + case TypeMessageChatJoinByLink: + return UnmarshalMessageChatJoinByLink(data) + + case TypeMessageChatDeleteMember: + return UnmarshalMessageChatDeleteMember(data) + + case TypeMessageChatUpgradeTo: + return UnmarshalMessageChatUpgradeTo(data) + + case TypeMessageChatUpgradeFrom: + return UnmarshalMessageChatUpgradeFrom(data) + + case TypeMessagePinMessage: + return UnmarshalMessagePinMessage(data) + + case TypeMessageScreenshotTaken: + return UnmarshalMessageScreenshotTaken(data) + + case TypeMessageChatSetTtl: + return UnmarshalMessageChatSetTtl(data) + + case TypeMessageCustomServiceAction: + return UnmarshalMessageCustomServiceAction(data) + + case TypeMessageGameScore: + return UnmarshalMessageGameScore(data) + + case TypeMessagePaymentSuccessful: + return UnmarshalMessagePaymentSuccessful(data) + + case TypeMessagePaymentSuccessfulBot: + return UnmarshalMessagePaymentSuccessfulBot(data) + + case TypeMessageContactRegistered: + return UnmarshalMessageContactRegistered(data) + + case TypeMessageWebsiteConnected: + return UnmarshalMessageWebsiteConnected(data) + + case TypeMessageUnsupported: + return UnmarshalMessageUnsupported(data) + + case TypeTextEntityTypeMention: + return UnmarshalTextEntityTypeMention(data) + + case TypeTextEntityTypeHashtag: + return UnmarshalTextEntityTypeHashtag(data) + + case TypeTextEntityTypeCashtag: + return UnmarshalTextEntityTypeCashtag(data) + + case TypeTextEntityTypeBotCommand: + return UnmarshalTextEntityTypeBotCommand(data) + + case TypeTextEntityTypeUrl: + return UnmarshalTextEntityTypeUrl(data) + + case TypeTextEntityTypeEmailAddress: + return UnmarshalTextEntityTypeEmailAddress(data) + + case TypeTextEntityTypeBold: + return UnmarshalTextEntityTypeBold(data) + + case TypeTextEntityTypeItalic: + return UnmarshalTextEntityTypeItalic(data) + + case TypeTextEntityTypeCode: + return UnmarshalTextEntityTypeCode(data) + + case TypeTextEntityTypePre: + return UnmarshalTextEntityTypePre(data) + + case TypeTextEntityTypePreCode: + return UnmarshalTextEntityTypePreCode(data) + + case TypeTextEntityTypeTextUrl: + return UnmarshalTextEntityTypeTextUrl(data) + + case TypeTextEntityTypeMentionName: + return UnmarshalTextEntityTypeMentionName(data) + + case TypeTextEntityTypePhoneNumber: + return UnmarshalTextEntityTypePhoneNumber(data) + + case TypeInputThumbnail: + return UnmarshalInputThumbnail(data) + + case TypeInputMessageText: + return UnmarshalInputMessageText(data) + + case TypeInputMessageAnimation: + return UnmarshalInputMessageAnimation(data) + + case TypeInputMessageAudio: + return UnmarshalInputMessageAudio(data) + + case TypeInputMessageDocument: + return UnmarshalInputMessageDocument(data) + + case TypeInputMessagePhoto: + return UnmarshalInputMessagePhoto(data) + + case TypeInputMessageSticker: + return UnmarshalInputMessageSticker(data) + + case TypeInputMessageVideo: + return UnmarshalInputMessageVideo(data) + + case TypeInputMessageVideoNote: + return UnmarshalInputMessageVideoNote(data) + + case TypeInputMessageVoiceNote: + return UnmarshalInputMessageVoiceNote(data) + + case TypeInputMessageLocation: + return UnmarshalInputMessageLocation(data) + + case TypeInputMessageVenue: + return UnmarshalInputMessageVenue(data) + + case TypeInputMessageContact: + return UnmarshalInputMessageContact(data) + + case TypeInputMessageGame: + return UnmarshalInputMessageGame(data) + + case TypeInputMessageInvoice: + return UnmarshalInputMessageInvoice(data) + + case TypeInputMessageForwarded: + return UnmarshalInputMessageForwarded(data) + + case TypeSearchMessagesFilterEmpty: + return UnmarshalSearchMessagesFilterEmpty(data) + + case TypeSearchMessagesFilterAnimation: + return UnmarshalSearchMessagesFilterAnimation(data) + + case TypeSearchMessagesFilterAudio: + return UnmarshalSearchMessagesFilterAudio(data) + + case TypeSearchMessagesFilterDocument: + return UnmarshalSearchMessagesFilterDocument(data) + + case TypeSearchMessagesFilterPhoto: + return UnmarshalSearchMessagesFilterPhoto(data) + + case TypeSearchMessagesFilterVideo: + return UnmarshalSearchMessagesFilterVideo(data) + + case TypeSearchMessagesFilterVoiceNote: + return UnmarshalSearchMessagesFilterVoiceNote(data) + + case TypeSearchMessagesFilterPhotoAndVideo: + return UnmarshalSearchMessagesFilterPhotoAndVideo(data) + + case TypeSearchMessagesFilterUrl: + return UnmarshalSearchMessagesFilterUrl(data) + + case TypeSearchMessagesFilterChatPhoto: + return UnmarshalSearchMessagesFilterChatPhoto(data) + + case TypeSearchMessagesFilterCall: + return UnmarshalSearchMessagesFilterCall(data) + + case TypeSearchMessagesFilterMissedCall: + return UnmarshalSearchMessagesFilterMissedCall(data) + + case TypeSearchMessagesFilterVideoNote: + return UnmarshalSearchMessagesFilterVideoNote(data) + + case TypeSearchMessagesFilterVoiceAndVideoNote: + return UnmarshalSearchMessagesFilterVoiceAndVideoNote(data) + + case TypeSearchMessagesFilterMention: + return UnmarshalSearchMessagesFilterMention(data) + + case TypeSearchMessagesFilterUnreadMention: + return UnmarshalSearchMessagesFilterUnreadMention(data) + + case TypeChatActionTyping: + return UnmarshalChatActionTyping(data) + + case TypeChatActionRecordingVideo: + return UnmarshalChatActionRecordingVideo(data) + + case TypeChatActionUploadingVideo: + return UnmarshalChatActionUploadingVideo(data) + + case TypeChatActionRecordingVoiceNote: + return UnmarshalChatActionRecordingVoiceNote(data) + + case TypeChatActionUploadingVoiceNote: + return UnmarshalChatActionUploadingVoiceNote(data) + + case TypeChatActionUploadingPhoto: + return UnmarshalChatActionUploadingPhoto(data) + + case TypeChatActionUploadingDocument: + return UnmarshalChatActionUploadingDocument(data) + + case TypeChatActionChoosingLocation: + return UnmarshalChatActionChoosingLocation(data) + + case TypeChatActionChoosingContact: + return UnmarshalChatActionChoosingContact(data) + + case TypeChatActionStartPlayingGame: + return UnmarshalChatActionStartPlayingGame(data) + + case TypeChatActionRecordingVideoNote: + return UnmarshalChatActionRecordingVideoNote(data) + + case TypeChatActionUploadingVideoNote: + return UnmarshalChatActionUploadingVideoNote(data) + + case TypeChatActionCancel: + return UnmarshalChatActionCancel(data) + + case TypeUserStatusEmpty: + return UnmarshalUserStatusEmpty(data) + + case TypeUserStatusOnline: + return UnmarshalUserStatusOnline(data) + + case TypeUserStatusOffline: + return UnmarshalUserStatusOffline(data) + + case TypeUserStatusRecently: + return UnmarshalUserStatusRecently(data) + + case TypeUserStatusLastWeek: + return UnmarshalUserStatusLastWeek(data) + + case TypeUserStatusLastMonth: + return UnmarshalUserStatusLastMonth(data) + + case TypeStickers: + return UnmarshalStickers(data) + + case TypeStickerEmojis: + return UnmarshalStickerEmojis(data) + + case TypeStickerSet: + return UnmarshalStickerSet(data) + + case TypeStickerSetInfo: + return UnmarshalStickerSetInfo(data) + + case TypeStickerSets: + return UnmarshalStickerSets(data) + + case TypeCallDiscardReasonEmpty: + return UnmarshalCallDiscardReasonEmpty(data) + + case TypeCallDiscardReasonMissed: + return UnmarshalCallDiscardReasonMissed(data) + + case TypeCallDiscardReasonDeclined: + return UnmarshalCallDiscardReasonDeclined(data) + + case TypeCallDiscardReasonDisconnected: + return UnmarshalCallDiscardReasonDisconnected(data) + + case TypeCallDiscardReasonHungUp: + return UnmarshalCallDiscardReasonHungUp(data) + + case TypeCallProtocol: + return UnmarshalCallProtocol(data) + + case TypeCallConnection: + return UnmarshalCallConnection(data) + + case TypeCallId: + return UnmarshalCallId(data) + + case TypeCallStatePending: + return UnmarshalCallStatePending(data) + + case TypeCallStateExchangingKeys: + return UnmarshalCallStateExchangingKeys(data) + + case TypeCallStateReady: + return UnmarshalCallStateReady(data) + + case TypeCallStateHangingUp: + return UnmarshalCallStateHangingUp(data) + + case TypeCallStateDiscarded: + return UnmarshalCallStateDiscarded(data) + + case TypeCallStateError: + return UnmarshalCallStateError(data) + + case TypeCall: + return UnmarshalCall(data) + + case TypeAnimations: + return UnmarshalAnimations(data) + + case TypeImportedContacts: + return UnmarshalImportedContacts(data) + + case TypeInputInlineQueryResultAnimatedGif: + return UnmarshalInputInlineQueryResultAnimatedGif(data) + + case TypeInputInlineQueryResultAnimatedMpeg4: + return UnmarshalInputInlineQueryResultAnimatedMpeg4(data) + + case TypeInputInlineQueryResultArticle: + return UnmarshalInputInlineQueryResultArticle(data) + + case TypeInputInlineQueryResultAudio: + return UnmarshalInputInlineQueryResultAudio(data) + + case TypeInputInlineQueryResultContact: + return UnmarshalInputInlineQueryResultContact(data) + + case TypeInputInlineQueryResultDocument: + return UnmarshalInputInlineQueryResultDocument(data) + + case TypeInputInlineQueryResultGame: + return UnmarshalInputInlineQueryResultGame(data) + + case TypeInputInlineQueryResultLocation: + return UnmarshalInputInlineQueryResultLocation(data) + + case TypeInputInlineQueryResultPhoto: + return UnmarshalInputInlineQueryResultPhoto(data) + + case TypeInputInlineQueryResultSticker: + return UnmarshalInputInlineQueryResultSticker(data) + + case TypeInputInlineQueryResultVenue: + return UnmarshalInputInlineQueryResultVenue(data) + + case TypeInputInlineQueryResultVideo: + return UnmarshalInputInlineQueryResultVideo(data) + + case TypeInputInlineQueryResultVoiceNote: + return UnmarshalInputInlineQueryResultVoiceNote(data) + + case TypeInlineQueryResultArticle: + return UnmarshalInlineQueryResultArticle(data) + + case TypeInlineQueryResultContact: + return UnmarshalInlineQueryResultContact(data) + + case TypeInlineQueryResultLocation: + return UnmarshalInlineQueryResultLocation(data) + + case TypeInlineQueryResultVenue: + return UnmarshalInlineQueryResultVenue(data) + + case TypeInlineQueryResultGame: + return UnmarshalInlineQueryResultGame(data) + + case TypeInlineQueryResultAnimation: + return UnmarshalInlineQueryResultAnimation(data) + + case TypeInlineQueryResultAudio: + return UnmarshalInlineQueryResultAudio(data) + + case TypeInlineQueryResultDocument: + return UnmarshalInlineQueryResultDocument(data) + + case TypeInlineQueryResultPhoto: + return UnmarshalInlineQueryResultPhoto(data) + + case TypeInlineQueryResultSticker: + return UnmarshalInlineQueryResultSticker(data) + + case TypeInlineQueryResultVideo: + return UnmarshalInlineQueryResultVideo(data) + + case TypeInlineQueryResultVoiceNote: + return UnmarshalInlineQueryResultVoiceNote(data) + + case TypeInlineQueryResults: + return UnmarshalInlineQueryResults(data) + + case TypeCallbackQueryPayloadData: + return UnmarshalCallbackQueryPayloadData(data) + + case TypeCallbackQueryPayloadGame: + return UnmarshalCallbackQueryPayloadGame(data) + + case TypeCallbackQueryAnswer: + return UnmarshalCallbackQueryAnswer(data) + + case TypeCustomRequestResult: + return UnmarshalCustomRequestResult(data) + + case TypeGameHighScore: + return UnmarshalGameHighScore(data) + + case TypeGameHighScores: + return UnmarshalGameHighScores(data) + + case TypeChatEventMessageEdited: + return UnmarshalChatEventMessageEdited(data) + + case TypeChatEventMessageDeleted: + return UnmarshalChatEventMessageDeleted(data) + + case TypeChatEventMessagePinned: + return UnmarshalChatEventMessagePinned(data) + + case TypeChatEventMessageUnpinned: + return UnmarshalChatEventMessageUnpinned(data) + + case TypeChatEventMemberJoined: + return UnmarshalChatEventMemberJoined(data) + + case TypeChatEventMemberLeft: + return UnmarshalChatEventMemberLeft(data) + + case TypeChatEventMemberInvited: + return UnmarshalChatEventMemberInvited(data) + + case TypeChatEventMemberPromoted: + return UnmarshalChatEventMemberPromoted(data) + + case TypeChatEventMemberRestricted: + return UnmarshalChatEventMemberRestricted(data) + + case TypeChatEventTitleChanged: + return UnmarshalChatEventTitleChanged(data) + + case TypeChatEventDescriptionChanged: + return UnmarshalChatEventDescriptionChanged(data) + + case TypeChatEventUsernameChanged: + return UnmarshalChatEventUsernameChanged(data) + + case TypeChatEventPhotoChanged: + return UnmarshalChatEventPhotoChanged(data) + + case TypeChatEventInvitesToggled: + return UnmarshalChatEventInvitesToggled(data) + + case TypeChatEventSignMessagesToggled: + return UnmarshalChatEventSignMessagesToggled(data) + + case TypeChatEventStickerSetChanged: + return UnmarshalChatEventStickerSetChanged(data) + + case TypeChatEventIsAllHistoryAvailableToggled: + return UnmarshalChatEventIsAllHistoryAvailableToggled(data) + + case TypeChatEvent: + return UnmarshalChatEvent(data) + + case TypeChatEvents: + return UnmarshalChatEvents(data) + + case TypeChatEventLogFilters: + return UnmarshalChatEventLogFilters(data) + + case TypeDeviceTokenGoogleCloudMessaging: + return UnmarshalDeviceTokenGoogleCloudMessaging(data) + + case TypeDeviceTokenApplePush: + return UnmarshalDeviceTokenApplePush(data) + + case TypeDeviceTokenApplePushVoIP: + return UnmarshalDeviceTokenApplePushVoIP(data) + + case TypeDeviceTokenWindowsPush: + return UnmarshalDeviceTokenWindowsPush(data) + + case TypeDeviceTokenMicrosoftPush: + return UnmarshalDeviceTokenMicrosoftPush(data) + + case TypeDeviceTokenMicrosoftPushVoIP: + return UnmarshalDeviceTokenMicrosoftPushVoIP(data) + + case TypeDeviceTokenWebPush: + return UnmarshalDeviceTokenWebPush(data) + + case TypeDeviceTokenSimplePush: + return UnmarshalDeviceTokenSimplePush(data) + + case TypeDeviceTokenUbuntuPush: + return UnmarshalDeviceTokenUbuntuPush(data) + + case TypeDeviceTokenBlackBerryPush: + return UnmarshalDeviceTokenBlackBerryPush(data) + + case TypeDeviceTokenTizenPush: + return UnmarshalDeviceTokenTizenPush(data) + + case TypeWallpaper: + return UnmarshalWallpaper(data) + + case TypeWallpapers: + return UnmarshalWallpapers(data) + + case TypeHashtags: + return UnmarshalHashtags(data) + + case TypeCheckChatUsernameResultOk: + return UnmarshalCheckChatUsernameResultOk(data) + + case TypeCheckChatUsernameResultUsernameInvalid: + return UnmarshalCheckChatUsernameResultUsernameInvalid(data) + + case TypeCheckChatUsernameResultUsernameOccupied: + return UnmarshalCheckChatUsernameResultUsernameOccupied(data) + + case TypeCheckChatUsernameResultPublicChatsTooMuch: + return UnmarshalCheckChatUsernameResultPublicChatsTooMuch(data) + + case TypeCheckChatUsernameResultPublicGroupsUnavailable: + return UnmarshalCheckChatUsernameResultPublicGroupsUnavailable(data) + + case TypeOptionValueBoolean: + return UnmarshalOptionValueBoolean(data) + + case TypeOptionValueEmpty: + return UnmarshalOptionValueEmpty(data) + + case TypeOptionValueInteger: + return UnmarshalOptionValueInteger(data) + + case TypeOptionValueString: + return UnmarshalOptionValueString(data) + + case TypeUserPrivacySettingRuleAllowAll: + return UnmarshalUserPrivacySettingRuleAllowAll(data) + + case TypeUserPrivacySettingRuleAllowContacts: + return UnmarshalUserPrivacySettingRuleAllowContacts(data) + + case TypeUserPrivacySettingRuleAllowUsers: + return UnmarshalUserPrivacySettingRuleAllowUsers(data) + + case TypeUserPrivacySettingRuleRestrictAll: + return UnmarshalUserPrivacySettingRuleRestrictAll(data) + + case TypeUserPrivacySettingRuleRestrictContacts: + return UnmarshalUserPrivacySettingRuleRestrictContacts(data) + + case TypeUserPrivacySettingRuleRestrictUsers: + return UnmarshalUserPrivacySettingRuleRestrictUsers(data) + + case TypeUserPrivacySettingRules: + return UnmarshalUserPrivacySettingRules(data) + + case TypeUserPrivacySettingShowStatus: + return UnmarshalUserPrivacySettingShowStatus(data) + + case TypeUserPrivacySettingAllowChatInvites: + return UnmarshalUserPrivacySettingAllowChatInvites(data) + + case TypeUserPrivacySettingAllowCalls: + return UnmarshalUserPrivacySettingAllowCalls(data) + + case TypeAccountTtl: + return UnmarshalAccountTtl(data) + + case TypeSession: + return UnmarshalSession(data) + + case TypeSessions: + return UnmarshalSessions(data) + + case TypeConnectedWebsite: + return UnmarshalConnectedWebsite(data) + + case TypeConnectedWebsites: + return UnmarshalConnectedWebsites(data) + + case TypeChatReportSpamState: + return UnmarshalChatReportSpamState(data) + + case TypeChatReportReasonSpam: + return UnmarshalChatReportReasonSpam(data) + + case TypeChatReportReasonViolence: + return UnmarshalChatReportReasonViolence(data) + + case TypeChatReportReasonPornography: + return UnmarshalChatReportReasonPornography(data) + + case TypeChatReportReasonCustom: + return UnmarshalChatReportReasonCustom(data) + + case TypePublicMessageLink: + return UnmarshalPublicMessageLink(data) + + case TypeFileTypeNone: + return UnmarshalFileTypeNone(data) + + case TypeFileTypeAnimation: + return UnmarshalFileTypeAnimation(data) + + case TypeFileTypeAudio: + return UnmarshalFileTypeAudio(data) + + case TypeFileTypeDocument: + return UnmarshalFileTypeDocument(data) + + case TypeFileTypePhoto: + return UnmarshalFileTypePhoto(data) + + case TypeFileTypeProfilePhoto: + return UnmarshalFileTypeProfilePhoto(data) + + case TypeFileTypeSecret: + return UnmarshalFileTypeSecret(data) + + case TypeFileTypeSticker: + return UnmarshalFileTypeSticker(data) + + case TypeFileTypeThumbnail: + return UnmarshalFileTypeThumbnail(data) + + case TypeFileTypeUnknown: + return UnmarshalFileTypeUnknown(data) + + case TypeFileTypeVideo: + return UnmarshalFileTypeVideo(data) + + case TypeFileTypeVideoNote: + return UnmarshalFileTypeVideoNote(data) + + case TypeFileTypeVoiceNote: + return UnmarshalFileTypeVoiceNote(data) + + case TypeFileTypeWallpaper: + return UnmarshalFileTypeWallpaper(data) + + case TypeFileTypeSecretThumbnail: + return UnmarshalFileTypeSecretThumbnail(data) + + case TypeStorageStatisticsByFileType: + return UnmarshalStorageStatisticsByFileType(data) + + case TypeStorageStatisticsByChat: + return UnmarshalStorageStatisticsByChat(data) + + case TypeStorageStatistics: + return UnmarshalStorageStatistics(data) + + case TypeStorageStatisticsFast: + return UnmarshalStorageStatisticsFast(data) + + case TypeNetworkTypeNone: + return UnmarshalNetworkTypeNone(data) + + case TypeNetworkTypeMobile: + return UnmarshalNetworkTypeMobile(data) + + case TypeNetworkTypeMobileRoaming: + return UnmarshalNetworkTypeMobileRoaming(data) + + case TypeNetworkTypeWiFi: + return UnmarshalNetworkTypeWiFi(data) + + case TypeNetworkTypeOther: + return UnmarshalNetworkTypeOther(data) + + case TypeNetworkStatisticsEntryFile: + return UnmarshalNetworkStatisticsEntryFile(data) + + case TypeNetworkStatisticsEntryCall: + return UnmarshalNetworkStatisticsEntryCall(data) + + case TypeNetworkStatistics: + return UnmarshalNetworkStatistics(data) + + case TypeConnectionStateWaitingForNetwork: + return UnmarshalConnectionStateWaitingForNetwork(data) + + case TypeConnectionStateConnectingToProxy: + return UnmarshalConnectionStateConnectingToProxy(data) + + case TypeConnectionStateConnecting: + return UnmarshalConnectionStateConnecting(data) + + case TypeConnectionStateUpdating: + return UnmarshalConnectionStateUpdating(data) + + case TypeConnectionStateReady: + return UnmarshalConnectionStateReady(data) + + case TypeTopChatCategoryUsers: + return UnmarshalTopChatCategoryUsers(data) + + case TypeTopChatCategoryBots: + return UnmarshalTopChatCategoryBots(data) + + case TypeTopChatCategoryGroups: + return UnmarshalTopChatCategoryGroups(data) + + case TypeTopChatCategoryChannels: + return UnmarshalTopChatCategoryChannels(data) + + case TypeTopChatCategoryInlineBots: + return UnmarshalTopChatCategoryInlineBots(data) + + case TypeTopChatCategoryCalls: + return UnmarshalTopChatCategoryCalls(data) + + case TypeTMeUrlTypeUser: + return UnmarshalTMeUrlTypeUser(data) + + case TypeTMeUrlTypeSupergroup: + return UnmarshalTMeUrlTypeSupergroup(data) + + case TypeTMeUrlTypeChatInvite: + return UnmarshalTMeUrlTypeChatInvite(data) + + case TypeTMeUrlTypeStickerSet: + return UnmarshalTMeUrlTypeStickerSet(data) + + case TypeTMeUrl: + return UnmarshalTMeUrl(data) + + case TypeTMeUrls: + return UnmarshalTMeUrls(data) + + case TypeCount: + return UnmarshalCount(data) + + case TypeText: + return UnmarshalText(data) + + case TypeTextParseModeMarkdown: + return UnmarshalTextParseModeMarkdown(data) + + case TypeTextParseModeHTML: + return UnmarshalTextParseModeHTML(data) + + case TypeProxyEmpty: + return UnmarshalProxyEmpty(data) + + case TypeProxySocks5: + return UnmarshalProxySocks5(data) + + case TypeInputSticker: + return UnmarshalInputSticker(data) + + case TypeUpdateAuthorizationState: + return UnmarshalUpdateAuthorizationState(data) + + case TypeUpdateNewMessage: + return UnmarshalUpdateNewMessage(data) + + case TypeUpdateMessageSendAcknowledged: + return UnmarshalUpdateMessageSendAcknowledged(data) + + case TypeUpdateMessageSendSucceeded: + return UnmarshalUpdateMessageSendSucceeded(data) + + case TypeUpdateMessageSendFailed: + return UnmarshalUpdateMessageSendFailed(data) + + case TypeUpdateMessageContent: + return UnmarshalUpdateMessageContent(data) + + case TypeUpdateMessageEdited: + return UnmarshalUpdateMessageEdited(data) + + case TypeUpdateMessageViews: + return UnmarshalUpdateMessageViews(data) + + case TypeUpdateMessageContentOpened: + return UnmarshalUpdateMessageContentOpened(data) + + case TypeUpdateMessageMentionRead: + return UnmarshalUpdateMessageMentionRead(data) + + case TypeUpdateNewChat: + return UnmarshalUpdateNewChat(data) + + case TypeUpdateChatTitle: + return UnmarshalUpdateChatTitle(data) + + case TypeUpdateChatPhoto: + return UnmarshalUpdateChatPhoto(data) + + case TypeUpdateChatLastMessage: + return UnmarshalUpdateChatLastMessage(data) + + case TypeUpdateChatOrder: + return UnmarshalUpdateChatOrder(data) + + case TypeUpdateChatIsPinned: + return UnmarshalUpdateChatIsPinned(data) + + case TypeUpdateChatReadInbox: + return UnmarshalUpdateChatReadInbox(data) + + case TypeUpdateChatReadOutbox: + return UnmarshalUpdateChatReadOutbox(data) + + case TypeUpdateChatUnreadMentionCount: + return UnmarshalUpdateChatUnreadMentionCount(data) + + case TypeUpdateNotificationSettings: + return UnmarshalUpdateNotificationSettings(data) + + case TypeUpdateChatReplyMarkup: + return UnmarshalUpdateChatReplyMarkup(data) + + case TypeUpdateChatDraftMessage: + return UnmarshalUpdateChatDraftMessage(data) + + case TypeUpdateDeleteMessages: + return UnmarshalUpdateDeleteMessages(data) + + case TypeUpdateUserChatAction: + return UnmarshalUpdateUserChatAction(data) + + case TypeUpdateUserStatus: + return UnmarshalUpdateUserStatus(data) + + case TypeUpdateUser: + return UnmarshalUpdateUser(data) + + case TypeUpdateBasicGroup: + return UnmarshalUpdateBasicGroup(data) + + case TypeUpdateSupergroup: + return UnmarshalUpdateSupergroup(data) + + case TypeUpdateSecretChat: + return UnmarshalUpdateSecretChat(data) + + case TypeUpdateUserFullInfo: + return UnmarshalUpdateUserFullInfo(data) + + case TypeUpdateBasicGroupFullInfo: + return UnmarshalUpdateBasicGroupFullInfo(data) + + case TypeUpdateSupergroupFullInfo: + return UnmarshalUpdateSupergroupFullInfo(data) + + case TypeUpdateServiceNotification: + return UnmarshalUpdateServiceNotification(data) + + case TypeUpdateFile: + return UnmarshalUpdateFile(data) + + case TypeUpdateFileGenerationStart: + return UnmarshalUpdateFileGenerationStart(data) + + case TypeUpdateFileGenerationStop: + return UnmarshalUpdateFileGenerationStop(data) + + case TypeUpdateCall: + return UnmarshalUpdateCall(data) + + case TypeUpdateUserPrivacySettingRules: + return UnmarshalUpdateUserPrivacySettingRules(data) + + case TypeUpdateUnreadMessageCount: + return UnmarshalUpdateUnreadMessageCount(data) + + case TypeUpdateOption: + return UnmarshalUpdateOption(data) + + case TypeUpdateInstalledStickerSets: + return UnmarshalUpdateInstalledStickerSets(data) + + case TypeUpdateTrendingStickerSets: + return UnmarshalUpdateTrendingStickerSets(data) + + case TypeUpdateRecentStickers: + return UnmarshalUpdateRecentStickers(data) + + case TypeUpdateFavoriteStickers: + return UnmarshalUpdateFavoriteStickers(data) + + case TypeUpdateSavedAnimations: + return UnmarshalUpdateSavedAnimations(data) + + case TypeUpdateConnectionState: + return UnmarshalUpdateConnectionState(data) + + case TypeUpdateNewInlineQuery: + return UnmarshalUpdateNewInlineQuery(data) + + case TypeUpdateNewChosenInlineResult: + return UnmarshalUpdateNewChosenInlineResult(data) + + case TypeUpdateNewCallbackQuery: + return UnmarshalUpdateNewCallbackQuery(data) + + case TypeUpdateNewInlineCallbackQuery: + return UnmarshalUpdateNewInlineCallbackQuery(data) + + case TypeUpdateNewShippingQuery: + return UnmarshalUpdateNewShippingQuery(data) + + case TypeUpdateNewPreCheckoutQuery: + return UnmarshalUpdateNewPreCheckoutQuery(data) + + case TypeUpdateNewCustomEvent: + return UnmarshalUpdateNewCustomEvent(data) + + case TypeUpdateNewCustomQuery: + return UnmarshalUpdateNewCustomQuery(data) + + case TypeTestInt: + return UnmarshalTestInt(data) + + case TypeTestString: + return UnmarshalTestString(data) + + case TypeTestBytes: + return UnmarshalTestBytes(data) + + case TypeTestVectorInt: + return UnmarshalTestVectorInt(data) + + case TypeTestVectorIntObject: + return UnmarshalTestVectorIntObject(data) + + case TypeTestVectorString: + return UnmarshalTestVectorString(data) + + case TypeTestVectorStringObject: + return UnmarshalTestVectorStringObject(data) + + default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} diff --git a/cmd/generate-code.go b/cmd/generate-code.go new file mode 100644 index 0000000..74d7658 --- /dev/null +++ b/cmd/generate-code.go @@ -0,0 +1,83 @@ +package main + +import ( + "bufio" + "flag" + "log" + "os" + "path/filepath" + + "github.com/zelenin/go-tdlib/tlparser" + "github.com/zelenin/go-tdlib/codegen" +) + +type config struct { + schemaFilePath string + outputDirPath string + packageName string + functionFileName string + typeFileName string + unmarshalerFileName string +} + +func main() { + var config config + + flag.StringVar(&config.schemaFilePath, "schema", "./td_api.tl", ".tl schema file") + flag.StringVar(&config.outputDirPath, "outputDir", "./tdlib", "output directory") + flag.StringVar(&config.packageName, "package", "tdlib", "package name") + flag.StringVar(&config.functionFileName, "functionFile", "function.go", "functions filename") + flag.StringVar(&config.typeFileName, "typeFile", "type.go", "types filename") + flag.StringVar(&config.unmarshalerFileName, "unmarshalerFile", "unmarshaler.go", "unmarshalers filename") + + flag.Parse() + + schemaFile, err := os.OpenFile(config.schemaFilePath, os.O_RDONLY, os.ModePerm) + if err != nil { + log.Fatalf("schemaFile open error: %s", err) + } + defer schemaFile.Close() + + schema, err := tlparser.Parse(schemaFile) + if err != nil { + log.Fatalf("schema parse error: %s", err) + } + + err = os.MkdirAll(config.outputDirPath, 0755) + if err != nil { + log.Fatalf("error creating %s: %s", config.outputDirPath, err) + } + + functionFilePath := filepath.Join(config.outputDirPath, config.functionFileName) + + os.Remove(functionFilePath) + functionFile, err := os.OpenFile(functionFilePath, os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.ModePerm) + if err != nil { + log.Fatalf("functionFile open error: %s", err) + } + defer functionFile.Close() + + bufio.NewWriter(functionFile).Write(codegen.GenerateFunctions(schema, config.packageName)) + + typeFilePath := filepath.Join(config.outputDirPath, config.typeFileName) + + os.Remove(typeFilePath) + typeFile, err := os.OpenFile(typeFilePath, os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.ModePerm) + if err != nil { + log.Fatalf("typeFile open error: %s", err) + } + defer typeFile.Close() + + bufio.NewWriter(typeFile).Write(codegen.GenerateTypes(schema, config.packageName)) + + unmarshalerFilePath := filepath.Join(config.outputDirPath, config.unmarshalerFileName) + + os.Remove(unmarshalerFilePath) + unmarshalerFile, err := os.OpenFile(unmarshalerFilePath, os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.ModePerm) + if err != nil { + log.Fatalf("unmarshalerFile open error: %s", err) + } + defer unmarshalerFile.Close() + + bufio.NewWriter(unmarshalerFile).Write(codegen.GenerateUnmarshalers(schema, config.packageName)) +} diff --git a/cmd/generate-json.go b/cmd/generate-json.go new file mode 100644 index 0000000..7f0b330 --- /dev/null +++ b/cmd/generate-json.go @@ -0,0 +1,53 @@ +package main + +import ( + "bufio" + "encoding/json" + "flag" + "log" + "os" + "path/filepath" + "strings" + "github.com/zelenin/go-tdlib/tlparser" +) + +func main() { + var inputFilePath string + var outputFilePath string + + flag.StringVar(&inputFilePath, "input", "./td_api.tl", "tl schema file") + flag.StringVar(&outputFilePath, "output", "./td_api.json", "json schema file") + + flag.Parse() + + file, err := os.OpenFile(inputFilePath, os.O_RDONLY, os.ModePerm) + if err != nil { + log.Fatalf("open file error: %s", err) + return + } + defer file.Close() + + schema, err := tlparser.Parse(file) + if err != nil { + log.Fatalf("schema parse error: %s", err) + return + } + + err = os.MkdirAll(filepath.Dir(outputFilePath), os.ModePerm) + if err != nil { + log.Fatalf("make dir error: %s", filepath.Dir(outputFilePath)) + } + + file, err = os.OpenFile(outputFilePath, os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.ModePerm) + if err != nil { + log.Fatalf("open file error: %s", err) + return + } + + data, err := json.MarshalIndent(schema, "", strings.Repeat(" ", 4)) + if err != nil { + log.Fatalf("json marshal error: %s", err) + return + } + bufio.NewWriter(file).Write(data) +} diff --git a/codegen/function.go b/codegen/function.go new file mode 100644 index 0000000..1c8bd27 --- /dev/null +++ b/codegen/function.go @@ -0,0 +1,112 @@ +package codegen + +import ( + "github.com/zelenin/go-tdlib/tlparser" + "fmt" + "strings" + "bytes" +) + +func GenerateFunctions(schema *tlparser.Schema, packageName string) []byte { + buf := bytes.NewBufferString("") + + buf.WriteString(fmt.Sprintf("%s\n\npackage %s\n\n", header, packageName)) + + buf.WriteString(`import ( + "errors" +)`) + + buf.WriteString("\n") + + for _, function := range schema.Functions { + buf.WriteString("\n") + buf.WriteString("// " + function.Description) + buf.WriteString("\n") + + if len(function.Properties) > 0 { + buf.WriteString("//") + buf.WriteString("\n") + } + + propertiesParts := []string{} + for _, property := range function.Properties { + tdlibFunctionProperty := TdlibFunctionProperty(property.Name, property.Type, schema) + + buf.WriteString(fmt.Sprintf("// @param %s %s", tdlibFunctionProperty.ToGoName(), property.Description)) + buf.WriteString("\n") + + propertiesParts = append(propertiesParts, tdlibFunctionProperty.ToGoName()+" "+tdlibFunctionProperty.ToGoType()) + } + + tdlibFunction := TdlibFunction(function.Name, schema) + tdlibFunctionReturn := TdlibFunctionReturn(function.Class, schema) + + buf.WriteString(fmt.Sprintf("func (client *Client) %s(%s) (%s, error) {\n", tdlibFunction.ToGoName(), strings.Join(propertiesParts, ", "), tdlibFunctionReturn.ToGoReturn())) + + sendMethod := "Send" + if function.IsSynchronous { + sendMethod = "jsonClient.Execute" + } + + if len(function.Properties) > 0 { + buf.WriteString(fmt.Sprintf(` result, err := client.%s(Request{ + meta: meta{ + Type: "%s", + }, + Data: map[string]interface{}{ +`, sendMethod, function.Name)) + + for _, property := range function.Properties { + tdlibFunctionProperty := TdlibFunctionProperty(property.Name, property.Type, schema) + buf.WriteString(fmt.Sprintf(" \"%s\": %s,\n", property.Name, tdlibFunctionProperty.ToGoName())) + } + + buf.WriteString(` }, + }) +`) + } else { + buf.WriteString(fmt.Sprintf(` result, err := client.%s(Request{ + meta: meta{ + Type: "%s", + }, + Data: map[string]interface{}{}, + }) +`, sendMethod, function.Name)) + } + + buf.WriteString(` if err != nil { + return nil, err + } + + if result.Type == "error" { + return nil, buildResponseError(result.Data) + } + +`) + + if tdlibFunctionReturn.IsClass() { + buf.WriteString(" switch result.Type {\n") + + for _, subType := range tdlibFunctionReturn.GetClass().GetSubTypes() { + buf.WriteString(fmt.Sprintf(` case %s: + return Unmarshal%s(result.Data) + +`, subType.ToTypeConst(), subType.ToGoType())) + + } + + buf.WriteString(` default: + return nil, errors.New("invalid type") +`) + + buf.WriteString(" }\n") + } else { + buf.WriteString(fmt.Sprintf(` return Unmarshal%s(result.Data) +`, tdlibFunctionReturn.ToGoType())) + } + + buf.WriteString("}\n") + } + + return buf.Bytes() +} diff --git a/codegen/header.go b/codegen/header.go new file mode 100644 index 0000000..ae694ae --- /dev/null +++ b/codegen/header.go @@ -0,0 +1,3 @@ +package codegen + +const header = "// AUTOGENERATED" diff --git a/codegen/string.go b/codegen/string.go new file mode 100644 index 0000000..6da08ca --- /dev/null +++ b/codegen/string.go @@ -0,0 +1,26 @@ +package codegen + +import ( + "strings" + "unicode" +) + +func firstUpper(str string) string { + for i, r := range str { + return string(unicode.ToUpper(r)) + str[i+1:] + } + + return str +} + +func firstLower(str string) string { + for i, r := range str { + return string(unicode.ToLower(r)) + str[i+1:] + } + + return str +} + +func underscoreToCamelCase(s string) string { + return strings.Replace(strings.Title(strings.Replace(strings.ToLower(s), "_", " ", -1)), " ", "", -1) +} diff --git a/codegen/tdlib.go b/codegen/tdlib.go new file mode 100644 index 0000000..43dff53 --- /dev/null +++ b/codegen/tdlib.go @@ -0,0 +1,487 @@ +package codegen + +import ( + "github.com/zelenin/go-tdlib/tlparser" + "strings" + "log" +) + +type tdlibFunction struct { + name string + schema *tlparser.Schema +} + +func TdlibFunction(name string, schema *tlparser.Schema) *tdlibFunction { + return &tdlibFunction{ + name: name, + schema: schema, + } +} + +func (entity *tdlibFunction) ToGoName() string { + return firstUpper(entity.name) +} + +type tdlibFunctionReturn struct { + name string + schema *tlparser.Schema +} + +func TdlibFunctionReturn(name string, schema *tlparser.Schema) *tdlibFunctionReturn { + return &tdlibFunctionReturn{ + name: name, + schema: schema, + } +} + +func (entity *tdlibFunctionReturn) IsType() bool { + return isType(entity.name, func(entity *tlparser.Type) string { + return entity.Class + }, entity.schema) +} + +func (entity *tdlibFunctionReturn) GetType() *tdlibType { + return getType(entity.name, func(entity *tlparser.Type) string { + return entity.Class + }, entity.schema) +} + +func (entity *tdlibFunctionReturn) IsClass() bool { + return isClass(entity.name, func(entity *tlparser.Class) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibFunctionReturn) GetClass() *tdlibClass { + return getClass(entity.name, func(entity *tlparser.Class) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibFunctionReturn) ToGoReturn() string { + if strings.HasPrefix(entity.name, "vector<") { + log.Fatal("vectors are not supported") + } + + if entity.IsClass() { + return entity.GetClass().ToGoType() + } + + if entity.GetType().IsInternal() { + return entity.GetType().ToGoType() + } + + return "*" + entity.GetType().ToGoType() +} + +func (entity *tdlibFunctionReturn) ToGoType() string { + if strings.HasPrefix(entity.name, "vector<") { + log.Fatal("vectors are not supported") + } + + if entity.IsClass() { + return entity.GetClass().ToGoType() + } + + return entity.GetType().ToGoType() +} + +type tdlibFunctionProperty struct { + name string + propertyType string + schema *tlparser.Schema +} + +func TdlibFunctionProperty(name string, propertyType string, schema *tlparser.Schema) *tdlibFunctionProperty { + return &tdlibFunctionProperty{ + name: name, + propertyType: propertyType, + schema: schema, + } +} + +func (entity *tdlibFunctionProperty) GetPrimitive() string { + primitive := entity.propertyType + + for strings.HasPrefix(primitive, "vector<") { + primitive = strings.TrimSuffix(strings.TrimPrefix(primitive, "vector<"), ">") + } + + return primitive +} + +func (entity *tdlibFunctionProperty) IsType() bool { + primitive := entity.GetPrimitive() + return isType(primitive, func(entity *tlparser.Type) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibFunctionProperty) GetType() *tdlibType { + primitive := entity.GetPrimitive() + return getType(primitive, func(entity *tlparser.Type) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibFunctionProperty) IsClass() bool { + primitive := entity.GetPrimitive() + return isClass(primitive, func(entity *tlparser.Class) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibFunctionProperty) GetClass() *tdlibClass { + primitive := entity.GetPrimitive() + return getClass(primitive, func(entity *tlparser.Class) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibFunctionProperty) ToGoName() string { + name := firstLower(underscoreToCamelCase(entity.name)) + if name == "type" { + name += "Param" + } + + return name +} + +func (entity *tdlibFunctionProperty) ToGoType() string { + tdlibType := entity.propertyType + goType := "" + + for strings.HasPrefix(tdlibType, "vector<") { + goType = goType + "[]" + tdlibType = strings.TrimSuffix(strings.TrimPrefix(tdlibType, "vector<"), ">") + } + + if entity.IsClass() { + return goType + entity.GetClass().ToGoType() + } + + if entity.GetType().IsInternal() { + return goType + entity.GetType().ToGoType() + } + + return goType + "*" + entity.GetType().ToGoType() +} + +type tdlibType struct { + name string + schema *tlparser.Schema +} + +func TdlibType(name string, schema *tlparser.Schema) *tdlibType { + return &tdlibType{ + name: name, + schema: schema, + } +} + +func (entity *tdlibType) IsInternal() bool { + switch entity.name { + case "double": + return true + + case "string": + return true + + case "int32": + return true + + case "int53": + return true + + case "int64": + return true + + case "bytes": + return true + + case "boolFalse": + return true + + case "boolTrue": + return true + + case "vector": + return true + } + + return false +} + +func (entity *tdlibType) GetType() *tlparser.Type { + name := normalizeEntityName(entity.name) + for _, typ := range entity.schema.Types { + if typ.Name == name { + return typ + } + } + return nil +} + +func (entity *tdlibType) ToGoType() string { + if strings.HasPrefix(entity.name, "vector<") { + log.Fatal("vectors are not supported") + } + + switch entity.name { + case "double": + return "float64" + + case "string": + return "string" + + case "int32": + return "int32" + + case "int53": + return "int64" + + case "int64": + return "JsonInt64" + + case "bytes": + return "[]byte" + + case "boolFalse": + return "bool" + + case "boolTrue": + return "bool" + } + + return firstUpper(entity.name) +} + +func (entity *tdlibType) ToType() string { + return entity.ToGoType() + "Type" +} + +func (entity *tdlibType) HasClass() bool { + className := entity.GetType().Class + for _, class := range entity.schema.Classes { + if class.Name == className { + return true + } + } + + return false +} + +func (entity *tdlibType) GetClass() *tlparser.Class { + className := entity.GetType().Class + for _, class := range entity.schema.Classes { + if class.Name == className { + return class + } + } + + return nil +} + +func (entity *tdlibType) HasClassProperties() bool { + for _, prop := range entity.GetType().Properties { + tdlibTypeProperty := TdlibTypeProperty(prop.Name, prop.Type, entity.schema) + if tdlibTypeProperty.IsClass() && !tdlibTypeProperty.IsList() { + return true + } + + } + + return false +} + +func (entity *tdlibType) IsList() bool { + return strings.HasPrefix(entity.name, "vector<") +} + +func (entity *tdlibType) ToClassConst() string { + if entity.HasClass() { + return "Class" + TdlibClass(entity.GetType().Class, entity.schema).ToGoType() + } + return "Class" + entity.ToGoType() +} + +func (entity *tdlibType) ToTypeConst() string { + return "Type" + entity.ToGoType() +} + +type tdlibClass struct { + name string + schema *tlparser.Schema +} + +func TdlibClass(name string, schema *tlparser.Schema) *tdlibClass { + return &tdlibClass{ + name: name, + schema: schema, + } +} + +func (entity *tdlibClass) ToGoType() string { + return firstUpper(entity.name) +} + +func (entity *tdlibClass) ToType() string { + return entity.ToGoType() + "Type" +} + +func (entity *tdlibClass) GetSubTypes() []*tdlibType { + types := []*tdlibType{} + + for _, t := range entity.schema.Types { + if t.Class == entity.name { + types = append(types, TdlibType(t.Name, entity.schema)) + } + } + + return types +} + +func (entity *tdlibClass) ToClassConst() string { + return "Class" + entity.ToGoType() +} + +type tdlibTypeProperty struct { + name string + propertyType string + schema *tlparser.Schema +} + +func TdlibTypeProperty(name string, propertyType string, schema *tlparser.Schema) *tdlibTypeProperty { + return &tdlibTypeProperty{ + name: name, + propertyType: propertyType, + schema: schema, + } +} + +func (entity *tdlibTypeProperty) IsList() bool { + return strings.HasPrefix(entity.propertyType, "vector<") +} + +func (entity *tdlibTypeProperty) GetPrimitive() string { + primitive := entity.propertyType + + for strings.HasPrefix(primitive, "vector<") { + primitive = strings.TrimSuffix(strings.TrimPrefix(primitive, "vector<"), ">") + } + + return primitive +} + +func (entity *tdlibTypeProperty) IsType() bool { + primitive := entity.GetPrimitive() + return isType(primitive, func(entity *tlparser.Type) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibTypeProperty) GetType() *tdlibType { + primitive := entity.GetPrimitive() + return getType(primitive, func(entity *tlparser.Type) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibTypeProperty) IsClass() bool { + primitive := entity.GetPrimitive() + return isClass(primitive, func(entity *tlparser.Class) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibTypeProperty) GetClass() *tdlibClass { + primitive := entity.GetPrimitive() + return getClass(primitive, func(entity *tlparser.Class) string { + return entity.Name + }, entity.schema) +} + +func (entity *tdlibTypeProperty) ToGoName() string { + return firstUpper(underscoreToCamelCase(entity.name)) +} + +func (entity *tdlibTypeProperty) ToGoFunctionPropertyName() string { + name := firstLower(underscoreToCamelCase(entity.name)) + if name == "type" { + name += "Param" + } + + return name +} + +func (entity *tdlibTypeProperty) ToGoType() string { + tdlibType := entity.propertyType + goType := "" + + for strings.HasPrefix(tdlibType, "vector<") { + goType = goType + "[]" + tdlibType = strings.TrimSuffix(strings.TrimPrefix(tdlibType, "vector<"), ">") + } + + if entity.IsClass() { + return goType + entity.GetClass().ToGoType() + } + + if entity.GetType().IsInternal() { + return goType + entity.GetType().ToGoType() + } + + return goType + "*" + entity.GetType().ToGoType() +} + +func isType(name string, field func(entity *tlparser.Type) string, schema *tlparser.Schema) bool { + name = normalizeEntityName(name) + for _, entity := range schema.Types { + if name == field(entity) { + return true + } + } + + return false +} + +func getType(name string, field func(entity *tlparser.Type) string, schema *tlparser.Schema) *tdlibType { + name = normalizeEntityName(name) + for _, entity := range schema.Types { + if name == field(entity) { + return TdlibType(entity.Name, schema) + } + } + + return nil +} + +func isClass(name string, field func(entity *tlparser.Class) string, schema *tlparser.Schema) bool { + name = normalizeEntityName(name) + for _, entity := range schema.Classes { + if name == field(entity) { + return true + } + } + + return false +} + +func getClass(name string, field func(entity *tlparser.Class) string, schema *tlparser.Schema) *tdlibClass { + name = normalizeEntityName(name) + for _, entity := range schema.Classes { + if name == field(entity) { + return TdlibClass(entity.Name, schema) + } + } + + return nil +} + +func normalizeEntityName(name string) string { + if name == "Bool" { + name = "boolFalse" + } + + return name +} diff --git a/codegen/type.go b/codegen/type.go new file mode 100644 index 0000000..219bdd9 --- /dev/null +++ b/codegen/type.go @@ -0,0 +1,176 @@ +package codegen + +import ( + "bytes" + "fmt" + + "github.com/zelenin/go-tdlib/tlparser" +) + +func GenerateTypes(schema *tlparser.Schema, packageName string) []byte { + buf := bytes.NewBufferString("") + + buf.WriteString(fmt.Sprintf("%s\n\npackage %s\n\n", header, packageName)) + + buf.WriteString(`import ( + "encoding/json" +) + +`) + + buf.WriteString("const (\n") + for _, entity := range schema.Classes { + tdlibClass := TdlibClass(entity.Name, schema) + buf.WriteString(fmt.Sprintf(" %s = %q\n", tdlibClass.ToClassConst(), entity.Name)) + } + for _, entity := range schema.Types { + tdlibType := TdlibType(entity.Name, schema) + if tdlibType.IsInternal() || tdlibType.HasClass() { + continue + } + buf.WriteString(fmt.Sprintf(" %s = %q\n", tdlibType.ToClassConst(), entity.Class)) + } + buf.WriteString(")") + + buf.WriteString("\n\n") + + buf.WriteString("const (\n") + for _, entity := range schema.Types { + tdlibType := TdlibType(entity.Name, schema) + if tdlibType.IsInternal() { + continue + } + buf.WriteString(fmt.Sprintf(" %s = %q\n", tdlibType.ToTypeConst(), entity.Name)) + } + buf.WriteString(")") + + buf.WriteString("\n\n") + + for _, class := range schema.Classes { + tdlibClass := TdlibClass(class.Name, schema) + + buf.WriteString(fmt.Sprintf(`// %s +type %s interface { + %sType() string +} + +`, class.Description, tdlibClass.ToGoType(), tdlibClass.ToGoType())) + } + + for _, typ := range schema.Types { + tdlibType := TdlibType(typ.Name, schema) + if tdlibType.IsInternal() { + continue + } + + buf.WriteString("// " + typ.Description + "\n") + + if len(typ.Properties) > 0 { + buf.WriteString(`type ` + tdlibType.ToGoType() + ` struct { + meta +`) + for _, property := range typ.Properties { + tdlibTypeProperty := TdlibTypeProperty(property.Name, property.Type, schema) + + buf.WriteString(fmt.Sprintf(" // %s\n", property.Description)) + buf.WriteString(fmt.Sprintf(" %s %s `json:\"%s\"`\n", tdlibTypeProperty.ToGoName(), tdlibTypeProperty.ToGoType(), property.Name)) + } + + buf.WriteString("}\n\n") + } else { + buf.WriteString(`type ` + tdlibType.ToGoType() + ` struct{ + meta +} + +`) + } + + buf.WriteString(fmt.Sprintf(`func (entity *%s) MarshalJSON() ([]byte, error) { + entity.meta.Type = entity.GetType() + + type stub %s + + return json.Marshal((*stub)(entity)) +} + +`, tdlibType.ToGoType(), tdlibType.ToGoType())) + + buf.WriteString(fmt.Sprintf(`func (*%s) GetClass() string { + return %s +} + +func (*%s) GetType() string { + return %s +} + +`, tdlibType.ToGoType(), tdlibType.ToClassConst(), tdlibType.ToGoType(), tdlibType.ToTypeConst())) + + if tdlibType.HasClass() { + tdlibClass := TdlibClass(tdlibType.GetClass().Name, schema) + + buf.WriteString(fmt.Sprintf(`func (*%s) %sType() string { + return %s +} + +`, tdlibType.ToGoType(), tdlibClass.ToGoType(), tdlibType.ToTypeConst())) + } + + if tdlibType.HasClassProperties() { + buf.WriteString(fmt.Sprintf(`func (%s *%s) UnmarshalJSON(data []byte) error { + var tmp struct { +`, typ.Name, tdlibType.ToGoType())) + + var countSimpleProperties int + + for _, property := range typ.Properties { + tdlibTypeProperty := TdlibTypeProperty(property.Name, property.Type, schema) + + if !tdlibTypeProperty.IsClass() || tdlibTypeProperty.IsList() { + buf.WriteString(fmt.Sprintf(" %s %s `json:\"%s\"`\n", tdlibTypeProperty.ToGoName(), tdlibTypeProperty.ToGoType(), property.Name)) + countSimpleProperties++ + } else { + buf.WriteString(fmt.Sprintf(" %s %s `json:\"%s\"`\n", tdlibTypeProperty.ToGoName(), "json.RawMessage", property.Name)) + } + } + + buf.WriteString(` } + + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + +`) + + for _, property := range typ.Properties { + tdlibTypeProperty := TdlibTypeProperty(property.Name, property.Type, schema) + + if !tdlibTypeProperty.IsClass() || tdlibTypeProperty.IsList() { + buf.WriteString(fmt.Sprintf(" %s.%s = tmp.%s\n", typ.Name, tdlibTypeProperty.ToGoName(), tdlibTypeProperty.ToGoName())) + } + } + + if countSimpleProperties > 0 { + buf.WriteString("\n") + } + + for _, property := range typ.Properties { + tdlibTypeProperty := TdlibTypeProperty(property.Name, property.Type, schema) + + if tdlibTypeProperty.IsClass() && !tdlibTypeProperty.IsList() { + buf.WriteString(fmt.Sprintf(` field%s, _ := Unmarshal%s(tmp.%s) + %s.%s = field%s + +`, tdlibTypeProperty.ToGoName(), tdlibTypeProperty.ToGoType(), tdlibTypeProperty.ToGoName(), typ.Name, tdlibTypeProperty.ToGoName(), tdlibTypeProperty.ToGoName())) + } + } + + buf.WriteString(` return nil +} + +`) + } + } + + return buf.Bytes() +} diff --git a/codegen/unmarshaler.go b/codegen/unmarshaler.go new file mode 100644 index 0000000..54e696e --- /dev/null +++ b/codegen/unmarshaler.go @@ -0,0 +1,102 @@ +package codegen + +import ( + "github.com/zelenin/go-tdlib/tlparser" + "fmt" + "bytes" +) + +func GenerateUnmarshalers(schema *tlparser.Schema, packageName string) []byte { + buf := bytes.NewBufferString("") + + buf.WriteString(fmt.Sprintf("%s\n\npackage %s\n\n", header, packageName)) + + buf.WriteString(`import ( + "encoding/json" + "fmt" +) + +`) + + for _, class := range schema.Classes { + tdlibClass := TdlibClass(class.Name, schema) + + buf.WriteString(fmt.Sprintf(`func Unmarshal%s(data json.RawMessage) (%s, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { +`, tdlibClass.ToGoType(), tdlibClass.ToGoType())) + + for _, subType := range tdlibClass.GetSubTypes() { + buf.WriteString(fmt.Sprintf(` case %s: + return Unmarshal%s(data) + +`, subType.ToTypeConst(), subType.ToGoType())) + + } + + buf.WriteString(` default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} + +`) + } + + for _, typ := range schema.Types { + tdlibType := TdlibType(typ.Name, schema) + + if tdlibType.IsList() || tdlibType.IsInternal() { + continue + } + + buf.WriteString(fmt.Sprintf(`func Unmarshal%s(data json.RawMessage) (*%s, error) { + var resp %s + + err := json.Unmarshal(data, &resp) + + return &resp, err +} + +`, tdlibType.ToGoType(), tdlibType.ToGoType(), tdlibType.ToGoType())) + + } + + buf.WriteString(`func UnmarshalType(data json.RawMessage) (Type, error) { + var meta meta + + err := json.Unmarshal(data, &meta) + if err != nil { + return nil, err + } + + switch meta.Type { +`) + + for _, typ := range schema.Types { + tdlibType := TdlibType(typ.Name, schema) + + if tdlibType.IsList() || tdlibType.IsInternal() { + continue + } + + buf.WriteString(fmt.Sprintf(` case %s: + return Unmarshal%s(data) + +`, tdlibType.ToTypeConst(), tdlibType.ToGoType())) + + } + + buf.WriteString(` default: + return nil, fmt.Errorf("Error unmarshaling. Unknown type: " + meta.Type) + } +} +`) + + return buf.Bytes() +} diff --git a/data/td_api.json b/data/td_api.json new file mode 100755 index 0000000..09d735b --- /dev/null +++ b/data/td_api.json @@ -0,0 +1,13410 @@ +{ + "types": [ + { + "name": "double", + "description": "", + "class": "Double", + "properties": [] + }, + { + "name": "string", + "description": "", + "class": "String", + "properties": [] + }, + { + "name": "int32", + "description": "", + "class": "Int32", + "properties": [] + }, + { + "name": "int53", + "description": "", + "class": "Int53", + "properties": [] + }, + { + "name": "int64", + "description": "", + "class": "Int64", + "properties": [] + }, + { + "name": "bytes", + "description": "", + "class": "Bytes", + "properties": [] + }, + { + "name": "boolFalse", + "description": "", + "class": "Bool", + "properties": [] + }, + { + "name": "boolTrue", + "description": "", + "class": "Bool", + "properties": [] + }, + { + "name": "vector\u003ct\u003e", + "description": "", + "class": "Vector\u003cT\u003e", + "properties": [] + }, + { + "name": "error", + "description": "An object of this type can be returned on every function call, in case of an error", + "class": "Error", + "properties": [ + { + "name": "code", + "type": "int32", + "description": "Error code; subject to future changes. If the error code is 406, the error message must not be processed in any way and must not be displayed to the user" + }, + { + "name": "message", + "type": "string", + "description": "Error message; subject to future changes" + } + ] + }, + { + "name": "ok", + "description": "An object of this type is returned on a successful function call for certain functions", + "class": "Ok", + "properties": [] + }, + { + "name": "tdlibParameters", + "description": "Contains parameters for TDLib initialization", + "class": "TdlibParameters", + "properties": [ + { + "name": "use_test_dc", + "type": "Bool", + "description": "If set to true, the Telegram test environment will be used instead of the production environment" + }, + { + "name": "database_directory", + "type": "string", + "description": "The path to the directory for the persistent database; if empty, the current working directory will be used" + }, + { + "name": "files_directory", + "type": "string", + "description": "The path to the directory for storing files; if empty, database_directory will be used" + }, + { + "name": "use_file_database", + "type": "Bool", + "description": "If set to true, information about downloaded and uploaded files will be saved between application restarts" + }, + { + "name": "use_chat_info_database", + "type": "Bool", + "description": "If set to true, the library will maintain a cache of users, basic groups, supergroups, channels and secret chats. Implies use_file_database" + }, + { + "name": "use_message_database", + "type": "Bool", + "description": "If set to true, the library will maintain a cache of chats and messages. Implies use_chat_info_database" + }, + { + "name": "use_secret_chats", + "type": "Bool", + "description": "If set to true, support for secret chats will be enabled" + }, + { + "name": "api_id", + "type": "int32", + "description": "Application identifier for Telegram API access, which can be obtained at https://my.telegram.org" + }, + { + "name": "api_hash", + "type": "string", + "description": "Application identifier hash for Telegram API access, which can be obtained at https://my.telegram.org" + }, + { + "name": "system_language_code", + "type": "string", + "description": "IETF language tag of the user's operating system language; must be non-empty" + }, + { + "name": "device_model", + "type": "string", + "description": "Model of the device the application is being run on; must be non-empty" + }, + { + "name": "system_version", + "type": "string", + "description": "Version of the operating system the application is being run on; must be non-empty" + }, + { + "name": "application_version", + "type": "string", + "description": "Application version; must be non-empty" + }, + { + "name": "enable_storage_optimizer", + "type": "Bool", + "description": "If set to true, old files will automatically be deleted" + }, + { + "name": "ignore_file_names", + "type": "Bool", + "description": "If set to true, original file names will be ignored. Otherwise, downloaded files will be saved under names as close as possible to the original name" + } + ] + }, + { + "name": "authenticationCodeTypeTelegramMessage", + "description": "An authentication code is delivered via a private Telegram message, which can be viewed in another client", + "class": "AuthenticationCodeType", + "properties": [ + { + "name": "length", + "type": "int32", + "description": "Length of the code" + } + ] + }, + { + "name": "authenticationCodeTypeSms", + "description": "An authentication code is delivered via an SMS message to the specified phone number", + "class": "AuthenticationCodeType", + "properties": [ + { + "name": "length", + "type": "int32", + "description": "Length of the code" + } + ] + }, + { + "name": "authenticationCodeTypeCall", + "description": "An authentication code is delivered via a phone call to the specified phone number", + "class": "AuthenticationCodeType", + "properties": [ + { + "name": "length", + "type": "int32", + "description": "Length of the code" + } + ] + }, + { + "name": "authenticationCodeTypeFlashCall", + "description": "An authentication code is delivered by an immediately cancelled call to the specified phone number. The number from which the call was made is the code", + "class": "AuthenticationCodeType", + "properties": [ + { + "name": "pattern", + "type": "string", + "description": "Pattern of the phone number from which the call will be made" + } + ] + }, + { + "name": "authenticationCodeInfo", + "description": "Information about the authentication code that was sent", + "class": "AuthenticationCodeInfo", + "properties": [ + { + "name": "phone_number", + "type": "string", + "description": "A phone number that is being authenticated" + }, + { + "name": "type", + "type": "AuthenticationCodeType", + "description": "Describes the way the code was sent to the user" + }, + { + "name": "next_type", + "type": "AuthenticationCodeType", + "description": "Describes the way the next code will be sent to the user; may be null" + }, + { + "name": "timeout", + "type": "int32", + "description": "Timeout before the code should be re-sent, in seconds" + } + ] + }, + { + "name": "authorizationStateWaitTdlibParameters", + "description": "TDLib needs TdlibParameters for initialization", + "class": "AuthorizationState", + "properties": [] + }, + { + "name": "authorizationStateWaitEncryptionKey", + "description": "TDLib needs an encryption key to decrypt the local database", + "class": "AuthorizationState", + "properties": [ + { + "name": "is_encrypted", + "type": "Bool", + "description": "True, if the database is currently encrypted" + } + ] + }, + { + "name": "authorizationStateWaitPhoneNumber", + "description": "TDLib needs the user's phone number to authorize", + "class": "AuthorizationState", + "properties": [] + }, + { + "name": "authorizationStateWaitCode", + "description": "TDLib needs the user's authentication code to finalize authorization", + "class": "AuthorizationState", + "properties": [ + { + "name": "is_registered", + "type": "Bool", + "description": "True, if the user is already registered" + }, + { + "name": "code_info", + "type": "authenticationCodeInfo", + "description": "Information about the authorization code that was sent" + } + ] + }, + { + "name": "authorizationStateWaitPassword", + "description": "The user has been authorized, but needs to enter a password to start using the application", + "class": "AuthorizationState", + "properties": [ + { + "name": "password_hint", + "type": "string", + "description": "Hint for the password; can be empty" + }, + { + "name": "has_recovery_email_address", + "type": "Bool", + "description": "True if a recovery email address has been set up" + }, + { + "name": "recovery_email_address_pattern", + "type": "string", + "description": "Pattern of the email address to which the recovery email was sent; empty until a recovery email has been sent" + } + ] + }, + { + "name": "authorizationStateReady", + "description": "The user has been successfully authorized. TDLib is now ready to answer queries", + "class": "AuthorizationState", + "properties": [] + }, + { + "name": "authorizationStateLoggingOut", + "description": "The user is currently logging out", + "class": "AuthorizationState", + "properties": [] + }, + { + "name": "authorizationStateClosing", + "description": "TDLib is closing, all subsequent queries will be answered with the error 500. Note that closing TDLib can take a while. All resources will be freed only after authorizationStateClosed has been received", + "class": "AuthorizationState", + "properties": [] + }, + { + "name": "authorizationStateClosed", + "description": "TDLib client is in its final state. All databases are closed and all resources are released. No other updates will be received after this. All queries will be responded to with error code 500. To continue working, one should create a new instance of the TDLib client", + "class": "AuthorizationState", + "properties": [] + }, + { + "name": "passwordState", + "description": "Represents the current state of 2-step verification", + "class": "PasswordState", + "properties": [ + { + "name": "has_password", + "type": "Bool", + "description": "True if a 2-step verification password has been set up" + }, + { + "name": "password_hint", + "type": "string", + "description": "Hint for the password; can be empty" + }, + { + "name": "has_recovery_email_address", + "type": "Bool", + "description": "True if a recovery email has been set up" + }, + { + "name": "unconfirmed_recovery_email_address_pattern", + "type": "string", + "description": "Pattern of the email address to which a confirmation email was sent" + } + ] + }, + { + "name": "passwordRecoveryInfo", + "description": "Contains information available to the user after requesting password recovery", + "class": "PasswordRecoveryInfo", + "properties": [ + { + "name": "recovery_email_address_pattern", + "type": "string", + "description": "Pattern of the email address to which a recovery email was sent" + } + ] + }, + { + "name": "recoveryEmailAddress", + "description": "Contains information about the current recovery email address", + "class": "RecoveryEmailAddress", + "properties": [ + { + "name": "recovery_email_address", + "type": "string", + "description": "Recovery email address" + } + ] + }, + { + "name": "temporaryPasswordState", + "description": "Returns information about the availability of a temporary password, which can be used for payments", + "class": "TemporaryPasswordState", + "properties": [ + { + "name": "has_password", + "type": "Bool", + "description": "True, if a temporary password is available" + }, + { + "name": "valid_for", + "type": "int32", + "description": "Time left before the temporary password expires, in seconds" + } + ] + }, + { + "name": "localFile", + "description": "Represents a local file", + "class": "LocalFile", + "properties": [ + { + "name": "path", + "type": "string", + "description": "Local path to the locally available file part; may be empty" + }, + { + "name": "can_be_downloaded", + "type": "Bool", + "description": "True, if it is possible to try to download or generate the file" + }, + { + "name": "can_be_deleted", + "type": "Bool", + "description": "True, if the file can be deleted" + }, + { + "name": "is_downloading_active", + "type": "Bool", + "description": "True, if the file is currently being downloaded (or a local copy is being generated by some other means)" + }, + { + "name": "is_downloading_completed", + "type": "Bool", + "description": "True, if the local copy is fully available" + }, + { + "name": "downloaded_prefix_size", + "type": "int32", + "description": "If is_downloading_completed is false, then only some prefix of the file is ready to be read. downloaded_prefix_size is the size of that prefix" + }, + { + "name": "downloaded_size", + "type": "int32", + "description": "Total downloaded file bytes. Should be used only for calculating download progress. The actual file size may be bigger, and some parts of it may contain garbage" + } + ] + }, + { + "name": "remoteFile", + "description": "Represents a remote file", + "class": "RemoteFile", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Remote file identifier, may be empty. Can be used across application restarts or even from other devices for the current user. If the ID starts with \"http://\" or \"https://\", it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known. If downloadFile is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the client with the HTTP URL in the original_path and \"#url#\" as the conversion string. Clients should generate the file by downloading it to the specified location" + }, + { + "name": "is_uploading_active", + "type": "Bool", + "description": "True, if the file is currently being uploaded (or a remote copy is being generated by some other means)" + }, + { + "name": "is_uploading_completed", + "type": "Bool", + "description": "True, if a remote copy is fully available" + }, + { + "name": "uploaded_size", + "type": "int32", + "description": "Size of the remote available part of the file; 0 if unknown" + } + ] + }, + { + "name": "file", + "description": "Represents a file", + "class": "File", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Unique file identifier" + }, + { + "name": "size", + "type": "int32", + "description": "File size; 0 if unknown" + }, + { + "name": "expected_size", + "type": "int32", + "description": "Expected file size in case the exact file size is unknown, but an approximate size is known. Can be used to show download/upload progress" + }, + { + "name": "local", + "type": "localFile", + "description": "Information about the local copy of the file" + }, + { + "name": "remote", + "type": "remoteFile", + "description": "Information about the remote copy of the file" + } + ] + }, + { + "name": "inputFileId", + "description": "A file defined by its unique ID", + "class": "InputFile", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Unique file identifier" + } + ] + }, + { + "name": "inputFileRemote", + "description": "A file defined by its remote ID", + "class": "InputFile", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Remote file identifier" + } + ] + }, + { + "name": "inputFileLocal", + "description": "A file defined by a local path", + "class": "InputFile", + "properties": [ + { + "name": "path", + "type": "string", + "description": "Local path to the file" + } + ] + }, + { + "name": "inputFileGenerated", + "description": "A file generated by the client", + "class": "InputFile", + "properties": [ + { + "name": "original_path", + "type": "string", + "description": "Local path to a file from which the file is generated, may be empty if there is no such file" + }, + { + "name": "conversion", + "type": "string", + "description": "String specifying the conversion applied to the original file; should be persistent across application restarts" + }, + { + "name": "expected_size", + "type": "int32", + "description": "Expected size of the generated file; 0 if unknown" + } + ] + }, + { + "name": "photoSize", + "description": "Photo description", + "class": "PhotoSize", + "properties": [ + { + "name": "type", + "type": "string", + "description": "Thumbnail type (see https://core.telegram.org/constructor/photoSize)" + }, + { + "name": "photo", + "type": "file", + "description": "Information about the photo file" + }, + { + "name": "width", + "type": "int32", + "description": "Photo width" + }, + { + "name": "height", + "type": "int32", + "description": "Photo height" + } + ] + }, + { + "name": "maskPointForehead", + "description": "A mask should be placed relatively to the forehead", + "class": "MaskPoint", + "properties": [] + }, + { + "name": "maskPointEyes", + "description": "A mask should be placed relatively to the eyes", + "class": "MaskPoint", + "properties": [] + }, + { + "name": "maskPointMouth", + "description": "A mask should be placed relatively to the mouth", + "class": "MaskPoint", + "properties": [] + }, + { + "name": "maskPointChin", + "description": "A mask should be placed relatively to the chin", + "class": "MaskPoint", + "properties": [] + }, + { + "name": "maskPosition", + "description": "Position on a photo where a mask should be placed", + "class": "MaskPosition", + "properties": [ + { + "name": "point", + "type": "MaskPoint", + "description": "Part of the face, relative to which the mask should be placed" + }, + { + "name": "x_shift", + "type": "double", + "description": "Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position)" + }, + { + "name": "y_shift", + "type": "double", + "description": "Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. (For example, 1.0 will place the mask just below the default mask position)" + }, + { + "name": "scale", + "type": "double", + "description": "Mask scaling coefficient. (For example, 2.0 means a doubled size)" + } + ] + }, + { + "name": "textEntity", + "description": "Represents a part of the text that needs to be formatted in some unusual way", + "class": "TextEntity", + "properties": [ + { + "name": "offset", + "type": "int32", + "description": "Offset of the entity in UTF-16 code points" + }, + { + "name": "length", + "type": "int32", + "description": "Length of the entity, in UTF-16 code points" + }, + { + "name": "type", + "type": "TextEntityType", + "description": "Type of the entity" + } + ] + }, + { + "name": "textEntities", + "description": "Contains a list of text entities", + "class": "TextEntities", + "properties": [ + { + "name": "entities", + "type": "vector\u003ctextEntity\u003e", + "description": "List of text entities" + } + ] + }, + { + "name": "formattedText", + "description": "A text with some entities", + "class": "FormattedText", + "properties": [ + { + "name": "text", + "type": "string", + "description": "The text" + }, + { + "name": "entities", + "type": "vector\u003ctextEntity\u003e", + "description": "Entities contained in the text" + } + ] + }, + { + "name": "animation", + "description": "Describes an animation file. The animation must be encoded in GIF or MPEG4 format", + "class": "Animation", + "properties": [ + { + "name": "duration", + "type": "int32", + "description": "Duration of the animation, in seconds; as defined by the sender" + }, + { + "name": "width", + "type": "int32", + "description": "Width of the animation" + }, + { + "name": "height", + "type": "int32", + "description": "Height of the animation" + }, + { + "name": "file_name", + "type": "string", + "description": "Original name of the file; as defined by the sender" + }, + { + "name": "mime_type", + "type": "string", + "description": "MIME type of the file, usually \"image/gif\" or \"video/mp4\"" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Animation thumbnail; may be null" + }, + { + "name": "animation", + "type": "file", + "description": "File containing the animation" + } + ] + }, + { + "name": "audio", + "description": "Describes an audio file. Audio is usually in MP3 format", + "class": "Audio", + "properties": [ + { + "name": "duration", + "type": "int32", + "description": "Duration of the audio, in seconds; as defined by the sender" + }, + { + "name": "title", + "type": "string", + "description": "Title of the audio; as defined by the sender" + }, + { + "name": "performer", + "type": "string", + "description": "Performer of the audio; as defined by the sender" + }, + { + "name": "file_name", + "type": "string", + "description": "Original name of the file; as defined by the sender" + }, + { + "name": "mime_type", + "type": "string", + "description": "The MIME type of the file; as defined by the sender" + }, + { + "name": "album_cover_thumbnail", + "type": "photoSize", + "description": "The thumbnail of the album cover; as defined by the sender. The full size thumbnail should be extracted from the downloaded file; may be null" + }, + { + "name": "audio", + "type": "file", + "description": "File containing the audio" + } + ] + }, + { + "name": "document", + "description": "Describes a document of any type", + "class": "Document", + "properties": [ + { + "name": "file_name", + "type": "string", + "description": "Original name of the file; as defined by the sender" + }, + { + "name": "mime_type", + "type": "string", + "description": "MIME type of the file; as defined by the sender" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Document thumbnail; as defined by the sender; may be null" + }, + { + "name": "document", + "type": "file", + "description": "File containing the document" + } + ] + }, + { + "name": "photo", + "description": "Describes a photo", + "class": "Photo", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Photo identifier; 0 for deleted photos" + }, + { + "name": "has_stickers", + "type": "Bool", + "description": "True, if stickers were added to the photo" + }, + { + "name": "sizes", + "type": "vector\u003cphotoSize\u003e", + "description": "Available variants of the photo, in different sizes" + } + ] + }, + { + "name": "sticker", + "description": "Describes a sticker", + "class": "Sticker", + "properties": [ + { + "name": "set_id", + "type": "int64", + "description": "The identifier of the sticker set to which the sticker belongs; 0 if none" + }, + { + "name": "width", + "type": "int32", + "description": "Sticker width; as defined by the sender" + }, + { + "name": "height", + "type": "int32", + "description": "Sticker height; as defined by the sender" + }, + { + "name": "emoji", + "type": "string", + "description": "Emoji corresponding to the sticker" + }, + { + "name": "is_mask", + "type": "Bool", + "description": "True, if the sticker is a mask" + }, + { + "name": "mask_position", + "type": "maskPosition", + "description": "Position where the mask should be placed; may be null" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Sticker thumbnail in WEBP or JPEG format; may be null" + }, + { + "name": "sticker", + "type": "file", + "description": "File containing the sticker" + } + ] + }, + { + "name": "video", + "description": "Describes a video file", + "class": "Video", + "properties": [ + { + "name": "duration", + "type": "int32", + "description": "Duration of the video, in seconds; as defined by the sender" + }, + { + "name": "width", + "type": "int32", + "description": "Video width; as defined by the sender" + }, + { + "name": "height", + "type": "int32", + "description": "Video height; as defined by the sender" + }, + { + "name": "file_name", + "type": "string", + "description": "Original name of the file; as defined by the sender" + }, + { + "name": "mime_type", + "type": "string", + "description": "MIME type of the file; as defined by the sender" + }, + { + "name": "has_stickers", + "type": "Bool", + "description": "True, if stickers were added to the photo" + }, + { + "name": "supports_streaming", + "type": "Bool", + "description": "True, if the video should be tried to be streamed" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Video thumbnail; as defined by the sender; may be null" + }, + { + "name": "video", + "type": "file", + "description": "File containing the video" + } + ] + }, + { + "name": "videoNote", + "description": "Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format", + "class": "VideoNote", + "properties": [ + { + "name": "duration", + "type": "int32", + "description": "Duration of the video, in seconds; as defined by the sender" + }, + { + "name": "length", + "type": "int32", + "description": "Video width and height; as defined by the sender" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Video thumbnail; as defined by the sender; may be null" + }, + { + "name": "video", + "type": "file", + "description": "File containing the video" + } + ] + }, + { + "name": "voiceNote", + "description": "Describes a voice note. The voice note must be encoded with the Opus codec, and stored inside an OGG container. Voice notes can have only a single audio channel", + "class": "VoiceNote", + "properties": [ + { + "name": "duration", + "type": "int32", + "description": "Duration of the voice note, in seconds; as defined by the sender" + }, + { + "name": "waveform", + "type": "bytes", + "description": "A waveform representation of the voice note in 5-bit format" + }, + { + "name": "mime_type", + "type": "string", + "description": "MIME type of the file; as defined by the sender" + }, + { + "name": "voice", + "type": "file", + "description": "File containing the voice note" + } + ] + }, + { + "name": "contact", + "description": "Describes a user contact", + "class": "Contact", + "properties": [ + { + "name": "phone_number", + "type": "string", + "description": "Phone number of the user" + }, + { + "name": "first_name", + "type": "string", + "description": "First name of the user; 1-255 characters in length" + }, + { + "name": "last_name", + "type": "string", + "description": "Last name of the user" + }, + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the user, if known; otherwise 0" + } + ] + }, + { + "name": "location", + "description": "Describes a location on planet Earth", + "class": "Location", + "properties": [ + { + "name": "latitude", + "type": "double", + "description": "Latitude of the location in degrees; as defined by the sender" + }, + { + "name": "longitude", + "type": "double", + "description": "Longitude of the location, in degrees; as defined by the sender" + } + ] + }, + { + "name": "venue", + "description": "Describes a venue", + "class": "Venue", + "properties": [ + { + "name": "location", + "type": "location", + "description": "Venue location; as defined by the sender" + }, + { + "name": "title", + "type": "string", + "description": "Venue name; as defined by the sender" + }, + { + "name": "address", + "type": "string", + "description": "Venue address; as defined by the sender" + }, + { + "name": "provider", + "type": "string", + "description": "Provider of the venue database; as defined by the sender. Currently only \"foursquare\" needs to be supported" + }, + { + "name": "id", + "type": "string", + "description": "Identifier of the venue in the provider database; as defined by the sender" + } + ] + }, + { + "name": "game", + "description": "Describes a game", + "class": "Game", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Game ID" + }, + { + "name": "short_name", + "type": "string", + "description": "Game short name. To share a game use the URL https://t.me/{bot_username}?game={game_short_name}" + }, + { + "name": "title", + "type": "string", + "description": "Game title" + }, + { + "name": "text", + "type": "formattedText", + "description": "Game text, usually containing scoreboards for a game" + }, + { + "name": "description", + "type": "string", + "description": "Game description" + }, + { + "name": "photo", + "type": "photo", + "description": "Game photo" + }, + { + "name": "animation", + "type": "animation", + "description": "Game animation; may be null" + } + ] + }, + { + "name": "profilePhoto", + "description": "Describes a user profile photo", + "class": "ProfilePhoto", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Photo identifier; 0 for an empty photo. Can be used to find a photo in a list of userProfilePhotos" + }, + { + "name": "small", + "type": "file", + "description": "A small (160x160) user profile photo" + }, + { + "name": "big", + "type": "file", + "description": "A big (640x640) user profile photo" + } + ] + }, + { + "name": "chatPhoto", + "description": "Describes the photo of a chat", + "class": "ChatPhoto", + "properties": [ + { + "name": "small", + "type": "file", + "description": "A small (160x160) chat photo" + }, + { + "name": "big", + "type": "file", + "description": "A big (640x640) chat photo" + } + ] + }, + { + "name": "linkStateNone", + "description": "The phone number of user A is not known to user B", + "class": "LinkState", + "properties": [] + }, + { + "name": "linkStateKnowsPhoneNumber", + "description": "The phone number of user A is known but that number has not been saved to the contacts list of user B", + "class": "LinkState", + "properties": [] + }, + { + "name": "linkStateIsContact", + "description": "The phone number of user A has been saved to the contacts list of user B", + "class": "LinkState", + "properties": [] + }, + { + "name": "userTypeRegular", + "description": "A regular user", + "class": "UserType", + "properties": [] + }, + { + "name": "userTypeDeleted", + "description": "A deleted user or deleted bot. No information on the user besides the user_id is available. It is not possible to perform any active actions on this type of user", + "class": "UserType", + "properties": [] + }, + { + "name": "userTypeBot", + "description": "A bot (see https://core.telegram.org/bots)", + "class": "UserType", + "properties": [ + { + "name": "can_join_groups", + "type": "Bool", + "description": "True, if the bot can be invited to basic group and supergroup chats" + }, + { + "name": "can_read_all_group_messages", + "type": "Bool", + "description": "True, if the bot can read all messages in basic group or supergroup chats and not just those addressed to the bot. In private and channel chats a bot can always read all messages" + }, + { + "name": "is_inline", + "type": "Bool", + "description": "True, if the bot supports inline queries" + }, + { + "name": "inline_query_placeholder", + "type": "string", + "description": "Placeholder for inline queries (displayed on the client input field)" + }, + { + "name": "need_location", + "type": "Bool", + "description": "True, if the location of the user should be sent with every inline query to this bot" + } + ] + }, + { + "name": "userTypeUnknown", + "description": "No information on the user besides the user_id is available, yet this user has not been deleted. This object is extremely rare and must be handled like a deleted user. It is not possible to perform any actions on users of this type", + "class": "UserType", + "properties": [] + }, + { + "name": "botCommand", + "description": "Represents commands supported by a bot", + "class": "BotCommand", + "properties": [ + { + "name": "command", + "type": "string", + "description": "Text of the bot command" + }, + { + "name": "description", + "type": "string", + "description": "Description of the bot command" + } + ] + }, + { + "name": "botInfo", + "description": "Provides information about a bot and its supported commands", + "class": "BotInfo", + "properties": [ + { + "name": "description", + "type": "string", + "description": "Long description shown on the user info page" + }, + { + "name": "commands", + "type": "vector\u003cbotCommand\u003e", + "description": "A list of commands supported by the bot" + } + ] + }, + { + "name": "user", + "description": "Represents a user", + "class": "User", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "first_name", + "type": "string", + "description": "First name of the user" + }, + { + "name": "last_name", + "type": "string", + "description": "Last name of the user" + }, + { + "name": "username", + "type": "string", + "description": "Username of the user" + }, + { + "name": "phone_number", + "type": "string", + "description": "Phone number of the user" + }, + { + "name": "status", + "type": "UserStatus", + "description": "Current online status of the user" + }, + { + "name": "profile_photo", + "type": "profilePhoto", + "description": "Profile photo of the user; may be null" + }, + { + "name": "outgoing_link", + "type": "LinkState", + "description": "Relationship from the current user to the other user" + }, + { + "name": "incoming_link", + "type": "LinkState", + "description": "Relationship from the other user to the current user" + }, + { + "name": "is_verified", + "type": "Bool", + "description": "True, if the user is verified" + }, + { + "name": "restriction_reason", + "type": "string", + "description": "If non-empty, it contains the reason why access to this user must be restricted. The format of the string is \"{type}: {description}\". {type} contains the type of the restriction and at least one of the suffixes \"-all\", \"-ios\", \"-android\", or \"-wp\", which describe the platforms on which access should be restricted. (For example, \"terms-ios-android\". {description} contains a human-readable description of the restriction, which can be shown to the user)" + }, + { + "name": "have_access", + "type": "Bool", + "description": "If false, the user is inaccessible, and the only information known about the user is inside this class. It can't be passed to any method except GetUser" + }, + { + "name": "type", + "type": "UserType", + "description": "Type of the user" + }, + { + "name": "language_code", + "type": "string", + "description": "IETF language tag of the user's language; only available to bots" + } + ] + }, + { + "name": "userFullInfo", + "description": "Contains full information about a user (except the full list of profile photos)", + "class": "UserFullInfo", + "properties": [ + { + "name": "is_blocked", + "type": "Bool", + "description": "True, if the user is blacklisted by the current user" + }, + { + "name": "can_be_called", + "type": "Bool", + "description": "True, if the user can be called" + }, + { + "name": "has_private_calls", + "type": "Bool", + "description": "True, if the user can't be called due to their privacy settings" + }, + { + "name": "bio", + "type": "string", + "description": "A short user bio" + }, + { + "name": "share_text", + "type": "string", + "description": "For bots, the text that is included with the link when users share the bot" + }, + { + "name": "group_in_common_count", + "type": "int32", + "description": "Number of group chats where both the other user and the current user are a member; 0 for the current user" + }, + { + "name": "bot_info", + "type": "botInfo", + "description": "If the user is a bot, information about the bot; may be null" + } + ] + }, + { + "name": "userProfilePhotos", + "description": "Contains part of the list of user photos", + "class": "UserProfilePhotos", + "properties": [ + { + "name": "total_count", + "type": "int32", + "description": "Total number of user profile photos" + }, + { + "name": "photos", + "type": "vector\u003cphoto\u003e", + "description": "A list of photos" + } + ] + }, + { + "name": "users", + "description": "Represents a list of users", + "class": "Users", + "properties": [ + { + "name": "total_count", + "type": "int32", + "description": "Approximate total count of users found" + }, + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "A list of user identifiers" + } + ] + }, + { + "name": "chatMemberStatusCreator", + "description": "The user is the creator of a chat and has all the administrator privileges", + "class": "ChatMemberStatus", + "properties": [ + { + "name": "is_member", + "type": "Bool", + "description": "True, if the user is a member of the chat" + } + ] + }, + { + "name": "chatMemberStatusAdministrator", + "description": "The user is a member of a chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, and ban unprivileged members. In supergroups and channels, there are more detailed options for administrator privileges", + "class": "ChatMemberStatus", + "properties": [ + { + "name": "can_be_edited", + "type": "Bool", + "description": "True, if the current user can edit the administrator privileges for the called user" + }, + { + "name": "can_change_info", + "type": "Bool", + "description": "True, if the administrator can change the chat title, photo, and other settings" + }, + { + "name": "can_post_messages", + "type": "Bool", + "description": "True, if the administrator can create channel posts; applicable to channels only" + }, + { + "name": "can_edit_messages", + "type": "Bool", + "description": "True, if the administrator can edit messages of other users and pin messages; applicable to channels only" + }, + { + "name": "can_delete_messages", + "type": "Bool", + "description": "True, if the administrator can delete messages of other users" + }, + { + "name": "can_invite_users", + "type": "Bool", + "description": "True, if the administrator can invite new users to the chat" + }, + { + "name": "can_restrict_members", + "type": "Bool", + "description": "True, if the administrator can restrict, ban, or unban chat members" + }, + { + "name": "can_pin_messages", + "type": "Bool", + "description": "True, if the administrator can pin messages; applicable to supergroups only" + }, + { + "name": "can_promote_members", + "type": "Bool", + "description": "True, if the administrator can add new administrators with a subset of his own privileges or demote administrators that were directly or indirectly promoted by him" + } + ] + }, + { + "name": "chatMemberStatusMember", + "description": "The user is a member of a chat, without any additional privileges or restrictions", + "class": "ChatMemberStatus", + "properties": [] + }, + { + "name": "chatMemberStatusRestricted", + "description": "The user is under certain restrictions in the chat. Not supported in basic groups and channels", + "class": "ChatMemberStatus", + "properties": [ + { + "name": "is_member", + "type": "Bool", + "description": "True, if the user is a member of the chat" + }, + { + "name": "restricted_until_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when restrictions will be lifted from the user; 0 if never. If the user is restricted for more than 366 days or for less than 30 seconds from the current time, the user is considered to be restricted forever" + }, + { + "name": "can_send_messages", + "type": "Bool", + "description": "True, if the user can send text messages, contacts, locations, and venues" + }, + { + "name": "can_send_media_messages", + "type": "Bool", + "description": "True, if the user can send audio files, documents, photos, videos, video notes, and voice notes. Implies can_send_messages permissions" + }, + { + "name": "can_send_other_messages", + "type": "Bool", + "description": "True, if the user can send animations, games, and stickers and use inline bots. Implies can_send_media_messages permissions" + }, + { + "name": "can_add_web_page_previews", + "type": "Bool", + "description": "True, if the user may add a web page preview to his messages. Implies can_send_messages permissions" + } + ] + }, + { + "name": "chatMemberStatusLeft", + "description": "The user is not a chat member", + "class": "ChatMemberStatus", + "properties": [] + }, + { + "name": "chatMemberStatusBanned", + "description": "The user was banned (and hence is not a member of the chat). Implies the user can't return to the chat or view messages", + "class": "ChatMemberStatus", + "properties": [ + { + "name": "banned_until_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever" + } + ] + }, + { + "name": "chatMember", + "description": "A user with information about joining/leaving a chat", + "class": "ChatMember", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier of the chat member" + }, + { + "name": "inviter_user_id", + "type": "int32", + "description": "Identifier of a user that invited/promoted/banned this member in the chat; 0 if unknown" + }, + { + "name": "joined_chat_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the user joined a chat" + }, + { + "name": "status", + "type": "ChatMemberStatus", + "description": "Status of the member in the chat" + }, + { + "name": "bot_info", + "type": "botInfo", + "description": "If the user is a bot, information about the bot; may be null. Can be null even for a bot if the bot is not a chat member" + } + ] + }, + { + "name": "chatMembers", + "description": "Contains a list of chat members", + "class": "ChatMembers", + "properties": [ + { + "name": "total_count", + "type": "int32", + "description": "Approximate total count of chat members found" + }, + { + "name": "members", + "type": "vector\u003cchatMember\u003e", + "description": "A list of chat members" + } + ] + }, + { + "name": "supergroupMembersFilterRecent", + "description": "Returns recently active users in reverse chronological order", + "class": "SupergroupMembersFilter", + "properties": [] + }, + { + "name": "supergroupMembersFilterAdministrators", + "description": "Returns the creator and administrators", + "class": "SupergroupMembersFilter", + "properties": [] + }, + { + "name": "supergroupMembersFilterSearch", + "description": "Used to search for supergroup or channel members via a (string) query", + "class": "SupergroupMembersFilter", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for" + } + ] + }, + { + "name": "supergroupMembersFilterRestricted", + "description": "Returns restricted supergroup members; can be used only by administrators", + "class": "SupergroupMembersFilter", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for" + } + ] + }, + { + "name": "supergroupMembersFilterBanned", + "description": "Returns users banned from the supergroup or channel; can be used only by administrators", + "class": "SupergroupMembersFilter", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for" + } + ] + }, + { + "name": "supergroupMembersFilterBots", + "description": "Returns bot members of the supergroup or channel", + "class": "SupergroupMembersFilter", + "properties": [] + }, + { + "name": "basicGroup", + "description": "Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users)", + "class": "BasicGroup", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Group identifier" + }, + { + "name": "member_count", + "type": "int32", + "description": "Number of members in the group" + }, + { + "name": "status", + "type": "ChatMemberStatus", + "description": "Status of the current user in the group" + }, + { + "name": "everyone_is_administrator", + "type": "Bool", + "description": "True, if all members have been granted administrator rights in the group" + }, + { + "name": "is_active", + "type": "Bool", + "description": "True, if the group is active" + }, + { + "name": "upgraded_to_supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup to which this group was upgraded; 0 if none" + } + ] + }, + { + "name": "basicGroupFullInfo", + "description": "Contains full information about a basic group", + "class": "BasicGroupFullInfo", + "properties": [ + { + "name": "creator_user_id", + "type": "int32", + "description": "User identifier of the creator of the group; 0 if unknown" + }, + { + "name": "members", + "type": "vector\u003cchatMember\u003e", + "description": "Group members" + }, + { + "name": "invite_link", + "type": "string", + "description": "Invite link for this group; available only for the group creator and only after it has been generated at least once" + } + ] + }, + { + "name": "supergroup", + "description": "Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers", + "class": "Supergroup", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Supergroup or channel identifier" + }, + { + "name": "username", + "type": "string", + "description": "Username of the supergroup or channel; empty for private supergroups or channels" + }, + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the current user joined, or the point in time when the supergroup or channel was created, in case the user is not a member" + }, + { + "name": "status", + "type": "ChatMemberStatus", + "description": "Status of the current user in the supergroup or channel" + }, + { + "name": "member_count", + "type": "int32", + "description": "Member count; 0 if unknown. Currently it is guaranteed to be known only if the supergroup or channel was found through SearchPublicChats" + }, + { + "name": "anyone_can_invite", + "type": "Bool", + "description": "True, if any member of the supergroup can invite other members. This field has no meaning for channels" + }, + { + "name": "sign_messages", + "type": "Bool", + "description": "True, if messages sent to the channel should contain information about the sender. This field is only applicable to channels" + }, + { + "name": "is_channel", + "type": "Bool", + "description": "True, if the supergroup is a channel" + }, + { + "name": "is_verified", + "type": "Bool", + "description": "True, if the supergroup or channel is verified" + }, + { + "name": "restriction_reason", + "type": "string", + "description": "If non-empty, contains the reason why access to this supergroup or channel must be restricted. Format of the string is \"{type}: {description}\". {type} Contains the type of the restriction and at least one of the suffixes \"-all\", \"-ios\", \"-android\", or \"-wp\", which describe the platforms on which access should be restricted. (For example, \"terms-ios-android\". {description} contains a human-readable description of the restriction, which can be shown to the user)" + } + ] + }, + { + "name": "supergroupFullInfo", + "description": "Contains full information about a supergroup or channel", + "class": "SupergroupFullInfo", + "properties": [ + { + "name": "description", + "type": "string", + "description": "Supergroup or channel description" + }, + { + "name": "member_count", + "type": "int32", + "description": "Number of members in the supergroup or channel; 0 if unknown" + }, + { + "name": "administrator_count", + "type": "int32", + "description": "Number of privileged users in the supergroup or channel; 0 if unknown" + }, + { + "name": "restricted_count", + "type": "int32", + "description": "Number of restricted users in the supergroup; 0 if unknown" + }, + { + "name": "banned_count", + "type": "int32", + "description": "Number of users banned from chat; 0 if unknown" + }, + { + "name": "can_get_members", + "type": "Bool", + "description": "True, if members of the chat can be retrieved" + }, + { + "name": "can_set_username", + "type": "Bool", + "description": "True, if the chat can be made public" + }, + { + "name": "can_set_sticker_set", + "type": "Bool", + "description": "True, if the supergroup sticker set can be changed" + }, + { + "name": "is_all_history_available", + "type": "Bool", + "description": "True, if new chat members will have access to old messages. In public supergroups and both public and private channels, old messages are always available, so this option affects only private supergroups. The value of this field is only available for chat administrators" + }, + { + "name": "sticker_set_id", + "type": "int64", + "description": "Identifier of the supergroup sticker set; 0 if none" + }, + { + "name": "invite_link", + "type": "string", + "description": "Invite link for this chat" + }, + { + "name": "pinned_message_id", + "type": "int53", + "description": "Identifier of the pinned message in the chat; 0 if none" + }, + { + "name": "upgraded_from_basic_group_id", + "type": "int32", + "description": "Identifier of the basic group from which supergroup was upgraded; 0 if none" + }, + { + "name": "upgraded_from_max_message_id", + "type": "int53", + "description": "Identifier of the last message in the basic group from which supergroup was upgraded; 0 if none" + } + ] + }, + { + "name": "secretChatStatePending", + "description": "The secret chat is not yet created; waiting for the other user to get online", + "class": "SecretChatState", + "properties": [] + }, + { + "name": "secretChatStateReady", + "description": "The secret chat is ready to use", + "class": "SecretChatState", + "properties": [] + }, + { + "name": "secretChatStateClosed", + "description": "The secret chat is closed", + "class": "SecretChatState", + "properties": [] + }, + { + "name": "secretChat", + "description": "Represents a secret chat", + "class": "SecretChat", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Secret chat identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the chat partner" + }, + { + "name": "state", + "type": "SecretChatState", + "description": "State of the secret chat" + }, + { + "name": "is_outbound", + "type": "Bool", + "description": "True, if the chat was created by the current user; otherwise false" + }, + { + "name": "ttl", + "type": "int32", + "description": "Current message Time To Live setting (self-destruct timer) for the chat, in seconds" + }, + { + "name": "key_hash", + "type": "bytes", + "description": "Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 bytes, which must be used to make a 12x12 square image with a color depth of 4. The first 16 bytes should be used to make a central 8x8 square, while the remaining 20 bytes should be used to construct a 2-pixel-wide border around that square. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers" + }, + { + "name": "layer", + "type": "int32", + "description": "Secret chat layer; determines features supported by the other client. Video notes are supported if the layer \u003e= 66" + } + ] + }, + { + "name": "messageForwardedFromUser", + "description": "The message was originally written by a known user", + "class": "MessageForwardInfo", + "properties": [ + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user that originally sent this message" + }, + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the message was originally sent" + }, + { + "name": "forwarded_from_chat_id", + "type": "int53", + "description": "For messages forwarded to the chat with the current user (saved messages), the identifier of the chat from which the message was forwarded; 0 if unknown" + }, + { + "name": "forwarded_from_message_id", + "type": "int53", + "description": "For messages forwarded to the chat with the current user (saved messages) the identifier of the original message from which the new message was forwarded; 0 if unknown" + } + ] + }, + { + "name": "messageForwardedPost", + "description": "The message was originally a post in a channel", + "class": "MessageForwardInfo", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat from which the message was forwarded" + }, + { + "name": "author_signature", + "type": "string", + "description": "Post author signature" + }, + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the message was originally sent" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier of the original message from which the new message was forwarded; 0 if unknown" + }, + { + "name": "forwarded_from_chat_id", + "type": "int53", + "description": "For messages forwarded to the chat with the current user (saved messages), the identifier of the chat from which the message was forwarded; 0 if unknown" + }, + { + "name": "forwarded_from_message_id", + "type": "int53", + "description": "For messages forwarded to the chat with the current user (saved messages), the identifier of the original message from which the new message was forwarded; 0 if unknown" + } + ] + }, + { + "name": "messageSendingStatePending", + "description": "The message is being sent now, but has not yet been delivered to the server", + "class": "MessageSendingState", + "properties": [] + }, + { + "name": "messageSendingStateFailed", + "description": "The message failed to be sent", + "class": "MessageSendingState", + "properties": [] + }, + { + "name": "message", + "description": "Describes a message", + "class": "Message", + "properties": [ + { + "name": "id", + "type": "int53", + "description": "Unique message identifier" + }, + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user who sent the message; 0 if unknown. It is unknown for channel posts" + }, + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "sending_state", + "type": "MessageSendingState", + "description": "Information about the sending state of the message; may be null" + }, + { + "name": "is_outgoing", + "type": "Bool", + "description": "True, if the message is outgoing" + }, + { + "name": "can_be_edited", + "type": "Bool", + "description": "True, if the message can be edited" + }, + { + "name": "can_be_forwarded", + "type": "Bool", + "description": "True, if the message can be forwarded" + }, + { + "name": "can_be_deleted_only_for_self", + "type": "Bool", + "description": "True, if the message can be deleted only for the current user while other users will continue to see it" + }, + { + "name": "can_be_deleted_for_all_users", + "type": "Bool", + "description": "True, if the message can be deleted for all users" + }, + { + "name": "is_channel_post", + "type": "Bool", + "description": "True, if the message is a channel post. All messages to channels are channel posts, all other messages are not channel posts" + }, + { + "name": "contains_unread_mention", + "type": "Bool", + "description": "True, if the message contains an unread mention for the current user" + }, + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the message was sent" + }, + { + "name": "edit_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the message was last edited" + }, + { + "name": "forward_info", + "type": "MessageForwardInfo", + "description": "Information about the initial message sender; may be null" + }, + { + "name": "reply_to_message_id", + "type": "int53", + "description": "If non-zero, the identifier of the message this message is replying to; can be the identifier of a deleted message" + }, + { + "name": "ttl", + "type": "int32", + "description": "For self-destructing messages, the message's TTL (Time To Live), in seconds; 0 if none. TDLib will send updateDeleteMessages or updateMessageContent once the TTL expires" + }, + { + "name": "ttl_expires_in", + "type": "double", + "description": "Time left before the message expires, in seconds" + }, + { + "name": "via_bot_user_id", + "type": "int32", + "description": "If non-zero, the user identifier of the bot through which this message was sent" + }, + { + "name": "author_signature", + "type": "string", + "description": "For channel posts, optional author signature" + }, + { + "name": "views", + "type": "int32", + "description": "Number of times this message was viewed" + }, + { + "name": "media_album_id", + "type": "int64", + "description": "Unique identifier of an album this message belongs to. Only photos and videos can be grouped together in albums" + }, + { + "name": "content", + "type": "MessageContent", + "description": "Content of the message" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "Reply markup for the message; may be null" + } + ] + }, + { + "name": "messages", + "description": "Contains a list of messages", + "class": "Messages", + "properties": [ + { + "name": "total_count", + "type": "int32", + "description": "Approximate total count of messages found" + }, + { + "name": "messages", + "type": "vector\u003cmessage\u003e", + "description": "List of messages; messages may be null" + } + ] + }, + { + "name": "foundMessages", + "description": "Contains a list of messages found by a search", + "class": "FoundMessages", + "properties": [ + { + "name": "messages", + "type": "vector\u003cmessage\u003e", + "description": "List of messages" + }, + { + "name": "next_from_search_id", + "type": "int64", + "description": "Value to pass as from_search_id to get more results" + } + ] + }, + { + "name": "notificationSettingsScopeChat", + "description": "Notification settings applied to a particular chat", + "class": "NotificationSettingsScope", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ] + }, + { + "name": "notificationSettingsScopePrivateChats", + "description": "Notification settings applied to all private chats", + "class": "NotificationSettingsScope", + "properties": [] + }, + { + "name": "notificationSettingsScopeBasicGroupChats", + "description": "Notification settings applied to all basic groups and channels. (Supergroups have no common settings)", + "class": "NotificationSettingsScope", + "properties": [] + }, + { + "name": "notificationSettingsScopeAllChats", + "description": "Notification settings applied to all chats", + "class": "NotificationSettingsScope", + "properties": [] + }, + { + "name": "notificationSettings", + "description": "Contains information about notification settings for a chat or several chats", + "class": "NotificationSettings", + "properties": [ + { + "name": "mute_for", + "type": "int32", + "description": "Time left before notifications will be unmuted, in seconds" + }, + { + "name": "sound", + "type": "string", + "description": "An audio file name for notification sounds; only applies to iOS applications" + }, + { + "name": "show_preview", + "type": "Bool", + "description": "True, if message content should be displayed in notifications" + } + ] + }, + { + "name": "draftMessage", + "description": "Contains information about a message draft", + "class": "DraftMessage", + "properties": [ + { + "name": "reply_to_message_id", + "type": "int53", + "description": "Identifier of the message to reply to; 0 if none" + }, + { + "name": "input_message_text", + "type": "InputMessageContent", + "description": "Content of the message draft; this should always be of type inputMessageText" + } + ] + }, + { + "name": "chatTypePrivate", + "description": "An ordinary chat with a user", + "class": "ChatType", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ] + }, + { + "name": "chatTypeBasicGroup", + "description": "A basic group (i.e., a chat with 0-200 other users)", + "class": "ChatType", + "properties": [ + { + "name": "basic_group_id", + "type": "int32", + "description": "Basic group identifier" + } + ] + }, + { + "name": "chatTypeSupergroup", + "description": "A supergroup (i.e. a chat with up to GetOption(\"supergroup_max_size\") other users), or channel (with unlimited members)", + "class": "ChatType", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Supergroup or channel identifier" + }, + { + "name": "is_channel", + "type": "Bool", + "description": "True, if the supergroup is a channel" + } + ] + }, + { + "name": "chatTypeSecret", + "description": "A secret chat with a user", + "class": "ChatType", + "properties": [ + { + "name": "secret_chat_id", + "type": "int32", + "description": "Secret chat identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier of the secret chat peer" + } + ] + }, + { + "name": "chat", + "description": "A chat. (Can be a private chat, basic group, supergroup, or secret chat)", + "class": "Chat", + "properties": [ + { + "name": "id", + "type": "int53", + "description": "Chat unique identifier" + }, + { + "name": "type", + "type": "ChatType", + "description": "Type of the chat" + }, + { + "name": "title", + "type": "string", + "description": "Chat title" + }, + { + "name": "photo", + "type": "chatPhoto", + "description": "Chat photo; may be null" + }, + { + "name": "last_message", + "type": "message", + "description": "Last message in the chat; may be null" + }, + { + "name": "order", + "type": "int64", + "description": "Descending parameter by which chats are sorted in the main chat list. If the order number of two chats is the same, they must be sorted in descending order by ID. If 0, the position of the chat in the list is undetermined" + }, + { + "name": "is_pinned", + "type": "Bool", + "description": "True, if the chat is pinned" + }, + { + "name": "can_be_reported", + "type": "Bool", + "description": "True, if the chat can be reported to Telegram moderators through reportChat" + }, + { + "name": "unread_count", + "type": "int32", + "description": "Number of unread messages in the chat" + }, + { + "name": "last_read_inbox_message_id", + "type": "int53", + "description": "Identifier of the last read incoming message" + }, + { + "name": "last_read_outbox_message_id", + "type": "int53", + "description": "Identifier of the last read outgoing message" + }, + { + "name": "unread_mention_count", + "type": "int32", + "description": "Number of unread messages with a mention/reply in the chat" + }, + { + "name": "notification_settings", + "type": "notificationSettings", + "description": "Notification settings for this chat" + }, + { + "name": "reply_markup_message_id", + "type": "int53", + "description": "Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat" + }, + { + "name": "draft_message", + "type": "draftMessage", + "description": "A draft of a message in the chat; may be null" + }, + { + "name": "client_data", + "type": "string", + "description": "Contains client-specific data associated with the chat. (For example, the chat position or local chat notification settings can be stored here.) Persistent if a message database is used" + } + ] + }, + { + "name": "chats", + "description": "Represents a list of chats", + "class": "Chats", + "properties": [ + { + "name": "chat_ids", + "type": "vector\u003cint53\u003e", + "description": "List of chat identifiers" + } + ] + }, + { + "name": "chatInviteLink", + "description": "Contains a chat invite link", + "class": "ChatInviteLink", + "properties": [ + { + "name": "invite_link", + "type": "string", + "description": "Chat invite link" + } + ] + }, + { + "name": "chatInviteLinkInfo", + "description": "Contains information about a chat invite link", + "class": "ChatInviteLinkInfo", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier of the invite link; 0 if the user is not a member of this chat" + }, + { + "name": "type", + "type": "ChatType", + "description": "Contains information about the type of the chat" + }, + { + "name": "title", + "type": "string", + "description": "Title of the chat" + }, + { + "name": "photo", + "type": "chatPhoto", + "description": "Chat photo; may be null" + }, + { + "name": "member_count", + "type": "int32", + "description": "Number of members" + }, + { + "name": "member_user_ids", + "type": "vector\u003cint32\u003e", + "description": "User identifiers of some chat members that may be known to the current user" + }, + { + "name": "is_public", + "type": "Bool", + "description": "True, if the chat is a public supergroup or channel with a username" + } + ] + }, + { + "name": "keyboardButtonTypeText", + "description": "A simple button, with text that should be sent when the button is pressed", + "class": "KeyboardButtonType", + "properties": [] + }, + { + "name": "keyboardButtonTypeRequestPhoneNumber", + "description": "A button that sends the user's phone number when pressed; available only in private chats", + "class": "KeyboardButtonType", + "properties": [] + }, + { + "name": "keyboardButtonTypeRequestLocation", + "description": "A button that sends the user's location when pressed; available only in private chats", + "class": "KeyboardButtonType", + "properties": [] + }, + { + "name": "keyboardButton", + "description": "Represents a single button in a bot keyboard", + "class": "KeyboardButton", + "properties": [ + { + "name": "text", + "type": "string", + "description": "Text of the button" + }, + { + "name": "type", + "type": "KeyboardButtonType", + "description": "Type of the button" + } + ] + }, + { + "name": "inlineKeyboardButtonTypeUrl", + "description": "A button that opens a specified URL", + "class": "InlineKeyboardButtonType", + "properties": [ + { + "name": "url", + "type": "string", + "description": "URL to open" + } + ] + }, + { + "name": "inlineKeyboardButtonTypeCallback", + "description": "A button that sends a special callback query to a bot", + "class": "InlineKeyboardButtonType", + "properties": [ + { + "name": "data", + "type": "bytes", + "description": "Data to be sent to the bot via a callback query" + } + ] + }, + { + "name": "inlineKeyboardButtonTypeCallbackGame", + "description": "A button with a game that sends a special callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame", + "class": "InlineKeyboardButtonType", + "properties": [] + }, + { + "name": "inlineKeyboardButtonTypeSwitchInline", + "description": "A button that forces an inline query to the bot to be inserted in the input field", + "class": "InlineKeyboardButtonType", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Inline query to be sent to the bot" + }, + { + "name": "in_current_chat", + "type": "Bool", + "description": "True, if the inline query should be sent from the current chat" + } + ] + }, + { + "name": "inlineKeyboardButtonTypeBuy", + "description": "A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice", + "class": "InlineKeyboardButtonType", + "properties": [] + }, + { + "name": "inlineKeyboardButton", + "description": "Represents a single button in an inline keyboard", + "class": "InlineKeyboardButton", + "properties": [ + { + "name": "text", + "type": "string", + "description": "Text of the button" + }, + { + "name": "type", + "type": "InlineKeyboardButtonType", + "description": "Type of the button" + } + ] + }, + { + "name": "replyMarkupRemoveKeyboard", + "description": "Instructs clients to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, UpdateChatReplyMarkup with message_id == 0 will be sent", + "class": "ReplyMarkup", + "properties": [ + { + "name": "is_personal", + "type": "Bool", + "description": "True, if the keyboard is removed only for the mentioned users or the target user of a reply" + } + ] + }, + { + "name": "replyMarkupForceReply", + "description": "Instructs clients to force a reply to this message", + "class": "ReplyMarkup", + "properties": [ + { + "name": "is_personal", + "type": "Bool", + "description": "True, if a forced reply must automatically be shown to the current user. For outgoing messages, specify true to show the forced reply only for the mentioned users and for the target user of a reply" + } + ] + }, + { + "name": "replyMarkupShowKeyboard", + "description": "Contains a custom keyboard layout to quickly reply to bots", + "class": "ReplyMarkup", + "properties": [ + { + "name": "rows", + "type": "vector\u003cvector\u003ckeyboardButton\u003e\u003e", + "description": "A list of rows of bot keyboard buttons" + }, + { + "name": "resize_keyboard", + "type": "Bool", + "description": "True, if the client needs to resize the keyboard vertically" + }, + { + "name": "one_time", + "type": "Bool", + "description": "True, if the client needs to hide the keyboard after use" + }, + { + "name": "is_personal", + "type": "Bool", + "description": "True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply" + } + ] + }, + { + "name": "replyMarkupInlineKeyboard", + "description": "Contains an inline keyboard layout", + "class": "ReplyMarkup", + "properties": [ + { + "name": "rows", + "type": "vector\u003cvector\u003cinlineKeyboardButton\u003e\u003e", + "description": "A list of rows of inline keyboard buttons" + } + ] + }, + { + "name": "richTextPlain", + "description": "A plain text", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "string", + "description": "Text" + } + ] + }, + { + "name": "richTextBold", + "description": "A bold rich text", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Text" + } + ] + }, + { + "name": "richTextItalic", + "description": "An italicized rich text", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Text" + } + ] + }, + { + "name": "richTextUnderline", + "description": "An underlined rich text", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Text" + } + ] + }, + { + "name": "richTextStrikethrough", + "description": "A strike-through rich text", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Text" + } + ] + }, + { + "name": "richTextFixed", + "description": "A fixed-width rich text", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Text" + } + ] + }, + { + "name": "richTextUrl", + "description": "A rich text URL link", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Text" + }, + { + "name": "url", + "type": "string", + "description": "URL" + } + ] + }, + { + "name": "richTextEmailAddress", + "description": "A rich text email link", + "class": "RichText", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Text" + }, + { + "name": "email_address", + "type": "string", + "description": "Email address" + } + ] + }, + { + "name": "richTexts", + "description": "A concatenation of rich texts", + "class": "RichText", + "properties": [ + { + "name": "texts", + "type": "vector\u003cRichText\u003e", + "description": "Texts" + } + ] + }, + { + "name": "pageBlockTitle", + "description": "The title of a page", + "class": "PageBlock", + "properties": [ + { + "name": "title", + "type": "RichText", + "description": "Title" + } + ] + }, + { + "name": "pageBlockSubtitle", + "description": "The subtitle of a page", + "class": "PageBlock", + "properties": [ + { + "name": "subtitle", + "type": "RichText", + "description": "Subtitle" + } + ] + }, + { + "name": "pageBlockAuthorDate", + "description": "The author and publishing date of a page", + "class": "PageBlock", + "properties": [ + { + "name": "author", + "type": "RichText", + "description": "Author" + }, + { + "name": "publish_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the article was published; 0 if unknown" + } + ] + }, + { + "name": "pageBlockHeader", + "description": "A header", + "class": "PageBlock", + "properties": [ + { + "name": "header", + "type": "RichText", + "description": "Header" + } + ] + }, + { + "name": "pageBlockSubheader", + "description": "A subheader", + "class": "PageBlock", + "properties": [ + { + "name": "subheader", + "type": "RichText", + "description": "Subheader" + } + ] + }, + { + "name": "pageBlockParagraph", + "description": "A text paragraph", + "class": "PageBlock", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Paragraph text" + } + ] + }, + { + "name": "pageBlockPreformatted", + "description": "A preformatted text paragraph", + "class": "PageBlock", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Paragraph text" + }, + { + "name": "language", + "type": "string", + "description": "Programming language for which the text should be formatted" + } + ] + }, + { + "name": "pageBlockFooter", + "description": "The footer of a page", + "class": "PageBlock", + "properties": [ + { + "name": "footer", + "type": "RichText", + "description": "Footer" + } + ] + }, + { + "name": "pageBlockDivider", + "description": "An empty block separating a page", + "class": "PageBlock", + "properties": [] + }, + { + "name": "pageBlockAnchor", + "description": "An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor", + "class": "PageBlock", + "properties": [ + { + "name": "name", + "type": "string", + "description": "Name of the anchor" + } + ] + }, + { + "name": "pageBlockList", + "description": "A list of texts", + "class": "PageBlock", + "properties": [ + { + "name": "items", + "type": "vector\u003cRichText\u003e", + "description": "Texts" + }, + { + "name": "is_ordered", + "type": "Bool", + "description": "True, if the items should be marked with numbers" + } + ] + }, + { + "name": "pageBlockBlockQuote", + "description": "A block quote", + "class": "PageBlock", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Quote text" + }, + { + "name": "caption", + "type": "RichText", + "description": "Quote caption" + } + ] + }, + { + "name": "pageBlockPullQuote", + "description": "A pull quote", + "class": "PageBlock", + "properties": [ + { + "name": "text", + "type": "RichText", + "description": "Quote text" + }, + { + "name": "caption", + "type": "RichText", + "description": "Quote caption" + } + ] + }, + { + "name": "pageBlockAnimation", + "description": "An animation", + "class": "PageBlock", + "properties": [ + { + "name": "animation", + "type": "animation", + "description": "Animation file; may be null" + }, + { + "name": "caption", + "type": "RichText", + "description": "Animation caption" + }, + { + "name": "need_autoplay", + "type": "Bool", + "description": "True, if the animation should be played automatically" + } + ] + }, + { + "name": "pageBlockAudio", + "description": "An audio file", + "class": "PageBlock", + "properties": [ + { + "name": "audio", + "type": "audio", + "description": "Audio file; may be null" + }, + { + "name": "caption", + "type": "RichText", + "description": "Audio file caption" + } + ] + }, + { + "name": "pageBlockPhoto", + "description": "A photo", + "class": "PageBlock", + "properties": [ + { + "name": "photo", + "type": "photo", + "description": "Photo file; may be null" + }, + { + "name": "caption", + "type": "RichText", + "description": "Photo caption" + } + ] + }, + { + "name": "pageBlockVideo", + "description": "A video", + "class": "PageBlock", + "properties": [ + { + "name": "video", + "type": "video", + "description": "Video file; may be null" + }, + { + "name": "caption", + "type": "RichText", + "description": "Video caption" + }, + { + "name": "need_autoplay", + "type": "Bool", + "description": "True, if the video should be played automatically" + }, + { + "name": "is_looped", + "type": "Bool", + "description": "True, if the video should be looped" + } + ] + }, + { + "name": "pageBlockCover", + "description": "A page cover", + "class": "PageBlock", + "properties": [ + { + "name": "cover", + "type": "PageBlock", + "description": "Cover" + } + ] + }, + { + "name": "pageBlockEmbedded", + "description": "An embedded web page", + "class": "PageBlock", + "properties": [ + { + "name": "url", + "type": "string", + "description": "Web page URL, if available" + }, + { + "name": "html", + "type": "string", + "description": "HTML-markup of the embedded page" + }, + { + "name": "poster_photo", + "type": "photo", + "description": "Poster photo, if available; may be null" + }, + { + "name": "width", + "type": "int32", + "description": "Block width" + }, + { + "name": "height", + "type": "int32", + "description": "Block height" + }, + { + "name": "caption", + "type": "RichText", + "description": "Block caption" + }, + { + "name": "is_full_width", + "type": "Bool", + "description": "True, if the block should be full width" + }, + { + "name": "allow_scrolling", + "type": "Bool", + "description": "True, if scrolling should be allowed" + } + ] + }, + { + "name": "pageBlockEmbeddedPost", + "description": "An embedded post", + "class": "PageBlock", + "properties": [ + { + "name": "url", + "type": "string", + "description": "Web page URL" + }, + { + "name": "author", + "type": "string", + "description": "Post author" + }, + { + "name": "author_photo", + "type": "photo", + "description": "Post author photo" + }, + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the post was created; 0 if unknown" + }, + { + "name": "page_blocks", + "type": "vector\u003cPageBlock\u003e", + "description": "Post content" + }, + { + "name": "caption", + "type": "RichText", + "description": "Post caption" + } + ] + }, + { + "name": "pageBlockCollage", + "description": "A collage", + "class": "PageBlock", + "properties": [ + { + "name": "page_blocks", + "type": "vector\u003cPageBlock\u003e", + "description": "Collage item contents" + }, + { + "name": "caption", + "type": "RichText", + "description": "Block caption" + } + ] + }, + { + "name": "pageBlockSlideshow", + "description": "A slideshow", + "class": "PageBlock", + "properties": [ + { + "name": "page_blocks", + "type": "vector\u003cPageBlock\u003e", + "description": "Slideshow item contents" + }, + { + "name": "caption", + "type": "RichText", + "description": "Block caption" + } + ] + }, + { + "name": "pageBlockChatLink", + "description": "A link to a chat", + "class": "PageBlock", + "properties": [ + { + "name": "title", + "type": "string", + "description": "Chat title" + }, + { + "name": "photo", + "type": "chatPhoto", + "description": "Chat photo; may be null" + }, + { + "name": "username", + "type": "string", + "description": "Chat username, by which all other information about the chat should be resolved" + } + ] + }, + { + "name": "webPageInstantView", + "description": "Describes an instant view page for a web page", + "class": "WebPageInstantView", + "properties": [ + { + "name": "page_blocks", + "type": "vector\u003cPageBlock\u003e", + "description": "Content of the web page" + }, + { + "name": "is_full", + "type": "Bool", + "description": "True, if the instant view contains the full page. A network request might be needed to get the full web page instant view" + } + ] + }, + { + "name": "webPage", + "description": "Describes a web page preview", + "class": "WebPage", + "properties": [ + { + "name": "url", + "type": "string", + "description": "Original URL of the link" + }, + { + "name": "display_url", + "type": "string", + "description": "URL to display" + }, + { + "name": "type", + "type": "string", + "description": "Type of the web page. Can be: article, photo, audio, video, document, profile, app, or something else" + }, + { + "name": "site_name", + "type": "string", + "description": "Short name of the site (e.g., Google Docs, App Store)" + }, + { + "name": "title", + "type": "string", + "description": "Title of the content" + }, + { + "name": "description", + "type": "string", + "description": "Description of the content" + }, + { + "name": "photo", + "type": "photo", + "description": "Image representing the content; may be null" + }, + { + "name": "embed_url", + "type": "string", + "description": "URL to show in the embedded preview" + }, + { + "name": "embed_type", + "type": "string", + "description": "MIME type of the embedded preview, (e.g., text/html or video/mp4)" + }, + { + "name": "embed_width", + "type": "int32", + "description": "Width of the embedded preview" + }, + { + "name": "embed_height", + "type": "int32", + "description": "Height of the embedded preview" + }, + { + "name": "duration", + "type": "int32", + "description": "Duration of the content, in seconds" + }, + { + "name": "author", + "type": "string", + "description": "Author of the content" + }, + { + "name": "animation", + "type": "animation", + "description": "Preview of the content as an animation, if available; may be null" + }, + { + "name": "audio", + "type": "audio", + "description": "Preview of the content as an audio file, if available; may be null" + }, + { + "name": "document", + "type": "document", + "description": "Preview of the content as a document, if available (currently only available for small PDF files and ZIP archives); may be null" + }, + { + "name": "sticker", + "type": "sticker", + "description": "Preview of the content as a sticker for small WEBP files, if available; may be null" + }, + { + "name": "video", + "type": "video", + "description": "Preview of the content as a video, if available; may be null" + }, + { + "name": "video_note", + "type": "videoNote", + "description": "Preview of the content as a video note, if available; may be null" + }, + { + "name": "voice_note", + "type": "voiceNote", + "description": "Preview of the content as a voice note, if available; may be null" + }, + { + "name": "has_instant_view", + "type": "Bool", + "description": "True, if the web page has an instant view" + } + ] + }, + { + "name": "labeledPricePart", + "description": "Portion of the price of a product (e.g., \"delivery cost\", \"tax amount\")", + "class": "LabeledPricePart", + "properties": [ + { + "name": "label", + "type": "string", + "description": "Label for this portion of the product price" + }, + { + "name": "amount", + "type": "int53", + "description": "Currency amount in minimal quantity of the currency" + } + ] + }, + { + "name": "invoice", + "description": "Product invoice", + "class": "Invoice", + "properties": [ + { + "name": "currency", + "type": "string", + "description": "ISO 4217 currency code" + }, + { + "name": "price_parts", + "type": "vector\u003clabeledPricePart\u003e", + "description": "A list of objects used to calculate the total price of the product" + }, + { + "name": "is_test", + "type": "Bool", + "description": "True, if the payment is a test payment" + }, + { + "name": "need_name", + "type": "Bool", + "description": "True, if the user's name is needed for payment" + }, + { + "name": "need_phone_number", + "type": "Bool", + "description": "True, if the user's phone number is needed for payment" + }, + { + "name": "need_email_address", + "type": "Bool", + "description": "True, if the user's email address is needed for payment" + }, + { + "name": "need_shipping_address", + "type": "Bool", + "description": "True, if the user's shipping address is needed for payment" + }, + { + "name": "send_phone_number_to_provider", + "type": "Bool", + "description": "True, if the user's phone number will be sent to the provider" + }, + { + "name": "send_email_address_to_provider", + "type": "Bool", + "description": "True, if the user's email address will be sent to the provider" + }, + { + "name": "is_flexible", + "type": "Bool", + "description": "True, if the total price depends on the shipping method" + } + ] + }, + { + "name": "shippingAddress", + "description": "Describes a shipping address", + "class": "ShippingAddress", + "properties": [ + { + "name": "country_code", + "type": "string", + "description": "Two-letter ISO 3166-1 alpha-2 country code" + }, + { + "name": "state", + "type": "string", + "description": "State, if applicable" + }, + { + "name": "city", + "type": "string", + "description": "City" + }, + { + "name": "street_line1", + "type": "string", + "description": "First line of the address" + }, + { + "name": "street_line2", + "type": "string", + "description": "Second line of the address" + }, + { + "name": "postal_code", + "type": "string", + "description": "Address postal code" + } + ] + }, + { + "name": "orderInfo", + "description": "Order information", + "class": "OrderInfo", + "properties": [ + { + "name": "name", + "type": "string", + "description": "Name of the user" + }, + { + "name": "phone_number", + "type": "string", + "description": "Phone number of the user" + }, + { + "name": "email_address", + "type": "string", + "description": "Email address of the user" + }, + { + "name": "shipping_address", + "type": "shippingAddress", + "description": "Shipping address for this order; may be null" + } + ] + }, + { + "name": "shippingOption", + "description": "One shipping option", + "class": "ShippingOption", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Shipping option identifier" + }, + { + "name": "title", + "type": "string", + "description": "Option title" + }, + { + "name": "price_parts", + "type": "vector\u003clabeledPricePart\u003e", + "description": "A list of objects used to calculate the total shipping costs" + } + ] + }, + { + "name": "savedCredentials", + "description": "Contains information about saved card credentials", + "class": "SavedCredentials", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the saved credentials" + }, + { + "name": "title", + "type": "string", + "description": "Title of the saved credentials" + } + ] + }, + { + "name": "inputCredentialsSaved", + "description": "Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password", + "class": "InputCredentials", + "properties": [ + { + "name": "saved_credentials_id", + "type": "string", + "description": "Identifier of the saved credentials" + } + ] + }, + { + "name": "inputCredentialsNew", + "description": "Applies if a user enters new credentials on a payment provider website", + "class": "InputCredentials", + "properties": [ + { + "name": "data", + "type": "string", + "description": "Contains JSON-encoded data with a credential identifier from the payment provider" + }, + { + "name": "allow_save", + "type": "Bool", + "description": "True, if the credential identifier can be saved on the server side" + } + ] + }, + { + "name": "inputCredentialsAndroidPay", + "description": "Applies if a user enters new credentials using Android Pay", + "class": "InputCredentials", + "properties": [ + { + "name": "data", + "type": "string", + "description": "JSON-encoded data with the credential identifier" + } + ] + }, + { + "name": "inputCredentialsApplePay", + "description": "Applies if a user enters new credentials using Apple Pay", + "class": "InputCredentials", + "properties": [ + { + "name": "data", + "type": "string", + "description": "JSON-encoded data with the credential identifier" + } + ] + }, + { + "name": "paymentsProviderStripe", + "description": "Stripe payment provider", + "class": "PaymentsProviderStripe", + "properties": [ + { + "name": "publishable_key", + "type": "string", + "description": "Stripe API publishable key" + }, + { + "name": "need_country", + "type": "Bool", + "description": "True, if the user country must be provided" + }, + { + "name": "need_postal_code", + "type": "Bool", + "description": "True, if the user ZIP/postal code must be provided" + }, + { + "name": "need_cardholder_name", + "type": "Bool", + "description": "True, if the cardholder name must be provided" + } + ] + }, + { + "name": "paymentForm", + "description": "Contains information about an invoice payment form", + "class": "PaymentForm", + "properties": [ + { + "name": "invoice", + "type": "invoice", + "description": "Full information of the invoice" + }, + { + "name": "url", + "type": "string", + "description": "Payment form URL" + }, + { + "name": "payments_provider", + "type": "paymentsProviderStripe", + "description": "Contains information about the payment provider, if available, to support it natively without the need for opening the URL; may be null" + }, + { + "name": "saved_order_info", + "type": "orderInfo", + "description": "Saved server-side order information; may be null" + }, + { + "name": "saved_credentials", + "type": "savedCredentials", + "description": "Contains information about saved card credentials; may be null" + }, + { + "name": "can_save_credentials", + "type": "Bool", + "description": "True, if the user can choose to save credentials" + }, + { + "name": "need_password", + "type": "Bool", + "description": "True, if the user will be able to save credentials protected by a password they set up" + } + ] + }, + { + "name": "validatedOrderInfo", + "description": "Contains a temporary identifier of validated order information, which is stored for one hour. Also contains the available shipping options", + "class": "ValidatedOrderInfo", + "properties": [ + { + "name": "order_info_id", + "type": "string", + "description": "Temporary identifier of the order information" + }, + { + "name": "shipping_options", + "type": "vector\u003cshippingOption\u003e", + "description": "Available shipping options" + } + ] + }, + { + "name": "paymentResult", + "description": "Contains the result of a payment request", + "class": "PaymentResult", + "properties": [ + { + "name": "success", + "type": "Bool", + "description": "True, if the payment request was successful; otherwise the verification_url will be not empty" + }, + { + "name": "verification_url", + "type": "string", + "description": "URL for additional payment credentials verification" + } + ] + }, + { + "name": "paymentReceipt", + "description": "Contains information about a successful payment", + "class": "PaymentReceipt", + "properties": [ + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the payment was made" + }, + { + "name": "payments_provider_user_id", + "type": "int32", + "description": "User identifier of the payment provider bot" + }, + { + "name": "invoice", + "type": "invoice", + "description": "Contains information about the invoice" + }, + { + "name": "order_info", + "type": "orderInfo", + "description": "Contains order information; may be null" + }, + { + "name": "shipping_option", + "type": "shippingOption", + "description": "Chosen shipping option; may be null" + }, + { + "name": "credentials_title", + "type": "string", + "description": "Title of the saved credentials" + } + ] + }, + { + "name": "messageText", + "description": "A text message", + "class": "MessageContent", + "properties": [ + { + "name": "text", + "type": "formattedText", + "description": "Text of the message" + }, + { + "name": "web_page", + "type": "webPage", + "description": "A preview of the web page that's mentioned in the text; may be null" + } + ] + }, + { + "name": "messageAnimation", + "description": "An animation message (GIF-style).", + "class": "MessageContent", + "properties": [ + { + "name": "animation", + "type": "animation", + "description": "Message content" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Animation caption" + }, + { + "name": "is_secret", + "type": "Bool", + "description": "True, if the animation thumbnail must be blurred and the animation must be shown only while tapped" + } + ] + }, + { + "name": "messageAudio", + "description": "An audio message", + "class": "MessageContent", + "properties": [ + { + "name": "audio", + "type": "audio", + "description": "Message content" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Audio caption" + } + ] + }, + { + "name": "messageDocument", + "description": "A document message (general file)", + "class": "MessageContent", + "properties": [ + { + "name": "document", + "type": "document", + "description": "Message content" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Document caption" + } + ] + }, + { + "name": "messagePhoto", + "description": "A photo message", + "class": "MessageContent", + "properties": [ + { + "name": "photo", + "type": "photo", + "description": "Message content" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Photo caption" + }, + { + "name": "is_secret", + "type": "Bool", + "description": "True, if the photo must be blurred and must be shown only while tapped" + } + ] + }, + { + "name": "messageExpiredPhoto", + "description": "An expired photo message (self-destructed after TTL has elapsed)", + "class": "MessageContent", + "properties": [] + }, + { + "name": "messageSticker", + "description": "A sticker message", + "class": "MessageContent", + "properties": [ + { + "name": "sticker", + "type": "sticker", + "description": "Message content" + } + ] + }, + { + "name": "messageVideo", + "description": "A video message", + "class": "MessageContent", + "properties": [ + { + "name": "video", + "type": "video", + "description": "Message content" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Video caption" + }, + { + "name": "is_secret", + "type": "Bool", + "description": "True, if the video thumbnail must be blurred and the video must be shown only while tapped" + } + ] + }, + { + "name": "messageExpiredVideo", + "description": "An expired video message (self-destructed after TTL has elapsed)", + "class": "MessageContent", + "properties": [] + }, + { + "name": "messageVideoNote", + "description": "A video note message", + "class": "MessageContent", + "properties": [ + { + "name": "video_note", + "type": "videoNote", + "description": "Message content" + }, + { + "name": "is_viewed", + "type": "Bool", + "description": "True, if at least one of the recipients has viewed the video note" + }, + { + "name": "is_secret", + "type": "Bool", + "description": "True, if the video note thumbnail must be blurred and the video note must be shown only while tapped" + } + ] + }, + { + "name": "messageVoiceNote", + "description": "A voice note message", + "class": "MessageContent", + "properties": [ + { + "name": "voice_note", + "type": "voiceNote", + "description": "Message content" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Voice note caption" + }, + { + "name": "is_listened", + "type": "Bool", + "description": "True, if at least one of the recipients has listened to the voice note" + } + ] + }, + { + "name": "messageLocation", + "description": "A message with a location", + "class": "MessageContent", + "properties": [ + { + "name": "location", + "type": "location", + "description": "Message content" + }, + { + "name": "live_period", + "type": "int32", + "description": "Time relative to the message sent date until which the location can be updated, in seconds" + }, + { + "name": "expires_in", + "type": "int32", + "description": "Left time for which the location can be updated, in seconds. updateMessageContent is not sent when this field changes" + } + ] + }, + { + "name": "messageVenue", + "description": "A message with information about a venue", + "class": "MessageContent", + "properties": [ + { + "name": "venue", + "type": "venue", + "description": "Message content" + } + ] + }, + { + "name": "messageContact", + "description": "A message with a user contact", + "class": "MessageContent", + "properties": [ + { + "name": "contact", + "type": "contact", + "description": "Message content" + } + ] + }, + { + "name": "messageGame", + "description": "A message with a game", + "class": "MessageContent", + "properties": [ + { + "name": "game", + "type": "game", + "description": "Game" + } + ] + }, + { + "name": "messageInvoice", + "description": "A message with an invoice from a bot", + "class": "MessageContent", + "properties": [ + { + "name": "title", + "type": "string", + "description": "Product title" + }, + { + "name": "description", + "type": "string", + "description": "Product description" + }, + { + "name": "photo", + "type": "photo", + "description": "Product photo; may be null" + }, + { + "name": "currency", + "type": "string", + "description": "Currency for the product price" + }, + { + "name": "total_amount", + "type": "int53", + "description": "Product total price in the minimal quantity of the currency" + }, + { + "name": "start_parameter", + "type": "string", + "description": "Unique invoice bot start_parameter. To share an invoice use the URL https://t.me/{bot_username}?start={start_parameter}" + }, + { + "name": "is_test", + "type": "Bool", + "description": "True, if the invoice is a test invoice" + }, + { + "name": "need_shipping_address", + "type": "Bool", + "description": "True, if the shipping address should be specified" + }, + { + "name": "receipt_message_id", + "type": "int53", + "description": "The identifier of the message with the receipt, after the product has been purchased" + } + ] + }, + { + "name": "messageCall", + "description": "A message with information about an ended call", + "class": "MessageContent", + "properties": [ + { + "name": "discard_reason", + "type": "CallDiscardReason", + "description": "Reason why the call was discarded" + }, + { + "name": "duration", + "type": "int32", + "description": "Call duration, in seconds" + } + ] + }, + { + "name": "messageBasicGroupChatCreate", + "description": "A newly created basic group", + "class": "MessageContent", + "properties": [ + { + "name": "title", + "type": "string", + "description": "Title of the basic group" + }, + { + "name": "member_user_ids", + "type": "vector\u003cint32\u003e", + "description": "User identifiers of members in the basic group" + } + ] + }, + { + "name": "messageSupergroupChatCreate", + "description": "A newly created supergroup or channel", + "class": "MessageContent", + "properties": [ + { + "name": "title", + "type": "string", + "description": "Title of the supergroup or channel" + } + ] + }, + { + "name": "messageChatChangeTitle", + "description": "An updated chat title", + "class": "MessageContent", + "properties": [ + { + "name": "title", + "type": "string", + "description": "New chat title" + } + ] + }, + { + "name": "messageChatChangePhoto", + "description": "An updated chat photo", + "class": "MessageContent", + "properties": [ + { + "name": "photo", + "type": "photo", + "description": "New chat photo" + } + ] + }, + { + "name": "messageChatDeletePhoto", + "description": "A deleted chat photo", + "class": "MessageContent", + "properties": [] + }, + { + "name": "messageChatAddMembers", + "description": "New chat members were added", + "class": "MessageContent", + "properties": [ + { + "name": "member_user_ids", + "type": "vector\u003cint32\u003e", + "description": "User identifiers of the new members" + } + ] + }, + { + "name": "messageChatJoinByLink", + "description": "A new member joined the chat by invite link", + "class": "MessageContent", + "properties": [] + }, + { + "name": "messageChatDeleteMember", + "description": "A chat member was deleted", + "class": "MessageContent", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier of the deleted chat member" + } + ] + }, + { + "name": "messageChatUpgradeTo", + "description": "A basic group was upgraded to a supergroup and was deactivated as the result", + "class": "MessageContent", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup to which the basic group was upgraded" + } + ] + }, + { + "name": "messageChatUpgradeFrom", + "description": "A supergroup has been created from a basic group", + "class": "MessageContent", + "properties": [ + { + "name": "title", + "type": "string", + "description": "Title of the newly created supergroup" + }, + { + "name": "basic_group_id", + "type": "int32", + "description": "The identifier of the original basic group" + } + ] + }, + { + "name": "messagePinMessage", + "description": "A message has been pinned", + "class": "MessageContent", + "properties": [ + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the pinned message, can be an identifier of a deleted message" + } + ] + }, + { + "name": "messageScreenshotTaken", + "description": "A screenshot of a message in the chat has been taken", + "class": "MessageContent", + "properties": [] + }, + { + "name": "messageChatSetTtl", + "description": "The TTL (Time To Live) setting messages in a secret chat has been changed", + "class": "MessageContent", + "properties": [ + { + "name": "ttl", + "type": "int32", + "description": "New TTL" + } + ] + }, + { + "name": "messageCustomServiceAction", + "description": "A non-standard action has happened in the chat", + "class": "MessageContent", + "properties": [ + { + "name": "text", + "type": "string", + "description": "Message text to be shown in the chat" + } + ] + }, + { + "name": "messageGameScore", + "description": "A new high score was achieved in a game", + "class": "MessageContent", + "properties": [ + { + "name": "game_message_id", + "type": "int53", + "description": "Identifier of the message with the game, can be an identifier of a deleted message" + }, + { + "name": "game_id", + "type": "int64", + "description": "Identifier of the game, may be different from the games presented in the message with the game" + }, + { + "name": "score", + "type": "int32", + "description": "New score" + } + ] + }, + { + "name": "messagePaymentSuccessful", + "description": "A payment has been completed", + "class": "MessageContent", + "properties": [ + { + "name": "invoice_message_id", + "type": "int53", + "description": "Identifier of the message with the corresponding invoice; can be an identifier of a deleted message" + }, + { + "name": "currency", + "type": "string", + "description": "Currency for the price of the product" + }, + { + "name": "total_amount", + "type": "int53", + "description": "Total price for the product, in the minimal quantity of the currency" + } + ] + }, + { + "name": "messagePaymentSuccessfulBot", + "description": "A payment has been completed; for bots only", + "class": "MessageContent", + "properties": [ + { + "name": "invoice_message_id", + "type": "int53", + "description": "Identifier of the message with the corresponding invoice; can be an identifier of a deleted message" + }, + { + "name": "currency", + "type": "string", + "description": "Currency for price of the product" + }, + { + "name": "total_amount", + "type": "int53", + "description": "Total price for the product, in the minimal quantity of the currency" + }, + { + "name": "invoice_payload", + "type": "bytes", + "description": "Invoice payload" + }, + { + "name": "shipping_option_id", + "type": "string", + "description": "Identifier of the shipping option chosen by the user, may be empty if not applicable" + }, + { + "name": "order_info", + "type": "orderInfo", + "description": "Information about the order; may be null" + }, + { + "name": "telegram_payment_charge_id", + "type": "string", + "description": "Telegram payment identifier" + }, + { + "name": "provider_payment_charge_id", + "type": "string", + "description": "Provider payment identifier" + } + ] + }, + { + "name": "messageContactRegistered", + "description": "A contact has registered with Telegram", + "class": "MessageContent", + "properties": [] + }, + { + "name": "messageWebsiteConnected", + "description": "The current user has connected a website by logging in using Telegram Login Widget on it", + "class": "MessageContent", + "properties": [ + { + "name": "domain_name", + "type": "string", + "description": "Domain name of the connected website" + } + ] + }, + { + "name": "messageUnsupported", + "description": "Message content that is not supported by the client", + "class": "MessageContent", + "properties": [] + }, + { + "name": "textEntityTypeMention", + "description": "A mention of a user by their username", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeHashtag", + "description": "A hashtag text, beginning with \"#\"", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeCashtag", + "description": "A cashtag text, beginning with \"$\" and consisting of capital english letters (i.e. \"$USD\")", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeBotCommand", + "description": "A bot command, beginning with \"/\". This shouldn't be highlighted if there are no bots in the chat", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeUrl", + "description": "An HTTP URL", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeEmailAddress", + "description": "An email address", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeBold", + "description": "A bold text", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeItalic", + "description": "An italic text", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypeCode", + "description": "Text that must be formatted as if inside a code HTML tag", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypePre", + "description": "Text that must be formatted as if inside a pre HTML tag", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "textEntityTypePreCode", + "description": "Text that must be formatted as if inside pre, and code HTML tags", + "class": "TextEntityType", + "properties": [ + { + "name": "language", + "type": "string", + "description": "Programming language of the code; as defined by the sender" + } + ] + }, + { + "name": "textEntityTypeTextUrl", + "description": "A text description shown instead of a raw URL", + "class": "TextEntityType", + "properties": [ + { + "name": "url", + "type": "string", + "description": "URL to be opened when the link is clicked" + } + ] + }, + { + "name": "textEntityTypeMentionName", + "description": "A text shows instead of a raw mention of the user (e.g., when the user has no username)", + "class": "TextEntityType", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the mentioned user" + } + ] + }, + { + "name": "textEntityTypePhoneNumber", + "description": "A phone number", + "class": "TextEntityType", + "properties": [] + }, + { + "name": "inputThumbnail", + "description": "A thumbnail to be sent along with a file; should be in JPEG or WEBP format for stickers, and less than 200 kB in size", + "class": "InputThumbnail", + "properties": [ + { + "name": "thumbnail", + "type": "InputFile", + "description": "Thumbnail file to send. Sending thumbnails by file_id is currently not supported" + }, + { + "name": "width", + "type": "int32", + "description": "Thumbnail width, usually shouldn't exceed 90. Use 0 if unknown" + }, + { + "name": "height", + "type": "int32", + "description": "Thumbnail height, usually shouldn't exceed 90. Use 0 if unknown" + } + ] + }, + { + "name": "inputMessageText", + "description": "A text message", + "class": "InputMessageContent", + "properties": [ + { + "name": "text", + "type": "formattedText", + "description": "Formatted text to be sent. Only Bold, Italic, Code, Pre, PreCode and TextUrl entities are allowed to be specified manually" + }, + { + "name": "disable_web_page_preview", + "type": "Bool", + "description": "True, if rich web page previews for URLs in the message text should be disabled" + }, + { + "name": "clear_draft", + "type": "Bool", + "description": "True, if a chat message draft should be deleted" + } + ] + }, + { + "name": "inputMessageAnimation", + "description": "An animation message (GIF-style).", + "class": "InputMessageContent", + "properties": [ + { + "name": "animation", + "type": "InputFile", + "description": "Animation file to be sent" + }, + { + "name": "thumbnail", + "type": "inputThumbnail", + "description": "Animation thumbnail, if available" + }, + { + "name": "duration", + "type": "int32", + "description": "Duration of the animation, in seconds" + }, + { + "name": "width", + "type": "int32", + "description": "Width of the animation; may be replaced by the server" + }, + { + "name": "height", + "type": "int32", + "description": "Height of the animation; may be replaced by the server" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Animation caption; 0-200 characters" + } + ] + }, + { + "name": "inputMessageAudio", + "description": "An audio message", + "class": "InputMessageContent", + "properties": [ + { + "name": "audio", + "type": "InputFile", + "description": "Audio file to be sent" + }, + { + "name": "album_cover_thumbnail", + "type": "inputThumbnail", + "description": "Thumbnail of the cover for the album, if available" + }, + { + "name": "duration", + "type": "int32", + "description": "Duration of the audio, in seconds; may be replaced by the server" + }, + { + "name": "title", + "type": "string", + "description": "Title of the audio; 0-64 characters; may be replaced by the server" + }, + { + "name": "performer", + "type": "string", + "description": "Performer of the audio; 0-64 characters, may be replaced by the server" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Audio caption; 0-200 characters" + } + ] + }, + { + "name": "inputMessageDocument", + "description": "A document message (general file)", + "class": "InputMessageContent", + "properties": [ + { + "name": "document", + "type": "InputFile", + "description": "Document to be sent" + }, + { + "name": "thumbnail", + "type": "inputThumbnail", + "description": "Document thumbnail, if available" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Document caption; 0-200 characters" + } + ] + }, + { + "name": "inputMessagePhoto", + "description": "A photo message", + "class": "InputMessageContent", + "properties": [ + { + "name": "photo", + "type": "InputFile", + "description": "Photo to send" + }, + { + "name": "thumbnail", + "type": "inputThumbnail", + "description": "Photo thumbnail to be sent, this is sent to the other party in secret chats only" + }, + { + "name": "added_sticker_file_ids", + "type": "vector\u003cint32\u003e", + "description": "File identifiers of the stickers added to the photo, if applicable" + }, + { + "name": "width", + "type": "int32", + "description": "Photo width" + }, + { + "name": "height", + "type": "int32", + "description": "Photo height" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Photo caption; 0-200 characters" + }, + { + "name": "ttl", + "type": "int32", + "description": "Photo TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats" + } + ] + }, + { + "name": "inputMessageSticker", + "description": "A sticker message", + "class": "InputMessageContent", + "properties": [ + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker to be sent" + }, + { + "name": "thumbnail", + "type": "inputThumbnail", + "description": "Sticker thumbnail, if available" + }, + { + "name": "width", + "type": "int32", + "description": "Sticker width" + }, + { + "name": "height", + "type": "int32", + "description": "Sticker height" + } + ] + }, + { + "name": "inputMessageVideo", + "description": "A video message", + "class": "InputMessageContent", + "properties": [ + { + "name": "video", + "type": "InputFile", + "description": "Video to be sent" + }, + { + "name": "thumbnail", + "type": "inputThumbnail", + "description": "Video thumbnail, if available" + }, + { + "name": "added_sticker_file_ids", + "type": "vector\u003cint32\u003e", + "description": "File identifiers of the stickers added to the video, if applicable" + }, + { + "name": "duration", + "type": "int32", + "description": "Duration of the video, in seconds" + }, + { + "name": "width", + "type": "int32", + "description": "Video width" + }, + { + "name": "height", + "type": "int32", + "description": "Video height" + }, + { + "name": "supports_streaming", + "type": "Bool", + "description": "True, if the video should be tried to be streamed" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Video caption; 0-200 characters" + }, + { + "name": "ttl", + "type": "int32", + "description": "Video TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats" + } + ] + }, + { + "name": "inputMessageVideoNote", + "description": "A video note message", + "class": "InputMessageContent", + "properties": [ + { + "name": "video_note", + "type": "InputFile", + "description": "Video note to be sent" + }, + { + "name": "thumbnail", + "type": "inputThumbnail", + "description": "Video thumbnail, if available" + }, + { + "name": "duration", + "type": "int32", + "description": "Duration of the video, in seconds" + }, + { + "name": "length", + "type": "int32", + "description": "Video width and height; must be positive and not greater than 640" + } + ] + }, + { + "name": "inputMessageVoiceNote", + "description": "A voice note message", + "class": "InputMessageContent", + "properties": [ + { + "name": "voice_note", + "type": "InputFile", + "description": "Voice note to be sent" + }, + { + "name": "duration", + "type": "int32", + "description": "Duration of the voice note, in seconds" + }, + { + "name": "waveform", + "type": "bytes", + "description": "Waveform representation of the voice note, in 5-bit format" + }, + { + "name": "caption", + "type": "formattedText", + "description": "Voice note caption; 0-200 characters" + } + ] + }, + { + "name": "inputMessageLocation", + "description": "A message with a location", + "class": "InputMessageContent", + "properties": [ + { + "name": "location", + "type": "location", + "description": "Location to be sent" + }, + { + "name": "live_period", + "type": "int32", + "description": "Period for which the location can be updated, in seconds; should bebetween 60 and 86400 for a live location and 0 otherwise" + } + ] + }, + { + "name": "inputMessageVenue", + "description": "A message with information about a venue", + "class": "InputMessageContent", + "properties": [ + { + "name": "venue", + "type": "venue", + "description": "Venue to send" + } + ] + }, + { + "name": "inputMessageContact", + "description": "A message containing a user contact", + "class": "InputMessageContent", + "properties": [ + { + "name": "contact", + "type": "contact", + "description": "Contact to send" + } + ] + }, + { + "name": "inputMessageGame", + "description": "A message with a game; not supported for channels or secret chats", + "class": "InputMessageContent", + "properties": [ + { + "name": "bot_user_id", + "type": "int32", + "description": "User identifier of the bot that owns the game" + }, + { + "name": "game_short_name", + "type": "string", + "description": "Short name of the game" + } + ] + }, + { + "name": "inputMessageInvoice", + "description": "A message with an invoice; can be used only by bots and only in private chats", + "class": "InputMessageContent", + "properties": [ + { + "name": "invoice", + "type": "invoice", + "description": "Invoice" + }, + { + "name": "title", + "type": "string", + "description": "Product title; 1-32 characters" + }, + { + "name": "description", + "type": "string", + "description": "Product description; 0-255 characters" + }, + { + "name": "photo_url", + "type": "string", + "description": "Product photo URL; optional" + }, + { + "name": "photo_size", + "type": "int32", + "description": "Product photo size" + }, + { + "name": "photo_width", + "type": "int32", + "description": "Product photo width" + }, + { + "name": "photo_height", + "type": "int32", + "description": "Product photo height" + }, + { + "name": "payload", + "type": "bytes", + "description": "The invoice payload" + }, + { + "name": "provider_token", + "type": "string", + "description": "Payment provider token" + }, + { + "name": "provider_data", + "type": "string", + "description": "JSON-encoded data about the invoice, which will be shared with the payment provider" + }, + { + "name": "start_parameter", + "type": "string", + "description": "Unique invoice bot start_parameter for the generation of this invoice" + } + ] + }, + { + "name": "inputMessageForwarded", + "description": "A forwarded message", + "class": "InputMessageContent", + "properties": [ + { + "name": "from_chat_id", + "type": "int53", + "description": "Identifier for the chat this forwarded message came from" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message to forward" + }, + { + "name": "in_game_share", + "type": "Bool", + "description": "True, if a game message should be shared within a launched game; applies only to game messages" + } + ] + }, + { + "name": "searchMessagesFilterEmpty", + "description": "Returns all found messages, no filter is applied", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterAnimation", + "description": "Returns only animation messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterAudio", + "description": "Returns only audio messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterDocument", + "description": "Returns only document messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterPhoto", + "description": "Returns only photo messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterVideo", + "description": "Returns only video messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterVoiceNote", + "description": "Returns only voice note messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterPhotoAndVideo", + "description": "Returns only photo and video messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterUrl", + "description": "Returns only messages containing URLs", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterChatPhoto", + "description": "Returns only messages containing chat photos", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterCall", + "description": "Returns only call messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterMissedCall", + "description": "Returns only incoming call messages with missed/declined discard reasons", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterVideoNote", + "description": "Returns only video note messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterVoiceAndVideoNote", + "description": "Returns only voice and video note messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterMention", + "description": "Returns only messages with mentions of the current user, or messages that are replies to their messages", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "searchMessagesFilterUnreadMention", + "description": "Returns only messages with unread mentions of the current user or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query or by the sending user", + "class": "SearchMessagesFilter", + "properties": [] + }, + { + "name": "chatActionTyping", + "description": "The user is typing a message", + "class": "ChatAction", + "properties": [] + }, + { + "name": "chatActionRecordingVideo", + "description": "The user is recording a video", + "class": "ChatAction", + "properties": [] + }, + { + "name": "chatActionUploadingVideo", + "description": "The user is uploading a video", + "class": "ChatAction", + "properties": [ + { + "name": "progress", + "type": "int32", + "description": "Upload progress, as a percentage" + } + ] + }, + { + "name": "chatActionRecordingVoiceNote", + "description": "The user is recording a voice note", + "class": "ChatAction", + "properties": [] + }, + { + "name": "chatActionUploadingVoiceNote", + "description": "The user is uploading a voice note", + "class": "ChatAction", + "properties": [ + { + "name": "progress", + "type": "int32", + "description": "Upload progress, as a percentage" + } + ] + }, + { + "name": "chatActionUploadingPhoto", + "description": "The user is uploading a photo", + "class": "ChatAction", + "properties": [ + { + "name": "progress", + "type": "int32", + "description": "Upload progress, as a percentage" + } + ] + }, + { + "name": "chatActionUploadingDocument", + "description": "The user is uploading a document", + "class": "ChatAction", + "properties": [ + { + "name": "progress", + "type": "int32", + "description": "Upload progress, as a percentage" + } + ] + }, + { + "name": "chatActionChoosingLocation", + "description": "The user is picking a location or venue to send", + "class": "ChatAction", + "properties": [] + }, + { + "name": "chatActionChoosingContact", + "description": "The user is picking a contact to send", + "class": "ChatAction", + "properties": [] + }, + { + "name": "chatActionStartPlayingGame", + "description": "The user has started to play a game", + "class": "ChatAction", + "properties": [] + }, + { + "name": "chatActionRecordingVideoNote", + "description": "The user is recording a video note", + "class": "ChatAction", + "properties": [] + }, + { + "name": "chatActionUploadingVideoNote", + "description": "The user is uploading a video note", + "class": "ChatAction", + "properties": [ + { + "name": "progress", + "type": "int32", + "description": "Upload progress, as a percentage" + } + ] + }, + { + "name": "chatActionCancel", + "description": "The user has cancelled the previous action", + "class": "ChatAction", + "properties": [] + }, + { + "name": "userStatusEmpty", + "description": "The user status was never changed", + "class": "UserStatus", + "properties": [] + }, + { + "name": "userStatusOnline", + "description": "The user is online", + "class": "UserStatus", + "properties": [ + { + "name": "expires", + "type": "int32", + "description": "Point in time (Unix timestamp) when the user's online status will expire" + } + ] + }, + { + "name": "userStatusOffline", + "description": "The user is offline", + "class": "UserStatus", + "properties": [ + { + "name": "was_online", + "type": "int32", + "description": "Point in time (Unix timestamp) when the user was last online" + } + ] + }, + { + "name": "userStatusRecently", + "description": "The user was online recently", + "class": "UserStatus", + "properties": [] + }, + { + "name": "userStatusLastWeek", + "description": "The user is offline, but was online last week", + "class": "UserStatus", + "properties": [] + }, + { + "name": "userStatusLastMonth", + "description": "The user is offline, but was online last month", + "class": "UserStatus", + "properties": [] + }, + { + "name": "stickers", + "description": "Represents a list of stickers", + "class": "Stickers", + "properties": [ + { + "name": "stickers", + "type": "vector\u003csticker\u003e", + "description": "List of stickers" + } + ] + }, + { + "name": "stickerEmojis", + "description": "Represents a list of all emoji corresponding to a sticker in a sticker set. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object", + "class": "StickerEmojis", + "properties": [ + { + "name": "emojis", + "type": "vector\u003cstring\u003e", + "description": "List of emojis" + } + ] + }, + { + "name": "stickerSet", + "description": "Represents a sticker set", + "class": "StickerSet", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Identifier of the sticker set" + }, + { + "name": "title", + "type": "string", + "description": "Title of the sticker set" + }, + { + "name": "name", + "type": "string", + "description": "Name of the sticker set" + }, + { + "name": "is_installed", + "type": "Bool", + "description": "True, if the sticker set has been installed by the current user" + }, + { + "name": "is_archived", + "type": "Bool", + "description": "True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously" + }, + { + "name": "is_official", + "type": "Bool", + "description": "True, if the sticker set is official" + }, + { + "name": "is_masks", + "type": "Bool", + "description": "True, if the stickers in the set are masks" + }, + { + "name": "is_viewed", + "type": "Bool", + "description": "True for already viewed trending sticker sets" + }, + { + "name": "stickers", + "type": "vector\u003csticker\u003e", + "description": "List of stickers in this set" + }, + { + "name": "emojis", + "type": "vector\u003cstickerEmojis\u003e", + "description": "A list of emoji corresponding to the stickers in the same order" + } + ] + }, + { + "name": "stickerSetInfo", + "description": "Represents short information about a sticker set", + "class": "StickerSetInfo", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Identifier of the sticker set" + }, + { + "name": "title", + "type": "string", + "description": "Title of the sticker set" + }, + { + "name": "name", + "type": "string", + "description": "Name of the sticker set" + }, + { + "name": "is_installed", + "type": "Bool", + "description": "True, if the sticker set has been installed by current user" + }, + { + "name": "is_archived", + "type": "Bool", + "description": "True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously" + }, + { + "name": "is_official", + "type": "Bool", + "description": "True, if the sticker set is official" + }, + { + "name": "is_masks", + "type": "Bool", + "description": "True, if the stickers in the set are masks" + }, + { + "name": "is_viewed", + "type": "Bool", + "description": "True for already viewed trending sticker sets" + }, + { + "name": "size", + "type": "int32", + "description": "Total number of stickers in the set" + }, + { + "name": "covers", + "type": "vector\u003csticker\u003e", + "description": "Contains up to the first 5 stickers from the set, depending on the context. If the client needs more stickers the full set should be requested" + } + ] + }, + { + "name": "stickerSets", + "description": "Represents a list of sticker sets", + "class": "StickerSets", + "properties": [ + { + "name": "total_count", + "type": "int32", + "description": "Approximate total number of sticker sets found" + }, + { + "name": "sets", + "type": "vector\u003cstickerSetInfo\u003e", + "description": "List of sticker sets" + } + ] + }, + { + "name": "callDiscardReasonEmpty", + "description": "The call wasn't discarded, or the reason is unknown", + "class": "CallDiscardReason", + "properties": [] + }, + { + "name": "callDiscardReasonMissed", + "description": "The call was ended before the conversation started. It was cancelled by the caller or missed by the other party", + "class": "CallDiscardReason", + "properties": [] + }, + { + "name": "callDiscardReasonDeclined", + "description": "The call was ended before the conversation started. It was declined by the other party", + "class": "CallDiscardReason", + "properties": [] + }, + { + "name": "callDiscardReasonDisconnected", + "description": "The call was ended during the conversation because the users were disconnected", + "class": "CallDiscardReason", + "properties": [] + }, + { + "name": "callDiscardReasonHungUp", + "description": "The call was ended because one of the parties hung up", + "class": "CallDiscardReason", + "properties": [] + }, + { + "name": "callProtocol", + "description": "Specifies the supported call protocols", + "class": "CallProtocol", + "properties": [ + { + "name": "udp_p2p", + "type": "Bool", + "description": "True, if UDP peer-to-peer connections are supported" + }, + { + "name": "udp_reflector", + "type": "Bool", + "description": "True, if connection through UDP reflectors is supported" + }, + { + "name": "min_layer", + "type": "int32", + "description": "Minimum supported API layer; use 65" + }, + { + "name": "max_layer", + "type": "int32", + "description": "Maximum supported API layer; use 65" + } + ] + }, + { + "name": "callConnection", + "description": "Describes the address of UDP reflectors", + "class": "CallConnection", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Reflector identifier" + }, + { + "name": "ip", + "type": "string", + "description": "IPv4 reflector address" + }, + { + "name": "ipv6", + "type": "string", + "description": "IPv6 reflector address" + }, + { + "name": "port", + "type": "int32", + "description": "Reflector port number" + }, + { + "name": "peer_tag", + "type": "bytes", + "description": "Connection peer tag" + } + ] + }, + { + "name": "callId", + "description": "Contains the call identifier", + "class": "CallId", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Call identifier" + } + ] + }, + { + "name": "callStatePending", + "description": "The call is pending, waiting to be accepted by a user", + "class": "CallState", + "properties": [ + { + "name": "is_created", + "type": "Bool", + "description": "True, if the call has already been created by the server" + }, + { + "name": "is_received", + "type": "Bool", + "description": "True, if the call has already been received by the other party" + } + ] + }, + { + "name": "callStateExchangingKeys", + "description": "The call has been answered and encryption keys are being exchanged", + "class": "CallState", + "properties": [] + }, + { + "name": "callStateReady", + "description": "The call is ready to use", + "class": "CallState", + "properties": [ + { + "name": "protocol", + "type": "callProtocol", + "description": "Call protocols supported by the peer" + }, + { + "name": "connections", + "type": "vector\u003ccallConnection\u003e", + "description": "Available UDP reflectors" + }, + { + "name": "config", + "type": "string", + "description": "A JSON-encoded call config" + }, + { + "name": "encryption_key", + "type": "bytes", + "description": "Call encryption key" + }, + { + "name": "emojis", + "type": "vector\u003cstring\u003e", + "description": "Encryption key emojis fingerprint" + } + ] + }, + { + "name": "callStateHangingUp", + "description": "The call is hanging up after discardCall has been called", + "class": "CallState", + "properties": [] + }, + { + "name": "callStateDiscarded", + "description": "The call has ended successfully", + "class": "CallState", + "properties": [ + { + "name": "reason", + "type": "CallDiscardReason", + "description": "The reason, why the call has ended" + }, + { + "name": "need_rating", + "type": "Bool", + "description": "True, if the call rating should be sent to the server" + }, + { + "name": "need_debug_information", + "type": "Bool", + "description": "True, if the call debug information should be sent to the server" + } + ] + }, + { + "name": "callStateError", + "description": "The call has ended with an error", + "class": "CallState", + "properties": [ + { + "name": "error", + "type": "error", + "description": "Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout" + } + ] + }, + { + "name": "call", + "description": "Describes a call", + "class": "Call", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Call identifier, not persistent" + }, + { + "name": "user_id", + "type": "int32", + "description": "Peer user identifier" + }, + { + "name": "is_outgoing", + "type": "Bool", + "description": "True, if the call is outgoing" + }, + { + "name": "state", + "type": "CallState", + "description": "Call state" + } + ] + }, + { + "name": "animations", + "description": "Represents a list of animations", + "class": "Animations", + "properties": [ + { + "name": "animations", + "type": "vector\u003canimation\u003e", + "description": "List of animations" + } + ] + }, + { + "name": "importedContacts", + "description": "Represents the result of an ImportContacts request", + "class": "ImportedContacts", + "properties": [ + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "User identifiers of the imported contacts in the same order as they were specified in the request; 0 if the contact is not yet a registered user" + }, + { + "name": "importer_count", + "type": "vector\u003cint32\u003e", + "description": "The number of users that imported the corresponding contact; 0 for already registered users or if unavailable" + } + ] + }, + { + "name": "inputInlineQueryResultAnimatedGif", + "description": "Represents a link to an animated GIF", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the query result" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the static result thumbnail (JPEG or GIF), if it exists" + }, + { + "name": "gif_url", + "type": "string", + "description": "The URL of the GIF-file (file size must not exceed 1MB)" + }, + { + "name": "gif_duration", + "type": "int32", + "description": "Duration of the GIF, in seconds" + }, + { + "name": "gif_width", + "type": "int32", + "description": "Width of the GIF" + }, + { + "name": "gif_height", + "type": "int32", + "description": "Height of the GIF" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAnimation, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultAnimatedMpeg4", + "description": "Represents a link to an animated (i.e. without sound) H.264/MPEG-4 AVC video", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the static result thumbnail (JPEG or GIF), if it exists" + }, + { + "name": "mpeg4_url", + "type": "string", + "description": "The URL of the MPEG4-file (file size must not exceed 1MB)" + }, + { + "name": "mpeg4_duration", + "type": "int32", + "description": "Duration of the video, in seconds" + }, + { + "name": "mpeg4_width", + "type": "int32", + "description": "Width of the video" + }, + { + "name": "mpeg4_height", + "type": "int32", + "description": "Height of the video" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAnimation, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultArticle", + "description": "Represents a link to an article or web page", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "url", + "type": "string", + "description": "URL of the result, if it exists" + }, + { + "name": "hide_url", + "type": "Bool", + "description": "True, if the URL must be not shown" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result" + }, + { + "name": "description", + "type": "string", + "description": "A short description of the result" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the result thumbnail, if it exists" + }, + { + "name": "thumbnail_width", + "type": "int32", + "description": "Thumbnail width, if known" + }, + { + "name": "thumbnail_height", + "type": "int32", + "description": "Thumbnail height, if known" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultAudio", + "description": "Represents a link to an MP3 audio file", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the audio file" + }, + { + "name": "performer", + "type": "string", + "description": "Performer of the audio file" + }, + { + "name": "audio_url", + "type": "string", + "description": "The URL of the audio file" + }, + { + "name": "audio_duration", + "type": "int32", + "description": "Audio file duration, in seconds" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAudio, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultContact", + "description": "Represents a user contact", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "contact", + "type": "contact", + "description": "User contact" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the result thumbnail, if it exists" + }, + { + "name": "thumbnail_width", + "type": "int32", + "description": "Thumbnail width, if known" + }, + { + "name": "thumbnail_height", + "type": "int32", + "description": "Thumbnail height, if known" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultDocument", + "description": "Represents a link to a file", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the resulting file" + }, + { + "name": "description", + "type": "string", + "description": "Short description of the result, if known" + }, + { + "name": "document_url", + "type": "string", + "description": "URL of the file" + }, + { + "name": "mime_type", + "type": "string", + "description": "MIME type of the file content; only \"application/pdf\" and \"application/zip\" are currently allowed" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "The URL of the file thumbnail, if it exists" + }, + { + "name": "thumbnail_width", + "type": "int32", + "description": "Width of the thumbnail" + }, + { + "name": "thumbnail_height", + "type": "int32", + "description": "Height of the thumbnail" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageDocument, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultGame", + "description": "Represents a game", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "game_short_name", + "type": "string", + "description": "Short name of the game" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "Message reply markup. Must be of type replyMarkupInlineKeyboard or null" + } + ] + }, + { + "name": "inputInlineQueryResultLocation", + "description": "Represents a point on the map", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "location", + "type": "location", + "description": "Location result" + }, + { + "name": "live_period", + "type": "int32", + "description": "Amount of time relative to the message sent time until the location can be updated, in seconds" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the result thumbnail, if it exists" + }, + { + "name": "thumbnail_width", + "type": "int32", + "description": "Thumbnail width, if known" + }, + { + "name": "thumbnail_height", + "type": "int32", + "description": "Thumbnail height, if known" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultPhoto", + "description": "Represents link to a JPEG image", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result, if known" + }, + { + "name": "description", + "type": "string", + "description": "A short description of the result, if known" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the photo thumbnail, if it exists" + }, + { + "name": "photo_url", + "type": "string", + "description": "The URL of the JPEG photo (photo size must not exceed 5MB)" + }, + { + "name": "photo_width", + "type": "int32", + "description": "Width of the photo" + }, + { + "name": "photo_height", + "type": "int32", + "description": "Height of the photo" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessagePhoto, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultSticker", + "description": "Represents a link to a WEBP sticker", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the sticker thumbnail, if it exists" + }, + { + "name": "sticker_url", + "type": "string", + "description": "The URL of the WEBP sticker (sticker file size must not exceed 5MB)" + }, + { + "name": "sticker_width", + "type": "int32", + "description": "Width of the sticker" + }, + { + "name": "sticker_height", + "type": "int32", + "description": "Height of the sticker" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, inputMessageSticker, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultVenue", + "description": "Represents information about a venue", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "venue", + "type": "venue", + "description": "Venue result" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "URL of the result thumbnail, if it exists" + }, + { + "name": "thumbnail_width", + "type": "int32", + "description": "Thumbnail width, if known" + }, + { + "name": "thumbnail_height", + "type": "int32", + "description": "Thumbnail height, if known" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultVideo", + "description": "Represents a link to a page containing an embedded video player or a video file", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result" + }, + { + "name": "description", + "type": "string", + "description": "A short description of the result, if known" + }, + { + "name": "thumbnail_url", + "type": "string", + "description": "The URL of the video thumbnail (JPEG), if it exists" + }, + { + "name": "video_url", + "type": "string", + "description": "URL of the embedded video player or video file" + }, + { + "name": "mime_type", + "type": "string", + "description": "MIME type of the content of the video URL, only \"text/html\" or \"video/mp4\" are currently supported" + }, + { + "name": "video_width", + "type": "int32", + "description": "Width of the video" + }, + { + "name": "video_height", + "type": "int32", + "description": "Height of the video" + }, + { + "name": "video_duration", + "type": "int32", + "description": "Video duration, in seconds" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageVideo, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inputInlineQueryResultVoiceNote", + "description": "Represents a link to an opus-encoded audio file within an OGG container, single channel audio", + "class": "InputInlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the voice note" + }, + { + "name": "voice_note_url", + "type": "string", + "description": "The URL of the voice note file" + }, + { + "name": "voice_note_duration", + "type": "int32", + "description": "Duration of the voice note, in seconds" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The message reply markup. Must be of type replyMarkupInlineKeyboard or null" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageVoiceNote, InputMessageLocation, InputMessageVenue or InputMessageContact" + } + ] + }, + { + "name": "inlineQueryResultArticle", + "description": "Represents a link to an article or web page", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "url", + "type": "string", + "description": "URL of the result, if it exists" + }, + { + "name": "hide_url", + "type": "Bool", + "description": "True, if the URL must be not shown" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result" + }, + { + "name": "description", + "type": "string", + "description": "A short description of the result" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Result thumbnail; may be null" + } + ] + }, + { + "name": "inlineQueryResultContact", + "description": "Represents a user contact", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "contact", + "type": "contact", + "description": "A user contact" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Result thumbnail; may be null" + } + ] + }, + { + "name": "inlineQueryResultLocation", + "description": "Represents a point on the map", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "location", + "type": "location", + "description": "Location result" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Result thumbnail; may be null" + } + ] + }, + { + "name": "inlineQueryResultVenue", + "description": "Represents information about a venue", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "venue", + "type": "venue", + "description": "Venue result" + }, + { + "name": "thumbnail", + "type": "photoSize", + "description": "Result thumbnail; may be null" + } + ] + }, + { + "name": "inlineQueryResultGame", + "description": "Represents information about a game", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "game", + "type": "game", + "description": "Game result" + } + ] + }, + { + "name": "inlineQueryResultAnimation", + "description": "Represents an animation file", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "animation", + "type": "animation", + "description": "Animation file" + }, + { + "name": "title", + "type": "string", + "description": "Animation title" + } + ] + }, + { + "name": "inlineQueryResultAudio", + "description": "Represents an audio file", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "audio", + "type": "audio", + "description": "Audio file" + } + ] + }, + { + "name": "inlineQueryResultDocument", + "description": "Represents a document", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "document", + "type": "document", + "description": "Document" + }, + { + "name": "title", + "type": "string", + "description": "Document title" + }, + { + "name": "description", + "type": "string", + "description": "Document description" + } + ] + }, + { + "name": "inlineQueryResultPhoto", + "description": "Represents a photo", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "photo", + "type": "photo", + "description": "Photo" + }, + { + "name": "title", + "type": "string", + "description": "Title of the result, if known" + }, + { + "name": "description", + "type": "string", + "description": "A short description of the result, if known" + } + ] + }, + { + "name": "inlineQueryResultSticker", + "description": "Represents a sticker", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "sticker", + "type": "sticker", + "description": "Sticker" + } + ] + }, + { + "name": "inlineQueryResultVideo", + "description": "Represents a video", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "video", + "type": "video", + "description": "Video" + }, + { + "name": "title", + "type": "string", + "description": "Title of the video" + }, + { + "name": "description", + "type": "string", + "description": "Description of the video" + } + ] + }, + { + "name": "inlineQueryResultVoiceNote", + "description": "Represents a voice note", + "class": "InlineQueryResult", + "properties": [ + { + "name": "id", + "type": "string", + "description": "Unique identifier of the query result" + }, + { + "name": "voice_note", + "type": "voiceNote", + "description": "Voice note" + }, + { + "name": "title", + "type": "string", + "description": "Title of the voice note" + } + ] + }, + { + "name": "inlineQueryResults", + "description": "Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query", + "class": "InlineQueryResults", + "properties": [ + { + "name": "inline_query_id", + "type": "int64", + "description": "Unique identifier of the inline query" + }, + { + "name": "next_offset", + "type": "string", + "description": "The offset for the next request. If empty, there are no more results" + }, + { + "name": "results", + "type": "vector\u003cInlineQueryResult\u003e", + "description": "Results of the query" + }, + { + "name": "switch_pm_text", + "type": "string", + "description": "If non-empty, this text should be shown on the button, which opens a private chat with the bot and sends the bot a start message with the switch_pm_parameter" + }, + { + "name": "switch_pm_parameter", + "type": "string", + "description": "Parameter for the bot start message" + } + ] + }, + { + "name": "callbackQueryPayloadData", + "description": "The payload from a general callback button", + "class": "CallbackQueryPayload", + "properties": [ + { + "name": "data", + "type": "bytes", + "description": "Data that was attached to the callback button" + } + ] + }, + { + "name": "callbackQueryPayloadGame", + "description": "The payload from a game callback button", + "class": "CallbackQueryPayload", + "properties": [ + { + "name": "game_short_name", + "type": "string", + "description": "A short name of the game that was attached to the callback button" + } + ] + }, + { + "name": "callbackQueryAnswer", + "description": "Contains a bot's answer to a callback query", + "class": "CallbackQueryAnswer", + "properties": [ + { + "name": "text", + "type": "string", + "description": "Text of the answer" + }, + { + "name": "show_alert", + "type": "Bool", + "description": "True, if an alert should be shown to the user instead of a toast notification" + }, + { + "name": "url", + "type": "string", + "description": "URL to be opened" + } + ] + }, + { + "name": "customRequestResult", + "description": "Contains the result of a custom request", + "class": "CustomRequestResult", + "properties": [ + { + "name": "result", + "type": "string", + "description": "A JSON-serialized result" + } + ] + }, + { + "name": "gameHighScore", + "description": "Contains one row of the game high score table", + "class": "GameHighScore", + "properties": [ + { + "name": "position", + "type": "int32", + "description": "Position in the high score table" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "score", + "type": "int32", + "description": "User score" + } + ] + }, + { + "name": "gameHighScores", + "description": "Contains a list of game high scores", + "class": "GameHighScores", + "properties": [ + { + "name": "scores", + "type": "vector\u003cgameHighScore\u003e", + "description": "A list of game high scores" + } + ] + }, + { + "name": "chatEventMessageEdited", + "description": "A message was edited", + "class": "ChatEventAction", + "properties": [ + { + "name": "old_message", + "type": "message", + "description": "The original message before the edit" + }, + { + "name": "new_message", + "type": "message", + "description": "The message after it was edited" + } + ] + }, + { + "name": "chatEventMessageDeleted", + "description": "A message was deleted", + "class": "ChatEventAction", + "properties": [ + { + "name": "message", + "type": "message", + "description": "Deleted message" + } + ] + }, + { + "name": "chatEventMessagePinned", + "description": "A message was pinned", + "class": "ChatEventAction", + "properties": [ + { + "name": "message", + "type": "message", + "description": "Pinned message" + } + ] + }, + { + "name": "chatEventMessageUnpinned", + "description": "A message was unpinned", + "class": "ChatEventAction", + "properties": [] + }, + { + "name": "chatEventMemberJoined", + "description": "A new member joined the chat", + "class": "ChatEventAction", + "properties": [] + }, + { + "name": "chatEventMemberLeft", + "description": "A member left the chat", + "class": "ChatEventAction", + "properties": [] + }, + { + "name": "chatEventMemberInvited", + "description": "A new chat member was invited", + "class": "ChatEventAction", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "New member user identifier" + }, + { + "name": "status", + "type": "ChatMemberStatus", + "description": "New member status" + } + ] + }, + { + "name": "chatEventMemberPromoted", + "description": "A chat member has gained/lost administrator status, or the list of their administrator privileges has changed", + "class": "ChatEventAction", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Chat member user identifier" + }, + { + "name": "old_status", + "type": "ChatMemberStatus", + "description": "Previous status of the chat member" + }, + { + "name": "new_status", + "type": "ChatMemberStatus", + "description": "New status of the chat member" + } + ] + }, + { + "name": "chatEventMemberRestricted", + "description": "A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed", + "class": "ChatEventAction", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Chat member user identifier" + }, + { + "name": "old_status", + "type": "ChatMemberStatus", + "description": "Previous status of the chat member" + }, + { + "name": "new_status", + "type": "ChatMemberStatus", + "description": "New status of the chat member" + } + ] + }, + { + "name": "chatEventTitleChanged", + "description": "The chat title was changed", + "class": "ChatEventAction", + "properties": [ + { + "name": "old_title", + "type": "string", + "description": "Previous chat title" + }, + { + "name": "new_title", + "type": "string", + "description": "New chat title" + } + ] + }, + { + "name": "chatEventDescriptionChanged", + "description": "The chat description was changed", + "class": "ChatEventAction", + "properties": [ + { + "name": "old_description", + "type": "string", + "description": "Previous chat description" + }, + { + "name": "new_description", + "type": "string", + "description": "New chat description" + } + ] + }, + { + "name": "chatEventUsernameChanged", + "description": "The chat username was changed", + "class": "ChatEventAction", + "properties": [ + { + "name": "old_username", + "type": "string", + "description": "Previous chat username" + }, + { + "name": "new_username", + "type": "string", + "description": "New chat username" + } + ] + }, + { + "name": "chatEventPhotoChanged", + "description": "The chat photo was changed", + "class": "ChatEventAction", + "properties": [ + { + "name": "old_photo", + "type": "chatPhoto", + "description": "Previous chat photo value; may be null" + }, + { + "name": "new_photo", + "type": "chatPhoto", + "description": "New chat photo value; may be null" + } + ] + }, + { + "name": "chatEventInvitesToggled", + "description": "The anyone_can_invite setting of a supergroup chat was toggled", + "class": "ChatEventAction", + "properties": [ + { + "name": "anyone_can_invite", + "type": "Bool", + "description": "New value of anyone_can_invite" + } + ] + }, + { + "name": "chatEventSignMessagesToggled", + "description": "The sign_messages setting of a channel was toggled", + "class": "ChatEventAction", + "properties": [ + { + "name": "sign_messages", + "type": "Bool", + "description": "New value of sign_messages" + } + ] + }, + { + "name": "chatEventStickerSetChanged", + "description": "The supergroup sticker set was changed", + "class": "ChatEventAction", + "properties": [ + { + "name": "old_sticker_set_id", + "type": "int64", + "description": "Previous identifier of the chat sticker set; 0 if none" + }, + { + "name": "new_sticker_set_id", + "type": "int64", + "description": "New identifier of the chat sticker set; 0 if none" + } + ] + }, + { + "name": "chatEventIsAllHistoryAvailableToggled", + "description": "The is_all_history_available setting of a supergroup was toggled", + "class": "ChatEventAction", + "properties": [ + { + "name": "is_all_history_available", + "type": "Bool", + "description": "New value of is_all_history_available" + } + ] + }, + { + "name": "chatEvent", + "description": "Represents a chat event", + "class": "ChatEvent", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Chat event identifier" + }, + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the event happened" + }, + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the user who performed the action that triggered the event" + }, + { + "name": "action", + "type": "ChatEventAction", + "description": "Action performed by the user" + } + ] + }, + { + "name": "chatEvents", + "description": "Contains a list of chat events", + "class": "ChatEvents", + "properties": [ + { + "name": "events", + "type": "vector\u003cchatEvent\u003e", + "description": "List of events" + } + ] + }, + { + "name": "chatEventLogFilters", + "description": "Represents a set of filters used to obtain a chat event log", + "class": "ChatEventLogFilters", + "properties": [ + { + "name": "message_edits", + "type": "Bool", + "description": "True, if message edits should be returned" + }, + { + "name": "message_deletions", + "type": "Bool", + "description": "True, if message deletions should be returned" + }, + { + "name": "message_pins", + "type": "Bool", + "description": "True, if pin/unpin events should be returned" + }, + { + "name": "member_joins", + "type": "Bool", + "description": "True, if members joining events should be returned" + }, + { + "name": "member_leaves", + "type": "Bool", + "description": "True, if members leaving events should be returned" + }, + { + "name": "member_invites", + "type": "Bool", + "description": "True, if invited member events should be returned" + }, + { + "name": "member_promotions", + "type": "Bool", + "description": "True, if member promotion/demotion events should be returned" + }, + { + "name": "member_restrictions", + "type": "Bool", + "description": "True, if member restricted/unrestricted/banned/unbanned events should be returned" + }, + { + "name": "info_changes", + "type": "Bool", + "description": "True, if changes in chat information should be returned" + }, + { + "name": "setting_changes", + "type": "Bool", + "description": "True, if changes in chat settings should be returned" + } + ] + }, + { + "name": "deviceTokenGoogleCloudMessaging", + "description": "A token for Google Cloud Messaging", + "class": "DeviceToken", + "properties": [ + { + "name": "token", + "type": "string", + "description": "Device registration token, may be empty to de-register a device" + } + ] + }, + { + "name": "deviceTokenApplePush", + "description": "A token for Apple Push Notification service", + "class": "DeviceToken", + "properties": [ + { + "name": "device_token", + "type": "string", + "description": "Device token, may be empty to de-register a device" + }, + { + "name": "is_app_sandbox", + "type": "Bool", + "description": "True, if App Sandbox is enabled" + } + ] + }, + { + "name": "deviceTokenApplePushVoIP", + "description": "A token for Apple Push Notification service VoIP notifications", + "class": "DeviceToken", + "properties": [ + { + "name": "device_token", + "type": "string", + "description": "Device token, may be empty to de-register a device" + }, + { + "name": "is_app_sandbox", + "type": "Bool", + "description": "True, if App Sandbox is enabled" + } + ] + }, + { + "name": "deviceTokenWindowsPush", + "description": "A token for Windows Push Notification Services", + "class": "DeviceToken", + "properties": [ + { + "name": "access_token", + "type": "string", + "description": "The access token that will be used to send notifications, may be empty to de-register a device" + } + ] + }, + { + "name": "deviceTokenMicrosoftPush", + "description": "A token for Microsoft Push Notification Service", + "class": "DeviceToken", + "properties": [ + { + "name": "channel_uri", + "type": "string", + "description": "Push notification channel URI, may be empty to de-register a device" + } + ] + }, + { + "name": "deviceTokenMicrosoftPushVoIP", + "description": "A token for Microsoft Push Notification Service VoIP channel", + "class": "DeviceToken", + "properties": [ + { + "name": "channel_uri", + "type": "string", + "description": "Push notification channel URI, may be empty to de-register a device" + } + ] + }, + { + "name": "deviceTokenWebPush", + "description": "A token for web Push API", + "class": "DeviceToken", + "properties": [ + { + "name": "endpoint", + "type": "string", + "description": "Absolute URL exposed by the push service where the application server can send push messages, may be empty to de-register a device" + }, + { + "name": "p256dh_base64url", + "type": "string", + "description": "Base64url-encoded P-256 elliptic curve Diffie-Hellman public key" + }, + { + "name": "auth_base64url", + "type": "string", + "description": "Base64url-encoded authentication secret" + } + ] + }, + { + "name": "deviceTokenSimplePush", + "description": "A token for Simple Push API for Firefox OS", + "class": "DeviceToken", + "properties": [ + { + "name": "endpoint", + "type": "string", + "description": "Absolute URL exposed by the push service where the application server can send push messages, may be empty to de-register a device" + } + ] + }, + { + "name": "deviceTokenUbuntuPush", + "description": "A token for Ubuntu Push Client service", + "class": "DeviceToken", + "properties": [ + { + "name": "token", + "type": "string", + "description": "Token, may be empty to de-register a device" + } + ] + }, + { + "name": "deviceTokenBlackBerryPush", + "description": "A token for BlackBerry Push Service", + "class": "DeviceToken", + "properties": [ + { + "name": "token", + "type": "string", + "description": "Token, may be empty to de-register a device" + } + ] + }, + { + "name": "deviceTokenTizenPush", + "description": "A token for Tizen Push Service", + "class": "DeviceToken", + "properties": [ + { + "name": "reg_id", + "type": "string", + "description": "Push service registration identifier, may be empty to de-register a device" + } + ] + }, + { + "name": "wallpaper", + "description": "Contains information about a wallpaper", + "class": "Wallpaper", + "properties": [ + { + "name": "id", + "type": "int32", + "description": "Unique persistent wallpaper identifier" + }, + { + "name": "sizes", + "type": "vector\u003cphotoSize\u003e", + "description": "Available variants of the wallpaper in different sizes. These photos can only be downloaded; they can't be sent in a message" + }, + { + "name": "color", + "type": "int32", + "description": "Main color of the wallpaper in RGB24 format; should be treated as background color if no photos are specified" + } + ] + }, + { + "name": "wallpapers", + "description": "Contains a list of wallpapers", + "class": "Wallpapers", + "properties": [ + { + "name": "wallpapers", + "type": "vector\u003cwallpaper\u003e", + "description": "A list of wallpapers" + } + ] + }, + { + "name": "hashtags", + "description": "Contains a list of hashtags", + "class": "Hashtags", + "properties": [ + { + "name": "hashtags", + "type": "vector\u003cstring\u003e", + "description": "A list of hashtags" + } + ] + }, + { + "name": "checkChatUsernameResultOk", + "description": "The username can be set", + "class": "CheckChatUsernameResult", + "properties": [] + }, + { + "name": "checkChatUsernameResultUsernameInvalid", + "description": "The username is invalid", + "class": "CheckChatUsernameResult", + "properties": [] + }, + { + "name": "checkChatUsernameResultUsernameOccupied", + "description": "The username is occupied", + "class": "CheckChatUsernameResult", + "properties": [] + }, + { + "name": "checkChatUsernameResultPublicChatsTooMuch", + "description": "The user has too much public chats, one of them should be made private first", + "class": "CheckChatUsernameResult", + "properties": [] + }, + { + "name": "checkChatUsernameResultPublicGroupsUnavailable", + "description": "The user can't be a member of a public supergroup", + "class": "CheckChatUsernameResult", + "properties": [] + }, + { + "name": "optionValueBoolean", + "description": "Boolean option", + "class": "OptionValue", + "properties": [ + { + "name": "value", + "type": "Bool", + "description": "The value of the option" + } + ] + }, + { + "name": "optionValueEmpty", + "description": "An unknown option or an option which has a default value", + "class": "OptionValue", + "properties": [] + }, + { + "name": "optionValueInteger", + "description": "An integer option", + "class": "OptionValue", + "properties": [ + { + "name": "value", + "type": "int32", + "description": "The value of the option" + } + ] + }, + { + "name": "optionValueString", + "description": "A string option", + "class": "OptionValue", + "properties": [ + { + "name": "value", + "type": "string", + "description": "The value of the option" + } + ] + }, + { + "name": "userPrivacySettingRuleAllowAll", + "description": "A rule to allow all users to do something", + "class": "UserPrivacySettingRule", + "properties": [] + }, + { + "name": "userPrivacySettingRuleAllowContacts", + "description": "A rule to allow all of a user's contacts to do something", + "class": "UserPrivacySettingRule", + "properties": [] + }, + { + "name": "userPrivacySettingRuleAllowUsers", + "description": "A rule to allow certain specified users to do something", + "class": "UserPrivacySettingRule", + "properties": [ + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "The user identifiers" + } + ] + }, + { + "name": "userPrivacySettingRuleRestrictAll", + "description": "A rule to restrict all users from doing something", + "class": "UserPrivacySettingRule", + "properties": [] + }, + { + "name": "userPrivacySettingRuleRestrictContacts", + "description": "A rule to restrict all contacts of a user from doing something", + "class": "UserPrivacySettingRule", + "properties": [] + }, + { + "name": "userPrivacySettingRuleRestrictUsers", + "description": "A rule to restrict all specified users from doing something", + "class": "UserPrivacySettingRule", + "properties": [ + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "The user identifiers" + } + ] + }, + { + "name": "userPrivacySettingRules", + "description": "A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed", + "class": "UserPrivacySettingRules", + "properties": [ + { + "name": "rules", + "type": "vector\u003cUserPrivacySettingRule\u003e", + "description": "A list of rules" + } + ] + }, + { + "name": "userPrivacySettingShowStatus", + "description": "A privacy setting for managing whether the user's online status is visible", + "class": "UserPrivacySetting", + "properties": [] + }, + { + "name": "userPrivacySettingAllowChatInvites", + "description": "A privacy setting for managing whether the user can be invited to chats", + "class": "UserPrivacySetting", + "properties": [] + }, + { + "name": "userPrivacySettingAllowCalls", + "description": "A privacy setting for managing whether the user can be called", + "class": "UserPrivacySetting", + "properties": [] + }, + { + "name": "accountTtl", + "description": "Contains information about the period of inactivity after which the current user's account will automatically be deleted", + "class": "AccountTtl", + "properties": [ + { + "name": "days", + "type": "int32", + "description": "Number of days of inactivity before the account will be flagged for deletion; should range from 30-366 days" + } + ] + }, + { + "name": "session", + "description": "Contains information about one session in a Telegram application used by the current user", + "class": "Session", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Session identifier" + }, + { + "name": "is_current", + "type": "Bool", + "description": "True, if this session is the current session" + }, + { + "name": "api_id", + "type": "int32", + "description": "Telegram API identifier, as provided by the application" + }, + { + "name": "application_name", + "type": "string", + "description": "Name of the application, as provided by the application" + }, + { + "name": "application_version", + "type": "string", + "description": "The version of the application, as provided by the application" + }, + { + "name": "is_official_application", + "type": "Bool", + "description": "True, if the application is an official application or uses the api_id of an official application" + }, + { + "name": "device_model", + "type": "string", + "description": "Model of the device the application has been run or is running on, as provided by the application" + }, + { + "name": "platform", + "type": "string", + "description": "Operating system the application has been run or is running on, as provided by the application" + }, + { + "name": "system_version", + "type": "string", + "description": "Version of the operating system the application has been run or is running on, as provided by the application" + }, + { + "name": "log_in_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the user has logged in" + }, + { + "name": "last_active_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the session was last used" + }, + { + "name": "ip", + "type": "string", + "description": "IP address from which the session was created, in human-readable format" + }, + { + "name": "country", + "type": "string", + "description": "A two-letter country code for the country from which the session was created, based on the IP address" + }, + { + "name": "region", + "type": "string", + "description": "Region code from which the session was created, based on the IP address" + } + ] + }, + { + "name": "sessions", + "description": "Contains a list of sessions", + "class": "Sessions", + "properties": [ + { + "name": "sessions", + "type": "vector\u003csession\u003e", + "description": "List of sessions" + } + ] + }, + { + "name": "connectedWebsite", + "description": "Contains information about one website the current user is logged in with Telegram", + "class": "ConnectedWebsite", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Website identifier" + }, + { + "name": "domain_name", + "type": "string", + "description": "The domain name of the website" + }, + { + "name": "bot_user_id", + "type": "int32", + "description": "User identifier of a bot linked with the website" + }, + { + "name": "browser", + "type": "string", + "description": "The version of a browser used to log in" + }, + { + "name": "platform", + "type": "string", + "description": "Operating system the browser is running on" + }, + { + "name": "log_in_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the user was logged in" + }, + { + "name": "last_active_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when obtained authorization was last used" + }, + { + "name": "ip", + "type": "string", + "description": "IP address from which the user was logged in, in human-readable format" + }, + { + "name": "location", + "type": "string", + "description": "Human-readable description of a country and a region, from which the user was logged in, based on the IP address" + } + ] + }, + { + "name": "connectedWebsites", + "description": "Contains a list of websites the current user is logged in with Telegram", + "class": "ConnectedWebsites", + "properties": [ + { + "name": "websites", + "type": "vector\u003cconnectedWebsite\u003e", + "description": "List of connected websites" + } + ] + }, + { + "name": "chatReportSpamState", + "description": "Contains information about the availability of the \"Report spam\" action for a chat", + "class": "ChatReportSpamState", + "properties": [ + { + "name": "can_report_spam", + "type": "Bool", + "description": "True, if a prompt with the \"Report spam\" action should be shown to the user" + } + ] + }, + { + "name": "chatReportReasonSpam", + "description": "The chat contains spam messages", + "class": "ChatReportReason", + "properties": [] + }, + { + "name": "chatReportReasonViolence", + "description": "The chat promotes violence", + "class": "ChatReportReason", + "properties": [] + }, + { + "name": "chatReportReasonPornography", + "description": "The chat contains pornographic messages", + "class": "ChatReportReason", + "properties": [] + }, + { + "name": "chatReportReasonCustom", + "description": "A custom reason provided by the user", + "class": "ChatReportReason", + "properties": [ + { + "name": "text", + "type": "string", + "description": "Report text" + } + ] + }, + { + "name": "publicMessageLink", + "description": "Contains a public HTTPS link to a message in a public supergroup or channel", + "class": "PublicMessageLink", + "properties": [ + { + "name": "link", + "type": "string", + "description": "Message link" + }, + { + "name": "html", + "type": "string", + "description": "HTML-code for embedding the message" + } + ] + }, + { + "name": "fileTypeNone", + "description": "The data is not a file", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeAnimation", + "description": "The file is an animation", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeAudio", + "description": "The file is an audio file", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeDocument", + "description": "The file is a document", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypePhoto", + "description": "The file is a photo", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeProfilePhoto", + "description": "The file is a profile photo", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeSecret", + "description": "The file was sent to a secret chat (the file type is not known to the server)", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeSticker", + "description": "The file is a sticker", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeThumbnail", + "description": "The file is a thumbnail of another file", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeUnknown", + "description": "The file type is not yet known", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeVideo", + "description": "The file is a video", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeVideoNote", + "description": "The file is a video note", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeVoiceNote", + "description": "The file is a voice note", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeWallpaper", + "description": "The file is a wallpaper", + "class": "FileType", + "properties": [] + }, + { + "name": "fileTypeSecretThumbnail", + "description": "The file is a thumbnail of a file from a secret chat", + "class": "FileType", + "properties": [] + }, + { + "name": "storageStatisticsByFileType", + "description": "Contains the storage usage statistics for a specific file type", + "class": "StorageStatisticsByFileType", + "properties": [ + { + "name": "file_type", + "type": "FileType", + "description": "File type" + }, + { + "name": "size", + "type": "int53", + "description": "Total size of the files" + }, + { + "name": "count", + "type": "int32", + "description": "Total number of files" + } + ] + }, + { + "name": "storageStatisticsByChat", + "description": "Contains the storage usage statistics for a specific chat", + "class": "StorageStatisticsByChat", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier; 0 if none" + }, + { + "name": "size", + "type": "int53", + "description": "Total size of the files in the chat" + }, + { + "name": "count", + "type": "int32", + "description": "Total number of files in the chat" + }, + { + "name": "by_file_type", + "type": "vector\u003cstorageStatisticsByFileType\u003e", + "description": "Statistics split by file types" + } + ] + }, + { + "name": "storageStatistics", + "description": "Contains the exact storage usage statistics split by chats and file type", + "class": "StorageStatistics", + "properties": [ + { + "name": "size", + "type": "int53", + "description": "Total size of files" + }, + { + "name": "count", + "type": "int32", + "description": "Total number of files" + }, + { + "name": "by_chat", + "type": "vector\u003cstorageStatisticsByChat\u003e", + "description": "Statistics split by chats" + } + ] + }, + { + "name": "storageStatisticsFast", + "description": "Contains approximate storage usage statistics, excluding files of unknown file type", + "class": "StorageStatisticsFast", + "properties": [ + { + "name": "files_size", + "type": "int53", + "description": "Approximate total size of files" + }, + { + "name": "file_count", + "type": "int32", + "description": "Approximate number of files" + }, + { + "name": "database_size", + "type": "int53", + "description": "Size of the database" + } + ] + }, + { + "name": "networkTypeNone", + "description": "The network is not available", + "class": "NetworkType", + "properties": [] + }, + { + "name": "networkTypeMobile", + "description": "A mobile network", + "class": "NetworkType", + "properties": [] + }, + { + "name": "networkTypeMobileRoaming", + "description": "A mobile roaming network", + "class": "NetworkType", + "properties": [] + }, + { + "name": "networkTypeWiFi", + "description": "A Wi-Fi network", + "class": "NetworkType", + "properties": [] + }, + { + "name": "networkTypeOther", + "description": "A different network type (e.g., Ethernet network)", + "class": "NetworkType", + "properties": [] + }, + { + "name": "networkStatisticsEntryFile", + "description": "Contains information about the total amount of data that was used to send and receive files", + "class": "NetworkStatisticsEntry", + "properties": [ + { + "name": "file_type", + "type": "FileType", + "description": "Type of the file the data is part of" + }, + { + "name": "network_type", + "type": "NetworkType", + "description": "Type of the network the data was sent through. Call setNetworkType to maintain the actual network type" + }, + { + "name": "sent_bytes", + "type": "int53", + "description": "Total number of bytes sent" + }, + { + "name": "received_bytes", + "type": "int53", + "description": "Total number of bytes received" + } + ] + }, + { + "name": "networkStatisticsEntryCall", + "description": "Contains information about the total amount of data that was used for calls", + "class": "NetworkStatisticsEntry", + "properties": [ + { + "name": "network_type", + "type": "NetworkType", + "description": "Type of the network the data was sent through. Call setNetworkType to maintain the actual network type" + }, + { + "name": "sent_bytes", + "type": "int53", + "description": "Total number of bytes sent" + }, + { + "name": "received_bytes", + "type": "int53", + "description": "Total number of bytes received" + }, + { + "name": "duration", + "type": "double", + "description": "Total call duration, in seconds" + } + ] + }, + { + "name": "networkStatistics", + "description": "A full list of available network statistic entries", + "class": "NetworkStatistics", + "properties": [ + { + "name": "since_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the app began collecting statistics" + }, + { + "name": "entries", + "type": "vector\u003cNetworkStatisticsEntry\u003e", + "description": "Network statistics entries" + } + ] + }, + { + "name": "connectionStateWaitingForNetwork", + "description": "Currently waiting for the network to become available. Use SetNetworkType to change the available network type", + "class": "ConnectionState", + "properties": [] + }, + { + "name": "connectionStateConnectingToProxy", + "description": "Currently establishing a connection with a proxy server", + "class": "ConnectionState", + "properties": [] + }, + { + "name": "connectionStateConnecting", + "description": "Currently establishing a connection to the Telegram servers", + "class": "ConnectionState", + "properties": [] + }, + { + "name": "connectionStateUpdating", + "description": "Downloading data received while the client was offline", + "class": "ConnectionState", + "properties": [] + }, + { + "name": "connectionStateReady", + "description": "There is a working connection to the Telegram servers", + "class": "ConnectionState", + "properties": [] + }, + { + "name": "topChatCategoryUsers", + "description": "A category containing frequently used private chats with non-bot users", + "class": "TopChatCategory", + "properties": [] + }, + { + "name": "topChatCategoryBots", + "description": "A category containing frequently used private chats with bot users", + "class": "TopChatCategory", + "properties": [] + }, + { + "name": "topChatCategoryGroups", + "description": "A category containing frequently used basic groups and supergroups", + "class": "TopChatCategory", + "properties": [] + }, + { + "name": "topChatCategoryChannels", + "description": "A category containing frequently used channels", + "class": "TopChatCategory", + "properties": [] + }, + { + "name": "topChatCategoryInlineBots", + "description": "A category containing frequently used chats with inline bots sorted by their usage in inline mode", + "class": "TopChatCategory", + "properties": [] + }, + { + "name": "topChatCategoryCalls", + "description": "A category containing frequently used chats used for calls", + "class": "TopChatCategory", + "properties": [] + }, + { + "name": "tMeUrlTypeUser", + "description": "A URL linking to a user", + "class": "TMeUrlType", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the user" + } + ] + }, + { + "name": "tMeUrlTypeSupergroup", + "description": "A URL linking to a public supergroup or channel", + "class": "TMeUrlType", + "properties": [ + { + "name": "supergroup_id", + "type": "int53", + "description": "Identifier of the supergroup or channel" + } + ] + }, + { + "name": "tMeUrlTypeChatInvite", + "description": "A chat invite link", + "class": "TMeUrlType", + "properties": [ + { + "name": "info", + "type": "chatInviteLinkInfo", + "description": "Chat invite link info" + } + ] + }, + { + "name": "tMeUrlTypeStickerSet", + "description": "A URL linking to a sticker set", + "class": "TMeUrlType", + "properties": [ + { + "name": "sticker_set_id", + "type": "int64", + "description": "Identifier of the sticker set" + } + ] + }, + { + "name": "tMeUrl", + "description": "Represents a URL linking to an internal Telegram entity", + "class": "TMeUrl", + "properties": [ + { + "name": "url", + "type": "string", + "description": "URL" + }, + { + "name": "type", + "type": "TMeUrlType", + "description": "Type of the URL" + } + ] + }, + { + "name": "tMeUrls", + "description": "Contains a list of t.me URLs", + "class": "TMeUrls", + "properties": [ + { + "name": "urls", + "type": "vector\u003ctMeUrl\u003e", + "description": "List of URLs" + } + ] + }, + { + "name": "count", + "description": "Contains a counter", + "class": "Count", + "properties": [ + { + "name": "count", + "type": "int32", + "description": "Count" + } + ] + }, + { + "name": "text", + "description": "Contains some text", + "class": "Text", + "properties": [ + { + "name": "text", + "type": "string", + "description": "Text" + } + ] + }, + { + "name": "textParseModeMarkdown", + "description": "The text should be parsed in markdown-style", + "class": "TextParseMode", + "properties": [] + }, + { + "name": "textParseModeHTML", + "description": "The text should be parsed in HTML-style", + "class": "TextParseMode", + "properties": [] + }, + { + "name": "proxyEmpty", + "description": "An empty proxy server", + "class": "Proxy", + "properties": [] + }, + { + "name": "proxySocks5", + "description": "A SOCKS5 proxy server", + "class": "Proxy", + "properties": [ + { + "name": "server", + "type": "string", + "description": "Proxy server IP address" + }, + { + "name": "port", + "type": "int32", + "description": "Proxy server port" + }, + { + "name": "username", + "type": "string", + "description": "Username for logging in" + }, + { + "name": "password", + "type": "string", + "description": "Password for logging in" + } + ] + }, + { + "name": "inputSticker", + "description": "Describes a sticker that should be added to a sticker set", + "class": "InputSticker", + "properties": [ + { + "name": "png_sticker", + "type": "InputFile", + "description": "PNG image with the sticker; must be up to 512 kB in size and fit in a 512x512 square" + }, + { + "name": "emojis", + "type": "string", + "description": "Emoji corresponding to the sticker" + }, + { + "name": "mask_position", + "type": "maskPosition", + "description": "For masks, position where the mask should be placed; may be null" + } + ] + }, + { + "name": "updateAuthorizationState", + "description": "The user authorization state has changed", + "class": "Update", + "properties": [ + { + "name": "authorization_state", + "type": "AuthorizationState", + "description": "New authorization state" + } + ] + }, + { + "name": "updateNewMessage", + "description": "A new message was received; can also be an outgoing message", + "class": "Update", + "properties": [ + { + "name": "message", + "type": "message", + "description": "The new message" + }, + { + "name": "disable_notification", + "type": "Bool", + "description": "True, if this message must not generate a notification" + }, + { + "name": "contains_mention", + "type": "Bool", + "description": "True, if the message contains a mention of the current user" + } + ] + }, + { + "name": "updateMessageSendAcknowledged", + "description": "A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully or even that the send message request will be processed. This update will be sent only if the option \"use_quick_ack\" is set to true. This update may be sent multiple times for the same message", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "The chat identifier of the sent message" + }, + { + "name": "message_id", + "type": "int53", + "description": "A temporary message identifier" + } + ] + }, + { + "name": "updateMessageSendSucceeded", + "description": "A message has been successfully sent", + "class": "Update", + "properties": [ + { + "name": "message", + "type": "message", + "description": "Information about the sent message. Usually only the message identifier, date, and content are changed, but almost all other fields can also change" + }, + { + "name": "old_message_id", + "type": "int53", + "description": "The previous temporary message identifier" + } + ] + }, + { + "name": "updateMessageSendFailed", + "description": "A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update", + "class": "Update", + "properties": [ + { + "name": "message", + "type": "message", + "description": "Contains information about the message that failed to send" + }, + { + "name": "old_message_id", + "type": "int53", + "description": "The previous temporary message identifier" + }, + { + "name": "error_code", + "type": "int32", + "description": "An error code" + }, + { + "name": "error_message", + "type": "string", + "description": "Error message" + } + ] + }, + { + "name": "updateMessageContent", + "description": "The message content has changed", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + }, + { + "name": "new_content", + "type": "MessageContent", + "description": "New message content" + } + ] + }, + { + "name": "updateMessageEdited", + "description": "A message was edited. Changes in the message content will come in a separate updateMessageContent", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + }, + { + "name": "edit_date", + "type": "int32", + "description": "Point in time (Unix timestamp) when the message was edited" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "New message reply markup; may be null" + } + ] + }, + { + "name": "updateMessageViews", + "description": "The view count of the message has changed", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + }, + { + "name": "views", + "type": "int32", + "description": "New value of the view count" + } + ] + }, + { + "name": "updateMessageContentOpened", + "description": "The message content was opened. Updates voice note messages to \"listened\", video note messages to \"viewed\" and starts the TTL timer for self-destructing messages", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + } + ] + }, + { + "name": "updateMessageMentionRead", + "description": "A message with an unread mention was read", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + }, + { + "name": "unread_mention_count", + "type": "int32", + "description": "The new number of unread mention messages left in the chat" + } + ] + }, + { + "name": "updateNewChat", + "description": "A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the client. The chat field changes will be reported through separate updates", + "class": "Update", + "properties": [ + { + "name": "chat", + "type": "chat", + "description": "The chat" + } + ] + }, + { + "name": "updateChatTitle", + "description": "The title of a chat was changed", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "title", + "type": "string", + "description": "The new chat title" + } + ] + }, + { + "name": "updateChatPhoto", + "description": "A chat photo was changed", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "photo", + "type": "chatPhoto", + "description": "The new chat photo; may be null" + } + ] + }, + { + "name": "updateChatLastMessage", + "description": "The last message of a chat was changed. If last_message is null then the last message in the chat became unknown. Some new unknown messages might be added to the chat in this case", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "last_message", + "type": "message", + "description": "The new last message in the chat; may be null" + }, + { + "name": "order", + "type": "int64", + "description": "New value of the chat order" + } + ] + }, + { + "name": "updateChatOrder", + "description": "The order of the chat in the chats list has changed. Instead of this update updateChatLastMessage, updateChatIsPinned or updateChatDraftMessage might be sent", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "order", + "type": "int64", + "description": "New value of the order" + } + ] + }, + { + "name": "updateChatIsPinned", + "description": "A chat was pinned or unpinned", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "is_pinned", + "type": "Bool", + "description": "New value of is_pinned" + }, + { + "name": "order", + "type": "int64", + "description": "New value of the chat order" + } + ] + }, + { + "name": "updateChatReadInbox", + "description": "Incoming messages were read or number of unread messages has been changed", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "last_read_inbox_message_id", + "type": "int53", + "description": "Identifier of the last read incoming message" + }, + { + "name": "unread_count", + "type": "int32", + "description": "The number of unread messages left in the chat" + } + ] + }, + { + "name": "updateChatReadOutbox", + "description": "Outgoing messages were read", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "last_read_outbox_message_id", + "type": "int53", + "description": "Identifier of last read outgoing message" + } + ] + }, + { + "name": "updateChatUnreadMentionCount", + "description": "The chat unread_mention_count has changed", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "unread_mention_count", + "type": "int32", + "description": "The number of unread mention messages left in the chat" + } + ] + }, + { + "name": "updateNotificationSettings", + "description": "Notification settings for some chats were updated", + "class": "Update", + "properties": [ + { + "name": "scope", + "type": "NotificationSettingsScope", + "description": "Types of chats for which notification settings were updated" + }, + { + "name": "notification_settings", + "type": "notificationSettings", + "description": "The new notification settings" + } + ] + }, + { + "name": "updateChatReplyMarkup", + "description": "The default chat reply markup was changed. Can occur because new messages with reply markup were received or because an old reply markup was hidden by the user", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "reply_markup_message_id", + "type": "int53", + "description": "Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat" + } + ] + }, + { + "name": "updateChatDraftMessage", + "description": "A draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update shouldn't be applied", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "draft_message", + "type": "draftMessage", + "description": "The new draft message; may be null" + }, + { + "name": "order", + "type": "int64", + "description": "New value of the chat order" + } + ] + }, + { + "name": "updateDeleteMessages", + "description": "Some messages were deleted", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_ids", + "type": "vector\u003cint53\u003e", + "description": "Identifiers of the deleted messages" + }, + { + "name": "is_permanent", + "type": "Bool", + "description": "True, if the messages are permanently deleted by a user (as opposed to just becoming unaccessible)" + }, + { + "name": "from_cache", + "type": "Bool", + "description": "True, if the messages are deleted only from the cache and can possibly be retrieved again in the future" + } + ] + }, + { + "name": "updateUserChatAction", + "description": "User activity in the chat has changed", + "class": "Update", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "Identifier of a user performing an action" + }, + { + "name": "action", + "type": "ChatAction", + "description": "The action description" + } + ] + }, + { + "name": "updateUserStatus", + "description": "The user went online or offline", + "class": "Update", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "status", + "type": "UserStatus", + "description": "New status of the user" + } + ] + }, + { + "name": "updateUser", + "description": "Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the client", + "class": "Update", + "properties": [ + { + "name": "user", + "type": "user", + "description": "New data about the user" + } + ] + }, + { + "name": "updateBasicGroup", + "description": "Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the client", + "class": "Update", + "properties": [ + { + "name": "basic_group", + "type": "basicGroup", + "description": "New data about the group" + } + ] + }, + { + "name": "updateSupergroup", + "description": "Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the client", + "class": "Update", + "properties": [ + { + "name": "supergroup", + "type": "supergroup", + "description": "New data about the supergroup" + } + ] + }, + { + "name": "updateSecretChat", + "description": "Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the client", + "class": "Update", + "properties": [ + { + "name": "secret_chat", + "type": "secretChat", + "description": "New data about the secret chat" + } + ] + }, + { + "name": "updateUserFullInfo", + "description": "Some data from userFullInfo has been changed", + "class": "Update", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "user_full_info", + "type": "userFullInfo", + "description": "New full information about the user" + } + ] + }, + { + "name": "updateBasicGroupFullInfo", + "description": "Some data from basicGroupFullInfo has been changed", + "class": "Update", + "properties": [ + { + "name": "basic_group_id", + "type": "int32", + "description": "Identifier of a basic group" + }, + { + "name": "basic_group_full_info", + "type": "basicGroupFullInfo", + "description": "New full information about the group" + } + ] + }, + { + "name": "updateSupergroupFullInfo", + "description": "Some data from supergroupFullInfo has been changed", + "class": "Update", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup or channel" + }, + { + "name": "supergroup_full_info", + "type": "supergroupFullInfo", + "description": "New full information about the supergroup" + } + ] + }, + { + "name": "updateServiceNotification", + "description": "Service notification from the server. Upon receiving this the client must show a popup with the content of the notification", + "class": "Update", + "properties": [ + { + "name": "type", + "type": "string", + "description": "Notification type" + }, + { + "name": "content", + "type": "MessageContent", + "description": "Notification content" + } + ] + }, + { + "name": "updateFile", + "description": "Information about a file was updated", + "class": "Update", + "properties": [ + { + "name": "file", + "type": "file", + "description": "New data about the file" + } + ] + }, + { + "name": "updateFileGenerationStart", + "description": "The file generation process needs to be started by the client", + "class": "Update", + "properties": [ + { + "name": "generation_id", + "type": "int64", + "description": "Unique identifier for the generation process" + }, + { + "name": "original_path", + "type": "string", + "description": "The path to a file from which a new file is generated, may be empty" + }, + { + "name": "destination_path", + "type": "string", + "description": "The path to a file that should be created and where the new file should be generated" + }, + { + "name": "conversion", + "type": "string", + "description": "String specifying the conversion applied to the original file. If conversion is \"#url#\" than original_path contains a HTTP/HTTPS URL of a file, which should be downloaded by the client" + } + ] + }, + { + "name": "updateFileGenerationStop", + "description": "File generation is no longer needed", + "class": "Update", + "properties": [ + { + "name": "generation_id", + "type": "int64", + "description": "Unique identifier for the generation process" + } + ] + }, + { + "name": "updateCall", + "description": "New call was created or information about a call was updated", + "class": "Update", + "properties": [ + { + "name": "call", + "type": "call", + "description": "New data about a call" + } + ] + }, + { + "name": "updateUserPrivacySettingRules", + "description": "Some privacy setting rules have been changed", + "class": "Update", + "properties": [ + { + "name": "setting", + "type": "UserPrivacySetting", + "description": "The privacy setting" + }, + { + "name": "rules", + "type": "userPrivacySettingRules", + "description": "New privacy rules" + } + ] + }, + { + "name": "updateUnreadMessageCount", + "description": "Number of unread messages has changed. This update is sent only if a message database is used", + "class": "Update", + "properties": [ + { + "name": "unread_count", + "type": "int32", + "description": "Total number of unread messages" + }, + { + "name": "unread_unmuted_count", + "type": "int32", + "description": "Total number of unread messages in unmuted chats" + } + ] + }, + { + "name": "updateOption", + "description": "An option changed its value", + "class": "Update", + "properties": [ + { + "name": "name", + "type": "string", + "description": "The option name" + }, + { + "name": "value", + "type": "OptionValue", + "description": "The new option value" + } + ] + }, + { + "name": "updateInstalledStickerSets", + "description": "The list of installed sticker sets was updated", + "class": "Update", + "properties": [ + { + "name": "is_masks", + "type": "Bool", + "description": "True, if the list of installed mask sticker sets was updated" + }, + { + "name": "sticker_set_ids", + "type": "vector\u003cint64\u003e", + "description": "The new list of installed ordinary sticker sets" + } + ] + }, + { + "name": "updateTrendingStickerSets", + "description": "The list of trending sticker sets was updated or some of them were viewed", + "class": "Update", + "properties": [ + { + "name": "sticker_sets", + "type": "stickerSets", + "description": "The new list of trending sticker sets" + } + ] + }, + { + "name": "updateRecentStickers", + "description": "The list of recently used stickers was updated", + "class": "Update", + "properties": [ + { + "name": "is_attached", + "type": "Bool", + "description": "True, if the list of stickers attached to photo or video files was updated, otherwise the list of sent stickers is updated" + }, + { + "name": "sticker_ids", + "type": "vector\u003cint32\u003e", + "description": "The new list of file identifiers of recently used stickers" + } + ] + }, + { + "name": "updateFavoriteStickers", + "description": "The list of favorite stickers was updated", + "class": "Update", + "properties": [ + { + "name": "sticker_ids", + "type": "vector\u003cint32\u003e", + "description": "The new list of file identifiers of favorite stickers" + } + ] + }, + { + "name": "updateSavedAnimations", + "description": "The list of saved animations was updated", + "class": "Update", + "properties": [ + { + "name": "animation_ids", + "type": "vector\u003cint32\u003e", + "description": "The new list of file identifiers of saved animations" + } + ] + }, + { + "name": "updateConnectionState", + "description": "The connection state has changed", + "class": "Update", + "properties": [ + { + "name": "state", + "type": "ConnectionState", + "description": "The new connection state" + } + ] + }, + { + "name": "updateNewInlineQuery", + "description": "A new incoming inline query; for bots only", + "class": "Update", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Unique query identifier" + }, + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user who sent the query" + }, + { + "name": "user_location", + "type": "location", + "description": "User location, provided by the client; may be null" + }, + { + "name": "query", + "type": "string", + "description": "Text of the query" + }, + { + "name": "offset", + "type": "string", + "description": "Offset of the first entry to return" + } + ] + }, + { + "name": "updateNewChosenInlineResult", + "description": "The user has chosen a result of an inline query; for bots only", + "class": "Update", + "properties": [ + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user who sent the query" + }, + { + "name": "user_location", + "type": "location", + "description": "User location, provided by the client; may be null" + }, + { + "name": "query", + "type": "string", + "description": "Text of the query" + }, + { + "name": "result_id", + "type": "string", + "description": "Identifier of the chosen result" + }, + { + "name": "inline_message_id", + "type": "string", + "description": "Identifier of the sent inline message, if known" + } + ] + }, + { + "name": "updateNewCallbackQuery", + "description": "A new incoming callback query; for bots only", + "class": "Update", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Unique query identifier" + }, + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user who sent the query" + }, + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat, in which the query was sent" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message, from which the query originated" + }, + { + "name": "chat_instance", + "type": "int64", + "description": "Identifier that uniquely corresponds to the chat to which the message was sent" + }, + { + "name": "payload", + "type": "CallbackQueryPayload", + "description": "Query payload" + } + ] + }, + { + "name": "updateNewInlineCallbackQuery", + "description": "A new incoming callback query from a message sent via a bot; for bots only", + "class": "Update", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Unique query identifier" + }, + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user who sent the query" + }, + { + "name": "inline_message_id", + "type": "string", + "description": "Identifier of the inline message, from which the query originated" + }, + { + "name": "chat_instance", + "type": "int64", + "description": "An identifier uniquely corresponding to the chat a message was sent to" + }, + { + "name": "payload", + "type": "CallbackQueryPayload", + "description": "Query payload" + } + ] + }, + { + "name": "updateNewShippingQuery", + "description": "A new incoming shipping query; for bots only. Only for invoices with flexible price", + "class": "Update", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Unique query identifier" + }, + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user who sent the query" + }, + { + "name": "invoice_payload", + "type": "string", + "description": "Invoice payload" + }, + { + "name": "shipping_address", + "type": "shippingAddress", + "description": "User shipping address" + } + ] + }, + { + "name": "updateNewPreCheckoutQuery", + "description": "A new incoming pre-checkout query; for bots only. Contains full information about a checkout", + "class": "Update", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "Unique query identifier" + }, + { + "name": "sender_user_id", + "type": "int32", + "description": "Identifier of the user who sent the query" + }, + { + "name": "currency", + "type": "string", + "description": "Currency for the product price" + }, + { + "name": "total_amount", + "type": "int53", + "description": "Total price for the product, in the minimal quantity of the currency" + }, + { + "name": "invoice_payload", + "type": "bytes", + "description": "Invoice payload" + }, + { + "name": "shipping_option_id", + "type": "string", + "description": "Identifier of a shipping option chosen by the user; may be empty if not applicable" + }, + { + "name": "order_info", + "type": "orderInfo", + "description": "Information about the order; may be null" + } + ] + }, + { + "name": "updateNewCustomEvent", + "description": "A new incoming event; for bots only", + "class": "Update", + "properties": [ + { + "name": "event", + "type": "string", + "description": "A JSON-serialized event" + } + ] + }, + { + "name": "updateNewCustomQuery", + "description": "A new incoming query; for bots only", + "class": "Update", + "properties": [ + { + "name": "id", + "type": "int64", + "description": "The query identifier" + }, + { + "name": "data", + "type": "string", + "description": "JSON-serialized query data" + }, + { + "name": "timeout", + "type": "int32", + "description": "Query timeout" + } + ] + }, + { + "name": "testInt", + "description": "A simple object containing a number; for testing only", + "class": "TestInt", + "properties": [ + { + "name": "value", + "type": "int32", + "description": "Number" + } + ] + }, + { + "name": "testString", + "description": "A simple object containing a string; for testing only", + "class": "TestString", + "properties": [ + { + "name": "value", + "type": "string", + "description": "String" + } + ] + }, + { + "name": "testBytes", + "description": "A simple object containing a sequence of bytes; for testing only", + "class": "TestBytes", + "properties": [ + { + "name": "value", + "type": "bytes", + "description": "Bytes" + } + ] + }, + { + "name": "testVectorInt", + "description": "A simple object containing a vector of numbers; for testing only", + "class": "TestVectorInt", + "properties": [ + { + "name": "value", + "type": "vector\u003cint32\u003e", + "description": "Vector of numbers" + } + ] + }, + { + "name": "testVectorIntObject", + "description": "A simple object containing a vector of objects that hold a number; for testing only", + "class": "TestVectorIntObject", + "properties": [ + { + "name": "value", + "type": "vector\u003ctestInt\u003e", + "description": "Vector of objects" + } + ] + }, + { + "name": "testVectorString", + "description": "A simple object containing a vector of strings; for testing only", + "class": "TestVectorString", + "properties": [ + { + "name": "value", + "type": "vector\u003cstring\u003e", + "description": "Vector of strings" + } + ] + }, + { + "name": "testVectorStringObject", + "description": "A simple object containing a vector of objects that hold a string; for testing only", + "class": "TestVectorStringObject", + "properties": [ + { + "name": "value", + "type": "vector\u003ctestString\u003e", + "description": "Vector of objects" + } + ] + } + ], + "classes": [ + { + "name": "AuthenticationCodeType", + "description": "Provides information about the method by which an authentication code is delivered to the user" + }, + { + "name": "AuthorizationState", + "description": "Represents the current authorization state of the client" + }, + { + "name": "InputFile", + "description": "Points to a file" + }, + { + "name": "MaskPoint", + "description": "Part of the face, relative to which a mask should be placed" + }, + { + "name": "LinkState", + "description": "Represents the relationship between user A and user B. For incoming_link, user A is the current user; for outgoing_link, user B is the current user" + }, + { + "name": "UserType", + "description": "Represents the type of the user. The following types are possible: regular users, deleted users and bots" + }, + { + "name": "ChatMemberStatus", + "description": "Provides information about the status of a member in a chat" + }, + { + "name": "SupergroupMembersFilter", + "description": "Specifies the kind of chat members to return in getSupergroupMembers" + }, + { + "name": "SecretChatState", + "description": "Describes the current secret chat state" + }, + { + "name": "MessageForwardInfo", + "description": "Contains information about the initial sender of a forwarded message" + }, + { + "name": "MessageSendingState", + "description": "Contains information about the sending state of the message" + }, + { + "name": "NotificationSettingsScope", + "description": "Describes the types of chats for which notification settings are applied" + }, + { + "name": "ChatType", + "description": "Describes the type of a chat" + }, + { + "name": "KeyboardButtonType", + "description": "Describes a keyboard button type" + }, + { + "name": "InlineKeyboardButtonType", + "description": "Describes the type of an inline keyboard button" + }, + { + "name": "ReplyMarkup", + "description": "Contains a description of a custom keyboard and actions that can be done with it to quickly reply to bots" + }, + { + "name": "RichText", + "description": "Describes a text object inside an instant-view web page" + }, + { + "name": "PageBlock", + "description": "Describes a block of an instant view web page" + }, + { + "name": "InputCredentials", + "description": "Contains information about the payment method chosen by the user" + }, + { + "name": "MessageContent", + "description": "Contains the content of a message" + }, + { + "name": "TextEntityType", + "description": "Represents a part of the text which must be formatted differently" + }, + { + "name": "InputMessageContent", + "description": "The content of a message to send" + }, + { + "name": "SearchMessagesFilter", + "description": "Represents a filter for message search results" + }, + { + "name": "ChatAction", + "description": "Describes the different types of activity in a chat" + }, + { + "name": "UserStatus", + "description": "Describes the last time the user was online" + }, + { + "name": "CallDiscardReason", + "description": "Describes the reason why a call was discarded" + }, + { + "name": "CallState", + "description": "Describes the current call state" + }, + { + "name": "InputInlineQueryResult", + "description": "Represents a single result of an inline query; for bots only" + }, + { + "name": "InlineQueryResult", + "description": "Represents a single result of an inline query" + }, + { + "name": "CallbackQueryPayload", + "description": "Represents a payload of a callback query" + }, + { + "name": "ChatEventAction", + "description": "Represents a chat event" + }, + { + "name": "DeviceToken", + "description": "Represents a data needed to subscribe for push notifications. To use specific push notification service, you must specify the correct application platform and upload valid server authentication data at https://my.telegram.org" + }, + { + "name": "CheckChatUsernameResult", + "description": "Represents result of checking whether a username can be set for a chat" + }, + { + "name": "OptionValue", + "description": "Represents the value of an option" + }, + { + "name": "UserPrivacySettingRule", + "description": "Represents a single rule for managing privacy settings" + }, + { + "name": "UserPrivacySetting", + "description": "Describes available user privacy settings" + }, + { + "name": "ChatReportReason", + "description": "Describes the reason why a chat is reported" + }, + { + "name": "FileType", + "description": "Represents the type of a file" + }, + { + "name": "NetworkType", + "description": "Represents the type of a network" + }, + { + "name": "NetworkStatisticsEntry", + "description": "Contains statistics about network usage" + }, + { + "name": "ConnectionState", + "description": "Describes the current state of the connection to Telegram servers" + }, + { + "name": "TopChatCategory", + "description": "Represents the categories of chats for which a list of frequently used chats can be retrieved" + }, + { + "name": "TMeUrlType", + "description": "Describes the type of a URL linking to an internal Telegram entity" + }, + { + "name": "TextParseMode", + "description": "Describes the way the text should be parsed for TextEntities" + }, + { + "name": "Proxy", + "description": "Contains information about a proxy server" + }, + { + "name": "Update", + "description": "Contains notifications about data changes" + } + ], + "functions": [ + { + "name": "getAuthorizationState", + "description": "Returns the current authorization state; this is an offline request. For informational purposes only. Use updateAuthorizationState instead to maintain the current authorization state", + "class": "AuthorizationState", + "properties": [], + "is_synchronous": false + }, + { + "name": "setTdlibParameters", + "description": "Sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters", + "class": "Ok", + "properties": [ + { + "name": "parameters", + "type": "tdlibParameters", + "description": "Parameters" + } + ], + "is_synchronous": false + }, + { + "name": "checkDatabaseEncryptionKey", + "description": "Checks the database encryption key for correctness. Works only when the current authorization state is authorizationStateWaitEncryptionKey", + "class": "Ok", + "properties": [ + { + "name": "encryption_key", + "type": "bytes", + "description": "Encryption key to check or set up" + } + ], + "is_synchronous": false + }, + { + "name": "setAuthenticationPhoneNumber", + "description": "Sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber", + "class": "Ok", + "properties": [ + { + "name": "phone_number", + "type": "string", + "description": "The phone number of the user, in international format" + }, + { + "name": "allow_flash_call", + "type": "Bool", + "description": "Pass true if the authentication code may be sent via flash call to the specified phone number" + }, + { + "name": "is_current_phone_number", + "type": "Bool", + "description": "Pass true if the phone number is used on the current device. Ignored if allow_flash_call is false" + } + ], + "is_synchronous": false + }, + { + "name": "resendAuthenticationCode", + "description": "Re-sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode and the next_code_type of the result is not null", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "checkAuthenticationCode", + "description": "Checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode", + "class": "Ok", + "properties": [ + { + "name": "code", + "type": "string", + "description": "The verification code received via SMS, Telegram message, phone call, or flash call" + }, + { + "name": "first_name", + "type": "string", + "description": "If the user is not yet registered, the first name of the user; 1-255 characters" + }, + { + "name": "last_name", + "type": "string", + "description": "If the user is not yet registered; the last name of the user; optional; 0-255 characters" + } + ], + "is_synchronous": false + }, + { + "name": "checkAuthenticationPassword", + "description": "Checks the authentication password for correctness. Works only when the current authorization state is authorizationStateWaitPassword", + "class": "Ok", + "properties": [ + { + "name": "password", + "type": "string", + "description": "The password to check" + } + ], + "is_synchronous": false + }, + { + "name": "requestAuthenticationPasswordRecovery", + "description": "Requests to send a password recovery code to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "recoverAuthenticationPassword", + "description": "Recovers the password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword", + "class": "Ok", + "properties": [ + { + "name": "recovery_code", + "type": "string", + "description": "Recovery code to check" + } + ], + "is_synchronous": false + }, + { + "name": "checkAuthenticationBotToken", + "description": "Checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in", + "class": "Ok", + "properties": [ + { + "name": "token", + "type": "string", + "description": "The bot token" + } + ], + "is_synchronous": false + }, + { + "name": "logOut", + "description": "Closes the TDLib instance after a proper logout. Requires an available network connection. All local data will be destroyed. After the logout completes, updateAuthorizationState with authorizationStateClosed will be sent", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "close", + "description": "Closes the TDLib instance. All databases will be flushed to disk and properly closed. After the close completes, updateAuthorizationState with authorizationStateClosed will be sent", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "destroy", + "description": "Closes the TDLib instance, destroying all local data without a proper logout. The current user session will remain in the list of all active sessions. All local data will be destroyed. After the destruction completes updateAuthorizationState with authorizationStateClosed will be sent", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "setDatabaseEncryptionKey", + "description": "Changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain", + "class": "Ok", + "properties": [ + { + "name": "new_encryption_key", + "type": "bytes", + "description": "New encryption key" + } + ], + "is_synchronous": false + }, + { + "name": "getPasswordState", + "description": "Returns the current state of 2-step verification", + "class": "PasswordState", + "properties": [], + "is_synchronous": false + }, + { + "name": "setPassword", + "description": "Changes the password for the user. If a new recovery email address is specified, then the error EMAIL_UNCONFIRMED is returned and the password change will not be applied until the new recovery email address has been confirmed. The application should periodically call getPasswordState to check whether the new email address has been confirmed", + "class": "PasswordState", + "properties": [ + { + "name": "old_password", + "type": "string", + "description": "Previous password of the user" + }, + { + "name": "new_password", + "type": "string", + "description": "New password of the user; may be empty to remove the password" + }, + { + "name": "new_hint", + "type": "string", + "description": "New password hint; may be empty" + }, + { + "name": "set_recovery_email_address", + "type": "Bool", + "description": "Pass true if the recovery email address should be changed" + }, + { + "name": "new_recovery_email_address", + "type": "string", + "description": "New recovery email address; may be empty" + } + ], + "is_synchronous": false + }, + { + "name": "getRecoveryEmailAddress", + "description": "Returns a recovery email address that was previously set up. This method can be used to verify a password provided by the user", + "class": "RecoveryEmailAddress", + "properties": [ + { + "name": "password", + "type": "string", + "description": "The password for the current user" + } + ], + "is_synchronous": false + }, + { + "name": "setRecoveryEmailAddress", + "description": "Changes the recovery email address of the user. If a new recovery email address is specified, then the error EMAIL_UNCONFIRMED is returned and the email address will not be changed until the new email has been confirmed. The application should periodically call getPasswordState to check whether the email address has been confirmed. If new_recovery_email_address is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation", + "class": "PasswordState", + "properties": [ + { + "name": "password", + "type": "string", + "description": "Password of the current user" + }, + { + "name": "new_recovery_email_address", + "type": "string", + "description": "New recovery email address" + } + ], + "is_synchronous": false + }, + { + "name": "requestPasswordRecovery", + "description": "Requests to send a password recovery code to an email address that was previously set up", + "class": "PasswordRecoveryInfo", + "properties": [], + "is_synchronous": false + }, + { + "name": "recoverPassword", + "description": "Recovers the password using a recovery code sent to an email address that was previously set up", + "class": "PasswordState", + "properties": [ + { + "name": "recovery_code", + "type": "string", + "description": "Recovery code to check" + } + ], + "is_synchronous": false + }, + { + "name": "createTemporaryPassword", + "description": "Creates a new temporary password for processing payments", + "class": "TemporaryPasswordState", + "properties": [ + { + "name": "password", + "type": "string", + "description": "Persistent user password" + }, + { + "name": "valid_for", + "type": "int32", + "description": "Time during which the temporary password will be valid, in seconds; should be between 60 and 86400" + } + ], + "is_synchronous": false + }, + { + "name": "getTemporaryPasswordState", + "description": "Returns information about the current temporary password", + "class": "TemporaryPasswordState", + "properties": [], + "is_synchronous": false + }, + { + "name": "processDcUpdate", + "description": "Handles a DC_UPDATE push service notification. Can be called before authorization", + "class": "Ok", + "properties": [ + { + "name": "dc", + "type": "string", + "description": "Value of the \"dc\" parameter of the notification" + }, + { + "name": "addr", + "type": "string", + "description": "Value of the \"addr\" parameter of the notification" + } + ], + "is_synchronous": false + }, + { + "name": "getMe", + "description": "Returns the current user", + "class": "User", + "properties": [], + "is_synchronous": false + }, + { + "name": "getUser", + "description": "Returns information about a user by their identifier. This is an offline request if the current user is not a bot", + "class": "User", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getUserFullInfo", + "description": "Returns full information about a user by their identifier", + "class": "UserFullInfo", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getBasicGroup", + "description": "Returns information about a basic group by its identifier. This is an offline request if the current user is not a bot", + "class": "BasicGroup", + "properties": [ + { + "name": "basic_group_id", + "type": "int32", + "description": "Basic group identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getBasicGroupFullInfo", + "description": "Returns full information about a basic group by its identifier", + "class": "BasicGroupFullInfo", + "properties": [ + { + "name": "basic_group_id", + "type": "int32", + "description": "Basic group identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getSupergroup", + "description": "Returns information about a supergroup or channel by its identifier. This is an offline request if the current user is not a bot", + "class": "Supergroup", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Supergroup or channel identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getSupergroupFullInfo", + "description": "Returns full information about a supergroup or channel by its identifier, cached for up to 1 minute", + "class": "SupergroupFullInfo", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Supergroup or channel identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getSecretChat", + "description": "Returns information about a secret chat by its identifier. This is an offline request", + "class": "SecretChat", + "properties": [ + { + "name": "secret_chat_id", + "type": "int32", + "description": "Secret chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getChat", + "description": "Returns information about a chat by its identifier, this is an offline request if the current user is not a bot", + "class": "Chat", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getMessage", + "description": "Returns information about a message", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat the message belongs to" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message to get" + } + ], + "is_synchronous": false + }, + { + "name": "getRepliedMessage", + "description": "Returns information about a message that is replied by given message", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat the message belongs to" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message reply to which get" + } + ], + "is_synchronous": false + }, + { + "name": "getChatPinnedMessage", + "description": "Returns information about a pinned chat message", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat the message belongs to" + } + ], + "is_synchronous": false + }, + { + "name": "getMessages", + "description": "Returns information about messages. If a message is not found, returns null on the corresponding position of the result", + "class": "Messages", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat the messages belong to" + }, + { + "name": "message_ids", + "type": "vector\u003cint53\u003e", + "description": "Identifiers of the messages to get" + } + ], + "is_synchronous": false + }, + { + "name": "getFile", + "description": "Returns information about a file; this is an offline request", + "class": "File", + "properties": [ + { + "name": "file_id", + "type": "int32", + "description": "Identifier of the file to get" + } + ], + "is_synchronous": false + }, + { + "name": "getRemoteFile", + "description": "Returns information about a file by its remote ID; this is an offline request. Can be used to register a URL as a file for further uploading, or sending as a message", + "class": "File", + "properties": [ + { + "name": "remote_file_id", + "type": "string", + "description": "Remote identifier of the file to get" + }, + { + "name": "file_type", + "type": "FileType", + "description": "File type, if known" + } + ], + "is_synchronous": false + }, + { + "name": "getChats", + "description": "Returns an ordered list of chats. Chats are sorted by the pair (order, chat_id) in decreasing order. (For example, to get a list of chats from the beginning, the offset_order should be equal to 2^63 - 1). For optimal performance the number of returned chats is chosen by the library.", + "class": "Chats", + "properties": [ + { + "name": "offset_order", + "type": "int64", + "description": "Chat order to return chats from" + }, + { + "name": "offset_chat_id", + "type": "int53", + "description": "Chat identifier to return chats from" + }, + { + "name": "limit", + "type": "int32", + "description": "The maximum number of chats to be returned. It is possible that fewer chats than the limit are returned even if the end of the list is not reached" + } + ], + "is_synchronous": false + }, + { + "name": "searchPublicChat", + "description": "Searches a public chat by its username. Currently only private chats, supergroups and channels can be public. Returns the chat if found; otherwise an error is returned", + "class": "Chat", + "properties": [ + { + "name": "username", + "type": "string", + "description": "Username to be resolved" + } + ], + "is_synchronous": false + }, + { + "name": "searchPublicChats", + "description": "Searches public chats by looking for specified query in their username and title. Currently only private chats, supergroups and channels can be public. Returns a meaningful number of results. Returns nothing if the length of the searched username prefix is less than 5. Excludes private chats with contacts and chats from the chat list from the results", + "class": "Chats", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for" + } + ], + "is_synchronous": false + }, + { + "name": "searchChats", + "description": "Searches for the specified query in the title and username of already known chats, this is an offline request. Returns chats in the order seen in the chat list", + "class": "Chats", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for. If the query is empty, returns up to 20 recently found chats" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of chats to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "searchChatsOnServer", + "description": "Searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the chat list", + "class": "Chats", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of chats to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "getTopChats", + "description": "Returns a list of frequently used chats. Supported only if the chat info database is enabled", + "class": "Chats", + "properties": [ + { + "name": "category", + "type": "TopChatCategory", + "description": "Category of chats to be returned" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of chats to be returned; up to 30" + } + ], + "is_synchronous": false + }, + { + "name": "removeTopChat", + "description": "Removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled", + "class": "Ok", + "properties": [ + { + "name": "category", + "type": "TopChatCategory", + "description": "Category of frequently used chats" + }, + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "addRecentlyFoundChat", + "description": "Adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat to add" + } + ], + "is_synchronous": false + }, + { + "name": "removeRecentlyFoundChat", + "description": "Removes a chat from the list of recently found chats", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat to be removed" + } + ], + "is_synchronous": false + }, + { + "name": "clearRecentlyFoundChats", + "description": "Clears the list of recently found chats", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "checkChatUsername", + "description": "Checks whether a username can be set for a chat", + "class": "CheckChatUsernameResult", + "properties": [ + { + "name": "chat_id", + "type": "int64", + "description": "Chat identifier; should be identifier of a supergroup chat, or a channel chat, or a private chat with self, or zero if chat is being created" + }, + { + "name": "username", + "type": "string", + "description": "Username to be checked" + } + ], + "is_synchronous": false + }, + { + "name": "getCreatedPublicChats", + "description": "Returns a list of public chats created by the user", + "class": "Chats", + "properties": [], + "is_synchronous": false + }, + { + "name": "getGroupsInCommon", + "description": "Returns a list of common chats with a given user. Chats are sorted by their type and creation date", + "class": "Chats", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "offset_chat_id", + "type": "int53", + "description": "Chat identifier starting from which to return chats; use 0 for the first request" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of chats to be returned; up to 100" + } + ], + "is_synchronous": false + }, + { + "name": "getChatHistory", + "description": "Returns messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing message_id). For optimal performance the number of returned messages is chosen by the library. This is an offline request if only_local is true", + "class": "Messages", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "from_message_id", + "type": "int53", + "description": "Identifier of the message starting from which history must be fetched; use 0 to get results from the beginning (i.e., from oldest to newest)" + }, + { + "name": "offset", + "type": "int32", + "description": "Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages" + }, + { + "name": "limit", + "type": "int32", + "description": "The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached" + }, + { + "name": "only_local", + "type": "Bool", + "description": "If true, returns only messages that are available locally without sending network requests" + } + ], + "is_synchronous": false + }, + { + "name": "deleteChatHistory", + "description": "Deletes all messages in the chat only for the user. Cannot be used in channels and public supergroups", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "remove_from_chat_list", + "type": "Bool", + "description": "Pass true if the chat should be removed from the chats list" + } + ], + "is_synchronous": false + }, + { + "name": "searchChatMessages", + "description": "Searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing message_id. Cannot be used in secret chats with a non-empty query (searchSecretMessages should be used instead), or without an enabled message database. For optimal performance the number of returned messages is chosen by the library", + "class": "Messages", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat in which to search messages" + }, + { + "name": "query", + "type": "string", + "description": "Query to search for" + }, + { + "name": "sender_user_id", + "type": "int32", + "description": "If not 0, only messages sent by the specified user will be returned. Not supported in secret chats" + }, + { + "name": "from_message_id", + "type": "int53", + "description": "Identifier of the message starting from which history must be fetched; use 0 to get results from the beginning" + }, + { + "name": "offset", + "type": "int32", + "description": "Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages" + }, + { + "name": "limit", + "type": "int32", + "description": "The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached" + }, + { + "name": "filter", + "type": "SearchMessagesFilter", + "description": "Filter for message content in the search results" + } + ], + "is_synchronous": false + }, + { + "name": "searchMessages", + "description": "Searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chat_id, message_id)). For optimal performance the number of returned messages is chosen by the library", + "class": "Messages", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for" + }, + { + "name": "offset_date", + "type": "int32", + "description": "The date of the message starting from which the results should be fetched. Use 0 or any date in the future to get results from the beginning" + }, + { + "name": "offset_chat_id", + "type": "int53", + "description": "The chat identifier of the last found message, or 0 for the first request" + }, + { + "name": "offset_message_id", + "type": "int53", + "description": "The message identifier of the last found message, or 0 for the first request" + }, + { + "name": "limit", + "type": "int32", + "description": "The maximum number of messages to be returned, up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached" + } + ], + "is_synchronous": false + }, + { + "name": "searchSecretMessages", + "description": "Searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance the number of returned messages is chosen by the library", + "class": "FoundMessages", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat in which to search. Specify 0 to search in all secret chats" + }, + { + "name": "query", + "type": "string", + "description": "Query to search for. If empty, searchChatMessages should be used instead" + }, + { + "name": "from_search_id", + "type": "int64", + "description": "The identifier from the result of a previous request, use 0 to get results from the beginning" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of messages to be returned; up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached" + }, + { + "name": "filter", + "type": "SearchMessagesFilter", + "description": "A filter for the content of messages in the search results" + } + ], + "is_synchronous": false + }, + { + "name": "searchCallMessages", + "description": "Searches for call messages. Returns the results in reverse chronological order (i. e., in order of decreasing message_id). For optimal performance the number of returned messages is chosen by the library", + "class": "Messages", + "properties": [ + { + "name": "from_message_id", + "type": "int53", + "description": "Identifier of the message from which to search; use 0 to get results from the beginning" + }, + { + "name": "limit", + "type": "int32", + "description": "The maximum number of messages to be returned; up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached" + }, + { + "name": "only_missed", + "type": "Bool", + "description": "If true, returns only messages with missed calls" + } + ], + "is_synchronous": false + }, + { + "name": "searchChatRecentLocationMessages", + "description": "Returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user", + "class": "Messages", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of messages to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "getActiveLiveLocationMessages", + "description": "Returns all active live locations that should be updated by the client. The list is persistent across application restarts only if the message database is used", + "class": "Messages", + "properties": [], + "is_synchronous": false + }, + { + "name": "getChatMessageByDate", + "description": "Returns the last message sent in a chat no later than the specified date", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "date", + "type": "int32", + "description": "Point in time (Unix timestamp) relative to which to search for messages" + } + ], + "is_synchronous": false + }, + { + "name": "getPublicMessageLink", + "description": "Returns a public HTTPS link to a message. Available only for messages in public supergroups and channels", + "class": "PublicMessageLink", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat to which the message belongs" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message" + }, + { + "name": "for_album", + "type": "Bool", + "description": "Pass true if a link for a whole media album should be returned" + } + ], + "is_synchronous": false + }, + { + "name": "sendMessage", + "description": "Sends a message. Returns the sent message", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Target chat" + }, + { + "name": "reply_to_message_id", + "type": "int53", + "description": "Identifier of the message to reply to or 0" + }, + { + "name": "disable_notification", + "type": "Bool", + "description": "Pass true to disable notification for the message. Not supported in secret chats" + }, + { + "name": "from_background", + "type": "Bool", + "description": "Pass true if the message is sent from the background" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "Markup for replying to the message; for bots only" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "The content of the message to be sent" + } + ], + "is_synchronous": false + }, + { + "name": "sendMessageAlbum", + "description": "Sends messages grouped together into an album. Currently only photo and video messages can be grouped into an album. Returns sent messages", + "class": "Messages", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Target chat" + }, + { + "name": "reply_to_message_id", + "type": "int53", + "description": "Identifier of a message to reply to or 0" + }, + { + "name": "disable_notification", + "type": "Bool", + "description": "Pass true to disable notification for the messages. Not supported in secret chats" + }, + { + "name": "from_background", + "type": "Bool", + "description": "Pass true if the messages are sent from the background" + }, + { + "name": "input_message_contents", + "type": "vector\u003cInputMessageContent\u003e", + "description": "Contents of messages to be sent" + } + ], + "is_synchronous": false + }, + { + "name": "sendBotStartMessage", + "description": "Invites a bot to a chat (if it is not yet a member) and sends it the /start command. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message", + "class": "Message", + "properties": [ + { + "name": "bot_user_id", + "type": "int32", + "description": "Identifier of the bot" + }, + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the target chat" + }, + { + "name": "parameter", + "type": "string", + "description": "A hidden parameter sent to the bot for deep linking purposes (https://api.telegram.org/bots#deep-linking)" + } + ], + "is_synchronous": false + }, + { + "name": "sendInlineQueryResultMessage", + "description": "Sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Target chat" + }, + { + "name": "reply_to_message_id", + "type": "int53", + "description": "Identifier of a message to reply to or 0" + }, + { + "name": "disable_notification", + "type": "Bool", + "description": "Pass true to disable notification for the message. Not supported in secret chats" + }, + { + "name": "from_background", + "type": "Bool", + "description": "Pass true if the message is sent from background" + }, + { + "name": "query_id", + "type": "int64", + "description": "Identifier of the inline query" + }, + { + "name": "result_id", + "type": "string", + "description": "Identifier of the inline result" + } + ], + "is_synchronous": false + }, + { + "name": "forwardMessages", + "description": "Forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in message_ids. If a message can't be forwarded, null will be returned instead of the message", + "class": "Messages", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat to which to forward messages" + }, + { + "name": "from_chat_id", + "type": "int53", + "description": "Identifier of the chat from which to forward messages" + }, + { + "name": "message_ids", + "type": "vector\u003cint53\u003e", + "description": "Identifiers of the messages to forward" + }, + { + "name": "disable_notification", + "type": "Bool", + "description": "Pass true to disable notification for the message, doesn't work if messages are forwarded to a secret chat" + }, + { + "name": "from_background", + "type": "Bool", + "description": "Pass true if the message is sent from the background" + }, + { + "name": "as_album", + "type": "Bool", + "description": "True, if the messages should be grouped into an album after forwarding. For this to work, no more than 10 messages may be forwarded, and all of them must be photo or video messages" + } + ], + "is_synchronous": false + }, + { + "name": "sendChatSetTtlMessage", + "description": "Changes the current TTL setting (sets a new self-destruct timer) in a secret chat and sends the corresponding message", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "ttl", + "type": "int32", + "description": "New TTL value, in seconds" + } + ], + "is_synchronous": false + }, + { + "name": "sendChatScreenshotTakenNotification", + "description": "Sends a notification about a screenshot taken in a chat. Supported only in private and secret chats", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "deleteMessages", + "description": "Deletes messages", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_ids", + "type": "vector\u003cint53\u003e", + "description": "Identifiers of the messages to be deleted" + }, + { + "name": "revoke", + "type": "Bool", + "description": "Pass true to try to delete outgoing messages for all chat members (may fail if messages are too old). Always true for supergroups, channels and secret chats" + } + ], + "is_synchronous": false + }, + { + "name": "deleteChatMessagesFromUser", + "description": "Deletes all messages sent by the specified user to a chat. Supported only in supergroups; requires can_delete_messages administrator privileges", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "editMessageText", + "description": "Edits the text of a message (or a text of a game message). Non-bot users can edit messages for a limited period of time. Returns the edited message after the edit is completed on the server side", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "The chat the message belongs to" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The new message reply markup; for bots only" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "New text content of the message. Should be of type InputMessageText" + } + ], + "is_synchronous": false + }, + { + "name": "editMessageLiveLocation", + "description": "Edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed server-side", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "The chat the message belongs to" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "Tew message reply markup; for bots only" + }, + { + "name": "location", + "type": "location", + "description": "New location content of the message; may be null. Pass null to stop sharing the live location" + } + ], + "is_synchronous": false + }, + { + "name": "editMessageCaption", + "description": "Edits the message content caption. Non-bots can edit messages for a limited period of time. Returns the edited message after the edit is completed server-side", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "The chat the message belongs to" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "The new message reply markup; for bots only" + }, + { + "name": "caption", + "type": "formattedText", + "description": "New message content caption; 0-200 characters" + } + ], + "is_synchronous": false + }, + { + "name": "editMessageReplyMarkup", + "description": "Edits the message reply markup; for bots only. Returns the edited message after the edit is completed server-side", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "The chat the message belongs to" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "New message reply markup" + } + ], + "is_synchronous": false + }, + { + "name": "editInlineMessageText", + "description": "Edits the text of an inline text or game message sent via a bot; for bots only", + "class": "Ok", + "properties": [ + { + "name": "inline_message_id", + "type": "string", + "description": "Inline message identifier" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "New message reply markup" + }, + { + "name": "input_message_content", + "type": "InputMessageContent", + "description": "New text content of the message. Should be of type InputMessageText" + } + ], + "is_synchronous": false + }, + { + "name": "editInlineMessageLiveLocation", + "description": "Edits the content of a live location in an inline message sent via a bot; for bots only", + "class": "Ok", + "properties": [ + { + "name": "inline_message_id", + "type": "string", + "description": "Inline message identifier" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "New message reply markup" + }, + { + "name": "location", + "type": "location", + "description": "New location content of the message; may be null. Pass null to stop sharing the live location" + } + ], + "is_synchronous": false + }, + { + "name": "editInlineMessageCaption", + "description": "Edits the caption of an inline message sent via a bot; for bots only", + "class": "Ok", + "properties": [ + { + "name": "inline_message_id", + "type": "string", + "description": "Inline message identifier" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "New message reply markup" + }, + { + "name": "caption", + "type": "formattedText", + "description": "New message content caption; 0-200 characters" + } + ], + "is_synchronous": false + }, + { + "name": "editInlineMessageReplyMarkup", + "description": "Edits the reply markup of an inline message sent via a bot; for bots only", + "class": "Ok", + "properties": [ + { + "name": "inline_message_id", + "type": "string", + "description": "Inline message identifier" + }, + { + "name": "reply_markup", + "type": "ReplyMarkup", + "description": "New message reply markup" + } + ], + "is_synchronous": false + }, + { + "name": "getTextEntities", + "description": "Returns all entities (mentions, hashtags, cashtags, bot commands, URLs, and email addresses) contained in the text. This is an offline method. Can be called before authorization. Can be called synchronously", + "class": "TextEntities", + "properties": [ + { + "name": "text", + "type": "string", + "description": "The text in which to look for entites" + } + ], + "is_synchronous": true + }, + { + "name": "parseTextEntities", + "description": "Parses Bold, Italic, Code, Pre, PreCode and TextUrl entities contained in the text. This is an offline method. Can be called before authorization. Can be called synchronously", + "class": "FormattedText", + "properties": [ + { + "name": "text", + "type": "string", + "description": "The text which should be parsed" + }, + { + "name": "parse_mode", + "type": "TextParseMode", + "description": "Text parse mode" + } + ], + "is_synchronous": true + }, + { + "name": "getFileMimeType", + "description": "Returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. This is an offline method. Can be called before authorization. Can be called synchronously", + "class": "Text", + "properties": [ + { + "name": "file_name", + "type": "string", + "description": "The name of the file or path to the file" + } + ], + "is_synchronous": true + }, + { + "name": "getFileExtension", + "description": "Returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. This is an offline method. Can be called before authorization. Can be called synchronously", + "class": "Text", + "properties": [ + { + "name": "mime_type", + "type": "string", + "description": "The MIME type of the file" + } + ], + "is_synchronous": true + }, + { + "name": "getInlineQueryResults", + "description": "Sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires", + "class": "InlineQueryResults", + "properties": [ + { + "name": "bot_user_id", + "type": "int32", + "description": "The identifier of the target bot" + }, + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat, where the query was sent" + }, + { + "name": "user_location", + "type": "location", + "description": "Location of the user, only if needed" + }, + { + "name": "query", + "type": "string", + "description": "Text of the query" + }, + { + "name": "offset", + "type": "string", + "description": "Offset of the first entry to return" + } + ], + "is_synchronous": false + }, + { + "name": "answerInlineQuery", + "description": "Sets the result of an inline query; for bots only", + "class": "Ok", + "properties": [ + { + "name": "inline_query_id", + "type": "int64", + "description": "Identifier of the inline query" + }, + { + "name": "is_personal", + "type": "Bool", + "description": "True, if the result of the query can be cached for the specified user" + }, + { + "name": "results", + "type": "vector\u003cInputInlineQueryResult\u003e", + "description": "The results of the query" + }, + { + "name": "cache_time", + "type": "int32", + "description": "Allowed time to cache the results of the query, in seconds" + }, + { + "name": "next_offset", + "type": "string", + "description": "Offset for the next inline query; pass an empty string if there are no more results" + }, + { + "name": "switch_pm_text", + "type": "string", + "description": "If non-empty, this text should be shown on the button that opens a private chat with the bot and sends a start message to the bot with the parameter switch_pm_parameter" + }, + { + "name": "switch_pm_parameter", + "type": "string", + "description": "The parameter for the bot start message" + } + ], + "is_synchronous": false + }, + { + "name": "getCallbackQueryAnswer", + "description": "Sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires", + "class": "CallbackQueryAnswer", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat with the message" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message from which the query originated" + }, + { + "name": "payload", + "type": "CallbackQueryPayload", + "description": "Query payload" + } + ], + "is_synchronous": false + }, + { + "name": "answerCallbackQuery", + "description": "Sets the result of a callback query; for bots only", + "class": "Ok", + "properties": [ + { + "name": "callback_query_id", + "type": "int64", + "description": "Identifier of the callback query" + }, + { + "name": "text", + "type": "string", + "description": "Text of the answer" + }, + { + "name": "show_alert", + "type": "Bool", + "description": "If true, an alert should be shown to the user instead of a toast notification" + }, + { + "name": "url", + "type": "string", + "description": "URL to be opened" + }, + { + "name": "cache_time", + "type": "int32", + "description": "Time during which the result of the query can be cached, in seconds" + } + ], + "is_synchronous": false + }, + { + "name": "answerShippingQuery", + "description": "Sets the result of a shipping query; for bots only", + "class": "Ok", + "properties": [ + { + "name": "shipping_query_id", + "type": "int64", + "description": "Identifier of the shipping query" + }, + { + "name": "shipping_options", + "type": "vector\u003cshippingOption\u003e", + "description": "Available shipping options" + }, + { + "name": "error_message", + "type": "string", + "description": "An error message, empty on success" + } + ], + "is_synchronous": false + }, + { + "name": "answerPreCheckoutQuery", + "description": "Sets the result of a pre-checkout query; for bots only", + "class": "Ok", + "properties": [ + { + "name": "pre_checkout_query_id", + "type": "int64", + "description": "Identifier of the pre-checkout query" + }, + { + "name": "error_message", + "type": "string", + "description": "An error message, empty on success" + } + ], + "is_synchronous": false + }, + { + "name": "setGameScore", + "description": "Updates the game score of the specified user in the game; for bots only", + "class": "Message", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "The chat to which the message with the game" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message" + }, + { + "name": "edit_message", + "type": "Bool", + "description": "True, if the message should be edited" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "score", + "type": "int32", + "description": "The new score" + }, + { + "name": "force", + "type": "Bool", + "description": "Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table" + } + ], + "is_synchronous": false + }, + { + "name": "setInlineGameScore", + "description": "Updates the game score of the specified user in a game; for bots only", + "class": "Ok", + "properties": [ + { + "name": "inline_message_id", + "type": "string", + "description": "Inline message identifier" + }, + { + "name": "edit_message", + "type": "Bool", + "description": "True, if the message should be edited" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "score", + "type": "int32", + "description": "The new score" + }, + { + "name": "force", + "type": "Bool", + "description": "Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table" + } + ], + "is_synchronous": false + }, + { + "name": "getGameHighScores", + "description": "Returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only", + "class": "GameHighScores", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "The chat that contains the message with the game" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getInlineGameHighScores", + "description": "Returns game high scores and some part of the high score table in the range of the specified user; for bots only", + "class": "GameHighScores", + "properties": [ + { + "name": "inline_message_id", + "type": "string", + "description": "Inline message identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "deleteChatReplyMarkup", + "description": "Deletes the default reply markup from a chat. Must be called after a one-time keyboard or a ForceReply reply markup has been used. UpdateChatReplyMarkup will be sent if the reply markup will be changed", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_id", + "type": "int53", + "description": "The message identifier of the used keyboard" + } + ], + "is_synchronous": false + }, + { + "name": "sendChatAction", + "description": "Sends a notification about user activity in a chat", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "action", + "type": "ChatAction", + "description": "The action description" + } + ], + "is_synchronous": false + }, + { + "name": "openChat", + "description": "This method should be called if the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats)", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "closeChat", + "description": "This method should be called if the chat is closed by the user. Many useful activities depend on the chat being opened or closed", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "viewMessages", + "description": "This method should be called if messages are being viewed by the user. Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels)", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "message_ids", + "type": "vector\u003cint53\u003e", + "description": "The identifiers of the messages being viewed" + }, + { + "name": "force_read", + "type": "Bool", + "description": "True, if messages in closed chats should be marked as read" + } + ], + "is_synchronous": false + }, + { + "name": "openMessageContent", + "description": "This method should be called if the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier of the message" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the message with the opened content" + } + ], + "is_synchronous": false + }, + { + "name": "readAllChatMentions", + "description": "Marks all mentions in a chat as read", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "createPrivateChat", + "description": "Returns an existing chat corresponding to a given user", + "class": "Chat", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "force", + "type": "Bool", + "description": "If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect" + } + ], + "is_synchronous": false + }, + { + "name": "createBasicGroupChat", + "description": "Returns an existing chat corresponding to a known basic group", + "class": "Chat", + "properties": [ + { + "name": "basic_group_id", + "type": "int32", + "description": "Basic group identifier" + }, + { + "name": "force", + "type": "Bool", + "description": "If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect" + } + ], + "is_synchronous": false + }, + { + "name": "createSupergroupChat", + "description": "Returns an existing chat corresponding to a known supergroup or channel", + "class": "Chat", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Supergroup or channel identifier" + }, + { + "name": "force", + "type": "Bool", + "description": "If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect" + } + ], + "is_synchronous": false + }, + { + "name": "createSecretChat", + "description": "Returns an existing chat corresponding to a known secret chat", + "class": "Chat", + "properties": [ + { + "name": "secret_chat_id", + "type": "int32", + "description": "Secret chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "createNewBasicGroupChat", + "description": "Creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns the newly created chat", + "class": "Chat", + "properties": [ + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "Identifiers of users to be added to the basic group" + }, + { + "name": "title", + "type": "string", + "description": "Title of the new basic group; 1-255 characters" + } + ], + "is_synchronous": false + }, + { + "name": "createNewSupergroupChat", + "description": "Creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat", + "class": "Chat", + "properties": [ + { + "name": "title", + "type": "string", + "description": "Title of the new chat; 1-255 characters" + }, + { + "name": "is_channel", + "type": "Bool", + "description": "True, if a channel chat should be created" + }, + { + "name": "description", + "type": "string", + "description": "Chat description; 0-255 characters" + } + ], + "is_synchronous": false + }, + { + "name": "createNewSecretChat", + "description": "Creates a new secret chat. Returns the newly created chat", + "class": "Chat", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the target user" + } + ], + "is_synchronous": false + }, + { + "name": "upgradeBasicGroupChatToSupergroupChat", + "description": "Creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom. Deactivates the original basic group", + "class": "Chat", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Identifier of the chat to upgrade" + } + ], + "is_synchronous": false + }, + { + "name": "setChatTitle", + "description": "Changes the chat title. Supported only for basic groups, supergroups and channels. Requires administrator rights in basic groups and the appropriate administrator rights in supergroups and channels. The title will not be changed until the request to the server has been completed", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "title", + "type": "string", + "description": "New title of the chat; 1-255 characters" + } + ], + "is_synchronous": false + }, + { + "name": "setChatPhoto", + "description": "Changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires administrator rights in basic groups and the appropriate administrator rights in supergroups and channels. The photo will not be changed before request to the server has been completed", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "photo", + "type": "InputFile", + "description": "New chat photo. You can use a zero InputFileId to delete the chat photo. Files that are accessible only by HTTP URL are not acceptable" + } + ], + "is_synchronous": false + }, + { + "name": "setChatDraftMessage", + "description": "Changes the draft message in a chat", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "draft_message", + "type": "draftMessage", + "description": "New draft message; may be null" + } + ], + "is_synchronous": false + }, + { + "name": "toggleChatIsPinned", + "description": "Changes the pinned state of a chat. You can pin up to GetOption(\"pinned_chat_count_max\") non-secret chats and the same number of secret chats", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "is_pinned", + "type": "Bool", + "description": "New value of is_pinned" + } + ], + "is_synchronous": false + }, + { + "name": "setChatClientData", + "description": "Changes client data associated with a chat", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "client_data", + "type": "string", + "description": "New value of client_data" + } + ], + "is_synchronous": false + }, + { + "name": "addChatMember", + "description": "Adds a new member to a chat. Members can't be added to private or secret chats. Members will not be added until the chat state has been synchronized with the server", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the user" + }, + { + "name": "forward_limit", + "type": "int32", + "description": "The number of earlier messages from the chat to be forwarded to the new member; up to 300. Ignored for supergroups and channels" + } + ], + "is_synchronous": false + }, + { + "name": "addChatMembers", + "description": "Adds multiple new members to a chat. Currently this option is only available for supergroups and channels. This option can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Members will not be added until the chat state has been synchronized with the server", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "Identifiers of the users to be added to the chat" + } + ], + "is_synchronous": false + }, + { + "name": "setChatMemberStatus", + "description": "Changes the status of a chat member, needs appropriate privileges. This function is currently not suitable for adding new members to the chat; instead, use addChatMember. The chat member status will not be changed until it has been synchronized with the server", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "status", + "type": "ChatMemberStatus", + "description": "The new status of the member in the chat" + } + ], + "is_synchronous": false + }, + { + "name": "getChatMember", + "description": "Returns information about a single member of a chat", + "class": "ChatMember", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "searchChatMembers", + "description": "Searches for a specified query in the first name, last name and username of the members of a specified chat. Requires administrator rights in channels", + "class": "ChatMembers", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "query", + "type": "string", + "description": "Query to search for" + }, + { + "name": "limit", + "type": "int32", + "description": "The maximum number of users to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "getChatAdministrators", + "description": "Returns a list of users who are administrators of the chat", + "class": "Users", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "setPinnedChats", + "description": "Changes the order of pinned chats", + "class": "Ok", + "properties": [ + { + "name": "chat_ids", + "type": "vector\u003cint53\u003e", + "description": "The new list of pinned chats" + } + ], + "is_synchronous": false + }, + { + "name": "downloadFile", + "description": "Asynchronously downloads a file from the cloud. updateFile will be used to notify about the download progress and successful completion of the download. Returns file state just after the download has been started", + "class": "File", + "properties": [ + { + "name": "file_id", + "type": "int32", + "description": "Identifier of the file to download" + }, + { + "name": "priority", + "type": "int32", + "description": "Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile was called will be downloaded first" + } + ], + "is_synchronous": false + }, + { + "name": "cancelDownloadFile", + "description": "Stops the downloading of a file. If a file has already been downloaded, does nothing", + "class": "Ok", + "properties": [ + { + "name": "file_id", + "type": "int32", + "description": "Identifier of a file to stop downloading" + }, + { + "name": "only_if_pending", + "type": "Bool", + "description": "Pass true to stop downloading only if it hasn't been started, i.e. request hasn't been sent to server" + } + ], + "is_synchronous": false + }, + { + "name": "uploadFile", + "description": "Asynchronously uploads a file to the cloud without sending it in a message. updateFile will be used to notify about upload progress and successful completion of the upload. The file will not have a persistent remote identifier until it will be sent in a message", + "class": "File", + "properties": [ + { + "name": "file", + "type": "InputFile", + "description": "File to upload" + }, + { + "name": "file_type", + "type": "FileType", + "description": "File type" + }, + { + "name": "priority", + "type": "int32", + "description": "Priority of the upload (1-32). The higher the priority, the earlier the file will be uploaded. If the priorities of two files are equal, then the first one for which uploadFile was called will be uploaded first" + } + ], + "is_synchronous": false + }, + { + "name": "cancelUploadFile", + "description": "Stops the uploading of a file. Supported only for files uploaded by using uploadFile. For other files the behavior is undefined", + "class": "Ok", + "properties": [ + { + "name": "file_id", + "type": "int32", + "description": "Identifier of the file to stop uploading" + } + ], + "is_synchronous": false + }, + { + "name": "setFileGenerationProgress", + "description": "The next part of a file was generated", + "class": "Ok", + "properties": [ + { + "name": "generation_id", + "type": "int64", + "description": "The identifier of the generation process" + }, + { + "name": "expected_size", + "type": "int32", + "description": "Expected size of the generated file, in bytes; 0 if unknown" + }, + { + "name": "local_prefix_size", + "type": "int32", + "description": "The number of bytes already generated" + } + ], + "is_synchronous": false + }, + { + "name": "finishFileGeneration", + "description": "Finishes the file generation", + "class": "Ok", + "properties": [ + { + "name": "generation_id", + "type": "int64", + "description": "The identifier of the generation process" + }, + { + "name": "error", + "type": "error", + "description": "If set, means that file generation has failed and should be terminated" + } + ], + "is_synchronous": false + }, + { + "name": "deleteFile", + "description": "Deletes a file from the TDLib file cache", + "class": "Ok", + "properties": [ + { + "name": "file_id", + "type": "int32", + "description": "Identifier of the file to delete" + } + ], + "is_synchronous": false + }, + { + "name": "generateChatInviteLink", + "description": "Generates a new invite link for a chat; the previously generated link is revoked. Available for basic groups, supergroups, and channels. In basic groups this can be called only by the group's creator; in supergroups and channels this requires appropriate administrator rights", + "class": "ChatInviteLink", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "checkChatInviteLink", + "description": "Checks the validity of an invite link for a chat and returns information about the corresponding chat", + "class": "ChatInviteLinkInfo", + "properties": [ + { + "name": "invite_link", + "type": "string", + "description": "Invite link to be checked; should begin with \"https://t.me/joinchat/\", \"https://telegram.me/joinchat/\", or \"https://telegram.dog/joinchat/\"" + } + ], + "is_synchronous": false + }, + { + "name": "joinChatByInviteLink", + "description": "Uses an invite link to add the current user to the chat if possible. The new member will not be added until the chat state has been synchronized with the server", + "class": "Chat", + "properties": [ + { + "name": "invite_link", + "type": "string", + "description": "Invite link to import; should begin with \"https://t.me/joinchat/\", \"https://telegram.me/joinchat/\", or \"https://telegram.dog/joinchat/\"" + } + ], + "is_synchronous": false + }, + { + "name": "createCall", + "description": "Creates a new call", + "class": "CallId", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Identifier of the user to be called" + }, + { + "name": "protocol", + "type": "callProtocol", + "description": "Description of the call protocols supported by the client" + } + ], + "is_synchronous": false + }, + { + "name": "acceptCall", + "description": "Accepts an incoming call", + "class": "Ok", + "properties": [ + { + "name": "call_id", + "type": "int32", + "description": "Call identifier" + }, + { + "name": "protocol", + "type": "callProtocol", + "description": "Description of the call protocols supported by the client" + } + ], + "is_synchronous": false + }, + { + "name": "discardCall", + "description": "Discards a call", + "class": "Ok", + "properties": [ + { + "name": "call_id", + "type": "int32", + "description": "Call identifier" + }, + { + "name": "is_disconnected", + "type": "Bool", + "description": "True, if the user was disconnected" + }, + { + "name": "duration", + "type": "int32", + "description": "The call duration, in seconds" + }, + { + "name": "connection_id", + "type": "int64", + "description": "Identifier of the connection used during the call" + } + ], + "is_synchronous": false + }, + { + "name": "sendCallRating", + "description": "Sends a call rating", + "class": "Ok", + "properties": [ + { + "name": "call_id", + "type": "int32", + "description": "Call identifier" + }, + { + "name": "rating", + "type": "int32", + "description": "Call rating; 1-5" + }, + { + "name": "comment", + "type": "string", + "description": "An optional user comment if the rating is less than 5" + } + ], + "is_synchronous": false + }, + { + "name": "sendCallDebugInformation", + "description": "Sends debug information for a call", + "class": "Ok", + "properties": [ + { + "name": "call_id", + "type": "int32", + "description": "Call identifier" + }, + { + "name": "debug_information", + "type": "string", + "description": "Debug information in application-specific format" + } + ], + "is_synchronous": false + }, + { + "name": "blockUser", + "description": "Adds a user to the blacklist", + "class": "Ok", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "unblockUser", + "description": "Removes a user from the blacklist", + "class": "Ok", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getBlockedUsers", + "description": "Returns users that were blocked by the current user", + "class": "Users", + "properties": [ + { + "name": "offset", + "type": "int32", + "description": "Number of users to skip in the result; must be non-negative" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of users to return; up to 100" + } + ], + "is_synchronous": false + }, + { + "name": "importContacts", + "description": "Adds new contacts or edits existing contacts; contacts' user identifiers are ignored", + "class": "ImportedContacts", + "properties": [ + { + "name": "contacts", + "type": "vector\u003ccontact\u003e", + "description": "The list of contacts to import or edit" + } + ], + "is_synchronous": false + }, + { + "name": "searchContacts", + "description": "Searches for the specified query in the first names, last names and usernames of the known user contacts", + "class": "Users", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for; can be empty to return all contacts" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of users to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "removeContacts", + "description": "Removes users from the contacts list", + "class": "Ok", + "properties": [ + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "Identifiers of users to be deleted" + } + ], + "is_synchronous": false + }, + { + "name": "getImportedContactCount", + "description": "Returns the total number of imported contacts", + "class": "Count", + "properties": [], + "is_synchronous": false + }, + { + "name": "changeImportedContacts", + "description": "Changes imported contacts using the list of current user contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time", + "class": "ImportedContacts", + "properties": [ + { + "name": "contacts", + "type": "vector\u003ccontact\u003e", + "description": "The new list of contacts" + } + ], + "is_synchronous": false + }, + { + "name": "clearImportedContacts", + "description": "Clears all imported contacts", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "getUserProfilePhotos", + "description": "Returns the profile photos of a user. The result of this query may be outdated: some photos might have been deleted already", + "class": "UserProfilePhotos", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "offset", + "type": "int32", + "description": "The number of photos to skip; must be non-negative" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of photos to be returned; up to 100" + } + ], + "is_synchronous": false + }, + { + "name": "getStickers", + "description": "Returns stickers from the installed sticker sets that correspond to a given emoji. If the emoji is not empty, favorite and recently used stickers may also be returned", + "class": "Stickers", + "properties": [ + { + "name": "emoji", + "type": "string", + "description": "String representation of emoji. If empty, returns all known installed stickers" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of stickers to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "searchStickers", + "description": "Searches for stickers from public sticker sets that correspond to a given emoji", + "class": "Stickers", + "properties": [ + { + "name": "emoji", + "type": "string", + "description": "String representation of emoji; must be non-empty" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of stickers to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "getInstalledStickerSets", + "description": "Returns a list of installed sticker sets", + "class": "StickerSets", + "properties": [ + { + "name": "is_masks", + "type": "Bool", + "description": "Pass true to return mask sticker sets; pass false to return ordinary sticker sets" + } + ], + "is_synchronous": false + }, + { + "name": "getArchivedStickerSets", + "description": "Returns a list of archived sticker sets", + "class": "StickerSets", + "properties": [ + { + "name": "is_masks", + "type": "Bool", + "description": "Pass true to return mask stickers sets; pass false to return ordinary sticker sets" + }, + { + "name": "offset_sticker_set_id", + "type": "int64", + "description": "Identifier of the sticker set from which to return the result" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of sticker sets to return" + } + ], + "is_synchronous": false + }, + { + "name": "getTrendingStickerSets", + "description": "Returns a list of trending sticker sets", + "class": "StickerSets", + "properties": [], + "is_synchronous": false + }, + { + "name": "getAttachedStickerSets", + "description": "Returns a list of sticker sets attached to a file. Currently only photos and videos can have attached sticker sets", + "class": "StickerSets", + "properties": [ + { + "name": "file_id", + "type": "int32", + "description": "File identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getStickerSet", + "description": "Returns information about a sticker set by its identifier", + "class": "StickerSet", + "properties": [ + { + "name": "set_id", + "type": "int64", + "description": "Identifier of the sticker set" + } + ], + "is_synchronous": false + }, + { + "name": "searchStickerSet", + "description": "Searches for a sticker set by its name", + "class": "StickerSet", + "properties": [ + { + "name": "name", + "type": "string", + "description": "Name of the sticker set" + } + ], + "is_synchronous": false + }, + { + "name": "searchInstalledStickerSets", + "description": "Searches for installed sticker sets by looking for specified query in their title and name", + "class": "StickerSets", + "properties": [ + { + "name": "is_masks", + "type": "Bool", + "description": "Pass true to return mask sticker sets; pass false to return ordinary sticker sets" + }, + { + "name": "query", + "type": "string", + "description": "Query to search for" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of sticker sets to return" + } + ], + "is_synchronous": false + }, + { + "name": "searchStickerSets", + "description": "Searches for ordinary sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results", + "class": "StickerSets", + "properties": [ + { + "name": "query", + "type": "string", + "description": "Query to search for" + } + ], + "is_synchronous": false + }, + { + "name": "changeStickerSet", + "description": "Installs/uninstalls or activates/archives a sticker set", + "class": "Ok", + "properties": [ + { + "name": "set_id", + "type": "int64", + "description": "Identifier of the sticker set" + }, + { + "name": "is_installed", + "type": "Bool", + "description": "The new value of is_installed" + }, + { + "name": "is_archived", + "type": "Bool", + "description": "The new value of is_archived. A sticker set can't be installed and archived simultaneously" + } + ], + "is_synchronous": false + }, + { + "name": "viewTrendingStickerSets", + "description": "Informs the server that some trending sticker sets have been viewed by the user", + "class": "Ok", + "properties": [ + { + "name": "sticker_set_ids", + "type": "vector\u003cint64\u003e", + "description": "Identifiers of viewed trending sticker sets" + } + ], + "is_synchronous": false + }, + { + "name": "reorderInstalledStickerSets", + "description": "Changes the order of installed sticker sets", + "class": "Ok", + "properties": [ + { + "name": "is_masks", + "type": "Bool", + "description": "Pass true to change the order of mask sticker sets; pass false to change the order of ordinary sticker sets" + }, + { + "name": "sticker_set_ids", + "type": "vector\u003cint64\u003e", + "description": "Identifiers of installed sticker sets in the new correct order" + } + ], + "is_synchronous": false + }, + { + "name": "getRecentStickers", + "description": "Returns a list of recently used stickers", + "class": "Stickers", + "properties": [ + { + "name": "is_attached", + "type": "Bool", + "description": "Pass true to return stickers and masks that were recently attached to photos or video files; pass false to return recently sent stickers" + } + ], + "is_synchronous": false + }, + { + "name": "addRecentSticker", + "description": "Manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set can be added to this list", + "class": "Stickers", + "properties": [ + { + "name": "is_attached", + "type": "Bool", + "description": "Pass true to add the sticker to the list of stickers recently attached to photo or video files; pass false to add the sticker to the list of recently sent stickers" + }, + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker file to add" + } + ], + "is_synchronous": false + }, + { + "name": "removeRecentSticker", + "description": "Removes a sticker from the list of recently used stickers", + "class": "Ok", + "properties": [ + { + "name": "is_attached", + "type": "Bool", + "description": "Pass true to remove the sticker from the list of stickers recently attached to photo or video files; pass false to remove the sticker from the list of recently sent stickers" + }, + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker file to delete" + } + ], + "is_synchronous": false + }, + { + "name": "clearRecentStickers", + "description": "Clears the list of recently used stickers", + "class": "Ok", + "properties": [ + { + "name": "is_attached", + "type": "Bool", + "description": "Pass true to clear the list of stickers recently attached to photo or video files; pass false to clear the list of recently sent stickers" + } + ], + "is_synchronous": false + }, + { + "name": "getFavoriteStickers", + "description": "Returns favorite stickers", + "class": "Stickers", + "properties": [], + "is_synchronous": false + }, + { + "name": "addFavoriteSticker", + "description": "Adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set can be added to this list", + "class": "Ok", + "properties": [ + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker file to add" + } + ], + "is_synchronous": false + }, + { + "name": "removeFavoriteSticker", + "description": "Removes a sticker from the list of favorite stickers", + "class": "Ok", + "properties": [ + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker file to delete from the list" + } + ], + "is_synchronous": false + }, + { + "name": "getStickerEmojis", + "description": "Returns emoji corresponding to a sticker", + "class": "StickerEmojis", + "properties": [ + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker file identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getSavedAnimations", + "description": "Returns saved animations", + "class": "Animations", + "properties": [], + "is_synchronous": false + }, + { + "name": "addSavedAnimation", + "description": "Manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type \"video/mp4\" can be added to the list", + "class": "Ok", + "properties": [ + { + "name": "animation", + "type": "InputFile", + "description": "The animation file to be added. Only animations known to the server (i.e. successfully sent via a message) can be added to the list" + } + ], + "is_synchronous": false + }, + { + "name": "removeSavedAnimation", + "description": "Removes an animation from the list of saved animations", + "class": "Ok", + "properties": [ + { + "name": "animation", + "type": "InputFile", + "description": "Animation file to be removed" + } + ], + "is_synchronous": false + }, + { + "name": "getRecentInlineBots", + "description": "Returns up to 20 recently used inline bots in the order of their last usage", + "class": "Users", + "properties": [], + "is_synchronous": false + }, + { + "name": "searchHashtags", + "description": "Searches for recently used hashtags by their prefix", + "class": "Hashtags", + "properties": [ + { + "name": "prefix", + "type": "string", + "description": "Hashtag prefix to search for" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of hashtags to be returned" + } + ], + "is_synchronous": false + }, + { + "name": "removeRecentHashtag", + "description": "Removes a hashtag from the list of recently used hashtags", + "class": "Ok", + "properties": [ + { + "name": "hashtag", + "type": "string", + "description": "Hashtag to delete" + } + ], + "is_synchronous": false + }, + { + "name": "getWebPagePreview", + "description": "Returns a web page preview by the text of the message. Do not call this function too often. Returns a 404 error if the web page has no preview", + "class": "WebPage", + "properties": [ + { + "name": "text", + "type": "formattedText", + "description": "Message text with formatting" + } + ], + "is_synchronous": false + }, + { + "name": "getWebPageInstantView", + "description": "Returns an instant view version of a web page if available. Returns a 404 error if the web page has no instant view page", + "class": "WebPageInstantView", + "properties": [ + { + "name": "url", + "type": "string", + "description": "The web page URL" + }, + { + "name": "force_full", + "type": "Bool", + "description": "If true, the full instant view for the web page will be returned" + } + ], + "is_synchronous": false + }, + { + "name": "getNotificationSettings", + "description": "Returns the notification settings for a given scope", + "class": "NotificationSettings", + "properties": [ + { + "name": "scope", + "type": "NotificationSettingsScope", + "description": "Scope for which to return the notification settings information" + } + ], + "is_synchronous": false + }, + { + "name": "setNotificationSettings", + "description": "Changes notification settings for a given scope", + "class": "Ok", + "properties": [ + { + "name": "scope", + "type": "NotificationSettingsScope", + "description": "Scope for which to change the notification settings" + }, + { + "name": "notification_settings", + "type": "notificationSettings", + "description": "The new notification settings for the given scope" + } + ], + "is_synchronous": false + }, + { + "name": "resetAllNotificationSettings", + "description": "Resets all notification settings to their default values. By default, the only muted chats are supergroups, the sound is set to \"default\" and message previews are shown", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "setProfilePhoto", + "description": "Uploads a new profile photo for the current user. If something changes, updateUser will be sent", + "class": "Ok", + "properties": [ + { + "name": "photo", + "type": "InputFile", + "description": "Profile photo to set. inputFileId and inputFileRemote may still be unsupported" + } + ], + "is_synchronous": false + }, + { + "name": "deleteProfilePhoto", + "description": "Deletes a profile photo. If something changes, updateUser will be sent", + "class": "Ok", + "properties": [ + { + "name": "profile_photo_id", + "type": "int64", + "description": "Identifier of the profile photo to delete" + } + ], + "is_synchronous": false + }, + { + "name": "setName", + "description": "Changes the first and last name of the current user. If something changes, updateUser will be sent", + "class": "Ok", + "properties": [ + { + "name": "first_name", + "type": "string", + "description": "The new value of the first name for the user; 1-255 characters" + }, + { + "name": "last_name", + "type": "string", + "description": "The new value of the optional last name for the user; 0-255 characters" + } + ], + "is_synchronous": false + }, + { + "name": "setBio", + "description": "Changes the bio of the current user", + "class": "Ok", + "properties": [ + { + "name": "bio", + "type": "string", + "description": "The new value of the user bio; 0-70 characters without line feeds" + } + ], + "is_synchronous": false + }, + { + "name": "setUsername", + "description": "Changes the username of the current user. If something changes, updateUser will be sent", + "class": "Ok", + "properties": [ + { + "name": "username", + "type": "string", + "description": "The new value of the username. Use an empty string to remove the username" + } + ], + "is_synchronous": false + }, + { + "name": "changePhoneNumber", + "description": "Changes the phone number of the user and sends an authentication code to the user's new phone number. On success, returns information about the sent code", + "class": "AuthenticationCodeInfo", + "properties": [ + { + "name": "phone_number", + "type": "string", + "description": "The new phone number of the user in international format" + }, + { + "name": "allow_flash_call", + "type": "Bool", + "description": "Pass true if the code can be sent via flash call to the specified phone number" + }, + { + "name": "is_current_phone_number", + "type": "Bool", + "description": "Pass true if the phone number is used on the current device. Ignored if allow_flash_call is false" + } + ], + "is_synchronous": false + }, + { + "name": "resendChangePhoneNumberCode", + "description": "Re-sends the authentication code sent to confirm a new phone number for the user. Works only if the previously received authenticationCodeInfo next_code_type was not null", + "class": "AuthenticationCodeInfo", + "properties": [], + "is_synchronous": false + }, + { + "name": "checkChangePhoneNumberCode", + "description": "Checks the authentication code sent to confirm a new phone number of the user", + "class": "Ok", + "properties": [ + { + "name": "code", + "type": "string", + "description": "Verification code received by SMS, phone call or flash call" + } + ], + "is_synchronous": false + }, + { + "name": "getActiveSessions", + "description": "Returns all active sessions of the current user", + "class": "Sessions", + "properties": [], + "is_synchronous": false + }, + { + "name": "terminateSession", + "description": "Terminates a session of the current user", + "class": "Ok", + "properties": [ + { + "name": "session_id", + "type": "int64", + "description": "Session identifier" + } + ], + "is_synchronous": false + }, + { + "name": "terminateAllOtherSessions", + "description": "Terminates all other sessions of the current user", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "getConnectedWebsites", + "description": "Returns all website where the current user used Telegram to log in", + "class": "ConnectedWebsites", + "properties": [], + "is_synchronous": false + }, + { + "name": "disconnectWebsite", + "description": "Disconnects website from the current user's Telegram account", + "class": "Ok", + "properties": [ + { + "name": "website_id", + "type": "int64", + "description": "Website identifier" + } + ], + "is_synchronous": false + }, + { + "name": "disconnectAllWebsites", + "description": "Disconnects all websites from the current user's Telegram account", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "toggleBasicGroupAdministrators", + "description": "Toggles the \"All members are admins\" setting in basic groups; requires creator privileges in the group", + "class": "Ok", + "properties": [ + { + "name": "basic_group_id", + "type": "int32", + "description": "Identifier of the basic group" + }, + { + "name": "everyone_is_administrator", + "type": "Bool", + "description": "New value of everyone_is_administrator" + } + ], + "is_synchronous": false + }, + { + "name": "setSupergroupUsername", + "description": "Changes the username of a supergroup or channel, requires creator privileges in the supergroup or channel", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup or channel" + }, + { + "name": "username", + "type": "string", + "description": "New value of the username. Use an empty string to remove the username" + } + ], + "is_synchronous": false + }, + { + "name": "setSupergroupStickerSet", + "description": "Changes the sticker set of a supergroup; requires appropriate rights in the supergroup", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup" + }, + { + "name": "sticker_set_id", + "type": "int64", + "description": "New value of the supergroup sticker set identifier. Use 0 to remove the supergroup sticker set" + } + ], + "is_synchronous": false + }, + { + "name": "toggleSupergroupInvites", + "description": "Toggles whether all members of a supergroup can add new members; requires appropriate administrator rights in the supergroup.", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup" + }, + { + "name": "anyone_can_invite", + "type": "Bool", + "description": "New value of anyone_can_invite" + } + ], + "is_synchronous": false + }, + { + "name": "toggleSupergroupSignMessages", + "description": "Toggles sender signatures messages sent in a channel; requires appropriate administrator rights in the channel.", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the channel" + }, + { + "name": "sign_messages", + "type": "Bool", + "description": "New value of sign_messages" + } + ], + "is_synchronous": false + }, + { + "name": "toggleSupergroupIsAllHistoryAvailable", + "description": "Toggles whether the message history of a supergroup is available to new members; requires appropriate administrator rights in the supergroup.", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "The identifier of the supergroup" + }, + { + "name": "is_all_history_available", + "type": "Bool", + "description": "The new value of is_all_history_available" + } + ], + "is_synchronous": false + }, + { + "name": "setSupergroupDescription", + "description": "Changes information about a supergroup or channel; requires appropriate administrator rights", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup or channel" + }, + { + "name": "description", + "type": "string", + "description": "New supergroup or channel description; 0-255 characters" + } + ], + "is_synchronous": false + }, + { + "name": "pinSupergroupMessage", + "description": "Pins a message in a supergroup or channel; requires appropriate administrator rights in the supergroup or channel", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup or channel" + }, + { + "name": "message_id", + "type": "int53", + "description": "Identifier of the new pinned message" + }, + { + "name": "disable_notification", + "type": "Bool", + "description": "True, if there should be no notification about the pinned message" + } + ], + "is_synchronous": false + }, + { + "name": "unpinSupergroupMessage", + "description": "Removes the pinned message from a supergroup or channel; requires appropriate administrator rights in the supergroup or channel", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup or channel" + } + ], + "is_synchronous": false + }, + { + "name": "reportSupergroupSpam", + "description": "Reports some messages from a user in a supergroup as spam", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Supergroup identifier" + }, + { + "name": "user_id", + "type": "int32", + "description": "User identifier" + }, + { + "name": "message_ids", + "type": "vector\u003cint53\u003e", + "description": "Identifiers of messages sent in the supergroup by the user. This list must be non-empty" + } + ], + "is_synchronous": false + }, + { + "name": "getSupergroupMembers", + "description": "Returns information about members or banned users in a supergroup or channel. Can be used only if SupergroupFullInfo.can_get_members == true; additionally, administrator privileges may be required for some filters", + "class": "ChatMembers", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup or channel" + }, + { + "name": "filter", + "type": "SupergroupMembersFilter", + "description": "The type of users to return. By default, supergroupMembersRecent" + }, + { + "name": "offset", + "type": "int32", + "description": "Number of users to skip" + }, + { + "name": "limit", + "type": "int32", + "description": "The maximum number of users be returned; up to 200" + } + ], + "is_synchronous": false + }, + { + "name": "deleteSupergroup", + "description": "Deletes a supergroup or channel along with all messages in the corresponding chat. This will release the supergroup or channel username and remove all members; requires creator privileges in the supergroup or channel. Chats with more than 1000 members can't be deleted using this method", + "class": "Ok", + "properties": [ + { + "name": "supergroup_id", + "type": "int32", + "description": "Identifier of the supergroup or channel" + } + ], + "is_synchronous": false + }, + { + "name": "closeSecretChat", + "description": "Closes a secret chat, effectively transfering its state to secretChatStateClosed", + "class": "Ok", + "properties": [ + { + "name": "secret_chat_id", + "type": "int32", + "description": "Secret chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getChatEventLog", + "description": "Returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only in supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i. e., in order of decreasing event_id)", + "class": "ChatEvents", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "query", + "type": "string", + "description": "Search query by which to filter events" + }, + { + "name": "from_event_id", + "type": "int64", + "description": "Identifier of an event from which to return results. Use 0 to get results from the latest events" + }, + { + "name": "limit", + "type": "int32", + "description": "Maximum number of events to return; up to 100" + }, + { + "name": "filters", + "type": "chatEventLogFilters", + "description": "The types of events to return. By default, all types will be returned" + }, + { + "name": "user_ids", + "type": "vector\u003cint32\u003e", + "description": "User identifiers by which to filter events. By default, events relating to all users will be returned" + } + ], + "is_synchronous": false + }, + { + "name": "getPaymentForm", + "description": "Returns an invoice payment form. This method should be called when the user presses inlineKeyboardButtonBuy", + "class": "PaymentForm", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier of the Invoice message" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + } + ], + "is_synchronous": false + }, + { + "name": "validateOrderInfo", + "description": "Validates the order information provided by a user and returns the available shipping options for a flexible invoice", + "class": "ValidatedOrderInfo", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier of the Invoice message" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + }, + { + "name": "order_info", + "type": "orderInfo", + "description": "The order information, provided by the user" + }, + { + "name": "allow_save", + "type": "Bool", + "description": "True, if the order information can be saved" + } + ], + "is_synchronous": false + }, + { + "name": "sendPaymentForm", + "description": "Sends a filled-out payment form to the bot for final verification", + "class": "PaymentResult", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier of the Invoice message" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + }, + { + "name": "order_info_id", + "type": "string", + "description": "Identifier returned by ValidateOrderInfo, or an empty string" + }, + { + "name": "shipping_option_id", + "type": "string", + "description": "Identifier of a chosen shipping option, if applicable" + }, + { + "name": "credentials", + "type": "InputCredentials", + "description": "The credentials chosen by user for payment" + } + ], + "is_synchronous": false + }, + { + "name": "getPaymentReceipt", + "description": "Returns information about a successful payment", + "class": "PaymentReceipt", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier of the PaymentSuccessful message" + }, + { + "name": "message_id", + "type": "int53", + "description": "Message identifier" + } + ], + "is_synchronous": false + }, + { + "name": "getSavedOrderInfo", + "description": "Returns saved order info, if any", + "class": "OrderInfo", + "properties": [], + "is_synchronous": false + }, + { + "name": "deleteSavedOrderInfo", + "description": "Deletes saved order info", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "deleteSavedCredentials", + "description": "Deletes saved credentials for all payment provider bots", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "getSupportUser", + "description": "Returns a user that can be contacted to get support", + "class": "User", + "properties": [], + "is_synchronous": false + }, + { + "name": "getWallpapers", + "description": "Returns background wallpapers", + "class": "Wallpapers", + "properties": [], + "is_synchronous": false + }, + { + "name": "registerDevice", + "description": "Registers the currently used device for receiving push notifications", + "class": "Ok", + "properties": [ + { + "name": "device_token", + "type": "DeviceToken", + "description": "Device token" + }, + { + "name": "other_user_ids", + "type": "vector\u003cint32\u003e", + "description": "List of at most 100 user identifiers of other users currently using the client" + } + ], + "is_synchronous": false + }, + { + "name": "getRecentlyVisitedTMeUrls", + "description": "Returns t.me URLs recently visited by a newly registered user", + "class": "TMeUrls", + "properties": [ + { + "name": "referrer", + "type": "string", + "description": "Google Play referrer to identify the user" + } + ], + "is_synchronous": false + }, + { + "name": "setUserPrivacySettingRules", + "description": "Changes user privacy settings", + "class": "Ok", + "properties": [ + { + "name": "setting", + "type": "UserPrivacySetting", + "description": "The privacy setting" + }, + { + "name": "rules", + "type": "userPrivacySettingRules", + "description": "The new privacy rules" + } + ], + "is_synchronous": false + }, + { + "name": "getUserPrivacySettingRules", + "description": "Returns the current privacy settings", + "class": "UserPrivacySettingRules", + "properties": [ + { + "name": "setting", + "type": "UserPrivacySetting", + "description": "The privacy setting" + } + ], + "is_synchronous": false + }, + { + "name": "getOption", + "description": "Returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization", + "class": "OptionValue", + "properties": [ + { + "name": "name", + "type": "string", + "description": "The name of the option" + } + ], + "is_synchronous": false + }, + { + "name": "setOption", + "description": "Sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization", + "class": "Ok", + "properties": [ + { + "name": "name", + "type": "string", + "description": "The name of the option" + }, + { + "name": "value", + "type": "OptionValue", + "description": "The new value of the option" + } + ], + "is_synchronous": false + }, + { + "name": "setAccountTtl", + "description": "Changes the period of inactivity after which the account of the current user will automatically be deleted", + "class": "Ok", + "properties": [ + { + "name": "ttl", + "type": "accountTtl", + "description": "New account TTL" + } + ], + "is_synchronous": false + }, + { + "name": "getAccountTtl", + "description": "Returns the period of inactivity after which the account of the current user will automatically be deleted", + "class": "AccountTtl", + "properties": [], + "is_synchronous": false + }, + { + "name": "deleteAccount", + "description": "Deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account", + "class": "Ok", + "properties": [ + { + "name": "reason", + "type": "string", + "description": "The reason why the account was deleted; optional" + } + ], + "is_synchronous": false + }, + { + "name": "getChatReportSpamState", + "description": "Returns information on whether the current chat can be reported as spam", + "class": "ChatReportSpamState", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + } + ], + "is_synchronous": false + }, + { + "name": "changeChatReportSpamState", + "description": "Used to let the server know whether a chat is spam or not. Can be used only if ChatReportSpamState.can_report_spam is true. After this request, ChatReportSpamState.can_report_spam becomes false forever", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "is_spam_chat", + "type": "Bool", + "description": "If true, the chat will be reported as spam; otherwise it will be marked as not spam" + } + ], + "is_synchronous": false + }, + { + "name": "reportChat", + "description": "Reports a chat to the Telegram moderators. Supported only for supergroups, channels, or private chats with bots, since other chats can't be checked by moderators", + "class": "Ok", + "properties": [ + { + "name": "chat_id", + "type": "int53", + "description": "Chat identifier" + }, + { + "name": "reason", + "type": "ChatReportReason", + "description": "The reason for reporting the chat" + }, + { + "name": "message_ids", + "type": "vector\u003cint53\u003e", + "description": "Identifiers of reported messages, if any" + } + ], + "is_synchronous": false + }, + { + "name": "getStorageStatistics", + "description": "Returns storage usage statistics", + "class": "StorageStatistics", + "properties": [ + { + "name": "chat_limit", + "type": "int32", + "description": "Maximum number of chats with the largest storage usage for which separate statistics should be returned. All other chats will be grouped in entries with chat_id == 0. If the chat info database is not used, the chat_limit is ignored and is always set to 0" + } + ], + "is_synchronous": false + }, + { + "name": "getStorageStatisticsFast", + "description": "Quickly returns approximate storage usage statistics", + "class": "StorageStatisticsFast", + "properties": [], + "is_synchronous": false + }, + { + "name": "optimizeStorage", + "description": "Optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted", + "class": "StorageStatistics", + "properties": [ + { + "name": "size", + "type": "int53", + "description": "Limit on the total size of files after deletion. Pass -1 to use the default limit" + }, + { + "name": "ttl", + "type": "int32", + "description": "Limit on the time that has passed since the last time a file was accessed (or creation time for some filesystems). Pass -1 to use the default limit" + }, + { + "name": "count", + "type": "int32", + "description": "Limit on the total count of files after deletion. Pass -1 to use the default limit" + }, + { + "name": "immunity_delay", + "type": "int32", + "description": "The amount of time after the creation of a file during which it can't be deleted, in seconds. Pass -1 to use the default value" + }, + { + "name": "file_types", + "type": "vector\u003cFileType\u003e", + "description": "If not empty, only files with the given type(s) are considered. By default, all types except thumbnails, profile photos, stickers and wallpapers are deleted" + }, + { + "name": "chat_ids", + "type": "vector\u003cint53\u003e", + "description": "If not empty, only files from the given chats are considered. Use 0 as chat identifier to delete files not belonging to any chat (e.g., profile photos)" + }, + { + "name": "exclude_chat_ids", + "type": "vector\u003cint53\u003e", + "description": "If not empty, files from the given chats are excluded. Use 0 as chat identifier to exclude all files not belonging to any chat (e.g., profile photos)" + }, + { + "name": "chat_limit", + "type": "int32", + "description": "Same as in getStorageStatistics. Affects only returned statistics" + } + ], + "is_synchronous": false + }, + { + "name": "setNetworkType", + "description": "Sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it should be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics", + "class": "Ok", + "properties": [ + { + "name": "type", + "type": "NetworkType", + "description": "The new network type. By default, networkTypeOther" + } + ], + "is_synchronous": false + }, + { + "name": "getNetworkStatistics", + "description": "Returns network data usage statistics. Can be called before authorization", + "class": "NetworkStatistics", + "properties": [ + { + "name": "only_current", + "type": "Bool", + "description": "If true, returns only data for the current library launch" + } + ], + "is_synchronous": false + }, + { + "name": "addNetworkStatistics", + "description": "Adds the specified data to data usage statistics. Can be called before authorization", + "class": "Ok", + "properties": [ + { + "name": "entry", + "type": "NetworkStatisticsEntry", + "description": "The network statistics entry with the data to be added to statistics" + } + ], + "is_synchronous": false + }, + { + "name": "resetNetworkStatistics", + "description": "Resets all network data usage statistics to zero. Can be called before authorization", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "setBotUpdatesStatus", + "description": "Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only", + "class": "Ok", + "properties": [ + { + "name": "pending_update_count", + "type": "int32", + "description": "The number of pending updates" + }, + { + "name": "error_message", + "type": "string", + "description": "The last error message" + } + ], + "is_synchronous": false + }, + { + "name": "uploadStickerFile", + "description": "Uploads a PNG image with a sticker; for bots only; returns the uploaded file", + "class": "File", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Sticker file owner" + }, + { + "name": "png_sticker", + "type": "InputFile", + "description": "PNG image with the sticker; must be up to 512 kB in size and fit in 512x512 square" + } + ], + "is_synchronous": false + }, + { + "name": "createNewStickerSet", + "description": "Creates a new sticker set; for bots only. Returns the newly created sticker set", + "class": "StickerSet", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Sticker set owner" + }, + { + "name": "title", + "type": "string", + "description": "Sticker set title; 1-64 characters" + }, + { + "name": "name", + "type": "string", + "description": "Sticker set name. Can contain only English letters, digits and underscores. Must end with *\"_by_\u003cbot username\u003e\"* (*\u003cbot_username\u003e* is case insensitive); 1-64 characters" + }, + { + "name": "is_masks", + "type": "Bool", + "description": "True, if stickers are masks" + }, + { + "name": "stickers", + "type": "vector\u003cinputSticker\u003e", + "description": "List of stickers to be added to the set" + } + ], + "is_synchronous": false + }, + { + "name": "addStickerToSet", + "description": "Adds a new sticker to a set; for bots only. Returns the sticker set", + "class": "StickerSet", + "properties": [ + { + "name": "user_id", + "type": "int32", + "description": "Sticker set owner" + }, + { + "name": "name", + "type": "string", + "description": "Sticker set name" + }, + { + "name": "sticker", + "type": "inputSticker", + "description": "Sticker to add to the set" + } + ], + "is_synchronous": false + }, + { + "name": "setStickerPositionInSet", + "description": "Changes the position of a sticker in the set to which it belongs; for bots only. The sticker set must have been created by the bot", + "class": "Ok", + "properties": [ + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker" + }, + { + "name": "position", + "type": "int32", + "description": "New position of the sticker in the set, zero-based" + } + ], + "is_synchronous": false + }, + { + "name": "removeStickerFromSet", + "description": "Removes a sticker from the set to which it belongs; for bots only. The sticker set must have been created by the bot", + "class": "Ok", + "properties": [ + { + "name": "sticker", + "type": "InputFile", + "description": "Sticker" + } + ], + "is_synchronous": false + }, + { + "name": "sendCustomRequest", + "description": "Sends a custom request; for bots only", + "class": "CustomRequestResult", + "properties": [ + { + "name": "method", + "type": "string", + "description": "The method name" + }, + { + "name": "parameters", + "type": "string", + "description": "JSON-serialized method parameters" + } + ], + "is_synchronous": false + }, + { + "name": "answerCustomQuery", + "description": "Answers a custom query; for bots only", + "class": "Ok", + "properties": [ + { + "name": "custom_query_id", + "type": "int64", + "description": "Identifier of a custom query" + }, + { + "name": "data", + "type": "string", + "description": "JSON-serialized answer to the query" + } + ], + "is_synchronous": false + }, + { + "name": "setAlarm", + "description": "Succeeds after a specified amount of time has passed. Can be called before authorization", + "class": "Ok", + "properties": [ + { + "name": "seconds", + "type": "double", + "description": "Number of seconds before the function returns" + } + ], + "is_synchronous": false + }, + { + "name": "getCountryCode", + "description": "Uses current user IP to found his country. Returns two-letter ISO 3166-1 alpha-2 country code. Can be called before authorization", + "class": "Text", + "properties": [], + "is_synchronous": false + }, + { + "name": "getInviteText", + "description": "Returns the default text for invitation messages to be used as a placeholder when the current user invites friends to Telegram", + "class": "Text", + "properties": [], + "is_synchronous": false + }, + { + "name": "getTermsOfService", + "description": "Returns the terms of service. Can be called before authorization", + "class": "Text", + "properties": [], + "is_synchronous": false + }, + { + "name": "setProxy", + "description": "Sets the proxy server for network requests. Can be called before authorization", + "class": "Ok", + "properties": [ + { + "name": "proxy", + "type": "Proxy", + "description": "Proxy server to use. Specify null to remove the proxy server" + } + ], + "is_synchronous": false + }, + { + "name": "getProxy", + "description": "Returns the proxy that is currently set up. Can be called before authorization", + "class": "Proxy", + "properties": [], + "is_synchronous": false + }, + { + "name": "testCallEmpty", + "description": "Does nothing; for testing only", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "testCallString", + "description": "Returns the received string; for testing only", + "class": "TestString", + "properties": [ + { + "name": "x", + "type": "string", + "description": "String to return" + } + ], + "is_synchronous": false + }, + { + "name": "testCallBytes", + "description": "Returns the received bytes; for testing only", + "class": "TestBytes", + "properties": [ + { + "name": "x", + "type": "bytes", + "description": "Bytes to return" + } + ], + "is_synchronous": false + }, + { + "name": "testCallVectorInt", + "description": "Returns the received vector of numbers; for testing only", + "class": "TestVectorInt", + "properties": [ + { + "name": "x", + "type": "vector\u003cint32\u003e", + "description": "Vector of numbers to return" + } + ], + "is_synchronous": false + }, + { + "name": "testCallVectorIntObject", + "description": "Returns the received vector of objects containing a number; for testing only", + "class": "TestVectorIntObject", + "properties": [ + { + "name": "x", + "type": "vector\u003ctestInt\u003e", + "description": "Vector of objects to return" + } + ], + "is_synchronous": false + }, + { + "name": "testCallVectorString", + "description": "For testing only request. Returns the received vector of strings; for testing only", + "class": "TestVectorString", + "properties": [ + { + "name": "x", + "type": "vector\u003cstring\u003e", + "description": "Vector of strings to return" + } + ], + "is_synchronous": false + }, + { + "name": "testCallVectorStringObject", + "description": "Returns the received vector of objects containing a string; for testing only", + "class": "TestVectorStringObject", + "properties": [ + { + "name": "x", + "type": "vector\u003ctestString\u003e", + "description": "Vector of objects to return" + } + ], + "is_synchronous": false + }, + { + "name": "testSquareInt", + "description": "Returns the squared received number; for testing only", + "class": "TestInt", + "properties": [ + { + "name": "x", + "type": "int32", + "description": "Number to square" + } + ], + "is_synchronous": false + }, + { + "name": "testNetwork", + "description": "Sends a simple network request to the Telegram servers; for testing only", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "testGetDifference", + "description": "Forces an updates.getDifference call to the Telegram servers; for testing only", + "class": "Ok", + "properties": [], + "is_synchronous": false + }, + { + "name": "testUseUpdate", + "description": "Does nothing and ensures that the Update object is used; for testing only", + "class": "Update", + "properties": [], + "is_synchronous": false + }, + { + "name": "testUseError", + "description": "Does nothing and ensures that the Error object is used; for testing only", + "class": "Error", + "properties": [], + "is_synchronous": false + } + ] +} \ No newline at end of file diff --git a/data/td_api.tl b/data/td_api.tl new file mode 100644 index 0000000..2e7008e --- /dev/null +++ b/data/td_api.tl @@ -0,0 +1,2885 @@ +double ? = Double; +string ? = String; + +int32 = Int32; +int53 = Int53; +int64 = Int64; +bytes = Bytes; + +boolFalse = Bool; +boolTrue = Bool; + +vector {t:Type} # [ t ] = Vector t; + + +//@description An object of this type can be returned on every function call, in case of an error +//@code Error code; subject to future changes. If the error code is 406, the error message must not be processed in any way and must not be displayed to the user +//@message Error message; subject to future changes +error code:int32 message:string = Error; + + +//@description An object of this type is returned on a successful function call for certain functions +ok = Ok; + + +//@description Contains parameters for TDLib initialization +//@use_test_dc If set to true, the Telegram test environment will be used instead of the production environment +//@database_directory The path to the directory for the persistent database; if empty, the current working directory will be used +//@files_directory The path to the directory for storing files; if empty, database_directory will be used +//@use_file_database If set to true, information about downloaded and uploaded files will be saved between application restarts +//@use_chat_info_database If set to true, the library will maintain a cache of users, basic groups, supergroups, channels and secret chats. Implies use_file_database +//@use_message_database If set to true, the library will maintain a cache of chats and messages. Implies use_chat_info_database +//@use_secret_chats If set to true, support for secret chats will be enabled +//@api_id Application identifier for Telegram API access, which can be obtained at https://my.telegram.org +//@api_hash Application identifier hash for Telegram API access, which can be obtained at https://my.telegram.org +//@system_language_code IETF language tag of the user's operating system language; must be non-empty +//@device_model Model of the device the application is being run on; must be non-empty +//@system_version Version of the operating system the application is being run on; must be non-empty +//@application_version Application version; must be non-empty +//@enable_storage_optimizer If set to true, old files will automatically be deleted +//@ignore_file_names If set to true, original file names will be ignored. Otherwise, downloaded files will be saved under names as close as possible to the original name +tdlibParameters use_test_dc:Bool database_directory:string files_directory:string use_file_database:Bool use_chat_info_database:Bool use_message_database:Bool use_secret_chats:Bool api_id:int32 api_hash:string system_language_code:string device_model:string system_version:string application_version:string enable_storage_optimizer:Bool ignore_file_names:Bool = TdlibParameters; + + +//@class AuthenticationCodeType @description Provides information about the method by which an authentication code is delivered to the user + +//@description An authentication code is delivered via a private Telegram message, which can be viewed in another client @length Length of the code +authenticationCodeTypeTelegramMessage length:int32 = AuthenticationCodeType; + +//@description An authentication code is delivered via an SMS message to the specified phone number @length Length of the code +authenticationCodeTypeSms length:int32 = AuthenticationCodeType; + +//@description An authentication code is delivered via a phone call to the specified phone number @length Length of the code +authenticationCodeTypeCall length:int32 = AuthenticationCodeType; + +//@description An authentication code is delivered by an immediately cancelled call to the specified phone number. The number from which the call was made is the code @pattern Pattern of the phone number from which the call will be made +authenticationCodeTypeFlashCall pattern:string = AuthenticationCodeType; + + +//@description Information about the authentication code that was sent @phone_number A phone number that is being authenticated @type Describes the way the code was sent to the user @next_type Describes the way the next code will be sent to the user; may be null @timeout Timeout before the code should be re-sent, in seconds +authenticationCodeInfo phone_number:string type:AuthenticationCodeType next_type:AuthenticationCodeType timeout:int32 = AuthenticationCodeInfo; + + +//@class AuthorizationState @description Represents the current authorization state of the client + +//@description TDLib needs TdlibParameters for initialization +authorizationStateWaitTdlibParameters = AuthorizationState; + +//@description TDLib needs an encryption key to decrypt the local database @is_encrypted True, if the database is currently encrypted +authorizationStateWaitEncryptionKey is_encrypted:Bool = AuthorizationState; + +//@description TDLib needs the user's phone number to authorize +authorizationStateWaitPhoneNumber = AuthorizationState; + +//@description TDLib needs the user's authentication code to finalize authorization @is_registered True, if the user is already registered @code_info Information about the authorization code that was sent +authorizationStateWaitCode is_registered:Bool code_info:authenticationCodeInfo = AuthorizationState; + +//@description The user has been authorized, but needs to enter a password to start using the application @password_hint Hint for the password; can be empty @has_recovery_email_address True if a recovery email address has been set up +//@recovery_email_address_pattern Pattern of the email address to which the recovery email was sent; empty until a recovery email has been sent +authorizationStateWaitPassword password_hint:string has_recovery_email_address:Bool recovery_email_address_pattern:string = AuthorizationState; + +//@description The user has been successfully authorized. TDLib is now ready to answer queries +authorizationStateReady = AuthorizationState; + +//@description The user is currently logging out +authorizationStateLoggingOut = AuthorizationState; + +//@description TDLib is closing, all subsequent queries will be answered with the error 500. Note that closing TDLib can take a while. All resources will be freed only after authorizationStateClosed has been received +authorizationStateClosing = AuthorizationState; + +//@description TDLib client is in its final state. All databases are closed and all resources are released. No other updates will be received after this. All queries will be responded to +//-with error code 500. To continue working, one should create a new instance of the TDLib client +authorizationStateClosed = AuthorizationState; + + +//@description Represents the current state of 2-step verification @has_password True if a 2-step verification password has been set up @password_hint Hint for the password; can be empty @has_recovery_email_address True if a recovery email has been set up @unconfirmed_recovery_email_address_pattern Pattern of the email address to which a confirmation email was sent +passwordState has_password:Bool password_hint:string has_recovery_email_address:Bool unconfirmed_recovery_email_address_pattern:string = PasswordState; + +//@description Contains information available to the user after requesting password recovery @recovery_email_address_pattern Pattern of the email address to which a recovery email was sent +passwordRecoveryInfo recovery_email_address_pattern:string = PasswordRecoveryInfo; + +//@description Contains information about the current recovery email address @recovery_email_address Recovery email address +recoveryEmailAddress recovery_email_address:string = RecoveryEmailAddress; + + +//@description Returns information about the availability of a temporary password, which can be used for payments @has_password True, if a temporary password is available @valid_for Time left before the temporary password expires, in seconds +temporaryPasswordState has_password:Bool valid_for:int32 = TemporaryPasswordState; + + +//@description Represents a local file +//@path Local path to the locally available file part; may be empty +//@can_be_downloaded True, if it is possible to try to download or generate the file +//@can_be_deleted True, if the file can be deleted +//@is_downloading_active True, if the file is currently being downloaded (or a local copy is being generated by some other means) +//@is_downloading_completed True, if the local copy is fully available +//@downloaded_prefix_size If is_downloading_completed is false, then only some prefix of the file is ready to be read. downloaded_prefix_size is the size of that prefix +//@downloaded_size Total downloaded file bytes. Should be used only for calculating download progress. The actual file size may be bigger, and some parts of it may contain garbage +localFile path:string can_be_downloaded:Bool can_be_deleted:Bool is_downloading_active:Bool is_downloading_completed:Bool downloaded_prefix_size:int32 downloaded_size:int32 = LocalFile; + +//@description Represents a remote file +//@id Remote file identifier, may be empty. Can be used across application restarts or even from other devices for the current user. If the ID starts with "http://" or "https://", it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known. +//-If downloadFile is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the client with the HTTP URL in the original_path and "#url#" as the conversion string. Clients should generate the file by downloading it to the specified location +//@is_uploading_active True, if the file is currently being uploaded (or a remote copy is being generated by some other means) +//@is_uploading_completed True, if a remote copy is fully available +//@uploaded_size Size of the remote available part of the file; 0 if unknown +remoteFile id:string is_uploading_active:Bool is_uploading_completed:Bool uploaded_size:int32 = RemoteFile; + +//@description Represents a file +//@id Unique file identifier +//@size File size; 0 if unknown +//@expected_size Expected file size in case the exact file size is unknown, but an approximate size is known. Can be used to show download/upload progress +//@local Information about the local copy of the file +//@remote Information about the remote copy of the file +file id:int32 size:int32 expected_size:int32 local:localFile remote:remoteFile = File; + + +//@class InputFile @description Points to a file + +//@description A file defined by its unique ID @id Unique file identifier +inputFileId id:int32 = InputFile; + +//@description A file defined by its remote ID @id Remote file identifier +inputFileRemote id:string = InputFile; + +//@description A file defined by a local path @path Local path to the file +inputFileLocal path:string = InputFile; + +//@description A file generated by the client @original_path Local path to a file from which the file is generated, may be empty if there is no such file @conversion String specifying the conversion applied to the original file; should be persistent across application restarts @expected_size Expected size of the generated file; 0 if unknown +inputFileGenerated original_path:string conversion:string expected_size:int32 = InputFile; + + +//@description Photo description @type Thumbnail type (see https://core.telegram.org/constructor/photoSize) @photo Information about the photo file @width Photo width @height Photo height +photoSize type:string photo:file width:int32 height:int32 = PhotoSize; + + +//@class MaskPoint @description Part of the face, relative to which a mask should be placed + +//@description A mask should be placed relatively to the forehead +maskPointForehead = MaskPoint; + +//@description A mask should be placed relatively to the eyes +maskPointEyes = MaskPoint; + +//@description A mask should be placed relatively to the mouth +maskPointMouth = MaskPoint; + +//@description A mask should be placed relatively to the chin +maskPointChin = MaskPoint; + +//@description Position on a photo where a mask should be placed @point Part of the face, relative to which the mask should be placed +//@x_shift Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position) +//@y_shift Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. (For example, 1.0 will place the mask just below the default mask position) +//@scale Mask scaling coefficient. (For example, 2.0 means a doubled size) +maskPosition point:MaskPoint x_shift:double y_shift:double scale:double = MaskPosition; + + +//@description Represents a part of the text that needs to be formatted in some unusual way @offset Offset of the entity in UTF-16 code points @length Length of the entity, in UTF-16 code points @type Type of the entity +textEntity offset:int32 length:int32 type:TextEntityType = TextEntity; + +//@description Contains a list of text entities @entities List of text entities +textEntities entities:vector = TextEntities; + +//@description A text with some entities @text The text @entities Entities contained in the text +formattedText text:string entities:vector = FormattedText; + + +//@description Describes an animation file. The animation must be encoded in GIF or MPEG4 format @duration Duration of the animation, in seconds; as defined by the sender @width Width of the animation @height Height of the animation +//@file_name Original name of the file; as defined by the sender @mime_type MIME type of the file, usually "image/gif" or "video/mp4" @thumbnail Animation thumbnail; may be null @animation File containing the animation +animation duration:int32 width:int32 height:int32 file_name:string mime_type:string thumbnail:photoSize animation:file = Animation; + +//@description Describes an audio file. Audio is usually in MP3 format @duration Duration of the audio, in seconds; as defined by the sender @title Title of the audio; as defined by the sender @performer Performer of the audio; as defined by the sender +//@file_name Original name of the file; as defined by the sender @mime_type The MIME type of the file; as defined by the sender @album_cover_thumbnail The thumbnail of the album cover; as defined by the sender. The full size thumbnail should be extracted from the downloaded file; may be null @audio File containing the audio +audio duration:int32 title:string performer:string file_name:string mime_type:string album_cover_thumbnail:photoSize audio:file = Audio; + +//@description Describes a document of any type @file_name Original name of the file; as defined by the sender @mime_type MIME type of the file; as defined by the sender +//@thumbnail Document thumbnail; as defined by the sender; may be null @document File containing the document +document file_name:string mime_type:string thumbnail:photoSize document:file = Document; + +//@description Describes a photo @id Photo identifier; 0 for deleted photos @has_stickers True, if stickers were added to the photo @sizes Available variants of the photo, in different sizes +photo id:int64 has_stickers:Bool sizes:vector = Photo; + +//@description Describes a sticker @set_id The identifier of the sticker set to which the sticker belongs; 0 if none @width Sticker width; as defined by the sender @height Sticker height; as defined by the sender +//@emoji Emoji corresponding to the sticker @is_mask True, if the sticker is a mask @mask_position Position where the mask should be placed; may be null @thumbnail Sticker thumbnail in WEBP or JPEG format; may be null @sticker File containing the sticker +sticker set_id:int64 width:int32 height:int32 emoji:string is_mask:Bool mask_position:maskPosition thumbnail:photoSize sticker:file = Sticker; + +//@description Describes a video file @duration Duration of the video, in seconds; as defined by the sender @width Video width; as defined by the sender @height Video height; as defined by the sender +//@file_name Original name of the file; as defined by the sender @mime_type MIME type of the file; as defined by the sender @has_stickers True, if stickers were added to the photo +//@supports_streaming True, if the video should be tried to be streamed @thumbnail Video thumbnail; as defined by the sender; may be null @video File containing the video +video duration:int32 width:int32 height:int32 file_name:string mime_type:string has_stickers:Bool supports_streaming:Bool thumbnail:photoSize video:file = Video; + +//@description Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format @duration Duration of the video, in seconds; as defined by the sender @length Video width and height; as defined by the sender @thumbnail Video thumbnail; as defined by the sender; may be null @video File containing the video +videoNote duration:int32 length:int32 thumbnail:photoSize video:file = VideoNote; + +//@description Describes a voice note. The voice note must be encoded with the Opus codec, and stored inside an OGG container. Voice notes can have only a single audio channel @duration Duration of the voice note, in seconds; as defined by the sender +//@waveform A waveform representation of the voice note in 5-bit format @mime_type MIME type of the file; as defined by the sender @voice File containing the voice note +voiceNote duration:int32 waveform:bytes mime_type:string voice:file = VoiceNote; + +//@description Describes a user contact @phone_number Phone number of the user @first_name First name of the user; 1-255 characters in length @last_name Last name of the user @user_id Identifier of the user, if known; otherwise 0 +contact phone_number:string first_name:string last_name:string user_id:int32 = Contact; + +//@description Describes a location on planet Earth @latitude Latitude of the location in degrees; as defined by the sender @longitude Longitude of the location, in degrees; as defined by the sender +location latitude:double longitude:double = Location; + +//@description Describes a venue @location Venue location; as defined by the sender @title Venue name; as defined by the sender @address Venue address; as defined by the sender @provider Provider of the venue database; as defined by the sender. Currently only "foursquare" needs to be supported +//@id Identifier of the venue in the provider database; as defined by the sender +venue location:location title:string address:string provider:string id:string = Venue; + +//@description Describes a game @id Game ID @short_name Game short name. To share a game use the URL https://t.me/{bot_username}?game={game_short_name} @title Game title @text Game text, usually containing scoreboards for a game +//@param_description Game description @photo Game photo @animation Game animation; may be null +game id:int64 short_name:string title:string text:formattedText description:string photo:photo animation:animation = Game; + + +//@description Describes a user profile photo @id Photo identifier; 0 for an empty photo. Can be used to find a photo in a list of userProfilePhotos +//@small A small (160x160) user profile photo @big A big (640x640) user profile photo +profilePhoto id:int64 small:file big:file = ProfilePhoto; + +//@description Describes the photo of a chat @small A small (160x160) chat photo @big A big (640x640) chat photo +chatPhoto small:file big:file = ChatPhoto; + + +//@class LinkState @description Represents the relationship between user A and user B. For incoming_link, user A is the current user; for outgoing_link, user B is the current user + +//@description The phone number of user A is not known to user B +linkStateNone = LinkState; + +//@description The phone number of user A is known but that number has not been saved to the contacts list of user B +linkStateKnowsPhoneNumber = LinkState; + +//@description The phone number of user A has been saved to the contacts list of user B +linkStateIsContact = LinkState; + + +//@class UserType @description Represents the type of the user. The following types are possible: regular users, deleted users and bots + +//@description A regular user +userTypeRegular = UserType; + +//@description A deleted user or deleted bot. No information on the user besides the user_id is available. It is not possible to perform any active actions on this type of user +userTypeDeleted = UserType; + +//@description A bot (see https://core.telegram.org/bots) @can_join_groups True, if the bot can be invited to basic group and supergroup chats +//@can_read_all_group_messages True, if the bot can read all messages in basic group or supergroup chats and not just those addressed to the bot. In private and channel chats a bot can always read all messages +//@is_inline True, if the bot supports inline queries @inline_query_placeholder Placeholder for inline queries (displayed on the client input field) @need_location True, if the location of the user should be sent with every inline query to this bot +userTypeBot can_join_groups:Bool can_read_all_group_messages:Bool is_inline:Bool inline_query_placeholder:string need_location:Bool = UserType; + +//@description No information on the user besides the user_id is available, yet this user has not been deleted. This object is extremely rare and must be handled like a deleted user. It is not possible to perform any actions on users of this type +userTypeUnknown = UserType; + + +//@description Represents commands supported by a bot @command Text of the bot command @param_description Description of the bot command +botCommand command:string description:string = BotCommand; + +//@description Provides information about a bot and its supported commands @param_description Long description shown on the user info page @commands A list of commands supported by the bot +botInfo description:string commands:vector = BotInfo; + + +//@description Represents a user @id User identifier @first_name First name of the user @last_name Last name of the user @username Username of the user +//@phone_number Phone number of the user @status Current online status of the user @profile_photo Profile photo of the user; may be null +//@outgoing_link Relationship from the current user to the other user @incoming_link Relationship from the other user to the current user @is_verified True, if the user is verified @restriction_reason If non-empty, it contains the reason why access to this user must be restricted. The format of the string is "{type}: {description}". +//-{type} contains the type of the restriction and at least one of the suffixes "-all", "-ios", "-android", or "-wp", which describe the platforms on which access should be restricted. (For example, "terms-ios-android". {description} contains a human-readable description of the restriction, which can be shown to the user) +//@have_access If false, the user is inaccessible, and the only information known about the user is inside this class. It can't be passed to any method except GetUser @type Type of the user @language_code IETF language tag of the user's language; only available to bots +user id:int32 first_name:string last_name:string username:string phone_number:string status:UserStatus profile_photo:profilePhoto outgoing_link:LinkState incoming_link:LinkState is_verified:Bool restriction_reason:string have_access:Bool type:UserType language_code:string = User; + +//@description Contains full information about a user (except the full list of profile photos) @is_blocked True, if the user is blacklisted by the current user @can_be_called True, if the user can be called @has_private_calls True, if the user can't be called due to their privacy settings +//@bio A short user bio @share_text For bots, the text that is included with the link when users share the bot @group_in_common_count Number of group chats where both the other user and the current user are a member; 0 for the current user @bot_info If the user is a bot, information about the bot; may be null +userFullInfo is_blocked:Bool can_be_called:Bool has_private_calls:Bool bio:string share_text:string group_in_common_count:int32 bot_info:botInfo = UserFullInfo; + +//@description Contains part of the list of user photos @total_count Total number of user profile photos @photos A list of photos +userProfilePhotos total_count:int32 photos:vector = UserProfilePhotos; + +//@description Represents a list of users @total_count Approximate total count of users found @user_ids A list of user identifiers +users total_count:int32 user_ids:vector = Users; + + +//@class ChatMemberStatus @description Provides information about the status of a member in a chat + +//@description The user is the creator of a chat and has all the administrator privileges @is_member True, if the user is a member of the chat +chatMemberStatusCreator is_member:Bool = ChatMemberStatus; + +//@description The user is a member of a chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, and ban unprivileged members. In supergroups and channels, there are more detailed options for administrator privileges +//@can_be_edited True, if the current user can edit the administrator privileges for the called user +//@can_change_info True, if the administrator can change the chat title, photo, and other settings +//@can_post_messages True, if the administrator can create channel posts; applicable to channels only +//@can_edit_messages True, if the administrator can edit messages of other users and pin messages; applicable to channels only +//@can_delete_messages True, if the administrator can delete messages of other users +//@can_invite_users True, if the administrator can invite new users to the chat +//@can_restrict_members True, if the administrator can restrict, ban, or unban chat members +//@can_pin_messages True, if the administrator can pin messages; applicable to supergroups only +//@can_promote_members True, if the administrator can add new administrators with a subset of his own privileges or demote administrators that were directly or indirectly promoted by him +chatMemberStatusAdministrator can_be_edited:Bool can_change_info:Bool can_post_messages:Bool can_edit_messages:Bool can_delete_messages:Bool can_invite_users:Bool can_restrict_members:Bool can_pin_messages:Bool can_promote_members:Bool = ChatMemberStatus; + +//@description The user is a member of a chat, without any additional privileges or restrictions +chatMemberStatusMember = ChatMemberStatus; + +//@description The user is under certain restrictions in the chat. Not supported in basic groups and channels +//@is_member True, if the user is a member of the chat +//@restricted_until_date Point in time (Unix timestamp) when restrictions will be lifted from the user; 0 if never. If the user is restricted for more than 366 days or for less than 30 seconds from the current time, the user is considered to be restricted forever +//@can_send_messages True, if the user can send text messages, contacts, locations, and venues +//@can_send_media_messages True, if the user can send audio files, documents, photos, videos, video notes, and voice notes. Implies can_send_messages permissions +//@can_send_other_messages True, if the user can send animations, games, and stickers and use inline bots. Implies can_send_media_messages permissions +//@can_add_web_page_previews True, if the user may add a web page preview to his messages. Implies can_send_messages permissions +chatMemberStatusRestricted is_member:Bool restricted_until_date:int32 can_send_messages:Bool can_send_media_messages:Bool can_send_other_messages:Bool can_add_web_page_previews:Bool = ChatMemberStatus; + +//@description The user is not a chat member +chatMemberStatusLeft = ChatMemberStatus; + +//@description The user was banned (and hence is not a member of the chat). Implies the user can't return to the chat or view messages +//@banned_until_date Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever +chatMemberStatusBanned banned_until_date:int32 = ChatMemberStatus; + + +//@description A user with information about joining/leaving a chat @user_id User identifier of the chat member @inviter_user_id Identifier of a user that invited/promoted/banned this member in the chat; 0 if unknown +//@joined_chat_date Point in time (Unix timestamp) when the user joined a chat @status Status of the member in the chat @bot_info If the user is a bot, information about the bot; may be null. Can be null even for a bot if the bot is not a chat member +chatMember user_id:int32 inviter_user_id:int32 joined_chat_date:int32 status:ChatMemberStatus bot_info:botInfo = ChatMember; + +//@description Contains a list of chat members @total_count Approximate total count of chat members found @members A list of chat members +chatMembers total_count:int32 members:vector = ChatMembers; + + +//@class SupergroupMembersFilter @description Specifies the kind of chat members to return in getSupergroupMembers + +//@description Returns recently active users in reverse chronological order +supergroupMembersFilterRecent = SupergroupMembersFilter; + +//@description Returns the creator and administrators +supergroupMembersFilterAdministrators = SupergroupMembersFilter; + +//@description Used to search for supergroup or channel members via a (string) query @query Query to search for +supergroupMembersFilterSearch query:string = SupergroupMembersFilter; + +//@description Returns restricted supergroup members; can be used only by administrators @query Query to search for +supergroupMembersFilterRestricted query:string = SupergroupMembersFilter; + +//@description Returns users banned from the supergroup or channel; can be used only by administrators @query Query to search for +supergroupMembersFilterBanned query:string = SupergroupMembersFilter; + +//@description Returns bot members of the supergroup or channel +supergroupMembersFilterBots = SupergroupMembersFilter; + + +//@description Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users) +//@id Group identifier +//@member_count Number of members in the group +//@status Status of the current user in the group +//@everyone_is_administrator True, if all members have been granted administrator rights in the group +//@is_active True, if the group is active +//@upgraded_to_supergroup_id Identifier of the supergroup to which this group was upgraded; 0 if none +basicGroup id:int32 member_count:int32 status:ChatMemberStatus everyone_is_administrator:Bool is_active:Bool upgraded_to_supergroup_id:int32 = BasicGroup; + +//@description Contains full information about a basic group @creator_user_id User identifier of the creator of the group; 0 if unknown @members Group members @invite_link Invite link for this group; available only for the group creator and only after it has been generated at least once +basicGroupFullInfo creator_user_id:int32 members:vector invite_link:string = BasicGroupFullInfo; + + +//@description Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers +//@id Supergroup or channel identifier +//@username Username of the supergroup or channel; empty for private supergroups or channels +//@date Point in time (Unix timestamp) when the current user joined, or the point in time when the supergroup or channel was created, in case the user is not a member +//@status Status of the current user in the supergroup or channel +//@member_count Member count; 0 if unknown. Currently it is guaranteed to be known only if the supergroup or channel was found through SearchPublicChats +//@anyone_can_invite True, if any member of the supergroup can invite other members. This field has no meaning for channels +//@sign_messages True, if messages sent to the channel should contain information about the sender. This field is only applicable to channels +//@is_channel True, if the supergroup is a channel +//@is_verified True, if the supergroup or channel is verified +//@restriction_reason If non-empty, contains the reason why access to this supergroup or channel must be restricted. Format of the string is "{type}: {description}". +//-{type} Contains the type of the restriction and at least one of the suffixes "-all", "-ios", "-android", or "-wp", which describe the platforms on which access should be restricted. (For example, "terms-ios-android". {description} contains a human-readable description of the restriction, which can be shown to the user) +supergroup id:int32 username:string date:int32 status:ChatMemberStatus member_count:int32 anyone_can_invite:Bool sign_messages:Bool is_channel:Bool is_verified:Bool restriction_reason:string = Supergroup; + +//@description Contains full information about a supergroup or channel +//@param_description Supergroup or channel description +//@member_count Number of members in the supergroup or channel; 0 if unknown +//@administrator_count Number of privileged users in the supergroup or channel; 0 if unknown +//@restricted_count Number of restricted users in the supergroup; 0 if unknown +//@banned_count Number of users banned from chat; 0 if unknown +//@can_get_members True, if members of the chat can be retrieved +//@can_set_username True, if the chat can be made public +//@can_set_sticker_set True, if the supergroup sticker set can be changed +//@is_all_history_available True, if new chat members will have access to old messages. In public supergroups and both public and private channels, old messages are always available, so this option affects only private supergroups. The value of this field is only available for chat administrators +//@sticker_set_id Identifier of the supergroup sticker set; 0 if none +//@invite_link Invite link for this chat +//@pinned_message_id Identifier of the pinned message in the chat; 0 if none +//@upgraded_from_basic_group_id Identifier of the basic group from which supergroup was upgraded; 0 if none +//@upgraded_from_max_message_id Identifier of the last message in the basic group from which supergroup was upgraded; 0 if none +supergroupFullInfo description:string member_count:int32 administrator_count:int32 restricted_count:int32 banned_count:int32 can_get_members:Bool can_set_username:Bool can_set_sticker_set:Bool is_all_history_available:Bool sticker_set_id:int64 invite_link:string pinned_message_id:int53 upgraded_from_basic_group_id:int32 upgraded_from_max_message_id:int53 = SupergroupFullInfo; + + +//@class SecretChatState @description Describes the current secret chat state + +//@description The secret chat is not yet created; waiting for the other user to get online +secretChatStatePending = SecretChatState; + +//@description The secret chat is ready to use +secretChatStateReady = SecretChatState; + +//@description The secret chat is closed +secretChatStateClosed = SecretChatState; + + +//@description Represents a secret chat +//@id Secret chat identifier +//@user_id Identifier of the chat partner +//@state State of the secret chat +//@is_outbound True, if the chat was created by the current user; otherwise false +//@ttl Current message Time To Live setting (self-destruct timer) for the chat, in seconds +//@key_hash Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 bytes, which must be used to make a 12x12 square image with a color depth of 4. The first 16 bytes should be used to make a central 8x8 square, while the remaining 20 bytes should be used to construct a 2-pixel-wide border around that square. +//-Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers +//@layer Secret chat layer; determines features supported by the other client. Video notes are supported if the layer >= 66 +secretChat id:int32 user_id:int32 state:SecretChatState is_outbound:Bool ttl:int32 key_hash:bytes layer:int32 = SecretChat; + + +//@class MessageForwardInfo @description Contains information about the initial sender of a forwarded message + +//@description The message was originally written by a known user @sender_user_id Identifier of the user that originally sent this message @date Point in time (Unix timestamp) when the message was originally sent +//@forwarded_from_chat_id For messages forwarded to the chat with the current user (saved messages), the identifier of the chat from which the message was forwarded; 0 if unknown +//@forwarded_from_message_id For messages forwarded to the chat with the current user (saved messages) the identifier of the original message from which the new message was forwarded; 0 if unknown +messageForwardedFromUser sender_user_id:int32 date:int32 forwarded_from_chat_id:int53 forwarded_from_message_id:int53 = MessageForwardInfo; + +//@description The message was originally a post in a channel @chat_id Identifier of the chat from which the message was forwarded @author_signature Post author signature +//@date Point in time (Unix timestamp) when the message was originally sent @message_id Message identifier of the original message from which the new message was forwarded; 0 if unknown +//@forwarded_from_chat_id For messages forwarded to the chat with the current user (saved messages), the identifier of the chat from which the message was forwarded; 0 if unknown +//@forwarded_from_message_id For messages forwarded to the chat with the current user (saved messages), the identifier of the original message from which the new message was forwarded; 0 if unknown +messageForwardedPost chat_id:int53 author_signature:string date:int32 message_id:int53 forwarded_from_chat_id:int53 forwarded_from_message_id:int53 = MessageForwardInfo; + + +//@class MessageSendingState @description Contains information about the sending state of the message + +//@description The message is being sent now, but has not yet been delivered to the server +messageSendingStatePending = MessageSendingState; + +//@description The message failed to be sent +messageSendingStateFailed = MessageSendingState; + + +//@description Describes a message +//@id Unique message identifier +//@sender_user_id Identifier of the user who sent the message; 0 if unknown. It is unknown for channel posts +//@chat_id Chat identifier +//@sending_state Information about the sending state of the message; may be null +//@is_outgoing True, if the message is outgoing +//@can_be_edited True, if the message can be edited +//@can_be_forwarded True, if the message can be forwarded +//@can_be_deleted_only_for_self True, if the message can be deleted only for the current user while other users will continue to see it +//@can_be_deleted_for_all_users True, if the message can be deleted for all users +//@is_channel_post True, if the message is a channel post. All messages to channels are channel posts, all other messages are not channel posts +//@contains_unread_mention True, if the message contains an unread mention for the current user +//@date Point in time (Unix timestamp) when the message was sent +//@edit_date Point in time (Unix timestamp) when the message was last edited +//@forward_info Information about the initial message sender; may be null +//@reply_to_message_id If non-zero, the identifier of the message this message is replying to; can be the identifier of a deleted message +//@ttl For self-destructing messages, the message's TTL (Time To Live), in seconds; 0 if none. TDLib will send updateDeleteMessages or updateMessageContent once the TTL expires +//@ttl_expires_in Time left before the message expires, in seconds +//@via_bot_user_id If non-zero, the user identifier of the bot through which this message was sent +//@author_signature For channel posts, optional author signature +//@views Number of times this message was viewed +//@media_album_id Unique identifier of an album this message belongs to. Only photos and videos can be grouped together in albums +//@content Content of the message +//@reply_markup Reply markup for the message; may be null +message id:int53 sender_user_id:int32 chat_id:int53 sending_state:MessageSendingState is_outgoing:Bool can_be_edited:Bool can_be_forwarded:Bool can_be_deleted_only_for_self:Bool can_be_deleted_for_all_users:Bool is_channel_post:Bool contains_unread_mention:Bool date:int32 edit_date:int32 forward_info:MessageForwardInfo reply_to_message_id:int53 ttl:int32 ttl_expires_in:double via_bot_user_id:int32 author_signature:string views:int32 media_album_id:int64 content:MessageContent reply_markup:ReplyMarkup = Message; + +//@description Contains a list of messages @total_count Approximate total count of messages found @messages List of messages; messages may be null +messages total_count:int32 messages:vector = Messages; + +//@description Contains a list of messages found by a search @messages List of messages @next_from_search_id Value to pass as from_search_id to get more results +foundMessages messages:vector next_from_search_id:int64 = FoundMessages; + + +//@class NotificationSettingsScope @description Describes the types of chats for which notification settings are applied + +//@description Notification settings applied to a particular chat @chat_id Chat identifier +notificationSettingsScopeChat chat_id:int53 = NotificationSettingsScope; + +//@description Notification settings applied to all private chats +notificationSettingsScopePrivateChats = NotificationSettingsScope; + +//@description Notification settings applied to all basic groups and channels. (Supergroups have no common settings) +notificationSettingsScopeBasicGroupChats = NotificationSettingsScope; + +//@description Notification settings applied to all chats +notificationSettingsScopeAllChats = NotificationSettingsScope; + + +//@description Contains information about notification settings for a chat or several chats @mute_for Time left before notifications will be unmuted, in seconds @sound An audio file name for notification sounds; only applies to iOS applications @show_preview True, if message content should be displayed in notifications +notificationSettings mute_for:int32 sound:string show_preview:Bool = NotificationSettings; + + +//@description Contains information about a message draft @reply_to_message_id Identifier of the message to reply to; 0 if none @input_message_text Content of the message draft; this should always be of type inputMessageText +draftMessage reply_to_message_id:int53 input_message_text:InputMessageContent = DraftMessage; + + +//@class ChatType @description Describes the type of a chat + +//@description An ordinary chat with a user @user_id User identifier +chatTypePrivate user_id:int32 = ChatType; + +//@description A basic group (i.e., a chat with 0-200 other users) @basic_group_id Basic group identifier +chatTypeBasicGroup basic_group_id:int32 = ChatType; + +//@description A supergroup (i.e. a chat with up to GetOption("supergroup_max_size") other users), or channel (with unlimited members) @supergroup_id Supergroup or channel identifier @is_channel True, if the supergroup is a channel +chatTypeSupergroup supergroup_id:int32 is_channel:Bool = ChatType; + +//@description A secret chat with a user @secret_chat_id Secret chat identifier @user_id User identifier of the secret chat peer +chatTypeSecret secret_chat_id:int32 user_id:int32 = ChatType; + + +//@description A chat. (Can be a private chat, basic group, supergroup, or secret chat) +//@id Chat unique identifier +//@type Type of the chat +//@title Chat title +//@photo Chat photo; may be null +//@last_message Last message in the chat; may be null +//@order Descending parameter by which chats are sorted in the main chat list. If the order number of two chats is the same, they must be sorted in descending order by ID. If 0, the position of the chat in the list is undetermined +//@is_pinned True, if the chat is pinned +//@can_be_reported True, if the chat can be reported to Telegram moderators through reportChat +//@unread_count Number of unread messages in the chat +//@last_read_inbox_message_id Identifier of the last read incoming message +//@last_read_outbox_message_id Identifier of the last read outgoing message +//@unread_mention_count Number of unread messages with a mention/reply in the chat +//@notification_settings Notification settings for this chat +//@reply_markup_message_id Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat +//@draft_message A draft of a message in the chat; may be null +//@client_data Contains client-specific data associated with the chat. (For example, the chat position or local chat notification settings can be stored here.) Persistent if a message database is used +chat id:int53 type:ChatType title:string photo:chatPhoto last_message:message order:int64 is_pinned:Bool can_be_reported:Bool unread_count:int32 last_read_inbox_message_id:int53 last_read_outbox_message_id:int53 unread_mention_count:int32 notification_settings:notificationSettings reply_markup_message_id:int53 draft_message:draftMessage client_data:string = Chat; + +//@description Represents a list of chats @chat_ids List of chat identifiers +chats chat_ids:vector = Chats; + + +//@description Contains a chat invite link @invite_link Chat invite link +chatInviteLink invite_link:string = ChatInviteLink; + +//@description Contains information about a chat invite link +//@chat_id Chat identifier of the invite link; 0 if the user is not a member of this chat +//@type Contains information about the type of the chat +//@title Title of the chat +//@photo Chat photo; may be null +//@member_count Number of members +//@member_user_ids User identifiers of some chat members that may be known to the current user +//@is_public True, if the chat is a public supergroup or channel with a username +chatInviteLinkInfo chat_id:int53 type:ChatType title:string photo:chatPhoto member_count:int32 member_user_ids:vector is_public:Bool = ChatInviteLinkInfo; + + +//@class KeyboardButtonType @description Describes a keyboard button type + +//@description A simple button, with text that should be sent when the button is pressed +keyboardButtonTypeText = KeyboardButtonType; + +//@description A button that sends the user's phone number when pressed; available only in private chats +keyboardButtonTypeRequestPhoneNumber = KeyboardButtonType; + +//@description A button that sends the user's location when pressed; available only in private chats +keyboardButtonTypeRequestLocation = KeyboardButtonType; + + +//@description Represents a single button in a bot keyboard @text Text of the button @type Type of the button +keyboardButton text:string type:KeyboardButtonType = KeyboardButton; + + +//@class InlineKeyboardButtonType @description Describes the type of an inline keyboard button + +//@description A button that opens a specified URL @url URL to open +inlineKeyboardButtonTypeUrl url:string = InlineKeyboardButtonType; + +//@description A button that sends a special callback query to a bot @data Data to be sent to the bot via a callback query +inlineKeyboardButtonTypeCallback data:bytes = InlineKeyboardButtonType; + +//@description A button with a game that sends a special callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame +inlineKeyboardButtonTypeCallbackGame = InlineKeyboardButtonType; + +//@description A button that forces an inline query to the bot to be inserted in the input field @query Inline query to be sent to the bot @in_current_chat True, if the inline query should be sent from the current chat +inlineKeyboardButtonTypeSwitchInline query:string in_current_chat:Bool = InlineKeyboardButtonType; + +//@description A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice +inlineKeyboardButtonTypeBuy = InlineKeyboardButtonType; + + +//@description Represents a single button in an inline keyboard @text Text of the button @type Type of the button +inlineKeyboardButton text:string type:InlineKeyboardButtonType = InlineKeyboardButton; + + +//@class ReplyMarkup @description Contains a description of a custom keyboard and actions that can be done with it to quickly reply to bots + +//@description Instructs clients to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, UpdateChatReplyMarkup with message_id == 0 will be sent +//@is_personal True, if the keyboard is removed only for the mentioned users or the target user of a reply +replyMarkupRemoveKeyboard is_personal:Bool = ReplyMarkup; + +//@description Instructs clients to force a reply to this message +//@is_personal True, if a forced reply must automatically be shown to the current user. For outgoing messages, specify true to show the forced reply only for the mentioned users and for the target user of a reply +replyMarkupForceReply is_personal:Bool = ReplyMarkup; + +//@description Contains a custom keyboard layout to quickly reply to bots +//@rows A list of rows of bot keyboard buttons +//@resize_keyboard True, if the client needs to resize the keyboard vertically +//@one_time True, if the client needs to hide the keyboard after use +//@is_personal True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply +replyMarkupShowKeyboard rows:vector> resize_keyboard:Bool one_time:Bool is_personal:Bool = ReplyMarkup; + +//@description Contains an inline keyboard layout +//@rows A list of rows of inline keyboard buttons +replyMarkupInlineKeyboard rows:vector> = ReplyMarkup; + + +//@class RichText @description Describes a text object inside an instant-view web page + +//@description A plain text @text Text +richTextPlain text:string = RichText; + +//@description A bold rich text @text Text +richTextBold text:RichText = RichText; + +//@description An italicized rich text @text Text +richTextItalic text:RichText = RichText; + +//@description An underlined rich text @text Text +richTextUnderline text:RichText = RichText; + +//@description A strike-through rich text @text Text +richTextStrikethrough text:RichText = RichText; + +//@description A fixed-width rich text @text Text +richTextFixed text:RichText = RichText; + +//@description A rich text URL link @text Text @url URL +richTextUrl text:RichText url:string = RichText; + +//@description A rich text email link @text Text @email_address Email address +richTextEmailAddress text:RichText email_address:string = RichText; + +//@description A concatenation of rich texts @texts Texts +richTexts texts:vector = RichText; + + +//@class PageBlock @description Describes a block of an instant view web page + +//@description The title of a page @title Title +pageBlockTitle title:RichText = PageBlock; + +//@description The subtitle of a page @subtitle Subtitle +pageBlockSubtitle subtitle:RichText = PageBlock; + +//@description The author and publishing date of a page @author Author @publish_date Point in time (Unix timestamp) when the article was published; 0 if unknown +pageBlockAuthorDate author:RichText publish_date:int32 = PageBlock; + +//@description A header @header Header +pageBlockHeader header:RichText = PageBlock; + +//@description A subheader @subheader Subheader +pageBlockSubheader subheader:RichText = PageBlock; + +//@description A text paragraph @text Paragraph text +pageBlockParagraph text:RichText = PageBlock; + +//@description A preformatted text paragraph @text Paragraph text @language Programming language for which the text should be formatted +pageBlockPreformatted text:RichText language:string = PageBlock; + +//@description The footer of a page @footer Footer +pageBlockFooter footer:RichText = PageBlock; + +//@description An empty block separating a page +pageBlockDivider = PageBlock; + +//@description An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor @name Name of the anchor +pageBlockAnchor name:string = PageBlock; + +//@description A list of texts @items Texts @is_ordered True, if the items should be marked with numbers +pageBlockList items:vector is_ordered:Bool = PageBlock; + +//@description A block quote @text Quote text @caption Quote caption +pageBlockBlockQuote text:RichText caption:RichText = PageBlock; + +//@description A pull quote @text Quote text @caption Quote caption +pageBlockPullQuote text:RichText caption:RichText = PageBlock; + +//@description An animation @animation Animation file; may be null @caption Animation caption @need_autoplay True, if the animation should be played automatically +pageBlockAnimation animation:animation caption:RichText need_autoplay:Bool = PageBlock; + +//@description An audio file @audio Audio file; may be null @caption Audio file caption +pageBlockAudio audio:audio caption:RichText = PageBlock; + +//@description A photo @photo Photo file; may be null @caption Photo caption +pageBlockPhoto photo:photo caption:RichText = PageBlock; + +//@description A video @video Video file; may be null @caption Video caption @need_autoplay True, if the video should be played automatically @is_looped True, if the video should be looped +pageBlockVideo video:video caption:RichText need_autoplay:Bool is_looped:Bool = PageBlock; + +//@description A page cover @cover Cover +pageBlockCover cover:PageBlock = PageBlock; + +//@description An embedded web page @url Web page URL, if available @html HTML-markup of the embedded page @poster_photo Poster photo, if available; may be null @width Block width @height Block height @caption Block caption @is_full_width True, if the block should be full width @allow_scrolling True, if scrolling should be allowed +pageBlockEmbedded url:string html:string poster_photo:photo width:int32 height:int32 caption:RichText is_full_width:Bool allow_scrolling:Bool = PageBlock; + +//@description An embedded post @url Web page URL @author Post author @author_photo Post author photo @date Point in time (Unix timestamp) when the post was created; 0 if unknown @page_blocks Post content @caption Post caption +pageBlockEmbeddedPost url:string author:string author_photo:photo date:int32 page_blocks:vector caption:RichText = PageBlock; + +//@description A collage @page_blocks Collage item contents @caption Block caption +pageBlockCollage page_blocks:vector caption:RichText = PageBlock; + +//@description A slideshow @page_blocks Slideshow item contents @caption Block caption +pageBlockSlideshow page_blocks:vector caption:RichText = PageBlock; + +//@description A link to a chat @title Chat title @photo Chat photo; may be null @username Chat username, by which all other information about the chat should be resolved +pageBlockChatLink title:string photo:chatPhoto username:string = PageBlock; + + +//@description Describes an instant view page for a web page @page_blocks Content of the web page @is_full True, if the instant view contains the full page. A network request might be needed to get the full web page instant view +webPageInstantView page_blocks:vector is_full:Bool = WebPageInstantView; + + +//@description Describes a web page preview @url Original URL of the link @display_url URL to display +//@type Type of the web page. Can be: article, photo, audio, video, document, profile, app, or something else +//@site_name Short name of the site (e.g., Google Docs, App Store) @title Title of the content @param_description Description of the content +//@photo Image representing the content; may be null +//@embed_url URL to show in the embedded preview +//@embed_type MIME type of the embedded preview, (e.g., text/html or video/mp4) +//@embed_width Width of the embedded preview +//@embed_height Height of the embedded preview +//@duration Duration of the content, in seconds +//@author Author of the content +//@animation Preview of the content as an animation, if available; may be null +//@audio Preview of the content as an audio file, if available; may be null +//@document Preview of the content as a document, if available (currently only available for small PDF files and ZIP archives); may be null +//@sticker Preview of the content as a sticker for small WEBP files, if available; may be null +//@video Preview of the content as a video, if available; may be null +//@video_note Preview of the content as a video note, if available; may be null +//@voice_note Preview of the content as a voice note, if available; may be null +//@has_instant_view True, if the web page has an instant view +webPage url:string display_url:string type:string site_name:string title:string description:string photo:photo embed_url:string embed_type:string embed_width:int32 embed_height:int32 duration:int32 author:string animation:animation audio:audio document:document sticker:sticker video:video video_note:videoNote voice_note:voiceNote has_instant_view:Bool = WebPage; + + +//@description Portion of the price of a product (e.g., "delivery cost", "tax amount") @label Label for this portion of the product price @amount Currency amount in minimal quantity of the currency +labeledPricePart label:string amount:int53 = LabeledPricePart; + +//@description Product invoice @currency ISO 4217 currency code @price_parts A list of objects used to calculate the total price of the product @is_test True, if the payment is a test payment +//@need_name True, if the user's name is needed for payment @need_phone_number True, if the user's phone number is needed for payment @need_email_address True, if the user's email address is needed for payment +//@need_shipping_address True, if the user's shipping address is needed for payment @send_phone_number_to_provider True, if the user's phone number will be sent to the provider +//@send_email_address_to_provider True, if the user's email address will be sent to the provider @is_flexible True, if the total price depends on the shipping method +invoice currency:string price_parts:vector is_test:Bool need_name:Bool need_phone_number:Bool need_email_address:Bool need_shipping_address:Bool send_phone_number_to_provider:Bool send_email_address_to_provider:Bool is_flexible:Bool = Invoice; + +//@description Describes a shipping address @country_code Two-letter ISO 3166-1 alpha-2 country code @state State, if applicable @city City @street_line1 First line of the address @street_line2 Second line of the address @postal_code Address postal code +shippingAddress country_code:string state:string city:string street_line1:string street_line2:string postal_code:string = ShippingAddress; + +//@description Order information @name Name of the user @phone_number Phone number of the user @email_address Email address of the user @shipping_address Shipping address for this order; may be null +orderInfo name:string phone_number:string email_address:string shipping_address:shippingAddress = OrderInfo; + +//@description One shipping option @id Shipping option identifier @title Option title @price_parts A list of objects used to calculate the total shipping costs +shippingOption id:string title:string price_parts:vector = ShippingOption; + +//@description Contains information about saved card credentials @id Unique identifier of the saved credentials @title Title of the saved credentials +savedCredentials id:string title:string = SavedCredentials; + +//@class InputCredentials @description Contains information about the payment method chosen by the user + +//@description Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password @saved_credentials_id Identifier of the saved credentials +inputCredentialsSaved saved_credentials_id:string = InputCredentials; + +//@description Applies if a user enters new credentials on a payment provider website @data Contains JSON-encoded data with a credential identifier from the payment provider @allow_save True, if the credential identifier can be saved on the server side +inputCredentialsNew data:string allow_save:Bool = InputCredentials; + +//@description Applies if a user enters new credentials using Android Pay @data JSON-encoded data with the credential identifier +inputCredentialsAndroidPay data:string = InputCredentials; + +//@description Applies if a user enters new credentials using Apple Pay @data JSON-encoded data with the credential identifier +inputCredentialsApplePay data:string = InputCredentials; + +//@description Stripe payment provider @publishable_key Stripe API publishable key @need_country True, if the user country must be provided @need_postal_code True, if the user ZIP/postal code must be provided @need_cardholder_name True, if the cardholder name must be provided +paymentsProviderStripe publishable_key:string need_country:Bool need_postal_code:Bool need_cardholder_name:Bool = PaymentsProviderStripe; + +//@description Contains information about an invoice payment form @invoice Full information of the invoice @url Payment form URL @payments_provider Contains information about the payment provider, if available, to support it natively without the need for opening the URL; may be null +//@saved_order_info Saved server-side order information; may be null @saved_credentials Contains information about saved card credentials; may be null @can_save_credentials True, if the user can choose to save credentials @need_password True, if the user will be able to save credentials protected by a password they set up +paymentForm invoice:invoice url:string payments_provider:paymentsProviderStripe saved_order_info:orderInfo saved_credentials:savedCredentials can_save_credentials:Bool need_password:Bool = PaymentForm; + +//@description Contains a temporary identifier of validated order information, which is stored for one hour. Also contains the available shipping options @order_info_id Temporary identifier of the order information @shipping_options Available shipping options +validatedOrderInfo order_info_id:string shipping_options:vector = ValidatedOrderInfo; + +//@description Contains the result of a payment request @success True, if the payment request was successful; otherwise the verification_url will be not empty @verification_url URL for additional payment credentials verification +paymentResult success:Bool verification_url:string = PaymentResult; + +//@description Contains information about a successful payment @date Point in time (Unix timestamp) when the payment was made @payments_provider_user_id User identifier of the payment provider bot @invoice Contains information about the invoice +//@order_info Contains order information; may be null @shipping_option Chosen shipping option; may be null @credentials_title Title of the saved credentials +paymentReceipt date:int32 payments_provider_user_id:int32 invoice:invoice order_info:orderInfo shipping_option:shippingOption credentials_title:string = PaymentReceipt; + + +//@class MessageContent @description Contains the content of a message + +//@description A text message @text Text of the message @web_page A preview of the web page that's mentioned in the text; may be null +messageText text:formattedText web_page:webPage = MessageContent; + +//@description An animation message (GIF-style). @animation Message content @caption Animation caption @is_secret True, if the animation thumbnail must be blurred and the animation must be shown only while tapped +messageAnimation animation:animation caption:formattedText is_secret:Bool = MessageContent; + +//@description An audio message @audio Message content @caption Audio caption +messageAudio audio:audio caption:formattedText = MessageContent; + +//@description A document message (general file) @document Message content @caption Document caption +messageDocument document:document caption:formattedText = MessageContent; + +//@description A photo message @photo Message content @caption Photo caption @is_secret True, if the photo must be blurred and must be shown only while tapped +messagePhoto photo:photo caption:formattedText is_secret:Bool = MessageContent; + +//@description An expired photo message (self-destructed after TTL has elapsed) +messageExpiredPhoto = MessageContent; + +//@description A sticker message @sticker Message content +messageSticker sticker:sticker = MessageContent; + +//@description A video message @video Message content @caption Video caption @is_secret True, if the video thumbnail must be blurred and the video must be shown only while tapped +messageVideo video:video caption:formattedText is_secret:Bool = MessageContent; + +//@description An expired video message (self-destructed after TTL has elapsed) +messageExpiredVideo = MessageContent; + +//@description A video note message @video_note Message content @is_viewed True, if at least one of the recipients has viewed the video note @is_secret True, if the video note thumbnail must be blurred and the video note must be shown only while tapped +messageVideoNote video_note:videoNote is_viewed:Bool is_secret:Bool = MessageContent; + +//@description A voice note message @voice_note Message content @caption Voice note caption @is_listened True, if at least one of the recipients has listened to the voice note +messageVoiceNote voice_note:voiceNote caption:formattedText is_listened:Bool = MessageContent; + +//@description A message with a location @location Message content @live_period Time relative to the message sent date until which the location can be updated, in seconds +//@expires_in Left time for which the location can be updated, in seconds. updateMessageContent is not sent when this field changes +messageLocation location:location live_period:int32 expires_in:int32 = MessageContent; + +//@description A message with information about a venue @venue Message content +messageVenue venue:venue = MessageContent; + +//@description A message with a user contact @contact Message content +messageContact contact:contact = MessageContent; + +//@description A message with a game @game Game +messageGame game:game = MessageContent; + +//@description A message with an invoice from a bot @title Product title @param_description Product description @photo Product photo; may be null @currency Currency for the product price @total_amount Product total price in the minimal quantity of the currency +//@start_parameter Unique invoice bot start_parameter. To share an invoice use the URL https://t.me/{bot_username}?start={start_parameter} @is_test True, if the invoice is a test invoice +//@need_shipping_address True, if the shipping address should be specified @receipt_message_id The identifier of the message with the receipt, after the product has been purchased +messageInvoice title:string description:string photo:photo currency:string total_amount:int53 start_parameter:string is_test:Bool need_shipping_address:Bool receipt_message_id:int53 = MessageContent; + +//@description A message with information about an ended call @discard_reason Reason why the call was discarded @duration Call duration, in seconds +messageCall discard_reason:CallDiscardReason duration:int32 = MessageContent; + +//@description A newly created basic group @title Title of the basic group @member_user_ids User identifiers of members in the basic group +messageBasicGroupChatCreate title:string member_user_ids:vector = MessageContent; + +//@description A newly created supergroup or channel @title Title of the supergroup or channel +messageSupergroupChatCreate title:string = MessageContent; + +//@description An updated chat title @title New chat title +messageChatChangeTitle title:string = MessageContent; + +//@description An updated chat photo @photo New chat photo +messageChatChangePhoto photo:photo = MessageContent; + +//@description A deleted chat photo +messageChatDeletePhoto = MessageContent; + +//@description New chat members were added @member_user_ids User identifiers of the new members +messageChatAddMembers member_user_ids:vector = MessageContent; + +//@description A new member joined the chat by invite link +messageChatJoinByLink = MessageContent; + +//@description A chat member was deleted @user_id User identifier of the deleted chat member +messageChatDeleteMember user_id:int32 = MessageContent; + +//@description A basic group was upgraded to a supergroup and was deactivated as the result @supergroup_id Identifier of the supergroup to which the basic group was upgraded +messageChatUpgradeTo supergroup_id:int32 = MessageContent; + +//@description A supergroup has been created from a basic group @title Title of the newly created supergroup @basic_group_id The identifier of the original basic group +messageChatUpgradeFrom title:string basic_group_id:int32 = MessageContent; + +//@description A message has been pinned @message_id Identifier of the pinned message, can be an identifier of a deleted message +messagePinMessage message_id:int53 = MessageContent; + +//@description A screenshot of a message in the chat has been taken +messageScreenshotTaken = MessageContent; + +//@description The TTL (Time To Live) setting messages in a secret chat has been changed @ttl New TTL +messageChatSetTtl ttl:int32 = MessageContent; + +//@description A non-standard action has happened in the chat @text Message text to be shown in the chat +messageCustomServiceAction text:string = MessageContent; + +//@description A new high score was achieved in a game @game_message_id Identifier of the message with the game, can be an identifier of a deleted message @game_id Identifier of the game, may be different from the games presented in the message with the game @score New score +messageGameScore game_message_id:int53 game_id:int64 score:int32 = MessageContent; + +//@description A payment has been completed @invoice_message_id Identifier of the message with the corresponding invoice; can be an identifier of a deleted message @currency Currency for the price of the product @total_amount Total price for the product, in the minimal quantity of the currency +messagePaymentSuccessful invoice_message_id:int53 currency:string total_amount:int53 = MessageContent; + +//@description A payment has been completed; for bots only @invoice_message_id Identifier of the message with the corresponding invoice; can be an identifier of a deleted message @currency Currency for price of the product +//@total_amount Total price for the product, in the minimal quantity of the currency @invoice_payload Invoice payload @shipping_option_id Identifier of the shipping option chosen by the user, may be empty if not applicable @order_info Information about the order; may be null +//@telegram_payment_charge_id Telegram payment identifier @provider_payment_charge_id Provider payment identifier +messagePaymentSuccessfulBot invoice_message_id:int53 currency:string total_amount:int53 invoice_payload:bytes shipping_option_id:string order_info:orderInfo telegram_payment_charge_id:string provider_payment_charge_id:string = MessageContent; + +//@description A contact has registered with Telegram +messageContactRegistered = MessageContent; + +//@description The current user has connected a website by logging in using Telegram Login Widget on it @domain_name Domain name of the connected website +messageWebsiteConnected domain_name:string = MessageContent; + +//@description Message content that is not supported by the client +messageUnsupported = MessageContent; + + +//@class TextEntityType @description Represents a part of the text which must be formatted differently + +//@description A mention of a user by their username +textEntityTypeMention = TextEntityType; + +//@description A hashtag text, beginning with "#" +textEntityTypeHashtag = TextEntityType; + +//@description A cashtag text, beginning with "$" and consisting of capital english letters (i.e. "$USD") +textEntityTypeCashtag = TextEntityType; + +//@description A bot command, beginning with "/". This shouldn't be highlighted if there are no bots in the chat +textEntityTypeBotCommand = TextEntityType; + +//@description An HTTP URL +textEntityTypeUrl = TextEntityType; + +//@description An email address +textEntityTypeEmailAddress = TextEntityType; + +//@description A bold text +textEntityTypeBold = TextEntityType; + +//@description An italic text +textEntityTypeItalic = TextEntityType; + +//@description Text that must be formatted as if inside a code HTML tag +textEntityTypeCode = TextEntityType; + +//@description Text that must be formatted as if inside a pre HTML tag +textEntityTypePre = TextEntityType; + +//@description Text that must be formatted as if inside pre, and code HTML tags @language Programming language of the code; as defined by the sender +textEntityTypePreCode language:string = TextEntityType; + +//@description A text description shown instead of a raw URL @url URL to be opened when the link is clicked +textEntityTypeTextUrl url:string = TextEntityType; + +//@description A text shows instead of a raw mention of the user (e.g., when the user has no username) @user_id Identifier of the mentioned user +textEntityTypeMentionName user_id:int32 = TextEntityType; + +//@description A phone number +textEntityTypePhoneNumber = TextEntityType; + + +//@description A thumbnail to be sent along with a file; should be in JPEG or WEBP format for stickers, and less than 200 kB in size @thumbnail Thumbnail file to send. Sending thumbnails by file_id is currently not supported +//@width Thumbnail width, usually shouldn't exceed 90. Use 0 if unknown @height Thumbnail height, usually shouldn't exceed 90. Use 0 if unknown +inputThumbnail thumbnail:InputFile width:int32 height:int32 = InputThumbnail; + + +//@class InputMessageContent @description The content of a message to send + +//@description A text message @text Formatted text to be sent. Only Bold, Italic, Code, Pre, PreCode and TextUrl entities are allowed to be specified manually +//@disable_web_page_preview True, if rich web page previews for URLs in the message text should be disabled @clear_draft True, if a chat message draft should be deleted +inputMessageText text:formattedText disable_web_page_preview:Bool clear_draft:Bool = InputMessageContent; + +//@description An animation message (GIF-style). @animation Animation file to be sent @thumbnail Animation thumbnail, if available @duration Duration of the animation, in seconds @width Width of the animation; may be replaced by the server @height Height of the animation; may be replaced by the server @caption Animation caption; 0-200 characters +inputMessageAnimation animation:InputFile thumbnail:inputThumbnail duration:int32 width:int32 height:int32 caption:formattedText = InputMessageContent; + +//@description An audio message @audio Audio file to be sent @album_cover_thumbnail Thumbnail of the cover for the album, if available @duration Duration of the audio, in seconds; may be replaced by the server @title Title of the audio; 0-64 characters; may be replaced by the server +//@performer Performer of the audio; 0-64 characters, may be replaced by the server @caption Audio caption; 0-200 characters +inputMessageAudio audio:InputFile album_cover_thumbnail:inputThumbnail duration:int32 title:string performer:string caption:formattedText = InputMessageContent; + +//@description A document message (general file) @document Document to be sent @thumbnail Document thumbnail, if available @caption Document caption; 0-200 characters +inputMessageDocument document:InputFile thumbnail:inputThumbnail caption:formattedText = InputMessageContent; + +//@description A photo message @photo Photo to send @thumbnail Photo thumbnail to be sent, this is sent to the other party in secret chats only @added_sticker_file_ids File identifiers of the stickers added to the photo, if applicable @width Photo width @height Photo height @caption Photo caption; 0-200 characters +//@ttl Photo TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats +inputMessagePhoto photo:InputFile thumbnail:inputThumbnail added_sticker_file_ids:vector width:int32 height:int32 caption:formattedText ttl:int32 = InputMessageContent; + +//@description A sticker message @sticker Sticker to be sent @thumbnail Sticker thumbnail, if available @width Sticker width @height Sticker height +inputMessageSticker sticker:InputFile thumbnail:inputThumbnail width:int32 height:int32 = InputMessageContent; + +//@description A video message @video Video to be sent @thumbnail Video thumbnail, if available @added_sticker_file_ids File identifiers of the stickers added to the video, if applicable +//@duration Duration of the video, in seconds @width Video width @height Video height @supports_streaming True, if the video should be tried to be streamed +//@caption Video caption; 0-200 characters @ttl Video TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats +inputMessageVideo video:InputFile thumbnail:inputThumbnail added_sticker_file_ids:vector duration:int32 width:int32 height:int32 supports_streaming:Bool caption:formattedText ttl:int32 = InputMessageContent; + +//@description A video note message @video_note Video note to be sent @thumbnail Video thumbnail, if available @duration Duration of the video, in seconds @length Video width and height; must be positive and not greater than 640 +inputMessageVideoNote video_note:InputFile thumbnail:inputThumbnail duration:int32 length:int32 = InputMessageContent; + +//@description A voice note message @voice_note Voice note to be sent @duration Duration of the voice note, in seconds @waveform Waveform representation of the voice note, in 5-bit format @caption Voice note caption; 0-200 characters +inputMessageVoiceNote voice_note:InputFile duration:int32 waveform:bytes caption:formattedText = InputMessageContent; + +//@description A message with a location @location Location to be sent @live_period Period for which the location can be updated, in seconds; should bebetween 60 and 86400 for a live location and 0 otherwise +inputMessageLocation location:location live_period:int32 = InputMessageContent; + +//@description A message with information about a venue @venue Venue to send +inputMessageVenue venue:venue = InputMessageContent; + +//@description A message containing a user contact @contact Contact to send +inputMessageContact contact:contact = InputMessageContent; + +//@description A message with a game; not supported for channels or secret chats @bot_user_id User identifier of the bot that owns the game @game_short_name Short name of the game +inputMessageGame bot_user_id:int32 game_short_name:string = InputMessageContent; + +//@description A message with an invoice; can be used only by bots and only in private chats @invoice Invoice @title Product title; 1-32 characters @param_description Product description; 0-255 characters @photo_url Product photo URL; optional @photo_size Product photo size @photo_width Product photo width @photo_height Product photo height +//@payload The invoice payload @provider_token Payment provider token @provider_data JSON-encoded data about the invoice, which will be shared with the payment provider @start_parameter Unique invoice bot start_parameter for the generation of this invoice +inputMessageInvoice invoice:invoice title:string description:string photo_url:string photo_size:int32 photo_width:int32 photo_height:int32 payload:bytes provider_token:string provider_data:string start_parameter:string = InputMessageContent; + +//@description A forwarded message @from_chat_id Identifier for the chat this forwarded message came from @message_id Identifier of the message to forward @in_game_share True, if a game message should be shared within a launched game; applies only to game messages +inputMessageForwarded from_chat_id:int53 message_id:int53 in_game_share:Bool = InputMessageContent; + + +//@class SearchMessagesFilter @description Represents a filter for message search results + +//@description Returns all found messages, no filter is applied +searchMessagesFilterEmpty = SearchMessagesFilter; + +//@description Returns only animation messages +searchMessagesFilterAnimation = SearchMessagesFilter; + +//@description Returns only audio messages +searchMessagesFilterAudio = SearchMessagesFilter; + +//@description Returns only document messages +searchMessagesFilterDocument = SearchMessagesFilter; + +//@description Returns only photo messages +searchMessagesFilterPhoto = SearchMessagesFilter; + +//@description Returns only video messages +searchMessagesFilterVideo = SearchMessagesFilter; + +//@description Returns only voice note messages +searchMessagesFilterVoiceNote = SearchMessagesFilter; + +//@description Returns only photo and video messages +searchMessagesFilterPhotoAndVideo = SearchMessagesFilter; + +//@description Returns only messages containing URLs +searchMessagesFilterUrl = SearchMessagesFilter; + +//@description Returns only messages containing chat photos +searchMessagesFilterChatPhoto = SearchMessagesFilter; + +//@description Returns only call messages +searchMessagesFilterCall = SearchMessagesFilter; + +//@description Returns only incoming call messages with missed/declined discard reasons +searchMessagesFilterMissedCall = SearchMessagesFilter; + +//@description Returns only video note messages +searchMessagesFilterVideoNote = SearchMessagesFilter; + +//@description Returns only voice and video note messages +searchMessagesFilterVoiceAndVideoNote = SearchMessagesFilter; + +//@description Returns only messages with mentions of the current user, or messages that are replies to their messages +searchMessagesFilterMention = SearchMessagesFilter; + +//@description Returns only messages with unread mentions of the current user or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query or by the sending user +searchMessagesFilterUnreadMention = SearchMessagesFilter; + + +//@class ChatAction @description Describes the different types of activity in a chat + +//@description The user is typing a message +chatActionTyping = ChatAction; +//@description The user is recording a video +chatActionRecordingVideo = ChatAction; +//@description The user is uploading a video @progress Upload progress, as a percentage +chatActionUploadingVideo progress:int32 = ChatAction; +//@description The user is recording a voice note +chatActionRecordingVoiceNote = ChatAction; +//@description The user is uploading a voice note @progress Upload progress, as a percentage +chatActionUploadingVoiceNote progress:int32 = ChatAction; +//@description The user is uploading a photo @progress Upload progress, as a percentage +chatActionUploadingPhoto progress:int32 = ChatAction; +//@description The user is uploading a document @progress Upload progress, as a percentage +chatActionUploadingDocument progress:int32 = ChatAction; +//@description The user is picking a location or venue to send +chatActionChoosingLocation = ChatAction; +//@description The user is picking a contact to send +chatActionChoosingContact = ChatAction; +//@description The user has started to play a game +chatActionStartPlayingGame = ChatAction; +//@description The user is recording a video note +chatActionRecordingVideoNote = ChatAction; +//@description The user is uploading a video note @progress Upload progress, as a percentage +chatActionUploadingVideoNote progress:int32 = ChatAction; +//@description The user has cancelled the previous action +chatActionCancel = ChatAction; + + +//@class UserStatus @description Describes the last time the user was online + +//@description The user status was never changed +userStatusEmpty = UserStatus; + +//@description The user is online @expires Point in time (Unix timestamp) when the user's online status will expire +userStatusOnline expires:int32 = UserStatus; + +//@description The user is offline @was_online Point in time (Unix timestamp) when the user was last online +userStatusOffline was_online:int32 = UserStatus; + +//@description The user was online recently +userStatusRecently = UserStatus; + +//@description The user is offline, but was online last week +userStatusLastWeek = UserStatus; + +//@description The user is offline, but was online last month +userStatusLastMonth = UserStatus; + + +//@description Represents a list of stickers @stickers List of stickers +stickers stickers:vector = Stickers; + +//@description Represents a list of all emoji corresponding to a sticker in a sticker set. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object @emojis List of emojis +stickerEmojis emojis:vector = StickerEmojis; + +//@description Represents a sticker set @id Identifier of the sticker set @title Title of the sticker set @name Name of the sticker set @is_installed True, if the sticker set has been installed by the current user +//@is_archived True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously @is_official True, if the sticker set is official @is_masks True, if the stickers in the set are masks +//@is_viewed True for already viewed trending sticker sets @stickers List of stickers in this set @emojis A list of emoji corresponding to the stickers in the same order +stickerSet id:int64 title:string name:string is_installed:Bool is_archived:Bool is_official:Bool is_masks:Bool is_viewed:Bool stickers:vector emojis:vector = StickerSet; + +//@description Represents short information about a sticker set @id Identifier of the sticker set @title Title of the sticker set @name Name of the sticker set @is_installed True, if the sticker set has been installed by current user +//@is_archived True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously @is_official True, if the sticker set is official @is_masks True, if the stickers in the set are masks +//@is_viewed True for already viewed trending sticker sets @size Total number of stickers in the set @covers Contains up to the first 5 stickers from the set, depending on the context. If the client needs more stickers the full set should be requested +stickerSetInfo id:int64 title:string name:string is_installed:Bool is_archived:Bool is_official:Bool is_masks:Bool is_viewed:Bool size:int32 covers:vector = StickerSetInfo; + +//@description Represents a list of sticker sets @total_count Approximate total number of sticker sets found @sets List of sticker sets +stickerSets total_count:int32 sets:vector = StickerSets; + + +//@class CallDiscardReason @description Describes the reason why a call was discarded + +//@description The call wasn't discarded, or the reason is unknown +callDiscardReasonEmpty = CallDiscardReason; + +//@description The call was ended before the conversation started. It was cancelled by the caller or missed by the other party +callDiscardReasonMissed = CallDiscardReason; + +//@description The call was ended before the conversation started. It was declined by the other party +callDiscardReasonDeclined = CallDiscardReason; + +//@description The call was ended during the conversation because the users were disconnected +callDiscardReasonDisconnected = CallDiscardReason; + +//@description The call was ended because one of the parties hung up +callDiscardReasonHungUp = CallDiscardReason; + + +//@description Specifies the supported call protocols @udp_p2p True, if UDP peer-to-peer connections are supported @udp_reflector True, if connection through UDP reflectors is supported @min_layer Minimum supported API layer; use 65 @max_layer Maximum supported API layer; use 65 +callProtocol udp_p2p:Bool udp_reflector:Bool min_layer:int32 max_layer:int32 = CallProtocol; + +//@description Describes the address of UDP reflectors @id Reflector identifier @ip IPv4 reflector address @ipv6 IPv6 reflector address @port Reflector port number @peer_tag Connection peer tag +callConnection id:int64 ip:string ipv6:string port:int32 peer_tag:bytes = CallConnection; + + +//@description Contains the call identifier @id Call identifier +callId id:int32 = CallId; + + +//@class CallState @description Describes the current call state + +//@description The call is pending, waiting to be accepted by a user @is_created True, if the call has already been created by the server @is_received True, if the call has already been received by the other party +callStatePending is_created:Bool is_received:Bool = CallState; + +//@description The call has been answered and encryption keys are being exchanged +callStateExchangingKeys = CallState; + +//@description The call is ready to use @protocol Call protocols supported by the peer @connections Available UDP reflectors @config A JSON-encoded call config @encryption_key Call encryption key @emojis Encryption key emojis fingerprint +callStateReady protocol:callProtocol connections:vector config:string encryption_key:bytes emojis:vector = CallState; + +//@description The call is hanging up after discardCall has been called +callStateHangingUp = CallState; + +//@description The call has ended successfully @reason The reason, why the call has ended @need_rating True, if the call rating should be sent to the server @need_debug_information True, if the call debug information should be sent to the server +callStateDiscarded reason:CallDiscardReason need_rating:Bool need_debug_information:Bool = CallState; + +//@description The call has ended with an error @error Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout +callStateError error:error = CallState; + + +//@description Describes a call @id Call identifier, not persistent @user_id Peer user identifier @is_outgoing True, if the call is outgoing @state Call state +call id:int32 user_id:int32 is_outgoing:Bool state:CallState = Call; + + +//@description Represents a list of animations @animations List of animations +animations animations:vector = Animations; + + +//@description Represents the result of an ImportContacts request @user_ids User identifiers of the imported contacts in the same order as they were specified in the request; 0 if the contact is not yet a registered user +//@importer_count The number of users that imported the corresponding contact; 0 for already registered users or if unavailable +importedContacts user_ids:vector importer_count:vector = ImportedContacts; + + +//@class InputInlineQueryResult @description Represents a single result of an inline query; for bots only + +//@description Represents a link to an animated GIF @id Unique identifier of the query result @title Title of the query result @thumbnail_url URL of the static result thumbnail (JPEG or GIF), if it exists +//@gif_url The URL of the GIF-file (file size must not exceed 1MB) @gif_duration Duration of the GIF, in seconds @gif_width Width of the GIF @gif_height Height of the GIF +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAnimation, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultAnimatedGif id:string title:string thumbnail_url:string gif_url:string gif_duration:int32 gif_width:int32 gif_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a link to an animated (i.e. without sound) H.264/MPEG-4 AVC video @id Unique identifier of the query result @title Title of the result @thumbnail_url URL of the static result thumbnail (JPEG or GIF), if it exists +//@mpeg4_url The URL of the MPEG4-file (file size must not exceed 1MB) @mpeg4_duration Duration of the video, in seconds @mpeg4_width Width of the video @mpeg4_height Height of the video +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAnimation, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultAnimatedMpeg4 id:string title:string thumbnail_url:string mpeg4_url:string mpeg4_duration:int32 mpeg4_width:int32 mpeg4_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a link to an article or web page @id Unique identifier of the query result @url URL of the result, if it exists @hide_url True, if the URL must be not shown @title Title of the result +//@param_description A short description of the result @thumbnail_url URL of the result thumbnail, if it exists @thumbnail_width Thumbnail width, if known @thumbnail_height Thumbnail height, if known +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultArticle id:string url:string hide_url:Bool title:string description:string thumbnail_url:string thumbnail_width:int32 thumbnail_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a link to an MP3 audio file @id Unique identifier of the query result @title Title of the audio file @performer Performer of the audio file +//@audio_url The URL of the audio file @audio_duration Audio file duration, in seconds +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageAudio, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultAudio id:string title:string performer:string audio_url:string audio_duration:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a user contact @id Unique identifier of the query result @contact User contact @thumbnail_url URL of the result thumbnail, if it exists @thumbnail_width Thumbnail width, if known @thumbnail_height Thumbnail height, if known +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultContact id:string contact:contact thumbnail_url:string thumbnail_width:int32 thumbnail_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a link to a file @id Unique identifier of the query result @title Title of the resulting file @param_description Short description of the result, if known @document_url URL of the file @mime_type MIME type of the file content; only "application/pdf" and "application/zip" are currently allowed +//@thumbnail_url The URL of the file thumbnail, if it exists @thumbnail_width Width of the thumbnail @thumbnail_height Height of the thumbnail +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageDocument, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultDocument id:string title:string description:string document_url:string mime_type:string thumbnail_url:string thumbnail_width:int32 thumbnail_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a game @id Unique identifier of the query result @game_short_name Short name of the game @reply_markup Message reply markup. Must be of type replyMarkupInlineKeyboard or null +inputInlineQueryResultGame id:string game_short_name:string reply_markup:ReplyMarkup = InputInlineQueryResult; + +//@description Represents a point on the map @id Unique identifier of the query result @location Location result @live_period Amount of time relative to the message sent time until the location can be updated, in seconds @title Title of the result @thumbnail_url URL of the result thumbnail, if it exists @thumbnail_width Thumbnail width, if known @thumbnail_height Thumbnail height, if known +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultLocation id:string location:location live_period:int32 title:string thumbnail_url:string thumbnail_width:int32 thumbnail_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents link to a JPEG image @id Unique identifier of the query result @title Title of the result, if known @param_description A short description of the result, if known @thumbnail_url URL of the photo thumbnail, if it exists +//@photo_url The URL of the JPEG photo (photo size must not exceed 5MB) @photo_width Width of the photo @photo_height Height of the photo +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessagePhoto, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultPhoto id:string title:string description:string thumbnail_url:string photo_url:string photo_width:int32 photo_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a link to a WEBP sticker @id Unique identifier of the query result @thumbnail_url URL of the sticker thumbnail, if it exists +//@sticker_url The URL of the WEBP sticker (sticker file size must not exceed 5MB) @sticker_width Width of the sticker @sticker_height Height of the sticker +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, inputMessageSticker, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultSticker id:string thumbnail_url:string sticker_url:string sticker_width:int32 sticker_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents information about a venue @id Unique identifier of the query result @venue Venue result @thumbnail_url URL of the result thumbnail, if it exists @thumbnail_width Thumbnail width, if known @thumbnail_height Thumbnail height, if known +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultVenue id:string venue:venue thumbnail_url:string thumbnail_width:int32 thumbnail_height:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a link to a page containing an embedded video player or a video file @id Unique identifier of the query result @title Title of the result @param_description A short description of the result, if known +//@thumbnail_url The URL of the video thumbnail (JPEG), if it exists @video_url URL of the embedded video player or video file @mime_type MIME type of the content of the video URL, only "text/html" or "video/mp4" are currently supported +//@video_width Width of the video @video_height Height of the video @video_duration Video duration, in seconds +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageVideo, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultVideo id:string title:string description:string thumbnail_url:string video_url:string mime_type:string video_width:int32 video_height:int32 video_duration:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + +//@description Represents a link to an opus-encoded audio file within an OGG container, single channel audio @id Unique identifier of the query result @title Title of the voice note +//@voice_note_url The URL of the voice note file @voice_note_duration Duration of the voice note, in seconds +//@reply_markup The message reply markup. Must be of type replyMarkupInlineKeyboard or null +//@input_message_content The content of the message to be sent. Must be one of the following types: InputMessageText, InputMessageVoiceNote, InputMessageLocation, InputMessageVenue or InputMessageContact +inputInlineQueryResultVoiceNote id:string title:string voice_note_url:string voice_note_duration:int32 reply_markup:ReplyMarkup input_message_content:InputMessageContent = InputInlineQueryResult; + + +//@class InlineQueryResult @description Represents a single result of an inline query + +//@description Represents a link to an article or web page @id Unique identifier of the query result @url URL of the result, if it exists @hide_url True, if the URL must be not shown @title Title of the result +//@param_description A short description of the result @thumbnail Result thumbnail; may be null +inlineQueryResultArticle id:string url:string hide_url:Bool title:string description:string thumbnail:photoSize = InlineQueryResult; + +//@description Represents a user contact @id Unique identifier of the query result @contact A user contact @thumbnail Result thumbnail; may be null +inlineQueryResultContact id:string contact:contact thumbnail:photoSize = InlineQueryResult; + +//@description Represents a point on the map @id Unique identifier of the query result @location Location result @title Title of the result @thumbnail Result thumbnail; may be null +inlineQueryResultLocation id:string location:location title:string thumbnail:photoSize = InlineQueryResult; + +//@description Represents information about a venue @id Unique identifier of the query result @venue Venue result @thumbnail Result thumbnail; may be null +inlineQueryResultVenue id:string venue:venue thumbnail:photoSize = InlineQueryResult; + +//@description Represents information about a game @id Unique identifier of the query result @game Game result +inlineQueryResultGame id:string game:game = InlineQueryResult; + +//@description Represents an animation file @id Unique identifier of the query result @animation Animation file @title Animation title +inlineQueryResultAnimation id:string animation:animation title:string = InlineQueryResult; + +//@description Represents an audio file @id Unique identifier of the query result @audio Audio file +inlineQueryResultAudio id:string audio:audio = InlineQueryResult; + +//@description Represents a document @id Unique identifier of the query result @document Document @title Document title @param_description Document description +inlineQueryResultDocument id:string document:document title:string description:string = InlineQueryResult; + +//@description Represents a photo @id Unique identifier of the query result @photo Photo @title Title of the result, if known @param_description A short description of the result, if known +inlineQueryResultPhoto id:string photo:photo title:string description:string = InlineQueryResult; + +//@description Represents a sticker @id Unique identifier of the query result @sticker Sticker +inlineQueryResultSticker id:string sticker:sticker = InlineQueryResult; + +//@description Represents a video @id Unique identifier of the query result @video Video @title Title of the video @param_description Description of the video +inlineQueryResultVideo id:string video:video title:string description:string = InlineQueryResult; + +//@description Represents a voice note @id Unique identifier of the query result @voice_note Voice note @title Title of the voice note +inlineQueryResultVoiceNote id:string voice_note:voiceNote title:string = InlineQueryResult; + + +//@description Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query @inline_query_id Unique identifier of the inline query @next_offset The offset for the next request. If empty, there are no more results @results Results of the query +//@switch_pm_text If non-empty, this text should be shown on the button, which opens a private chat with the bot and sends the bot a start message with the switch_pm_parameter @switch_pm_parameter Parameter for the bot start message +inlineQueryResults inline_query_id:int64 next_offset:string results:vector switch_pm_text:string switch_pm_parameter:string = InlineQueryResults; + + +//@class CallbackQueryPayload @description Represents a payload of a callback query + +//@description The payload from a general callback button @data Data that was attached to the callback button +callbackQueryPayloadData data:bytes = CallbackQueryPayload; + +//@description The payload from a game callback button @game_short_name A short name of the game that was attached to the callback button +callbackQueryPayloadGame game_short_name:string = CallbackQueryPayload; + + +//@description Contains a bot's answer to a callback query @text Text of the answer @show_alert True, if an alert should be shown to the user instead of a toast notification @url URL to be opened +callbackQueryAnswer text:string show_alert:Bool url:string = CallbackQueryAnswer; + + +//@description Contains the result of a custom request @result A JSON-serialized result +customRequestResult result:string = CustomRequestResult; + + +//@description Contains one row of the game high score table @position Position in the high score table @user_id User identifier @score User score +gameHighScore position:int32 user_id:int32 score:int32 = GameHighScore; + +//@description Contains a list of game high scores @scores A list of game high scores +gameHighScores scores:vector = GameHighScores; + + +//@class ChatEventAction @description Represents a chat event + +//@description A message was edited @old_message The original message before the edit @new_message The message after it was edited +chatEventMessageEdited old_message:message new_message:message = ChatEventAction; + +//@description A message was deleted @message Deleted message +chatEventMessageDeleted message:message = ChatEventAction; + +//@description A message was pinned @message Pinned message +chatEventMessagePinned message:message = ChatEventAction; + +//@description A message was unpinned +chatEventMessageUnpinned = ChatEventAction; + +//@description A new member joined the chat +chatEventMemberJoined = ChatEventAction; + +//@description A member left the chat +chatEventMemberLeft = ChatEventAction; + +//@description A new chat member was invited @user_id New member user identifier @status New member status +chatEventMemberInvited user_id:int32 status:ChatMemberStatus = ChatEventAction; + +//@description A chat member has gained/lost administrator status, or the list of their administrator privileges has changed @user_id Chat member user identifier @old_status Previous status of the chat member @new_status New status of the chat member +chatEventMemberPromoted user_id:int32 old_status:ChatMemberStatus new_status:ChatMemberStatus = ChatEventAction; + +//@description A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed @user_id Chat member user identifier @old_status Previous status of the chat member @new_status New status of the chat member +chatEventMemberRestricted user_id:int32 old_status:ChatMemberStatus new_status:ChatMemberStatus = ChatEventAction; + +//@description The chat title was changed @old_title Previous chat title @new_title New chat title +chatEventTitleChanged old_title:string new_title:string = ChatEventAction; + +//@description The chat description was changed @old_description Previous chat description @new_description New chat description +chatEventDescriptionChanged old_description:string new_description:string = ChatEventAction; + +//@description The chat username was changed @old_username Previous chat username @new_username New chat username +chatEventUsernameChanged old_username:string new_username:string = ChatEventAction; + +//@description The chat photo was changed @old_photo Previous chat photo value; may be null @new_photo New chat photo value; may be null +chatEventPhotoChanged old_photo:chatPhoto new_photo:chatPhoto = ChatEventAction; + +//@description The anyone_can_invite setting of a supergroup chat was toggled @anyone_can_invite New value of anyone_can_invite +chatEventInvitesToggled anyone_can_invite:Bool = ChatEventAction; + +//@description The sign_messages setting of a channel was toggled @sign_messages New value of sign_messages +chatEventSignMessagesToggled sign_messages:Bool = ChatEventAction; + +//@description The supergroup sticker set was changed @old_sticker_set_id Previous identifier of the chat sticker set; 0 if none @new_sticker_set_id New identifier of the chat sticker set; 0 if none +chatEventStickerSetChanged old_sticker_set_id:int64 new_sticker_set_id:int64 = ChatEventAction; + +//@description The is_all_history_available setting of a supergroup was toggled @is_all_history_available New value of is_all_history_available +chatEventIsAllHistoryAvailableToggled is_all_history_available:Bool = ChatEventAction; + +//@description Represents a chat event @id Chat event identifier @date Point in time (Unix timestamp) when the event happened @user_id Identifier of the user who performed the action that triggered the event @action Action performed by the user +chatEvent id:int64 date:int32 user_id:int32 action:ChatEventAction = ChatEvent; + +//@description Contains a list of chat events @events List of events +chatEvents events:vector = ChatEvents; + +//@description Represents a set of filters used to obtain a chat event log +//@message_edits True, if message edits should be returned +//@message_deletions True, if message deletions should be returned +//@message_pins True, if pin/unpin events should be returned +//@member_joins True, if members joining events should be returned +//@member_leaves True, if members leaving events should be returned +//@member_invites True, if invited member events should be returned +//@member_promotions True, if member promotion/demotion events should be returned +//@member_restrictions True, if member restricted/unrestricted/banned/unbanned events should be returned +//@info_changes True, if changes in chat information should be returned +//@setting_changes True, if changes in chat settings should be returned +chatEventLogFilters message_edits:Bool message_deletions:Bool message_pins:Bool member_joins:Bool member_leaves:Bool member_invites:Bool member_promotions:Bool member_restrictions:Bool info_changes:Bool setting_changes:Bool = ChatEventLogFilters; + + +//@class DeviceToken @description Represents a data needed to subscribe for push notifications. To use specific push notification service, you must specify the correct application platform and upload valid server authentication data at https://my.telegram.org + +//@description A token for Google Cloud Messaging @token Device registration token, may be empty to de-register a device +deviceTokenGoogleCloudMessaging token:string = DeviceToken; + +//@description A token for Apple Push Notification service @device_token Device token, may be empty to de-register a device @is_app_sandbox True, if App Sandbox is enabled +deviceTokenApplePush device_token:string is_app_sandbox:Bool = DeviceToken; + +//@description A token for Apple Push Notification service VoIP notifications @device_token Device token, may be empty to de-register a device @is_app_sandbox True, if App Sandbox is enabled +deviceTokenApplePushVoIP device_token:string is_app_sandbox:Bool = DeviceToken; + +//@description A token for Windows Push Notification Services @access_token The access token that will be used to send notifications, may be empty to de-register a device +deviceTokenWindowsPush access_token:string = DeviceToken; + +//@description A token for Microsoft Push Notification Service @channel_uri Push notification channel URI, may be empty to de-register a device +deviceTokenMicrosoftPush channel_uri:string = DeviceToken; + +//@description A token for Microsoft Push Notification Service VoIP channel @channel_uri Push notification channel URI, may be empty to de-register a device +deviceTokenMicrosoftPushVoIP channel_uri:string = DeviceToken; + +//@description A token for web Push API @endpoint Absolute URL exposed by the push service where the application server can send push messages, may be empty to de-register a device +//@p256dh_base64url Base64url-encoded P-256 elliptic curve Diffie-Hellman public key @auth_base64url Base64url-encoded authentication secret +deviceTokenWebPush endpoint:string p256dh_base64url:string auth_base64url:string = DeviceToken; + +//@description A token for Simple Push API for Firefox OS @endpoint Absolute URL exposed by the push service where the application server can send push messages, may be empty to de-register a device +deviceTokenSimplePush endpoint:string = DeviceToken; + +//@description A token for Ubuntu Push Client service @token Token, may be empty to de-register a device +deviceTokenUbuntuPush token:string = DeviceToken; + +//@description A token for BlackBerry Push Service @token Token, may be empty to de-register a device +deviceTokenBlackBerryPush token:string = DeviceToken; + +//@description A token for Tizen Push Service @reg_id Push service registration identifier, may be empty to de-register a device +deviceTokenTizenPush reg_id:string = DeviceToken; + + +//@description Contains information about a wallpaper @id Unique persistent wallpaper identifier @sizes Available variants of the wallpaper in different sizes. These photos can only be downloaded; they can't be sent in a message @color Main color of the wallpaper in RGB24 format; should be treated as background color if no photos are specified +wallpaper id:int32 sizes:vector color:int32 = Wallpaper; + +//@description Contains a list of wallpapers @wallpapers A list of wallpapers +wallpapers wallpapers:vector = Wallpapers; + + +//@description Contains a list of hashtags @hashtags A list of hashtags +hashtags hashtags:vector = Hashtags; + + +//@class CheckChatUsernameResult @description Represents result of checking whether a username can be set for a chat + +//@description The username can be set +checkChatUsernameResultOk = CheckChatUsernameResult; + +//@description The username is invalid +checkChatUsernameResultUsernameInvalid = CheckChatUsernameResult; + +//@description The username is occupied +checkChatUsernameResultUsernameOccupied = CheckChatUsernameResult; + +//@description The user has too much public chats, one of them should be made private first +checkChatUsernameResultPublicChatsTooMuch = CheckChatUsernameResult; + +//@description The user can't be a member of a public supergroup +checkChatUsernameResultPublicGroupsUnavailable = CheckChatUsernameResult; + + +//@class OptionValue @description Represents the value of an option + +//@description Boolean option @value The value of the option +optionValueBoolean value:Bool = OptionValue; + +//@description An unknown option or an option which has a default value +optionValueEmpty = OptionValue; + +//@description An integer option @value The value of the option +optionValueInteger value:int32 = OptionValue; + +//@description A string option @value The value of the option +optionValueString value:string = OptionValue; + + +//@class UserPrivacySettingRule @description Represents a single rule for managing privacy settings + +//@description A rule to allow all users to do something +userPrivacySettingRuleAllowAll = UserPrivacySettingRule; + +//@description A rule to allow all of a user's contacts to do something +userPrivacySettingRuleAllowContacts = UserPrivacySettingRule; + +//@description A rule to allow certain specified users to do something @user_ids The user identifiers +userPrivacySettingRuleAllowUsers user_ids:vector = UserPrivacySettingRule; + +//@description A rule to restrict all users from doing something +userPrivacySettingRuleRestrictAll = UserPrivacySettingRule; + +//@description A rule to restrict all contacts of a user from doing something +userPrivacySettingRuleRestrictContacts = UserPrivacySettingRule; + +//@description A rule to restrict all specified users from doing something @user_ids The user identifiers +userPrivacySettingRuleRestrictUsers user_ids:vector = UserPrivacySettingRule; + +//@description A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed @rules A list of rules +userPrivacySettingRules rules:vector = UserPrivacySettingRules; + +//@class UserPrivacySetting @description Describes available user privacy settings + +//@description A privacy setting for managing whether the user's online status is visible +userPrivacySettingShowStatus = UserPrivacySetting; + +//@description A privacy setting for managing whether the user can be invited to chats +userPrivacySettingAllowChatInvites = UserPrivacySetting; + +//@description A privacy setting for managing whether the user can be called +userPrivacySettingAllowCalls = UserPrivacySetting; + + +//@description Contains information about the period of inactivity after which the current user's account will automatically be deleted @days Number of days of inactivity before the account will be flagged for deletion; should range from 30-366 days +accountTtl days:int32 = AccountTtl; + + +//@description Contains information about one session in a Telegram application used by the current user @id Session identifier @is_current True, if this session is the current session +//@api_id Telegram API identifier, as provided by the application @application_name Name of the application, as provided by the application +//@application_version The version of the application, as provided by the application @is_official_application True, if the application is an official application or uses the api_id of an official application +//@device_model Model of the device the application has been run or is running on, as provided by the application @platform Operating system the application has been run or is running on, as provided by the application +//@system_version Version of the operating system the application has been run or is running on, as provided by the application @log_in_date Point in time (Unix timestamp) when the user has logged in +//@last_active_date Point in time (Unix timestamp) when the session was last used @ip IP address from which the session was created, in human-readable format +//@country A two-letter country code for the country from which the session was created, based on the IP address @region Region code from which the session was created, based on the IP address +session id:int64 is_current:Bool api_id:int32 application_name:string application_version:string is_official_application:Bool device_model:string platform:string system_version:string log_in_date:int32 last_active_date:int32 ip:string country:string region:string = Session; + +//@description Contains a list of sessions @sessions List of sessions +sessions sessions:vector = Sessions; + + +//@description Contains information about one website the current user is logged in with Telegram +//@id Website identifier +//@domain_name The domain name of the website +//@bot_user_id User identifier of a bot linked with the website +//@browser The version of a browser used to log in +//@platform Operating system the browser is running on +//@log_in_date Point in time (Unix timestamp) when the user was logged in +//@last_active_date Point in time (Unix timestamp) when obtained authorization was last used +//@ip IP address from which the user was logged in, in human-readable format +//@location Human-readable description of a country and a region, from which the user was logged in, based on the IP address +connectedWebsite id:int64 domain_name:string bot_user_id:int32 browser:string platform:string log_in_date:int32 last_active_date:int32 ip:string location:string = ConnectedWebsite; + +//@description Contains a list of websites the current user is logged in with Telegram @websites List of connected websites +connectedWebsites websites:vector = ConnectedWebsites; + + +//@description Contains information about the availability of the "Report spam" action for a chat @can_report_spam True, if a prompt with the "Report spam" action should be shown to the user +chatReportSpamState can_report_spam:Bool = ChatReportSpamState; + +//@class ChatReportReason @description Describes the reason why a chat is reported + +//@description The chat contains spam messages +chatReportReasonSpam = ChatReportReason; + +//@description The chat promotes violence +chatReportReasonViolence = ChatReportReason; + +//@description The chat contains pornographic messages +chatReportReasonPornography = ChatReportReason; + +//@description A custom reason provided by the user @text Report text +chatReportReasonCustom text:string = ChatReportReason; + + +//@description Contains a public HTTPS link to a message in a public supergroup or channel @link Message link @html HTML-code for embedding the message +publicMessageLink link:string html:string = PublicMessageLink; + + +//@class FileType @description Represents the type of a file + +//@description The data is not a file +fileTypeNone = FileType; + +//@description The file is an animation +fileTypeAnimation = FileType; + +//@description The file is an audio file +fileTypeAudio = FileType; + +//@description The file is a document +fileTypeDocument = FileType; + +//@description The file is a photo +fileTypePhoto = FileType; + +//@description The file is a profile photo +fileTypeProfilePhoto = FileType; + +//@description The file was sent to a secret chat (the file type is not known to the server) +fileTypeSecret = FileType; + +//@description The file is a sticker +fileTypeSticker = FileType; + +//@description The file is a thumbnail of another file +fileTypeThumbnail = FileType; + +//@description The file type is not yet known +fileTypeUnknown = FileType; + +//@description The file is a video +fileTypeVideo = FileType; + +//@description The file is a video note +fileTypeVideoNote = FileType; + +//@description The file is a voice note +fileTypeVoiceNote = FileType; + +//@description The file is a wallpaper +fileTypeWallpaper = FileType; + +//@description The file is a thumbnail of a file from a secret chat +fileTypeSecretThumbnail = FileType; + + +//@description Contains the storage usage statistics for a specific file type @file_type File type @size Total size of the files @count Total number of files +storageStatisticsByFileType file_type:FileType size:int53 count:int32 = StorageStatisticsByFileType; + +//@description Contains the storage usage statistics for a specific chat @chat_id Chat identifier; 0 if none @size Total size of the files in the chat @count Total number of files in the chat @by_file_type Statistics split by file types +storageStatisticsByChat chat_id:int53 size:int53 count:int32 by_file_type:vector = StorageStatisticsByChat; + +//@description Contains the exact storage usage statistics split by chats and file type @size Total size of files @count Total number of files @by_chat Statistics split by chats +storageStatistics size:int53 count:int32 by_chat:vector = StorageStatistics; + +//@description Contains approximate storage usage statistics, excluding files of unknown file type @files_size Approximate total size of files @file_count Approximate number of files @database_size Size of the database +storageStatisticsFast files_size:int53 file_count:int32 database_size:int53 = StorageStatisticsFast; + + +//@class NetworkType @description Represents the type of a network + +//@description The network is not available +networkTypeNone = NetworkType; + +//@description A mobile network +networkTypeMobile = NetworkType; + +//@description A mobile roaming network +networkTypeMobileRoaming = NetworkType; + +//@description A Wi-Fi network +networkTypeWiFi = NetworkType; + +//@description A different network type (e.g., Ethernet network) +networkTypeOther = NetworkType; + + +//@class NetworkStatisticsEntry @description Contains statistics about network usage + +//@description Contains information about the total amount of data that was used to send and receive files @file_type Type of the file the data is part of @network_type Type of the network the data was sent through. Call setNetworkType to maintain the actual network type +//@sent_bytes Total number of bytes sent @received_bytes Total number of bytes received +networkStatisticsEntryFile file_type:FileType network_type:NetworkType sent_bytes:int53 received_bytes:int53 = NetworkStatisticsEntry; + +//@description Contains information about the total amount of data that was used for calls @network_type Type of the network the data was sent through. Call setNetworkType to maintain the actual network type +//@sent_bytes Total number of bytes sent @received_bytes Total number of bytes received @duration Total call duration, in seconds +networkStatisticsEntryCall network_type:NetworkType sent_bytes:int53 received_bytes:int53 duration:double = NetworkStatisticsEntry; + +//@description A full list of available network statistic entries @since_date Point in time (Unix timestamp) when the app began collecting statistics @entries Network statistics entries +networkStatistics since_date:int32 entries:vector = NetworkStatistics; + + +//@class ConnectionState @description Describes the current state of the connection to Telegram servers + +//@description Currently waiting for the network to become available. Use SetNetworkType to change the available network type +connectionStateWaitingForNetwork = ConnectionState; + +//@description Currently establishing a connection with a proxy server +connectionStateConnectingToProxy = ConnectionState; + +//@description Currently establishing a connection to the Telegram servers +connectionStateConnecting = ConnectionState; + +//@description Downloading data received while the client was offline +connectionStateUpdating = ConnectionState; + +//@description There is a working connection to the Telegram servers +connectionStateReady = ConnectionState; + + +//@class TopChatCategory @description Represents the categories of chats for which a list of frequently used chats can be retrieved + +//@description A category containing frequently used private chats with non-bot users +topChatCategoryUsers = TopChatCategory; + +//@description A category containing frequently used private chats with bot users +topChatCategoryBots = TopChatCategory; + +//@description A category containing frequently used basic groups and supergroups +topChatCategoryGroups = TopChatCategory; + +//@description A category containing frequently used channels +topChatCategoryChannels = TopChatCategory; + +//@description A category containing frequently used chats with inline bots sorted by their usage in inline mode +topChatCategoryInlineBots = TopChatCategory; + +//@description A category containing frequently used chats used for calls +topChatCategoryCalls = TopChatCategory; + + +//@class TMeUrlType @description Describes the type of a URL linking to an internal Telegram entity + +//@description A URL linking to a user @user_id Identifier of the user +tMeUrlTypeUser user_id:int32 = TMeUrlType; + +//@description A URL linking to a public supergroup or channel @supergroup_id Identifier of the supergroup or channel +tMeUrlTypeSupergroup supergroup_id:int53 = TMeUrlType; + +//@description A chat invite link @info Chat invite link info +tMeUrlTypeChatInvite info:chatInviteLinkInfo = TMeUrlType; + +//@description A URL linking to a sticker set @sticker_set_id Identifier of the sticker set +tMeUrlTypeStickerSet sticker_set_id:int64 = TMeUrlType; + +//@description Represents a URL linking to an internal Telegram entity @url URL @type Type of the URL +tMeUrl url:string type:TMeUrlType = TMeUrl; + +//@description Contains a list of t.me URLs @urls List of URLs +tMeUrls urls:vector = TMeUrls; + + +//@description Contains a counter @count Count +count count:int32 = Count; + +//@description Contains some text @text Text +text text:string = Text; + + +//@class TextParseMode @description Describes the way the text should be parsed for TextEntities + +//@description The text should be parsed in markdown-style +textParseModeMarkdown = TextParseMode; + +//@description The text should be parsed in HTML-style +textParseModeHTML = TextParseMode; + + +//@class Proxy @description Contains information about a proxy server + +//@description An empty proxy server +proxyEmpty = Proxy; + +//@description A SOCKS5 proxy server @server Proxy server IP address @port Proxy server port @username Username for logging in @password Password for logging in +proxySocks5 server:string port:int32 username:string password:string = Proxy; + + +//@description Describes a sticker that should be added to a sticker set @png_sticker PNG image with the sticker; must be up to 512 kB in size and fit in a 512x512 square @emojis Emoji corresponding to the sticker @mask_position For masks, position where the mask should be placed; may be null +inputSticker png_sticker:InputFile emojis:string mask_position:maskPosition = InputSticker; + + +//@class Update @description Contains notifications about data changes + +//@description The user authorization state has changed @authorization_state New authorization state +updateAuthorizationState authorization_state:AuthorizationState = Update; + +//@description A new message was received; can also be an outgoing message @message The new message @disable_notification True, if this message must not generate a notification @contains_mention True, if the message contains a mention of the current user +updateNewMessage message:message disable_notification:Bool contains_mention:Bool = Update; + +//@description A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully or even that the send message request will be processed. This update will be sent only if the option "use_quick_ack" is set to true. This update may be sent multiple times for the same message +//@chat_id The chat identifier of the sent message @message_id A temporary message identifier +updateMessageSendAcknowledged chat_id:int53 message_id:int53 = Update; + +//@description A message has been successfully sent @message Information about the sent message. Usually only the message identifier, date, and content are changed, but almost all other fields can also change @old_message_id The previous temporary message identifier +updateMessageSendSucceeded message:message old_message_id:int53 = Update; + +//@description A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update +//@message Contains information about the message that failed to send @old_message_id The previous temporary message identifier @error_code An error code @error_message Error message +updateMessageSendFailed message:message old_message_id:int53 error_code:int32 error_message:string = Update; + +//@description The message content has changed @chat_id Chat identifier @message_id Message identifier @new_content New message content +updateMessageContent chat_id:int53 message_id:int53 new_content:MessageContent = Update; + +//@description A message was edited. Changes in the message content will come in a separate updateMessageContent @chat_id Chat identifier @message_id Message identifier @edit_date Point in time (Unix timestamp) when the message was edited @reply_markup New message reply markup; may be null +updateMessageEdited chat_id:int53 message_id:int53 edit_date:int32 reply_markup:ReplyMarkup = Update; + +//@description The view count of the message has changed @chat_id Chat identifier @message_id Message identifier @views New value of the view count +updateMessageViews chat_id:int53 message_id:int53 views:int32 = Update; + +//@description The message content was opened. Updates voice note messages to "listened", video note messages to "viewed" and starts the TTL timer for self-destructing messages @chat_id Chat identifier @message_id Message identifier +updateMessageContentOpened chat_id:int53 message_id:int53 = Update; + +//@description A message with an unread mention was read @chat_id Chat identifier @message_id Message identifier @unread_mention_count The new number of unread mention messages left in the chat +updateMessageMentionRead chat_id:int53 message_id:int53 unread_mention_count:int32 = Update; + +//@description A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the client. The chat field changes will be reported through separate updates @chat The chat +updateNewChat chat:chat = Update; + +//@description The title of a chat was changed @chat_id Chat identifier @title The new chat title +updateChatTitle chat_id:int53 title:string = Update; + +//@description A chat photo was changed @chat_id Chat identifier @photo The new chat photo; may be null +updateChatPhoto chat_id:int53 photo:chatPhoto = Update; + +//@description The last message of a chat was changed. If last_message is null then the last message in the chat became unknown. Some new unknown messages might be added to the chat in this case @chat_id Chat identifier @last_message The new last message in the chat; may be null @order New value of the chat order +updateChatLastMessage chat_id:int53 last_message:message order:int64 = Update; + +//@description The order of the chat in the chats list has changed. Instead of this update updateChatLastMessage, updateChatIsPinned or updateChatDraftMessage might be sent @chat_id Chat identifier @order New value of the order +updateChatOrder chat_id:int53 order:int64 = Update; + +//@description A chat was pinned or unpinned @chat_id Chat identifier @is_pinned New value of is_pinned @order New value of the chat order +updateChatIsPinned chat_id:int53 is_pinned:Bool order:int64 = Update; + +//@description Incoming messages were read or number of unread messages has been changed @chat_id Chat identifier @last_read_inbox_message_id Identifier of the last read incoming message @unread_count The number of unread messages left in the chat +updateChatReadInbox chat_id:int53 last_read_inbox_message_id:int53 unread_count:int32 = Update; + +//@description Outgoing messages were read @chat_id Chat identifier @last_read_outbox_message_id Identifier of last read outgoing message +updateChatReadOutbox chat_id:int53 last_read_outbox_message_id:int53 = Update; + +//@description The chat unread_mention_count has changed @chat_id Chat identifier @unread_mention_count The number of unread mention messages left in the chat +updateChatUnreadMentionCount chat_id:int53 unread_mention_count:int32 = Update; + +//@description Notification settings for some chats were updated @scope Types of chats for which notification settings were updated @notification_settings The new notification settings +updateNotificationSettings scope:NotificationSettingsScope notification_settings:notificationSettings = Update; + +//@description The default chat reply markup was changed. Can occur because new messages with reply markup were received or because an old reply markup was hidden by the user +//@chat_id Chat identifier @reply_markup_message_id Identifier of the message from which reply markup needs to be used; 0 if there is no default custom reply markup in the chat +updateChatReplyMarkup chat_id:int53 reply_markup_message_id:int53 = Update; + +//@description A draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update shouldn't be applied @chat_id Chat identifier @draft_message The new draft message; may be null @order New value of the chat order +updateChatDraftMessage chat_id:int53 draft_message:draftMessage order:int64 = Update; + +//@description Some messages were deleted @chat_id Chat identifier @message_ids Identifiers of the deleted messages +//@is_permanent True, if the messages are permanently deleted by a user (as opposed to just becoming unaccessible) +//@from_cache True, if the messages are deleted only from the cache and can possibly be retrieved again in the future +updateDeleteMessages chat_id:int53 message_ids:vector is_permanent:Bool from_cache:Bool = Update; + +//@description User activity in the chat has changed @chat_id Chat identifier @user_id Identifier of a user performing an action @action The action description +updateUserChatAction chat_id:int53 user_id:int32 action:ChatAction = Update; + +//@description The user went online or offline @user_id User identifier @status New status of the user +updateUserStatus user_id:int32 status:UserStatus = Update; + +//@description Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the client @user New data about the user +updateUser user:user = Update; + +//@description Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the client @basic_group New data about the group +updateBasicGroup basic_group:basicGroup = Update; + +//@description Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the client @supergroup New data about the supergroup +updateSupergroup supergroup:supergroup = Update; + +//@description Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the client @secret_chat New data about the secret chat +updateSecretChat secret_chat:secretChat = Update; + +//@description Some data from userFullInfo has been changed @user_id User identifier @user_full_info New full information about the user +updateUserFullInfo user_id:int32 user_full_info:userFullInfo = Update; + +//@description Some data from basicGroupFullInfo has been changed @basic_group_id Identifier of a basic group @basic_group_full_info New full information about the group +updateBasicGroupFullInfo basic_group_id:int32 basic_group_full_info:basicGroupFullInfo = Update; + +//@description Some data from supergroupFullInfo has been changed @supergroup_id Identifier of the supergroup or channel @supergroup_full_info New full information about the supergroup +updateSupergroupFullInfo supergroup_id:int32 supergroup_full_info:supergroupFullInfo = Update; + +//@description Service notification from the server. Upon receiving this the client must show a popup with the content of the notification @type Notification type @content Notification content +updateServiceNotification type:string content:MessageContent = Update; + +//@description Information about a file was updated @file New data about the file +updateFile file:file = Update; + +//@description The file generation process needs to be started by the client +//@generation_id Unique identifier for the generation process +//@original_path The path to a file from which a new file is generated, may be empty +//@destination_path The path to a file that should be created and where the new file should be generated +//@conversion String specifying the conversion applied to the original file. If conversion is "#url#" than original_path contains a HTTP/HTTPS URL of a file, which should be downloaded by the client +updateFileGenerationStart generation_id:int64 original_path:string destination_path:string conversion:string = Update; + +//@description File generation is no longer needed @generation_id Unique identifier for the generation process +updateFileGenerationStop generation_id:int64 = Update; + +//@description New call was created or information about a call was updated @call New data about a call +updateCall call:call = Update; + +//@description Some privacy setting rules have been changed @setting The privacy setting @rules New privacy rules +updateUserPrivacySettingRules setting:UserPrivacySetting rules:userPrivacySettingRules = Update; + +//@description Number of unread messages has changed. This update is sent only if a message database is used @unread_count Total number of unread messages @unread_unmuted_count Total number of unread messages in unmuted chats +updateUnreadMessageCount unread_count:int32 unread_unmuted_count:int32 = Update; + +//@description An option changed its value @name The option name @value The new option value +updateOption name:string value:OptionValue = Update; + +//@description The list of installed sticker sets was updated @is_masks True, if the list of installed mask sticker sets was updated @sticker_set_ids The new list of installed ordinary sticker sets +updateInstalledStickerSets is_masks:Bool sticker_set_ids:vector = Update; + +//@description The list of trending sticker sets was updated or some of them were viewed @sticker_sets The new list of trending sticker sets +updateTrendingStickerSets sticker_sets:stickerSets = Update; + +//@description The list of recently used stickers was updated @is_attached True, if the list of stickers attached to photo or video files was updated, otherwise the list of sent stickers is updated @sticker_ids The new list of file identifiers of recently used stickers +updateRecentStickers is_attached:Bool sticker_ids:vector = Update; + +//@description The list of favorite stickers was updated @sticker_ids The new list of file identifiers of favorite stickers +updateFavoriteStickers sticker_ids:vector = Update; + +//@description The list of saved animations was updated @animation_ids The new list of file identifiers of saved animations +updateSavedAnimations animation_ids:vector = Update; + +//@description The connection state has changed @state The new connection state +updateConnectionState state:ConnectionState = Update; + +//@description A new incoming inline query; for bots only @id Unique query identifier @sender_user_id Identifier of the user who sent the query @user_location User location, provided by the client; may be null @query Text of the query @offset Offset of the first entry to return +updateNewInlineQuery id:int64 sender_user_id:int32 user_location:location query:string offset:string = Update; + +//@description The user has chosen a result of an inline query; for bots only @sender_user_id Identifier of the user who sent the query @user_location User location, provided by the client; may be null @query Text of the query @result_id Identifier of the chosen result @inline_message_id Identifier of the sent inline message, if known +updateNewChosenInlineResult sender_user_id:int32 user_location:location query:string result_id:string inline_message_id:string = Update; + +//@description A new incoming callback query; for bots only @id Unique query identifier @sender_user_id Identifier of the user who sent the query @chat_id Identifier of the chat, in which the query was sent +//@message_id Identifier of the message, from which the query originated @chat_instance Identifier that uniquely corresponds to the chat to which the message was sent @payload Query payload +updateNewCallbackQuery id:int64 sender_user_id:int32 chat_id:int53 message_id:int53 chat_instance:int64 payload:CallbackQueryPayload = Update; + +//@description A new incoming callback query from a message sent via a bot; for bots only @id Unique query identifier @sender_user_id Identifier of the user who sent the query @inline_message_id Identifier of the inline message, from which the query originated +//@chat_instance An identifier uniquely corresponding to the chat a message was sent to @payload Query payload +updateNewInlineCallbackQuery id:int64 sender_user_id:int32 inline_message_id:string chat_instance:int64 payload:CallbackQueryPayload = Update; + +//@description A new incoming shipping query; for bots only. Only for invoices with flexible price @id Unique query identifier @sender_user_id Identifier of the user who sent the query @invoice_payload Invoice payload @shipping_address User shipping address +updateNewShippingQuery id:int64 sender_user_id:int32 invoice_payload:string shipping_address:shippingAddress = Update; + +//@description A new incoming pre-checkout query; for bots only. Contains full information about a checkout @id Unique query identifier @sender_user_id Identifier of the user who sent the query @currency Currency for the product price @total_amount Total price for the product, in the minimal quantity of the currency +//@invoice_payload Invoice payload @shipping_option_id Identifier of a shipping option chosen by the user; may be empty if not applicable @order_info Information about the order; may be null +updateNewPreCheckoutQuery id:int64 sender_user_id:int32 currency:string total_amount:int53 invoice_payload:bytes shipping_option_id:string order_info:orderInfo = Update; + +//@description A new incoming event; for bots only @event A JSON-serialized event +updateNewCustomEvent event:string = Update; + +//@description A new incoming query; for bots only @id The query identifier @data JSON-serialized query data @timeout Query timeout +updateNewCustomQuery id:int64 data:string timeout:int32 = Update; + + +//@description A simple object containing a number; for testing only @value Number +testInt value:int32 = TestInt; +//@description A simple object containing a string; for testing only @value String +testString value:string = TestString; +//@description A simple object containing a sequence of bytes; for testing only @value Bytes +testBytes value:bytes = TestBytes; +//@description A simple object containing a vector of numbers; for testing only @value Vector of numbers +testVectorInt value:vector = TestVectorInt; +//@description A simple object containing a vector of objects that hold a number; for testing only @value Vector of objects +testVectorIntObject value:vector = TestVectorIntObject; +//@description A simple object containing a vector of strings; for testing only @value Vector of strings +testVectorString value:vector = TestVectorString; +//@description A simple object containing a vector of objects that hold a string; for testing only @value Vector of objects +testVectorStringObject value:vector = TestVectorStringObject; + +---functions--- + +//@description Returns the current authorization state; this is an offline request. For informational purposes only. Use updateAuthorizationState instead to maintain the current authorization state +getAuthorizationState = AuthorizationState; + + +//@description Sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters @parameters Parameters +setTdlibParameters parameters:tdlibParameters = Ok; + +//@description Checks the database encryption key for correctness. Works only when the current authorization state is authorizationStateWaitEncryptionKey @encryption_key Encryption key to check or set up +checkDatabaseEncryptionKey encryption_key:bytes = Ok; + +//@description Sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber +//@phone_number The phone number of the user, in international format @allow_flash_call Pass true if the authentication code may be sent via flash call to the specified phone number @is_current_phone_number Pass true if the phone number is used on the current device. Ignored if allow_flash_call is false +setAuthenticationPhoneNumber phone_number:string allow_flash_call:Bool is_current_phone_number:Bool = Ok; + +//@description Re-sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode and the next_code_type of the result is not null +resendAuthenticationCode = Ok; + +//@description Checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode @code The verification code received via SMS, Telegram message, phone call, or flash call +//@first_name If the user is not yet registered, the first name of the user; 1-255 characters @last_name If the user is not yet registered; the last name of the user; optional; 0-255 characters +checkAuthenticationCode code:string first_name:string last_name:string = Ok; + +//@description Checks the authentication password for correctness. Works only when the current authorization state is authorizationStateWaitPassword @password The password to check +checkAuthenticationPassword password:string = Ok; + +//@description Requests to send a password recovery code to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword +requestAuthenticationPasswordRecovery = Ok; + +//@description Recovers the password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword @recovery_code Recovery code to check +recoverAuthenticationPassword recovery_code:string = Ok; + +//@description Checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in @token The bot token +checkAuthenticationBotToken token:string = Ok; + +//@description Closes the TDLib instance after a proper logout. Requires an available network connection. All local data will be destroyed. After the logout completes, updateAuthorizationState with authorizationStateClosed will be sent +logOut = Ok; + +//@description Closes the TDLib instance. All databases will be flushed to disk and properly closed. After the close completes, updateAuthorizationState with authorizationStateClosed will be sent +close = Ok; + +//@description Closes the TDLib instance, destroying all local data without a proper logout. The current user session will remain in the list of all active sessions. All local data will be destroyed. After the destruction completes updateAuthorizationState with authorizationStateClosed will be sent +destroy = Ok; + + +//@description Changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain @new_encryption_key New encryption key +setDatabaseEncryptionKey new_encryption_key:bytes = Ok; + + +//@description Returns the current state of 2-step verification +getPasswordState = PasswordState; + +//@description Changes the password for the user. If a new recovery email address is specified, then the error EMAIL_UNCONFIRMED is returned and the password change will not be applied until the new recovery email address has been confirmed. The application should periodically call getPasswordState to check whether the new email address has been confirmed +//@old_password Previous password of the user @new_password New password of the user; may be empty to remove the password @new_hint New password hint; may be empty @set_recovery_email_address Pass true if the recovery email address should be changed @new_recovery_email_address New recovery email address; may be empty +setPassword old_password:string new_password:string new_hint:string set_recovery_email_address:Bool new_recovery_email_address:string = PasswordState; + +//@description Returns a recovery email address that was previously set up. This method can be used to verify a password provided by the user @password The password for the current user +getRecoveryEmailAddress password:string = RecoveryEmailAddress; + +//@description Changes the recovery email address of the user. If a new recovery email address is specified, then the error EMAIL_UNCONFIRMED is returned and the email address will not be changed until the new email has been confirmed. The application should periodically call getPasswordState to check whether the email address has been confirmed. +//-If new_recovery_email_address is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation @password Password of the current user @new_recovery_email_address New recovery email address +setRecoveryEmailAddress password:string new_recovery_email_address:string = PasswordState; + +//@description Requests to send a password recovery code to an email address that was previously set up +requestPasswordRecovery = PasswordRecoveryInfo; + +//@description Recovers the password using a recovery code sent to an email address that was previously set up @recovery_code Recovery code to check +recoverPassword recovery_code:string = PasswordState; + +//@description Creates a new temporary password for processing payments @password Persistent user password @valid_for Time during which the temporary password will be valid, in seconds; should be between 60 and 86400 +createTemporaryPassword password:string valid_for:int32 = TemporaryPasswordState; + +//@description Returns information about the current temporary password +getTemporaryPasswordState = TemporaryPasswordState; + + +//@description Handles a DC_UPDATE push service notification. Can be called before authorization @dc Value of the "dc" parameter of the notification @addr Value of the "addr" parameter of the notification +processDcUpdate dc:string addr:string = Ok; + + +//@description Returns the current user +getMe = User; + +//@description Returns information about a user by their identifier. This is an offline request if the current user is not a bot @user_id User identifier +getUser user_id:int32 = User; + +//@description Returns full information about a user by their identifier @user_id User identifier +getUserFullInfo user_id:int32 = UserFullInfo; + +//@description Returns information about a basic group by its identifier. This is an offline request if the current user is not a bot @basic_group_id Basic group identifier +getBasicGroup basic_group_id:int32 = BasicGroup; + +//@description Returns full information about a basic group by its identifier @basic_group_id Basic group identifier +getBasicGroupFullInfo basic_group_id:int32 = BasicGroupFullInfo; + +//@description Returns information about a supergroup or channel by its identifier. This is an offline request if the current user is not a bot @supergroup_id Supergroup or channel identifier +getSupergroup supergroup_id:int32 = Supergroup; + +//@description Returns full information about a supergroup or channel by its identifier, cached for up to 1 minute @supergroup_id Supergroup or channel identifier +getSupergroupFullInfo supergroup_id:int32 = SupergroupFullInfo; + +//@description Returns information about a secret chat by its identifier. This is an offline request @secret_chat_id Secret chat identifier +getSecretChat secret_chat_id:int32 = SecretChat; + +//@description Returns information about a chat by its identifier, this is an offline request if the current user is not a bot @chat_id Chat identifier +getChat chat_id:int53 = Chat; + +//@description Returns information about a message @chat_id Identifier of the chat the message belongs to @message_id Identifier of the message to get +getMessage chat_id:int53 message_id:int53 = Message; + +//@description Returns information about a message that is replied by given message @chat_id Identifier of the chat the message belongs to @message_id Identifier of the message reply to which get +getRepliedMessage chat_id:int53 message_id:int53 = Message; + +//@description Returns information about a pinned chat message @chat_id Identifier of the chat the message belongs to +getChatPinnedMessage chat_id:int53 = Message; + +//@description Returns information about messages. If a message is not found, returns null on the corresponding position of the result @chat_id Identifier of the chat the messages belong to @message_ids Identifiers of the messages to get +getMessages chat_id:int53 message_ids:vector = Messages; + +//@description Returns information about a file; this is an offline request @file_id Identifier of the file to get +getFile file_id:int32 = File; + +//@description Returns information about a file by its remote ID; this is an offline request. Can be used to register a URL as a file for further uploading, or sending as a message @remote_file_id Remote identifier of the file to get @file_type File type, if known +getRemoteFile remote_file_id:string file_type:FileType = File; + +//@description Returns an ordered list of chats. Chats are sorted by the pair (order, chat_id) in decreasing order. (For example, to get a list of chats from the beginning, the offset_order should be equal to 2^63 - 1). +//-For optimal performance the number of returned chats is chosen by the library. @offset_order Chat order to return chats from @offset_chat_id Chat identifier to return chats from +//@limit The maximum number of chats to be returned. It is possible that fewer chats than the limit are returned even if the end of the list is not reached +getChats offset_order:int64 offset_chat_id:int53 limit:int32 = Chats; + +//@description Searches a public chat by its username. Currently only private chats, supergroups and channels can be public. Returns the chat if found; otherwise an error is returned @username Username to be resolved +searchPublicChat username:string = Chat; + +//@description Searches public chats by looking for specified query in their username and title. Currently only private chats, supergroups and channels can be public. Returns a meaningful number of results. Returns nothing if the length of the searched username prefix is less than 5. Excludes private chats with contacts and chats from the chat list from the results @query Query to search for +searchPublicChats query:string = Chats; + +//@description Searches for the specified query in the title and username of already known chats, this is an offline request. Returns chats in the order seen in the chat list @query Query to search for. If the query is empty, returns up to 20 recently found chats @limit Maximum number of chats to be returned +searchChats query:string limit:int32 = Chats; + +//@description Searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the chat list @query Query to search for @limit Maximum number of chats to be returned +searchChatsOnServer query:string limit:int32 = Chats; + +//@description Returns a list of frequently used chats. Supported only if the chat info database is enabled @category Category of chats to be returned @limit Maximum number of chats to be returned; up to 30 +getTopChats category:TopChatCategory limit:int32 = Chats; + +//@description Removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled @category Category of frequently used chats @chat_id Chat identifier +removeTopChat category:TopChatCategory chat_id:int53 = Ok; + +//@description Adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first @chat_id Identifier of the chat to add +addRecentlyFoundChat chat_id:int53 = Ok; + +//@description Removes a chat from the list of recently found chats @chat_id Identifier of the chat to be removed +removeRecentlyFoundChat chat_id:int53 = Ok; + +//@description Clears the list of recently found chats +clearRecentlyFoundChats = Ok; + +//@description Checks whether a username can be set for a chat @chat_id Chat identifier; should be identifier of a supergroup chat, or a channel chat, or a private chat with self, or zero if chat is being created @username Username to be checked +checkChatUsername chat_id:int64 username:string = CheckChatUsernameResult; + +//@description Returns a list of public chats created by the user +getCreatedPublicChats = Chats; + + +//@description Returns a list of common chats with a given user. Chats are sorted by their type and creation date @user_id User identifier @offset_chat_id Chat identifier starting from which to return chats; use 0 for the first request @limit Maximum number of chats to be returned; up to 100 +getGroupsInCommon user_id:int32 offset_chat_id:int53 limit:int32 = Chats; + + +//@description Returns messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing message_id). +//-For optimal performance the number of returned messages is chosen by the library. This is an offline request if only_local is true +//@chat_id Chat identifier +//@from_message_id Identifier of the message starting from which history must be fetched; use 0 to get results from the beginning (i.e., from oldest to newest) +//@offset Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages +//@limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +//@only_local If true, returns only messages that are available locally without sending network requests +getChatHistory chat_id:int53 from_message_id:int53 offset:int32 limit:int32 only_local:Bool = Messages; + +//@description Deletes all messages in the chat only for the user. Cannot be used in channels and public supergroups @chat_id Chat identifier @remove_from_chat_list Pass true if the chat should be removed from the chats list +deleteChatHistory chat_id:int53 remove_from_chat_list:Bool = Ok; + +//@description Searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing message_id. Cannot be used in secret chats with a non-empty query +//-(searchSecretMessages should be used instead), or without an enabled message database. For optimal performance the number of returned messages is chosen by the library +//@chat_id Identifier of the chat in which to search messages +//@query Query to search for +//@sender_user_id If not 0, only messages sent by the specified user will be returned. Not supported in secret chats +//@from_message_id Identifier of the message starting from which history must be fetched; use 0 to get results from the beginning +//@offset Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages +//@limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +//@filter Filter for message content in the search results +searchChatMessages chat_id:int53 query:string sender_user_id:int32 from_message_id:int53 offset:int32 limit:int32 filter:SearchMessagesFilter = Messages; + +//@description Searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chat_id, message_id)). +//-For optimal performance the number of returned messages is chosen by the library +//@query Query to search for +//@offset_date The date of the message starting from which the results should be fetched. Use 0 or any date in the future to get results from the beginning +//@offset_chat_id The chat identifier of the last found message, or 0 for the first request +//@offset_message_id The message identifier of the last found message, or 0 for the first request +//@limit The maximum number of messages to be returned, up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +searchMessages query:string offset_date:int32 offset_chat_id:int53 offset_message_id:int53 limit:int32 = Messages; + +//@description Searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance the number of returned messages is chosen by the library +//@chat_id Identifier of the chat in which to search. Specify 0 to search in all secret chats @query Query to search for. If empty, searchChatMessages should be used instead +//@from_search_id The identifier from the result of a previous request, use 0 to get results from the beginning +//@limit Maximum number of messages to be returned; up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached +//@filter A filter for the content of messages in the search results +searchSecretMessages chat_id:int53 query:string from_search_id:int64 limit:int32 filter:SearchMessagesFilter = FoundMessages; + +//@description Searches for call messages. Returns the results in reverse chronological order (i. e., in order of decreasing message_id). For optimal performance the number of returned messages is chosen by the library +//@from_message_id Identifier of the message from which to search; use 0 to get results from the beginning +//@limit The maximum number of messages to be returned; up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached @only_missed If true, returns only messages with missed calls +searchCallMessages from_message_id:int53 limit:int32 only_missed:Bool = Messages; + +//@description Returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user @chat_id Chat identifier @limit Maximum number of messages to be returned +searchChatRecentLocationMessages chat_id:int53 limit:int32 = Messages; + +//@description Returns all active live locations that should be updated by the client. The list is persistent across application restarts only if the message database is used +getActiveLiveLocationMessages = Messages; + +//@description Returns the last message sent in a chat no later than the specified date @chat_id Chat identifier @date Point in time (Unix timestamp) relative to which to search for messages +getChatMessageByDate chat_id:int53 date:int32 = Message; + + +//@description Returns a public HTTPS link to a message. Available only for messages in public supergroups and channels +//@chat_id Identifier of the chat to which the message belongs +//@message_id Identifier of the message +//@for_album Pass true if a link for a whole media album should be returned +getPublicMessageLink chat_id:int53 message_id:int53 for_album:Bool = PublicMessageLink; + + +//@description Sends a message. Returns the sent message @chat_id Target chat @reply_to_message_id Identifier of the message to reply to or 0 +//@disable_notification Pass true to disable notification for the message. Not supported in secret chats @from_background Pass true if the message is sent from the background +//@reply_markup Markup for replying to the message; for bots only @input_message_content The content of the message to be sent +sendMessage chat_id:int53 reply_to_message_id:int53 disable_notification:Bool from_background:Bool reply_markup:ReplyMarkup input_message_content:InputMessageContent = Message; + +//@description Sends messages grouped together into an album. Currently only photo and video messages can be grouped into an album. Returns sent messages @chat_id Target chat @reply_to_message_id Identifier of a message to reply to or 0 +//@disable_notification Pass true to disable notification for the messages. Not supported in secret chats @from_background Pass true if the messages are sent from the background +//@input_message_contents Contents of messages to be sent +sendMessageAlbum chat_id:int53 reply_to_message_id:int53 disable_notification:Bool from_background:Bool input_message_contents:vector = Messages; + +//@description Invites a bot to a chat (if it is not yet a member) and sends it the /start command. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message +//@bot_user_id Identifier of the bot @chat_id Identifier of the target chat @parameter A hidden parameter sent to the bot for deep linking purposes (https://api.telegram.org/bots#deep-linking) +sendBotStartMessage bot_user_id:int32 chat_id:int53 parameter:string = Message; + +//@description Sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message @chat_id Target chat @reply_to_message_id Identifier of a message to reply to or 0 +//@disable_notification Pass true to disable notification for the message. Not supported in secret chats @from_background Pass true if the message is sent from background +//@query_id Identifier of the inline query @result_id Identifier of the inline result +sendInlineQueryResultMessage chat_id:int53 reply_to_message_id:int53 disable_notification:Bool from_background:Bool query_id:int64 result_id:string = Message; + +//@description Forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in message_ids. If a message can't be forwarded, null will be returned instead of the message +//@chat_id Identifier of the chat to which to forward messages @from_chat_id Identifier of the chat from which to forward messages @message_ids Identifiers of the messages to forward +//@disable_notification Pass true to disable notification for the message, doesn't work if messages are forwarded to a secret chat @from_background Pass true if the message is sent from the background +//@as_album True, if the messages should be grouped into an album after forwarding. For this to work, no more than 10 messages may be forwarded, and all of them must be photo or video messages +forwardMessages chat_id:int53 from_chat_id:int53 message_ids:vector disable_notification:Bool from_background:Bool as_album:Bool = Messages; + +//@description Changes the current TTL setting (sets a new self-destruct timer) in a secret chat and sends the corresponding message @chat_id Chat identifier @ttl New TTL value, in seconds +sendChatSetTtlMessage chat_id:int53 ttl:int32 = Message; + +//@description Sends a notification about a screenshot taken in a chat. Supported only in private and secret chats @chat_id Chat identifier +sendChatScreenshotTakenNotification chat_id:int53 = Ok; + +//@description Deletes messages @chat_id Chat identifier @message_ids Identifiers of the messages to be deleted @revoke Pass true to try to delete outgoing messages for all chat members (may fail if messages are too old). Always true for supergroups, channels and secret chats +deleteMessages chat_id:int53 message_ids:vector revoke:Bool = Ok; + +//@description Deletes all messages sent by the specified user to a chat. Supported only in supergroups; requires can_delete_messages administrator privileges @chat_id Chat identifier @user_id User identifier +deleteChatMessagesFromUser chat_id:int53 user_id:int32 = Ok; + + +//@description Edits the text of a message (or a text of a game message). Non-bot users can edit messages for a limited period of time. Returns the edited message after the edit is completed on the server side +//@chat_id The chat the message belongs to @message_id Identifier of the message @reply_markup The new message reply markup; for bots only @input_message_content New text content of the message. Should be of type InputMessageText +editMessageText chat_id:int53 message_id:int53 reply_markup:ReplyMarkup input_message_content:InputMessageContent = Message; + +//@description Edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed server-side +//@chat_id The chat the message belongs to @message_id Identifier of the message @reply_markup Tew message reply markup; for bots only @location New location content of the message; may be null. Pass null to stop sharing the live location +editMessageLiveLocation chat_id:int53 message_id:int53 reply_markup:ReplyMarkup location:location = Message; + +//@description Edits the message content caption. Non-bots can edit messages for a limited period of time. Returns the edited message after the edit is completed server-side +//@chat_id The chat the message belongs to @message_id Identifier of the message @reply_markup The new message reply markup; for bots only @caption New message content caption; 0-200 characters +editMessageCaption chat_id:int53 message_id:int53 reply_markup:ReplyMarkup caption:formattedText = Message; + +//@description Edits the message reply markup; for bots only. Returns the edited message after the edit is completed server-side +//@chat_id The chat the message belongs to @message_id Identifier of the message @reply_markup New message reply markup +editMessageReplyMarkup chat_id:int53 message_id:int53 reply_markup:ReplyMarkup = Message; + +//@description Edits the text of an inline text or game message sent via a bot; for bots only @inline_message_id Inline message identifier @reply_markup New message reply markup @input_message_content New text content of the message. Should be of type InputMessageText +editInlineMessageText inline_message_id:string reply_markup:ReplyMarkup input_message_content:InputMessageContent = Ok; + +//@description Edits the content of a live location in an inline message sent via a bot; for bots only @inline_message_id Inline message identifier @reply_markup New message reply markup @location New location content of the message; may be null. Pass null to stop sharing the live location +editInlineMessageLiveLocation inline_message_id:string reply_markup:ReplyMarkup location:location = Ok; + +//@description Edits the caption of an inline message sent via a bot; for bots only @inline_message_id Inline message identifier @reply_markup New message reply markup @caption New message content caption; 0-200 characters +editInlineMessageCaption inline_message_id:string reply_markup:ReplyMarkup caption:formattedText = Ok; + +//@description Edits the reply markup of an inline message sent via a bot; for bots only @inline_message_id Inline message identifier @reply_markup New message reply markup +editInlineMessageReplyMarkup inline_message_id:string reply_markup:ReplyMarkup = Ok; + + +//@description Returns all entities (mentions, hashtags, cashtags, bot commands, URLs, and email addresses) contained in the text. This is an offline method. Can be called before authorization. Can be called synchronously @text The text in which to look for entites +getTextEntities text:string = TextEntities; + +//@description Parses Bold, Italic, Code, Pre, PreCode and TextUrl entities contained in the text. This is an offline method. Can be called before authorization. Can be called synchronously @text The text which should be parsed @parse_mode Text parse mode +parseTextEntities text:string parse_mode:TextParseMode = FormattedText; + +//@description Returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. This is an offline method. Can be called before authorization. Can be called synchronously @file_name The name of the file or path to the file +getFileMimeType file_name:string = Text; + +//@description Returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. This is an offline method. Can be called before authorization. Can be called synchronously @mime_type The MIME type of the file +getFileExtension mime_type:string = Text; + + +//@description Sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires @bot_user_id The identifier of the target bot +//@chat_id Identifier of the chat, where the query was sent @user_location Location of the user, only if needed @query Text of the query @offset Offset of the first entry to return +getInlineQueryResults bot_user_id:int32 chat_id:int53 user_location:location query:string offset:string = InlineQueryResults; + +//@description Sets the result of an inline query; for bots only @inline_query_id Identifier of the inline query @is_personal True, if the result of the query can be cached for the specified user +//@results The results of the query @cache_time Allowed time to cache the results of the query, in seconds @next_offset Offset for the next inline query; pass an empty string if there are no more results +//@switch_pm_text If non-empty, this text should be shown on the button that opens a private chat with the bot and sends a start message to the bot with the parameter switch_pm_parameter @switch_pm_parameter The parameter for the bot start message +answerInlineQuery inline_query_id:int64 is_personal:Bool results:vector cache_time:int32 next_offset:string switch_pm_text:string switch_pm_parameter:string = Ok; + + +//@description Sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires @chat_id Identifier of the chat with the message @message_id Identifier of the message from which the query originated @payload Query payload +getCallbackQueryAnswer chat_id:int53 message_id:int53 payload:CallbackQueryPayload = CallbackQueryAnswer; + +//@description Sets the result of a callback query; for bots only @callback_query_id Identifier of the callback query @text Text of the answer @show_alert If true, an alert should be shown to the user instead of a toast notification @url URL to be opened @cache_time Time during which the result of the query can be cached, in seconds +answerCallbackQuery callback_query_id:int64 text:string show_alert:Bool url:string cache_time:int32 = Ok; + + +//@description Sets the result of a shipping query; for bots only @shipping_query_id Identifier of the shipping query @shipping_options Available shipping options @error_message An error message, empty on success +answerShippingQuery shipping_query_id:int64 shipping_options:vector error_message:string = Ok; + +//@description Sets the result of a pre-checkout query; for bots only @pre_checkout_query_id Identifier of the pre-checkout query @error_message An error message, empty on success +answerPreCheckoutQuery pre_checkout_query_id:int64 error_message:string = Ok; + + +//@description Updates the game score of the specified user in the game; for bots only @chat_id The chat to which the message with the game @message_id Identifier of the message @edit_message True, if the message should be edited @user_id User identifier @score The new score +//@force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table +setGameScore chat_id:int53 message_id:int53 edit_message:Bool user_id:int32 score:int32 force:Bool = Message; + +//@description Updates the game score of the specified user in a game; for bots only @inline_message_id Inline message identifier @edit_message True, if the message should be edited @user_id User identifier @score The new score +//@force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table +setInlineGameScore inline_message_id:string edit_message:Bool user_id:int32 score:int32 force:Bool = Ok; + +//@description Returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only @chat_id The chat that contains the message with the game @message_id Identifier of the message @user_id User identifier +getGameHighScores chat_id:int53 message_id:int53 user_id:int32 = GameHighScores; + +//@description Returns game high scores and some part of the high score table in the range of the specified user; for bots only @inline_message_id Inline message identifier @user_id User identifier +getInlineGameHighScores inline_message_id:string user_id:int32 = GameHighScores; + + +//@description Deletes the default reply markup from a chat. Must be called after a one-time keyboard or a ForceReply reply markup has been used. UpdateChatReplyMarkup will be sent if the reply markup will be changed @chat_id Chat identifier +//@message_id The message identifier of the used keyboard +deleteChatReplyMarkup chat_id:int53 message_id:int53 = Ok; + + +//@description Sends a notification about user activity in a chat @chat_id Chat identifier @action The action description +sendChatAction chat_id:int53 action:ChatAction = Ok; + + +//@description This method should be called if the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats) @chat_id Chat identifier +openChat chat_id:int53 = Ok; + +//@description This method should be called if the chat is closed by the user. Many useful activities depend on the chat being opened or closed @chat_id Chat identifier +closeChat chat_id:int53 = Ok; + +//@description This method should be called if messages are being viewed by the user. Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels) @chat_id Chat identifier @message_ids The identifiers of the messages being viewed +//@force_read True, if messages in closed chats should be marked as read +viewMessages chat_id:int53 message_ids:vector force_read:Bool = Ok; + +//@description This method should be called if the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed @chat_id Chat identifier of the message @message_id Identifier of the message with the opened content +openMessageContent chat_id:int53 message_id:int53 = Ok; + + +//@description Marks all mentions in a chat as read @chat_id Chat identifier +readAllChatMentions chat_id:int53 = Ok; + + +//@description Returns an existing chat corresponding to a given user @user_id User identifier @force If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect +createPrivateChat user_id:int32 force:Bool = Chat; + +//@description Returns an existing chat corresponding to a known basic group @basic_group_id Basic group identifier @force If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect +createBasicGroupChat basic_group_id:int32 force:Bool = Chat; + +//@description Returns an existing chat corresponding to a known supergroup or channel @supergroup_id Supergroup or channel identifier @force If true, the chat will be created without network request. In this case all information about the chat except its type, title and photo can be incorrect +createSupergroupChat supergroup_id:int32 force:Bool = Chat; + +//@description Returns an existing chat corresponding to a known secret chat @secret_chat_id Secret chat identifier +createSecretChat secret_chat_id:int32 = Chat; + +//@description Creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns the newly created chat @user_ids Identifiers of users to be added to the basic group @title Title of the new basic group; 1-255 characters +createNewBasicGroupChat user_ids:vector title:string = Chat; + +//@description Creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat @title Title of the new chat; 1-255 characters @is_channel True, if a channel chat should be created @param_description Chat description; 0-255 characters +createNewSupergroupChat title:string is_channel:Bool description:string = Chat; + +//@description Creates a new secret chat. Returns the newly created chat @user_id Identifier of the target user +createNewSecretChat user_id:int32 = Chat; + +//@description Creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom. Deactivates the original basic group @chat_id Identifier of the chat to upgrade +upgradeBasicGroupChatToSupergroupChat chat_id:int53 = Chat; + + +//@description Changes the chat title. Supported only for basic groups, supergroups and channels. Requires administrator rights in basic groups and the appropriate administrator rights in supergroups and channels. The title will not be changed until the request to the server has been completed +//@chat_id Chat identifier @title New title of the chat; 1-255 characters +setChatTitle chat_id:int53 title:string = Ok; + +//@description Changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires administrator rights in basic groups and the appropriate administrator rights in supergroups and channels. The photo will not be changed before request to the server has been completed +//@chat_id Chat identifier @photo New chat photo. You can use a zero InputFileId to delete the chat photo. Files that are accessible only by HTTP URL are not acceptable +setChatPhoto chat_id:int53 photo:InputFile = Ok; + +//@description Changes the draft message in a chat @chat_id Chat identifier @draft_message New draft message; may be null +setChatDraftMessage chat_id:int53 draft_message:draftMessage = Ok; + +//@description Changes the pinned state of a chat. You can pin up to GetOption("pinned_chat_count_max") non-secret chats and the same number of secret chats @chat_id Chat identifier @is_pinned New value of is_pinned +toggleChatIsPinned chat_id:int53 is_pinned:Bool = Ok; + +//@description Changes client data associated with a chat @chat_id Chat identifier @client_data New value of client_data +setChatClientData chat_id:int53 client_data:string = Ok; + +//@description Adds a new member to a chat. Members can't be added to private or secret chats. Members will not be added until the chat state has been synchronized with the server +//@chat_id Chat identifier @user_id Identifier of the user @forward_limit The number of earlier messages from the chat to be forwarded to the new member; up to 300. Ignored for supergroups and channels +addChatMember chat_id:int53 user_id:int32 forward_limit:int32 = Ok; + +//@description Adds multiple new members to a chat. Currently this option is only available for supergroups and channels. This option can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Members will not be added until the chat state has been synchronized with the server +//@chat_id Chat identifier @user_ids Identifiers of the users to be added to the chat +addChatMembers chat_id:int53 user_ids:vector = Ok; + +//@description Changes the status of a chat member, needs appropriate privileges. This function is currently not suitable for adding new members to the chat; instead, use addChatMember. The chat member status will not be changed until it has been synchronized with the server +//@chat_id Chat identifier @user_id User identifier @status The new status of the member in the chat +setChatMemberStatus chat_id:int53 user_id:int32 status:ChatMemberStatus = Ok; + +//@description Returns information about a single member of a chat @chat_id Chat identifier @user_id User identifier +getChatMember chat_id:int53 user_id:int32 = ChatMember; + +//@description Searches for a specified query in the first name, last name and username of the members of a specified chat. Requires administrator rights in channels @chat_id Chat identifier @query Query to search for @limit The maximum number of users to be returned +searchChatMembers chat_id:int53 query:string limit:int32 = ChatMembers; + +//@description Returns a list of users who are administrators of the chat @chat_id Chat identifier +getChatAdministrators chat_id:int53 = Users; + + +//@description Changes the order of pinned chats @chat_ids The new list of pinned chats +setPinnedChats chat_ids:vector = Ok; + + +//@description Asynchronously downloads a file from the cloud. updateFile will be used to notify about the download progress and successful completion of the download. Returns file state just after the download has been started +//@file_id Identifier of the file to download +//@priority Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile was called will be downloaded first +downloadFile file_id:int32 priority:int32 = File; + +//@description Stops the downloading of a file. If a file has already been downloaded, does nothing @file_id Identifier of a file to stop downloading @only_if_pending Pass true to stop downloading only if it hasn't been started, i.e. request hasn't been sent to server +cancelDownloadFile file_id:int32 only_if_pending:Bool = Ok; + +//@description Asynchronously uploads a file to the cloud without sending it in a message. updateFile will be used to notify about upload progress and successful completion of the upload. The file will not have a persistent remote identifier until it will be sent in a message @file File to upload @file_type File type +//@priority Priority of the upload (1-32). The higher the priority, the earlier the file will be uploaded. If the priorities of two files are equal, then the first one for which uploadFile was called will be uploaded first +uploadFile file:InputFile file_type:FileType priority:int32 = File; + +//@description Stops the uploading of a file. Supported only for files uploaded by using uploadFile. For other files the behavior is undefined @file_id Identifier of the file to stop uploading +cancelUploadFile file_id:int32 = Ok; + +//@description The next part of a file was generated +//@generation_id The identifier of the generation process +//@expected_size Expected size of the generated file, in bytes; 0 if unknown +//@local_prefix_size The number of bytes already generated +setFileGenerationProgress generation_id:int64 expected_size:int32 local_prefix_size:int32 = Ok; + +//@description Finishes the file generation +//@generation_id The identifier of the generation process +//@error If set, means that file generation has failed and should be terminated +finishFileGeneration generation_id:int64 error:error = Ok; + +//@description Deletes a file from the TDLib file cache @file_id Identifier of the file to delete +deleteFile file_id:int32 = Ok; + + +//@description Generates a new invite link for a chat; the previously generated link is revoked. Available for basic groups, supergroups, and channels. In basic groups this can be called only by the group's creator; in supergroups and channels this requires appropriate administrator rights @chat_id Chat identifier +generateChatInviteLink chat_id:int53 = ChatInviteLink; + +//@description Checks the validity of an invite link for a chat and returns information about the corresponding chat @invite_link Invite link to be checked; should begin with "https://t.me/joinchat/", "https://telegram.me/joinchat/", or "https://telegram.dog/joinchat/" +checkChatInviteLink invite_link:string = ChatInviteLinkInfo; + +//@description Uses an invite link to add the current user to the chat if possible. The new member will not be added until the chat state has been synchronized with the server +//@invite_link Invite link to import; should begin with "https://t.me/joinchat/", "https://telegram.me/joinchat/", or "https://telegram.dog/joinchat/" +joinChatByInviteLink invite_link:string = Chat; + + +//@description Creates a new call @user_id Identifier of the user to be called @protocol Description of the call protocols supported by the client +createCall user_id:int32 protocol:callProtocol = CallId; + +//@description Accepts an incoming call @call_id Call identifier @protocol Description of the call protocols supported by the client +acceptCall call_id:int32 protocol:callProtocol = Ok; + +//@description Discards a call @call_id Call identifier @is_disconnected True, if the user was disconnected @duration The call duration, in seconds @connection_id Identifier of the connection used during the call +discardCall call_id:int32 is_disconnected:Bool duration:int32 connection_id:int64 = Ok; + +//@description Sends a call rating @call_id Call identifier @rating Call rating; 1-5 @comment An optional user comment if the rating is less than 5 +sendCallRating call_id:int32 rating:int32 comment:string = Ok; + +//@description Sends debug information for a call @call_id Call identifier @debug_information Debug information in application-specific format +sendCallDebugInformation call_id:int32 debug_information:string = Ok; + + + +//@description Adds a user to the blacklist @user_id User identifier +blockUser user_id:int32 = Ok; + +//@description Removes a user from the blacklist @user_id User identifier +unblockUser user_id:int32 = Ok; + +//@description Returns users that were blocked by the current user @offset Number of users to skip in the result; must be non-negative @limit Maximum number of users to return; up to 100 +getBlockedUsers offset:int32 limit:int32 = Users; + + +//@description Adds new contacts or edits existing contacts; contacts' user identifiers are ignored @contacts The list of contacts to import or edit +importContacts contacts:vector = ImportedContacts; + +//@description Searches for the specified query in the first names, last names and usernames of the known user contacts @query Query to search for; can be empty to return all contacts @limit Maximum number of users to be returned +searchContacts query:string limit:int32 = Users; + +//@description Removes users from the contacts list @user_ids Identifiers of users to be deleted +removeContacts user_ids:vector = Ok; + +//@description Returns the total number of imported contacts +getImportedContactCount = Count; + +//@description Changes imported contacts using the list of current user contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. +//-Query result depends on the result of the previous query, so only one query is possible at the same time @contacts The new list of contacts +changeImportedContacts contacts:vector = ImportedContacts; + +//@description Clears all imported contacts +clearImportedContacts = Ok; + + +//@description Returns the profile photos of a user. The result of this query may be outdated: some photos might have been deleted already @user_id User identifier @offset The number of photos to skip; must be non-negative @limit Maximum number of photos to be returned; up to 100 +getUserProfilePhotos user_id:int32 offset:int32 limit:int32 = UserProfilePhotos; + + +//@description Returns stickers from the installed sticker sets that correspond to a given emoji. If the emoji is not empty, favorite and recently used stickers may also be returned @emoji String representation of emoji. If empty, returns all known installed stickers @limit Maximum number of stickers to be returned +getStickers emoji:string limit:int32 = Stickers; + +//@description Searches for stickers from public sticker sets that correspond to a given emoji @emoji String representation of emoji; must be non-empty @limit Maximum number of stickers to be returned +searchStickers emoji:string limit:int32 = Stickers; + +//@description Returns a list of installed sticker sets @is_masks Pass true to return mask sticker sets; pass false to return ordinary sticker sets +getInstalledStickerSets is_masks:Bool = StickerSets; + +//@description Returns a list of archived sticker sets @is_masks Pass true to return mask stickers sets; pass false to return ordinary sticker sets @offset_sticker_set_id Identifier of the sticker set from which to return the result @limit Maximum number of sticker sets to return +getArchivedStickerSets is_masks:Bool offset_sticker_set_id:int64 limit:int32 = StickerSets; + +//@description Returns a list of trending sticker sets +getTrendingStickerSets = StickerSets; + +//@description Returns a list of sticker sets attached to a file. Currently only photos and videos can have attached sticker sets @file_id File identifier +getAttachedStickerSets file_id:int32 = StickerSets; + +//@description Returns information about a sticker set by its identifier @set_id Identifier of the sticker set +getStickerSet set_id:int64 = StickerSet; + +//@description Searches for a sticker set by its name @name Name of the sticker set +searchStickerSet name:string = StickerSet; + +//@description Searches for installed sticker sets by looking for specified query in their title and name @is_masks Pass true to return mask sticker sets; pass false to return ordinary sticker sets @query Query to search for @limit Maximum number of sticker sets to return +searchInstalledStickerSets is_masks:Bool query:string limit:int32 = StickerSets; + +//@description Searches for ordinary sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results @query Query to search for +searchStickerSets query:string = StickerSets; + +//@description Installs/uninstalls or activates/archives a sticker set @set_id Identifier of the sticker set @is_installed The new value of is_installed @is_archived The new value of is_archived. A sticker set can't be installed and archived simultaneously +changeStickerSet set_id:int64 is_installed:Bool is_archived:Bool = Ok; + +//@description Informs the server that some trending sticker sets have been viewed by the user @sticker_set_ids Identifiers of viewed trending sticker sets +viewTrendingStickerSets sticker_set_ids:vector = Ok; + +//@description Changes the order of installed sticker sets @is_masks Pass true to change the order of mask sticker sets; pass false to change the order of ordinary sticker sets @sticker_set_ids Identifiers of installed sticker sets in the new correct order +reorderInstalledStickerSets is_masks:Bool sticker_set_ids:vector = Ok; + +//@description Returns a list of recently used stickers @is_attached Pass true to return stickers and masks that were recently attached to photos or video files; pass false to return recently sent stickers +getRecentStickers is_attached:Bool = Stickers; + +//@description Manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set can be added to this list +//@is_attached Pass true to add the sticker to the list of stickers recently attached to photo or video files; pass false to add the sticker to the list of recently sent stickers @sticker Sticker file to add +addRecentSticker is_attached:Bool sticker:InputFile = Stickers; + +//@description Removes a sticker from the list of recently used stickers @is_attached Pass true to remove the sticker from the list of stickers recently attached to photo or video files; pass false to remove the sticker from the list of recently sent stickers @sticker Sticker file to delete +removeRecentSticker is_attached:Bool sticker:InputFile = Ok; + +//@description Clears the list of recently used stickers @is_attached Pass true to clear the list of stickers recently attached to photo or video files; pass false to clear the list of recently sent stickers +clearRecentStickers is_attached:Bool = Ok; + +//@description Returns favorite stickers +getFavoriteStickers = Stickers; + +//@description Adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set can be added to this list +//@sticker Sticker file to add +addFavoriteSticker sticker:InputFile = Ok; + +//@description Removes a sticker from the list of favorite stickers @sticker Sticker file to delete from the list +removeFavoriteSticker sticker:InputFile = Ok; + +//@description Returns emoji corresponding to a sticker @sticker Sticker file identifier +getStickerEmojis sticker:InputFile = StickerEmojis; + + +//@description Returns saved animations +getSavedAnimations = Animations; + +//@description Manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type "video/mp4" can be added to the list +//@animation The animation file to be added. Only animations known to the server (i.e. successfully sent via a message) can be added to the list +addSavedAnimation animation:InputFile = Ok; + +//@description Removes an animation from the list of saved animations @animation Animation file to be removed +removeSavedAnimation animation:InputFile = Ok; + + +//@description Returns up to 20 recently used inline bots in the order of their last usage +getRecentInlineBots = Users; + + +//@description Searches for recently used hashtags by their prefix @prefix Hashtag prefix to search for @limit Maximum number of hashtags to be returned +searchHashtags prefix:string limit:int32 = Hashtags; + +//@description Removes a hashtag from the list of recently used hashtags @hashtag Hashtag to delete +removeRecentHashtag hashtag:string = Ok; + + +//@description Returns a web page preview by the text of the message. Do not call this function too often. Returns a 404 error if the web page has no preview @text Message text with formatting +getWebPagePreview text:formattedText = WebPage; + +//@description Returns an instant view version of a web page if available. Returns a 404 error if the web page has no instant view page @url The web page URL @force_full If true, the full instant view for the web page will be returned +getWebPageInstantView url:string force_full:Bool = WebPageInstantView; + + +//@description Returns the notification settings for a given scope @scope Scope for which to return the notification settings information +getNotificationSettings scope:NotificationSettingsScope = NotificationSettings; + +//@description Changes notification settings for a given scope @scope Scope for which to change the notification settings +//@notification_settings The new notification settings for the given scope +setNotificationSettings scope:NotificationSettingsScope notification_settings:notificationSettings = Ok; + +//@description Resets all notification settings to their default values. By default, the only muted chats are supergroups, the sound is set to "default" and message previews are shown +resetAllNotificationSettings = Ok; + + +//@description Uploads a new profile photo for the current user. If something changes, updateUser will be sent @photo Profile photo to set. inputFileId and inputFileRemote may still be unsupported +setProfilePhoto photo:InputFile = Ok; + +//@description Deletes a profile photo. If something changes, updateUser will be sent @profile_photo_id Identifier of the profile photo to delete +deleteProfilePhoto profile_photo_id:int64 = Ok; + +//@description Changes the first and last name of the current user. If something changes, updateUser will be sent @first_name The new value of the first name for the user; 1-255 characters @last_name The new value of the optional last name for the user; 0-255 characters +setName first_name:string last_name:string = Ok; + +//@description Changes the bio of the current user @bio The new value of the user bio; 0-70 characters without line feeds +setBio bio:string = Ok; + +//@description Changes the username of the current user. If something changes, updateUser will be sent @username The new value of the username. Use an empty string to remove the username +setUsername username:string = Ok; + +//@description Changes the phone number of the user and sends an authentication code to the user's new phone number. On success, returns information about the sent code +//@phone_number The new phone number of the user in international format @allow_flash_call Pass true if the code can be sent via flash call to the specified phone number @is_current_phone_number Pass true if the phone number is used on the current device. Ignored if allow_flash_call is false +changePhoneNumber phone_number:string allow_flash_call:Bool is_current_phone_number:Bool = AuthenticationCodeInfo; + +//@description Re-sends the authentication code sent to confirm a new phone number for the user. Works only if the previously received authenticationCodeInfo next_code_type was not null +resendChangePhoneNumberCode = AuthenticationCodeInfo; + +//@description Checks the authentication code sent to confirm a new phone number of the user @code Verification code received by SMS, phone call or flash call +checkChangePhoneNumberCode code:string = Ok; + + +//@description Returns all active sessions of the current user +getActiveSessions = Sessions; + +//@description Terminates a session of the current user @session_id Session identifier +terminateSession session_id:int64 = Ok; + +//@description Terminates all other sessions of the current user +terminateAllOtherSessions = Ok; + + +//@description Returns all website where the current user used Telegram to log in +getConnectedWebsites = ConnectedWebsites; + +//@description Disconnects website from the current user's Telegram account @website_id Website identifier +disconnectWebsite website_id:int64 = Ok; + +//@description Disconnects all websites from the current user's Telegram account +disconnectAllWebsites = Ok; + + +//@description Toggles the "All members are admins" setting in basic groups; requires creator privileges in the group @basic_group_id Identifier of the basic group @everyone_is_administrator New value of everyone_is_administrator +toggleBasicGroupAdministrators basic_group_id:int32 everyone_is_administrator:Bool = Ok; + + +//@description Changes the username of a supergroup or channel, requires creator privileges in the supergroup or channel @supergroup_id Identifier of the supergroup or channel @username New value of the username. Use an empty string to remove the username +setSupergroupUsername supergroup_id:int32 username:string = Ok; + +//@description Changes the sticker set of a supergroup; requires appropriate rights in the supergroup @supergroup_id Identifier of the supergroup @sticker_set_id New value of the supergroup sticker set identifier. Use 0 to remove the supergroup sticker set +setSupergroupStickerSet supergroup_id:int32 sticker_set_id:int64 = Ok; + +//@description Toggles whether all members of a supergroup can add new members; requires appropriate administrator rights in the supergroup. @supergroup_id Identifier of the supergroup @anyone_can_invite New value of anyone_can_invite +toggleSupergroupInvites supergroup_id:int32 anyone_can_invite:Bool = Ok; + +//@description Toggles sender signatures messages sent in a channel; requires appropriate administrator rights in the channel. @supergroup_id Identifier of the channel @sign_messages New value of sign_messages +toggleSupergroupSignMessages supergroup_id:int32 sign_messages:Bool = Ok; + +//@description Toggles whether the message history of a supergroup is available to new members; requires appropriate administrator rights in the supergroup. @supergroup_id The identifier of the supergroup @is_all_history_available The new value of is_all_history_available +toggleSupergroupIsAllHistoryAvailable supergroup_id:int32 is_all_history_available:Bool = Ok; + +//@description Changes information about a supergroup or channel; requires appropriate administrator rights @supergroup_id Identifier of the supergroup or channel @param_description New supergroup or channel description; 0-255 characters +setSupergroupDescription supergroup_id:int32 description:string = Ok; + +//@description Pins a message in a supergroup or channel; requires appropriate administrator rights in the supergroup or channel @supergroup_id Identifier of the supergroup or channel @message_id Identifier of the new pinned message @disable_notification True, if there should be no notification about the pinned message +pinSupergroupMessage supergroup_id:int32 message_id:int53 disable_notification:Bool = Ok; + +//@description Removes the pinned message from a supergroup or channel; requires appropriate administrator rights in the supergroup or channel @supergroup_id Identifier of the supergroup or channel +unpinSupergroupMessage supergroup_id:int32 = Ok; + +//@description Reports some messages from a user in a supergroup as spam @supergroup_id Supergroup identifier @user_id User identifier @message_ids Identifiers of messages sent in the supergroup by the user. This list must be non-empty +reportSupergroupSpam supergroup_id:int32 user_id:int32 message_ids:vector = Ok; + +//@description Returns information about members or banned users in a supergroup or channel. Can be used only if SupergroupFullInfo.can_get_members == true; additionally, administrator privileges may be required for some filters @supergroup_id Identifier of the supergroup or channel +//@filter The type of users to return. By default, supergroupMembersRecent @offset Number of users to skip @limit The maximum number of users be returned; up to 200 +getSupergroupMembers supergroup_id:int32 filter:SupergroupMembersFilter offset:int32 limit:int32 = ChatMembers; + +//@description Deletes a supergroup or channel along with all messages in the corresponding chat. This will release the supergroup or channel username and remove all members; requires creator privileges in the supergroup or channel. Chats with more than 1000 members can't be deleted using this method @supergroup_id Identifier of the supergroup or channel +deleteSupergroup supergroup_id:int32 = Ok; + + +//@description Closes a secret chat, effectively transfering its state to secretChatStateClosed @secret_chat_id Secret chat identifier +closeSecretChat secret_chat_id:int32 = Ok; + + +//@description Returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only in supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i. e., in order of decreasing event_id) +//@chat_id Chat identifier @query Search query by which to filter events @from_event_id Identifier of an event from which to return results. Use 0 to get results from the latest events @limit Maximum number of events to return; up to 100 +//@filters The types of events to return. By default, all types will be returned @user_ids User identifiers by which to filter events. By default, events relating to all users will be returned +getChatEventLog chat_id:int53 query:string from_event_id:int64 limit:int32 filters:chatEventLogFilters user_ids:vector = ChatEvents; + + +//@description Returns an invoice payment form. This method should be called when the user presses inlineKeyboardButtonBuy @chat_id Chat identifier of the Invoice message @message_id Message identifier +getPaymentForm chat_id:int53 message_id:int53 = PaymentForm; + +//@description Validates the order information provided by a user and returns the available shipping options for a flexible invoice @chat_id Chat identifier of the Invoice message @message_id Message identifier @order_info The order information, provided by the user @allow_save True, if the order information can be saved +validateOrderInfo chat_id:int53 message_id:int53 order_info:orderInfo allow_save:Bool = ValidatedOrderInfo; + +//@description Sends a filled-out payment form to the bot for final verification @chat_id Chat identifier of the Invoice message @message_id Message identifier @order_info_id Identifier returned by ValidateOrderInfo, or an empty string @shipping_option_id Identifier of a chosen shipping option, if applicable +//@credentials The credentials chosen by user for payment +sendPaymentForm chat_id:int53 message_id:int53 order_info_id:string shipping_option_id:string credentials:InputCredentials = PaymentResult; + +//@description Returns information about a successful payment @chat_id Chat identifier of the PaymentSuccessful message @message_id Message identifier +getPaymentReceipt chat_id:int53 message_id:int53 = PaymentReceipt; + +//@description Returns saved order info, if any +getSavedOrderInfo = OrderInfo; + +//@description Deletes saved order info +deleteSavedOrderInfo = Ok; + +//@description Deletes saved credentials for all payment provider bots +deleteSavedCredentials = Ok; + + +//@description Returns a user that can be contacted to get support +getSupportUser = User; + +//@description Returns background wallpapers +getWallpapers = Wallpapers; + + +//@description Registers the currently used device for receiving push notifications @device_token Device token @other_user_ids List of at most 100 user identifiers of other users currently using the client +registerDevice device_token:DeviceToken other_user_ids:vector = Ok; + + +//@description Returns t.me URLs recently visited by a newly registered user @referrer Google Play referrer to identify the user +getRecentlyVisitedTMeUrls referrer:string = TMeUrls; + + +//@description Changes user privacy settings @setting The privacy setting @rules The new privacy rules +setUserPrivacySettingRules setting:UserPrivacySetting rules:userPrivacySettingRules = Ok; + +//@description Returns the current privacy settings @setting The privacy setting +getUserPrivacySettingRules setting:UserPrivacySetting = UserPrivacySettingRules; + + +//@description Returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization +//@name The name of the option +getOption name:string = OptionValue; + +//@description Sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization +//@name The name of the option @value The new value of the option +setOption name:string value:OptionValue = Ok; + + +//@description Changes the period of inactivity after which the account of the current user will automatically be deleted @ttl New account TTL +setAccountTtl ttl:accountTtl = Ok; + +//@description Returns the period of inactivity after which the account of the current user will automatically be deleted +getAccountTtl = AccountTtl; + +//@description Deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account @reason The reason why the account was deleted; optional +deleteAccount reason:string = Ok; + + +//@description Returns information on whether the current chat can be reported as spam @chat_id Chat identifier +getChatReportSpamState chat_id:int53 = ChatReportSpamState; + +//@description Used to let the server know whether a chat is spam or not. Can be used only if ChatReportSpamState.can_report_spam is true. After this request, ChatReportSpamState.can_report_spam becomes false forever @chat_id Chat identifier @is_spam_chat If true, the chat will be reported as spam; otherwise it will be marked as not spam +changeChatReportSpamState chat_id:int53 is_spam_chat:Bool = Ok; + +//@description Reports a chat to the Telegram moderators. Supported only for supergroups, channels, or private chats with bots, since other chats can't be checked by moderators @chat_id Chat identifier @reason The reason for reporting the chat @message_ids Identifiers of reported messages, if any +reportChat chat_id:int53 reason:ChatReportReason message_ids:vector = Ok; + + +//@description Returns storage usage statistics @chat_limit Maximum number of chats with the largest storage usage for which separate statistics should be returned. All other chats will be grouped in entries with chat_id == 0. If the chat info database is not used, the chat_limit is ignored and is always set to 0 +getStorageStatistics chat_limit:int32 = StorageStatistics; + +//@description Quickly returns approximate storage usage statistics +getStorageStatisticsFast = StorageStatisticsFast; + +//@description Optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted +//@size Limit on the total size of files after deletion. Pass -1 to use the default limit +//@ttl Limit on the time that has passed since the last time a file was accessed (or creation time for some filesystems). Pass -1 to use the default limit +//@count Limit on the total count of files after deletion. Pass -1 to use the default limit +//@immunity_delay The amount of time after the creation of a file during which it can't be deleted, in seconds. Pass -1 to use the default value +//@file_types If not empty, only files with the given type(s) are considered. By default, all types except thumbnails, profile photos, stickers and wallpapers are deleted +//@chat_ids If not empty, only files from the given chats are considered. Use 0 as chat identifier to delete files not belonging to any chat (e.g., profile photos) +//@exclude_chat_ids If not empty, files from the given chats are excluded. Use 0 as chat identifier to exclude all files not belonging to any chat (e.g., profile photos) +//@chat_limit Same as in getStorageStatistics. Affects only returned statistics +optimizeStorage size:int53 ttl:int32 count:int32 immunity_delay:int32 file_types:vector chat_ids:vector exclude_chat_ids:vector chat_limit:int32 = StorageStatistics; + + +//@description Sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it should be called whenever the network is changed, even if the network type remains the same. +//-Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics @type The new network type. By default, networkTypeOther +setNetworkType type:NetworkType = Ok; + +//@description Returns network data usage statistics. Can be called before authorization @only_current If true, returns only data for the current library launch +getNetworkStatistics only_current:Bool = NetworkStatistics; + +//@description Adds the specified data to data usage statistics. Can be called before authorization @entry The network statistics entry with the data to be added to statistics +addNetworkStatistics entry:NetworkStatisticsEntry = Ok; + +//@description Resets all network data usage statistics to zero. Can be called before authorization +resetNetworkStatistics = Ok; + + +//@description Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only @pending_update_count The number of pending updates @error_message The last error message +setBotUpdatesStatus pending_update_count:int32 error_message:string = Ok; + + +//@description Uploads a PNG image with a sticker; for bots only; returns the uploaded file @user_id Sticker file owner @png_sticker PNG image with the sticker; must be up to 512 kB in size and fit in 512x512 square +uploadStickerFile user_id:int32 png_sticker:InputFile = File; + +//@description Creates a new sticker set; for bots only. Returns the newly created sticker set @user_id Sticker set owner @title Sticker set title; 1-64 characters @name Sticker set name. Can contain only English letters, digits and underscores. Must end with *"_by_"* (** is case insensitive); 1-64 characters +//@is_masks True, if stickers are masks @stickers List of stickers to be added to the set +createNewStickerSet user_id:int32 title:string name:string is_masks:Bool stickers:vector = StickerSet; + +//@description Adds a new sticker to a set; for bots only. Returns the sticker set @user_id Sticker set owner @name Sticker set name @sticker Sticker to add to the set +addStickerToSet user_id:int32 name:string sticker:inputSticker = StickerSet; + +//@description Changes the position of a sticker in the set to which it belongs; for bots only. The sticker set must have been created by the bot @sticker Sticker @position New position of the sticker in the set, zero-based +setStickerPositionInSet sticker:InputFile position:int32 = Ok; + +//@description Removes a sticker from the set to which it belongs; for bots only. The sticker set must have been created by the bot @sticker Sticker +removeStickerFromSet sticker:InputFile = Ok; + + +//@description Sends a custom request; for bots only @method The method name @parameters JSON-serialized method parameters +sendCustomRequest method:string parameters:string = CustomRequestResult; + +//@description Answers a custom query; for bots only @custom_query_id Identifier of a custom query @data JSON-serialized answer to the query +answerCustomQuery custom_query_id:int64 data:string = Ok; + + +//@description Succeeds after a specified amount of time has passed. Can be called before authorization @seconds Number of seconds before the function returns +setAlarm seconds:double = Ok; + + +//@description Uses current user IP to found his country. Returns two-letter ISO 3166-1 alpha-2 country code. Can be called before authorization +getCountryCode = Text; + +//@description Returns the default text for invitation messages to be used as a placeholder when the current user invites friends to Telegram +getInviteText = Text; + +//@description Returns the terms of service. Can be called before authorization +getTermsOfService = Text; + + +//@description Sets the proxy server for network requests. Can be called before authorization @proxy Proxy server to use. Specify null to remove the proxy server +setProxy proxy:Proxy = Ok; + +//@description Returns the proxy that is currently set up. Can be called before authorization +getProxy = Proxy; + + +//@description Does nothing; for testing only +testCallEmpty = Ok; +//@description Returns the received string; for testing only @x String to return +testCallString x:string = TestString; +//@description Returns the received bytes; for testing only @x Bytes to return +testCallBytes x:bytes = TestBytes; +//@description Returns the received vector of numbers; for testing only @x Vector of numbers to return +testCallVectorInt x:vector = TestVectorInt; +//@description Returns the received vector of objects containing a number; for testing only @x Vector of objects to return +testCallVectorIntObject x:vector = TestVectorIntObject; +//@description For testing only request. Returns the received vector of strings; for testing only @x Vector of strings to return +testCallVectorString x:vector = TestVectorString; +//@description Returns the received vector of objects containing a string; for testing only @x Vector of objects to return +testCallVectorStringObject x:vector = TestVectorStringObject; +//@description Returns the squared received number; for testing only @x Number to square +testSquareInt x:int32 = TestInt; +//@description Sends a simple network request to the Telegram servers; for testing only +testNetwork = Ok; +//@description Forces an updates.getDifference call to the Telegram servers; for testing only +testGetDifference = Ok; +//@description Does nothing and ensures that the Update object is used; for testing only +testUseUpdate = Update; +//@description Does nothing and ensures that the Error object is used; for testing only +testUseError = Error; diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d70e1d9 --- /dev/null +++ b/go.mod @@ -0,0 +1 @@ +module github.com/zelenin/go-tdlib diff --git a/tlparser/parser.go b/tlparser/parser.go new file mode 100644 index 0000000..de959e8 --- /dev/null +++ b/tlparser/parser.go @@ -0,0 +1,171 @@ +package tlparser + +import ( + "io" + "strings" + "bufio" +) + +func Parse(reader io.Reader) (*Schema, error) { + schema := &Schema{ + Types: []*Type{}, + Classes: []*Class{}, + Functions: []*Function{}, + } + + scanner := bufio.NewScanner(reader) + + hitFunctions := false + + for scanner.Scan() { + line := scanner.Text() + + switch { + case strings.HasPrefix(line, "//@description"): + if hitFunctions { + schema.Functions = append(schema.Functions, parseFunction(line, scanner)) + } else { + schema.Types = append(schema.Types, parseType(line, scanner)) + } + + case strings.HasPrefix(line, "//@class"): + schema.Classes = append(schema.Classes, parseClass(line, scanner)) + + case strings.Contains(line, "---functions---"): + hitFunctions = true + + case line == "": + + default: + bodyFields := strings.Fields(line) + name := bodyFields[0] + class := strings.TrimRight(bodyFields[len(bodyFields)-1], ";") + if hitFunctions { + schema.Functions = append(schema.Functions, &Function{ + Name: name, + Description: "", + Class: class, + Properties: []*Property{}, + }) + } else { + if name == "vector" { + name = "vector" + class = "Vector" + } + + schema.Types = append(schema.Types, &Type{ + Name: name, + Description: "", + Class: class, + Properties: []*Property{}, + }) + } + } + } + + return schema, nil +} + +func parseType(firstLine string, scanner *bufio.Scanner) *Type { + name, description, class, properties, _ := parseEntity(firstLine, scanner) + return &Type{ + Name: name, + Description: description, + Class: class, + Properties: properties, + } +} + +func parseFunction(firstLine string, scanner *bufio.Scanner) *Function { + name, description, class, properties, isSynchronous := parseEntity(firstLine, scanner) + return &Function{ + Name: name, + Description: description, + Class: class, + Properties: properties, + IsSynchronous: isSynchronous, + } +} + +func parseClass(firstLine string, scanner *bufio.Scanner) *Class { + class := &Class{ + Name: "", + Description: "", + } + + classLineParts := strings.Split(firstLine, "@") + + _, class.Name = parseProperty(classLineParts[1]) + _, class.Description = parseProperty(classLineParts[2]) + + return class +} + +func parseEntity(firstLine string, scanner *bufio.Scanner) (string, string, string, []*Property, bool) { + name := "" + description := "" + class := "" + properties := []*Property{} + + propertiesLine := strings.TrimLeft(firstLine, "//") + +Loop: + for scanner.Scan() { + line := scanner.Text() + + switch { + case strings.HasPrefix(line, "//@"): + propertiesLine += " " + strings.TrimLeft(line, "//") + + case strings.HasPrefix(line, "//-"): + propertiesLine += " " + strings.TrimLeft(line, "//-") + + default: + bodyFields := strings.Fields(line) + name = bodyFields[0] + + for _, rawProperty := range bodyFields[1 : len(bodyFields)-2] { + propertyParts := strings.Split(rawProperty, ":") + property := &Property{ + Name: propertyParts[0], + Type: propertyParts[1], + } + properties = append(properties, property) + } + class = strings.TrimRight(bodyFields[len(bodyFields)-1], ";") + break Loop + } + } + + rawProperties := strings.Split(propertiesLine, "@") + for _, rawProperty := range rawProperties[1:] { + name, value := parseProperty(rawProperty) + switch { + case name == "description": + description = value + default: + name = strings.TrimPrefix(name, "param_") + property := getProperty(properties, name) + property.Description = value + + } + } + + return name, description, class, properties, strings.Contains(description, "Can be called synchronously") +} + +func parseProperty(str string) (string, string) { + strParts := strings.Fields(str) + + return strParts[0], strings.Join(strParts[1:], " ") +} + +func getProperty(properties []*Property, name string) *Property { + for _, property := range properties { + if property.Name == name { + return property + } + } + + return nil +} diff --git a/tlparser/type.go b/tlparser/type.go new file mode 100644 index 0000000..7c00c15 --- /dev/null +++ b/tlparser/type.go @@ -0,0 +1,33 @@ +package tlparser + +type Schema struct { + Types []*Type `json:"types"` + Classes []*Class `json:"classes"` + Functions []*Function `json:"functions"` +} + +type Type struct { + Name string `json:"name"` + Description string `json:"description"` + Class string `json:"class"` + Properties []*Property `json:"properties"` +} + +type Class struct { + Name string `json:"name"` + Description string `json:"description"` +} + +type Function struct { + Name string `json:"name"` + Description string `json:"description"` + Class string `json:"class"` + Properties []*Property `json:"properties"` + IsSynchronous bool `json:"is_synchronous"` +} + +type Property struct { + Name string `json:"name"` + Type string `json:"type"` + Description string `json:"description"` +}