├── .gitignore ├── .gitmodules ├── .npmignore ├── LICENSE ├── README.md ├── index.ts ├── package.json ├── src ├── api │ ├── BaseVKApi.ts │ ├── VKApiError.ts │ ├── botsLongPoll │ │ ├── BaseUpdateProvider.ts │ │ └── BotsLongPollUpdatesProvider.ts │ ├── net.ts │ └── time.ts ├── codegen │ ├── CodeGenerator.ts │ ├── CodeLine.ts │ ├── SourceCode.ts │ ├── TypescriptCodeGenerator.ts │ ├── Utils.ts │ ├── schema │ │ ├── AliasClassScheme.ts │ │ ├── ApiMethodParam.ts │ │ ├── ApiMethodScheme.ts │ │ ├── ClassField.ts │ │ ├── ClassScheme.ts │ │ └── CustomPrimitiveScheme.ts │ └── types │ │ ├── AnyType.ts │ │ ├── BooleanType.ts │ │ ├── CustomPrimitiveType.ts │ │ ├── CustomType.ts │ │ ├── IntBoolType.ts │ │ ├── NumberType.ts │ │ ├── StringType.ts │ │ ├── Type.ts │ │ └── VectorType.ts ├── gen-types │ ├── genTypes.ts │ └── validateSchema.ts ├── generated │ ├── MethodsProps.ts │ ├── Models.ts │ ├── Responses.ts │ └── VKApi.ts └── log │ ├── BaseLogger.ts │ └── ConsoleLogger.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea 3 | node_modules 4 | public 5 | distr 6 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "src/vk-api-schema"] 2 | path = src/vk-api-schema 3 | url = git@github.com:VKCOM/vk-api-schema.git 4 | branch = master 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | public -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Abovyan Narek 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-vk-sdk 2 | 3 | VK API SDK for Node.js 4 | 5 | ## Installation 6 | 7 | To install the stable version: 8 | 9 | ```bash 10 | npm install --save node-vk-sdk 11 | ``` 12 | 13 | This assumes you are using [npm](https://www.npmjs.com/) as your package manager. 14 | If you don’t, you can access these files on [unpkg](https://unpkg.com/node-vk-sdk/), download them, or point your package manager to them. 15 | 16 | ## Importing 17 | 18 | You can import SDK using ES6 modules: 19 | 20 | ```typescript 21 | import {VKApi, ConsoleLogger} from 'node-vk-sdk' 22 | ``` 23 | 24 | Or using `require`: 25 | 26 | ```typescript 27 | const {VKApi, ConsoleLogger} = require('node-vk-sdk') 28 | ``` 29 | 30 | ## Usage 31 | 32 | ```typescript 33 | import {VKApi, ConsoleLogger} from 'node-vk-sdk' 34 | 35 | let api = new VKApi({ 36 | logger: new ConsoleLogger() 37 | }) 38 | 39 | api.usersGet({ userIds: ['1'] }) 40 | .then(response => { 41 | console.log(response) 42 | }) 43 | ``` 44 | 45 | ## VKApi constructor options 46 | 47 | ```typescript 48 | interface VKApiOptions { 49 | lang?: string|number, 50 | testMode?: number, 51 | logger?: BaseLogger, 52 | token?: string, 53 | timeout?: number, 54 | requestsPerSecond?: number, 55 | useQueue?: boolean 56 | } 57 | ``` 58 | 59 | * ```lang?``` - Determines the language for the data to be displayed on. For example country and city names. 60 | If you use a non-cyrillic language, cyrillic symbols will be transtiterated automatically 61 | `en – English, ru – Russian, ua – Ukrainian, be – Belorussian, es – Spanish, fi – finnish, de – German, it – Italian.` 62 | Numeric format from `account.getInfo` is supported as well. 63 | 64 | 65 | * ```test_mode?``` - 1 – allows to send requests from a native app without switching it on for all users. 66 | 67 | * ```logger?``` - Logger class that implements `BaseLogger` 68 | No logging will be used logger is not passed 69 | 70 | * ```token?``` - Access token 71 | 72 | * ```timeout?``` - Network timeout in ms 73 | 74 | * ```requestsPerSecond``` - Maximum requests per second, default is 3 75 | 76 | * ```useQueue``` - If useQueue is true, then SDK will limit number of requests per second at `requestsPerSecond` 77 | 78 | ## Calling methods 79 | 80 | All api methods returning Promise, so you can use them as Promise or as async functions. 81 | Methods arguments are described in interfaces, so you need to pass object implementing that interface, for example `users.get` props interface: 82 | 83 | ```typescript 84 | export interface UsersGetParams { 85 | /** 86 | * User IDs or screen names ('screen_name'). By default, current user ID. 87 | */ 88 | user_ids?: string[], 89 | /** 90 | * Profile fields to return. Sample values: 'nickname', 'screen_name', 'sex', 'bdate' (birthdate), 'city', 'country', 'timezone', 'photo', 'photo_medium', 'photo_big', 'has_mobile', 'contacts', 'education', 'online', 'counters', 'relation', 'last_seen', 'activity', 'can_write_private_message', 'can_see_all_posts', 'can_post', 'universities', 91 | */ 92 | fields?: string[], 93 | /** 94 | * Case for declension of user name and surname: 'nom' — nominative (default), 'gen' — genitive , 'dat' — dative, 'acc' — accusative , 'ins' — instrumental , 'abl' — prepositional 95 | */ 96 | name_case?: string, 97 | /** 98 | * access token 99 | */ 100 | access_token?: string 101 | } 102 | ``` 103 | 104 | All props interfaces have `accessToken` property, that token will be used instead of token passed to `VKApi` 105 | 106 | 107 | Calling example: 108 | 109 | 110 | ```typescript 111 | api.usersGet({ user_ids: ['1'] }) 112 | .then(response => { 113 | console.log(response) 114 | }) 115 | 116 | 117 | // or we can call it as async function 118 | 119 | let response = await api.usersGet({ user_ids: ['1'] }) 120 | ``` 121 | 122 | Direct call methods: 123 | 124 | ```typescript 125 | // makes plain call & returns contents of "response" property of server response 126 | public async call(method: string, params: Object): Promise 127 | 128 | // Makes api call and if there was 129 | // server-side error or requests limit was reached 130 | // repeats the call after some timeout 131 | public async callWithRetry(method: string, params: Object): Promise 132 | ``` 133 | 134 | ## Bots Long Poll API 135 | 136 | To receive group updates using Bots Long Poll API use `BotsLongPollUpdatesProvider` class: 137 | 138 | ```typescript 139 | import {VKApi, ConsoleLogger, BotsLongPollUpdatesProvider} from 'node-vk-sdk' 140 | 141 | let api = new VKApi({ 142 | token: 'GROUP_TOKEN_HERE', 143 | logger: new ConsoleLogger() 144 | }) 145 | 146 | let updatesProvider = new BotsLongPollUpdatesProvider(api, GROUP_ID_HERE) 147 | 148 | updatesProvider.getUpdates(updates => { 149 | console.log('got updates: ', updates) 150 | }) 151 | ``` 152 | 153 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export { VKApi } from './src/generated/VKApi' 2 | export { BaseLogger } from './src/log/BaseLogger' 3 | export { ConsoleLogger } from './src/log/ConsoleLogger' 4 | export { BotsLongPollUpdatesProvider } from './src/api/botsLongPoll/BotsLongPollUpdatesProvider' -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-vk-sdk", 3 | "version": "1.1.7", 4 | "description": "", 5 | "main": "./distr/index.js", 6 | "types": "./distr/index.d.ts", 7 | "scripts": { 8 | "build": "node_modules/.bin/tsc", 9 | "prepublish": "node_modules/.bin/tsc", 10 | "gen:types": "./node_modules/.bin/ts-node src/gen-types/genTypes.ts", 11 | "schema:validate": "./node_modules/.bin/ts-node src/gen-types/validateSchema.ts" 12 | }, 13 | "author": "Narek Abovyan", 14 | "license": "MIT", 15 | "devDependencies": { 16 | "@types/node": "^14.14.10", 17 | "ts-node": "^9.0.0", 18 | "typescript": "^4.1.2" 19 | }, 20 | "dependencies": { 21 | "tiny_request": "^1.0.12" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/api/BaseVKApi.ts: -------------------------------------------------------------------------------- 1 | import {BaseLogger} from "../log/BaseLogger"; 2 | import VKApiError from "./VKApiError"; 3 | import {AsyncQueue, createQueue, delay} from "./time"; 4 | import {postRequest} from "./net"; 5 | 6 | const DEFAULT_REQUESTS_PER_SECOND = 3 7 | const TIMEOUT = 5000 // 5 seconds 8 | const API_BASE_URL = 'https://api.vk.com/method/' 9 | const API_VERSION = '5.126' 10 | 11 | export interface VKApiOptions { 12 | lang?: string | number, 13 | testMode?: number, 14 | logger?: BaseLogger, 15 | token?: string, 16 | timeout?: number, 17 | requestsPerSecond?: number, 18 | useQueue?: boolean 19 | } 20 | 21 | type GenericParams = { [key: string]: any } 22 | 23 | export class BaseVKApi { 24 | readonly lang?: string | number 25 | readonly testMode?: number 26 | readonly logger?: BaseLogger 27 | readonly queue?: AsyncQueue 28 | readonly token?: string 29 | readonly timeout: number 30 | 31 | constructor(options: VKApiOptions) { 32 | this.logger = options.logger 33 | this.token = options.token 34 | this.timeout = options.timeout || TIMEOUT 35 | this.lang = options.lang 36 | this.testMode = options.testMode 37 | 38 | if (options.useQueue) 39 | this.queue = createQueue(options.requestsPerSecond || DEFAULT_REQUESTS_PER_SECOND) 40 | 41 | } 42 | 43 | public async call(method: string, params: GenericParams): Promise { 44 | params = this.filterParams(params) 45 | 46 | if (!params['lang'] && !!this.lang) 47 | params['lang'] = this.lang 48 | 49 | if (!params['testMode'] && !!this.testMode) 50 | params['testMode'] = this.testMode 51 | 52 | params['v'] = API_VERSION 53 | params['access_token'] = params['access_token'] || this.token 54 | 55 | if (!params['access_token']) 56 | delete params['access_token'] 57 | 58 | 59 | let doRequest = async () => { 60 | let {body, response, err} = await postRequest(API_BASE_URL + method, params, this.timeout) 61 | return await this.handleResponse(method, params, response, body, err) 62 | } 63 | 64 | if (this.queue) { 65 | return await this.queue.run(async () => doRequest()) 66 | } else { 67 | return doRequest() 68 | } 69 | } 70 | 71 | /** 72 | * Makes api call and if there was 73 | * server-side error or requests limit was reached 74 | * repeats the call after some timeout 75 | */ 76 | public async callWithRetry(method: string, params: GenericParams, timeout: number = 300): Promise { 77 | return this.doCallWithRetry(method, params, timeout) 78 | } 79 | 80 | /** 81 | * Stops calls queue if have one 82 | */ 83 | public stopQueue() { 84 | if (this.queue) 85 | this.queue.stop() 86 | } 87 | 88 | private async doCallWithRetry(method: string, params: GenericParams, timeout: number = 300, maxRetryCount: number = 7, retryCounter = 0): Promise { 89 | try { 90 | return await this.call(method, params) 91 | } catch (e) { 92 | retryCounter++ 93 | if (retryCounter === maxRetryCount) { 94 | throw e 95 | } 96 | 97 | if (e instanceof VKApiError) { 98 | // 99 | // 6 - too many requests per second 100 | // 10 - internal server error 101 | // 102 | if (e.errorCode == 6 || e.errorCode == 10) { 103 | await delay(timeout) 104 | return await this.doCallWithRetry(method, params, timeout, maxRetryCount, retryCounter) 105 | } 106 | 107 | throw e 108 | } else { 109 | // 110 | // Network error 111 | // 112 | await delay(timeout) 113 | return await this.doCallWithRetry(method, params, timeout, maxRetryCount, retryCounter) 114 | } 115 | } 116 | } 117 | 118 | private async handleResponse(method: string, params: GenericParams, response: any, body: any, err: Error) { 119 | if (!err && response.statusCode == 200 && !body.error) { 120 | if (body.execute_errors) { 121 | return body 122 | } 123 | return body.response 124 | } 125 | 126 | if (body && body.error) { 127 | if (this.logger) { 128 | this.logger.warn('VK Api error\n', { 129 | response: JSON.stringify(body), 130 | error: VKApiError.deserialize(body.error), 131 | method, 132 | params 133 | }) 134 | } 135 | 136 | throw VKApiError.deserialize(body.error) 137 | } 138 | 139 | if (err) { 140 | if (this.logger) { 141 | this.logger.error('VK Api:\n', { 142 | 'Networking error:': err, 143 | method, 144 | params 145 | }) 146 | } 147 | throw err 148 | } 149 | 150 | if (this.logger) { 151 | this.logger.error('VK Api:\n', { 152 | 'api request error: Body:': body, 153 | 'Error:': err 154 | }) 155 | } 156 | throw err 157 | } 158 | 159 | private filterParams(params: { [key: string]: any }): Object { 160 | for (let paramName in params) { 161 | if (params[paramName] == undefined) { 162 | delete params[paramName] 163 | } 164 | } 165 | 166 | return params 167 | } 168 | } -------------------------------------------------------------------------------- /src/api/VKApiError.ts: -------------------------------------------------------------------------------- 1 | export default class VKApiError extends Error { 2 | constructor( 3 | readonly errorCode: number, 4 | readonly errorMsg: string, 5 | readonly requestParams: any 6 | ) { 7 | super(errorMsg || errorCode.toString()) 8 | } 9 | 10 | static deserialize(raw: any): VKApiError { 11 | return new VKApiError( 12 | raw['error_code'], 13 | raw['error_msg'], 14 | raw['request_params'] 15 | ) 16 | } 17 | } -------------------------------------------------------------------------------- /src/api/botsLongPoll/BaseUpdateProvider.ts: -------------------------------------------------------------------------------- 1 | export interface BaseUpdateProvider { 2 | getUpdates(callback: (update: any) => void): void 3 | } -------------------------------------------------------------------------------- /src/api/botsLongPoll/BotsLongPollUpdatesProvider.ts: -------------------------------------------------------------------------------- 1 | import {BaseUpdateProvider} from "./BaseUpdateProvider"; 2 | import {VKApi} from "../../generated/VKApi"; 3 | const req = require('tiny_request') 4 | 5 | export class BotsLongPollUpdatesProvider implements BaseUpdateProvider { 6 | private server?: string 7 | private key?: string 8 | private ts?: string 9 | private updatesCallback?: (update: any) => void 10 | 11 | constructor( 12 | private api: VKApi, 13 | private groupId: number 14 | ) { 15 | this.init() 16 | } 17 | 18 | public getUpdates(callback: (update: any) => void) { 19 | this.updatesCallback = callback 20 | } 21 | 22 | private async init() { 23 | let longPollServer = await this.api.groupsGetLongPollServer({ 24 | group_id: this.groupId 25 | }) 26 | 27 | this.server = longPollServer.server 28 | this.key = longPollServer.key 29 | this.ts = longPollServer.ts 30 | 31 | this.poll() 32 | } 33 | 34 | private poll() { 35 | req.get( 36 | { 37 | url: `${this.server}?act=a_check&key=${this.key}&ts=${this.ts}&wait=25`, 38 | json: true 39 | }, 40 | (body: any, response: any, err: any) => { 41 | if (!err && response.statusCode == 200) { 42 | if (body.failed && (body.failed == 2 || body.failed == 3)) { 43 | this.init() 44 | return 45 | } 46 | this.ts = body.ts 47 | 48 | if (this.updatesCallback) 49 | this.updatesCallback(body.updates) 50 | 51 | this.poll() 52 | return 53 | } 54 | 55 | this.poll() 56 | } 57 | ) 58 | } 59 | } -------------------------------------------------------------------------------- /src/api/net.ts: -------------------------------------------------------------------------------- 1 | const req = require('tiny_request') 2 | 3 | export async function postRequest(url: string, query: { [key: string]: any }, timeout = 5000): Promise<{ body: any, response: any, err: Error }> { 4 | return new Promise((resolve, reject) => { 5 | req.post({ url, form: query, json: true, timeout }, (body: any, response: any, err: Error) => { 6 | resolve({ body, response, err }) 7 | }) 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /src/api/time.ts: -------------------------------------------------------------------------------- 1 | export type AsyncQueue = { run(handler: () => Promise ): Promise, stop(): void } 2 | 3 | export function createQueue(callsPerSec: number): AsyncQueue { 4 | let queue: (() => void)[] = [] 5 | 6 | let interval = setInterval(() => { 7 | if (queue.length !== 0) { 8 | const handler = queue.shift() 9 | if (handler) 10 | handler() 11 | } 12 | }, 1000 / callsPerSec) 13 | 14 | return { 15 | run: async function(handler: () => Promise): Promise { 16 | await new Promise(resolve => queue.push(resolve as (() => void))) 17 | return handler() 18 | }, 19 | stop: async () => { 20 | clearInterval(interval) 21 | } 22 | } 23 | } 24 | 25 | export function delay(ms: number) { 26 | return new Promise(resolve => setInterval(resolve, ms)) 27 | } -------------------------------------------------------------------------------- /src/codegen/CodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import ClassScheme from "./schema/ClassScheme"; 2 | import SourceCode from "./SourceCode"; 3 | import ApiMethodScheme from "./schema/ApiMethodScheme"; 4 | import CustomPrimitiveScheme from "./schema/CustomPrimitiveScheme"; 5 | 6 | export interface CodeGenerator { 7 | generateClass(scheme: ClassScheme): SourceCode 8 | 9 | generateInterface(scheme: ClassScheme): SourceCode 10 | 11 | generateCustomPrimitive(scheme: CustomPrimitiveScheme, withoutDeserializeFunc: boolean): SourceCode 12 | 13 | generateApiMethod(scheme: ApiMethodScheme): SourceCode 14 | 15 | generateApiMethodParamsInterface(scheme: ApiMethodScheme): SourceCode 16 | } -------------------------------------------------------------------------------- /src/codegen/CodeLine.ts: -------------------------------------------------------------------------------- 1 | export default class CodeLine { 2 | private _data: string 3 | 4 | constructor(data: string, tab: number = 0) { 5 | this._data = this.genTab(tab) + data 6 | } 7 | 8 | get data(): string { 9 | return this._data 10 | } 11 | 12 | public tab(n: number) { 13 | this._data = this.genTab(n) + this._data 14 | } 15 | 16 | private genTab(n: number): string { 17 | return new Array(n).fill(' ').join('') 18 | } 19 | } -------------------------------------------------------------------------------- /src/codegen/SourceCode.ts: -------------------------------------------------------------------------------- 1 | import CodeLine from "./CodeLine"; 2 | 3 | export default class SourceCode { 4 | private _lines: CodeLine[] 5 | 6 | constructor(lines: CodeLine[] = []) { 7 | this._lines = lines 8 | } 9 | 10 | public add(data: string, tab: number = 0) { 11 | this._lines.push(new CodeLine(data, tab)) 12 | } 13 | 14 | public append(code: SourceCode, tab: number = 0) { 15 | code.tab(tab) 16 | this._lines.push(...code.lines) 17 | } 18 | 19 | public render(): string { 20 | return this._lines.map(line => line.data).join('\n') 21 | } 22 | 23 | public tab(n: number) { 24 | this._lines.forEach(line => line.tab(n)) 25 | } 26 | 27 | get lines(): CodeLine[] { 28 | return this._lines 29 | } 30 | 31 | private genTab(n: number): string { 32 | return new Array(n).join(' ') 33 | } 34 | } -------------------------------------------------------------------------------- /src/codegen/TypescriptCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {CodeGenerator} from "./CodeGenerator"; 2 | import ClassScheme from "./schema/ClassScheme"; 3 | import SourceCode from "./SourceCode"; 4 | import StringType from "./types/StringType"; 5 | import NumberType from "./types/NumberType"; 6 | import AnyType from "./types/AnyType"; 7 | import BooleanType from "./types/BooleanType"; 8 | import CustomType from "./types/CustomType"; 9 | import {Type} from "./types/Type"; 10 | import VectorType from "./types/VectorType"; 11 | import {toCamelCase} from "./Utils"; 12 | import ApiMethodScheme from "./schema/ApiMethodScheme"; 13 | import IntBoolType from "./types/IntBoolType"; 14 | import AliasClassScheme from "./schema/AliasClassScheme"; 15 | import CustomPrimitiveType from "./types/CustomPrimitiveType"; 16 | import CustomPrimitiveScheme from "./schema/CustomPrimitiveScheme"; 17 | 18 | export default class TypescriptCodeGenerator implements CodeGenerator { 19 | public generateClass(scheme: ClassScheme): SourceCode { 20 | if (scheme instanceof AliasClassScheme) { 21 | return this.generateClassAlias(scheme) 22 | } 23 | 24 | let code = new SourceCode() 25 | let constructor = this.generateClassConstructor(scheme) 26 | let deserializeMethod = this.generateDeserializeMethod(scheme) 27 | 28 | code.add(`export class ${scheme.name} {`) 29 | code.append(constructor, 1) 30 | code.add('') 31 | code.append(deserializeMethod, 1) 32 | code.add('}') 33 | 34 | return code 35 | } 36 | 37 | public generateInterface(scheme: ClassScheme): SourceCode { 38 | if (scheme instanceof AliasClassScheme) { 39 | return this.generateClassAlias(scheme) 40 | } 41 | 42 | let code = new SourceCode() 43 | 44 | code.add(`export interface ${toCamelCase(scheme.name, true, '.')} {`) 45 | 46 | scheme.fields.forEach((prop, index) => { 47 | let coma = this.genComa(scheme.fields, index) 48 | 49 | code.add(`/**`, 1) 50 | code.add(` * ${prop.description}`, 1) 51 | code.add(` */`, 1) 52 | code.add(`${(prop.name)}: ${this.renderType(prop.type, true)}${coma}`, 1) 53 | }) 54 | 55 | code.add('}') 56 | 57 | return code 58 | } 59 | 60 | public generateCustomPrimitive(scheme: CustomPrimitiveScheme, withoutDeserializeFunc: boolean): SourceCode { 61 | let code = new SourceCode() 62 | 63 | let typeDeclaration = this.renderType(scheme.type, true) 64 | 65 | code.add(`export type ${scheme.name} = ${typeDeclaration}`) 66 | 67 | if (withoutDeserializeFunc === true) 68 | return code 69 | 70 | code.add('') 71 | code.add(`export function ${scheme.name}_deserialize(raw: any): ${typeDeclaration} {`) 72 | code.add('return (', 1) 73 | 74 | //let coma = this.genComa(scheme.fields, index) 75 | let fieldVar = `raw` 76 | 77 | if (scheme.type instanceof VectorType) 78 | code.add(this.renderVectorDeserialize(fieldVar, scheme.type), 2) 79 | else if (scheme.type instanceof CustomType) 80 | code.add(`${fieldVar} ? ${scheme.type.name}.deserialize(${fieldVar}) : undefined`, 2) 81 | else if (scheme.type instanceof IntBoolType) 82 | code.add(`!!${fieldVar}`, 2) 83 | else 84 | code.add(fieldVar, 2) 85 | 86 | code.add(')', 1) 87 | 88 | code.add('}') 89 | 90 | return code 91 | } 92 | 93 | public generateApiMethod(scheme: ApiMethodScheme): SourceCode { 94 | let code = new SourceCode() 95 | 96 | let methodName = toCamelCase(scheme.name, false, '.') 97 | let propsName = `MethodsProps.${toCamelCase(scheme.name, true, '.')}Params` 98 | let responseName = this.renderType(scheme.responseType, true) 99 | 100 | code.add(`/**`) 101 | code.add(` * ${scheme.description}`) 102 | code.add(' *') 103 | code.add(' * @param {{') 104 | scheme.params.forEach((param, index) => { 105 | let coma = this.genComa(scheme.params, index) 106 | 107 | code.add(` * ${(param.name)}: (${this.renderType(param.type, true)}${param.required ? '' : '|undefined'})${coma}`) 108 | }) 109 | code.add(' * }} params') 110 | code.add(' *') 111 | code.add(` * @returns {Promise<${responseName}>}`) 112 | code.add(` */`) 113 | code.add(`public async ${methodName}(params: ${propsName}): Promise<${responseName}> {`) 114 | code.add(`return ${scheme.isSuperClass ? 'super' : 'this'}.call("${scheme.name}", params)`, 1) 115 | code.add('}') 116 | 117 | return code 118 | } 119 | 120 | public generateApiMethodParamsInterface(scheme: ApiMethodScheme): SourceCode { 121 | let code = new SourceCode() 122 | 123 | code.add(`export interface ${toCamelCase(scheme.name, true, '.')}Params {`) 124 | 125 | scheme.params.forEach((prop, index) => { 126 | let coma = this.genComa(scheme.params, index) 127 | 128 | code.add(`/**`, 1) 129 | code.add(` * ${prop.description}`, 1) 130 | code.add(` */`, 1) 131 | code.add(`${(prop.name)}${prop.required ? '' : '?'}: ${this.renderType(prop.type, true)}${coma}`, 1) 132 | }) 133 | 134 | code.add('}') 135 | 136 | return code 137 | } 138 | 139 | private generateClassConstructor(scheme: ClassScheme): SourceCode { 140 | let code = new SourceCode() 141 | let jsdoc = this.generateClassConstructorJSDoc(scheme) 142 | 143 | code.append(jsdoc) 144 | 145 | code.add('constructor (') 146 | 147 | scheme.fields.forEach((field, index) => { 148 | let coma = this.genComa(scheme.fields, index) 149 | 150 | code.add(`readonly ${toCamelCase(field.name)}: ${this.renderType(field.type)}${coma}`, 1) 151 | }) 152 | 153 | code.add(') {') 154 | code.add('') 155 | code.add('}') 156 | 157 | return code 158 | } 159 | 160 | private generateClassConstructorJSDoc(scheme: ClassScheme): SourceCode { 161 | let code = new SourceCode() 162 | 163 | code.add('/**') 164 | code.add(' * @class') 165 | 166 | scheme.fields.forEach(field => { 167 | code.add(` * @property {${this.renderType(field.type)}} ${toCamelCase(field.name)} ${field.description}`) 168 | }) 169 | 170 | code.add(' */') 171 | 172 | return code 173 | } 174 | 175 | private generateDeserializeMethod(scheme: ClassScheme): SourceCode { 176 | let code = new SourceCode() 177 | 178 | code.add('/**') 179 | code.add(' * @param {Object} raw') 180 | code.add(` * @returns {${scheme.name}}`) 181 | code.add(' */') 182 | 183 | code.add(`static deserialize(raw: Object): ${scheme.name} {`) 184 | code.add(`return new ${scheme.name} (`, 1) 185 | 186 | scheme.fields.forEach((field, index) => { 187 | let coma = this.genComa(scheme.fields, index) 188 | let fieldVar = `raw['${field.name}']` 189 | 190 | if (field.type instanceof VectorType) 191 | code.add(this.renderVectorDeserialize(fieldVar, field.type) + coma, 2) 192 | else if (field.type instanceof CustomType) 193 | code.add(`${fieldVar} ? ${field.type.name}.deserialize(${fieldVar}) : undefined${coma}`, 2) 194 | else if (field.type instanceof CustomPrimitiveType) 195 | code.add(`${fieldVar} ? ${field.type.name}_deserialize(${fieldVar}) : undefined${coma}`, 2) 196 | else if (field.type instanceof IntBoolType) 197 | code.add(`!!${fieldVar}${coma}`, 2) 198 | else 199 | code.add(fieldVar + coma, 2) 200 | }) 201 | 202 | code.add(`)`, 1) 203 | code.add('}') 204 | 205 | return code 206 | } 207 | 208 | private renderType(type: Type, withoutUndefined = false): string { 209 | if (type instanceof StringType) 210 | return 'string' 211 | 212 | if (type instanceof NumberType) 213 | return 'number' 214 | 215 | if (type instanceof AnyType) 216 | return 'any' 217 | 218 | if (type instanceof BooleanType) 219 | return 'boolean' 220 | 221 | if (type instanceof IntBoolType) 222 | return 'boolean' 223 | 224 | if (type instanceof CustomType) 225 | return type.name + `${!withoutUndefined ? '|undefined' : ''}` 226 | 227 | if (type instanceof CustomPrimitiveType) 228 | return type.name + `${!withoutUndefined ? '|undefined' : ''}` 229 | 230 | if (type instanceof VectorType) { 231 | return this.renderType(type.item, true) + `[]${!withoutUndefined ? '|undefined' : ''}` 232 | } 233 | 234 | 235 | 236 | throw { 'UNSUPPORTED TYPE': type } 237 | } 238 | 239 | private genComa(list: any[], index: number): string { 240 | return (index == list.length - 1) ? '' : ',' 241 | } 242 | 243 | private renderVectorDeserialize(value: string, type: Type): string { 244 | let code = '' 245 | 246 | if (type instanceof VectorType) 247 | code += `${value} ? ${value}.map(v => ${this.renderVectorDeserialize('v', type.item)}) : undefined` 248 | else if (type instanceof CustomType) 249 | code += `${value} ? ${type.name}.deserialize(${value}) : undefined` 250 | else if (type instanceof CustomPrimitiveType) 251 | code += `${value} ? ${type.name}_deserialize(${value}) : undefined` 252 | else 253 | code += value 254 | 255 | return code 256 | } 257 | 258 | private generateClassAlias(scheme: AliasClassScheme): SourceCode { 259 | let code = new SourceCode() 260 | 261 | let typeDeclaration = this.renderType(new CustomType(scheme.aliasClass.name), true) 262 | 263 | code.add(`export type ${scheme.name} = ${typeDeclaration}`) 264 | 265 | return code 266 | } 267 | } -------------------------------------------------------------------------------- /src/codegen/Utils.ts: -------------------------------------------------------------------------------- 1 | export function toCamelCase(str: string, capitalize: boolean = false, separator = '_') { 2 | const parts = str.split(separator) 3 | 4 | if (!parts.length) return str 5 | 6 | const capitalized = parts.slice(1).map(part => part[0].toUpperCase() + part.substr(1)) 7 | 8 | capitalized.unshift(parts[0]) 9 | 10 | let result = capitalized.join('') 11 | 12 | if (capitalize) 13 | return result[0].toUpperCase() + result.slice(1) 14 | 15 | return result 16 | } -------------------------------------------------------------------------------- /src/codegen/schema/AliasClassScheme.ts: -------------------------------------------------------------------------------- 1 | import ClassField from "./ClassField"; 2 | import ClassScheme from "./ClassScheme"; 3 | 4 | export default class AliasClassScheme extends ClassScheme { 5 | constructor( 6 | readonly name: string, 7 | readonly fields: ClassField[], 8 | readonly aliasClass: ClassScheme 9 | ) { 10 | super(name, fields) 11 | } 12 | } -------------------------------------------------------------------------------- /src/codegen/schema/ApiMethodParam.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "../types/Type"; 2 | 3 | export default class ApiMethodParam { 4 | constructor( 5 | readonly name: string, 6 | readonly type: Type, 7 | readonly required: boolean, 8 | readonly description: string 9 | ) { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /src/codegen/schema/ApiMethodScheme.ts: -------------------------------------------------------------------------------- 1 | import ApiMethodParam from "./ApiMethodParam"; 2 | import {Type} from "../types/Type"; 3 | 4 | export default class ApiMethodScheme { 5 | constructor( 6 | readonly name: string, 7 | readonly params: ApiMethodParam[], 8 | readonly responseType: Type, 9 | readonly description: string, 10 | readonly isSuperClass: boolean 11 | ) { 12 | 13 | } 14 | } -------------------------------------------------------------------------------- /src/codegen/schema/ClassField.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "../types/Type"; 2 | 3 | export default class ClassField { 4 | constructor( 5 | readonly name: string, 6 | readonly type: Type, 7 | readonly description: string 8 | ) { 9 | 10 | } 11 | } -------------------------------------------------------------------------------- /src/codegen/schema/ClassScheme.ts: -------------------------------------------------------------------------------- 1 | import ClassField from "./ClassField"; 2 | 3 | export default class ClassScheme { 4 | constructor( 5 | readonly name: string, 6 | readonly fields: ClassField[] 7 | ) { 8 | 9 | } 10 | } -------------------------------------------------------------------------------- /src/codegen/schema/CustomPrimitiveScheme.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "../types/Type"; 2 | 3 | /** 4 | * Represents serializable primitive 5 | * 6 | * 7 | */ 8 | 9 | export default class CustomPrimitiveScheme { 10 | constructor( 11 | readonly name: string, 12 | readonly type: Type 13 | ) { 14 | 15 | } 16 | } -------------------------------------------------------------------------------- /src/codegen/types/AnyType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class AnyType implements Type { 4 | 5 | } -------------------------------------------------------------------------------- /src/codegen/types/BooleanType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class BooleanType implements Type { 4 | 5 | } -------------------------------------------------------------------------------- /src/codegen/types/CustomPrimitiveType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class CustomPrimitiveType implements Type { 4 | constructor( 5 | readonly name: string, 6 | ) { 7 | 8 | } 9 | } -------------------------------------------------------------------------------- /src/codegen/types/CustomType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class CustomType implements Type { 4 | constructor(readonly name: string) { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /src/codegen/types/IntBoolType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class IntBoolType implements Type { 4 | 5 | } -------------------------------------------------------------------------------- /src/codegen/types/NumberType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class NumberType implements Type { 4 | 5 | } -------------------------------------------------------------------------------- /src/codegen/types/StringType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class StringType implements Type { 4 | 5 | } -------------------------------------------------------------------------------- /src/codegen/types/Type.ts: -------------------------------------------------------------------------------- 1 | export interface Type { 2 | 3 | } -------------------------------------------------------------------------------- /src/codegen/types/VectorType.ts: -------------------------------------------------------------------------------- 1 | import {Type} from "./Type"; 2 | 3 | export default class VectorType implements Type { 4 | constructor(readonly item: Type) { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /src/gen-types/genTypes.ts: -------------------------------------------------------------------------------- 1 | import TypescriptCodeGenerator from "../codegen/TypescriptCodeGenerator"; 2 | import ClassScheme from "../codegen/schema/ClassScheme"; 3 | import ClassField from "../codegen/schema/ClassField"; 4 | import StringType from "../codegen/types/StringType"; 5 | import NumberType from "../codegen/types/NumberType"; 6 | import VectorType from "../codegen/types/VectorType"; 7 | import {toCamelCase} from "../codegen/Utils"; 8 | import CustomType from "../codegen/types/CustomType"; 9 | import ApiMethodScheme from "../codegen/schema/ApiMethodScheme"; 10 | import ApiMethodParam from "../codegen/schema/ApiMethodParam"; 11 | import {Type} from "../codegen/types/Type"; 12 | import AnyType from "../codegen/types/AnyType"; 13 | import BooleanType from "../codegen/types/BooleanType"; 14 | import {writeFile} from "fs"; 15 | import SourceCode from "../codegen/SourceCode"; 16 | import AliasClassScheme from "../codegen/schema/AliasClassScheme"; 17 | import CustomPrimitiveScheme from "../codegen/schema/CustomPrimitiveScheme"; 18 | import CustomPrimitiveType from "../codegen/types/CustomPrimitiveType"; 19 | import {ConsoleLogger} from "../log/ConsoleLogger"; 20 | 21 | const objects = require('../vk-api-schema/objects.json') 22 | const responses = require('../vk-api-schema/responses.json') 23 | const methods = require('../vk-api-schema/methods.json') 24 | 25 | const codeGenerator = new TypescriptCodeGenerator() 26 | const logger = new ConsoleLogger() 27 | 28 | const MODELS_FILE = 'Models.ts' 29 | const RESPONSES_FILE = 'Responses.ts' 30 | const VKAPI_FILE = 'VKApi.ts' 31 | const METHODS_PROPS_FILE = 'MethodsProps.ts' 32 | 33 | const GENERATED_PATH = __dirname + '/../generated/' 34 | 35 | main() 36 | 37 | async function main() { 38 | try { 39 | await generate() 40 | } catch (e) { 41 | console.error(e) 42 | } 43 | } 44 | 45 | async function generate() { 46 | let modelsCode: SourceCode[] = [] 47 | 48 | // Hack types missing in schema 49 | let anyType = {type: 'any', properties: {}} 50 | let anyResponse = { type: 'object', properties: {response: {type: 'any'}} } 51 | 52 | objects.definitions['account_info'].properties['link_redirects'] = anyType 53 | objects.definitions['wall_wallpost'].properties['poster'] = anyType 54 | objects.definitions['callback_message_base'] = anyType 55 | objects.definitions['notifications_notification_item'] = anyType 56 | objects.definitions['photos_photo_falseable'] = anyType 57 | objects.definitions['poster'] = anyType 58 | 59 | // Not supported yet 60 | responses.definitions['groups_getSettings_response'] = anyResponse 61 | responses.definitions['messages_send_user_ids_response'] = anyResponse 62 | responses.definitions['secure_giveEventSticker_response'] = anyResponse 63 | 64 | 65 | // 66 | // Models 67 | // 68 | for (let className in objects.definitions) { 69 | let classScheme = jsonToClassScheme(className, objects.definitions[className]) 70 | 71 | if (classScheme instanceof AliasClassScheme) { 72 | classScheme = new AliasClassScheme( 73 | classScheme.name, 74 | classScheme.fields, 75 | new ClassScheme( 76 | classScheme.aliasClass.name.replace('Models.', ''), 77 | classScheme.aliasClass.fields 78 | ) 79 | ) 80 | } 81 | if (classScheme instanceof ClassScheme) { 82 | modelsCode.push(codeGenerator.generateInterface(classScheme)) 83 | } 84 | if (classScheme instanceof CustomPrimitiveScheme) { 85 | modelsCode.push(codeGenerator.generateCustomPrimitive(classScheme, true)) 86 | } 87 | } 88 | 89 | await saveToFile(GENERATED_PATH + MODELS_FILE, modelsCode.map(c => c.render()).join('\n\n')) 90 | logger.log('models generated') 91 | 92 | // 93 | // Responses 94 | // 95 | let responsesCode: SourceCode[] = [] 96 | 97 | for (let className in responses.definitions) { 98 | let classScheme = jsonToClassScheme(className, responses.definitions[className].properties.response, true) 99 | 100 | if (classScheme instanceof ClassScheme) { 101 | responsesCode.push(codeGenerator.generateInterface(classScheme)) 102 | } 103 | if (classScheme instanceof CustomPrimitiveScheme) { 104 | responsesCode.push(codeGenerator.generateCustomPrimitive(classScheme, true)) 105 | } 106 | } 107 | 108 | let responsesFileCode = new SourceCode() 109 | responsesFileCode.add('import * as Models from "./Models"') 110 | responsesFileCode.add('') 111 | responsesCode.forEach(c => responsesFileCode.append(c)) 112 | await saveToFile(GENERATED_PATH + RESPONSES_FILE, responsesFileCode.render()) 113 | logger.log('responses generated') 114 | 115 | // 116 | // Methods props 117 | // 118 | let methodsPropsCode: SourceCode[] = [] 119 | 120 | methods.methods.forEach((method: any) => { 121 | let scheme = jsonToMethodScheme(method) 122 | methodsPropsCode.push(codeGenerator.generateApiMethodParamsInterface(scheme)) 123 | }) 124 | 125 | await saveToFile(GENERATED_PATH + METHODS_PROPS_FILE, 'import * as Models from "./Models"\n\n' + methodsPropsCode.map(c => c.render()).join('\n\n')) 126 | logger.log('methods props generated') 127 | 128 | // 129 | // VKApi 130 | // 131 | let methodsCode: SourceCode[] = [] 132 | 133 | methods.methods.forEach((method: any) => { 134 | let scheme = jsonToMethodScheme(method) 135 | methodsCode.push(codeGenerator.generateApiMethod(scheme)) 136 | }) 137 | 138 | let apiClassCode = new SourceCode() 139 | apiClassCode.add('import {BaseVKApi} from "../api/BaseVKApi"') 140 | apiClassCode.add('import * as MethodsProps from "./MethodsProps"') 141 | apiClassCode.add('import * as Responses from "./Responses"') 142 | apiClassCode.add('') 143 | apiClassCode.add('export class VKApi extends BaseVKApi {') 144 | methodsCode.forEach(c => apiClassCode.append(c, 1)) 145 | apiClassCode.add('}') 146 | await saveToFile(GENERATED_PATH + VKAPI_FILE, apiClassCode.render()) 147 | logger.log('VKApi generated') 148 | } 149 | 150 | function jsonToMethodScheme(scheme: any): ApiMethodScheme { 151 | let params: ApiMethodParam[] = [] 152 | 153 | let paramsSet = new Set() 154 | 155 | if (scheme.parameters) { 156 | for (let param of scheme.parameters) { 157 | if (paramsSet.has(param.name)) { 158 | logger.warn(`Duplicate parameter ${param.name} in ${scheme.name}`) 159 | continue 160 | } 161 | params.push(new ApiMethodParam( 162 | param.name, 163 | parseType(param, true), 164 | !!param.required, 165 | param.description, 166 | )) 167 | paramsSet.add(param.name) 168 | } 169 | } 170 | 171 | params.push( 172 | new ApiMethodParam( 173 | 'access_token', 174 | new StringType(), 175 | false, 176 | 'access token' 177 | ) 178 | ) 179 | 180 | return new ApiMethodScheme( 181 | scheme.name, 182 | params, 183 | new CustomType('Responses.' + toCamelCase(normalizePath(scheme.responses.response.$ref), true)), 184 | scheme.description, 185 | true 186 | ) 187 | } 188 | 189 | function jsonToClassScheme(name: string, scheme: any, forResponses = false): ClassScheme | CustomPrimitiveScheme { 190 | // just create alias here 191 | if (scheme.$ref) { 192 | return new AliasClassScheme( 193 | toCamelCase(name, true), 194 | [], 195 | jsonToClassScheme( 196 | 'Models.' + toCamelCase(normalizePath(scheme.$ref), true), 197 | getScheme(scheme.$ref) 198 | ) as ClassScheme 199 | ) 200 | } 201 | 202 | if (scheme.type !== 'object') { 203 | return new CustomPrimitiveScheme( 204 | toCamelCase(name, true), 205 | parseType(scheme, forResponses) 206 | ) 207 | } 208 | 209 | let fields: ClassField[] = [] 210 | 211 | let props = getSchemeClassProps(scheme) 212 | 213 | for (let propName in props) { 214 | let name = propName 215 | 216 | if (name == '2fa_required') 217 | name = 'twoFaRequired' 218 | 219 | if (name == 'class') 220 | name = 'schoolClass' 221 | 222 | fields.push( 223 | new ClassField( 224 | name, 225 | parseType(props[propName], forResponses), 226 | props[propName].description || '' 227 | ) 228 | ) 229 | } 230 | 231 | return new ClassScheme( 232 | toCamelCase(name, true), 233 | fields 234 | ) 235 | } 236 | 237 | function getSchemeClassProps(scheme: any): any { 238 | let props = {} 239 | 240 | if (scheme.properties) 241 | props = {...props, ...scheme.properties} 242 | 243 | if (scheme.allOf) { 244 | scheme.allOf.forEach((prop: any) => { 245 | props = {...props, ...getSchemeClassProps(prop)} 246 | }) 247 | } 248 | 249 | if (scheme.$ref) { 250 | let typeScheme = getScheme(scheme.$ref) 251 | props = {...props, ...getSchemeClassProps(typeScheme)} 252 | } 253 | 254 | return props 255 | } 256 | 257 | function parseType(scheme: any, forResponses = false): Type { 258 | let type = scheme.type 259 | 260 | if (type == 'integer' || type == 'number') 261 | return new NumberType() 262 | 263 | if (type == 'string') 264 | return new StringType() 265 | 266 | if (type == 'boolean') 267 | return new BooleanType() 268 | 269 | if (type == 'array') { 270 | if (scheme.items.oneOf) { 271 | return new VectorType(new AnyType()) 272 | } 273 | 274 | if (scheme.items.$ref) { 275 | let primitive = isPrimitive(scheme.items.$ref) 276 | let name = toCamelCase(normalizePath(scheme.items.$ref), true) 277 | 278 | if (forResponses) { 279 | if (primitive) 280 | return new VectorType(new CustomPrimitiveType('Models.' + name)) 281 | 282 | return new VectorType(new CustomType('Models.' + name)) 283 | } 284 | 285 | if (primitive) 286 | return new VectorType(new CustomPrimitiveType(name)) 287 | 288 | return new VectorType(new CustomType(name)) 289 | } 290 | 291 | return new VectorType(parseType(scheme.items, forResponses)) 292 | } 293 | 294 | if (type == 'any') { 295 | return new AnyType() 296 | } 297 | 298 | if (scheme.$ref) { 299 | let primitive = isPrimitive(scheme.$ref) 300 | 301 | let name = toCamelCase(normalizePath(scheme.$ref), true) 302 | 303 | if (forResponses) { 304 | if (primitive) 305 | return new CustomPrimitiveType('Models.' + name) 306 | 307 | return new CustomType('Models.' + name) 308 | } 309 | 310 | if (primitive) 311 | return new CustomPrimitiveType(name) 312 | 313 | return new CustomType(name) 314 | } 315 | 316 | if (Array.isArray(type)) { 317 | // hack ads_ad.ad_platform 318 | return new AnyType() 319 | } 320 | 321 | if (scheme.properties && scheme.properties.count && scheme.properties.items) { 322 | // convert { cont, items } to array 323 | return parseType(scheme.properties.items, forResponses) 324 | } 325 | 326 | if (scheme.allOf) { 327 | return new AnyType() 328 | } 329 | 330 | throw {'UNSUPPORTED TYPE': scheme} 331 | } 332 | 333 | function getScheme(ref: string): any { 334 | return objects.definitions[normalizePath(ref)] 335 | } 336 | 337 | function normalizePath(path: string): string { 338 | if (path.indexOf('objects.json#/definitions/') > -1) 339 | return path.replace('objects.json#/definitions/', '') 340 | 341 | if (path.indexOf('responses.json#/definitions/') > -1) 342 | return path.replace('responses.json#/definitions/', '') 343 | 344 | return path.replace('#/definitions/', '') 345 | } 346 | 347 | function isPrimitive(ref: string): boolean { 348 | let scheme = getScheme(ref) 349 | 350 | if (scheme.type !== 'object') 351 | return true 352 | 353 | return false 354 | } 355 | 356 | async function saveToFile(name: string, data: string): Promise { 357 | return new Promise((resolve, reject) => { 358 | writeFile(name, data, err => { 359 | if (err) { 360 | reject(err) 361 | return 362 | } 363 | 364 | resolve(true) 365 | }) 366 | }) 367 | } -------------------------------------------------------------------------------- /src/gen-types/validateSchema.ts: -------------------------------------------------------------------------------- 1 | import {ConsoleLogger} from "../log/ConsoleLogger"; 2 | 3 | const OBJECTS = require('../vk-api-schema/objects.json') 4 | const RESPONSES = require('../vk-api-schema/responses.json') 5 | const METHODS = require('../vk-api-schema/methods.json') 6 | 7 | const logger = new ConsoleLogger() 8 | 9 | function validate() { 10 | logger.log('Validating objects.json') 11 | validateObjects(OBJECTS) 12 | logger.log('Validating responses.json') 13 | validateObjects(RESPONSES) 14 | logger.log('Validating methods.json') 15 | validateMethods() 16 | } 17 | 18 | validate() 19 | 20 | function validateMethods() { 21 | let objectsSet = new Set() 22 | for (let method of METHODS.methods) { 23 | let methodName = method.name 24 | if (objectsSet.has(methodName)) { 25 | logger.warn('Duplicate method definition: ' + methodName) 26 | } 27 | if (!method.responses.response) { 28 | logger.warn('Missing response for method' + methodName) 29 | } 30 | validateType(method.responses.response, methodName) 31 | if (method.responses.extendedResponse) { 32 | validateType(method.responses.extendedResponse, methodName) 33 | } 34 | if (method.parameters) { 35 | let parametersSet = new Set() 36 | for (let parameter of method.parameters) { 37 | if (parametersSet.has(parameter.name)) { 38 | logger.warn('Duplicate method parameter definition: ' + parameter.name + ' in ' + methodName) 39 | } 40 | validateType(parameter, parameter.name) 41 | parametersSet.add(parameter.name) 42 | } 43 | } 44 | objectsSet.add(methodName) 45 | } 46 | } 47 | 48 | function validateType(schema: any, name: string, path: string[] = []) { 49 | if (schema.$ref) { 50 | if (!resolveRef(schema.$ref)) { 51 | logger.warn('Missing object ' + typeNameFromRef(schema.$ref) + ' required in ' + name) 52 | } 53 | } else if (schema.type && schema.type === 'array') { 54 | if (!schema.items) { 55 | logger.warn('Missing object array items in ' + JSON.stringify(schema)) 56 | } else if (schema.items.$ref && !resolveRef(schema.items.$ref)) { 57 | logger.warn('Missing object ' + typeNameFromRef(schema.items.$ref)) 58 | } 59 | } else if (schema.type === 'object') { 60 | if (schema.patternProperties) { 61 | return 62 | } 63 | if (schema.allOf) { 64 | for (let variant of schema.allOf) { 65 | variant.type = 'object' 66 | validateType(variant, name) 67 | } 68 | return 69 | } 70 | if (schema.oneOf) { 71 | for (let variant of schema.oneOf) { 72 | variant.type = 'object' 73 | validateType(variant, name) 74 | } 75 | return 76 | } 77 | if (!schema.properties) { 78 | if (path.length > 1) { 79 | logger.warn('Missing properties in ' + name + ' at ' + path.join('->')) 80 | } else { 81 | logger.warn('Missing properties in ' + name) 82 | } 83 | } 84 | 85 | let propsSet = new Set() 86 | for (let propName in schema.properties) { 87 | if (propsSet.has(propName)) { 88 | logger.warn('Duplicate property definition: ' + propName + ' in object' + name) 89 | } 90 | validateType(schema.properties[propName], propName, [...path, propName]) 91 | propsSet.add(propName) 92 | } 93 | } 94 | } 95 | 96 | function validateObjects(schema: any) { 97 | let objectsSet = new Set() 98 | for (let typeName in schema.definitions) { 99 | if (objectsSet.has(typeName)) { 100 | logger.warn('Duplicate object definition: ' + typeName) 101 | } 102 | // console.log(schema.definitions[typeName], typeName) 103 | validateType(schema.definitions[typeName], typeName, [typeName]) 104 | objectsSet.add(typeName) 105 | } 106 | } 107 | 108 | function resolveRef(ref: string): any { 109 | if (ref.startsWith('objects.json#/definitions/')) 110 | return OBJECTS.definitions[ref.replace('objects.json#/definitions/', '')] 111 | 112 | if (ref.startsWith('responses.json#/definitions/')) 113 | return RESPONSES.definitions[ref.replace('responses.json#/definitions/', '')] 114 | 115 | if (ref.startsWith('#/definitions/')) 116 | return OBJECTS.definitions[ref.replace('#/definitions/', '')] 117 | 118 | return null 119 | } 120 | 121 | function typeNameFromRef(ref: string): any { 122 | return ref.replace('objects.json#/definitions/', '').replace('responses.json#/definitions/', '').replace('#/definitions/', '') 123 | } 124 | 125 | -------------------------------------------------------------------------------- /src/generated/Responses.ts: -------------------------------------------------------------------------------- 1 | import * as Models from "./Models" 2 | 3 | export interface AccountChangePasswordResponse { 4 | /** 5 | * New token 6 | */ 7 | token: string, 8 | /** 9 | * New secret 10 | */ 11 | secret: string 12 | } 13 | export interface AccountGetActiveOffersResponse { 14 | /** 15 | * Total number 16 | */ 17 | count: number, 18 | /** 19 | * 20 | */ 21 | items: Models.AccountOffer[] 22 | } 23 | export type AccountGetAppPermissionsResponse = number 24 | export interface AccountGetBannedResponse { 25 | /** 26 | * Total number 27 | */ 28 | count: number, 29 | /** 30 | * 31 | */ 32 | items: number[], 33 | /** 34 | * 35 | */ 36 | profiles: Models.UsersUserMin[], 37 | /** 38 | * 39 | */ 40 | groups: Models.GroupsGroup[] 41 | } 42 | export type AccountGetCountersResponse = Models.AccountAccountCounters 43 | export type AccountGetInfoResponse = Models.AccountInfo 44 | export type AccountGetProfileInfoResponse = Models.AccountUserSettings 45 | export type AccountGetPushSettingsResponse = Models.AccountPushSettings 46 | export interface AccountSaveProfileInfoResponse { 47 | /** 48 | * 1 if changes has been processed 49 | */ 50 | changed: Models.BaseBoolInt, 51 | /** 52 | * 53 | */ 54 | name_request: Models.AccountNameRequest 55 | } 56 | export type AdsAddOfficeUsersResponse = boolean 57 | export type AdsCheckLinkResponse = Models.AdsLinkStatus 58 | export type AdsCreateAdsResponse = number[] 59 | export type AdsCreateCampaignsResponse = number[] 60 | export type AdsCreateClientsResponse = number[] 61 | export interface AdsCreateTargetGroupResponse { 62 | /** 63 | * Group ID 64 | */ 65 | id: number, 66 | /** 67 | * Pixel code 68 | */ 69 | pixel: string 70 | } 71 | export type AdsDeleteAdsResponse = number[] 72 | export type AdsDeleteCampaignsResponse = number 73 | export type AdsDeleteClientsResponse = number 74 | export type AdsGetAccountsResponse = Models.AdsAccount[] 75 | export type AdsGetAdsLayoutResponse = Models.AdsAdLayout[] 76 | export type AdsGetAdsTargetingResponse = Models.AdsTargSettings[] 77 | export type AdsGetAdsResponse = Models.AdsAd[] 78 | export type AdsGetBudgetResponse = number 79 | export type AdsGetCampaignsResponse = Models.AdsCampaign[] 80 | export interface AdsGetCategoriesResponse { 81 | /** 82 | * Old categories 83 | */ 84 | v1: Models.AdsCategory[], 85 | /** 86 | * Actual categories 87 | */ 88 | v2: Models.AdsCategory[] 89 | } 90 | export type AdsGetClientsResponse = Models.AdsClient[] 91 | export type AdsGetDemographicsResponse = Models.AdsDemoStats[] 92 | export type AdsGetFloodStatsResponse = Models.AdsFloodStats 93 | export interface AdsGetLookalikeRequestsResponse { 94 | /** 95 | * Total count of found lookalike requests 96 | */ 97 | count: number, 98 | /** 99 | * found lookalike requests 100 | */ 101 | items: Models.AdsLookalikeRequest[] 102 | } 103 | export interface AdsGetMusiciansResponse { 104 | /** 105 | * Musicians 106 | */ 107 | items: Models.AdsMusician[] 108 | } 109 | export type AdsGetOfficeUsersResponse = Models.AdsUsers[] 110 | export type AdsGetPostsReachResponse = Models.AdsPromotedPostReach[] 111 | export type AdsGetRejectionReasonResponse = Models.AdsRejectReason 112 | export type AdsGetStatisticsResponse = Models.AdsStats[] 113 | export type AdsGetSuggestionsCitiesResponse = Models.AdsTargSuggestionsCities[] 114 | export type AdsGetSuggestionsRegionsResponse = Models.AdsTargSuggestionsRegions[] 115 | export type AdsGetSuggestionsResponse = Models.AdsTargSuggestions[] 116 | export type AdsGetSuggestionsSchoolsResponse = Models.AdsTargSuggestionsSchools[] 117 | export type AdsGetTargetGroupsResponse = Models.AdsTargetGroup[] 118 | export type AdsGetTargetingStatsResponse = Models.AdsTargStats 119 | export type AdsGetUploadURLResponse = string 120 | export type AdsGetVideoUploadURLResponse = string 121 | export type AdsImportTargetContactsResponse = number 122 | export type AdsRemoveOfficeUsersResponse = boolean 123 | export type AdsUpdateAdsResponse = number[] 124 | export type AdsUpdateCampaignsResponse = number 125 | export type AdsUpdateClientsResponse = number 126 | export type AdsUpdateOfficeUsersResponse = Models.AdsUpdateOfficeUsersResult[] 127 | export interface AdswebGetAdCategoriesResponse { 128 | /** 129 | * 130 | */ 131 | categories: Models.AdswebGetAdCategoriesResponseCategoriesCategory[] 132 | } 133 | export interface AdswebGetAdUnitCodeResponse { 134 | /** 135 | * 136 | */ 137 | html: string 138 | } 139 | export interface AdswebGetAdUnitsResponse { 140 | /** 141 | * 142 | */ 143 | count: number, 144 | /** 145 | * 146 | */ 147 | ad_units: Models.AdswebGetAdUnitsResponseAdUnitsAdUnit[] 148 | } 149 | export interface AdswebGetFraudHistoryResponse { 150 | /** 151 | * 152 | */ 153 | count: number, 154 | /** 155 | * 156 | */ 157 | entries: Models.AdswebGetFraudHistoryResponseEntriesEntry[] 158 | } 159 | export interface AdswebGetSitesResponse { 160 | /** 161 | * 162 | */ 163 | count: number, 164 | /** 165 | * 166 | */ 167 | sites: Models.AdswebGetSitesResponseSitesSite[] 168 | } 169 | export interface AdswebGetStatisticsResponse { 170 | /** 171 | * 172 | */ 173 | next_page_id: string, 174 | /** 175 | * 176 | */ 177 | items: Models.AdswebGetStatisticsResponseItemsItem[] 178 | } 179 | export interface AppWidgetsGetAppImageUploadServerResponse { 180 | /** 181 | * To upload an image, generate POST-request to upload_url with a file in photo field. Then call appWidgets.saveAppImage method 182 | */ 183 | upload_url: string 184 | } 185 | export type AppWidgetsGetAppImagesResponse = Models.AppWidgetsPhotos 186 | export interface AppWidgetsGetGroupImageUploadServerResponse { 187 | /** 188 | * To upload an image, generate POST-request to upload_url with a file in photo field. Then call appWidgets.saveAppImage method 189 | */ 190 | upload_url: string 191 | } 192 | export type AppWidgetsGetGroupImagesResponse = Models.AppWidgetsPhotos 193 | export type AppWidgetsGetImagesByIdResponse = Models.AppWidgetsPhoto[] 194 | export type AppWidgetsSaveAppImageResponse = Models.AppWidgetsPhoto 195 | export type AppWidgetsSaveGroupImageResponse = Models.AppWidgetsPhoto 196 | export interface AppsGetCatalogResponse { 197 | /** 198 | * Total number 199 | */ 200 | count: number, 201 | /** 202 | * 203 | */ 204 | items: Models.AppsApp[], 205 | /** 206 | * 207 | */ 208 | profiles: Models.UsersUserMin[] 209 | } 210 | export interface AppsGetFriendsListResponse { 211 | /** 212 | * Total number 213 | */ 214 | count: number, 215 | /** 216 | * 217 | */ 218 | items: Models.UsersUserFull[] 219 | } 220 | export interface AppsGetLeaderboardExtendedResponse { 221 | /** 222 | * Total number 223 | */ 224 | count: number, 225 | /** 226 | * 227 | */ 228 | items: Models.AppsLeaderboard[], 229 | /** 230 | * 231 | */ 232 | profiles: Models.UsersUserMin[] 233 | } 234 | export interface AppsGetLeaderboardResponse { 235 | /** 236 | * Total number 237 | */ 238 | count: number, 239 | /** 240 | * 241 | */ 242 | items: Models.AppsLeaderboard[] 243 | } 244 | export interface AppsGetScopesResponse { 245 | /** 246 | * Total number 247 | */ 248 | count: number, 249 | /** 250 | * 251 | */ 252 | items: Models.AppsScope[] 253 | } 254 | export type AppsGetScoreResponse = number 255 | export interface AppsGetResponse { 256 | /** 257 | * Total number of applications 258 | */ 259 | count: number, 260 | /** 261 | * List of applications 262 | */ 263 | items: Models.AppsApp[] 264 | } 265 | export type AppsSendRequestResponse = number 266 | export interface AuthRestoreResponse { 267 | /** 268 | * 1 if success 269 | */ 270 | success: number, 271 | /** 272 | * Parameter needed to grant access by code 273 | */ 274 | sid: string 275 | } 276 | export type BaseBoolResponse = Models.BaseBoolInt 277 | export type BaseGetUploadServerResponse = Models.BaseUploadServer 278 | export type BaseOkResponse = number 279 | export type BoardAddTopicResponse = number 280 | export type BoardCreateCommentResponse = number 281 | export interface BoardGetCommentsExtendedResponse { 282 | /** 283 | * Total number 284 | */ 285 | count: number, 286 | /** 287 | * 288 | */ 289 | items: Models.BoardTopicComment[], 290 | /** 291 | * 292 | */ 293 | poll: Models.BoardTopicPoll, 294 | /** 295 | * 296 | */ 297 | profiles: Models.UsersUser[], 298 | /** 299 | * 300 | */ 301 | groups: Models.GroupsGroup[] 302 | } 303 | export interface BoardGetCommentsResponse { 304 | /** 305 | * Total number 306 | */ 307 | count: number, 308 | /** 309 | * 310 | */ 311 | items: Models.BoardTopicComment[], 312 | /** 313 | * 314 | */ 315 | poll: Models.BoardTopicPoll 316 | } 317 | export interface BoardGetTopicsExtendedResponse { 318 | /** 319 | * Total number 320 | */ 321 | count: number, 322 | /** 323 | * 324 | */ 325 | items: Models.BoardTopic[], 326 | /** 327 | * 328 | */ 329 | default_order: Models.BoardDefaultOrder, 330 | /** 331 | * Information whether current user can add topic 332 | */ 333 | can_add_topics: Models.BaseBoolInt, 334 | /** 335 | * 336 | */ 337 | profiles: Models.UsersUserMin[] 338 | } 339 | export interface BoardGetTopicsResponse { 340 | /** 341 | * Total number 342 | */ 343 | count: number, 344 | /** 345 | * 346 | */ 347 | items: Models.BoardTopic[], 348 | /** 349 | * 350 | */ 351 | default_order: Models.BoardDefaultOrder, 352 | /** 353 | * Information whether current user can add topic 354 | */ 355 | can_add_topics: Models.BaseBoolInt 356 | } 357 | export interface DatabaseGetChairsResponse { 358 | /** 359 | * Total number 360 | */ 361 | count: number, 362 | /** 363 | * 364 | */ 365 | items: Models.BaseObject[] 366 | } 367 | export type DatabaseGetCitiesByIdResponse = Models.BaseObject[] 368 | export interface DatabaseGetCitiesResponse { 369 | /** 370 | * Total number 371 | */ 372 | count: number, 373 | /** 374 | * 375 | */ 376 | items: Models.DatabaseCity[] 377 | } 378 | export type DatabaseGetCountriesByIdResponse = Models.BaseCountry[] 379 | export interface DatabaseGetCountriesResponse { 380 | /** 381 | * Total number 382 | */ 383 | count: number, 384 | /** 385 | * 386 | */ 387 | items: Models.BaseCountry[] 388 | } 389 | export interface DatabaseGetFacultiesResponse { 390 | /** 391 | * Total number 392 | */ 393 | count: number, 394 | /** 395 | * 396 | */ 397 | items: Models.DatabaseFaculty[] 398 | } 399 | export type DatabaseGetMetroStationsByIdResponse = Models.DatabaseStation[] 400 | export interface DatabaseGetMetroStationsResponse { 401 | /** 402 | * Total number 403 | */ 404 | count: number, 405 | /** 406 | * 407 | */ 408 | items: Models.DatabaseStation[] 409 | } 410 | export interface DatabaseGetRegionsResponse { 411 | /** 412 | * Total number 413 | */ 414 | count: number, 415 | /** 416 | * 417 | */ 418 | items: Models.DatabaseRegion[] 419 | } 420 | export type DatabaseGetSchoolClassesResponse = any[][] 421 | export interface DatabaseGetSchoolsResponse { 422 | /** 423 | * Total number 424 | */ 425 | count: number, 426 | /** 427 | * 428 | */ 429 | items: Models.DatabaseSchool[] 430 | } 431 | export interface DatabaseGetUniversitiesResponse { 432 | /** 433 | * Total number 434 | */ 435 | count: number, 436 | /** 437 | * 438 | */ 439 | items: Models.DatabaseUniversity[] 440 | } 441 | export type DocsAddResponse = number 442 | export type DocsGetByIdResponse = Models.DocsDoc[] 443 | export interface DocsGetTypesResponse { 444 | /** 445 | * Total number 446 | */ 447 | count: number, 448 | /** 449 | * 450 | */ 451 | items: Models.DocsDocTypes[] 452 | } 453 | export type DocsGetUploadServer = Models.BaseUploadServer 454 | export interface DocsGetResponse { 455 | /** 456 | * Total number 457 | */ 458 | count: number, 459 | /** 460 | * 461 | */ 462 | items: Models.DocsDoc[] 463 | } 464 | export interface DocsSaveResponse { 465 | /** 466 | * 467 | */ 468 | type: Models.DocsDocAttachmentType, 469 | /** 470 | * 471 | */ 472 | audio_message: Models.MessagesAudioMessage, 473 | /** 474 | * 475 | */ 476 | doc: Models.DocsDoc, 477 | /** 478 | * 479 | */ 480 | graffiti: Models.MessagesGraffiti 481 | } 482 | export interface DocsSearchResponse { 483 | /** 484 | * Total number 485 | */ 486 | count: number, 487 | /** 488 | * 489 | */ 490 | items: Models.DocsDoc[] 491 | } 492 | export type DonutGetSubscriptionResponse = Models.DonutDonatorSubscriptionInfo 493 | export interface DonutGetSubscriptionsResponse { 494 | /** 495 | * 496 | */ 497 | subscriptions: Models.DonutDonatorSubscriptionInfo[], 498 | /** 499 | * 500 | */ 501 | count: number, 502 | /** 503 | * 504 | */ 505 | profiles: Models.UsersUserFull[], 506 | /** 507 | * 508 | */ 509 | groups: Models.GroupsGroupFull[] 510 | } 511 | export interface DownloadedGamesPaidStatusResponse { 512 | /** 513 | * Game has been paid 514 | */ 515 | is_paid: boolean 516 | } 517 | export type FaveAddTagResponse = Models.FaveTag 518 | export interface FaveGetPagesResponse { 519 | /** 520 | * 521 | */ 522 | count: number, 523 | /** 524 | * 525 | */ 526 | items: Models.FavePage[] 527 | } 528 | export interface FaveGetTagsResponse { 529 | /** 530 | * 531 | */ 532 | count: number, 533 | /** 534 | * 535 | */ 536 | items: Models.FaveTag[] 537 | } 538 | export interface FaveGetExtendedResponse { 539 | /** 540 | * Total number 541 | */ 542 | count: number, 543 | /** 544 | * 545 | */ 546 | items: Models.FaveBookmark[], 547 | /** 548 | * 549 | */ 550 | profiles: Models.UsersUserFull[], 551 | /** 552 | * 553 | */ 554 | groups: Models.GroupsGroup[] 555 | } 556 | export interface FaveGetResponse { 557 | /** 558 | * Total number 559 | */ 560 | count: number, 561 | /** 562 | * 563 | */ 564 | items: Models.FaveBookmark[] 565 | } 566 | export interface FriendsAddListResponse { 567 | /** 568 | * List ID 569 | */ 570 | list_id: number 571 | } 572 | export type FriendsAddResponse = number 573 | export type FriendsAreFriendsExtendedResponse = Models.FriendsFriendExtendedStatus[] 574 | export type FriendsAreFriendsResponse = Models.FriendsFriendStatus[] 575 | export interface FriendsDeleteResponse { 576 | /** 577 | * 578 | */ 579 | success: number, 580 | /** 581 | * Returns 1 if friend has been deleted 582 | */ 583 | friend_deleted: number, 584 | /** 585 | * Returns 1 if out request has been canceled 586 | */ 587 | out_request_deleted: number, 588 | /** 589 | * Returns 1 if incoming request has been declined 590 | */ 591 | in_request_deleted: number, 592 | /** 593 | * Returns 1 if suggestion has been declined 594 | */ 595 | suggestion_deleted: number 596 | } 597 | export type FriendsGetAppUsersResponse = number[] 598 | export type FriendsGetByPhonesResponse = Models.FriendsUserXtrPhone[] 599 | export interface FriendsGetListsResponse { 600 | /** 601 | * Total number of friends lists 602 | */ 603 | count: number, 604 | /** 605 | * 606 | */ 607 | items: Models.FriendsFriendsList[] 608 | } 609 | export type FriendsGetMutualResponse = number[] 610 | export type FriendsGetMutualTargetUidsResponse = Models.FriendsMutualFriend[] 611 | export interface FriendsGetOnlineOnlineMobileResponse { 612 | /** 613 | * 614 | */ 615 | online: number[], 616 | /** 617 | * 618 | */ 619 | online_mobile: number[] 620 | } 621 | export type FriendsGetOnlineResponse = number[] 622 | export type FriendsGetRecentResponse = number[] 623 | export interface FriendsGetRequestsExtendedResponse { 624 | /** 625 | * Total requests number 626 | */ 627 | count: number, 628 | /** 629 | * 630 | */ 631 | items: Models.FriendsRequestsXtrMessage[] 632 | } 633 | export interface FriendsGetRequestsNeedMutualResponse { 634 | /** 635 | * Total requests number 636 | */ 637 | count: number, 638 | /** 639 | * 640 | */ 641 | items: Models.FriendsRequests[] 642 | } 643 | export interface FriendsGetRequestsResponse { 644 | /** 645 | * Total requests number 646 | */ 647 | count: number, 648 | /** 649 | * 650 | */ 651 | items: number[], 652 | /** 653 | * Total unread requests number 654 | */ 655 | count_unread: number 656 | } 657 | export interface FriendsGetSuggestionsResponse { 658 | /** 659 | * Total results number 660 | */ 661 | count: number, 662 | /** 663 | * 664 | */ 665 | items: Models.UsersUserFull[] 666 | } 667 | export interface FriendsGetFieldsResponse { 668 | /** 669 | * Total friends number 670 | */ 671 | count: number, 672 | /** 673 | * 674 | */ 675 | items: Models.FriendsUserXtrLists[] 676 | } 677 | export interface FriendsGetResponse { 678 | /** 679 | * Total friends number 680 | */ 681 | count: number, 682 | /** 683 | * 684 | */ 685 | items: number[] 686 | } 687 | export interface FriendsSearchResponse { 688 | /** 689 | * Total number 690 | */ 691 | count: number, 692 | /** 693 | * 694 | */ 695 | items: Models.UsersUserFull[] 696 | } 697 | export interface GiftsGetResponse { 698 | /** 699 | * Total number 700 | */ 701 | count: number, 702 | /** 703 | * 704 | */ 705 | items: Models.GiftsGift[] 706 | } 707 | export type GroupsAddAddressResponse = Models.GroupsAddress 708 | export interface GroupsAddCallbackServerResponse { 709 | /** 710 | * 711 | */ 712 | server_id: number 713 | } 714 | export type GroupsAddLinkResponse = Models.GroupsGroupLink 715 | export type GroupsCreateResponse = Models.GroupsGroup 716 | export type GroupsEditAddressResponse = Models.GroupsAddress 717 | export interface GroupsGetAddressesResponse { 718 | /** 719 | * Total count of addresses 720 | */ 721 | count: number, 722 | /** 723 | * 724 | */ 725 | items: Models.GroupsAddress[] 726 | } 727 | export interface GroupsGetBannedResponse { 728 | /** 729 | * Total users number 730 | */ 731 | count: number, 732 | /** 733 | * 734 | */ 735 | items: Models.GroupsBannedItem[] 736 | } 737 | export type GroupsGetByIdLegacyResponse = Models.GroupsGroupFull[] 738 | export interface GroupsGetByIdResponse { 739 | /** 740 | * 741 | */ 742 | groups: Models.GroupsGroupFull[], 743 | /** 744 | * 745 | */ 746 | profiles: Models.GroupsProfileItem[] 747 | } 748 | export interface GroupsGetCallbackConfirmationCodeResponse { 749 | /** 750 | * Confirmation code 751 | */ 752 | code: string 753 | } 754 | export interface GroupsGetCallbackServersResponse { 755 | /** 756 | * 757 | */ 758 | count: number, 759 | /** 760 | * 761 | */ 762 | items: Models.GroupsCallbackServer[] 763 | } 764 | export type GroupsGetCallbackSettingsResponse = Models.GroupsCallbackSettings 765 | export interface GroupsGetCatalogInfoExtendedResponse { 766 | /** 767 | * Information whether catalog is enabled for current user 768 | */ 769 | enabled: number, 770 | /** 771 | * 772 | */ 773 | categories: Models.GroupsGroupCategoryFull[] 774 | } 775 | export interface GroupsGetCatalogInfoResponse { 776 | /** 777 | * Information whether catalog is enabled for current user 778 | */ 779 | enabled: number, 780 | /** 781 | * 782 | */ 783 | categories: Models.GroupsGroupCategory[] 784 | } 785 | export interface GroupsGetCatalogResponse { 786 | /** 787 | * Total communities number 788 | */ 789 | count: number, 790 | /** 791 | * 792 | */ 793 | items: Models.GroupsGroup[] 794 | } 795 | export interface GroupsGetInvitedUsersResponse { 796 | /** 797 | * Total communities number 798 | */ 799 | count: number, 800 | /** 801 | * 802 | */ 803 | items: Models.UsersUserFull[] 804 | } 805 | export interface GroupsGetInvitesExtendedResponse { 806 | /** 807 | * Total communities number 808 | */ 809 | count: number, 810 | /** 811 | * 812 | */ 813 | items: Models.GroupsGroupFull[], 814 | /** 815 | * 816 | */ 817 | profiles: Models.UsersUserMin[], 818 | /** 819 | * 820 | */ 821 | groups: Models.GroupsGroupFull[] 822 | } 823 | export interface GroupsGetInvitesResponse { 824 | /** 825 | * Total communities number 826 | */ 827 | count: number, 828 | /** 829 | * 830 | */ 831 | items: Models.GroupsGroupFull[] 832 | } 833 | export type GroupsGetLongPollServerResponse = Models.GroupsLongPollServer 834 | export type GroupsGetLongPollSettingsResponse = Models.GroupsLongPollSettings 835 | export interface GroupsGetMembersFieldsResponse { 836 | /** 837 | * Total members number 838 | */ 839 | count: number, 840 | /** 841 | * 842 | */ 843 | items: Models.GroupsUserXtrRole[] 844 | } 845 | export interface GroupsGetMembersFilterResponse { 846 | /** 847 | * Total members number 848 | */ 849 | count: number, 850 | /** 851 | * 852 | */ 853 | items: Models.GroupsMemberRole[] 854 | } 855 | export interface GroupsGetMembersResponse { 856 | /** 857 | * Total members number 858 | */ 859 | count: number, 860 | /** 861 | * 862 | */ 863 | items: number[] 864 | } 865 | export interface GroupsGetRequestsFieldsResponse { 866 | /** 867 | * Total communities number 868 | */ 869 | count: number, 870 | /** 871 | * 872 | */ 873 | items: Models.UsersUserFull[] 874 | } 875 | export interface GroupsGetRequestsResponse { 876 | /** 877 | * Total communities number 878 | */ 879 | count: number, 880 | /** 881 | * 882 | */ 883 | items: number[] 884 | } 885 | export type GroupsGetSettingsResponse = any 886 | export type GroupsGetTagListResponse = Models.GroupsGroupTag[] 887 | export interface GroupsGetTokenPermissionsResponse { 888 | /** 889 | * 890 | */ 891 | mask: number, 892 | /** 893 | * 894 | */ 895 | permissions: Models.GroupsTokenPermissionSetting[] 896 | } 897 | export interface GroupsGetExtendedResponse { 898 | /** 899 | * Total communities number 900 | */ 901 | count: number, 902 | /** 903 | * 904 | */ 905 | items: Models.GroupsGroupFull[] 906 | } 907 | export interface GroupsGetResponse { 908 | /** 909 | * Total communities number 910 | */ 911 | count: number, 912 | /** 913 | * 914 | */ 915 | items: number[] 916 | } 917 | export interface GroupsIsMemberExtendedResponse { 918 | /** 919 | * Information whether user is a member of the group 920 | */ 921 | member: Models.BaseBoolInt, 922 | /** 923 | * Information whether user has been invited to the group 924 | */ 925 | invitation: Models.BaseBoolInt, 926 | /** 927 | * Information whether user can be invited 928 | */ 929 | can_invite: Models.BaseBoolInt, 930 | /** 931 | * Information whether user's invite to the group can be recalled 932 | */ 933 | can_recall: Models.BaseBoolInt, 934 | /** 935 | * Information whether user has sent request to the group 936 | */ 937 | request: Models.BaseBoolInt 938 | } 939 | export type GroupsIsMemberResponse = Models.BaseBoolInt 940 | export type GroupsIsMemberUserIdsExtendedResponse = Models.GroupsMemberStatusFull[] 941 | export type GroupsIsMemberUserIdsResponse = Models.GroupsMemberStatus[] 942 | export interface GroupsSearchResponse { 943 | /** 944 | * Total communities number 945 | */ 946 | count: number, 947 | /** 948 | * 949 | */ 950 | items: Models.GroupsGroup[] 951 | } 952 | export interface LikesAddResponse { 953 | /** 954 | * Total likes number 955 | */ 956 | likes: number 957 | } 958 | export interface LikesDeleteResponse { 959 | /** 960 | * Total likes number 961 | */ 962 | likes: number 963 | } 964 | export interface LikesGetListExtendedResponse { 965 | /** 966 | * Total number 967 | */ 968 | count: number, 969 | /** 970 | * 971 | */ 972 | items: Models.UsersUserMin[] 973 | } 974 | export interface LikesGetListResponse { 975 | /** 976 | * Total number 977 | */ 978 | count: number, 979 | /** 980 | * 981 | */ 982 | items: number[] 983 | } 984 | export interface LikesIsLikedResponse { 985 | /** 986 | * Information whether user liked the object 987 | */ 988 | liked: Models.BaseBoolInt, 989 | /** 990 | * Information whether user reposted the object 991 | */ 992 | copied: Models.BaseBoolInt 993 | } 994 | export interface MarketAddAlbumResponse { 995 | /** 996 | * Album ID 997 | */ 998 | market_album_id: number 999 | } 1000 | export interface MarketAddResponse { 1001 | /** 1002 | * Item ID 1003 | */ 1004 | market_item_id: number 1005 | } 1006 | export type MarketCreateCommentResponse = number 1007 | export type MarketDeleteCommentResponse = Models.BaseBoolInt 1008 | export interface MarketGetAlbumByIdResponse { 1009 | /** 1010 | * Total number 1011 | */ 1012 | count: number, 1013 | /** 1014 | * 1015 | */ 1016 | items: Models.MarketMarketAlbum[] 1017 | } 1018 | export interface MarketGetAlbumsResponse { 1019 | /** 1020 | * Total number 1021 | */ 1022 | count: number, 1023 | /** 1024 | * 1025 | */ 1026 | items: Models.MarketMarketAlbum[] 1027 | } 1028 | export interface MarketGetByIdExtendedResponse { 1029 | /** 1030 | * Total number 1031 | */ 1032 | count: number, 1033 | /** 1034 | * 1035 | */ 1036 | items: Models.MarketMarketItemFull[] 1037 | } 1038 | export interface MarketGetByIdResponse { 1039 | /** 1040 | * Total number 1041 | */ 1042 | count: number, 1043 | /** 1044 | * 1045 | */ 1046 | items: Models.MarketMarketItem[] 1047 | } 1048 | export interface MarketGetCategoriesNewResponse { 1049 | /** 1050 | * 1051 | */ 1052 | items: Models.MarketMarketCategoryTree[] 1053 | } 1054 | export interface MarketGetCategoriesResponse { 1055 | /** 1056 | * Total number 1057 | */ 1058 | count: number, 1059 | /** 1060 | * 1061 | */ 1062 | items: Models.MarketMarketCategory[] 1063 | } 1064 | export interface MarketGetCommentsResponse { 1065 | /** 1066 | * Total number 1067 | */ 1068 | count: number, 1069 | /** 1070 | * 1071 | */ 1072 | items: Models.WallWallComment[] 1073 | } 1074 | export interface MarketGetGroupOrdersResponse { 1075 | /** 1076 | * Total number 1077 | */ 1078 | count: number, 1079 | /** 1080 | * 1081 | */ 1082 | items: Models.MarketOrder[] 1083 | } 1084 | export interface MarketGetOrderByIdResponse { 1085 | /** 1086 | * 1087 | */ 1088 | order: Models.MarketOrder 1089 | } 1090 | export interface MarketGetOrderItemsResponse { 1091 | /** 1092 | * Total number 1093 | */ 1094 | count: number, 1095 | /** 1096 | * 1097 | */ 1098 | items: Models.MarketOrderItem[] 1099 | } 1100 | export interface MarketGetOrdersExtendedResponse { 1101 | /** 1102 | * Total number 1103 | */ 1104 | count: number, 1105 | /** 1106 | * 1107 | */ 1108 | items: Models.MarketOrder[], 1109 | /** 1110 | * 1111 | */ 1112 | groups: Models.GroupsGroupFull[] 1113 | } 1114 | export interface MarketGetOrdersResponse { 1115 | /** 1116 | * Total number 1117 | */ 1118 | count: number, 1119 | /** 1120 | * 1121 | */ 1122 | items: Models.MarketOrder[] 1123 | } 1124 | export interface MarketGetExtendedResponse { 1125 | /** 1126 | * Total number 1127 | */ 1128 | count: number, 1129 | /** 1130 | * 1131 | */ 1132 | items: Models.MarketMarketItemFull[] 1133 | } 1134 | export interface MarketGetResponse { 1135 | /** 1136 | * Total number 1137 | */ 1138 | count: number, 1139 | /** 1140 | * 1141 | */ 1142 | items: Models.MarketMarketItem[] 1143 | } 1144 | export type MarketRestoreCommentResponse = Models.BaseBoolInt 1145 | export interface MarketSearchExtendedResponse { 1146 | /** 1147 | * Total number 1148 | */ 1149 | count: number, 1150 | /** 1151 | * 1152 | */ 1153 | items: Models.MarketMarketItemFull[] 1154 | } 1155 | export interface MarketSearchResponse { 1156 | /** 1157 | * Total number 1158 | */ 1159 | count: number, 1160 | /** 1161 | * 1162 | */ 1163 | items: Models.MarketMarketItem[] 1164 | } 1165 | export type MessagesCreateChatResponse = number 1166 | export interface MessagesDeleteChatPhotoResponse { 1167 | /** 1168 | * Service message ID 1169 | */ 1170 | message_id: number, 1171 | /** 1172 | * 1173 | */ 1174 | chat: Models.MessagesChat 1175 | } 1176 | export interface MessagesDeleteConversationResponse { 1177 | /** 1178 | * Id of the last message, that was deleted 1179 | */ 1180 | last_deleted_id: number 1181 | } 1182 | export interface MessagesDeleteResponse { 1183 | } 1184 | export type MessagesEditResponse = Models.BaseBoolInt 1185 | export interface MessagesGetByConversationMessageIdResponse { 1186 | /** 1187 | * Total number 1188 | */ 1189 | count: number, 1190 | /** 1191 | * 1192 | */ 1193 | items: Models.MessagesMessage[] 1194 | } 1195 | export interface MessagesGetByIdExtendedResponse { 1196 | /** 1197 | * Total number 1198 | */ 1199 | count: number, 1200 | /** 1201 | * 1202 | */ 1203 | items: Models.MessagesMessage[], 1204 | /** 1205 | * 1206 | */ 1207 | profiles: Models.UsersUserFull[], 1208 | /** 1209 | * 1210 | */ 1211 | groups: Models.GroupsGroupFull[] 1212 | } 1213 | export interface MessagesGetByIdResponse { 1214 | /** 1215 | * Total number 1216 | */ 1217 | count: number, 1218 | /** 1219 | * 1220 | */ 1221 | items: Models.MessagesMessage[] 1222 | } 1223 | export interface MessagesGetChatPreviewResponse { 1224 | /** 1225 | * 1226 | */ 1227 | preview: Models.MessagesChatPreview, 1228 | /** 1229 | * 1230 | */ 1231 | profiles: Models.UsersUserFull[] 1232 | } 1233 | export type MessagesGetChatChatIdsFieldsResponse = Models.MessagesChatFull[] 1234 | export type MessagesGetChatChatIdsResponse = Models.MessagesChat[] 1235 | export type MessagesGetChatFieldsResponse = Models.MessagesChatFull 1236 | export type MessagesGetChatResponse = Models.MessagesChat 1237 | export interface MessagesGetConversationMembersResponse { 1238 | /** 1239 | * Chat members count 1240 | */ 1241 | count: number, 1242 | /** 1243 | * 1244 | */ 1245 | items: Models.MessagesConversationMember[], 1246 | /** 1247 | * 1248 | */ 1249 | chat_restrictions: Models.MessagesChatRestrictions, 1250 | /** 1251 | * 1252 | */ 1253 | profiles: Models.UsersUserFull[], 1254 | /** 1255 | * 1256 | */ 1257 | groups: Models.GroupsGroupFull[] 1258 | } 1259 | export interface MessagesGetConversationsByIdExtendedResponse { 1260 | /** 1261 | * Total number 1262 | */ 1263 | count: number, 1264 | /** 1265 | * 1266 | */ 1267 | items: Models.MessagesConversation[], 1268 | /** 1269 | * 1270 | */ 1271 | profiles: Models.UsersUser[] 1272 | } 1273 | export interface MessagesGetConversationsByIdResponse { 1274 | /** 1275 | * Total number 1276 | */ 1277 | count: number, 1278 | /** 1279 | * 1280 | */ 1281 | items: Models.MessagesConversation[] 1282 | } 1283 | export interface MessagesGetConversationsResponse { 1284 | /** 1285 | * Total number 1286 | */ 1287 | count: number, 1288 | /** 1289 | * Unread dialogs number 1290 | */ 1291 | unread_count: number, 1292 | /** 1293 | * 1294 | */ 1295 | items: Models.MessagesConversationWithMessage[], 1296 | /** 1297 | * 1298 | */ 1299 | profiles: Models.UsersUserFull[], 1300 | /** 1301 | * 1302 | */ 1303 | groups: Models.GroupsGroupFull[] 1304 | } 1305 | export interface MessagesGetHistoryAttachmentsResponse { 1306 | /** 1307 | * 1308 | */ 1309 | items: Models.MessagesHistoryAttachment[], 1310 | /** 1311 | * Value for pagination 1312 | */ 1313 | next_from: string 1314 | } 1315 | export interface MessagesGetHistoryExtendedResponse { 1316 | /** 1317 | * Total number 1318 | */ 1319 | count: number, 1320 | /** 1321 | * 1322 | */ 1323 | items: Models.MessagesMessage[], 1324 | /** 1325 | * 1326 | */ 1327 | profiles: Models.UsersUserFull[], 1328 | /** 1329 | * 1330 | */ 1331 | groups: Models.GroupsGroupFull[], 1332 | /** 1333 | * 1334 | */ 1335 | conversations: Models.MessagesConversation[] 1336 | } 1337 | export interface MessagesGetHistoryResponse { 1338 | /** 1339 | * Total number 1340 | */ 1341 | count: number, 1342 | /** 1343 | * 1344 | */ 1345 | items: Models.MessagesMessage[] 1346 | } 1347 | export interface MessagesGetImportantMessagesExtendedResponse { 1348 | /** 1349 | * 1350 | */ 1351 | messages: Models.MessagesMessagesArray, 1352 | /** 1353 | * 1354 | */ 1355 | profiles: Models.UsersUser[], 1356 | /** 1357 | * 1358 | */ 1359 | groups: Models.GroupsGroup[], 1360 | /** 1361 | * 1362 | */ 1363 | conversations: Models.MessagesConversation[] 1364 | } 1365 | export interface MessagesGetImportantMessagesResponse { 1366 | /** 1367 | * 1368 | */ 1369 | messages: Models.MessagesMessagesArray, 1370 | /** 1371 | * 1372 | */ 1373 | profiles: Models.UsersUser[], 1374 | /** 1375 | * 1376 | */ 1377 | groups: Models.GroupsGroup[], 1378 | /** 1379 | * 1380 | */ 1381 | conversations: Models.MessagesConversation[] 1382 | } 1383 | export interface MessagesGetIntentUsersResponse { 1384 | /** 1385 | * 1386 | */ 1387 | count: number, 1388 | /** 1389 | * 1390 | */ 1391 | items: number[], 1392 | /** 1393 | * 1394 | */ 1395 | profiles: Models.UsersUserFull[] 1396 | } 1397 | export interface MessagesGetInviteLinkResponse { 1398 | /** 1399 | * 1400 | */ 1401 | link: string 1402 | } 1403 | export type MessagesGetLastActivityResponse = Models.MessagesLastActivity 1404 | export interface MessagesGetLongPollHistoryResponse { 1405 | /** 1406 | * 1407 | */ 1408 | history: number[][], 1409 | /** 1410 | * 1411 | */ 1412 | messages: Models.MessagesLongpollMessages, 1413 | /** 1414 | * 1415 | */ 1416 | credentials: Models.MessagesLongpollParams, 1417 | /** 1418 | * 1419 | */ 1420 | profiles: Models.UsersUserFull[], 1421 | /** 1422 | * 1423 | */ 1424 | groups: Models.GroupsGroup[], 1425 | /** 1426 | * 1427 | */ 1428 | chats: Models.MessagesChat[], 1429 | /** 1430 | * Persistence timestamp 1431 | */ 1432 | new_pts: number, 1433 | /** 1434 | * 1435 | */ 1436 | from_pts: number, 1437 | /** 1438 | * Has more 1439 | */ 1440 | more: boolean, 1441 | /** 1442 | * 1443 | */ 1444 | conversations: Models.MessagesConversation[] 1445 | } 1446 | export type MessagesGetLongPollServerResponse = Models.MessagesLongpollParams 1447 | export interface MessagesIsMessagesFromGroupAllowedResponse { 1448 | /** 1449 | * 1450 | */ 1451 | is_allowed: Models.BaseBoolInt 1452 | } 1453 | export interface MessagesJoinChatByInviteLinkResponse { 1454 | /** 1455 | * 1456 | */ 1457 | chat_id: number 1458 | } 1459 | export type MessagesMarkAsImportantResponse = number[] 1460 | export type MessagesPinResponse = Models.MessagesPinnedMessage 1461 | export interface MessagesSearchConversationsResponse { 1462 | /** 1463 | * Total results number 1464 | */ 1465 | count: number, 1466 | /** 1467 | * 1468 | */ 1469 | items: Models.MessagesConversation[], 1470 | /** 1471 | * 1472 | */ 1473 | profiles: Models.UsersUserFull[], 1474 | /** 1475 | * 1476 | */ 1477 | groups: Models.GroupsGroupFull[] 1478 | } 1479 | export interface MessagesSearchExtendedResponse { 1480 | /** 1481 | * Total number 1482 | */ 1483 | count: number, 1484 | /** 1485 | * 1486 | */ 1487 | items: Models.MessagesMessage[], 1488 | /** 1489 | * 1490 | */ 1491 | profiles: Models.UsersUserFull[], 1492 | /** 1493 | * 1494 | */ 1495 | groups: Models.GroupsGroupFull[], 1496 | /** 1497 | * 1498 | */ 1499 | conversations: Models.MessagesConversation[] 1500 | } 1501 | export interface MessagesSearchResponse { 1502 | /** 1503 | * Total number 1504 | */ 1505 | count: number, 1506 | /** 1507 | * 1508 | */ 1509 | items: Models.MessagesMessage[] 1510 | } 1511 | export type MessagesSendResponse = number 1512 | export type MessagesSendUserIdsResponse = any 1513 | export interface MessagesSetChatPhotoResponse { 1514 | /** 1515 | * Service message ID 1516 | */ 1517 | message_id: number, 1518 | /** 1519 | * 1520 | */ 1521 | chat: Models.MessagesChat 1522 | } 1523 | export interface NewsfeedGetBannedExtendedResponse { 1524 | /** 1525 | * 1526 | */ 1527 | groups: Models.UsersUserFull[], 1528 | /** 1529 | * 1530 | */ 1531 | profiles: Models.GroupsGroupFull[] 1532 | } 1533 | export interface NewsfeedGetBannedResponse { 1534 | /** 1535 | * 1536 | */ 1537 | groups: number[], 1538 | /** 1539 | * 1540 | */ 1541 | members: number[] 1542 | } 1543 | export interface NewsfeedGetCommentsResponse { 1544 | /** 1545 | * 1546 | */ 1547 | items: Models.NewsfeedNewsfeedItem[], 1548 | /** 1549 | * 1550 | */ 1551 | profiles: Models.UsersUserFull[], 1552 | /** 1553 | * 1554 | */ 1555 | groups: Models.GroupsGroupFull[], 1556 | /** 1557 | * New from value 1558 | */ 1559 | next_from: string 1560 | } 1561 | export interface NewsfeedGetListsExtendedResponse { 1562 | /** 1563 | * Total number 1564 | */ 1565 | count: number, 1566 | /** 1567 | * 1568 | */ 1569 | items: Models.NewsfeedListFull[] 1570 | } 1571 | export interface NewsfeedGetListsResponse { 1572 | /** 1573 | * Total number 1574 | */ 1575 | count: number, 1576 | /** 1577 | * 1578 | */ 1579 | items: Models.NewsfeedList[] 1580 | } 1581 | export interface NewsfeedGetMentionsResponse { 1582 | /** 1583 | * Total number 1584 | */ 1585 | count: number, 1586 | /** 1587 | * 1588 | */ 1589 | items: Models.WallWallpostToId[] 1590 | } 1591 | export interface NewsfeedGetRecommendedResponse { 1592 | /** 1593 | * 1594 | */ 1595 | items: Models.NewsfeedNewsfeedItem[], 1596 | /** 1597 | * 1598 | */ 1599 | profiles: Models.UsersUserFull[], 1600 | /** 1601 | * 1602 | */ 1603 | groups: Models.GroupsGroupFull[], 1604 | /** 1605 | * New offset value 1606 | */ 1607 | new_offset: string, 1608 | /** 1609 | * Next from value 1610 | */ 1611 | next_from: string 1612 | } 1613 | export interface NewsfeedGetSuggestedSourcesResponse { 1614 | /** 1615 | * Total number 1616 | */ 1617 | count: number, 1618 | /** 1619 | * 1620 | */ 1621 | items: Models.UsersSubscriptionsItem[] 1622 | } 1623 | export interface NewsfeedGetResponse { 1624 | /** 1625 | * 1626 | */ 1627 | items: Models.NewsfeedNewsfeedItem[], 1628 | /** 1629 | * 1630 | */ 1631 | profiles: Models.UsersUserFull[], 1632 | /** 1633 | * 1634 | */ 1635 | groups: Models.GroupsGroupFull[], 1636 | /** 1637 | * New from value 1638 | */ 1639 | next_from: string 1640 | } 1641 | export type NewsfeedSaveListResponse = number 1642 | export interface NewsfeedSearchExtendedResponse { 1643 | /** 1644 | * 1645 | */ 1646 | items: Models.WallWallpostFull[], 1647 | /** 1648 | * 1649 | */ 1650 | profiles: Models.UsersUserFull[], 1651 | /** 1652 | * 1653 | */ 1654 | groups: Models.GroupsGroupFull[], 1655 | /** 1656 | * 1657 | */ 1658 | suggested_queries: string[], 1659 | /** 1660 | * 1661 | */ 1662 | next_from: string, 1663 | /** 1664 | * Filtered number 1665 | */ 1666 | count: number, 1667 | /** 1668 | * Total number 1669 | */ 1670 | total_count: number 1671 | } 1672 | export interface NewsfeedSearchResponse { 1673 | /** 1674 | * 1675 | */ 1676 | items: Models.WallWallpostFull[], 1677 | /** 1678 | * 1679 | */ 1680 | suggested_queries: string[], 1681 | /** 1682 | * 1683 | */ 1684 | next_from: string, 1685 | /** 1686 | * Filtered number 1687 | */ 1688 | count: number, 1689 | /** 1690 | * Total number 1691 | */ 1692 | total_count: number 1693 | } 1694 | export type NotesAddResponse = number 1695 | export type NotesCreateCommentResponse = number 1696 | export type NotesGetByIdResponse = Models.NotesNote 1697 | export interface NotesGetCommentsResponse { 1698 | /** 1699 | * Total number 1700 | */ 1701 | count: number, 1702 | /** 1703 | * 1704 | */ 1705 | items: Models.NotesNoteComment[] 1706 | } 1707 | export interface NotesGetResponse { 1708 | /** 1709 | * Total number 1710 | */ 1711 | count: number, 1712 | /** 1713 | * 1714 | */ 1715 | items: Models.NotesNote[] 1716 | } 1717 | export interface NotificationsGetResponse { 1718 | /** 1719 | * Total number 1720 | */ 1721 | count: number, 1722 | /** 1723 | * 1724 | */ 1725 | items: Models.NotificationsNotificationItem[], 1726 | /** 1727 | * 1728 | */ 1729 | profiles: Models.UsersUser[], 1730 | /** 1731 | * 1732 | */ 1733 | groups: Models.GroupsGroup[], 1734 | /** 1735 | * Time when user has been checked notifications last time 1736 | */ 1737 | last_viewed: number, 1738 | /** 1739 | * 1740 | */ 1741 | photos: Models.PhotosPhoto[], 1742 | /** 1743 | * 1744 | */ 1745 | videos: Models.VideoVideo[], 1746 | /** 1747 | * 1748 | */ 1749 | apps: Models.AppsApp[], 1750 | /** 1751 | * 1752 | */ 1753 | next_from: string, 1754 | /** 1755 | * 1756 | */ 1757 | ttl: number 1758 | } 1759 | export type NotificationsMarkAsViewedResponse = Models.BaseBoolInt 1760 | export type NotificationsSendMessageResponse = Models.NotificationsSendMessageItem[] 1761 | export type OrdersCancelSubscriptionResponse = Models.BaseBoolInt 1762 | export type OrdersChangeStateResponse = string 1763 | export type OrdersGetAmountResponse = Models.OrdersAmount 1764 | export type OrdersGetByIdResponse = Models.OrdersOrder[] 1765 | export type OrdersGetUserSubscriptionByIdResponse = Models.OrdersSubscription 1766 | export interface OrdersGetUserSubscriptionsResponse { 1767 | /** 1768 | * Total number 1769 | */ 1770 | count: number, 1771 | /** 1772 | * 1773 | */ 1774 | items: Models.OrdersSubscription[] 1775 | } 1776 | export type OrdersGetResponse = Models.OrdersOrder[] 1777 | export type OrdersUpdateSubscriptionResponse = Models.BaseBoolInt 1778 | export type PagesGetHistoryResponse = Models.PagesWikipageHistory[] 1779 | export type PagesGetTitlesResponse = Models.PagesWikipage[] 1780 | export type PagesGetVersionResponse = Models.PagesWikipageFull 1781 | export type PagesGetResponse = Models.PagesWikipageFull 1782 | export type PagesParseWikiResponse = string 1783 | export type PagesSaveAccessResponse = number 1784 | export type PagesSaveResponse = number 1785 | export type PhotosCopyResponse = number 1786 | export type PhotosCreateAlbumResponse = Models.PhotosPhotoAlbumFull 1787 | export type PhotosCreateCommentResponse = number 1788 | export type PhotosDeleteCommentResponse = Models.BaseBoolInt 1789 | export type PhotosGetAlbumsCountResponse = number 1790 | export interface PhotosGetAlbumsResponse { 1791 | /** 1792 | * Total number 1793 | */ 1794 | count: number, 1795 | /** 1796 | * 1797 | */ 1798 | items: Models.PhotosPhotoAlbumFull[] 1799 | } 1800 | export interface PhotosGetAllCommentsResponse { 1801 | /** 1802 | * Total number 1803 | */ 1804 | count: number, 1805 | /** 1806 | * 1807 | */ 1808 | items: Models.PhotosCommentXtrPid[] 1809 | } 1810 | export interface PhotosGetAllExtendedResponse { 1811 | /** 1812 | * Total number 1813 | */ 1814 | count: number, 1815 | /** 1816 | * 1817 | */ 1818 | items: Models.PhotosPhotoFullXtrRealOffset[], 1819 | /** 1820 | * Information whether next page is presented 1821 | */ 1822 | more: Models.BaseBoolInt 1823 | } 1824 | export interface PhotosGetAllResponse { 1825 | /** 1826 | * Total number 1827 | */ 1828 | count: number, 1829 | /** 1830 | * 1831 | */ 1832 | items: Models.PhotosPhotoXtrRealOffset[], 1833 | /** 1834 | * Information whether next page is presented 1835 | */ 1836 | more: Models.BaseBoolInt 1837 | } 1838 | export type PhotosGetByIdExtendedResponse = Models.PhotosPhotoFull[] 1839 | export type PhotosGetByIdResponse = Models.PhotosPhoto[] 1840 | export interface PhotosGetCommentsExtendedResponse { 1841 | /** 1842 | * Total number 1843 | */ 1844 | count: number, 1845 | /** 1846 | * Real offset of the comments 1847 | */ 1848 | real_offset: number, 1849 | /** 1850 | * 1851 | */ 1852 | items: Models.WallWallComment[], 1853 | /** 1854 | * 1855 | */ 1856 | profiles: Models.UsersUserFull[], 1857 | /** 1858 | * 1859 | */ 1860 | groups: Models.GroupsGroupFull[] 1861 | } 1862 | export interface PhotosGetCommentsResponse { 1863 | /** 1864 | * Total number 1865 | */ 1866 | count: number, 1867 | /** 1868 | * Real offset of the comments 1869 | */ 1870 | real_offset: number, 1871 | /** 1872 | * 1873 | */ 1874 | items: Models.WallWallComment[] 1875 | } 1876 | export type PhotosGetMarketUploadServerResponse = Models.BaseUploadServer 1877 | export type PhotosGetMessagesUploadServerResponse = Models.PhotosPhotoUpload 1878 | export interface PhotosGetNewTagsResponse { 1879 | /** 1880 | * Total number 1881 | */ 1882 | count: number, 1883 | /** 1884 | * 1885 | */ 1886 | items: Models.PhotosPhotoXtrTagInfo[] 1887 | } 1888 | export type PhotosGetTagsResponse = Models.PhotosPhotoTag[] 1889 | export type PhotosGetUploadServerResponse = Models.PhotosPhotoUpload 1890 | export interface PhotosGetUserPhotosExtendedResponse { 1891 | /** 1892 | * Total number 1893 | */ 1894 | count: number, 1895 | /** 1896 | * 1897 | */ 1898 | items: Models.PhotosPhotoFull[] 1899 | } 1900 | export interface PhotosGetUserPhotosResponse { 1901 | /** 1902 | * Total number 1903 | */ 1904 | count: number, 1905 | /** 1906 | * 1907 | */ 1908 | items: Models.PhotosPhoto[] 1909 | } 1910 | export type PhotosGetWallUploadServerResponse = Models.PhotosPhotoUpload 1911 | export interface PhotosGetExtendedResponse { 1912 | /** 1913 | * Total number 1914 | */ 1915 | count: number, 1916 | /** 1917 | * 1918 | */ 1919 | items: Models.PhotosPhotoFull[] 1920 | } 1921 | export interface PhotosGetResponse { 1922 | /** 1923 | * Total number 1924 | */ 1925 | count: number, 1926 | /** 1927 | * 1928 | */ 1929 | items: Models.PhotosPhoto[] 1930 | } 1931 | export type PhotosPutTagResponse = number 1932 | export type PhotosRestoreCommentResponse = Models.BaseBoolInt 1933 | export type PhotosSaveMarketAlbumPhotoResponse = Models.PhotosPhoto[] 1934 | export type PhotosSaveMarketPhotoResponse = Models.PhotosPhoto[] 1935 | export type PhotosSaveMessagesPhotoResponse = Models.PhotosPhoto[] 1936 | export type PhotosSaveOwnerCoverPhotoResponse = Models.BaseImage[] 1937 | export interface PhotosSaveOwnerPhotoResponse { 1938 | /** 1939 | * Photo hash 1940 | */ 1941 | photo_hash: string, 1942 | /** 1943 | * Uploaded image url 1944 | */ 1945 | photo_src: string, 1946 | /** 1947 | * Uploaded image url 1948 | */ 1949 | photo_src_big: string, 1950 | /** 1951 | * Uploaded image url 1952 | */ 1953 | photo_src_small: string, 1954 | /** 1955 | * Returns 1 if profile photo is saved 1956 | */ 1957 | saved: number, 1958 | /** 1959 | * Created post ID 1960 | */ 1961 | post_id: number 1962 | } 1963 | export type PhotosSaveWallPhotoResponse = Models.PhotosPhoto[] 1964 | export type PhotosSaveResponse = Models.PhotosPhoto[] 1965 | export interface PhotosSearchResponse { 1966 | /** 1967 | * Total number 1968 | */ 1969 | count: number, 1970 | /** 1971 | * 1972 | */ 1973 | items: Models.PhotosPhoto[] 1974 | } 1975 | export type PollsAddVoteResponse = Models.BaseBoolInt 1976 | export type PollsCreateResponse = Models.PollsPoll 1977 | export type PollsDeleteVoteResponse = Models.BaseBoolInt 1978 | export type PollsGetByIdResponse = Models.PollsPoll 1979 | export type PollsGetVotersResponse = Models.PollsVoters[] 1980 | export interface PrettyCardsCreateResponse { 1981 | /** 1982 | * Owner ID of created pretty card 1983 | */ 1984 | owner_id: number, 1985 | /** 1986 | * Card ID of created pretty card 1987 | */ 1988 | card_id: string 1989 | } 1990 | export interface PrettyCardsDeleteResponse { 1991 | /** 1992 | * Owner ID of deleted pretty card 1993 | */ 1994 | owner_id: number, 1995 | /** 1996 | * Card ID of deleted pretty card 1997 | */ 1998 | card_id: string, 1999 | /** 2000 | * Error reason if error happened 2001 | */ 2002 | error: string 2003 | } 2004 | export interface PrettyCardsEditResponse { 2005 | /** 2006 | * Owner ID of edited pretty card 2007 | */ 2008 | owner_id: number, 2009 | /** 2010 | * Card ID of edited pretty card 2011 | */ 2012 | card_id: string 2013 | } 2014 | export type PrettyCardsGetByIdResponse = Models.PrettyCardsPrettyCard[] 2015 | export type PrettyCardsGetUploadURLResponse = string 2016 | export interface PrettyCardsGetResponse { 2017 | /** 2018 | * Total number 2019 | */ 2020 | count: number, 2021 | /** 2022 | * 2023 | */ 2024 | items: Models.PrettyCardsPrettyCard[] 2025 | } 2026 | export interface SearchGetHintsResponse { 2027 | /** 2028 | * 2029 | */ 2030 | count: number, 2031 | /** 2032 | * 2033 | */ 2034 | items: Models.SearchHint[], 2035 | /** 2036 | * 2037 | */ 2038 | suggested_queries: string[] 2039 | } 2040 | export type SecureCheckTokenResponse = Models.SecureTokenChecked 2041 | export type SecureGetAppBalanceResponse = number 2042 | export type SecureGetSMSHistoryResponse = Models.SecureSmsNotification[] 2043 | export type SecureGetTransactionsHistoryResponse = Models.SecureTransaction[] 2044 | export type SecureGetUserLevelResponse = Models.SecureLevel[] 2045 | export type SecureGiveEventStickerResponse = any 2046 | export type SecureSendNotificationResponse = number[] 2047 | export type StatsGetPostReachResponse = Models.StatsWallpostStat[] 2048 | export type StatsGetResponse = Models.StatsPeriod[] 2049 | export type StatusGetResponse = Models.StatusStatus 2050 | export type StorageGetKeysResponse = string[] 2051 | export type StorageGetResponse = Models.StorageValue[] 2052 | export interface StoriesGetBannedExtendedResponse { 2053 | /** 2054 | * Stories count 2055 | */ 2056 | count: number, 2057 | /** 2058 | * 2059 | */ 2060 | items: number[], 2061 | /** 2062 | * 2063 | */ 2064 | profiles: Models.UsersUserFull[], 2065 | /** 2066 | * 2067 | */ 2068 | groups: Models.GroupsGroupFull[] 2069 | } 2070 | export interface StoriesGetBannedResponse { 2071 | /** 2072 | * Stories count 2073 | */ 2074 | count: number, 2075 | /** 2076 | * 2077 | */ 2078 | items: number[] 2079 | } 2080 | export interface StoriesGetByIdExtendedResponse { 2081 | /** 2082 | * Stories count 2083 | */ 2084 | count: number, 2085 | /** 2086 | * 2087 | */ 2088 | items: Models.StoriesStory[], 2089 | /** 2090 | * 2091 | */ 2092 | profiles: Models.UsersUserFull[], 2093 | /** 2094 | * 2095 | */ 2096 | groups: Models.GroupsGroupFull[] 2097 | } 2098 | export interface StoriesGetByIdResponse { 2099 | /** 2100 | * Stories count 2101 | */ 2102 | count: number, 2103 | /** 2104 | * 2105 | */ 2106 | items: Models.StoriesStory[] 2107 | } 2108 | export interface StoriesGetPhotoUploadServerResponse { 2109 | /** 2110 | * Upload URL 2111 | */ 2112 | upload_url: string, 2113 | /** 2114 | * Users ID who can to see story. 2115 | */ 2116 | user_ids: number[] 2117 | } 2118 | export type StoriesGetStatsResponse = Models.StoriesStoryStats 2119 | export interface StoriesGetVideoUploadServerResponse { 2120 | /** 2121 | * Upload URL 2122 | */ 2123 | upload_url: string, 2124 | /** 2125 | * Users ID who can to see story. 2126 | */ 2127 | user_ids: number[] 2128 | } 2129 | export interface StoriesGetViewersExtendedV5115Response { 2130 | /** 2131 | * Viewers count 2132 | */ 2133 | count: number, 2134 | /** 2135 | * 2136 | */ 2137 | items: Models.StoriesViewersItem[], 2138 | /** 2139 | * 2140 | */ 2141 | hidden_reason: string 2142 | } 2143 | export interface StoriesGetViewersExtendedResponse { 2144 | /** 2145 | * Viewers count 2146 | */ 2147 | count: number, 2148 | /** 2149 | * 2150 | */ 2151 | items: Models.UsersUserFull[] 2152 | } 2153 | export interface StoriesGetV5113Response { 2154 | /** 2155 | * 2156 | */ 2157 | count: number, 2158 | /** 2159 | * 2160 | */ 2161 | items: Models.StoriesFeedItem[], 2162 | /** 2163 | * 2164 | */ 2165 | profiles: Models.UsersUser[], 2166 | /** 2167 | * 2168 | */ 2169 | groups: Models.GroupsGroup[], 2170 | /** 2171 | * 2172 | */ 2173 | need_upload_screen: boolean 2174 | } 2175 | export interface StoriesGetResponse { 2176 | /** 2177 | * Stories count 2178 | */ 2179 | count: number, 2180 | /** 2181 | * 2182 | */ 2183 | items: Models.StoriesStory[][], 2184 | /** 2185 | * 2186 | */ 2187 | promo_data: Models.StoriesPromoBlock, 2188 | /** 2189 | * 2190 | */ 2191 | profiles: Models.UsersUser[], 2192 | /** 2193 | * 2194 | */ 2195 | groups: Models.GroupsGroup[], 2196 | /** 2197 | * 2198 | */ 2199 | need_upload_screen: boolean 2200 | } 2201 | export interface StoriesSaveResponse { 2202 | /** 2203 | * 2204 | */ 2205 | count: number, 2206 | /** 2207 | * 2208 | */ 2209 | items: Models.StoriesStory[] 2210 | } 2211 | export interface StoriesUploadResponse { 2212 | /** 2213 | * A string hash that is used in the stories.save method 2214 | */ 2215 | upload_result: string 2216 | } 2217 | export interface StreamingGetServerUrlResponse { 2218 | /** 2219 | * Server host 2220 | */ 2221 | endpoint: string, 2222 | /** 2223 | * Access key 2224 | */ 2225 | key: string 2226 | } 2227 | export interface UsersGetFollowersFieldsResponse { 2228 | /** 2229 | * Total number of available results 2230 | */ 2231 | count: number, 2232 | /** 2233 | * 2234 | */ 2235 | items: Models.UsersUserFull[] 2236 | } 2237 | export interface UsersGetFollowersResponse { 2238 | /** 2239 | * Total friends number 2240 | */ 2241 | count: number, 2242 | /** 2243 | * 2244 | */ 2245 | items: number[] 2246 | } 2247 | export interface UsersGetSubscriptionsExtendedResponse { 2248 | /** 2249 | * Total number of available results 2250 | */ 2251 | count: number, 2252 | /** 2253 | * 2254 | */ 2255 | items: Models.UsersSubscriptionsItem[] 2256 | } 2257 | export interface UsersGetSubscriptionsResponse { 2258 | /** 2259 | * 2260 | */ 2261 | users: Models.UsersUsersArray, 2262 | /** 2263 | * 2264 | */ 2265 | groups: Models.GroupsGroupsArray 2266 | } 2267 | export type UsersGetResponse = Models.UsersUserXtrCounters[] 2268 | export interface UsersSearchResponse { 2269 | /** 2270 | * Total number of available results 2271 | */ 2272 | count: number, 2273 | /** 2274 | * 2275 | */ 2276 | items: Models.UsersUserFull[] 2277 | } 2278 | export type UtilsCheckLinkResponse = Models.UtilsLinkChecked 2279 | export interface UtilsGetLastShortenedLinksResponse { 2280 | /** 2281 | * Total number of available results 2282 | */ 2283 | count: number, 2284 | /** 2285 | * 2286 | */ 2287 | items: Models.UtilsLastShortenedLink[] 2288 | } 2289 | export type UtilsGetLinkStatsExtendedResponse = Models.UtilsLinkStatsExtended 2290 | export type UtilsGetLinkStatsResponse = Models.UtilsLinkStats 2291 | export type UtilsGetServerTimeResponse = number 2292 | export type UtilsGetShortLinkResponse = Models.UtilsShortLink 2293 | export type UtilsResolveScreenNameResponse = Models.UtilsDomainResolved 2294 | export interface VideoAddAlbumResponse { 2295 | /** 2296 | * Created album ID 2297 | */ 2298 | album_id: number 2299 | } 2300 | export type VideoCreateCommentResponse = number 2301 | export type VideoGetAlbumByIdResponse = Models.VideoVideoAlbumFull 2302 | export interface VideoGetAlbumsByVideoExtendedResponse { 2303 | /** 2304 | * Total number 2305 | */ 2306 | count: number, 2307 | /** 2308 | * 2309 | */ 2310 | items: Models.VideoVideoAlbumFull[] 2311 | } 2312 | export type VideoGetAlbumsByVideoResponse = number[] 2313 | export interface VideoGetAlbumsExtendedResponse { 2314 | /** 2315 | * Total number 2316 | */ 2317 | count: number, 2318 | /** 2319 | * 2320 | */ 2321 | items: Models.VideoVideoAlbumFull[] 2322 | } 2323 | export interface VideoGetAlbumsResponse { 2324 | /** 2325 | * Total number 2326 | */ 2327 | count: number, 2328 | /** 2329 | * 2330 | */ 2331 | items: Models.VideoVideoAlbumFull[] 2332 | } 2333 | export interface VideoGetCommentsExtendedResponse { 2334 | /** 2335 | * Total number 2336 | */ 2337 | count: number, 2338 | /** 2339 | * 2340 | */ 2341 | items: Models.WallWallComment[], 2342 | /** 2343 | * 2344 | */ 2345 | profiles: Models.UsersUserMin[], 2346 | /** 2347 | * 2348 | */ 2349 | groups: Models.GroupsGroupFull[] 2350 | } 2351 | export interface VideoGetCommentsResponse { 2352 | /** 2353 | * Total number 2354 | */ 2355 | count: number, 2356 | /** 2357 | * 2358 | */ 2359 | items: Models.WallWallComment[] 2360 | } 2361 | export interface VideoGetExtendedResponse { 2362 | /** 2363 | * Total number 2364 | */ 2365 | count: number, 2366 | /** 2367 | * 2368 | */ 2369 | items: Models.VideoVideoFull[], 2370 | /** 2371 | * 2372 | */ 2373 | profiles: Models.UsersUserMin[], 2374 | /** 2375 | * 2376 | */ 2377 | groups: Models.GroupsGroupFull[] 2378 | } 2379 | export interface VideoGetResponse { 2380 | /** 2381 | * Total number 2382 | */ 2383 | count: number, 2384 | /** 2385 | * 2386 | */ 2387 | items: Models.VideoVideo[] 2388 | } 2389 | export type VideoRestoreCommentResponse = Models.BaseBoolInt 2390 | export type VideoSaveResponse = Models.VideoSaveResult 2391 | export interface VideoSearchExtendedResponse { 2392 | /** 2393 | * Total number 2394 | */ 2395 | count: number, 2396 | /** 2397 | * 2398 | */ 2399 | items: Models.VideoVideo[], 2400 | /** 2401 | * 2402 | */ 2403 | profiles: Models.UsersUserMin[], 2404 | /** 2405 | * 2406 | */ 2407 | groups: Models.GroupsGroupFull[] 2408 | } 2409 | export interface VideoSearchResponse { 2410 | /** 2411 | * Total number 2412 | */ 2413 | count: number, 2414 | /** 2415 | * 2416 | */ 2417 | items: Models.VideoVideo[] 2418 | } 2419 | export interface WallCreateCommentResponse { 2420 | /** 2421 | * Created comment ID 2422 | */ 2423 | comment_id: number 2424 | } 2425 | export interface WallEditResponse { 2426 | /** 2427 | * Edited post ID 2428 | */ 2429 | post_id: number 2430 | } 2431 | export interface WallGetByIdExtendedResponse { 2432 | /** 2433 | * 2434 | */ 2435 | items: Models.WallWallpostFull[], 2436 | /** 2437 | * 2438 | */ 2439 | profiles: Models.UsersUserFull[], 2440 | /** 2441 | * 2442 | */ 2443 | groups: Models.GroupsGroupFull[] 2444 | } 2445 | export type WallGetByIdLegacyResponse = Models.WallWallpostFull[] 2446 | export interface WallGetByIdResponse { 2447 | /** 2448 | * 2449 | */ 2450 | items: Models.WallWallpostFull[] 2451 | } 2452 | export interface WallGetCommentExtendedResponse { 2453 | /** 2454 | * 2455 | */ 2456 | items: Models.WallWallComment[], 2457 | /** 2458 | * 2459 | */ 2460 | profiles: Models.UsersUser[], 2461 | /** 2462 | * 2463 | */ 2464 | groups: Models.GroupsGroup[] 2465 | } 2466 | export interface WallGetCommentResponse { 2467 | /** 2468 | * 2469 | */ 2470 | items: Models.WallWallComment[] 2471 | } 2472 | export interface WallGetCommentsExtendedResponse { 2473 | /** 2474 | * Total number 2475 | */ 2476 | count: number, 2477 | /** 2478 | * 2479 | */ 2480 | items: Models.WallWallComment[], 2481 | /** 2482 | * 2483 | */ 2484 | show_reply_button: boolean, 2485 | /** 2486 | * Information whether current user can comment the post 2487 | */ 2488 | can_post: boolean, 2489 | /** 2490 | * Information whether groups can comment the post 2491 | */ 2492 | groups_can_post: boolean, 2493 | /** 2494 | * Count of replies of current level 2495 | */ 2496 | current_level_count: number, 2497 | /** 2498 | * 2499 | */ 2500 | profiles: Models.UsersUser[], 2501 | /** 2502 | * 2503 | */ 2504 | groups: Models.GroupsGroup[] 2505 | } 2506 | export interface WallGetCommentsResponse { 2507 | /** 2508 | * Total number 2509 | */ 2510 | count: number, 2511 | /** 2512 | * 2513 | */ 2514 | items: Models.WallWallComment[], 2515 | /** 2516 | * Information whether current user can comment the post 2517 | */ 2518 | can_post: boolean, 2519 | /** 2520 | * Information whether groups can comment the post 2521 | */ 2522 | groups_can_post: boolean, 2523 | /** 2524 | * Count of replies of current level 2525 | */ 2526 | current_level_count: number 2527 | } 2528 | export interface WallGetRepostsResponse { 2529 | /** 2530 | * 2531 | */ 2532 | items: Models.WallWallpostFull[], 2533 | /** 2534 | * 2535 | */ 2536 | profiles: Models.UsersUser[], 2537 | /** 2538 | * 2539 | */ 2540 | groups: Models.GroupsGroup[] 2541 | } 2542 | export interface WallGetExtendedResponse { 2543 | /** 2544 | * Total number 2545 | */ 2546 | count: number, 2547 | /** 2548 | * 2549 | */ 2550 | items: Models.WallWallpostFull[], 2551 | /** 2552 | * 2553 | */ 2554 | profiles: Models.UsersUserFull[], 2555 | /** 2556 | * 2557 | */ 2558 | groups: Models.GroupsGroupFull[] 2559 | } 2560 | export interface WallGetResponse { 2561 | /** 2562 | * Total number 2563 | */ 2564 | count: number, 2565 | /** 2566 | * 2567 | */ 2568 | items: Models.WallWallpostFull[] 2569 | } 2570 | export interface WallPostAdsStealthResponse { 2571 | /** 2572 | * Created post ID 2573 | */ 2574 | post_id: number 2575 | } 2576 | export interface WallPostResponse { 2577 | /** 2578 | * Created post ID 2579 | */ 2580 | post_id: number 2581 | } 2582 | export interface WallRepostResponse { 2583 | /** 2584 | * 2585 | */ 2586 | success: number, 2587 | /** 2588 | * Created post ID 2589 | */ 2590 | post_id: number, 2591 | /** 2592 | * Reposts number 2593 | */ 2594 | reposts_count: number, 2595 | /** 2596 | * Reposts to wall number 2597 | */ 2598 | wall_repost_count: number, 2599 | /** 2600 | * Reposts to mail number 2601 | */ 2602 | mail_repost_count: number, 2603 | /** 2604 | * Reposts number 2605 | */ 2606 | likes_count: number 2607 | } 2608 | export interface WallSearchExtendedResponse { 2609 | /** 2610 | * Total number 2611 | */ 2612 | count: number, 2613 | /** 2614 | * 2615 | */ 2616 | items: Models.WallWallpostFull[], 2617 | /** 2618 | * 2619 | */ 2620 | profiles: Models.UsersUserFull[], 2621 | /** 2622 | * 2623 | */ 2624 | groups: Models.GroupsGroupFull[] 2625 | } 2626 | export interface WallSearchResponse { 2627 | /** 2628 | * Total number 2629 | */ 2630 | count: number, 2631 | /** 2632 | * 2633 | */ 2634 | items: Models.WallWallpostFull[] 2635 | } 2636 | export interface WidgetsGetCommentsResponse { 2637 | /** 2638 | * Total number 2639 | */ 2640 | count: number, 2641 | /** 2642 | * 2643 | */ 2644 | posts: Models.WidgetsWidgetComment[] 2645 | } 2646 | export interface WidgetsGetPagesResponse { 2647 | /** 2648 | * Total number 2649 | */ 2650 | count: number, 2651 | /** 2652 | * 2653 | */ 2654 | pages: Models.WidgetsWidgetPage[] 2655 | } -------------------------------------------------------------------------------- /src/log/BaseLogger.ts: -------------------------------------------------------------------------------- 1 | export interface BaseLogger { 2 | log(prefix: string, data?: any): void 3 | warn(prefix: string, data?: any): void 4 | error(prefix: string, data?: any): void 5 | } -------------------------------------------------------------------------------- /src/log/ConsoleLogger.ts: -------------------------------------------------------------------------------- 1 | import {format} from 'util' 2 | import {BaseLogger} from "./BaseLogger"; 3 | 4 | class ColorCodes { 5 | static RED = '\x1b[31m' 6 | static CYAN = '\x1b[36m' 7 | static YELLOW = '\x1b[33m' 8 | static RESET = '\x1b[0m' 9 | } 10 | 11 | export class ConsoleLogger implements BaseLogger { 12 | public log(prefix: string, data?: any) { 13 | this.prepareLog(ColorCodes.CYAN, 'log', prefix, data) 14 | } 15 | 16 | public warn(prefix: string, data?: any) { 17 | this.prepareLog(ColorCodes.YELLOW, 'warn', prefix, data) 18 | } 19 | 20 | public error(prefix: string, data?: any) { 21 | this.prepareLog(ColorCodes.RED, 'error', prefix, data) 22 | } 23 | 24 | private prepareLog(color: ColorCodes, tag: string, prefix: string, data?: any) { 25 | const time = new Date().toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, '$1') 26 | process.stdout.write(`${time} ${color}[${tag}]${ColorCodes.RESET} ${prefix} ${format(data || '')} \n`) 27 | } 28 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "declaration": true, 5 | "typeRoots" : ["node_modules/@types"], 6 | "outDir": "distr/", 7 | "sourceMap": true, 8 | "target": "es6", 9 | "module": "commonjs", 10 | "experimentalDecorators": true, 11 | "emitDecoratorMetadata": true, 12 | "types": ["node"], 13 | "allowJs": false, 14 | "strictNullChecks": true, 15 | "strict": true 16 | }, 17 | "exclude": [ 18 | "node_modules", 19 | "**/*.spec.ts" 20 | ], 21 | "files": ["index.ts"] 22 | } --------------------------------------------------------------------------------