summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/SevereCloud/vksdk/v2
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/SevereCloud/vksdk/v2')
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/.gitignore5
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/.golangci.yml84
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/.markdownlint.yml2
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/.travis.yml20
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/CONTRIBUTING.md92
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/LICENSE21
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/README.md121
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/README.md555
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/account.go196
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/ads.go581
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/api.go359
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/apps.go149
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/appwidgets.go100
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/auth.go26
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/board.go173
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/captcha.go7
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/database.go163
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/docs.go137
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/donut.go49
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/downloadedGames.go19
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/errors.go927
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/execute.go52
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/fave.go231
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/friends.go295
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/gifts.go32
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/groups.go712
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/leadforms.go89
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/leads.go74
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/likes.go79
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/market.go319
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/messages.go616
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/newsfeed.go230
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/notes.go100
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/notifications.go54
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/orders.go90
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/pages.go81
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/photos.go613
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/podcasts.go179
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/polls.go106
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/prettycards.go79
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/search.go17
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/secure.go110
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/stats.go35
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/status.go23
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/storage.go48
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/stories.go305
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/streaming.go67
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/upload.go961
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/users.go104
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/utils.go105
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/video.go338
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/wall.go383
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/api/widgets.go33
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/doc.go12
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/events/context.go17
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/events/events.go1241
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/events/objects.go359
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/go.mod10
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/go.sum18
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/internal/charset.go60
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/internal/transport.go74
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/README.md132
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/context.go12
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/errors.go18
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/longpoll.go219
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/account.go142
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/ads.go321
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/apps.go101
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/appwidgets.go20
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/audio.go67
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/board.go40
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/database.go50
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/docs.go117
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/donut.go9
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/fave.go41
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/friends.go63
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/gifts.go34
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/groups.go807
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/leadforms.go44
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/leads.go55
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/market.go244
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/messages.go756
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/newsfeed.go187
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/notes.go37
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/notifications.go42
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/object.go566
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/orders.go45
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/pages.go85
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/photos.go339
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/podcasts.go45
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/polls.go101
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/prettycards.go14
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/search.go11
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/secure.go33
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/stats.go77
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/stories.go335
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/users.go299
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/utils.go93
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/video.go277
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/wall.go257
-rw-r--r--vendor/github.com/SevereCloud/vksdk/v2/object/widgets.go68
101 files changed, 18340 insertions, 0 deletions
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/.gitignore b/vendor/github.com/SevereCloud/vksdk/v2/.gitignore
new file mode 100644
index 00000000..7c5b1810
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/.gitignore
@@ -0,0 +1,5 @@
+_vendor/
+vendor/
+*.out
+coverage.txt
+*.test \ No newline at end of file
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/.golangci.yml b/vendor/github.com/SevereCloud/vksdk/v2/.golangci.yml
new file mode 100644
index 00000000..97b7a3fe
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/.golangci.yml
@@ -0,0 +1,84 @@
+---
+linters:
+ disable-all: true
+ enable:
+ - bodyclose
+ - deadcode
+ - errcheck
+ - gochecknoglobals
+ - goconst
+ - gocritic
+ - gofmt
+ - goimports
+ - golint
+ - goprintffuncname
+ - gosec
+ - gosimple
+ - govet
+ - ineffassign
+ - interfacer
+ - maligned
+ - misspell
+ - nakedret
+ - prealloc
+ - staticcheck
+ - structcheck
+ - stylecheck
+ - typecheck
+ - unconvert
+ - unparam
+ - unused
+ - varcheck
+ - whitespace
+ - wsl
+ - godot
+ - asciicheck
+ - nolintlint
+ - gofumpt
+ - goerr113
+ - tparallel
+ - errorlint
+ - paralleltest
+
+# - wrapcheck # TODO: v3 Fix
+# - testpackage # TODO: Fix testpackage
+# - nestif # TODO: Fix nestif
+
+# don't enable:
+# - depguard
+# - dogsled
+# - dupl
+# - funlen
+# - gochecknoinits
+# - gocognit
+# - gocyclo
+# - godox
+# - gomnd
+# - lll
+# - rowserrcheck
+# - scopelint
+# - gomodguard
+# - exhaustive
+# - nlreturn
+# - gci
+# - exhaustivestruct
+
+issues:
+ exclude-rules:
+ - path: _test\.go
+ linters:
+ - gocyclo
+ - errcheck
+ - dupl
+ - gosec
+
+ - linters:
+ - errcheck
+ source: ".((os\\.)?std(out|err)\\..*|.*Close|.*Flush|os\\.Remove(All)?|
+ .*printf?|os\\.(Un)?Setenv)."
+
+ - linters:
+ - stylecheck
+ text: "ST1003:.*(Ts|ts).*TS"
+
+ exclude-use-default: false
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/.markdownlint.yml b/vendor/github.com/SevereCloud/vksdk/v2/.markdownlint.yml
new file mode 100644
index 00000000..436de161
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/.markdownlint.yml
@@ -0,0 +1,2 @@
+---
+no-hard-tabs: false
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/.travis.yml b/vendor/github.com/SevereCloud/vksdk/v2/.travis.yml
new file mode 100644
index 00000000..47727020
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/.travis.yml
@@ -0,0 +1,20 @@
+---
+language: go
+
+cache:
+ directories:
+ - $HOME/.cache/go-build
+ - $HOME/gopath/pkg/mod
+
+go:
+ - 1.x
+
+before_script:
+ - git fetch --depth=1 origin +refs/tags/*:refs/tags/*
+ - git describe --tags $(git rev-list --tags --max-count=1) --always
+
+script:
+ - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p=1 ./...
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/CONTRIBUTING.md b/vendor/github.com/SevereCloud/vksdk/v2/CONTRIBUTING.md
new file mode 100644
index 00000000..e78a83ea
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/CONTRIBUTING.md
@@ -0,0 +1,92 @@
+# Contributing
+
+## Настройки
+
+`vksdk` написан на [Go](https://golang.org/).
+
+Требования:
+
+- [Go 1.13+](https://golang.org/doc/install)
+- [golangci-lint](https://github.com/golangci/golangci-lint)
+- [global .gitignore](https://help.github.com/en/articles/ignoring-files#create-a-global-gitignore)
+
+Сделайте fork и клонируйте `vksdk` куда угодно:
+
+```sh
+git clone git@github.com:<your name>/vksdk.git
+```
+
+Создайте новую ветку
+
+```sh
+git checkout -b <name_of_your_new_branch>
+```
+
+## Тестирование изменений
+
+Для начала проверьте ваш код с помощью
+[golangci-lint](https://github.com/golangci/golangci-lint)
+
+```sh
+golangci-lint run
+```
+
+Затем можно запускать тесты
+
+```sh
+# SERVICE_TOKEN=""
+# GROUP_TOKEN=""
+# CLIENT_SECRET=""
+# USER_TOKEN=""
+# WIDGET_TOKEN=""
+# CLIENT_ID="123456"
+# GROUP_ID="123456"
+# ACCOUNT_ID="123456"
+go test ./...
+```
+
+Задавать токены не обязательно - тесты с их использованием будут пропущены.
+**Не** рекомендуется задавать свой `USER_TOKEN`, так как тесты делают много
+страшных вещей.
+
+Настройки для VSCode `.vscode/setting.json`
+
+```json
+{
+ "go.testEnvVars": {
+ "SERVICE_TOKEN": "",
+ "WIDGET_TOKEN": "",
+ "GROUP_TOKEN": "",
+ "CLIENT_SECRET": "",
+ "USER_TOKEN": "",
+ "CLIENT_ID": "123456",
+ "GROUP_ID": "123456",
+ "ACCOUNT_ID": "123456"
+ }
+}
+```
+
+## Создание коммита
+
+Сообщения коммитов должны быть хорошо отформатированы, и чтобы сделать их
+«стандартизированным», мы используем
+[Conventional Commits](https://www.conventionalcommits.org/ru).
+
+```sh
+git add .
+git commit
+```
+
+## Отправьте pull request
+
+Отправьте изменения в ваш репозиторий
+
+```sh
+git push origin <name_of_your_new_branch>
+```
+
+Затем откройте [pull request](https://github.com/SevereCloud/vksdk/pulls)
+с веткой:
+
+- `master` если это багфикс
+- `dev-v1.2.3` если это новая фича
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/LICENSE b/vendor/github.com/SevereCloud/vksdk/v2/LICENSE
new file mode 100644
index 00000000..af30b338
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2020 Daniil Suvorov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. \ No newline at end of file
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/README.md b/vendor/github.com/SevereCloud/vksdk/v2/README.md
new file mode 100644
index 00000000..59224718
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/README.md
@@ -0,0 +1,121 @@
+# VK SDK for Golang
+
+[![Build Status](https://travis-ci.com/SevereCloud/vksdk.svg?branch=master)](https://travis-ci.com/SevereCloud/vksdk)
+[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/v2)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2?tab=subdirectories)
+[![VK Developers](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/)
+[![codecov](https://codecov.io/gh/SevereCloud/vksdk/branch/master/graph/badge.svg)](https://codecov.io/gh/SevereCloud/vksdk)
+[![VK chat](https://img.shields.io/badge/VK%20chat-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.me/join/AJQ1d6Or8Q00Y_CSOESfbqGt)
+[![release](https://img.shields.io/github/v/tag/SevereCloud/vksdk?label=release)](https://github.com/SevereCloud/vksdk/releases)
+[![license](https://img.shields.io/github/license/SevereCloud/vksdk.svg?maxAge=2592000)](https://github.com/SevereCloud/vksdk/blob/master/LICENSE)
+
+**VK SDK for Golang** ready implementation of the main VK API functions for Go.
+
+[Russian documentation](https://github.com/SevereCloud/vksdk/wiki)
+
+## Features
+
+Version API 5.126.
+
+- [API](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api)
+ - 400+ methods
+ - Ability to change the request handler
+ - Ability to modify HTTP client
+ - Request Limiter
+ - Token pool
+- [Callback API](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/callback)
+ - Tracking tool for users activity in your VK communities
+ - Supports all events
+ - Auto setting callback
+- [Bots Long Poll API](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/longpoll-bot)
+ - Allows you to work with community events in real time
+ - Supports all events
+ - Ability to modify HTTP client
+- [User Long Poll API](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/longpoll-user)
+ - Allows you to work with user events in real time
+ - Ability to modify HTTP client
+- [Streaming API](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/streaming)
+ - Receiving public data from VK by specified keywords
+ - Ability to modify HTTP client
+- [FOAF](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/foaf)
+ - Machine-readable ontology describing persons
+ - Works with users and groups
+ - The only place to get page creation date
+- [VK Mini Apps](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/vkapps)
+ - Checking launch parameters
+ - Intermediate http handler
+- [Payments API](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/payments)
+ - Processes payment notifications
+- [Marusia Skills](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/marusia)
+ - For creating Marusia Skills
+
+## Install
+
+```bash
+# go mod init mymodulename
+go get github.com/SevereCloud/vksdk/v2@latest
+```
+
+## Use by
+
+- [Joe](https://github.com/go-joe/joe) adapter: <https://github.com/tdakkota/joe-vk-adapter>
+- [Logrus](https://github.com/sirupsen/logrus) hook: <https://github.com/SevereCloud/vkrus>
+
+### Example
+
+```go
+package main
+
+import (
+ "context"
+ "log"
+
+ "github.com/SevereCloud/vksdk/v2/api"
+ "github.com/SevereCloud/vksdk/v2/api/params"
+ "github.com/SevereCloud/vksdk/v2/events"
+ "github.com/SevereCloud/vksdk/v2/longpoll-bot"
+)
+
+func main() {
+ token := "<TOKEN>" // use os.Getenv("TOKEN")
+ vk := api.NewVK(token)
+
+ // get information about the group
+ group, err := vk.GroupsGetByID(nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Initializing Long Poll
+ lp, err := longpoll.NewLongPoll(vk, group[0].ID)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // New message event
+ lp.MessageNew(func(_ context.Context, obj events.MessageNewObject) {
+ log.Printf("%d: %s", obj.Message.PeerID, obj.Message.Text)
+
+ if obj.Message.Text == "ping" {
+ b := params.NewMessagesSendBuilder()
+ b.Message("pong")
+ b.RandomID(0)
+ b.PeerID(obj.Message.PeerID)
+
+ _, err := vk.MessagesSend(b.Params)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }
+ })
+
+ // Run Bots Long Poll
+ log.Println("Start Long Poll")
+ if err := lp.Run(); err != nil {
+ log.Fatal(err)
+ }
+}
+```
+
+## LICENSE
+
+[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FSevereCloud%2Fvksdk.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FSevereCloud%2Fvksdk?ref=badge_large)
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/README.md b/vendor/github.com/SevereCloud/vksdk/v2/api/README.md
new file mode 100644
index 00000000..770ab025
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/README.md
@@ -0,0 +1,555 @@
+# API
+
+[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/api)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api)
+[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/first_guide)
+
+Данная библиотека поддерживает версию API **5.122**.
+
+## Запросы
+
+В начале необходимо инициализировать api с помощью [ключа доступа](https://vk.com/dev/access_token):
+
+```go
+vk := api.NewVK("<TOKEN>")
+```
+
+### Запросы к API
+
+- `users.get` -> `vk.UsersGet(api.Params{})`
+- `groups.get` с extended=1 -> `vk.GroupsGetExtended(api.Params{})`
+
+Список всех методов можно найти на
+[данной странице](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api?tab=doc#VK).
+
+Пример запроса [`users.get`](https://vk.com/dev/users.get)
+
+```go
+users, err := vk.UsersGet(api.Params{
+ "user_ids": 1,
+})
+if err != nil {
+ log.Fatal(err)
+}
+```
+
+### Параметры
+
+[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/api/params)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api/params)
+
+Модуль params предназначен для генерации параметров запроса.
+
+```go
+// import "github.com/SevereCloud/vksdk/v2/api/params"
+
+b := params.NewMessageSendBuilder()
+b.PeerID(123)
+b.Random(0)
+b.DontParseLinks(false)
+b.Message("Test message")
+
+res, err = api.MessageSend(b.Params)
+```
+
+### Обработка ошибок
+
+[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/errors)
+
+Обработка ошибок полностью поддерживает методы
+[go 1.13](https://blog.golang.org/go1.13-errors)
+
+```go
+if errors.Is(err, api.ErrAuth) {
+ log.Println("User authorization failed")
+}
+```
+
+```go
+var e *api.Error
+if errors.As(err, &e) {
+ switch e.Code {
+ case api.ErrCaptcha:
+ log.Println("Требуется ввод кода с картинки (Captcha)")
+ log.Printf("sid %s img %s", e.CaptchaSID, e.CaptchaImg)
+ case 1:
+ log.Println("Код ошибки 1")
+ default:
+ log.Printf("Ошибка %d %s", e.Code, e.Text)
+ }
+}
+```
+
+Для Execute существует отдельная ошибка `ExecuteErrors`
+
+### Запрос любого метода
+
+Пример запроса [users.get](https://vk.com/dev/users.get)
+
+```go
+// Определяем структуру, которую вернет API
+var response []object.UsersUser
+var err api.Error
+
+params := api.Params{
+ "user_ids": 1,
+}
+
+// Делаем запрос
+err = vk.RequestUnmarshal("users.get", &response, params)
+if err != nil {
+ log.Fatal(err)
+}
+
+log.Print(response)
+```
+
+### Execute
+
+[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/errors)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api#VK.Execute)
+[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/execute)
+
+Универсальный метод, который позволяет запускать последовательность других
+методов, сохраняя и фильтруя промежуточные результаты.
+
+```go
+var response struct {
+ Text string `json:"text"`
+}
+
+err = vk.Execute(`return {text: "hello"};`, &response)
+if err != nil {
+ log.Fatal(err)
+}
+
+log.Print(response.Text)
+```
+
+### Обработчик запросов
+
+Обработчик `vk.Handler` должен возвращать структуру ответа от VK API и ошибку.
+В качестве параметров принимать название метода и параметры.
+
+```go
+vk.Handler = func(method string, params ...api.Params) (api.Response, error) {
+ // ...
+}
+```
+
+Это может потребоваться, если вы можете поставить свой обработчик с
+[fasthttp](https://github.com/valyala/fasthttp) и логгером.
+
+Стандартный обработчик использует [encoding/json](https://pkg.go.dev/net/http)
+и [net/http](https://pkg.go.dev/net/http). В стандартном обработчике можно
+настроить ограничитель запросов и HTTP клиент.
+
+#### Ограничитель запросов
+
+К методам API ВКонтакте (за исключением методов из секций secure и ads) с
+ключом доступа пользователя или сервисным ключом доступа можно обращаться не
+чаще 3 раз в секунду. Для ключа доступа сообщества ограничение составляет 20
+запросов в секунду. Если логика Вашего приложения подразумевает вызов
+нескольких методов подряд, имеет смысл обратить внимание на метод execute. Он
+позволяет совершить до 25 обращений к разным методам в рамках одного запроса.
+
+Для методов секции ads действуют собственные ограничения, ознакомиться с ними
+Вы можете на [этой странице](https://vk.com/dev/ads_limits).
+
+Максимальное число обращений к методам секции secure зависит от числа
+пользователей, установивших приложение. Если приложение установило меньше 10
+000 человек, то можно совершать 5 запросов в секунду, до 100 000 — 8 запросов,
+до 1 000 000 — 20 запросов, больше 1 млн. — 35 запросов в секунду.
+
+Если Вы превысите частотное ограничение, сервер вернет ошибку с кодом
+**6: "Too many requests per second."**.
+
+С помощью параметра `vk.Limit` можно установить ограничение на определенное
+количество запросов в секунду
+
+### HTTP client
+
+В модуле реализована возможность изменять HTTP клиент с помощью параметра
+`vk.Client`
+
+Пример прокси
+
+```go
+
+dialer, _ := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, proxy.Direct)
+httpTransport := &http.Transport{
+ Dial: dialer.Dial,
+}
+httpTransport.Dial = dialer.Dial
+
+client := &http.Client{
+ Transport: httpTransport,
+}
+
+vk.Client = client
+```
+
+### Ошибка с Captcha
+
+[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/captcha_error)
+
+Если какое-либо действие (например, отправка сообщения) выполняется
+пользователем слишком часто, то запрос к API может возвращать ошибку
+"Captcha needed". При этом пользователю понадобится ввести код с изображения
+и отправить запрос повторно с передачей введенного кода Captcha в параметрах
+запроса.
+
+**Код ошибки**: 14
+**Текст ошибки**: Captcha needed
+
+Если возникает данная ошибка, то в сообщении об ошибке передаются также
+следующие параметры:
+
+- `err.CaptchaSID` - идентификатор captcha
+- `err.CaptchaImg` - ссылка на изображение, которое нужно показать
+ пользователю, чтобы он ввел текст с этого изображения.
+
+В этом случае следует запросить пользователя ввести текст с изображения
+`err.CaptchaImg` и повторить запрос, добавив в него параметры:
+
+- `captcha_sid` - полученный идентификатор
+- `captcha_key` - текст, который ввел пользователь
+
+## Загрузка файлов
+
+[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/upload_files)
+
+### 1. Загрузка фотографий в альбом
+
+Допустимые форматы: JPG, PNG, GIF.
+Файл объемом не более 50 МБ, соотношение сторон не менее 1:20
+
+Загрузка фотографий в альбом для текущего пользователя:
+
+```go
+photosPhoto, err = vk.UploadPhoto(albumID, response.Body)
+```
+
+Загрузка фотографий в альбом для группы:
+
+```go
+photosPhoto, err = vk.UploadPhotoGroup(groupID, albumID, response.Body)
+```
+
+### 2. Загрузка фотографий на стену
+
+Допустимые форматы: JPG, PNG, GIF.
+Файл объемом не более 50 МБ, соотношение сторон не менее 1:20
+
+```go
+photosPhoto, err = vk.UploadWallPhoto(response.Body)
+```
+
+Загрузка фотографий в альбом для группы:
+
+```go
+photosPhoto, err = vk.UploadWallPhotoGroup(groupID, response.Body)
+```
+
+### 3. Загрузка главной фотографии пользователя или сообщества
+
+Допустимые форматы: JPG, PNG, GIF.
+Ограничения: размер не менее 200x200px, соотношение сторон от 0.25 до 3,
+сумма высоты и ширины не более 14000px, файл объемом не более 50 МБ,
+соотношение сторон не менее 1:20.
+
+Загрузка главной фотографии пользователя
+
+```go
+photosPhoto, err = vk.UploadUserPhoto(file)
+```
+
+Загрузка фотографии пользователя или сообщества с миниатюрой
+
+```go
+photosPhoto, err = vk.UploadOwnerPhoto(ownerID, squareСrop,file)
+```
+
+Для загрузки главной фотографии сообщества необходимо передать его идентификатор
+со знаком «минус» в параметре `ownerID`.
+
+Дополнительно Вы можете передать параметр `squareСrop` в формате "x,y,w" (без
+кавычек), где x и y — координаты верхнего правого угла миниатюры, а w — сторона
+квадрата. Тогда для фотографии также будет подготовлена квадратная миниатюра.
+
+Загрузка фотографии пользователя или сообщества без миниатюры:
+
+```go
+photosPhoto, err = vk.UploadOwnerPhoto(ownerID, "", file)
+```
+
+### 4. Загрузка фотографии в личное сообщение
+
+Допустимые форматы: JPG, PNG, GIF.
+Ограничения: сумма высоты и ширины не более 14000px, файл объемом
+не более 50 МБ, соотношение сторон не менее 1:20.
+
+```go
+photosPhoto, err = vk.UploadMessagesPhoto(peerID, file)
+```
+
+### 5. Загрузка главной фотографии для чата
+
+Допустимые форматы: JPG, PNG, GIF.
+Ограничения: размер не менее 200x200px, соотношение сторон от 0.25 до 3, сумма
+высоты и ширины не более 14000px, файл объемом не более 50 МБ, соотношение
+сторон не менее 1:20.
+
+Без обрезки:
+
+```go
+messageInfo, err = vk.UploadChatPhoto(peerID, file)
+```
+
+С обрезкой:
+
+```go
+messageInfo, err = vk.UploadChatPhotoCrop(peerID, cropX, cropY, cropWidth, file)
+```
+
+### 6. Загрузка фотографии для товара
+
+Допустимые форматы: JPG, PNG, GIF.
+Ограничения: минимальный размер фото — 400x400px, сумма высоты и ширины
+не более 14000px, файл объемом не более 50 МБ, соотношение сторон не менее 1:20.
+
+Если Вы хотите загрузить основную фотографию товара, необходимо передать
+параметр `mainPhoto = true`. Если фотография не основная, она не будет обрезаться.
+
+Без обрезки:
+
+```go
+photosPhoto, err = vk.UploadMarketPhoto(groupID, mainPhoto, file)
+```
+
+Основную фотографию с обрезкой:
+
+```go
+photosPhoto, err = vk.UploadMarketPhotoCrop(groupID, cropX, cropY, cropWidth, file)
+```
+
+### 7. Загрузка фотографии для подборки товаров
+
+Допустимые форматы: JPG, PNG, GIF.
+Ограничения: минимальный размер фото — 1280x720px, сумма высоты и ширины
+не более 14000px, файл объемом не более 50 МБ, соотношение сторон не менее 1:20.
+
+```go
+photosPhoto, err = vk.UploadMarketAlbumPhoto(groupID, file)
+```
+
+### 9. Загрузка видеозаписей
+
+Допустимые форматы: AVI, MP4, 3GP, MPEG, MOV, MP3, FLV, WMV.
+
+[Параметры](https://vk.com/dev/video.save)
+
+```go
+videoUploadResponse, err = vk.UploadVideo(params, file)
+```
+
+После загрузки видеозапись проходит обработку и в списке видеозаписей может
+появиться спустя некоторое время.
+
+### 10. Загрузка документов
+
+Допустимые форматы: любые форматы за исключением mp3 и исполняемых файлов.
+Ограничения: файл объемом не более 200 МБ.
+
+`title` - название файла с расширением
+
+`tags` - метки для поиска
+
+`typeDoc` - тип документа.
+
+- doc - обычный документ;
+- audio_message - голосовое сообщение
+
+Загрузить документ:
+
+```go
+docsDoc, err = vk.UploadDoc(title, tags, file)
+```
+
+Загрузить документ в группу:
+
+```go
+docsDoc, err = vk.UploadGroupDoc(groupID, title, tags, file)
+```
+
+Загрузить документ, для последующей отправки документа на стену:
+
+```go
+docsDoc, err = vk.UploadWallDoc(title, tags, file)
+```
+
+Загрузить документ в группу, для последующей отправки документа на стену:
+
+```go
+docsDoc, err = vk.UploadGroupWallDoc(groupID, title, tags, file)
+```
+
+Загрузить документ в личное сообщение:
+
+```go
+docsDoc, err = vk.UploadMessagesDoc(peerID, typeDoc, title, tags, file)
+```
+
+### 11. Загрузка обложки сообщества
+
+Допустимые форматы: JPG, PNG, GIF.
+Ограничения: минимальный размер фото — 795x200px, сумма высоты и ширины
+не более 14000px, файл объемом не более 50 МБ. Рекомендуемый размер: 1590x400px.
+В сутки можно загрузить не более 1500 обложек.
+
+Необходимо указать координаты обрезки фотографии в параметрах
+`cropX`, `cropY`, `cropX2`, `cropY2`.
+
+```go
+photo, err = vk.UploadOwnerCoverPhoto(groupID, cropX, cropY, cropX2, cropY2, file)
+```
+
+### 12. Загрузка аудиосообщения
+
+Допустимые форматы: Ogg Opus.
+Ограничения: sample rate 16kHz, variable bitrate 16 kbit/s, длительность
+не более 5 минут.
+
+```go
+docsDoc, err = vk.UploadMessagesDoc(peerID, "audio_message", title, tags, file)
+```
+
+### 13. Загрузка истории
+
+Допустимые форматы:​ JPG, PNG, GIF.
+Ограничения:​ сумма высоты и ширины не более 14000px, файл объемом
+не более 10МБ. Формат видео: h264 video, aac audio,
+максимальное разрешение 720х1280, 30fps.
+
+Загрузить историю с фотографией. [Параметры](https://vk.com/dev/stories.getPhotoUploadServer)
+
+```go
+uploadInfo, err = vk.UploadStoriesPhoto(params, file)
+```
+
+Загрузить историю с видео. [Параметры](https://vk.com/dev/stories.getVideoUploadServer)
+
+```go
+uploadInfo, err = vk.UploadStoriesVideo(params, file)
+```
+
+### Загрузка фоновой фотографии в опрос
+
+Допустимые форматы: JPG, PNG, GIF.
+Ограничения: сумма высоты и ширины не более 14000px, файл объемом не более 50 МБ,
+соотношение сторон не менее 1:20.
+
+```go
+photosPhoto, err = vk.UploadPollsPhoto(file)
+```
+
+```go
+photosPhoto, err = vk.UploadOwnerPollsPhoto(ownerID, file)
+```
+
+Для загрузки фотографии сообщества необходимо передать его идентификатор со
+знаком «минус» в параметре `ownerID`.
+
+### Загрузка фотографии для карточки
+
+Для карточек используются квадратные изображения минимальным размером 400х400.
+В случае загрузки неквадратного изображения, оно будет обрезано до квадратного.
+Допустимые форматы: JPG, PNG, BMP, TIFF или GIF.
+Ограничения: файл объемом не более 5 МБ.
+
+```go
+photo, err = vk.UploadPrettyCardsPhoto(file)
+```
+
+### Загрузка обложки для формы
+
+Для форм сбора заявок используются прямоугольные изображения размером 1200х300.
+В случае загрузки изображения другого размера, оно будет автоматически обрезано
+до требуемого.
+Допустимые форматы: JPG, PNG, BMP, TIFF или GIF.
+Ограничения: файл объемом не более 5 МБ.
+
+```go
+photo, err = vk.UploadLeadFormsPhoto(file)
+```
+
+Полученные данные можно использовать в методах
+[leadForms.create](https://vk.com/dev/leadForms.create)
+[leadForms.edit](https://vk.com/dev/leadForms.edit).
+
+Полученные данные можно использовать в методах
+[prettyCards.create](https://vk.com/dev/prettyCards.create)
+[prettyCards.edit](https://vk.com/dev/prettyCards.edit).
+
+### Загрузки фотографии в коллекцию приложения для виджетов приложений сообществ
+
+`imageType` (string) - тип изображения.
+
+Возможные значения:
+
+- 24x24
+- 50x50
+- 160x160
+- 160x240
+- 510x128
+
+```go
+image, err = vk.UploadAppImage(imageType, file)
+```
+
+### Загрузки фотографии в коллекцию сообщества для виджетов приложений сообществ
+
+`imageType` (string) - тип изображения.
+
+Возможные значения:
+
+- 24x24
+- 50x50
+- 160x160
+- 160x240
+- 510x128
+
+```go
+image, err = vk.UploadGroupAppImage(imageType, file)
+```
+
+#### Примеры
+
+Загрузка фотографии в альбом:
+
+```go
+response, err := os.Open("photo.jpeg")
+if err != nil {
+ log.Fatal(err)
+}
+defer response.Body.Close()
+
+photo, err = vk.UploadPhoto(albumID, response.Body)
+if err != nil {
+ log.Fatal(err)
+}
+```
+
+Загрузка фотографии в альбом из интернета:
+
+```go
+response, err := http.Get("https://sun9-45.userapi.com/c638629/v638629852/2afba/o-dvykjSIB4.jpg")
+if err != nil {
+ log.Fatal(err)
+}
+defer response.Body.Close()
+
+photo, err = vk.UploadPhoto(albumID, response.Body)
+if err != nil {
+ log.Fatal(err)
+}
+```
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/account.go b/vendor/github.com/SevereCloud/vksdk/v2/api/account.go
new file mode 100644
index 00000000..7e38ce2b
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/account.go
@@ -0,0 +1,196 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// AccountBan account.ban.
+//
+// https://vk.com/dev/account.ban
+func (vk *VK) AccountBan(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.ban", &response, params)
+ return
+}
+
+// AccountChangePasswordResponse struct.
+type AccountChangePasswordResponse struct {
+ Token string `json:"token"`
+}
+
+// AccountChangePassword changes a user password after access is successfully restored with the auth.restore method.
+//
+// https://vk.com/dev/account.changePassword
+func (vk *VK) AccountChangePassword(params Params) (response AccountChangePasswordResponse, err error) {
+ err = vk.RequestUnmarshal("account.changePassword", &response, params)
+ return
+}
+
+// AccountGetActiveOffersResponse struct.
+type AccountGetActiveOffersResponse struct {
+ Count int `json:"count"`
+ Items []object.AccountOffer `json:"items"`
+}
+
+// AccountGetActiveOffers returns a list of active ads (offers).
+// If the user fulfill their conditions, he will be able to get
+// the appropriate number of votes to his balance.
+//
+// https://vk.com/dev/account.getActiveOffers
+func (vk *VK) AccountGetActiveOffers(params Params) (response AccountGetActiveOffersResponse, err error) {
+ err = vk.RequestUnmarshal("account.getActiveOffers", &response, params)
+ return
+}
+
+// AccountGetAppPermissions gets settings of the user in this application.
+//
+// https://vk.com/dev/account.getAppPermissions
+func (vk *VK) AccountGetAppPermissions(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.getAppPermissions", &response, params)
+ return
+}
+
+// AccountGetBannedResponse struct.
+type AccountGetBannedResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+ object.ExtendedResponse
+}
+
+// AccountGetBanned returns a user's blacklist.
+//
+// https://vk.com/dev/account.getBanned
+func (vk *VK) AccountGetBanned(params Params) (response AccountGetBannedResponse, err error) {
+ err = vk.RequestUnmarshal("account.getBanned", &response, params)
+ return
+}
+
+// AccountGetCountersResponse struct.
+type AccountGetCountersResponse object.AccountAccountCounters
+
+// AccountGetCounters returns non-null values of user counters.
+//
+// https://vk.com/dev/account.getCounters
+func (vk *VK) AccountGetCounters(params Params) (response AccountGetCountersResponse, err error) {
+ err = vk.RequestUnmarshal("account.getCounters", &response, params)
+ return
+}
+
+// AccountGetInfoResponse struct.
+type AccountGetInfoResponse object.AccountInfo
+
+// AccountGetInfo returns current account info.
+//
+// https://vk.com/dev/account.getInfo
+func (vk *VK) AccountGetInfo(params Params) (response AccountGetInfoResponse, err error) {
+ err = vk.RequestUnmarshal("account.getInfo", &response, params)
+ return
+}
+
+// AccountGetProfileInfoResponse struct.
+type AccountGetProfileInfoResponse object.AccountUserSettings
+
+// AccountGetProfileInfo returns the current account info.
+//
+// https://vk.com/dev/account.getProfileInfo
+func (vk *VK) AccountGetProfileInfo(params Params) (response AccountGetProfileInfoResponse, err error) {
+ err = vk.RequestUnmarshal("account.getProfileInfo", &response, params)
+ return
+}
+
+// AccountGetPushSettingsResponse struct.
+type AccountGetPushSettingsResponse object.AccountPushSettings
+
+// AccountGetPushSettings account.getPushSettings Gets settings of push notifications.
+//
+// https://vk.com/dev/account.getPushSettings
+func (vk *VK) AccountGetPushSettings(params Params) (response AccountGetPushSettingsResponse, err error) {
+ err = vk.RequestUnmarshal("account.getPushSettings", &response, params)
+ return
+}
+
+// AccountRegisterDevice subscribes an iOS/Android/Windows/Mac based device to receive push notifications.
+//
+// https://vk.com/dev/account.registerDevice
+func (vk *VK) AccountRegisterDevice(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.registerDevice", &response, params)
+ return
+}
+
+// AccountSaveProfileInfoResponse struct.
+type AccountSaveProfileInfoResponse struct {
+ Changed object.BaseBoolInt `json:"changed"`
+ NameRequest object.AccountNameRequest `json:"name_request"`
+}
+
+// AccountSaveProfileInfo edits current profile info.
+//
+// https://vk.com/dev/account.saveProfileInfo
+func (vk *VK) AccountSaveProfileInfo(params Params) (response AccountSaveProfileInfoResponse, err error) {
+ err = vk.RequestUnmarshal("account.saveProfileInfo", &response, params)
+ return
+}
+
+// AccountSetInfo allows to edit the current account info.
+//
+// https://vk.com/dev/account.setInfo
+func (vk *VK) AccountSetInfo(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.setInfo", &response, params)
+ return
+}
+
+// AccountSetNameInMenu sets an application screen name
+// (up to 17 characters), that is shown to the user in the left menu.
+//
+// https://vk.com/dev/account.setNameInMenu
+func (vk *VK) AccountSetNameInMenu(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.setNameInMenu", &response, params)
+ return
+}
+
+// AccountSetOffline marks a current user as offline.
+//
+// https://vk.com/dev/account.setOffline
+func (vk *VK) AccountSetOffline(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.setOffline", &response, params)
+ return
+}
+
+// AccountSetOnline marks the current user as online for 5 minutes.
+//
+// https://vk.com/dev/account.setOnline
+func (vk *VK) AccountSetOnline(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.setOnline", &response, params)
+ return
+}
+
+// AccountSetPushSettings change push settings.
+//
+// https://vk.com/dev/account.setPushSettings
+func (vk *VK) AccountSetPushSettings(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.setPushSettings", &response, params)
+ return
+}
+
+// AccountSetSilenceMode mutes push notifications for the set period of time.
+//
+// https://vk.com/dev/account.setSilenceMode
+func (vk *VK) AccountSetSilenceMode(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.setSilenceMode", &response, params)
+ return
+}
+
+// AccountUnban account.unban.
+//
+// https://vk.com/dev/account.unban
+func (vk *VK) AccountUnban(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.unban", &response, params)
+ return
+}
+
+// AccountUnregisterDevice unsubscribes a device from push notifications.
+//
+// https://vk.com/dev/account.unregisterDevice
+func (vk *VK) AccountUnregisterDevice(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("account.unregisterDevice", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/ads.go b/vendor/github.com/SevereCloud/vksdk/v2/api/ads.go
new file mode 100644
index 00000000..529e1be4
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/ads.go
@@ -0,0 +1,581 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "encoding/json"
+
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// AdsAddOfficeUsersItem struct.
+type AdsAddOfficeUsersItem struct {
+ OK object.BaseBoolInt
+ Error AdsError
+}
+
+// UnmarshalJSON func.
+func (r *AdsAddOfficeUsersItem) UnmarshalJSON(data []byte) (err error) {
+ if r.OK.UnmarshalJSON(data) != nil {
+ return json.Unmarshal(data, &r.Error)
+ }
+
+ return
+}
+
+// AdsAddOfficeUsersResponse struct.
+type AdsAddOfficeUsersResponse []AdsAddOfficeUsersItem
+
+// AdsAddOfficeUsers adds managers and/or supervisors to advertising account.
+//
+// https://vk.com/dev/ads.addOfficeUsers
+func (vk *VK) AdsAddOfficeUsers(params Params) (response AdsAddOfficeUsersResponse, err error) {
+ err = vk.RequestUnmarshal("ads.addOfficeUsers", &response, params)
+ return
+}
+
+// AdsCheckLinkResponse struct.
+type AdsCheckLinkResponse struct {
+ // link status
+ Status object.AdsLinkStatus `json:"status"`
+
+ // (if status = disallowed) — description of the reason
+ Description string `json:"description,omitempty"`
+
+ // (if the end link differs from original and status = allowed) — end link.
+ RedirectURL string `json:"redirect_url,omitempty"`
+}
+
+// AdsCheckLink allows to check the ad link.
+//
+// https://vk.com/dev/ads.checkLink
+func (vk *VK) AdsCheckLink(params Params) (response AdsCheckLinkResponse, err error) {
+ err = vk.RequestUnmarshal("ads.checkLink", &response, params)
+ return
+}
+
+// AdsCreateAdsResponse struct.
+type AdsCreateAdsResponse []struct {
+ ID int `json:"id"`
+ AdsError
+}
+
+// AdsCreateAds creates ads.
+//
+// Please note! Maximum allowed number of ads created in one request is 5.
+// Minimum size of ad audience is 50 people.
+//
+// https://vk.com/dev/ads.createAds
+func (vk *VK) AdsCreateAds(params Params) (response AdsCreateAdsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.createAds", &response, params)
+ return
+}
+
+// AdsCreateCampaignsResponse struct.
+type AdsCreateCampaignsResponse []struct {
+ ID int `json:"id"`
+ AdsError
+}
+
+// AdsCreateCampaigns creates advertising campaigns.
+//
+// Please note! Allowed number of campaigns created in one request is 50.
+//
+// https://vk.com/dev/ads.createCampaigns
+func (vk *VK) AdsCreateCampaigns(params Params) (response AdsCreateCampaignsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.createCampaigns", &response, params)
+ return
+}
+
+// AdsCreateClientsResponse struct.
+type AdsCreateClientsResponse []struct {
+ ID int `json:"id"`
+ AdsError
+}
+
+// AdsCreateClients creates clients of an advertising agency.
+//
+// Available only for advertising agencies.
+//
+// Please note! Allowed number of clients created in one request is 50.
+//
+// https://vk.com/dev/ads.createClients
+func (vk *VK) AdsCreateClients(params Params) (response AdsCreateClientsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.createClients", &response, params)
+ return
+}
+
+// AdsCreateLookalikeRequestResponse struct.
+type AdsCreateLookalikeRequestResponse struct {
+ RequestID int `json:"request_id"`
+}
+
+// AdsCreateLookalikeRequest creates a request to find a similar audience.
+//
+// https://vk.com/dev/ads.createLookalikeRequest
+func (vk *VK) AdsCreateLookalikeRequest(params Params) (response AdsCreateLookalikeRequestResponse, err error) {
+ err = vk.RequestUnmarshal("ads.createLookalikeRequest", &response, params)
+ return
+}
+
+// AdsCreateTargetGroupResponse struct.
+type AdsCreateTargetGroupResponse struct {
+ ID int `json:"id"`
+}
+
+// AdsCreateTargetGroup Creates a group to re-target ads for users who visited
+// advertiser's site (viewed information about the product, registered, etc.).
+//
+// When executed successfully this method returns user accounting code on
+// advertiser's site. You shall add this code to the site page, so users
+// registered in VK will be added to the created target group after they visit
+// this page.
+//
+// Use ads.importTargetContacts method to import existing user contacts to
+// the group.
+//
+// Please note! Maximum allowed number of groups for one advertising
+// account is 100.
+//
+// https://vk.com/dev/ads.createTargetGroup
+func (vk *VK) AdsCreateTargetGroup(params Params) (response AdsCreateTargetGroupResponse, err error) {
+ err = vk.RequestUnmarshal("ads.createTargetGroup", &response, params)
+ return
+}
+
+// AdsCreateTargetPixelResponse struct.
+type AdsCreateTargetPixelResponse struct {
+ ID int `json:"id"`
+ Pixel string `json:"pixel"`
+}
+
+// AdsCreateTargetPixel Creates retargeting pixel.
+//
+// Method returns pixel code for users accounting on the advertiser site.
+// Authorized VK users who visited the page with pixel code on it will be
+// added to retargeting audience with corresponding rules. You can also use
+// Open API, ads.importTargetContacts method and loading from file.
+//
+// Maximum pixels number per advertising account is 25.
+//
+// https://vk.com/dev/ads.createTargetPixel
+func (vk *VK) AdsCreateTargetPixel(params Params) (response AdsCreateTargetPixelResponse, err error) {
+ err = vk.RequestUnmarshal("ads.createTargetPixel", &response, params)
+ return
+}
+
+// AdsDeleteAdsResponse struct.
+//
+// Each response is 0 — deleted successfully, or an error code.
+type AdsDeleteAdsResponse []ErrorType
+
+// AdsDeleteAds archives ads.
+//
+// Warning! Maximum allowed number of ads archived in one request is 100.
+//
+// https://vk.com/dev/ads.deleteAds
+func (vk *VK) AdsDeleteAds(params Params) (response AdsDeleteAdsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.deleteAds", &response, params)
+ return
+}
+
+// AdsDeleteCampaignsResponse struct.
+//
+// Each response is 0 — deleted successfully, or an error code.
+type AdsDeleteCampaignsResponse []ErrorType
+
+// AdsDeleteCampaigns archives advertising campaigns.
+//
+//
+// Warning! Maximum allowed number of campaigns archived in one request is 100.
+//
+// https://vk.com/dev/ads.deleteCampaigns
+func (vk *VK) AdsDeleteCampaigns(params Params) (response AdsDeleteCampaignsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.deleteCampaigns", &response, params)
+ return
+}
+
+// AdsDeleteClientsResponse struct.
+//
+// Each response is 0 — deleted successfully, or an error code.
+type AdsDeleteClientsResponse []ErrorType
+
+// AdsDeleteClients archives clients of an advertising agency.
+//
+// Available only for advertising agencies.
+//
+// Please note! Maximum allowed number of clients edited in one request is 10.
+//
+// https://vk.com/dev/ads.deleteClients
+func (vk *VK) AdsDeleteClients(params Params) (response AdsDeleteClientsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.deleteClients", &response, params)
+ return
+}
+
+// AdsDeleteTargetGroup deletes target group.
+//
+// https://vk.com/dev/ads.deleteTargetGroup
+func (vk *VK) AdsDeleteTargetGroup(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("ads.deleteTargetGroup", &response, params)
+ return
+}
+
+// AdsDeleteTargetPixel deletes target pixel.
+//
+// https://vk.com/dev/ads.deleteTargetPixel
+func (vk *VK) AdsDeleteTargetPixel(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("ads.deleteTargetPixel", &response, params)
+ return
+}
+
+// AdsGetAccountsResponse struct.
+type AdsGetAccountsResponse []object.AdsAccount
+
+// AdsGetAccounts returns a list of advertising accounts.
+//
+// https://vk.com/dev/ads.getAccounts
+func (vk *VK) AdsGetAccounts(params Params) (response AdsGetAccountsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.getAccounts", &response, params)
+ return
+}
+
+// AdsGetAdsResponse struct.
+type AdsGetAdsResponse []object.AdsAd
+
+// AdsGetAds returns a list of ads.
+//
+// https://vk.com/dev/ads.getAds
+func (vk *VK) AdsGetAds(params Params) (response AdsGetAdsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.getAds", &response, params)
+ return
+}
+
+// AdsGetAdsLayoutResponse struct.
+type AdsGetAdsLayoutResponse []object.AdsAdLayout
+
+// AdsGetAdsLayout returns descriptions of ad layouts.
+//
+// https://vk.com/dev/ads.getAdsLayout
+func (vk *VK) AdsGetAdsLayout(params Params) (response AdsGetAdsLayoutResponse, err error) {
+ err = vk.RequestUnmarshal("ads.getAdsLayout", &response, params)
+ return
+}
+
+// TODO: AdsGetAdsTargetingResponse struct.
+// type AdsGetAdsTargetingResponse struct{}
+
+// TODO: AdsGetAdsTargeting ...
+//
+// https://vk.com/dev/ads.getAdsTargeting
+// func (vk *VK) AdsGetAdsTargeting(params Params) (response AdsGetAdsTargetingResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getAdsTargeting", &response, params)
+// return
+// }
+
+// TODO: AdsGetBudgetResponse struct.
+// type AdsGetBudgetResponse struct{}
+
+// TODO: AdsGetBudget ...
+//
+// https://vk.com/dev/ads.getBudget
+// func (vk *VK) AdsGetBudget(params Params) (response AdsGetBudgetResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getBudget", &response, params)
+// return
+// }
+
+// TODO: AdsGetCampaignsResponse struct.
+// type AdsGetCampaignsResponse struct{}
+
+// TODO: AdsGetCampaigns ...
+//
+// https://vk.com/dev/ads.getCampaigns
+// func (vk *VK) AdsGetCampaigns(params Params) (response AdsGetCampaignsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getCampaigns", &response, params)
+// return
+// }
+
+// TODO: AdsGetCategoriesResponse struct.
+// type AdsGetCategoriesResponse struct{}
+
+// TODO: AdsGetCategories ...
+//
+// https://vk.com/dev/ads.getCategories
+// func (vk *VK) AdsGetCategories(params Params) (response AdsGetCategoriesResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getCategories", &response, params)
+// return
+// }
+
+// TODO: AdsGetClientsResponse struct.
+// type AdsGetClientsResponse struct{}
+
+// TODO: AdsGetClients ...
+//
+// https://vk.com/dev/ads.getClients
+// func (vk *VK) AdsGetClients(params Params) (response AdsGetClientsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getClients", &response, params)
+// return
+// }
+
+// TODO: AdsGetDemographicsResponse struct.
+// type AdsGetDemographicsResponse struct{}
+
+// TODO: AdsGetDemographics ...
+//
+// https://vk.com/dev/ads.getDemographics
+// func (vk *VK) AdsGetDemographics(params Params) (response AdsGetDemographicsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getDemographics", &response, params)
+// return
+// }
+
+// TODO: AdsGetFloodStatsResponse struct.
+// type AdsGetFloodStatsResponse struct{}
+
+// TODO: AdsGetFloodStats ...
+//
+// https://vk.com/dev/ads.getFloodStats
+// func (vk *VK) AdsGetFloodStats(params Params) (response AdsGetFloodStatsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getFloodStats", &response, params)
+// return
+// }
+
+// TODO: AdsGetLookalikeRequestsResponse struct.
+// type AdsGetLookalikeRequestsResponse struct{}
+
+// TODO: AdsGetLookalikeRequests ...
+//
+// https://vk.com/dev/ads.getLookalikeRequests
+// func (vk *VK) AdsGetLookalikeRequests(params Params) (response AdsGetLookalikeRequestsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getLookalikeRequests", &response, params)
+// return
+// }
+
+// AdsGetMusiciansResponse struct.
+type AdsGetMusiciansResponse struct {
+ Items []object.BaseObjectWithName
+}
+
+// AdsGetMusicians returns a list of musicians.
+//
+// https://vk.com/dev/ads.getMusicians
+func (vk *VK) AdsGetMusicians(params Params) (response AdsGetMusiciansResponse, err error) {
+ err = vk.RequestUnmarshal("ads.getMusicians", &response, params)
+ return
+}
+
+// TODO: AdsGetOfficeUsersResponse struct.
+// type AdsGetOfficeUsersResponse struct{}
+
+// TODO: AdsGetOfficeUsers ...
+//
+// https://vk.com/dev/ads.getOfficeUsers
+// func (vk *VK) AdsGetOfficeUsers(params Params) (response AdsGetOfficeUsersResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getOfficeUsers", &response, params)
+// return
+// }
+
+// TODO: AdsGetPostsReachResponse struct.
+// type AdsGetPostsReachResponse struct{}
+
+// TODO: AdsGetPostsReach ...
+//
+// https://vk.com/dev/ads.getPostsReach
+// func (vk *VK) AdsGetPostsReach(params Params) (response AdsGetPostsReachResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getPostsReach", &response, params)
+// return
+// }
+
+// TODO: AdsGetRejectionReasonResponse struct.
+// type AdsGetRejectionReasonResponse struct{}
+
+// TODO: AdsGetRejectionReason ...
+//
+// https://vk.com/dev/ads.getRejectionReason
+// func (vk *VK) AdsGetRejectionReason(params Params) (response AdsGetRejectionReasonResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getRejectionReason", &response, params)
+// return
+// }
+
+// TODO: AdsGetStatisticsResponse struct.
+// type AdsGetStatisticsResponse struct{}
+
+// TODO: AdsGetStatistics ...
+//
+// https://vk.com/dev/ads.getStatistics
+// func (vk *VK) AdsGetStatistics(params Params) (response AdsGetStatisticsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getStatistics", &response, params)
+// return
+// }
+
+// TODO: AdsGetSuggestionsResponse struct.
+// type AdsGetSuggestionsResponse struct{}
+
+// TODO: AdsGetSuggestions ...
+//
+// https://vk.com/dev/ads.getSuggestions
+// func (vk *VK) AdsGetSuggestions(params Params) (response AdsGetSuggestionsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getSuggestions", &response, params)
+// return
+// }
+
+// AdsGetTargetGroupsResponse struct.
+type AdsGetTargetGroupsResponse []object.AdsTargetGroup
+
+// AdsGetTargetGroups returns a list of target groups.
+//
+// https://vk.com/dev/ads.getTargetGroups
+func (vk *VK) AdsGetTargetGroups(params Params) (response AdsGetTargetGroupsResponse, err error) {
+ err = vk.RequestUnmarshal("ads.getTargetGroups", &response, params)
+ return
+}
+
+// TODO: AdsGetTargetPixelsResponse struct.
+// type AdsGetTargetPixelsResponse struct{}
+
+// TODO: AdsGetTargetPixels ...
+//
+// https://vk.com/dev/ads.getTargetPixels
+// func (vk *VK) AdsGetTargetPixels(params Params) (response AdsGetTargetPixelsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getTargetPixels", &response, params)
+// return
+// }
+
+// TODO: AdsGetTargetingStatsResponse struct.
+// type AdsGetTargetingStatsResponse struct{}
+
+// TODO: AdsGetTargetingStats ...
+//
+// https://vk.com/dev/ads.getTargetingStats
+// func (vk *VK) AdsGetTargetingStats(params Params) (response AdsGetTargetingStatsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getTargetingStats", &response, params)
+// return
+// }
+
+// TODO: AdsGetUploadURLResponse struct.
+// type AdsGetUploadURLResponse struct{}
+
+// TODO: AdsGetUploadURL ...
+//
+// https://vk.com/dev/ads.getUploadURL
+// func (vk *VK) AdsGetUploadURL(params Params) (response AdsGetUploadURLResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getUploadURL", &response, params)
+// return
+// }
+
+// TODO: AdsGetVideoUploadURLResponse struct.
+// type AdsGetVideoUploadURLResponse struct{}
+
+// TODO: AdsGetVideoUploadURL ...
+//
+// https://vk.com/dev/ads.getVideoUploadURL
+// func (vk *VK) AdsGetVideoUploadURL(params Params) (response AdsGetVideoUploadURLResponse, err error) {
+// err = vk.RequestUnmarshal("ads.getVideoUploadURL", &response, params)
+// return
+// }
+
+// TODO: AdsImportTargetContactsResponse struct.
+// type AdsImportTargetContactsResponse struct{}
+
+// TODO: AdsImportTargetContacts ...
+//
+// https://vk.com/dev/ads.importTargetContacts
+// func (vk *VK) AdsImportTargetContacts(params Params) (response AdsImportTargetContactsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.importTargetContacts", &response, params)
+// return
+// }
+
+// TODO: AdsRemoveOfficeUsersResponse struct.
+// type AdsRemoveOfficeUsersResponse struct{}
+
+// TODO: AdsRemoveOfficeUsers ...
+//
+// https://vk.com/dev/ads.removeOfficeUsers
+// func (vk *VK) AdsRemoveOfficeUsers(params Params) (response AdsRemoveOfficeUsersResponse, err error) {
+// err = vk.RequestUnmarshal("ads.removeOfficeUsers", &response, params)
+// return
+// }
+
+// AdsRemoveTargetContacts accepts the request to exclude the advertiser's
+// contacts from the retargeting audience.
+//
+// The maximum allowed number of contacts to be excluded by a single
+// request is 1000.
+//
+// Contacts are excluded within a few hours of the request.
+//
+// https://vk.com/dev/ads.removeTargetContacts
+func (vk *VK) AdsRemoveTargetContacts(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("ads.removeTargetContacts", &response, params)
+ return
+}
+
+// TODO: AdsSaveLookalikeRequestResultResponse struct.
+// type AdsSaveLookalikeRequestResultResponse struct{}
+
+// TODO: AdsSaveLookalikeRequestResult ...
+//
+// https://vk.com/dev/ads.saveLookalikeRequestResult
+// func (vk *VK) AdsSaveLookalikeRequestResult(params Params) (
+// response AdsSaveLookalikeRequestResultResponse,
+// err error,
+// ) {
+// err = vk.RequestUnmarshal("ads.saveLookalikeRequestResult", &response, params)
+// return
+// }
+
+// TODO: AdsShareTargetGroupResponse struct.
+// type AdsShareTargetGroupResponse struct{}
+
+// TODO: AdsShareTargetGroup ...
+//
+// https://vk.com/dev/ads.shareTargetGroup
+// func (vk *VK) AdsShareTargetGroup(params Params) (response AdsShareTargetGroupResponse, err error) {
+// err = vk.RequestUnmarshal("ads.shareTargetGroup", &response, params)
+// return
+// }
+
+// TODO: AdsUpdateAdsResponse struct.
+// type AdsUpdateAdsResponse struct{}
+
+// TODO: AdsUpdateAds ...
+//
+// https://vk.com/dev/ads.updateAds
+// func (vk *VK) AdsUpdateAds(params Params) (response AdsUpdateAdsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.updateAds", &response, params)
+// return
+// }
+
+// TODO: AdsUpdateCampaignsResponse struct.
+// type AdsUpdateCampaignsResponse struct{}
+
+// TODO: AdsUpdateCampaigns ...
+//
+// https://vk.com/dev/ads.updateCampaigns
+// func (vk *VK) AdsUpdateCampaigns(params Params) (response AdsUpdateCampaignsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.updateCampaigns", &response, params)
+// return
+// }
+
+// TODO: AdsUpdateClientsResponse struct.
+// type AdsUpdateClientsResponse struct{}
+
+// TODO: AdsUpdateClients ...
+//
+// https://vk.com/dev/ads.updateClients
+// func (vk *VK) AdsUpdateClients(params Params) (response AdsUpdateClientsResponse, err error) {
+// err = vk.RequestUnmarshal("ads.updateClients", &response, params)
+// return
+// }
+
+// AdsUpdateTargetGroup edits target group.
+//
+// https://vk.com/dev/ads.updateTargetGroup
+func (vk *VK) AdsUpdateTargetGroup(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("ads.updateTargetGroup", &response, params)
+ return
+}
+
+// AdsUpdateTargetPixel edits target pixel.
+//
+// https://vk.com/dev/ads.updateTargetPixel
+func (vk *VK) AdsUpdateTargetPixel(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("ads. updateTargetPixel", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/api.go b/vendor/github.com/SevereCloud/vksdk/v2/api/api.go
new file mode 100644
index 00000000..56da7784
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/api.go
@@ -0,0 +1,359 @@
+/*
+Package api implements VK API.
+
+See more https://vk.com/dev/api_requests
+*/
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "fmt"
+ "mime"
+ "net/http"
+ "net/url"
+ "reflect"
+ "sync"
+ "sync/atomic"
+ "time"
+
+ "github.com/SevereCloud/vksdk/v2"
+ "github.com/SevereCloud/vksdk/v2/internal"
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// Api constants.
+const (
+ Version = vksdk.API
+ MethodURL = "https://api.vk.com/method/"
+)
+
+// VKontakte API methods (except for methods from secure and ads sections)
+// with user access key or service access key can be accessed
+// no more than 3 times per second. The community access key is limited
+// to 20 requests per second.
+//
+// Maximum amount of calls to the secure section methods depends
+// on the app's users amount. If an app has less than
+// 10 000 users, 5 requests per second,
+// up to 100 000 – 8 requests,
+// up to 1 000 000 – 20 requests,
+// 1 000 000+ – 35 requests.
+//
+// The ads section methods are subject to their own limitations,
+// you can read them on this page - https://vk.com/dev/ads_limits
+//
+// If one of this limits is exceeded, the server will return following error:
+// "Too many requests per second". (errors.TooMany).
+//
+// If your app's logic implies many requests in a row, check the execute method.
+// It allows for up to 25 requests for different methods in a single request.
+//
+// In addition to restrictions on the frequency of calls, there are also
+// quantitative restrictions on calling the same type of methods.
+//
+// After exceeding the quantitative limit, access to a particular method may
+// require entering a captcha (see https://vk.com/dev/captcha_error),
+// and may also be temporarily restricted (in this case, the server does
+// not return a response to the call of a particular method, but handles
+// any other requests without problems).
+//
+// If this error occurs, the following parameters are also passed in
+// the error message:
+//
+// CaptchaSID - identifier captcha.
+//
+// CaptchaImg - a link to the image that you want to show the user
+// to enter text from that image.
+//
+// In this case, you should ask the user to enter text from
+// the CaptchaImg image and repeat the request by adding parameters to it:
+//
+// captcha_sid - the obtained identifier;
+//
+// captcha_key - text entered by the user.
+//
+// More info: https://vk.com/dev/api_requests
+const (
+ LimitUserToken = 3
+ LimitGroupToken = 20
+)
+
+// VK struct.
+type VK struct {
+ accessTokens []string
+ lastToken uint32
+ MethodURL string
+ Version string
+ Client *http.Client
+ Limit int
+ UserAgent string
+ Handler func(method string, params ...Params) (Response, error)
+
+ mux sync.Mutex
+ lastTime time.Time
+ rps int
+}
+
+// Response struct.
+type Response struct {
+ Response json.RawMessage `json:"response"`
+ Error Error `json:"error"`
+ ExecuteErrors ExecuteErrors `json:"execute_errors"`
+}
+
+// NewVK returns a new VK.
+//
+// The VKSDK will use the http.DefaultClient.
+// This means that if the http.DefaultClient is modified by other components
+// of your application the modifications will be picked up by the SDK as well.
+//
+// In some cases this might be intended, but it is a better practice
+// to create a custom HTTP Client to share explicitly through
+// your application. You can configure the VKSDK to use the custom
+// HTTP Client by setting the VK.Client value.
+//
+// This set limit 20 requests per second for one token.
+func NewVK(tokens ...string) *VK {
+ var vk VK
+
+ vk.accessTokens = tokens
+ vk.Version = Version
+
+ vk.Handler = vk.defaultHandler
+
+ vk.MethodURL = MethodURL
+ vk.Client = http.DefaultClient
+ vk.Limit = LimitGroupToken
+ vk.UserAgent = internal.UserAgent
+
+ return &vk
+}
+
+// getToken return next token (simple round-robin).
+func (vk *VK) getToken() string {
+ i := atomic.AddUint32(&vk.lastToken, 1)
+ return vk.accessTokens[(int(i)-1)%len(vk.accessTokens)]
+}
+
+// Params type.
+type Params map[string]interface{}
+
+// Lang - determines the language for the data to be displayed on. For
+// example country and city names. If you use a non-cyrillic language,
+// cyrillic symbols will be transliterated automatically.
+// Numeric format from account.getInfo is supported as well.
+//
+// p.Lang(object.LangRU)
+//
+// See all language code in module object.
+func (p Params) Lang(v int) Params {
+ p["lang"] = v
+ return p
+}
+
+// TestMode allows to send requests from a native app without switching it on
+// for all users.
+func (p Params) TestMode(v bool) Params {
+ p["test_mode"] = v
+ return p
+}
+
+// CaptchaSID received ID.
+//
+// See https://vk.com/dev/captcha_error
+func (p Params) CaptchaSID(v string) Params {
+ p["captcha_sid"] = v
+ return p
+}
+
+// CaptchaKey text input.
+//
+// See https://vk.com/dev/captcha_error
+func (p Params) CaptchaKey(v string) Params {
+ p["captcha_key"] = v
+ return p
+}
+
+// Confirm parameter.
+//
+// See https://vk.com/dev/need_confirmation
+func (p Params) Confirm(v bool) Params {
+ p["confirm"] = v
+ return p
+}
+
+// WithContext parameter.
+func (p Params) WithContext(ctx context.Context) Params {
+ p[":context"] = ctx
+ return p
+}
+
+func buildQuery(sliceParams ...Params) (context.Context, url.Values) {
+ query := url.Values{}
+ ctx := context.Background()
+
+ for _, params := range sliceParams {
+ for key, value := range params {
+ if key != ":context" {
+ query.Set(key, FmtValue(value, 0))
+ } else {
+ ctx = value.(context.Context)
+ }
+ }
+ }
+
+ return ctx, query
+}
+
+// defaultHandler provides access to VK API methods.
+func (vk *VK) defaultHandler(method string, sliceParams ...Params) (Response, error) {
+ u := vk.MethodURL + method
+ ctx, query := buildQuery(sliceParams...)
+ attempt := 0
+
+ for {
+ var response Response
+
+ attempt++
+
+ // Rate limiting
+ if vk.Limit > 0 {
+ vk.mux.Lock()
+
+ sleepTime := time.Second - time.Since(vk.lastTime)
+ if sleepTime < 0 {
+ vk.lastTime = time.Now()
+ vk.rps = 0
+ } else if vk.rps == vk.Limit*len(vk.accessTokens) {
+ time.Sleep(sleepTime)
+ vk.lastTime = time.Now()
+ vk.rps = 0
+ }
+ vk.rps++
+
+ vk.mux.Unlock()
+ }
+
+ rawBody := bytes.NewBufferString(query.Encode())
+
+ req, err := http.NewRequestWithContext(ctx, "POST", u, rawBody)
+ if err != nil {
+ return response, err
+ }
+
+ req.Header.Set("User-Agent", vk.UserAgent)
+ req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
+
+ resp, err := vk.Client.Do(req)
+ if err != nil {
+ return response, err
+ }
+
+ mediatype, _, _ := mime.ParseMediaType(resp.Header.Get("Content-Type"))
+ if mediatype != "application/json" {
+ _ = resp.Body.Close()
+ return response, &InvalidContentType{mediatype}
+ }
+
+ err = json.NewDecoder(resp.Body).Decode(&response)
+ if err != nil {
+ _ = resp.Body.Close()
+ return response, err
+ }
+
+ _ = resp.Body.Close()
+
+ switch response.Error.Code {
+ case ErrNoType:
+ return response, nil
+ case ErrTooMany:
+ if attempt < vk.Limit {
+ continue
+ }
+
+ return response, &response.Error
+ }
+
+ return response, &response.Error
+ }
+}
+
+// Request provides access to VK API methods.
+func (vk *VK) Request(method string, sliceParams ...Params) ([]byte, error) {
+ token := vk.getToken()
+
+ reqParams := Params{
+ "access_token": token,
+ "v": vk.Version,
+ }
+
+ sliceParams = append(sliceParams, reqParams)
+
+ resp, err := vk.Handler(method, sliceParams...)
+
+ return resp.Response, err
+}
+
+// RequestUnmarshal provides access to VK API methods.
+func (vk *VK) RequestUnmarshal(method string, obj interface{}, sliceParams ...Params) error {
+ rawResponse, err := vk.Request(method, sliceParams...)
+ if err != nil {
+ return err
+ }
+
+ return json.Unmarshal(rawResponse, &obj)
+}
+
+func fmtReflectValue(value reflect.Value, depth int) string {
+ switch f := value; value.Kind() {
+ case reflect.Invalid:
+ return ""
+ case reflect.Bool:
+ return fmtBool(f.Bool())
+ case reflect.Array, reflect.Slice:
+ s := ""
+
+ for i := 0; i < f.Len(); i++ {
+ if i > 0 {
+ s += ","
+ }
+
+ s += FmtValue(f.Index(i).Interface(), depth)
+ }
+
+ return s
+ case reflect.Ptr:
+ // pointer to array or slice or struct? ok at top level
+ // but not embedded (avoid loops)
+ if depth == 0 && f.Pointer() != 0 {
+ switch a := f.Elem(); a.Kind() {
+ case reflect.Array, reflect.Slice, reflect.Struct, reflect.Map:
+ return FmtValue(a.Interface(), depth+1)
+ }
+ }
+ }
+
+ return fmt.Sprint(value)
+}
+
+// FmtValue return vk format string.
+func FmtValue(value interface{}, depth int) string {
+ if value == nil {
+ return ""
+ }
+
+ switch f := value.(type) {
+ case bool:
+ return fmtBool(f)
+ case object.Attachment:
+ return f.ToAttachment()
+ case object.JSONObject:
+ return f.ToJSON()
+ case reflect.Value:
+ return fmtReflectValue(f, depth)
+ }
+
+ return fmtReflectValue(reflect.ValueOf(value), depth)
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/apps.go b/vendor/github.com/SevereCloud/vksdk/v2/api/apps.go
new file mode 100644
index 00000000..892ee607
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/apps.go
@@ -0,0 +1,149 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// AppsDeleteAppRequests deletes all request notifications from the current app.
+//
+// https://vk.com/dev/apps.deleteAppRequests
+func (vk *VK) AppsDeleteAppRequests(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("apps.deleteAppRequests", &response, params)
+ return
+}
+
+// AppsGetResponse struct.
+type AppsGetResponse struct {
+ Count int `json:"count"`
+ Items []object.AppsApp `json:"items"`
+ object.ExtendedResponse
+}
+
+// AppsGet returns applications data.
+//
+// https://vk.com/dev/apps.get
+func (vk *VK) AppsGet(params Params) (response AppsGetResponse, err error) {
+ err = vk.RequestUnmarshal("apps.get", &response, params)
+ return
+}
+
+// AppsGetCatalogResponse struct.
+type AppsGetCatalogResponse struct {
+ Count int `json:"count"`
+ Items []object.AppsApp `json:"items"`
+ object.ExtendedResponse
+}
+
+// AppsGetCatalog returns a list of applications (apps) available to users in the App Catalog.
+//
+// https://vk.com/dev/apps.getCatalog
+func (vk *VK) AppsGetCatalog(params Params) (response AppsGetCatalogResponse, err error) {
+ err = vk.RequestUnmarshal("apps.getCatalog", &response, params)
+ return
+}
+
+// AppsGetFriendsListResponse struct.
+type AppsGetFriendsListResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// AppsGetFriendsList creates friends list for requests and invites in current app.
+//
+// extended=0
+//
+// https://vk.com/dev/apps.getFriendsList
+func (vk *VK) AppsGetFriendsList(params Params) (response AppsGetFriendsListResponse, err error) {
+ err = vk.RequestUnmarshal("apps.getFriendsList", &response, params, Params{"extended": false})
+
+ return
+}
+
+// AppsGetFriendsListExtendedResponse struct.
+type AppsGetFriendsListExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// AppsGetFriendsListExtended creates friends list for requests and invites in current app.
+//
+// extended=1
+//
+// https://vk.com/dev/apps.getFriendsList
+func (vk *VK) AppsGetFriendsListExtended(params Params) (response AppsGetFriendsListExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("apps.getFriendsList", &response, params, Params{"extended": true})
+
+ return
+}
+
+// AppsGetLeaderboardResponse struct.
+type AppsGetLeaderboardResponse struct {
+ Count int `json:"count"`
+ Items []object.AppsLeaderboard `json:"items"`
+}
+
+// AppsGetLeaderboard returns players rating in the game.
+//
+// extended=0
+//
+// https://vk.com/dev/apps.getLeaderboard
+func (vk *VK) AppsGetLeaderboard(params Params) (response AppsGetLeaderboardResponse, err error) {
+ err = vk.RequestUnmarshal("apps.getLeaderboard", &response, params, Params{"extended": false})
+
+ return
+}
+
+// AppsGetLeaderboardExtendedResponse struct.
+type AppsGetLeaderboardExtendedResponse struct {
+ Count int `json:"count"`
+ Items []struct {
+ Score int `json:"score"`
+ UserID int `json:"user_id"`
+ } `json:"items"`
+ Profiles []object.UsersUser `json:"profiles"`
+}
+
+// AppsGetLeaderboardExtended returns players rating in the game.
+//
+// extended=1
+//
+// https://vk.com/dev/apps.getLeaderboard
+func (vk *VK) AppsGetLeaderboardExtended(params Params) (response AppsGetLeaderboardExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("apps.getLeaderboard", &response, params, Params{"extended": true})
+
+ return
+}
+
+// AppsGetScopesResponse struct.
+type AppsGetScopesResponse struct {
+ Count int `json:"count"`
+ Items []object.AppsScope `json:"items"`
+}
+
+// AppsGetScopes ...
+//
+// TODO: write docs.
+//
+// https://vk.com/dev/apps.getScopes
+func (vk *VK) AppsGetScopes(params Params) (response AppsGetScopesResponse, err error) {
+ err = vk.RequestUnmarshal("apps.getScopes", &response, params)
+ return
+}
+
+// AppsGetScore returns user score in app.
+//
+// NOTE: vk wtf!?
+//
+// https://vk.com/dev/apps.getScore
+func (vk *VK) AppsGetScore(params Params) (response string, err error) {
+ err = vk.RequestUnmarshal("apps.getScore", &response, params)
+ return
+}
+
+// AppsSendRequest sends a request to another user in an app that uses VK authorization.
+//
+// https://vk.com/dev/apps.sendRequest
+func (vk *VK) AppsSendRequest(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("apps.sendRequest", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/appwidgets.go b/vendor/github.com/SevereCloud/vksdk/v2/api/appwidgets.go
new file mode 100644
index 00000000..5500d0e2
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/appwidgets.go
@@ -0,0 +1,100 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// AppWidgetsGetAppImageUploadServerResponse struct.
+type AppWidgetsGetAppImageUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// AppWidgetsGetAppImageUploadServer returns a URL for uploading a
+// photo to the app collection for community app widgets.
+//
+// https://vk.com/dev/appWidgets.getAppImageUploadServer
+func (vk *VK) AppWidgetsGetAppImageUploadServer(params Params) (
+ response AppWidgetsGetAppImageUploadServerResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("appWidgets.getAppImageUploadServer", &response, params)
+ return
+}
+
+// AppWidgetsGetAppImagesResponse struct.
+type AppWidgetsGetAppImagesResponse struct {
+ Count int `json:"count"`
+ Items []object.AppWidgetsImage `json:"items"`
+}
+
+// AppWidgetsGetAppImages returns an app collection of images for community app widgets.
+//
+// https://vk.com/dev/appWidgets.getAppImages
+func (vk *VK) AppWidgetsGetAppImages(params Params) (response AppWidgetsGetAppImagesResponse, err error) {
+ err = vk.RequestUnmarshal("appWidgets.getAppImages", &response, params)
+ return
+}
+
+// AppWidgetsGetGroupImageUploadServerResponse struct.
+type AppWidgetsGetGroupImageUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// AppWidgetsGetGroupImageUploadServer returns a URL for uploading
+// a photo to the community collection for community app widgets.
+//
+// https://vk.com/dev/appWidgets.getGroupImageUploadServer
+func (vk *VK) AppWidgetsGetGroupImageUploadServer(params Params) (
+ response AppWidgetsGetGroupImageUploadServerResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("appWidgets.getGroupImageUploadServer", &response, params)
+ return
+}
+
+// AppWidgetsGetGroupImagesResponse struct.
+type AppWidgetsGetGroupImagesResponse struct {
+ Count int `json:"count"`
+ Items []object.AppWidgetsImage `json:"items"`
+}
+
+// AppWidgetsGetGroupImages returns a community collection of images for community app widgets.
+//
+// https://vk.com/dev/appWidgets.getGroupImages
+func (vk *VK) AppWidgetsGetGroupImages(params Params) (response AppWidgetsGetGroupImagesResponse, err error) {
+ err = vk.RequestUnmarshal("appWidgets.getGroupImages", &response, params)
+ return
+}
+
+// AppWidgetsGetImagesByID returns an image for community app widgets by its ID.
+//
+// https://vk.com/dev/appWidgets.getImagesById
+func (vk *VK) AppWidgetsGetImagesByID(params Params) (response object.AppWidgetsImage, err error) {
+ err = vk.RequestUnmarshal("appWidgets.getImagesById", &response, params)
+ return
+}
+
+// AppWidgetsSaveAppImage allows to save image into app collection for community app widgets.
+//
+// https://vk.com/dev/appWidgets.saveAppImage
+func (vk *VK) AppWidgetsSaveAppImage(params Params) (response object.AppWidgetsImage, err error) {
+ err = vk.RequestUnmarshal("appWidgets.saveAppImage", &response, params)
+ return
+}
+
+// AppWidgetsSaveGroupImage allows to save image into community collection for community app widgets.
+//
+// https://vk.com/dev/appWidgets.saveGroupImage
+func (vk *VK) AppWidgetsSaveGroupImage(params Params) (response object.AppWidgetsImage, err error) {
+ err = vk.RequestUnmarshal("appWidgets.saveGroupImage", &response, params)
+ return
+}
+
+// AppWidgetsUpdate allows to update community app widget.
+//
+// https://vk.com/dev/appWidgets.update
+func (vk *VK) AppWidgetsUpdate(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("appWidgets.update", &response, params)
+
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/auth.go b/vendor/github.com/SevereCloud/vksdk/v2/api/auth.go
new file mode 100644
index 00000000..f927a6ff
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/auth.go
@@ -0,0 +1,26 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+// AuthCheckPhone checks a user's phone number for correctness.
+//
+// https://vk.com/dev/auth.checkPhone
+//
+// Deprecated: This method is deprecated and may be disabled soon, please avoid
+// using it.
+func (vk *VK) AuthCheckPhone(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("auth.checkPhone", &response, params)
+ return
+}
+
+// AuthRestoreResponse struct.
+type AuthRestoreResponse struct {
+ Success int `json:"success"`
+ SID string `json:"sid"`
+}
+
+// AuthRestore allows to restore account access using a code received via SMS.
+//
+// https://vk.com/dev/auth.restore
+func (vk *VK) AuthRestore(params Params) (response AuthRestoreResponse, err error) {
+ err = vk.RequestUnmarshal("auth.restore", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/board.go b/vendor/github.com/SevereCloud/vksdk/v2/api/board.go
new file mode 100644
index 00000000..82ddd5c0
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/board.go
@@ -0,0 +1,173 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// BoardAddTopic creates a new topic on a community's discussion board.
+//
+// https://vk.com/dev/board.addTopic
+func (vk *VK) BoardAddTopic(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.addTopic", &response, params)
+ return
+}
+
+// BoardCloseTopic closes a topic on a community's discussion board so that comments cannot be posted.
+//
+// https://vk.com/dev/board.closeTopic
+func (vk *VK) BoardCloseTopic(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.closeTopic", &response, params)
+ return
+}
+
+// BoardCreateComment adds a comment on a topic on a community's discussion board.
+//
+// https://vk.com/dev/board.createComment
+func (vk *VK) BoardCreateComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.createComment", &response, params)
+ return
+}
+
+// BoardDeleteComment deletes a comment on a topic on a community's discussion board.
+//
+// https://vk.com/dev/board.deleteComment
+func (vk *VK) BoardDeleteComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.deleteComment", &response, params)
+ return
+}
+
+// BoardDeleteTopic deletes a topic from a community's discussion board.
+//
+// https://vk.com/dev/board.deleteTopic
+func (vk *VK) BoardDeleteTopic(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.deleteTopic", &response, params)
+ return
+}
+
+// BoardEditComment edits a comment on a topic on a community's discussion board.
+//
+// https://vk.com/dev/board.editComment
+func (vk *VK) BoardEditComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.editComment", &response, params)
+ return
+}
+
+// BoardEditTopic edits the title of a topic on a community's discussion board.
+//
+// https://vk.com/dev/board.editTopic
+func (vk *VK) BoardEditTopic(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.editTopic", &response, params)
+ return
+}
+
+// BoardFixTopic pins a topic (fixes its place) to the top of a community's discussion board.
+//
+// https://vk.com/dev/board.fixTopic
+func (vk *VK) BoardFixTopic(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.fixTopic", &response, params)
+ return
+}
+
+// BoardGetCommentsResponse struct.
+type BoardGetCommentsResponse struct {
+ Count int `json:"count"`
+ Items []object.BoardTopicComment `json:"items"`
+ Poll object.BoardTopicPoll `json:"poll"`
+ RealOffset int `json:"real_offset"`
+}
+
+// BoardGetComments returns a list of comments on a topic on a community's discussion board.
+//
+// extended=0
+//
+// https://vk.com/dev/board.getComments
+func (vk *VK) BoardGetComments(params Params) (response BoardGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("board.getComments", &response, params, Params{"extended": false})
+
+ return
+}
+
+// BoardGetCommentsExtendedResponse struct.
+type BoardGetCommentsExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.BoardTopicComment `json:"items"`
+ Poll object.BoardTopicPoll `json:"poll"`
+ RealOffset int `json:"real_offset"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+}
+
+// BoardGetCommentsExtended returns a list of comments on a topic on a community's discussion board.
+//
+// extended=1
+//
+// https://vk.com/dev/board.getComments
+func (vk *VK) BoardGetCommentsExtended(params Params) (response BoardGetCommentsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("board.getComments", &response, params, Params{"extended": true})
+
+ return
+}
+
+// BoardGetTopicsResponse struct.
+type BoardGetTopicsResponse struct {
+ Count int `json:"count"`
+ Items []object.BoardTopic `json:"items"`
+ DefaultOrder float64 `json:"default_order"` // BUG(VK): default_order int https://vk.com/bug136682
+ CanAddTopics object.BaseBoolInt `json:"can_add_topics"`
+}
+
+// BoardGetTopics returns a list of topics on a community's discussion board.
+//
+// extended=0
+//
+// https://vk.com/dev/board.getTopics
+func (vk *VK) BoardGetTopics(params Params) (response BoardGetTopicsResponse, err error) {
+ err = vk.RequestUnmarshal("board.getTopics", &response, params, Params{"extended": false})
+
+ return
+}
+
+// BoardGetTopicsExtendedResponse struct.
+type BoardGetTopicsExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.BoardTopic `json:"items"`
+ DefaultOrder float64 `json:"default_order"` // BUG(VK): default_order int https://vk.com/bug136682
+ CanAddTopics object.BaseBoolInt `json:"can_add_topics"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+}
+
+// BoardGetTopicsExtended returns a list of topics on a community's discussion board.
+//
+// extended=1
+//
+// https://vk.com/dev/board.getTopics
+func (vk *VK) BoardGetTopicsExtended(params Params) (response BoardGetTopicsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("board.getTopics", &response, params, Params{"extended": true})
+
+ return
+}
+
+// BoardOpenTopic re-opens a previously closed topic on a community's discussion board.
+//
+// https://vk.com/dev/board.openTopic
+func (vk *VK) BoardOpenTopic(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.openTopic", &response, params)
+ return
+}
+
+// BoardRestoreComment restores a comment deleted from a topic on a community's discussion board.
+//
+// https://vk.com/dev/board.restoreComment
+func (vk *VK) BoardRestoreComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.restoreComment", &response, params)
+ return
+}
+
+// BoardUnfixTopic unpins a pinned topic from the top of a community's discussion board.
+//
+// https://vk.com/dev/board.unfixTopic
+func (vk *VK) BoardUnfixTopic(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("board.unfixTopic", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/captcha.go b/vendor/github.com/SevereCloud/vksdk/v2/api/captcha.go
new file mode 100644
index 00000000..4abd1f8a
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/captcha.go
@@ -0,0 +1,7 @@
+package api
+
+// CaptchaForce api method.
+func (vk *VK) CaptchaForce(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("captcha.force", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/database.go b/vendor/github.com/SevereCloud/vksdk/v2/api/database.go
new file mode 100644
index 00000000..9a199762
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/database.go
@@ -0,0 +1,163 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// DatabaseGetChairsResponse struct.
+type DatabaseGetChairsResponse struct {
+ Count int `json:"count"`
+ Items []object.BaseObject `json:"items"`
+}
+
+// DatabaseGetChairs returns list of chairs on a specified faculty.
+//
+// https://vk.com/dev/database.getChairs
+func (vk *VK) DatabaseGetChairs(params Params) (response DatabaseGetChairsResponse, err error) {
+ err = vk.RequestUnmarshal("database.getChairs", &response, params)
+ return
+}
+
+// DatabaseGetCitiesResponse struct.
+type DatabaseGetCitiesResponse struct {
+ Count int `json:"count"`
+ Items []object.DatabaseCity `json:"items"`
+}
+
+// DatabaseGetCities returns a list of cities.
+//
+// https://vk.com/dev/database.getCities
+func (vk *VK) DatabaseGetCities(params Params) (response DatabaseGetCitiesResponse, err error) {
+ err = vk.RequestUnmarshal("database.getCities", &response, params)
+ return
+}
+
+// DatabaseGetCitiesByIDResponse struct.
+type DatabaseGetCitiesByIDResponse []object.DatabaseCity
+
+// DatabaseGetCitiesByID returns information about cities by their IDs.
+//
+// https://vk.com/dev/database.getCitiesByID
+func (vk *VK) DatabaseGetCitiesByID(params Params) (response DatabaseGetCitiesByIDResponse, err error) {
+ err = vk.RequestUnmarshal("database.getCitiesById", &response, params)
+ return
+}
+
+// DatabaseGetCountriesResponse struct.
+type DatabaseGetCountriesResponse struct {
+ Count int `json:"count"`
+ Items []object.BaseObject `json:"items"`
+}
+
+// DatabaseGetCountries returns a list of countries.
+//
+// https://vk.com/dev/database.getCountries
+func (vk *VK) DatabaseGetCountries(params Params) (response DatabaseGetCountriesResponse, err error) {
+ err = vk.RequestUnmarshal("database.getCountries", &response, params)
+ return
+}
+
+// DatabaseGetCountriesByIDResponse struct.
+type DatabaseGetCountriesByIDResponse []object.BaseObject
+
+// DatabaseGetCountriesByID returns information about countries by their IDs.
+//
+// https://vk.com/dev/database.getCountriesByID
+func (vk *VK) DatabaseGetCountriesByID(params Params) (response DatabaseGetCountriesByIDResponse, err error) {
+ err = vk.RequestUnmarshal("database.getCountriesById", &response, params)
+ return
+}
+
+// DatabaseGetFacultiesResponse struct.
+type DatabaseGetFacultiesResponse struct {
+ Count int `json:"count"`
+ Items []object.DatabaseFaculty `json:"items"`
+}
+
+// DatabaseGetFaculties returns a list of faculties (i.e., university departments).
+//
+// https://vk.com/dev/database.getFaculties
+func (vk *VK) DatabaseGetFaculties(params Params) (response DatabaseGetFacultiesResponse, err error) {
+ err = vk.RequestUnmarshal("database.getFaculties", &response, params)
+ return
+}
+
+// DatabaseGetMetroStationsResponse struct.
+type DatabaseGetMetroStationsResponse struct {
+ Count int `json:"count"`
+ Items []object.DatabaseMetroStation `json:"items"`
+}
+
+// DatabaseGetMetroStations returns the list of metro stations.
+//
+// https://vk.com/dev/database.getMetroStations
+func (vk *VK) DatabaseGetMetroStations(params Params) (response DatabaseGetMetroStationsResponse, err error) {
+ err = vk.RequestUnmarshal("database.getMetroStations", &response, params)
+ return
+}
+
+// DatabaseGetMetroStationsByIDResponse struct.
+type DatabaseGetMetroStationsByIDResponse []object.DatabaseMetroStation
+
+// DatabaseGetMetroStationsByID returns information about one or several metro stations by their identifiers.
+//
+// https://vk.com/dev/database.getMetroStationsById
+func (vk *VK) DatabaseGetMetroStationsByID(params Params) (response DatabaseGetMetroStationsByIDResponse, err error) {
+ err = vk.RequestUnmarshal("database.getMetroStationsById", &response, params)
+ return
+}
+
+// DatabaseGetRegionsResponse struct.
+type DatabaseGetRegionsResponse struct {
+ Count int `json:"count"`
+ Items []object.DatabaseRegion `json:"items"`
+}
+
+// DatabaseGetRegions returns a list of regions.
+//
+// https://vk.com/dev/database.getRegions
+func (vk *VK) DatabaseGetRegions(params Params) (response DatabaseGetRegionsResponse, err error) {
+ err = vk.RequestUnmarshal("database.getRegions", &response, params)
+ return
+}
+
+// DatabaseGetSchoolClassesResponse struct.
+type DatabaseGetSchoolClassesResponse [][]interface{}
+
+// DatabaseGetSchoolClasses returns a list of school classes specified for the country.
+//
+// BUG(VK): database.getSchoolClasses bad return.
+//
+// https://vk.com/dev/database.getSchoolClasses
+func (vk *VK) DatabaseGetSchoolClasses(params Params) (response DatabaseGetSchoolClassesResponse, err error) {
+ err = vk.RequestUnmarshal("database.getSchoolClasses", &response, params)
+ return
+}
+
+// DatabaseGetSchoolsResponse struct.
+type DatabaseGetSchoolsResponse struct {
+ Count int `json:"count"`
+ Items []object.DatabaseSchool `json:"items"`
+}
+
+// DatabaseGetSchools returns a list of schools.
+//
+// https://vk.com/dev/database.getSchools
+func (vk *VK) DatabaseGetSchools(params Params) (response DatabaseGetSchoolsResponse, err error) {
+ err = vk.RequestUnmarshal("database.getSchools", &response, params)
+ return
+}
+
+// DatabaseGetUniversitiesResponse struct.
+type DatabaseGetUniversitiesResponse struct {
+ Count int `json:"count"`
+ Items []object.DatabaseUniversity `json:"items"`
+}
+
+// DatabaseGetUniversities returns a list of higher education institutions.
+//
+// https://vk.com/dev/database.getUniversities
+func (vk *VK) DatabaseGetUniversities(params Params) (response DatabaseGetUniversitiesResponse, err error) {
+ err = vk.RequestUnmarshal("database.getUniversities", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/docs.go b/vendor/github.com/SevereCloud/vksdk/v2/api/docs.go
new file mode 100644
index 00000000..48605dae
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/docs.go
@@ -0,0 +1,137 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// DocsAdd copies a document to a user's or community's document list.
+//
+// https://vk.com/dev/docs.add
+func (vk *VK) DocsAdd(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("docs.add", &response, params)
+ return
+}
+
+// DocsDelete deletes a user or community document.
+//
+// https://vk.com/dev/docs.delete
+func (vk *VK) DocsDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("docs.delete", &response, params)
+ return
+}
+
+// DocsEdit edits a document.
+//
+// https://vk.com/dev/docs.edit
+func (vk *VK) DocsEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("docs.edit", &response, params)
+ return
+}
+
+// DocsGetResponse struct.
+type DocsGetResponse struct {
+ Count int `json:"count"`
+ Items []object.DocsDoc `json:"items"`
+}
+
+// DocsGet returns detailed information about user or community documents.
+//
+// https://vk.com/dev/docs.get
+func (vk *VK) DocsGet(params Params) (response DocsGetResponse, err error) {
+ err = vk.RequestUnmarshal("docs.get", &response, params)
+ return
+}
+
+// DocsGetByIDResponse struct.
+type DocsGetByIDResponse []object.DocsDoc
+
+// DocsGetByID returns information about documents by their IDs.
+//
+// https://vk.com/dev/docs.getById
+func (vk *VK) DocsGetByID(params Params) (response DocsGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("docs.getById", &response, params)
+ return
+}
+
+// DocsGetMessagesUploadServerResponse struct.
+type DocsGetMessagesUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// DocsGetMessagesUploadServer returns the server address for document upload.
+//
+// https://vk.com/dev/docs.getMessagesUploadServer
+func (vk *VK) DocsGetMessagesUploadServer(params Params) (response DocsGetMessagesUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("docs.getMessagesUploadServer", &response, params)
+ return
+}
+
+// DocsGetTypesResponse struct.
+type DocsGetTypesResponse struct {
+ Count int `json:"count"`
+ Items []object.DocsDocTypes `json:"items"`
+}
+
+// DocsGetTypes returns documents types available for current user.
+//
+// https://vk.com/dev/docs.getTypes
+func (vk *VK) DocsGetTypes(params Params) (response DocsGetTypesResponse, err error) {
+ err = vk.RequestUnmarshal("docs.getTypes", &response, params)
+ return
+}
+
+// DocsGetUploadServerResponse struct.
+type DocsGetUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// DocsGetUploadServer returns the server address for document upload.
+//
+// https://vk.com/dev/docs.getUploadServer
+func (vk *VK) DocsGetUploadServer(params Params) (response DocsGetUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("docs.getUploadServer", &response, params)
+ return
+}
+
+// DocsGetWallUploadServerResponse struct.
+type DocsGetWallUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// DocsGetWallUploadServer returns the server address for document upload onto a user's or community's wall.
+//
+// https://vk.com/dev/docs.getWallUploadServer
+func (vk *VK) DocsGetWallUploadServer(params Params) (response DocsGetWallUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("docs.getWallUploadServer", &response, params)
+ return
+}
+
+// DocsSaveResponse struct.
+type DocsSaveResponse struct {
+ Type string `json:"type"`
+ AudioMessage object.MessagesAudioMessage `json:"audio_message"`
+ Doc object.DocsDoc `json:"doc"`
+ Graffiti object.MessagesGraffiti `json:"graffiti"`
+}
+
+// DocsSave saves a document after uploading it to a server.
+//
+// https://vk.com/dev/docs.save
+func (vk *VK) DocsSave(params Params) (response DocsSaveResponse, err error) {
+ err = vk.RequestUnmarshal("docs.save", &response, params)
+ return
+}
+
+// DocsSearchResponse struct.
+type DocsSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.DocsDoc `json:"items"`
+}
+
+// DocsSearch returns a list of documents matching the search criteria.
+//
+// https://vk.com/dev/docs.search
+func (vk *VK) DocsSearch(params Params) (response DocsSearchResponse, err error) {
+ err = vk.RequestUnmarshal("docs.search", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/donut.go b/vendor/github.com/SevereCloud/vksdk/v2/api/donut.go
new file mode 100644
index 00000000..d6a13837
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/donut.go
@@ -0,0 +1,49 @@
+package api
+
+import "github.com/SevereCloud/vksdk/v2/object"
+
+// DonutGetFriendsResponse struct.
+type DonutGetFriendsResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// DonutGetFriends method.
+//
+// https://vk.com/dev/donut.getFriends
+func (vk *VK) DonutGetFriends(params Params) (response DonutGetFriendsResponse, err error) {
+ err = vk.RequestUnmarshal("donut.getFriends", &response, params)
+ return
+}
+
+// DonutGetSubscription method.
+//
+// https://vk.com/dev/donut.getSubscription
+func (vk *VK) DonutGetSubscription(params Params) (response object.DonutDonatorSubscriptionInfo, err error) {
+ err = vk.RequestUnmarshal("donut.getSubscription", &response, params)
+ return
+}
+
+// DonutGetSubscriptionsResponse struct.
+type DonutGetSubscriptionsResponse struct {
+ Subscriptions []object.DonutDonatorSubscriptionInfo `json:"subscriptions"`
+ Count int `json:"count"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+}
+
+// DonutGetSubscriptions method.
+//
+// https://vk.com/dev/donut.getSubscriptions
+func (vk *VK) DonutGetSubscriptions(params Params) (response DonutGetSubscriptionsResponse, err error) {
+ err = vk.RequestUnmarshal("donut.getSubscriptions", &response, params)
+ return
+}
+
+// DonutIsDon method.
+//
+// https://vk.com/dev/donut.isDon
+func (vk *VK) DonutIsDon(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("donut.isDon", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/downloadedGames.go b/vendor/github.com/SevereCloud/vksdk/v2/api/downloadedGames.go
new file mode 100644
index 00000000..cd03cfdb
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/downloadedGames.go
@@ -0,0 +1,19 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// DownloadedGamesGetPaidStatusResponse struct.
+type DownloadedGamesGetPaidStatusResponse struct {
+ IsPaid object.BaseBoolInt `json:"is_paid"`
+}
+
+// DownloadedGamesGetPaidStatus method.
+//
+// https://vk.com/dev/downloadedGames.getPaidStatus
+func (vk *VK) DownloadedGamesGetPaidStatus(params Params) (response DownloadedGamesGetPaidStatusResponse, err error) {
+ err = vk.RequestUnmarshal("downloadedGames.getPaidStatus", &response, params, Params{"extended": false})
+
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/errors.go b/vendor/github.com/SevereCloud/vksdk/v2/api/errors.go
new file mode 100644
index 00000000..a852e7d9
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/errors.go
@@ -0,0 +1,927 @@
+package api
+
+import (
+ "errors"
+ "fmt"
+
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// ErrorType is the type of an error.
+type ErrorType int
+
+// Error returns the message of a ErrorType.
+func (e ErrorType) Error() string {
+ return fmt.Sprintf("api: error with code %d", e)
+}
+
+// Error codes. See https://vk.com/dev/errors
+const (
+ ErrNoType ErrorType = 0 // NoType error
+
+ // Unknown error occurred
+ //
+ // Try again later.
+ ErrUnknown ErrorType = 1
+
+ // Application is disabled. Enable your application or use test mode
+ //
+ // You need to switch on the app in Settings
+ // https://vk.com/editapp?id={Your API_ID}
+ // or use the test mode (test_mode=1).
+ ErrDisabled ErrorType = 2
+
+ // Unknown method passed.
+ //
+ // Check the method name: http://vk.com/dev/methods
+ ErrMethod ErrorType = 3
+ ErrSignature ErrorType = 4 // Incorrect signature
+
+ // User authorization failed
+ //
+ // Make sure that you use a correct authorization type.
+ ErrAuth ErrorType = 5
+
+ // Too many requests per second
+ //
+ // Decrease the request frequency or use the execute method.
+ // More details on frequency limits here:
+ // https://vk.com/dev/api_requests
+ ErrTooMany ErrorType = 6
+
+ // Permission to perform this action is denied
+ //
+ // Make sure that your have received required permissions during the
+ // authorization.
+ // You can do it with the account.getAppPermissions method.
+ // https://vk.com/dev/permissions
+ ErrPermission ErrorType = 7
+
+ // Invalid request
+ //
+ // Check the request syntax and used parameters list (it can be found on
+ // a method description page).
+ ErrRequest ErrorType = 8
+
+ // Flood control
+ //
+ // You need to decrease the count of identical requests. For more efficient
+ // work you may use execute.
+ ErrFlood ErrorType = 9
+
+ // Internal server error
+ //
+ // Try again later.
+ ErrServer ErrorType = 10
+
+ // In test mode application should be disabled or user should be authorized
+ //
+ // Switch the app off in Settings:
+ //
+ // https://vk.com/editapp?id={Your API_ID}
+ //
+ ErrEnabledInTest ErrorType = 11
+
+ // Unable to compile code.
+ ErrCompile ErrorType = 12
+
+ // Runtime error occurred during code invocation.
+ ErrRuntime ErrorType = 13
+
+ // Captcha needed.
+ //
+ // See https://vk.com/dev/captcha_error
+ ErrCaptcha ErrorType = 14
+
+ // Access denied
+ //
+ // Make sure that you use correct identifiers and the content is available
+ // for the user in the full version of the site.
+ ErrAccess ErrorType = 15
+
+ // HTTP authorization failed
+ //
+ // To avoid this error check if a user has the 'Use secure connection'
+ // option enabled with the account.getInfo method.
+ ErrAuthHTTPS ErrorType = 16
+
+ // Validation required
+ //
+ // Make sure that you don't use a token received with
+ // http://vk.com/dev/auth_mobile for a request from the server.
+ // It's restricted.
+ //
+ // https://vk.com/dev/need_validation
+ ErrAuthValidation ErrorType = 17
+ ErrUserDeleted ErrorType = 18 // User was deleted or banned
+ ErrBlocked ErrorType = 19 // Content blocked
+
+ // Permission to perform this action is denied for non-standalone
+ // applications.
+ ErrMethodPermission ErrorType = 20
+
+ // Permission to perform this action is allowed only for standalone and
+ // OpenAPI applications.
+ ErrMethodAds ErrorType = 21
+ ErrUpload ErrorType = 22 // Upload error
+
+ // This method was disabled.
+ //
+ // All the methods available now are listed here: http://vk.com/dev/methods
+ ErrMethodDisabled ErrorType = 23
+
+ // Confirmation required
+ //
+ // In some cases VK requires to request action confirmation from the user
+ // (for Standalone apps only).
+ //
+ // Following parameter is transmitted with the error message as well:
+ //
+ // confirmation_text – text of the message to be shown in the default
+ // confirmation window.
+ //
+ // The app should display the default confirmation window
+ // with text from confirmation_text and two buttons: "Continue" and
+ // "Cancel".
+ // If user confirms the action repeat the request with an extra parameter:
+ //
+ // confirm = 1.
+ //
+ // https://vk.com/dev/need_confirmation
+ ErrNeedConfirmation ErrorType = 24
+ ErrNeedTokenConfirmation ErrorType = 25 // Token confirmation required
+ ErrGroupAuth ErrorType = 27 // Group authorization failed
+ ErrAppAuth ErrorType = 28 // Application authorization failed
+
+ // Rate limit reached.
+ //
+ // More details on rate limits here: https://vk.com/dev/data_limits
+ ErrRateLimit ErrorType = 29
+ ErrPrivateProfile ErrorType = 30 // This profile is private
+
+ // Method execution was interrupted due to timeout.
+ ErrExecutionTimeout ErrorType = 36
+
+ // User was banned.
+ ErrUserBanned ErrorType = 37
+
+ // Unknown application.
+ ErrUnknownApplication ErrorType = 38
+
+ // Unknown user.
+ ErrUnknownUser ErrorType = 39
+
+ // Unknown group.
+ ErrUnknownGroup ErrorType = 40
+
+ // One of the parameters specified was missing or invalid
+ //
+ // Check the required parameters list and their format on a method
+ // description page.
+ ErrParam ErrorType = 100
+
+ // Invalid application API ID
+ //
+ // Find the app in the administrated list in settings:
+ // http://vk.com/apps?act=settings
+ // And set the correct API_ID in the request.
+ ErrParamAPIID ErrorType = 101
+ ErrLimits ErrorType = 103 // Out of limits
+ ErrNotFound ErrorType = 104 // Not found
+ ErrSaveFile ErrorType = 105 // Couldn't save file
+ ErrActionFailed ErrorType = 106 // Unable to process action
+
+ // Invalid user id
+ //
+ // Make sure that you use a correct id. You can get an id using a screen
+ // name with the utils.resolveScreenName method.
+ ErrParamUserID ErrorType = 113
+ ErrParamAlbumID ErrorType = 114 // Invalid album id
+ ErrParamServer ErrorType = 118 // Invalid server
+ ErrParamTitle ErrorType = 119 // Invalid title
+ ErrParamPhotos ErrorType = 122 // Invalid photos
+ ErrParamHash ErrorType = 121 // Invalid hash
+ ErrParamPhoto ErrorType = 129 // Invalid photo
+ ErrParamGroupID ErrorType = 125 // Invalid group id
+ ErrParamPageID ErrorType = 140 // Page not found
+ ErrAccessPage ErrorType = 141 // Access to page denied
+
+ // The mobile number of the user is unknown.
+ ErrMobileNotActivated ErrorType = 146
+
+ // Application has insufficient funds.
+ ErrInsufficientFunds ErrorType = 147
+
+ // Access to the menu of the user denied.
+ ErrAccessMenu ErrorType = 148
+
+ // Invalid timestamp
+ //
+ // You may get a correct value with the utils.getServerTime method.
+ ErrParamTimestamp ErrorType = 150
+ ErrFriendsListID ErrorType = 171 // Invalid list id
+
+ // Reached the maximum number of lists.
+ ErrFriendsListLimit ErrorType = 173
+
+ // Cannot add user himself as friend.
+ ErrFriendsAddYourself ErrorType = 174
+
+ // Cannot add this user to friends as they have put you on their blacklist.
+ ErrFriendsAddInEnemy ErrorType = 175
+
+ // Cannot add this user to friends as you put him on blacklist.
+ ErrFriendsAddEnemy ErrorType = 176
+
+ // Cannot add this user to friends as user not found.
+ ErrFriendsAddNotFound ErrorType = 177
+ ErrParamNoteID ErrorType = 180 // Note not found
+ ErrAccessNote ErrorType = 181 // Access to note denied
+ ErrAccessNoteComment ErrorType = 182 // You can't comment this note
+ ErrAccessComment ErrorType = 183 // Access to comment denied
+
+ // Access to album denied
+ //
+ // Make sure you use correct ids (owner_id is always positive for users,
+ // negative for communities) and the current user has access to the
+ // requested content in the full version of the site.
+ ErrAccessAlbum ErrorType = 200
+
+ // Access to audio denied
+ //
+ // Make sure you use correct ids (owner_id is always positive for users,
+ // negative for communities) and the current user has access to the
+ // requested content in the full version of the site.
+ ErrAccessAudio ErrorType = 201
+
+ // Access to group denied
+ //
+ // Make sure that the current user is a member or admin of the community
+ // (for closed and private groups and events).
+ ErrAccessGroup ErrorType = 203
+
+ // Access denied.
+ ErrAccessVideo ErrorType = 204
+
+ // Access denied.
+ ErrAccessMarket ErrorType = 205
+
+ // Access to wall's post denied.
+ ErrWallAccessPost ErrorType = 210
+
+ // Access to wall's comment denied.
+ ErrWallAccessComment ErrorType = 211
+
+ // Access to post comments denied.
+ ErrWallAccessReplies ErrorType = 212
+
+ // Access to status replies denied.
+ ErrWallAccessAddReply ErrorType = 213
+
+ // Access to adding post denied.
+ ErrWallAddPost ErrorType = 214
+
+ // Advertisement post was recently added.
+ ErrWallAdsPublished ErrorType = 219
+
+ // Too many recipients.
+ ErrWallTooManyRecipients ErrorType = 220
+
+ // User disabled track name broadcast.
+ ErrStatusNoAudio ErrorType = 221
+
+ // Hyperlinks are forbidden.
+ ErrWallLinksForbidden ErrorType = 222
+
+ // Too many replies.
+ ErrWallReplyOwnerFlood ErrorType = 223
+
+ // Too many ads posts.
+ ErrWallAdsPostLimitReached ErrorType = 224
+
+ // Donut is disabled.
+ ErrDonutDisabled ErrorType = 225
+
+ // Reaction can not be applied to the object.
+ ErrLikesReactionCanNotBeApplied ErrorType = 232
+
+ // Access to poll denied.
+ ErrPollsAccess ErrorType = 250
+
+ // Invalid answer id.
+ ErrPollsAnswerID ErrorType = 252
+
+ // Invalid poll id.
+ ErrPollsPollID ErrorType = 251
+
+ // Access denied, please vote first.
+ ErrPollsAccessWithoutVote ErrorType = 253
+
+ // Access to the groups list is denied due to the user's privacy settings.
+ ErrAccessGroups ErrorType = 260
+
+ // This album is full
+ //
+ // You need to delete the odd objects from the album or use another album.
+ ErrAlbumFull ErrorType = 300
+ ErrAlbumsLimit ErrorType = 302 // Albums number limit is reached
+
+ // Permission denied. You must enable votes processing in application
+ // settings
+ //
+ // Check the app settings:
+ //
+ // http://vk.com/editapp?id={Your API_ID}&section=payments
+ //
+ ErrVotesPermission ErrorType = 500
+
+ // Not enough votes.
+ ErrVotes ErrorType = 503
+
+ // Not enough money on owner's balance.
+ ErrNotEnoughMoney ErrorType = 504
+
+ // Permission denied. You have no access to operations specified with
+ // given object(s).
+ ErrAdsPermission ErrorType = 600
+
+ // Permission denied. You have requested too many actions this day. Try
+ // later.
+ ErrWeightedFlood ErrorType = 601
+
+ // Some part of the request has not been completed.
+ ErrAdsPartialSuccess ErrorType = 602
+
+ // Some ads error occurred.
+ ErrAdsSpecific ErrorType = 603
+
+ // Invalid domain.
+ ErrAdsDomainInvalid ErrorType = 604
+
+ // Domain is forbidden.
+ ErrAdsDomainForbidden ErrorType = 605
+
+ // Domain is reserved.
+ ErrAdsDomainReserved ErrorType = 606
+
+ // Domain is occupied.
+ ErrAdsDomainOccupied ErrorType = 607
+
+ // Domain is active.
+ ErrAdsDomainActive ErrorType = 608
+
+ // Domain app is invalid.
+ ErrAdsDomainAppInvalid ErrorType = 609
+
+ // Domain app is forbidden.
+ ErrAdsDomainAppForbidden ErrorType = 610
+
+ // Application must be verified.
+ ErrAdsApplicationMustBeVerified ErrorType = 611
+
+ // Application must be in domains list of site of ad unit.
+ ErrAdsApplicationMustBeInDomainsList ErrorType = 612
+
+ // Application is blocked.
+ ErrAdsApplicationBlocked ErrorType = 613
+
+ // Domain of type specified is forbidden in current office type.
+ ErrAdsDomainTypeForbiddenInCurrentOffice ErrorType = 614
+
+ // Domain group is invalid.
+ ErrAdsDomainGroupInvalid ErrorType = 615
+
+ // Domain group is forbidden.
+ ErrAdsDomainGroupForbidden ErrorType = 616
+
+ // Domain app is blocked.
+ ErrAdsDomainAppBlocked ErrorType = 617
+
+ // Domain group is not open.
+ ErrAdsDomainGroupNotOpen ErrorType = 618
+
+ // Domain group is not possible to be joined to adsweb.
+ ErrAdsDomainGroupNotPossibleJoined ErrorType = 619
+
+ // Domain group is blocked.
+ ErrAdsDomainGroupBlocked ErrorType = 620
+
+ // Domain group has restriction: links are forbidden.
+ ErrAdsDomainGroupLinksForbidden ErrorType = 621
+
+ // Domain group has restriction: excluded from search.
+ ErrAdsDomainGroupExcludedFromSearch ErrorType = 622
+
+ // Domain group has restriction: cover is forbidden.
+ ErrAdsDomainGroupCoverForbidden ErrorType = 623
+
+ // Domain group has wrong category.
+ ErrAdsDomainGroupWrongCategory ErrorType = 624
+
+ // Domain group has wrong name.
+ ErrAdsDomainGroupWrongName ErrorType = 625
+
+ // Domain group has low posts reach.
+ ErrAdsDomainGroupLowPostsReach ErrorType = 626
+
+ // Domain group has wrong class.
+ ErrAdsDomainGroupWrongClass ErrorType = 627
+
+ // Domain group is created recently.
+ ErrAdsDomainGroupCreatedRecently ErrorType = 628
+
+ // Object deleted.
+ ErrAdsObjectDeleted ErrorType = 629
+
+ // Lookalike request with same source already in progress.
+ ErrAdsLookalikeRequestAlreadyInProgress ErrorType = 630
+
+ // Max count of lookalike requests per day reached.
+ ErrAdsLookalikeRequestsLimit ErrorType = 631
+
+ // Given audience is too small.
+ ErrAdsAudienceTooSmall ErrorType = 632
+
+ // Given audience is too large.
+ ErrAdsAudienceTooLarge ErrorType = 633
+
+ // Lookalike request audience save already in progress.
+ ErrAdsLookalikeAudienceSaveAlreadyInProgress ErrorType = 634
+
+ // Max count of lookalike request audience saves per day reached.
+ ErrAdsLookalikeSavesLimit ErrorType = 635
+
+ // Max count of retargeting groups reached.
+ ErrAdsRetargetingGroupsLimit ErrorType = 636
+
+ // Domain group has active nemesis punishment.
+ ErrAdsDomainGroupActiveNemesisPunishment ErrorType = 637
+
+ // Cannot edit creator role.
+ ErrGroupChangeCreator ErrorType = 700
+
+ // User should be in club.
+ ErrGroupNotInClub ErrorType = 701
+
+ // Too many officers in club.
+ ErrGroupTooManyOfficers ErrorType = 702
+
+ // You need to enable 2FA for this action.
+ ErrGroupNeed2fa ErrorType = 703
+
+ // User needs to enable 2FA for this action.
+ ErrGroupHostNeed2fa ErrorType = 704
+
+ // Too many addresses in club.
+ ErrGroupTooManyAddresses ErrorType = 706
+
+ // "Application is not installed in community.
+ ErrGroupAppIsNotInstalledInCommunity ErrorType = 711
+
+ // Invite link is invalid - expired, deleted or not exists.
+ ErrGroupInvalidInviteLink ErrorType = 714
+
+ // This video is already added.
+ ErrVideoAlreadyAdded ErrorType = 800
+
+ // Comments for this video are closed.
+ ErrVideoCommentsClosed ErrorType = 801
+
+ // Can't send messages for users from blacklist.
+ ErrMessagesUserBlocked ErrorType = 900
+
+ // Can't send messages for users without permission.
+ ErrMessagesDenySend ErrorType = 901
+
+ // Can't send messages to this user due to their privacy settings.
+ ErrMessagesPrivacy ErrorType = 902
+
+ // Value of ts or pts is too old.
+ ErrMessagesTooOldPts ErrorType = 907
+
+ // Value of ts or pts is too new.
+ ErrMessagesTooNewPts ErrorType = 908
+
+ // Can't edit this message, because it's too old.
+ ErrMessagesEditExpired ErrorType = 909
+
+ // Can't sent this message, because it's too big.
+ ErrMessagesTooBig ErrorType = 910
+
+ // Keyboard format is invalid.
+ ErrMessagesKeyboardInvalid ErrorType = 911
+
+ // This is a chat bot feature, change this status in settings.
+ ErrMessagesChatBotFeature ErrorType = 912
+
+ // Too many forwarded messages.
+ ErrMessagesTooLongForwards ErrorType = 913
+
+ // Message is too long.
+ ErrMessagesTooLongMessage ErrorType = 914
+
+ // You don't have access to this chat.
+ ErrMessagesChatUserNoAccess ErrorType = 917
+
+ // You can't see invite link for this chat.
+ ErrMessagesCantSeeInviteLink ErrorType = 919
+
+ // Can't edit this kind of message.
+ ErrMessagesEditKindDisallowed ErrorType = 920
+
+ // Can't forward these messages.
+ ErrMessagesCantFwd ErrorType = 921
+
+ // Can't delete this message for everybody.
+ ErrMessagesCantDeleteForAll ErrorType = 924
+
+ // You are not admin of this chat.
+ ErrMessagesChatNotAdmin ErrorType = 925
+
+ // Chat does not exist.
+ ErrMessagesChatNotExist ErrorType = 927
+
+ // You can't change invite link for this chat.
+ ErrMessagesCantChangeInviteLink ErrorType = 931
+
+ // Your community can't interact with this peer.
+ ErrMessagesGroupPeerAccess ErrorType = 932
+
+ // User not found in chat.
+ ErrMessagesChatUserNotInChat ErrorType = 935
+
+ // Contact not found.
+ ErrMessagesContactNotFound ErrorType = 936
+
+ // Message request already send.
+ ErrMessagesMessageRequestAlreadySend ErrorType = 939
+
+ // Too many posts in messages.
+ ErrMessagesTooManyPosts ErrorType = 940
+
+ // Cannot pin one-time story.
+ ErrMessagesCantPinOneTimeStory ErrorType = 942
+
+ // Cannot use this intent.
+ ErrMessagesCantUseIntent ErrorType = 943
+
+ // Limits overflow for this intent.
+ ErrMessagesLimitIntent ErrorType = 944
+
+ // Chat was disabled.
+ ErrMessagesChatDisabled ErrorType = 945
+
+ // Chat not support.
+ ErrMessagesChatNotSupported ErrorType = 946
+
+ // Can't add user to chat, because user has no access to group.
+ ErrMessagesMemberAccessToGroupDenied ErrorType = 947
+
+ // Can't edit pinned message yet.
+ ErrMessagesEditPinned ErrorType = 949
+
+ // Can't send message, reply timed out.
+ ErrMessagesReplyTimedOut ErrorType = 950
+
+ // Invalid phone number.
+ ErrParamPhone ErrorType = 1000
+
+ // This phone number is used by another user.
+ ErrPhoneAlreadyUsed ErrorType = 1004
+
+ // Too many auth attempts, try again later.
+ ErrAuthFloodError ErrorType = 1105
+
+ // Processing.. Try later.
+ ErrAuthDelay ErrorType = 1112
+
+ // Invalid document id.
+ ErrParamDocID ErrorType = 1150
+
+ // Access to document deleting is denied.
+ ErrParamDocDeleteAccess ErrorType = 1151
+
+ // Invalid document title.
+ ErrParamDocTitle ErrorType = 1152
+
+ // Access to document is denied.
+ ErrParamDocAccess ErrorType = 1153
+
+ // Original photo was changed.
+ ErrPhotoChanged ErrorType = 1160
+
+ // Too many feed lists.
+ ErrTooManyLists ErrorType = 1170
+
+ // This achievement is already unlocked.
+ ErrAppsAlreadyUnlocked ErrorType = 1251
+
+ // Subscription not found.
+ ErrAppsSubscriptionNotFound ErrorType = 1256
+
+ // Subscription is in invalid status.
+ ErrAppsSubscriptionInvalidStatus ErrorType = 1257
+
+ // Invalid screen name.
+ ErrInvalidAddress ErrorType = 1260
+
+ // Catalog is not available for this user.
+ ErrCommunitiesCatalogDisabled ErrorType = 1310
+
+ // Catalog categories are not available for this user.
+ ErrCommunitiesCategoriesDisabled ErrorType = 1311
+
+ // Too late for restore.
+ ErrMarketRestoreTooLate ErrorType = 1400
+
+ // Comments for this market are closed.
+ ErrMarketCommentsClosed ErrorType = 1401
+
+ // Album not found.
+ ErrMarketAlbumNotFound ErrorType = 1402
+
+ // Item not found.
+ ErrMarketItemNotFound ErrorType = 1403
+
+ // Item already added to album.
+ ErrMarketItemAlreadyAdded ErrorType = 1404
+
+ // Too many items.
+ ErrMarketTooManyItems ErrorType = 1405
+
+ // Too many items in album.
+ ErrMarketTooManyItemsInAlbum ErrorType = 1406
+
+ // Too many albums.
+ ErrMarketTooManyAlbums ErrorType = 1407
+
+ // Item has bad links in description.
+ ErrMarketItemHasBadLinks ErrorType = 1408
+
+ // Shop not enabled.
+ ErrMarketShopNotEnabled ErrorType = 1409
+
+ // Variant not found.
+ ErrMarketVariantNotFound ErrorType = 1416
+
+ // Property not found.
+ ErrMarketPropertyNotFound ErrorType = 1417
+
+ // Grouping must have two or more items.
+ ErrMarketGroupingMustContainMoreThanOneItem ErrorType = 1425
+
+ // Item must have distinct properties.
+ ErrMarketGroupingItemsMustHaveDistinctProperties ErrorType = 1426
+
+ // Cart is empty.
+ ErrMarketOrdersNoCartItems ErrorType = 1427
+
+ // Specify width, length, height and weight all together.
+ ErrMarketInvalidDimensions ErrorType = 1429
+
+ // VK Pay status can not be changed.
+ ErrMarketCantChangeVkpayStatus ErrorType = 1430
+
+ // Market was already enabled in this group.
+ ErrMarketShopAlreadyEnabled ErrorType = 1431
+
+ // Market was already disabled in this group.
+ ErrMarketShopAlreadyDisabled ErrorType = 1432
+
+ // Invalid image crop format.
+ ErrMarketPhotosCropInvalidFormat ErrorType = 1433
+
+ // Crop bottom right corner is outside of the image.
+ ErrMarketPhotosCropOverflow ErrorType = 1434
+
+ // Crop size is less than the minimum.
+ ErrMarketPhotosCropSizeTooLow ErrorType = 1435
+
+ // Cart is empty.
+ ErrMarketCartEmpty ErrorType = 1427
+
+ // Specify width, length, height and weight all together.
+ ErrMarketSpecifyDimensions ErrorType = 1429
+
+ // VK Pay status can not be changed.
+ ErrVKPayStatus ErrorType = 1430
+
+ // Market was already enabled in this group.
+ ErrMarketAlreadyEnabled ErrorType = 1431
+
+ // Market was already disabled in this group.
+ ErrMarketAlreadyDisabled ErrorType = 1432
+
+ // Story has already expired.
+ ErrStoryExpired ErrorType = 1600
+
+ // Incorrect reply privacy.
+ ErrStoryIncorrectReplyPrivacy ErrorType = 1602
+
+ // Card not found.
+ ErrPrettyCardsCardNotFound ErrorType = 1900
+
+ // Too many cards.
+ ErrPrettyCardsTooManyCards ErrorType = 1901
+
+ // Card is connected to post.
+ ErrPrettyCardsCardIsConnectedToPost ErrorType = 1902
+
+ // Servers number limit is reached.
+ ErrCallbackServersLimit ErrorType = 2000
+
+ // Specified link is incorrect (can't find source).
+ ErrWallCheckLinkCantDetermineSource ErrorType = 3102
+
+ // Recaptcha needed.
+ ErrRecaptcha ErrorType = 3300
+
+ // Phone validation needed.
+ ErrPhoneValidation ErrorType = 3301
+
+ // Password validation needed.
+ ErrPasswordValidation ErrorType = 3302
+
+ // Otp app validation needed.
+ ErrOtpAppValidation ErrorType = 3303
+
+ // Email confirmation needed.
+ ErrEmailConfirmation ErrorType = 3304
+
+ // Assert votes.
+ ErrAssertVotes ErrorType = 3305
+
+ // Token extension required.
+ ErrTokenExtension ErrorType = 3609
+
+ // User is deactivated.
+ ErrUserDeactivated ErrorType = 3610
+
+ // Service is deactivated for user.
+ ErrServiceDeactivated ErrorType = 3611
+
+ // Can't set AliExpress tag to this type of object.
+ ErrAliExpressTag ErrorType = 3800
+)
+
+// ErrorSubtype is the subtype of an error.
+type ErrorSubtype int
+
+// Error returns the message of a ErrorSubtype.
+func (e ErrorSubtype) Error() string {
+ return fmt.Sprintf("api: error with subcode %d", e)
+}
+
+// Error struct VK.
+type Error struct {
+ Code ErrorType `json:"error_code"`
+ Subcode ErrorSubtype `json:"error_subcode"`
+ Message string `json:"error_msg"`
+ Text string `json:"error_text"`
+ CaptchaSID string `json:"captcha_sid"`
+ CaptchaImg string `json:"captcha_img"`
+
+ // In some cases VK requires to request action confirmation from the user
+ // (for Standalone apps only). Following error will be returned:
+ //
+ // Error code: 24
+ // Error text: Confirmation required
+ //
+ // Following parameter is transmitted with the error message as well:
+ //
+ // confirmation_text – text of the message to be shown in the default
+ // confirmation window.
+ //
+ // The app should display the default confirmation window with text from
+ // confirmation_text and two buttons: "Continue" and "Cancel". If user
+ // confirms the action repeat the request with an extra parameter:
+ // confirm = 1.
+ //
+ // See https://vk.com/dev/need_confirmation
+ ConfirmationText string `json:"confirmation_text"`
+
+ // In some cases VK requires a user validation procedure. . As a result
+ // starting from API version 5.0 (for the older versions captcha_error
+ // will be requested) following error will be returned as a reply to any
+ // API request:
+ //
+ // Error code: 17
+ // Error text: Validation Required
+ //
+ // Following parameter is transmitted with an error message:
+ // redirect_uri – a special address to open in a browser to pass the
+ // validation procedure.
+ //
+ // After passing the validation a user will be redirected to the service
+ // page:
+ //
+ // https://oauth.vk.com/blank.html#{Data required for validation}
+ //
+ // In case of successful validation following parameters will be
+ // transmitted after #:
+ //
+ // https://oauth.vk.com/blank.html#success=1&access_token={NEW USER TOKEN}&user_id={USER ID}
+ //
+ // If a token was not received by https a new secret will be transmitted
+ // as well.
+ //
+ // In case of unsuccessful validation following address is transmitted:
+ //
+ // https://oauth.vk.com/blank.html#fail=1
+ //
+ // See https://vk.com/dev/need_validation
+ RedirectURI string `json:"redirect_uri"`
+ RequestParams []object.BaseRequestParam `json:"request_params"`
+}
+
+// Error returns the message of a Error.
+func (e Error) Error() string {
+ return "api: " + e.Message
+}
+
+// Is unwraps its first argument sequentially looking for an error that matches
+// the second.
+func (e Error) Is(target error) bool {
+ var tError *Error
+ if errors.As(target, &tError) {
+ return e.Code == tError.Code && e.Message == tError.Message
+ }
+
+ var tErrorType ErrorType
+ if errors.As(target, &tErrorType) {
+ return e.Code == tErrorType
+ }
+
+ return false
+}
+
+// ExecuteError struct.
+//
+// TODO: v3 Code is ErrorType.
+type ExecuteError struct {
+ Method string `json:"method"`
+ Code int `json:"error_code"`
+ Msg string `json:"error_msg"`
+}
+
+// ExecuteErrors type.
+type ExecuteErrors []ExecuteError
+
+// Error returns the message of a ExecuteErrors.
+func (e ExecuteErrors) Error() string {
+ return fmt.Sprintf("api: execute errors (%d)", len(e))
+}
+
+// InvalidContentType type.
+type InvalidContentType struct {
+ ContentType string
+}
+
+// Error returns the message of a InvalidContentType.
+func (e InvalidContentType) Error() string {
+ return "api: invalid content-type"
+}
+
+// UploadError type.
+type UploadError struct {
+ Err string `json:"error"`
+ Code int `json:"error_code"`
+ Descr string `json:"error_descr"`
+ IsLogged bool `json:"error_is_logged"`
+}
+
+// Error returns the message of a UploadError.
+func (e UploadError) Error() string {
+ if e.Err != "" {
+ return "api: " + e.Err
+ }
+
+ return fmt.Sprintf("api: upload code %d", e.Code)
+}
+
+// AdsError struct.
+type AdsError struct {
+ Code ErrorType `json:"error_code"`
+ Desc string `json:"error_desc"`
+}
+
+// Error returns the message of a AdsError.
+func (e AdsError) Error() string {
+ return "api: " + e.Desc
+}
+
+// Is unwraps its first argument sequentially looking for an error that matches
+// the second.
+func (e AdsError) Is(target error) bool {
+ var tAdsError *AdsError
+ if errors.As(target, &tAdsError) {
+ return e.Code == tAdsError.Code && e.Desc == tAdsError.Desc
+ }
+
+ var tErrorType ErrorType
+ if errors.As(target, &tErrorType) {
+ return e.Code == tErrorType
+ }
+
+ return false
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/execute.go b/vendor/github.com/SevereCloud/vksdk/v2/api/execute.go
new file mode 100644
index 00000000..5bee205a
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/execute.go
@@ -0,0 +1,52 @@
+package api
+
+import "encoding/json"
+
+// ExecuteWithArgs a universal method for calling a sequence of other methods
+// while saving and filtering interim results.
+//
+// The Args map variable allows you to retrieve the parameters passed during
+// the request and avoids code formatting.
+//
+// return Args.code; // return parameter "code"
+// return Args.v; // return parameter "v"
+//
+// https://vk.com/dev/execute
+func (vk *VK) ExecuteWithArgs(code string, params Params, obj interface{}) error {
+ token := vk.getToken()
+
+ reqParams := Params{
+ "code": code,
+ "access_token": token,
+ "v": vk.Version,
+ }
+
+ resp, err := vk.Handler("execute", params, reqParams)
+
+ jsonErr := json.Unmarshal(resp.Response, &obj)
+ if jsonErr != nil {
+ return jsonErr
+ }
+
+ if resp.ExecuteErrors != nil {
+ return &resp.ExecuteErrors
+ }
+
+ return err
+}
+
+// Execute a universal method for calling a sequence of other methods while
+// saving and filtering interim results.
+//
+// https://vk.com/dev/execute
+func (vk *VK) Execute(code string, obj interface{}) error {
+ return vk.ExecuteWithArgs(code, Params{}, obj)
+}
+
+func fmtBool(value bool) string {
+ if value {
+ return "1"
+ }
+
+ return "0"
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/fave.go b/vendor/github.com/SevereCloud/vksdk/v2/api/fave.go
new file mode 100644
index 00000000..5690aab8
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/fave.go
@@ -0,0 +1,231 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// FaveAddArticle adds a link to user faves.
+//
+// https://vk.com/dev/fave.addArticle
+func (vk *VK) FaveAddArticle(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.addArticle", &response, params)
+ return
+}
+
+// FaveAddLink adds a link to user faves.
+//
+// https://vk.com/dev/fave.addLink
+func (vk *VK) FaveAddLink(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.addLink", &response, params)
+ return
+}
+
+// FaveAddPage method.
+//
+// https://vk.com/dev/fave.addPage
+func (vk *VK) FaveAddPage(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.addPage", &response, params)
+ return
+}
+
+// FaveAddPost method.
+//
+// https://vk.com/dev/fave.addPost
+func (vk *VK) FaveAddPost(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.addPost", &response, params)
+ return
+}
+
+// FaveAddProduct method.
+//
+// https://vk.com/dev/fave.addProduct
+func (vk *VK) FaveAddProduct(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.addProduct", &response, params)
+ return
+}
+
+// FaveAddTagResponse struct.
+type FaveAddTagResponse object.FaveTag
+
+// FaveAddTag method.
+//
+// https://vk.com/dev/fave.addTag
+func (vk *VK) FaveAddTag(params Params) (response FaveAddTagResponse, err error) {
+ err = vk.RequestUnmarshal("fave.addTag", &response, params)
+ return
+}
+
+// FaveAddVideo method.
+//
+// https://vk.com/dev/fave.addVideo
+func (vk *VK) FaveAddVideo(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.addVideo", &response, params)
+ return
+}
+
+// FaveEditTag method.
+//
+// https://vk.com/dev/fave.editTag
+func (vk *VK) FaveEditTag(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.editTag", &response, params)
+ return
+}
+
+// FaveGetResponse struct.
+type FaveGetResponse struct {
+ Count int `json:"count"`
+ Items []object.FaveItem `json:"items"`
+}
+
+// FaveGet method.
+//
+// extended=0
+//
+// https://vk.com/dev/fave.get
+func (vk *VK) FaveGet(params Params) (response FaveGetResponse, err error) {
+ err = vk.RequestUnmarshal("fave.get", &response, params, Params{"extended": false})
+
+ return
+}
+
+// FaveGetExtendedResponse struct.
+type FaveGetExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.FaveItem `json:"items"`
+ object.ExtendedResponse
+}
+
+// FaveGetExtended method.
+//
+// extended=1
+//
+// https://vk.com/dev/fave.get
+func (vk *VK) FaveGetExtended(params Params) (response FaveGetExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("fave.get", &response, params, Params{"extended": true})
+
+ return
+}
+
+// FaveGetPagesResponse struct.
+type FaveGetPagesResponse struct {
+ Count int `json:"count"`
+ Items []object.FavePage `json:"items"`
+}
+
+// FaveGetPages method.
+//
+// https://vk.com/dev/fave.getPages
+func (vk *VK) FaveGetPages(params Params) (response FaveGetPagesResponse, err error) {
+ err = vk.RequestUnmarshal("fave.getPages", &response, params)
+ return
+}
+
+// FaveGetTagsResponse struct.
+type FaveGetTagsResponse struct {
+ Count int `json:"count"`
+ Items []object.FaveTag `json:"items"`
+}
+
+// FaveGetTags method.
+//
+// https://vk.com/dev/fave.getTags
+func (vk *VK) FaveGetTags(params Params) (response FaveGetTagsResponse, err error) {
+ err = vk.RequestUnmarshal("fave.getTags", &response, params)
+ return
+}
+
+// FaveMarkSeen method.
+//
+// https://vk.com/dev/fave.markSeen
+func (vk *VK) FaveMarkSeen(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.markSeen", &response, params)
+ return
+}
+
+// FaveRemoveArticle method.
+//
+// https://vk.com/dev/fave.removeArticle
+func (vk *VK) FaveRemoveArticle(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.removeArticle", &response, params)
+ return
+}
+
+// FaveRemoveLink removes link from the user's faves.
+//
+// https://vk.com/dev/fave.removeLink
+func (vk *VK) FaveRemoveLink(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.removeLink", &response, params)
+ return
+}
+
+// FaveRemovePage method.
+//
+// https://vk.com/dev/fave.removePage
+func (vk *VK) FaveRemovePage(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.removePage", &response, params)
+ return
+}
+
+// FaveRemovePost method.
+//
+// https://vk.com/dev/fave.removePost
+func (vk *VK) FaveRemovePost(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.removePost", &response, params)
+ return
+}
+
+// FaveRemoveProduct method.
+//
+// https://vk.com/dev/fave.removeProduct
+func (vk *VK) FaveRemoveProduct(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.removeProduct", &response, params)
+ return
+}
+
+// FaveRemoveTag method.
+//
+// https://vk.com/dev/fave.removeTag
+func (vk *VK) FaveRemoveTag(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.removeTag", &response, params)
+ return
+}
+
+// FaveRemoveVideo method.
+//
+// https://vk.com/dev/fave.removeVideo
+func (vk *VK) FaveRemoveVideo(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.removeVideo", &response, params)
+ return
+}
+
+// FaveReorderTags method.
+//
+// https://vk.com/dev/fave.reorderTags
+func (vk *VK) FaveReorderTags(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.reorderTags", &response, params)
+ return
+}
+
+// FaveSetPageTags method.
+//
+// https://vk.com/dev/fave.setPageTags
+func (vk *VK) FaveSetPageTags(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.setPageTags", &response, params)
+ return
+}
+
+// FaveSetTags method.
+//
+// https://vk.com/dev/fave.setTags
+func (vk *VK) FaveSetTags(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.setTags", &response, params)
+ return
+}
+
+// FaveTrackPageInteraction method.
+//
+// https://vk.com/dev/fave.trackPageInteraction
+func (vk *VK) FaveTrackPageInteraction(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("fave.trackPageInteraction", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/friends.go b/vendor/github.com/SevereCloud/vksdk/v2/api/friends.go
new file mode 100644
index 00000000..07cfc7d7
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/friends.go
@@ -0,0 +1,295 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// FriendsAdd approves or creates a friend request.
+//
+// https://vk.com/dev/friends.add
+func (vk *VK) FriendsAdd(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("friends.add", &response, params)
+ return
+}
+
+// FriendsAddListResponse struct.
+type FriendsAddListResponse struct {
+ ListID int `json:"list_id"`
+}
+
+// FriendsAddList creates a new friend list for the current user.
+//
+// https://vk.com/dev/friends.addList
+func (vk *VK) FriendsAddList(params Params) (response FriendsAddListResponse, err error) {
+ err = vk.RequestUnmarshal("friends.addList", &response, params)
+ return
+}
+
+// FriendsAreFriendsResponse struct.
+type FriendsAreFriendsResponse []object.FriendsFriendStatus
+
+// FriendsAreFriends checks the current user's friendship status with other specified users.
+//
+// https://vk.com/dev/friends.areFriends
+func (vk *VK) FriendsAreFriends(params Params) (response FriendsAreFriendsResponse, err error) {
+ err = vk.RequestUnmarshal("friends.areFriends", &response, params)
+ return
+}
+
+// FriendsDeleteResponse struct.
+type FriendsDeleteResponse struct {
+ Success object.BaseBoolInt `json:"success"`
+ FriendDeleted object.BaseBoolInt `json:"friend_deleted"`
+ OutRequestDeleted object.BaseBoolInt `json:"out_request_deleted"`
+ InRequestDeleted object.BaseBoolInt `json:"in_request_deleted"`
+ SuggestionDeleted object.BaseBoolInt `json:"suggestion_deleted"`
+}
+
+// FriendsDelete declines a friend request or deletes a user from the current user's friend list.
+//
+// https://vk.com/dev/friends.delete
+func (vk *VK) FriendsDelete(params Params) (response FriendsDeleteResponse, err error) {
+ err = vk.RequestUnmarshal("friends.delete", &response, params)
+ return
+}
+
+// FriendsDeleteAllRequests marks all incoming friend requests as viewed.
+//
+// https://vk.com/dev/friends.deleteAllRequests
+func (vk *VK) FriendsDeleteAllRequests(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("friends.deleteAllRequests", &response, params)
+ return
+}
+
+// FriendsDeleteList deletes a friend list of the current user.
+//
+// https://vk.com/dev/friends.deleteList
+func (vk *VK) FriendsDeleteList(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("friends.deleteList", &response, params)
+ return
+}
+
+// FriendsEdit edits the friend lists of the selected user.
+//
+// https://vk.com/dev/friends.edit
+func (vk *VK) FriendsEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("friends.edit", &response, params)
+ return
+}
+
+// FriendsEditList edits a friend list of the current user.
+//
+// https://vk.com/dev/friends.editList
+func (vk *VK) FriendsEditList(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("friends.editList", &response, params)
+ return
+}
+
+// FriendsGetResponse struct.
+type FriendsGetResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// FriendsGet returns a list of user IDs or detailed information about a user's friends.
+//
+// https://vk.com/dev/friends.get
+func (vk *VK) FriendsGet(params Params) (response FriendsGetResponse, err error) {
+ err = vk.RequestUnmarshal("friends.get", &response, params)
+ return
+}
+
+// FriendsGetFieldsResponse struct.
+type FriendsGetFieldsResponse struct {
+ Count int `json:"count"`
+ Items []object.FriendsUserXtrLists `json:"items"`
+}
+
+// FriendsGetFields returns a list of user IDs or detailed information about a user's friends.
+//
+// https://vk.com/dev/friends.get
+func (vk *VK) FriendsGetFields(params Params) (response FriendsGetFieldsResponse, err error) {
+ reqParams := make(Params)
+ if v, prs := params["fields"]; v == "" || !prs {
+ reqParams["fields"] = "id"
+ }
+
+ err = vk.RequestUnmarshal("friends.get", &response, params, reqParams)
+
+ return
+}
+
+// FriendsGetAppUsersResponse struct.
+type FriendsGetAppUsersResponse []int
+
+// FriendsGetAppUsers returns a list of IDs of the current user's friends who installed the application.
+//
+// https://vk.com/dev/friends.getAppUsers
+func (vk *VK) FriendsGetAppUsers(params Params) (response FriendsGetAppUsersResponse, err error) {
+ err = vk.RequestUnmarshal("friends.getAppUsers", &response, params)
+ return
+}
+
+// FriendsGetByPhonesResponse struct.
+type FriendsGetByPhonesResponse []object.FriendsUserXtrPhone
+
+// FriendsGetByPhones returns a list of the current user's friends
+// whose phone numbers, validated or specified in a profile, are in a given list.
+//
+// https://vk.com/dev/friends.getByPhones
+func (vk *VK) FriendsGetByPhones(params Params) (response FriendsGetByPhonesResponse, err error) {
+ err = vk.RequestUnmarshal("friends.getByPhones", &response, params)
+ return
+}
+
+// FriendsGetListsResponse struct.
+type FriendsGetListsResponse struct {
+ Count int `json:"count"`
+ Items []object.FriendsFriendsList `json:"items"`
+}
+
+// FriendsGetLists returns a list of the user's friend lists.
+//
+// https://vk.com/dev/friends.getLists
+func (vk *VK) FriendsGetLists(params Params) (response FriendsGetListsResponse, err error) {
+ err = vk.RequestUnmarshal("friends.getLists", &response, params)
+ return
+}
+
+// FriendsGetMutualResponse struct.
+type FriendsGetMutualResponse []int
+
+// FriendsGetMutual returns a list of user IDs of the mutual friends of two users.
+//
+// https://vk.com/dev/friends.getMutual
+func (vk *VK) FriendsGetMutual(params Params) (response FriendsGetMutualResponse, err error) {
+ err = vk.RequestUnmarshal("friends.getMutual", &response, params)
+ return
+}
+
+// FriendsGetOnline returns a list of user IDs of a user's friends who are online.
+//
+// online_mobile=0
+//
+// https://vk.com/dev/friends.getOnline
+func (vk *VK) FriendsGetOnline(params Params) (response []int, err error) {
+ err = vk.RequestUnmarshal("friends.getOnline", &response, params, Params{"online_mobile": false})
+
+ return
+}
+
+// FriendsGetOnlineOnlineMobileResponse struct.
+type FriendsGetOnlineOnlineMobileResponse struct {
+ Online []int `json:"online"`
+ OnlineMobile []int `json:"online_mobile"`
+}
+
+// FriendsGetOnlineOnlineMobile returns a list of user IDs of a user's friends who are online.
+//
+// online_mobile=1
+//
+// https://vk.com/dev/friends.getOnline
+func (vk *VK) FriendsGetOnlineOnlineMobile(params Params) (response FriendsGetOnlineOnlineMobileResponse, err error) {
+ err = vk.RequestUnmarshal("friends.getOnline", &response, params, Params{"online_mobile": true})
+
+ return
+}
+
+// FriendsGetRecentResponse struct.
+type FriendsGetRecentResponse []int
+
+// FriendsGetRecent returns a list of user IDs of the current user's recently added friends.
+//
+// https://vk.com/dev/friends.getRecent
+func (vk *VK) FriendsGetRecent(params Params) (response FriendsGetRecentResponse, err error) {
+ err = vk.RequestUnmarshal("friends.getRecent", &response, params)
+ return
+}
+
+// FriendsGetRequestsResponse struct.
+type FriendsGetRequestsResponse struct {
+ Count int `json:"count"` // Total requests number
+ Items []int `json:"items"`
+}
+
+// FriendsGetRequests returns information about the current user's incoming and outgoing friend requests.
+//
+// https://vk.com/dev/friends.getRequests
+func (vk *VK) FriendsGetRequests(params Params) (response FriendsGetRequestsResponse, err error) {
+ reqParams := Params{
+ "need_mutual": false,
+ "extended": false,
+ }
+
+ err = vk.RequestUnmarshal("friends.getRequests", &response, params, reqParams)
+
+ return
+}
+
+// FriendsGetRequestsNeedMutualResponse struct.
+type FriendsGetRequestsNeedMutualResponse struct {
+ Count int `json:"count"` // Total requests number
+ Items []object.FriendsRequests `json:"items"`
+}
+
+// FriendsGetRequestsNeedMutual returns information about the current user's incoming and outgoing friend requests.
+//
+// https://vk.com/dev/friends.getRequests
+func (vk *VK) FriendsGetRequestsNeedMutual(params Params) (response FriendsGetRequestsNeedMutualResponse, err error) {
+ reqParams := Params{
+ "extended": false,
+ "need_mutual": true,
+ }
+
+ err = vk.RequestUnmarshal("friends.getRequests", &response, params, reqParams)
+
+ return
+}
+
+// FriendsGetRequestsExtendedResponse struct.
+type FriendsGetRequestsExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.FriendsRequestsXtrMessage `json:"items"`
+}
+
+// FriendsGetRequestsExtended returns information about the current user's incoming and outgoing friend requests.
+//
+// https://vk.com/dev/friends.getRequests
+func (vk *VK) FriendsGetRequestsExtended(params Params) (response FriendsGetRequestsExtendedResponse, err error) {
+ reqParams := Params{
+ "need_mutual": false,
+ "extended": true,
+ }
+
+ err = vk.RequestUnmarshal("friends.getRequests", &response, params, reqParams)
+
+ return
+}
+
+// FriendsGetSuggestionsResponse struct.
+type FriendsGetSuggestionsResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// FriendsGetSuggestions returns a list of profiles of users whom the current user may know.
+//
+// https://vk.com/dev/friends.getSuggestions
+func (vk *VK) FriendsGetSuggestions(params Params) (response FriendsGetSuggestionsResponse, err error) {
+ err = vk.RequestUnmarshal("friends.getSuggestions", &response, params)
+ return
+}
+
+// FriendsSearchResponse struct.
+type FriendsSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// FriendsSearch returns a list of friends matching the search criteria.
+//
+// https://vk.com/dev/friends.search
+func (vk *VK) FriendsSearch(params Params) (response FriendsSearchResponse, err error) {
+ err = vk.RequestUnmarshal("friends.search", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/gifts.go b/vendor/github.com/SevereCloud/vksdk/v2/api/gifts.go
new file mode 100644
index 00000000..cdcddd94
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/gifts.go
@@ -0,0 +1,32 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import "github.com/SevereCloud/vksdk/v2/object"
+
+// GiftsGetResponse struct.
+type GiftsGetResponse struct {
+ Count int `json:"count"`
+ Items []object.GiftsGift `json:"items"`
+}
+
+// GiftsGet returns a list of user gifts.
+//
+// https://vk.com/dev/gifts.get
+func (vk *VK) GiftsGet(params Params) (response GiftsGetResponse, err error) {
+ err = vk.RequestUnmarshal("gifts.get", &response, params)
+ return
+}
+
+// GiftsGetCatalogResponse struct.
+type GiftsGetCatalogResponse []struct {
+ Name string `json:"name"`
+ Title string `json:"title"`
+ Items []object.GiftsGift `json:"items"`
+}
+
+// GiftsGetCatalog returns catalog.
+//
+// https://vk.com/dev/gifts.get
+func (vk *VK) GiftsGetCatalog(params Params) (response GiftsGetCatalogResponse, err error) {
+ err = vk.RequestUnmarshal("gifts.getCatalog", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/groups.go b/vendor/github.com/SevereCloud/vksdk/v2/api/groups.go
new file mode 100644
index 00000000..72c4143f
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/groups.go
@@ -0,0 +1,712 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// GroupsAddAddressResponse struct.
+type GroupsAddAddressResponse object.GroupsAddress
+
+// GroupsAddAddress groups.addAddress.
+//
+// https://vk.com/dev/groups.addAddress
+func (vk *VK) GroupsAddAddress(params Params) (response GroupsAddAddressResponse, err error) {
+ err = vk.RequestUnmarshal("groups.addAddress", &response, params)
+ return
+}
+
+// GroupsAddCallbackServerResponse struct.
+type GroupsAddCallbackServerResponse struct {
+ ServerID int `json:"server_id"`
+}
+
+// GroupsAddCallbackServer callback API server to the community.
+//
+// https://vk.com/dev/groups.addCallbackServer
+func (vk *VK) GroupsAddCallbackServer(params Params) (response GroupsAddCallbackServerResponse, err error) {
+ err = vk.RequestUnmarshal("groups.addCallbackServer", &response, params)
+ return
+}
+
+// GroupsAddLinkResponse struct.
+type GroupsAddLinkResponse object.GroupsGroupLink
+
+// GroupsAddLink allows to add a link to the community.
+//
+// https://vk.com/dev/groups.addLink
+func (vk *VK) GroupsAddLink(params Params) (response GroupsAddLinkResponse, err error) {
+ err = vk.RequestUnmarshal("groups.addLink", &response, params)
+ return
+}
+
+// GroupsApproveRequest allows to approve join request to the community.
+//
+// https://vk.com/dev/groups.approveRequest
+func (vk *VK) GroupsApproveRequest(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.approveRequest", &response, params)
+ return
+}
+
+// GroupsBan adds a user or a group to the community blacklist.
+//
+// https://vk.com/dev/groups.ban
+func (vk *VK) GroupsBan(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.ban", &response, params)
+ return
+}
+
+// GroupsCreateResponse struct.
+type GroupsCreateResponse object.GroupsGroup
+
+// GroupsCreate creates a new community.
+//
+// https://vk.com/dev/groups.create
+func (vk *VK) GroupsCreate(params Params) (response GroupsCreateResponse, err error) {
+ err = vk.RequestUnmarshal("groups.create", &response, params)
+ return
+}
+
+// GroupsDeleteAddress groups.deleteAddress.
+//
+// https://vk.com/dev/groups.deleteAddress
+func (vk *VK) GroupsDeleteAddress(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.deleteAddress", &response, params)
+ return
+}
+
+// GroupsDeleteCallbackServer callback API server from the community.
+//
+// https://vk.com/dev/groups.deleteCallbackServer
+func (vk *VK) GroupsDeleteCallbackServer(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.deleteCallbackServer", &response, params)
+ return
+}
+
+// GroupsDeleteLink allows to delete a link from the community.
+//
+// https://vk.com/dev/groups.deleteLink
+func (vk *VK) GroupsDeleteLink(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.deleteLink", &response, params)
+ return
+}
+
+// GroupsDisableOnline disables "online" status in the community.
+//
+// https://vk.com/dev/groups.disableOnline
+func (vk *VK) GroupsDisableOnline(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.disableOnline", &response, params)
+ return
+}
+
+// GroupsEdit edits a community.
+//
+// https://vk.com/dev/groups.edit
+func (vk *VK) GroupsEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.edit", &response, params)
+ return
+}
+
+// GroupsEditAddressResponse struct.
+type GroupsEditAddressResponse object.GroupsAddress
+
+// GroupsEditAddress groups.editAddress.
+//
+// https://vk.com/dev/groups.editAddress
+func (vk *VK) GroupsEditAddress(params Params) (response GroupsEditAddressResponse, err error) {
+ err = vk.RequestUnmarshal("groups.editAddress", &response, params)
+ return
+}
+
+// GroupsEditCallbackServer edits Callback API server in the community.
+//
+// https://vk.com/dev/groups.editCallbackServer
+func (vk *VK) GroupsEditCallbackServer(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.editCallbackServer", &response, params)
+ return
+}
+
+// GroupsEditLink allows to edit a link in the community.
+//
+// https://vk.com/dev/groups.editLink
+func (vk *VK) GroupsEditLink(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.editLink", &response, params)
+ return
+}
+
+// GroupsEditManager allows to add, remove or edit the community manager .
+//
+// https://vk.com/dev/groups.editManager
+func (vk *VK) GroupsEditManager(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.editManager", &response, params)
+ return
+}
+
+// GroupsEnableOnline enables "online" status in the community.
+//
+// https://vk.com/dev/groups.enableOnline
+func (vk *VK) GroupsEnableOnline(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.enableOnline", &response, params)
+ return
+}
+
+// GroupsGetResponse struct.
+type GroupsGetResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// GroupsGet returns a list of the communities to which a user belongs.
+//
+// extended=0
+//
+// https://vk.com/dev/groups.get
+func (vk *VK) GroupsGet(params Params) (response GroupsGetResponse, err error) {
+ err = vk.RequestUnmarshal("groups.get", &response, params, Params{"extended": false})
+
+ return
+}
+
+// GroupsGetExtendedResponse struct.
+type GroupsGetExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsGroup `json:"items"`
+}
+
+// GroupsGetExtended returns a list of the communities to which a user belongs.
+//
+// extended=1
+//
+// https://vk.com/dev/groups.get
+func (vk *VK) GroupsGetExtended(params Params) (response GroupsGetExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("groups.get", &response, params, Params{"extended": true})
+
+ return
+}
+
+// GroupsGetAddressesResponse struct.
+type GroupsGetAddressesResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsAddress `json:"items"`
+}
+
+// GroupsGetAddresses groups.getAddresses.
+//
+// https://vk.com/dev/groups.getAddresses
+func (vk *VK) GroupsGetAddresses(params Params) (response GroupsGetAddressesResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getAddresses", &response, params)
+ return
+}
+
+// GroupsGetBannedResponse struct.
+type GroupsGetBannedResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsOwnerXtrBanInfo `json:"items"`
+}
+
+// GroupsGetBanned returns a list of users on a community blacklist.
+//
+// https://vk.com/dev/groups.getBanned
+func (vk *VK) GroupsGetBanned(params Params) (response GroupsGetBannedResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getBanned", &response, params)
+ return
+}
+
+// GroupsGetByIDResponse struct.
+type GroupsGetByIDResponse []object.GroupsGroup
+
+// GroupsGetByID returns information about communities by their IDs.
+//
+// https://vk.com/dev/groups.getById
+func (vk *VK) GroupsGetByID(params Params) (response GroupsGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getById", &response, params)
+ return
+}
+
+// GroupsGetCallbackConfirmationCodeResponse struct.
+type GroupsGetCallbackConfirmationCodeResponse struct {
+ Code string `json:"code"`
+}
+
+// GroupsGetCallbackConfirmationCode returns Callback API confirmation code for the community.
+//
+// https://vk.com/dev/groups.getCallbackConfirmationCode
+func (vk *VK) GroupsGetCallbackConfirmationCode(params Params) (
+ response GroupsGetCallbackConfirmationCodeResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("groups.getCallbackConfirmationCode", &response, params)
+ return
+}
+
+// GroupsGetCallbackServersResponse struct.
+type GroupsGetCallbackServersResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsCallbackServer `json:"items"`
+}
+
+// GroupsGetCallbackServers receives a list of Callback API servers from the community.
+//
+// https://vk.com/dev/groups.getCallbackServers
+func (vk *VK) GroupsGetCallbackServers(params Params) (response GroupsGetCallbackServersResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getCallbackServers", &response, params)
+ return
+}
+
+// GroupsGetCallbackSettingsResponse struct.
+type GroupsGetCallbackSettingsResponse object.GroupsCallbackSettings
+
+// GroupsGetCallbackSettings returns Callback API notifications settings.
+//
+// BUG(VK): MessageEdit always 0 https://vk.com/bugtracker?act=show&id=86762
+//
+// https://vk.com/dev/groups.getCallbackSettings
+func (vk *VK) GroupsGetCallbackSettings(params Params) (response GroupsGetCallbackSettingsResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getCallbackSettings", &response, params)
+ return
+}
+
+// GroupsGetCatalogResponse struct.
+type GroupsGetCatalogResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsGroup `json:"items"`
+}
+
+// GroupsGetCatalog returns communities list for a catalog category.
+//
+// https://vk.com/dev/groups.getCatalog
+func (vk *VK) GroupsGetCatalog(params Params) (response GroupsGetCatalogResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getCatalog", &response, params)
+ return
+}
+
+// GroupsGetCatalogInfoResponse struct.
+type GroupsGetCatalogInfoResponse struct {
+ Enabled object.BaseBoolInt `json:"enabled"`
+ Categories []object.GroupsGroupCategory `json:"categories"`
+}
+
+// GroupsGetCatalogInfo returns categories list for communities catalog.
+//
+// extended=0
+//
+// https://vk.com/dev/groups.getCatalogInfo
+func (vk *VK) GroupsGetCatalogInfo(params Params) (response GroupsGetCatalogInfoResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getCatalogInfo", &response, params, Params{"extended": false})
+
+ return
+}
+
+// GroupsGetCatalogInfoExtendedResponse struct.
+type GroupsGetCatalogInfoExtendedResponse struct {
+ Enabled object.BaseBoolInt `json:"enabled"`
+ Categories []object.GroupsGroupCategoryFull `json:"categories"`
+}
+
+// GroupsGetCatalogInfoExtended returns categories list for communities catalog.
+//
+// extended=1
+//
+// https://vk.com/dev/groups.getCatalogInfo
+func (vk *VK) GroupsGetCatalogInfoExtended(params Params) (response GroupsGetCatalogInfoExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getCatalogInfo", &response, params, Params{"extended": true})
+
+ return
+}
+
+// GroupsGetInvitedUsersResponse struct.
+type GroupsGetInvitedUsersResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// GroupsGetInvitedUsers returns invited users list of a community.
+//
+// https://vk.com/dev/groups.getInvitedUsers
+func (vk *VK) GroupsGetInvitedUsers(params Params) (response GroupsGetInvitedUsersResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getInvitedUsers", &response, params)
+ return
+}
+
+// GroupsGetInvitesResponse struct.
+type GroupsGetInvitesResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsGroupXtrInvitedBy `json:"items"`
+}
+
+// GroupsGetInvites returns a list of invitations to join communities and events.
+//
+// https://vk.com/dev/groups.getInvites
+func (vk *VK) GroupsGetInvites(params Params) (response GroupsGetInvitesResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getInvites", &response, params)
+ return
+}
+
+// GroupsGetInvitesExtendedResponse struct.
+type GroupsGetInvitesExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsGroupXtrInvitedBy `json:"items"`
+ object.ExtendedResponse
+}
+
+// GroupsGetInvitesExtended returns a list of invitations to join communities and events.
+//
+// https://vk.com/dev/groups.getInvites
+func (vk *VK) GroupsGetInvitesExtended(params Params) (response GroupsGetInvitesExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getInvites", &response, params)
+ return
+}
+
+// GroupsGetLongPollServerResponse struct.
+type GroupsGetLongPollServerResponse object.GroupsLongPollServer
+
+// GroupsGetLongPollServer returns data for Bots Long Poll API connection.
+//
+// https://vk.com/dev/groups.getLongPollServer
+func (vk *VK) GroupsGetLongPollServer(params Params) (response GroupsGetLongPollServerResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getLongPollServer", &response, params)
+ return
+}
+
+// GroupsGetLongPollSettingsResponse struct.
+type GroupsGetLongPollSettingsResponse object.GroupsLongPollSettings
+
+// GroupsGetLongPollSettings returns Bots Long Poll API settings.
+//
+// https://vk.com/dev/groups.getLongPollSettings
+func (vk *VK) GroupsGetLongPollSettings(params Params) (response GroupsGetLongPollSettingsResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getLongPollSettings", &response, params)
+ return
+}
+
+// GroupsGetMembersResponse struct.
+type GroupsGetMembersResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// GroupsGetMembers returns a list of community members.
+//
+// https://vk.com/dev/groups.getMembers
+func (vk *VK) GroupsGetMembers(params Params) (response GroupsGetMembersResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getMembers", &response, params, Params{"filter": ""})
+
+ return
+}
+
+// GroupsGetMembersFieldsResponse struct.
+type GroupsGetMembersFieldsResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// GroupsGetMembersFields returns a list of community members.
+//
+// https://vk.com/dev/groups.getMembers
+func (vk *VK) GroupsGetMembersFields(params Params) (response GroupsGetMembersFieldsResponse, err error) {
+ reqParams := make(Params)
+ if v, prs := params["fields"]; v == "" || !prs {
+ reqParams["fields"] = "id"
+ }
+
+ err = vk.RequestUnmarshal("groups.getMembers", &response, params, reqParams)
+
+ return
+}
+
+// GroupsGetMembersFilterManagersResponse struct.
+type GroupsGetMembersFilterManagersResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsMemberRoleXtrUsersUser `json:"items"`
+}
+
+// GroupsGetMembersFilterManagers returns a list of community members.
+//
+// filter=managers
+//
+// https://vk.com/dev/groups.getMembers
+func (vk *VK) GroupsGetMembersFilterManagers(params Params) (
+ response GroupsGetMembersFilterManagersResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("groups.getMembers", &response, params, Params{"filter": "managers"})
+
+ return
+}
+
+// GroupsGetOnlineStatusResponse struct.
+type GroupsGetOnlineStatusResponse object.GroupsOnlineStatus
+
+// GroupsGetOnlineStatus returns a community's online status.
+//
+// https://vk.com/dev/groups.getOnlineStatus
+func (vk *VK) GroupsGetOnlineStatus(params Params) (response GroupsGetOnlineStatusResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getOnlineStatus", &response, params)
+ return
+}
+
+// GroupsGetRequestsResponse struct.
+type GroupsGetRequestsResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// GroupsGetRequests returns a list of requests to the community.
+//
+// https://vk.com/dev/groups.getRequests
+func (vk *VK) GroupsGetRequests(params Params) (response GroupsGetRequestsResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getRequests", &response, params, Params{"fields": ""})
+
+ return
+}
+
+// GroupsGetRequestsFieldsResponse struct.
+type GroupsGetRequestsFieldsResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// GroupsGetRequestsFields returns a list of requests to the community.
+//
+// https://vk.com/dev/groups.getRequests
+func (vk *VK) GroupsGetRequestsFields(params Params) (response GroupsGetRequestsFieldsResponse, err error) {
+ reqParams := make(Params)
+ if v, prs := params["fields"]; v == "" || !prs {
+ reqParams["fields"] = "id"
+ }
+
+ err = vk.RequestUnmarshal("groups.getRequests", &response, params, reqParams)
+
+ return
+}
+
+// GroupsGetSettingsResponse struct.
+type GroupsGetSettingsResponse object.GroupsGroupSettings
+
+// GroupsGetSettings returns community settings.
+//
+// https://vk.com/dev/groups.getSettings
+func (vk *VK) GroupsGetSettings(params Params) (response GroupsGetSettingsResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getSettings", &response, params)
+ return
+}
+
+// GroupsGetTagListResponse struct.
+type GroupsGetTagListResponse []object.GroupsTag
+
+// GroupsGetTagList returns community tags list.
+//
+// https://vk.com/dev/groups.getTagList
+func (vk *VK) GroupsGetTagList(params Params) (response GroupsGetTagListResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getTagList", &response, params)
+ return
+}
+
+// GroupsGetTokenPermissionsResponse struct.
+type GroupsGetTokenPermissionsResponse object.GroupsTokenPermissions
+
+// GroupsGetTokenPermissions returns permissions scope for the community's access_token.
+//
+// https://vk.com/dev/groups.getTokenPermissions
+func (vk *VK) GroupsGetTokenPermissions(params Params) (response GroupsGetTokenPermissionsResponse, err error) {
+ err = vk.RequestUnmarshal("groups.getTokenPermissions", &response, params)
+ return
+}
+
+// GroupsInvite allows to invite friends to the community.
+//
+// https://vk.com/dev/groups.invite
+func (vk *VK) GroupsInvite(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.invite", &response, params)
+ return
+}
+
+// GroupsIsMember returns information specifying whether a user is a member of a community.
+//
+// extended=0
+//
+// https://vk.com/dev/groups.isMember
+func (vk *VK) GroupsIsMember(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.isMember", &response, params, Params{"extended": false})
+
+ return
+}
+
+// GroupsIsMemberExtendedResponse struct.
+type GroupsIsMemberExtendedResponse struct {
+ Invitation object.BaseBoolInt `json:"invitation"` // Information whether user has been invited to the group
+ Member object.BaseBoolInt `json:"member"` // Information whether user is a member of the group
+ Request object.BaseBoolInt `json:"request"` // Information whether user has send request to the group
+ CanInvite object.BaseBoolInt `json:"can_invite"` // Information whether user can be invite
+ CanRecall object.BaseBoolInt `json:"can_recall"` // Information whether user's invite to the group can be recalled
+}
+
+// GroupsIsMemberExtended returns information specifying whether a user is a member of a community.
+//
+// extended=1
+//
+// https://vk.com/dev/groups.isMember
+func (vk *VK) GroupsIsMemberExtended(params Params) (response GroupsIsMemberExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("groups.isMember", &response, params, Params{"extended": true})
+
+ return
+}
+
+// GroupsIsMemberUserIDsExtendedResponse struct.
+type GroupsIsMemberUserIDsExtendedResponse []object.GroupsMemberStatusFull
+
+// GroupsIsMemberUserIDsExtended returns information specifying whether a user is a member of a community.
+//
+// extended=1
+// need user_ids
+//
+// https://vk.com/dev/groups.isMember
+func (vk *VK) GroupsIsMemberUserIDsExtended(params Params) (response GroupsIsMemberUserIDsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("groups.isMember", &response, params, Params{"extended": true})
+
+ return
+}
+
+// GroupsIsMemberUserIDsResponse struct.
+type GroupsIsMemberUserIDsResponse []object.GroupsMemberStatus
+
+// GroupsIsMemberUserIDs returns information specifying whether a user is a member of a community.
+//
+// extended=0
+// need user_ids
+//
+// https://vk.com/dev/groups.isMember
+func (vk *VK) GroupsIsMemberUserIDs(params Params) (response GroupsIsMemberUserIDsResponse, err error) {
+ err = vk.RequestUnmarshal("groups.isMember", &response, params, Params{"extended": false})
+
+ return
+}
+
+// GroupsJoin with this method you can join the group or public page, and also confirm your participation in an event.
+//
+// https://vk.com/dev/groups.join
+func (vk *VK) GroupsJoin(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.join", &response, params)
+ return
+}
+
+// GroupsLeave with this method you can leave a group, public page, or event.
+//
+// https://vk.com/dev/groups.leave
+func (vk *VK) GroupsLeave(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.leave", &response, params)
+ return
+}
+
+// GroupsRemoveUser removes a user from the community.
+//
+// https://vk.com/dev/groups.removeUser
+func (vk *VK) GroupsRemoveUser(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.removeUser", &response, params)
+ return
+}
+
+// GroupsReorderLink allows to reorder links in the community.
+//
+// https://vk.com/dev/groups.reorderLink
+func (vk *VK) GroupsReorderLink(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.reorderLink", &response, params)
+ return
+}
+
+// GroupsSearchResponse struct.
+type GroupsSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsGroup `json:"items"`
+}
+
+// GroupsSearch returns a list of communities matching the search criteria.
+//
+// https://vk.com/dev/groups.search
+func (vk *VK) GroupsSearch(params Params) (response GroupsSearchResponse, err error) {
+ err = vk.RequestUnmarshal("groups.search", &response, params)
+ return
+}
+
+// GroupsSetCallbackSettings allow to set notifications settings for Callback API.
+//
+// https://vk.com/dev/groups.setCallbackSettings
+func (vk *VK) GroupsSetCallbackSettings(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.setCallbackSettings", &response, params)
+ return
+}
+
+// GroupsSetLongPollSettings allows to set Bots Long Poll API settings in the community.
+//
+// https://vk.com/dev/groups.setLongPollSettings
+func (vk *VK) GroupsSetLongPollSettings(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.setLongPollSettings", &response, params)
+ return
+}
+
+// GroupsSetSettings sets community settings.
+//
+// https://vk.com/dev/groups.setSettings
+func (vk *VK) GroupsSetSettings(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.setSettings", &response, params)
+ return
+}
+
+// GroupsSetUserNote allows to create or edit a note about a user as part
+// of the user's correspondence with the community.
+//
+// https://vk.com/dev/groups.setUserNote
+func (vk *VK) GroupsSetUserNote(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.setUserNote", &response, params)
+ return
+}
+
+// GroupsTagAdd allows to add a new tag to the community.
+//
+// https://vk.com/dev/groups.tagAdd
+func (vk *VK) GroupsTagAdd(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.tagAdd", &response, params)
+ return
+}
+
+// GroupsTagBind allows to "bind" and "unbind" community tags to conversations.
+//
+// https://vk.com/dev/groups.tagBind
+func (vk *VK) GroupsTagBind(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.tagBind", &response, params)
+ return
+}
+
+// GroupsTagDelete allows to remove a community tag
+//
+// The remote tag will be automatically "unbind" from all conversations to
+// which it was "bind" earlier.
+//
+// https://vk.com/dev/groups.tagDelete
+func (vk *VK) GroupsTagDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.tagDelete", &response, params)
+ return
+}
+
+// GroupsTagUpdate allows to change an existing tag.
+//
+// https://vk.com/dev/groups.tagUpdate
+func (vk *VK) GroupsTagUpdate(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.tagUpdate", &response, params)
+ return
+}
+
+// GroupsToggleMarket method.
+//
+// https://vk.com/dev/groups.toggleMarket
+func (vk *VK) GroupsToggleMarket(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.toggleMarket", &response, params)
+ return
+}
+
+// GroupsUnban groups.unban.
+//
+// https://vk.com/dev/groups.unban
+func (vk *VK) GroupsUnban(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("groups.unban", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/leadforms.go b/vendor/github.com/SevereCloud/vksdk/v2/api/leadforms.go
new file mode 100644
index 00000000..a79c5cd3
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/leadforms.go
@@ -0,0 +1,89 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// LeadFormsCreateResponse struct.
+type LeadFormsCreateResponse struct {
+ FormID int `json:"form_id"`
+ URL string `json:"url"`
+}
+
+// LeadFormsCreate leadForms.create.
+//
+// https://vk.com/dev/leadForms.create
+func (vk *VK) LeadFormsCreate(params Params) (response LeadFormsCreateResponse, err error) {
+ err = vk.RequestUnmarshal("leadForms.create", &response, params)
+ return
+}
+
+// LeadFormsDeleteResponse struct.
+type LeadFormsDeleteResponse struct {
+ FormID int `json:"form_id"`
+}
+
+// LeadFormsDelete leadForms.delete.
+//
+// https://vk.com/dev/leadForms.delete
+func (vk *VK) LeadFormsDelete(params Params) (response LeadFormsDeleteResponse, err error) {
+ err = vk.RequestUnmarshal("leadForms.delete", &response, params)
+ return
+}
+
+// LeadFormsGetResponse struct.
+type LeadFormsGetResponse object.LeadFormsForm
+
+// LeadFormsGet leadForms.get.
+//
+// https://vk.com/dev/leadForms.get
+func (vk *VK) LeadFormsGet(params Params) (response LeadFormsGetResponse, err error) {
+ err = vk.RequestUnmarshal("leadForms.get", &response, params)
+ return
+}
+
+// LeadFormsGetLeadsResponse struct.
+type LeadFormsGetLeadsResponse struct {
+ Leads []object.LeadFormsLead `json:"leads"`
+}
+
+// LeadFormsGetLeads leadForms.getLeads.
+//
+// https://vk.com/dev/leadForms.getLeads
+func (vk *VK) LeadFormsGetLeads(params Params) (response LeadFormsGetLeadsResponse, err error) {
+ err = vk.RequestUnmarshal("leadForms.getLeads", &response, params)
+ return
+}
+
+// LeadFormsGetUploadURL leadForms.getUploadURL.
+//
+// https://vk.com/dev/leadForms.getUploadURL
+func (vk *VK) LeadFormsGetUploadURL(params Params) (response string, err error) {
+ err = vk.RequestUnmarshal("leadForms.getUploadURL", &response, params)
+ return
+}
+
+// LeadFormsListResponse struct.
+type LeadFormsListResponse []object.LeadFormsForm
+
+// LeadFormsList leadForms.list.
+//
+// https://vk.com/dev/leadForms.list
+func (vk *VK) LeadFormsList(params Params) (response LeadFormsListResponse, err error) {
+ err = vk.RequestUnmarshal("leadForms.list", &response, params)
+ return
+}
+
+// LeadFormsUpdateResponse struct.
+type LeadFormsUpdateResponse struct {
+ FormID int `json:"form_id"`
+ URL string `json:"url"`
+}
+
+// LeadFormsUpdate leadForms.update.
+//
+// https://vk.com/dev/leadForms.update
+func (vk *VK) LeadFormsUpdate(params Params) (response LeadFormsUpdateResponse, err error) {
+ err = vk.RequestUnmarshal("leadForms.update", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/leads.go b/vendor/github.com/SevereCloud/vksdk/v2/api/leads.go
new file mode 100644
index 00000000..e01e7a92
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/leads.go
@@ -0,0 +1,74 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// LeadsCheckUserResponse struct.
+type LeadsCheckUserResponse object.LeadsChecked
+
+// LeadsCheckUser checks if the user can start the lead.
+//
+// https://vk.com/dev/leads.checkUser
+func (vk *VK) LeadsCheckUser(params Params) (response LeadsCheckUserResponse, err error) {
+ err = vk.RequestUnmarshal("leads.checkUser", &response, params)
+ return
+}
+
+// LeadsCompleteResponse struct.
+type LeadsCompleteResponse object.LeadsComplete
+
+// LeadsComplete completes the lead started by user.
+//
+// https://vk.com/dev/leads.complete
+func (vk *VK) LeadsComplete(params Params) (response LeadsCompleteResponse, err error) {
+ err = vk.RequestUnmarshal("leads.complete", &response, params)
+ return
+}
+
+// LeadsGetStatsResponse struct.
+type LeadsGetStatsResponse object.LeadsLead
+
+// LeadsGetStats returns lead stats data.
+//
+// https://vk.com/dev/leads.getStats
+func (vk *VK) LeadsGetStats(params Params) (response LeadsGetStatsResponse, err error) {
+ err = vk.RequestUnmarshal("leads.getStats", &response, params)
+ return
+}
+
+// LeadsGetUsersResponse struct.
+type LeadsGetUsersResponse object.LeadsEntry
+
+// LeadsGetUsers returns a list of last user actions for the offer.
+//
+// https://vk.com/dev/leads.getUsers
+func (vk *VK) LeadsGetUsers(params Params) (response LeadsGetUsersResponse, err error) {
+ err = vk.RequestUnmarshal("leads.getUsers", &response, params)
+ return
+}
+
+// LeadsMetricHitResponse struct.
+type LeadsMetricHitResponse struct {
+ Result object.BaseBoolInt `json:"result"` // Information whether request has been processed successfully
+ RedirectLink string `json:"redirect_link"` // Redirect link
+}
+
+// LeadsMetricHit counts the metric event.
+//
+// https://vk.com/dev/leads.metricHit
+func (vk *VK) LeadsMetricHit(params Params) (response LeadsMetricHitResponse, err error) {
+ err = vk.RequestUnmarshal("leads.metricHit", &response, params)
+ return
+}
+
+// LeadsStartResponse struct.
+type LeadsStartResponse object.LeadsStart
+
+// LeadsStart creates new session for the user passing the offer.
+//
+// https://vk.com/dev/leads.start
+func (vk *VK) LeadsStart(params Params) (response LeadsStartResponse, err error) {
+ err = vk.RequestUnmarshal("leads.start", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/likes.go b/vendor/github.com/SevereCloud/vksdk/v2/api/likes.go
new file mode 100644
index 00000000..047c2935
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/likes.go
@@ -0,0 +1,79 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// LikesAddResponse struct.
+type LikesAddResponse struct {
+ Likes int `json:"likes"`
+}
+
+// LikesAdd adds the specified object to the Likes list of the current user.
+//
+// https://vk.com/dev/likes.add
+func (vk *VK) LikesAdd(params Params) (response LikesAddResponse, err error) {
+ err = vk.RequestUnmarshal("likes.add", &response, params)
+ return
+}
+
+// LikesDeleteResponse struct.
+type LikesDeleteResponse struct {
+ Likes int `json:"likes"`
+}
+
+// LikesDelete deletes the specified object from the Likes list of the current user.
+//
+// https://vk.com/dev/likes.delete
+func (vk *VK) LikesDelete(params Params) (response LikesDeleteResponse, err error) {
+ err = vk.RequestUnmarshal("likes.delete", &response, params)
+ return
+}
+
+// LikesGetListResponse struct.
+type LikesGetListResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// LikesGetList likes.getList returns a list of IDs of users who added the specified object to their Likes list.
+//
+// extended=0
+//
+// https://vk.com/dev/likes.getList
+func (vk *VK) LikesGetList(params Params) (response LikesGetListResponse, err error) {
+ err = vk.RequestUnmarshal("likes.getList", &response, params, Params{"extended": false})
+
+ return
+}
+
+// LikesGetListExtendedResponse struct.
+type LikesGetListExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// LikesGetListExtended likes.getList returns a list of IDs of users who added the specified object to their Likes list.
+//
+// extended=1
+//
+// https://vk.com/dev/likes.getList
+func (vk *VK) LikesGetListExtended(params Params) (response LikesGetListExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("likes.getList", &response, params, Params{"extended": true})
+
+ return
+}
+
+// LikesIsLikedResponse struct.
+type LikesIsLikedResponse struct {
+ Liked object.BaseBoolInt `json:"liked"`
+ Copied object.BaseBoolInt `json:"copied"`
+}
+
+// LikesIsLiked checks for the object in the Likes list of the specified user.
+//
+// https://vk.com/dev/likes.isLiked
+func (vk *VK) LikesIsLiked(params Params) (response LikesIsLikedResponse, err error) {
+ err = vk.RequestUnmarshal("likes.isLiked", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/market.go b/vendor/github.com/SevereCloud/vksdk/v2/api/market.go
new file mode 100644
index 00000000..dc140a86
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/market.go
@@ -0,0 +1,319 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// MarketAddResponse struct.
+type MarketAddResponse struct {
+ MarketItemID int `json:"market_item_id"` // Item ID
+}
+
+// MarketAdd adds a new item to the market.
+//
+// https://vk.com/dev/market.add
+func (vk *VK) MarketAdd(params Params) (response MarketAddResponse, err error) {
+ err = vk.RequestUnmarshal("market.add", &response, params)
+ return
+}
+
+// MarketAddAlbumResponse struct.
+type MarketAddAlbumResponse struct {
+ MarketAlbumID int `json:"market_album_id"` // Album ID
+}
+
+// MarketAddAlbum creates new collection of items.
+//
+// https://vk.com/dev/market.addAlbum
+func (vk *VK) MarketAddAlbum(params Params) (response MarketAddAlbumResponse, err error) {
+ err = vk.RequestUnmarshal("market.addAlbum", &response, params)
+ return
+}
+
+// MarketAddToAlbum adds an item to one or multiple collections.
+//
+// https://vk.com/dev/market.addToAlbum
+func (vk *VK) MarketAddToAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.addToAlbum", &response, params)
+ return
+}
+
+// MarketCreateComment creates a new comment for an item.
+//
+// https://vk.com/dev/market.createComment
+func (vk *VK) MarketCreateComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.createComment", &response, params)
+ return
+}
+
+// MarketDelete deletes an item.
+//
+// https://vk.com/dev/market.delete
+func (vk *VK) MarketDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.delete", &response, params)
+ return
+}
+
+// MarketDeleteAlbum deletes a collection of items.
+//
+// https://vk.com/dev/market.deleteAlbum
+func (vk *VK) MarketDeleteAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.deleteAlbum", &response, params)
+ return
+}
+
+// MarketDeleteComment deletes an item's comment.
+//
+// https://vk.com/dev/market.deleteComment
+func (vk *VK) MarketDeleteComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.deleteComment", &response, params)
+ return
+}
+
+// MarketEdit edits an item.
+//
+// https://vk.com/dev/market.edit
+func (vk *VK) MarketEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.edit", &response, params)
+ return
+}
+
+// MarketEditAlbum edits a collection of items.
+//
+// https://vk.com/dev/market.editAlbum
+func (vk *VK) MarketEditAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.editAlbum", &response, params)
+ return
+}
+
+// MarketEditComment changes item comment's text.
+//
+// https://vk.com/dev/market.editComment
+func (vk *VK) MarketEditComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.editComment", &response, params)
+ return
+}
+
+// MarketEditOrder edits an order.
+//
+// https://vk.com/dev/market.editOrder
+func (vk *VK) MarketEditOrder(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.editOrder", &response, params)
+ return
+}
+
+// MarketGetResponse struct.
+type MarketGetResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketMarketItem `json:"items"`
+}
+
+// MarketGet returns items list for a community.
+//
+// https://vk.com/dev/market.get
+func (vk *VK) MarketGet(params Params) (response MarketGetResponse, err error) {
+ err = vk.RequestUnmarshal("market.get", &response, params)
+ return
+}
+
+// MarketGetAlbumByIDResponse struct.
+type MarketGetAlbumByIDResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketMarketAlbum `json:"items"`
+}
+
+// MarketGetAlbumByID returns items album's data.
+//
+// https://vk.com/dev/market.getAlbumById
+func (vk *VK) MarketGetAlbumByID(params Params) (response MarketGetAlbumByIDResponse, err error) {
+ err = vk.RequestUnmarshal("market.getAlbumById", &response, params)
+ return
+}
+
+// MarketGetAlbumsResponse struct.
+type MarketGetAlbumsResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketMarketAlbum `json:"items"`
+}
+
+// MarketGetAlbums returns community's collections list.
+//
+// https://vk.com/dev/market.getAlbums
+func (vk *VK) MarketGetAlbums(params Params) (response MarketGetAlbumsResponse, err error) {
+ err = vk.RequestUnmarshal("market.getAlbums", &response, params)
+ return
+}
+
+// MarketGetByIDResponse struct.
+type MarketGetByIDResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketMarketItem `json:"items"`
+}
+
+// MarketGetByID returns information about market items by their iDs.
+//
+// https://vk.com/dev/market.getById
+func (vk *VK) MarketGetByID(params Params) (response MarketGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("market.getById", &response, params)
+ return
+}
+
+// MarketGetCategoriesResponse struct.
+type MarketGetCategoriesResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketMarketCategory `json:"items"`
+}
+
+// MarketGetCategories returns a list of market categories.
+//
+// https://vk.com/dev/market.getCategories
+func (vk *VK) MarketGetCategories(params Params) (response MarketGetCategoriesResponse, err error) {
+ err = vk.RequestUnmarshal("market.getCategories", &response, params)
+ return
+}
+
+// MarketGetCommentsResponse struct.
+type MarketGetCommentsResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallComment `json:"items"`
+}
+
+// MarketGetComments returns comments list for an item.
+//
+// extended=0
+//
+// https://vk.com/dev/market.getComments
+func (vk *VK) MarketGetComments(params Params) (response MarketGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("market.getComments", &response, params, Params{"extended": false})
+
+ return
+}
+
+// MarketGetCommentsExtendedResponse struct.
+type MarketGetCommentsExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallComment `json:"items"`
+ object.ExtendedResponse
+}
+
+// MarketGetCommentsExtended returns comments list for an item.
+//
+// extended=1
+//
+// https://vk.com/dev/market.getComments
+func (vk *VK) MarketGetCommentsExtended(params Params) (response MarketGetCommentsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("market.getComments", &response, params, Params{"extended": true})
+
+ return
+}
+
+// MarketGetGroupOrdersResponse struct.
+type MarketGetGroupOrdersResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketOrder `json:"items"`
+}
+
+// MarketGetGroupOrders returns community's orders list.
+//
+// https://vk.com/dev/market.getGroupOrders
+func (vk *VK) MarketGetGroupOrders(params Params) (response MarketGetGroupOrdersResponse, err error) {
+ err = vk.RequestUnmarshal("market.getGroupOrders", &response, params)
+ return
+}
+
+// MarketGetOrderByIDResponse struct.
+type MarketGetOrderByIDResponse struct {
+ Order object.MarketOrder `json:"order"`
+}
+
+// MarketGetOrderByID returns order by id.
+//
+// https://vk.com/dev/market.getOrderById
+func (vk *VK) MarketGetOrderByID(params Params) (response MarketGetOrderByIDResponse, err error) {
+ err = vk.RequestUnmarshal("market.getOrderById", &response, params)
+ return
+}
+
+// MarketGetOrderItemsResponse struct.
+type MarketGetOrderItemsResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketOrderItem `json:"items"`
+}
+
+// MarketGetOrderItems returns items of an order.
+//
+// https://vk.com/dev/market.getOrderItems
+func (vk *VK) MarketGetOrderItems(params Params) (response MarketGetOrderItemsResponse, err error) {
+ err = vk.RequestUnmarshal("market.getOrderItems", &response, params)
+ return
+}
+
+// MarketRemoveFromAlbum removes an item from one or multiple collections.
+//
+// https://vk.com/dev/market.removeFromAlbum
+func (vk *VK) MarketRemoveFromAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.removeFromAlbum", &response, params)
+ return
+}
+
+// MarketReorderAlbums reorders the collections list.
+//
+// https://vk.com/dev/market.reorderAlbums
+func (vk *VK) MarketReorderAlbums(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.reorderAlbums", &response, params)
+ return
+}
+
+// MarketReorderItems changes item place in a collection.
+//
+// https://vk.com/dev/market.reorderItems
+func (vk *VK) MarketReorderItems(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.reorderItems", &response, params)
+ return
+}
+
+// MarketReport sends a complaint to the item.
+//
+// https://vk.com/dev/market.report
+func (vk *VK) MarketReport(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.report", &response, params)
+ return
+}
+
+// MarketReportComment sends a complaint to the item's comment.
+//
+// https://vk.com/dev/market.reportComment
+func (vk *VK) MarketReportComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.reportComment", &response, params)
+ return
+}
+
+// MarketRestore restores recently deleted item.
+//
+// https://vk.com/dev/market.restore
+func (vk *VK) MarketRestore(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.restore", &response, params)
+ return
+}
+
+// MarketRestoreComment restores a recently deleted comment.
+//
+// https://vk.com/dev/market.restoreComment
+func (vk *VK) MarketRestoreComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("market.restoreComment", &response, params)
+ return
+}
+
+// MarketSearchResponse struct.
+type MarketSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.MarketMarketItem `json:"items"`
+}
+
+// MarketSearch searches market items in a community's catalog.
+//
+// https://vk.com/dev/market.search
+func (vk *VK) MarketSearch(params Params) (response MarketSearchResponse, err error) {
+ err = vk.RequestUnmarshal("market.search", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/messages.go b/vendor/github.com/SevereCloud/vksdk/v2/api/messages.go
new file mode 100644
index 00000000..0a8f5613
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/messages.go
@@ -0,0 +1,616 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// MessagesAddChatUser adds a new user to a chat.
+//
+// https://vk.com/dev/messages.addChatUser
+func (vk *VK) MessagesAddChatUser(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.addChatUser", &response, params)
+ return
+}
+
+// MessagesAllowMessagesFromGroup allows sending messages from community to the current user.
+//
+// https://vk.com/dev/messages.allowMessagesFromGroup
+func (vk *VK) MessagesAllowMessagesFromGroup(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.allowMessagesFromGroup", &response, params)
+ return
+}
+
+// MessagesCreateChat creates a chat with several participants.
+//
+// https://vk.com/dev/messages.createChat
+func (vk *VK) MessagesCreateChat(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.createChat", &response, params)
+ return
+}
+
+// MessagesDeleteResponse struct.
+type MessagesDeleteResponse map[string]int
+
+// MessagesDelete deletes one or more messages.
+//
+// https://vk.com/dev/messages.delete
+func (vk *VK) MessagesDelete(params Params) (response MessagesDeleteResponse, err error) {
+ err = vk.RequestUnmarshal("messages.delete", &response, params)
+ return
+}
+
+// MessagesDeleteChatPhotoResponse struct.
+type MessagesDeleteChatPhotoResponse struct {
+ MessageID int `json:"message_id"`
+ Chat object.MessagesChat `json:"chat"`
+}
+
+// MessagesDeleteChatPhoto deletes a chat's cover picture.
+//
+// https://vk.com/dev/messages.deleteChatPhoto
+func (vk *VK) MessagesDeleteChatPhoto(params Params) (response MessagesDeleteChatPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("messages.deleteChatPhoto", &response, params)
+ return
+}
+
+// MessagesDeleteConversationResponse struct.
+type MessagesDeleteConversationResponse struct {
+ LastDeletedID int `json:"last_deleted_id"` // Id of the last message, that was deleted
+}
+
+// MessagesDeleteConversation deletes private messages in a conversation.
+//
+// https://vk.com/dev/messages.deleteConversation
+func (vk *VK) MessagesDeleteConversation(params Params) (response MessagesDeleteConversationResponse, err error) {
+ err = vk.RequestUnmarshal("messages.deleteConversation", &response, params)
+ return
+}
+
+// MessagesDenyMessagesFromGroup denies sending message from community to the current user.
+//
+// https://vk.com/dev/messages.denyMessagesFromGroup
+func (vk *VK) MessagesDenyMessagesFromGroup(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.denyMessagesFromGroup", &response, params)
+ return
+}
+
+// MessagesEdit edits the message.
+//
+// https://vk.com/dev/messages.edit
+func (vk *VK) MessagesEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.edit", &response, params)
+ return
+}
+
+// MessagesEditChat edits the title of a chat.
+//
+// https://vk.com/dev/messages.editChat
+func (vk *VK) MessagesEditChat(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.editChat", &response, params)
+ return
+}
+
+// MessagesGetByConversationMessageIDResponse struct.
+type MessagesGetByConversationMessageIDResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesMessage `json:"items"`
+ object.ExtendedResponse
+}
+
+// MessagesGetByConversationMessageID messages.getByConversationMessageId.
+//
+// https://vk.com/dev/messages.getByConversationMessageId
+func (vk *VK) MessagesGetByConversationMessageID(params Params) (
+ response MessagesGetByConversationMessageIDResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("messages.getByConversationMessageId", &response, params)
+ return
+}
+
+// MessagesGetByIDResponse struct.
+type MessagesGetByIDResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesMessage `json:"items"`
+}
+
+// MessagesGetByID returns messages by their IDs.
+//
+// extended=0
+//
+// https://vk.com/dev/messages.getById
+func (vk *VK) MessagesGetByID(params Params) (response MessagesGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getById", &response, params, Params{"extended": false})
+
+ return
+}
+
+// MessagesGetByIDExtendedResponse struct.
+type MessagesGetByIDExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesMessage `json:"items"`
+ object.ExtendedResponse
+}
+
+// MessagesGetByIDExtended returns messages by their IDs.
+//
+// extended=1
+//
+// https://vk.com/dev/messages.getById
+func (vk *VK) MessagesGetByIDExtended(params Params) (response MessagesGetByIDExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getById", &response, params, Params{"extended": true})
+
+ return
+}
+
+// MessagesGetChatResponse struct.
+type MessagesGetChatResponse object.MessagesChat
+
+// MessagesGetChat returns information about a chat.
+//
+// https://vk.com/dev/messages.getChat
+func (vk *VK) MessagesGetChat(params Params) (response MessagesGetChatResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getChat", &response, params)
+ return
+}
+
+// MessagesGetChatChatIDsResponse struct.
+type MessagesGetChatChatIDsResponse []object.MessagesChat
+
+// MessagesGetChatChatIDs returns information about a chat.
+//
+// https://vk.com/dev/messages.getChat
+func (vk *VK) MessagesGetChatChatIDs(params Params) (response MessagesGetChatChatIDsResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getChat", &response, params)
+ return
+}
+
+// MessagesGetChatPreviewResponse struct.
+type MessagesGetChatPreviewResponse struct {
+ Preview object.MessagesChatPreview `json:"preview"`
+ object.ExtendedResponse
+}
+
+// MessagesGetChatPreview allows to receive chat preview by the invitation link.
+//
+// https://vk.com/dev/messages.getChatPreview
+func (vk *VK) MessagesGetChatPreview(params Params) (response MessagesGetChatPreviewResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getChatPreview", &response, params)
+ return
+}
+
+// MessagesGetConversationMembersResponse struct.
+type MessagesGetConversationMembersResponse struct {
+ Items []struct {
+ MemberID int `json:"member_id"`
+ JoinDate int `json:"join_date"`
+ InvitedBy int `json:"invited_by"`
+ IsOwner object.BaseBoolInt `json:"is_owner,omitempty"`
+ IsAdmin object.BaseBoolInt `json:"is_admin,omitempty"`
+ CanKick object.BaseBoolInt `json:"can_kick,omitempty"`
+ } `json:"items"`
+ Count int `json:"count"`
+ ChatRestrictions struct {
+ OnlyAdminsInvite object.BaseBoolInt `json:"only_admins_invite"`
+ OnlyAdminsEditPin object.BaseBoolInt `json:"only_admins_edit_pin"`
+ OnlyAdminsEditInfo object.BaseBoolInt `json:"only_admins_edit_info"`
+ AdminsPromoteUsers object.BaseBoolInt `json:"admins_promote_users"`
+ } `json:"chat_restrictions"`
+ object.ExtendedResponse
+}
+
+// MessagesGetConversationMembers returns a list of IDs of users participating in a conversation.
+//
+// https://vk.com/dev/messages.getConversationMembers
+func (vk *VK) MessagesGetConversationMembers(params Params) (
+ response MessagesGetConversationMembersResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("messages.getConversationMembers", &response, params)
+ return
+}
+
+// MessagesGetConversationsResponse struct.
+type MessagesGetConversationsResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesConversationWithMessage `json:"items"`
+ UnreadCount int `json:"unread_count"`
+ object.ExtendedResponse
+}
+
+// MessagesGetConversations returns a list of conversations.
+//
+// https://vk.com/dev/messages.getConversations
+func (vk *VK) MessagesGetConversations(params Params) (response MessagesGetConversationsResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getConversations", &response, params)
+ return
+}
+
+// MessagesGetConversationsByIDResponse struct.
+type MessagesGetConversationsByIDResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesConversation `json:"items"`
+}
+
+// MessagesGetConversationsByID returns conversations by their IDs.
+//
+// extended=0
+//
+// https://vk.com/dev/messages.getConversationsById
+func (vk *VK) MessagesGetConversationsByID(params Params) (response MessagesGetConversationsByIDResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getConversationsById", &response, params, Params{"extended": false})
+
+ return
+}
+
+// MessagesGetConversationsByIDExtendedResponse struct.
+type MessagesGetConversationsByIDExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesConversation `json:"items"`
+ object.ExtendedResponse
+}
+
+// MessagesGetConversationsByIDExtended returns conversations by their IDs.
+//
+// extended=1
+//
+// https://vk.com/dev/messages.getConversationsById
+func (vk *VK) MessagesGetConversationsByIDExtended(params Params) (
+ response MessagesGetConversationsByIDExtendedResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("messages.getConversationsById", &response, params, Params{"extended": true})
+
+ return
+}
+
+// MessagesGetHistoryResponse struct.
+type MessagesGetHistoryResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesMessage `json:"items"`
+
+ // extended=1
+ object.ExtendedResponse
+
+ // extended=1
+ Conversations []object.MessagesConversation `json:"conversations,omitempty"`
+
+ // Deprecated: use .Conversations.InRead
+ InRead int `json:"in_read,omitempty"`
+ // Deprecated: use .Conversations.OutRead
+ OutRead int `json:"out_read,omitempty"`
+}
+
+// MessagesGetHistory returns message history for the specified user or group chat.
+//
+// https://vk.com/dev/messages.getHistory
+func (vk *VK) MessagesGetHistory(params Params) (response MessagesGetHistoryResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getHistory", &response, params)
+ return
+}
+
+// MessagesGetHistoryAttachmentsResponse struct.
+type MessagesGetHistoryAttachmentsResponse struct {
+ Items []object.MessagesHistoryAttachment `json:"items"`
+ NextFrom string `json:"next_from"`
+ object.ExtendedResponse
+}
+
+// MessagesGetHistoryAttachments returns media files from the dialog or group chat.
+//
+// https://vk.com/dev/messages.getHistoryAttachments
+func (vk *VK) MessagesGetHistoryAttachments(params Params) (response MessagesGetHistoryAttachmentsResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getHistoryAttachments", &response, params)
+ return
+}
+
+// MessagesGetImportantMessagesResponse struct.
+type MessagesGetImportantMessagesResponse struct {
+ Messages struct {
+ Count int `json:"count"`
+ Items []object.MessagesMessage `json:"items"`
+ } `json:"messages"`
+ Conversations []object.MessagesConversation `json:"conversations"`
+ object.ExtendedResponse
+}
+
+// MessagesGetImportantMessages messages.getImportantMessages.
+//
+// https://vk.com/dev/messages.getImportantMessages
+func (vk *VK) MessagesGetImportantMessages(params Params) (response MessagesGetImportantMessagesResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getImportantMessages", &response, params)
+ return
+}
+
+// MessagesGetIntentUsersResponse struct.
+type MessagesGetIntentUsersResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+ Profiles []object.MessagesMessage `json:"profiles,omitempty"`
+}
+
+// MessagesGetIntentUsers method.
+//
+// https://vk.com/dev/messages.getIntentUsers
+func (vk *VK) MessagesGetIntentUsers(params Params) (response MessagesGetIntentUsersResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getIntentUsers", &response, params)
+ return
+}
+
+// MessagesGetInviteLinkResponse struct.
+type MessagesGetInviteLinkResponse struct {
+ Link string `json:"link"`
+}
+
+// MessagesGetInviteLink receives a link to invite a user to the chat.
+//
+// https://vk.com/dev/messages.getInviteLink
+func (vk *VK) MessagesGetInviteLink(params Params) (response MessagesGetInviteLinkResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getInviteLink", &response, params)
+ return
+}
+
+// MessagesGetLastActivityResponse struct.
+type MessagesGetLastActivityResponse object.MessagesLastActivity
+
+// MessagesGetLastActivity returns a user's current status and date of last activity.
+//
+// https://vk.com/dev/messages.getLastActivity
+func (vk *VK) MessagesGetLastActivity(params Params) (response MessagesGetLastActivityResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getLastActivity", &response, params)
+ return
+}
+
+// MessagesGetLongPollHistoryResponse struct.
+type MessagesGetLongPollHistoryResponse struct {
+ History [][]int `json:"history"`
+ Groups []object.GroupsGroup `json:"groups"`
+ Messages struct {
+ Count int `json:"count"`
+ Items []object.MessagesMessage `json:"items"`
+ } `json:"messages"`
+ Profiles []object.UsersUser `json:"profiles"`
+ // Chats struct {} `json:"chats"`
+ NewPTS int `json:"new_pts"`
+ FromPTS int `json:"from_pts"`
+ More object.BaseBoolInt `json:"chats"`
+ Conversations []object.MessagesConversation `json:"conversations"`
+}
+
+// MessagesGetLongPollHistory returns updates in user's private messages.
+//
+// https://vk.com/dev/messages.getLongPollHistory
+func (vk *VK) MessagesGetLongPollHistory(params Params) (response MessagesGetLongPollHistoryResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getLongPollHistory", &response, params)
+ return
+}
+
+// MessagesGetLongPollServerResponse struct.
+type MessagesGetLongPollServerResponse object.MessagesLongPollParams
+
+// MessagesGetLongPollServer returns data required for connection to a Long Poll server.
+//
+// https://vk.com/dev/messages.getLongPollServer
+func (vk *VK) MessagesGetLongPollServer(params Params) (response MessagesGetLongPollServerResponse, err error) {
+ err = vk.RequestUnmarshal("messages.getLongPollServer", &response, params)
+ return
+}
+
+// MessagesIsMessagesFromGroupAllowedResponse struct.
+type MessagesIsMessagesFromGroupAllowedResponse struct {
+ IsAllowed object.BaseBoolInt `json:"is_allowed"`
+}
+
+// MessagesIsMessagesFromGroupAllowed returns information whether
+// sending messages from the community to current user is allowed.
+//
+// https://vk.com/dev/messages.isMessagesFromGroupAllowed
+func (vk *VK) MessagesIsMessagesFromGroupAllowed(params Params) (
+ response MessagesIsMessagesFromGroupAllowedResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("messages.isMessagesFromGroupAllowed", &response, params)
+ return
+}
+
+// MessagesJoinChatByInviteLinkResponse struct.
+type MessagesJoinChatByInviteLinkResponse struct {
+ ChatID int `json:"chat_id"`
+}
+
+// MessagesJoinChatByInviteLink allows to enter the chat by the invitation link.
+//
+// https://vk.com/dev/messages.joinChatByInviteLink
+func (vk *VK) MessagesJoinChatByInviteLink(params Params) (response MessagesJoinChatByInviteLinkResponse, err error) {
+ err = vk.RequestUnmarshal("messages.joinChatByInviteLink", &response, params)
+ return
+}
+
+// MessagesMarkAsAnsweredConversation messages.markAsAnsweredConversation.
+//
+// https://vk.com/dev/messages.markAsAnsweredConversation
+func (vk *VK) MessagesMarkAsAnsweredConversation(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.markAsAnsweredConversation", &response, params)
+ return
+}
+
+// MessagesMarkAsImportantResponse struct.
+type MessagesMarkAsImportantResponse []int
+
+// MessagesMarkAsImportant marks and un marks messages as important (starred).
+//
+// https://vk.com/dev/messages.markAsImportant
+func (vk *VK) MessagesMarkAsImportant(params Params) (response MessagesMarkAsImportantResponse, err error) {
+ err = vk.RequestUnmarshal("messages.markAsImportant", &response, params)
+ return
+}
+
+// MessagesMarkAsImportantConversation messages.markAsImportantConversation.
+//
+// https://vk.com/dev/messages.markAsImportantConversation
+func (vk *VK) MessagesMarkAsImportantConversation(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.markAsImportantConversation", &response, params)
+ return
+}
+
+// MessagesMarkAsRead marks messages as read.
+//
+// https://vk.com/dev/messages.markAsRead
+func (vk *VK) MessagesMarkAsRead(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.markAsRead", &response, params)
+ return
+}
+
+// MessagesPinResponse struct.
+type MessagesPinResponse object.MessagesMessage
+
+// MessagesPin messages.pin.
+//
+// https://vk.com/dev/messages.pin
+func (vk *VK) MessagesPin(params Params) (response MessagesPinResponse, err error) {
+ err = vk.RequestUnmarshal("messages.pin", &response, params)
+ return
+}
+
+// MessagesRemoveChatUser allows the current user to leave a chat or, if the
+// current user started the chat, allows the user to remove another user from
+// the chat.
+//
+// https://vk.com/dev/messages.removeChatUser
+func (vk *VK) MessagesRemoveChatUser(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.removeChatUser", &response, params)
+ return
+}
+
+// MessagesRestore restores a deleted message.
+//
+// https://vk.com/dev/messages.restore
+func (vk *VK) MessagesRestore(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.restore", &response, params)
+ return
+}
+
+// MessagesSearchResponse struct.
+type MessagesSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesMessage `json:"items"`
+ object.ExtendedResponse
+ Conversations []object.MessagesConversation `json:"conversations,omitempty"`
+}
+
+// MessagesSearch returns a list of the current user's private messages that match search criteria.
+//
+// https://vk.com/dev/messages.search
+func (vk *VK) MessagesSearch(params Params) (response MessagesSearchResponse, err error) {
+ err = vk.RequestUnmarshal("messages.search", &response, params)
+ return
+}
+
+// MessagesSearchConversationsResponse struct.
+type MessagesSearchConversationsResponse struct {
+ Count int `json:"count"`
+ Items []object.MessagesConversation `json:"items"`
+ object.ExtendedResponse
+}
+
+// MessagesSearchConversations returns a list of conversations that match search criteria.
+//
+// https://vk.com/dev/messages.searchConversations
+func (vk *VK) MessagesSearchConversations(params Params) (response MessagesSearchConversationsResponse, err error) {
+ err = vk.RequestUnmarshal("messages.searchConversations", &response, params)
+ return
+}
+
+// MessagesSend sends a message.
+//
+// For user_ids or peer_ids parameters, use MessagesSendUserIDs.
+//
+// https://vk.com/dev/messages.send
+func (vk *VK) MessagesSend(params Params) (response int, err error) {
+ reqParams := Params{
+ "user_ids": "",
+ "peer_ids": "",
+ }
+
+ err = vk.RequestUnmarshal("messages.send", &response, params, reqParams)
+
+ return
+}
+
+// MessagesSendUserIDsResponse struct.
+//
+// TODO: v3 rename MessagesSendPeerIDsResponse - user_ids outdated.
+type MessagesSendUserIDsResponse []struct {
+ PeerID int `json:"peer_id"`
+ MessageID int `json:"message_id"`
+ ConversationMessageID int `json:"conversation_message_id"`
+ Error Error `json:"error"`
+}
+
+// MessagesSendPeerIDs sends a message.
+//
+// need peer_ids;
+//
+// https://vk.com/dev/messages.send
+func (vk *VK) MessagesSendPeerIDs(params Params) (response MessagesSendUserIDsResponse, err error) {
+ err = vk.RequestUnmarshal("messages.send", &response, params)
+ return
+}
+
+// MessagesSendUserIDs sends a message.
+//
+// need user_ids or peer_ids;
+//
+// https://vk.com/dev/messages.send
+//
+// Deprecated: user_ids outdated, use MessagesSendPeerIDs.
+func (vk *VK) MessagesSendUserIDs(params Params) (response MessagesSendUserIDsResponse, err error) {
+ return vk.MessagesSendPeerIDs(params)
+}
+
+// MessagesSendMessageEventAnswer method.
+//
+// https://vk.com/dev/messages.sendMessageEventAnswer
+func (vk *VK) MessagesSendMessageEventAnswer(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.sendMessageEventAnswer", &response, params)
+ return
+}
+
+// MessagesSendSticker sends a message.
+//
+// https://vk.com/dev/messages.sendSticker
+func (vk *VK) MessagesSendSticker(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.sendSticker", &response, params, Params{"user_ids": ""})
+
+ return
+}
+
+// MessagesSetActivity changes the status of a user as typing in a conversation.
+//
+// https://vk.com/dev/messages.setActivity
+func (vk *VK) MessagesSetActivity(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.setActivity", &response, params)
+ return
+}
+
+// MessagesSetChatPhotoResponse struct.
+type MessagesSetChatPhotoResponse struct {
+ MessageID int `json:"message_id"`
+ Chat object.MessagesChat `json:"chat"`
+}
+
+// MessagesSetChatPhoto sets a previously-uploaded picture as the cover picture of a chat.
+//
+// https://vk.com/dev/messages.setChatPhoto
+func (vk *VK) MessagesSetChatPhoto(params Params) (response MessagesSetChatPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("messages.setChatPhoto", &response, params)
+ return
+}
+
+// MessagesUnpin messages.unpin.
+//
+// https://vk.com/dev/messages.unpin
+func (vk *VK) MessagesUnpin(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("messages.unpin", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/newsfeed.go b/vendor/github.com/SevereCloud/vksdk/v2/api/newsfeed.go
new file mode 100644
index 00000000..36ce1453
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/newsfeed.go
@@ -0,0 +1,230 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// NewsfeedAddBan prevents news from specified users and communities
+// from appearing in the current user's newsfeed.
+//
+// https://vk.com/dev/newsfeed.addBan
+func (vk *VK) NewsfeedAddBan(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("newsfeed.addBan", &response, params)
+ return
+}
+
+// NewsfeedDeleteBan allows news from previously banned users and
+// communities to be shown in the current user's newsfeed.
+//
+// https://vk.com/dev/newsfeed.deleteBan
+func (vk *VK) NewsfeedDeleteBan(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("newsfeed.deleteBan", &response, params)
+ return
+}
+
+// NewsfeedDeleteList the method allows you to delete a custom news list.
+//
+// https://vk.com/dev/newsfeed.deleteList
+func (vk *VK) NewsfeedDeleteList(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("newsfeed.deleteList", &response, params)
+ return
+}
+
+// NewsfeedGetResponse struct.
+type NewsfeedGetResponse struct {
+ Items []object.NewsfeedNewsfeedItem `json:"items"`
+ object.ExtendedResponse
+ NextFrom string `json:"next_from"`
+}
+
+// NewsfeedGet returns data required to show newsfeed for the current user.
+//
+// https://vk.com/dev/newsfeed.get
+func (vk *VK) NewsfeedGet(params Params) (response NewsfeedGetResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.get", &response, params)
+ return
+}
+
+// NewsfeedGetBannedResponse struct.
+type NewsfeedGetBannedResponse struct {
+ Members []int `json:"members"`
+ Groups []int `json:"groups"`
+}
+
+// NewsfeedGetBanned returns a list of users and communities banned from the current user's newsfeed.
+//
+// extended=0
+//
+// https://vk.com/dev/newsfeed.getBanned
+func (vk *VK) NewsfeedGetBanned(params Params) (response NewsfeedGetBannedResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.getBanned", &response, params, Params{"extended": false})
+
+ return
+}
+
+// NewsfeedGetBannedExtendedResponse struct.
+type NewsfeedGetBannedExtendedResponse struct {
+ object.ExtendedResponse
+}
+
+// NewsfeedGetBannedExtended returns a list of users and communities banned from the current user's newsfeed.
+//
+// extended=1
+//
+// https://vk.com/dev/newsfeed.getBanned
+func (vk *VK) NewsfeedGetBannedExtended(params Params) (response NewsfeedGetBannedExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.getBanned", &response, params, Params{"extended": true})
+
+ return
+}
+
+// NewsfeedGetCommentsResponse struct.
+type NewsfeedGetCommentsResponse struct {
+ Items []object.NewsfeedNewsfeedItem `json:"items"`
+ object.ExtendedResponse
+ NextFrom string `json:"next_from"`
+}
+
+// NewsfeedGetComments returns a list of comments in the current user's newsfeed.
+//
+// https://vk.com/dev/newsfeed.getComments
+func (vk *VK) NewsfeedGetComments(params Params) (response NewsfeedGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.getComments", &response, params)
+ return
+}
+
+// NewsfeedGetListsResponse struct.
+type NewsfeedGetListsResponse struct {
+ Count int `json:"count"`
+ Items []struct {
+ ID int `json:"id"`
+ Title string `json:"title"`
+ NoReposts int `json:"no_reposts"`
+ SourceIDs []int `json:"source_ids"`
+ } `json:"items"`
+}
+
+// NewsfeedGetLists returns a list of newsfeeds followed by the current user.
+//
+// https://vk.com/dev/newsfeed.getLists
+func (vk *VK) NewsfeedGetLists(params Params) (response NewsfeedGetListsResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.getLists", &response, params)
+ return
+}
+
+// NewsfeedGetMentionsResponse struct.
+type NewsfeedGetMentionsResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallpostToID `json:"items"`
+}
+
+// NewsfeedGetMentions returns a list of posts on user walls in which the current user is mentioned.
+//
+// https://vk.com/dev/newsfeed.getMentions
+func (vk *VK) NewsfeedGetMentions(params Params) (response NewsfeedGetMentionsResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.getMentions", &response, params)
+ return
+}
+
+// NewsfeedGetRecommendedResponse struct.
+type NewsfeedGetRecommendedResponse struct {
+ Items []object.NewsfeedNewsfeedItem `json:"items"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+ NextOffset string `json:"next_offset"`
+ NextFrom string `json:"next_from"`
+}
+
+// NewsfeedGetRecommended returns a list of newsfeeds recommended to the current user.
+//
+// https://vk.com/dev/newsfeed.getRecommended
+func (vk *VK) NewsfeedGetRecommended(params Params) (response NewsfeedGetRecommendedResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.getRecommended", &response, params)
+ return
+}
+
+// NewsfeedGetSuggestedSourcesResponse struct.
+type NewsfeedGetSuggestedSourcesResponse struct {
+ Count int `json:"count"`
+ Items []object.GroupsGroup `json:"items"` // FIXME: GroupsGroup + UsersUser
+}
+
+// NewsfeedGetSuggestedSources returns communities and users that current user is suggested to follow.
+//
+// https://vk.com/dev/newsfeed.getSuggestedSources
+func (vk *VK) NewsfeedGetSuggestedSources(params Params) (response NewsfeedGetSuggestedSourcesResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.getSuggestedSources", &response, params)
+ return
+}
+
+// NewsfeedIgnoreItem hides an item from the newsfeed.
+//
+// https://vk.com/dev/newsfeed.ignoreItem
+func (vk *VK) NewsfeedIgnoreItem(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("newsfeed.ignoreItem", &response, params)
+ return
+}
+
+// NewsfeedSaveList creates and edits user newsfeed lists.
+//
+// https://vk.com/dev/newsfeed.saveList
+func (vk *VK) NewsfeedSaveList(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("newsfeed.saveList", &response, params)
+ return
+}
+
+// NewsfeedSearchResponse struct.
+type NewsfeedSearchResponse struct {
+ Items []object.WallWallpost `json:"items"`
+ Count int `json:"count"`
+ TotalCount int `json:"total_count"`
+ NextFrom string `json:"next_from"`
+}
+
+// NewsfeedSearch returns search results by statuses.
+//
+// extended=0
+//
+// https://vk.com/dev/newsfeed.search
+func (vk *VK) NewsfeedSearch(params Params) (response NewsfeedSearchResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.search", &response, params, Params{"extended": false})
+
+ return
+}
+
+// NewsfeedSearchExtendedResponse struct.
+type NewsfeedSearchExtendedResponse struct {
+ Items []object.WallWallpost `json:"items"`
+ Count int `json:"count"`
+ TotalCount int `json:"total_count"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+ NextFrom string `json:"next_from"`
+}
+
+// NewsfeedSearchExtended returns search results by statuses.
+//
+// extended=1
+//
+// https://vk.com/dev/newsfeed.search
+func (vk *VK) NewsfeedSearchExtended(params Params) (response NewsfeedSearchExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("newsfeed.search", &response, params, Params{"extended": true})
+
+ return
+}
+
+// NewsfeedUnignoreItem returns a hidden item to the newsfeed.
+//
+// https://vk.com/dev/newsfeed.unignoreItem
+func (vk *VK) NewsfeedUnignoreItem(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("newsfeed.unignoreItem", &response, params)
+ return
+}
+
+// NewsfeedUnsubscribe unsubscribes the current user from specified newsfeeds.
+//
+// https://vk.com/dev/newsfeed.unsubscribe
+func (vk *VK) NewsfeedUnsubscribe(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("newsfeed.unsubscribe", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/notes.go b/vendor/github.com/SevereCloud/vksdk/v2/api/notes.go
new file mode 100644
index 00000000..dd0d4f5e
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/notes.go
@@ -0,0 +1,100 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// NotesAdd creates a new note for the current user.
+//
+// https://vk.com/dev/notes.add
+func (vk *VK) NotesAdd(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notes.add", &response, params)
+ return
+}
+
+// NotesCreateComment adds a new comment on a note.
+//
+// https://vk.com/dev/notes.createComment
+func (vk *VK) NotesCreateComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notes.createComment", &response, params)
+ return
+}
+
+// NotesDelete deletes a note of the current user.
+//
+// https://vk.com/dev/notes.delete
+func (vk *VK) NotesDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notes.delete", &response, params)
+ return
+}
+
+// NotesDeleteComment deletes a comment on a note.
+//
+// https://vk.com/dev/notes.deleteComment
+func (vk *VK) NotesDeleteComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notes.deleteComment", &response, params)
+ return
+}
+
+// NotesEdit edits a note of the current user.
+//
+// https://vk.com/dev/notes.edit
+func (vk *VK) NotesEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notes.edit", &response, params)
+ return
+}
+
+// NotesEditComment edits a comment on a note.
+//
+// https://vk.com/dev/notes.editComment
+func (vk *VK) NotesEditComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notes.editComment", &response, params)
+ return
+}
+
+// NotesGetResponse struct.
+type NotesGetResponse struct {
+ Count int `json:"count"`
+ Items []object.NotesNote `json:"items"`
+}
+
+// NotesGet returns a list of notes created by a user.
+//
+// https://vk.com/dev/notes.get
+func (vk *VK) NotesGet(params Params) (response NotesGetResponse, err error) {
+ err = vk.RequestUnmarshal("notes.get", &response, params)
+ return
+}
+
+// NotesGetByIDResponse struct.
+type NotesGetByIDResponse object.NotesNote
+
+// NotesGetByID returns a note by its ID.
+//
+// https://vk.com/dev/notes.getById
+func (vk *VK) NotesGetByID(params Params) (response NotesGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("notes.getById", &response, params)
+ return
+}
+
+// NotesGetCommentsResponse struct.
+type NotesGetCommentsResponse struct {
+ Count int `json:"count"`
+ Items []object.NotesNoteComment `json:"items"`
+}
+
+// NotesGetComments returns a list of comments on a note.
+//
+// https://vk.com/dev/notes.getComments
+func (vk *VK) NotesGetComments(params Params) (response NotesGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("notes.getComments", &response, params)
+ return
+}
+
+// NotesRestoreComment restores a deleted comment on a note.
+//
+// https://vk.com/dev/notes.restoreComment
+func (vk *VK) NotesRestoreComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notes.restoreComment", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/notifications.go b/vendor/github.com/SevereCloud/vksdk/v2/api/notifications.go
new file mode 100644
index 00000000..8630a1d2
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/notifications.go
@@ -0,0 +1,54 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// NotificationsGetResponse struct.
+type NotificationsGetResponse struct {
+ Count int `json:"count"`
+ Items []object.NotificationsNotification `json:"items"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+ Photos []object.PhotosPhoto `json:"photos"`
+ Videos []object.VideoVideo `json:"videos"`
+ Apps []object.AppsApp `json:"apps"`
+ LastViewed int `json:"last_viewed"`
+ NextFrom string `json:"next_from"`
+ TTL int `json:"ttl"`
+}
+
+// NotificationsGet returns a list of notifications about other users' feedback to the current user's wall posts.
+//
+// https://vk.com/dev/notifications.get
+func (vk *VK) NotificationsGet(params Params) (response NotificationsGetResponse, err error) {
+ err = vk.RequestUnmarshal("notifications.get", &response, params)
+ return
+}
+
+// NotificationsMarkAsViewed resets the counter of new notifications
+// about other users' feedback to the current user's wall posts.
+//
+// https://vk.com/dev/notifications.markAsViewed
+func (vk *VK) NotificationsMarkAsViewed(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("notifications.markAsViewed", &response, params)
+ return
+}
+
+// NotificationsSendMessageResponse struct.
+type NotificationsSendMessageResponse []struct {
+ UserID int `json:"user_id"`
+ Status object.BaseBoolInt `json:"status"`
+ Error struct {
+ Code int `json:"code"`
+ Description string `json:"description"`
+ } `json:"error"`
+}
+
+// NotificationsSendMessage sends notification to the VK Apps user.
+//
+// https://vk.com/dev/notifications.sendMessage
+func (vk *VK) NotificationsSendMessage(params Params) (response NotificationsSendMessageResponse, err error) {
+ err = vk.RequestUnmarshal("notifications.sendMessage", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/orders.go b/vendor/github.com/SevereCloud/vksdk/v2/api/orders.go
new file mode 100644
index 00000000..35dfac42
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/orders.go
@@ -0,0 +1,90 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// OrdersCancelSubscription allows to cancel subscription.
+//
+// https://vk.com/dev/orders.cancelSubscription
+func (vk *VK) OrdersCancelSubscription(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("orders.cancelSubscription", &response, params)
+ return
+}
+
+// OrdersChangeStateResponse struct.
+type OrdersChangeStateResponse string // New state
+
+// OrdersChangeState changes order status.
+//
+// https://vk.com/dev/orders.changeState
+func (vk *VK) OrdersChangeState(params Params) (response OrdersChangeStateResponse, err error) {
+ err = vk.RequestUnmarshal("orders.changeState", &response, params)
+ return
+}
+
+// OrdersGetResponse struct.
+type OrdersGetResponse []object.OrdersOrder
+
+// OrdersGet returns a list of orders.
+//
+// https://vk.com/dev/orders.get
+func (vk *VK) OrdersGet(params Params) (response OrdersGetResponse, err error) {
+ err = vk.RequestUnmarshal("orders.get", &response, params)
+ return
+}
+
+// OrdersGetAmountResponse struct.
+type OrdersGetAmountResponse []object.OrdersAmount
+
+// OrdersGetAmount returns the cost of votes in the user's consent.
+//
+// https://vk.com/dev/orders.getAmount
+func (vk *VK) OrdersGetAmount(params Params) (response OrdersGetAmountResponse, err error) {
+ err = vk.RequestUnmarshal("orders.getAmount", &response, params)
+ return
+}
+
+// OrdersGetByIDResponse struct.
+type OrdersGetByIDResponse []object.OrdersOrder
+
+// OrdersGetByID returns information about orders by their IDs.
+//
+// https://vk.com/dev/orders.getByID
+func (vk *VK) OrdersGetByID(params Params) (response OrdersGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("orders.getById", &response, params)
+ return
+}
+
+// OrdersGetUserSubscriptionByIDResponse struct.
+type OrdersGetUserSubscriptionByIDResponse object.OrdersSubscription
+
+// OrdersGetUserSubscriptionByID allows to get subscription by its ID.
+//
+// https://vk.com/dev/orders.getUserSubscriptionById
+func (vk *VK) OrdersGetUserSubscriptionByID(params Params) (response OrdersGetUserSubscriptionByIDResponse, err error) {
+ err = vk.RequestUnmarshal("orders.getUserSubscriptionById", &response, params)
+ return
+}
+
+// OrdersGetUserSubscriptionsResponse struct.
+type OrdersGetUserSubscriptionsResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.OrdersSubscription `json:"items"`
+}
+
+// OrdersGetUserSubscriptions allows to get user's active subscriptions.
+//
+// https://vk.com/dev/orders.getUserSubscriptions
+func (vk *VK) OrdersGetUserSubscriptions(params Params) (response OrdersGetUserSubscriptionsResponse, err error) {
+ err = vk.RequestUnmarshal("orders.getUserSubscriptions", &response, params)
+ return
+}
+
+// OrdersUpdateSubscription allows to update subscription price.
+//
+// https://vk.com/dev/orders.updateSubscription
+func (vk *VK) OrdersUpdateSubscription(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("orders.updateSubscription", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/pages.go b/vendor/github.com/SevereCloud/vksdk/v2/api/pages.go
new file mode 100644
index 00000000..7f4a2c25
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/pages.go
@@ -0,0 +1,81 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// PagesClearCache allows to clear the cache of particular external pages which may be attached to VK posts.
+//
+// https://vk.com/dev/pages.clearCache
+func (vk *VK) PagesClearCache(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("pages.clearCache", &response, params)
+ return
+}
+
+// PagesGetResponse struct.
+type PagesGetResponse object.PagesWikipageFull
+
+// PagesGet returns information about a wiki page.
+//
+// https://vk.com/dev/pages.get
+func (vk *VK) PagesGet(params Params) (response PagesGetResponse, err error) {
+ err = vk.RequestUnmarshal("pages.get", &response, params)
+ return
+}
+
+// PagesGetHistoryResponse struct.
+type PagesGetHistoryResponse []object.PagesWikipageHistory
+
+// PagesGetHistory returns a list of all previous versions of a wiki page.
+//
+// https://vk.com/dev/pages.getHistory
+func (vk *VK) PagesGetHistory(params Params) (response PagesGetHistoryResponse, err error) {
+ err = vk.RequestUnmarshal("pages.getHistory", &response, params)
+ return
+}
+
+// PagesGetTitlesResponse struct.
+type PagesGetTitlesResponse []object.PagesWikipageFull
+
+// PagesGetTitles returns a list of wiki pages in a group.
+//
+// https://vk.com/dev/pages.getTitles
+func (vk *VK) PagesGetTitles(params Params) (response PagesGetTitlesResponse, err error) {
+ err = vk.RequestUnmarshal("pages.getTitles", &response, params)
+ return
+}
+
+// PagesGetVersionResponse struct.
+type PagesGetVersionResponse object.PagesWikipageFull
+
+// PagesGetVersion returns the text of one of the previous versions of a wiki page.
+//
+// https://vk.com/dev/pages.getVersion
+func (vk *VK) PagesGetVersion(params Params) (response PagesGetVersionResponse, err error) {
+ err = vk.RequestUnmarshal("pages.getVersion", &response, params)
+ return
+}
+
+// PagesParseWiki returns HTML representation of the wiki markup.
+//
+// https://vk.com/dev/pages.parseWiki
+func (vk *VK) PagesParseWiki(params Params) (response string, err error) {
+ err = vk.RequestUnmarshal("pages.parseWiki", &response, params)
+ return
+}
+
+// PagesSave saves the text of a wiki page.
+//
+// https://vk.com/dev/pages.save
+func (vk *VK) PagesSave(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("pages.save", &response, params)
+ return
+}
+
+// PagesSaveAccess saves modified read and edit access settings for a wiki page.
+//
+// https://vk.com/dev/pages.saveAccess
+func (vk *VK) PagesSaveAccess(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("pages.saveAccess", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/photos.go b/vendor/github.com/SevereCloud/vksdk/v2/api/photos.go
new file mode 100644
index 00000000..714705b4
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/photos.go
@@ -0,0 +1,613 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// PhotosConfirmTag confirms a tag on a photo.
+//
+// https://vk.com/dev/photos.confirmTag
+func (vk *VK) PhotosConfirmTag(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.confirmTag", &response, params)
+ return
+}
+
+// PhotosCopy allows to copy a photo to the "Saved photos" album.
+//
+// https://vk.com/dev/photos.copy
+func (vk *VK) PhotosCopy(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.copy", &response, params)
+ return
+}
+
+// PhotosCreateAlbumResponse struct.
+type PhotosCreateAlbumResponse object.PhotosPhotoAlbumFull
+
+// PhotosCreateAlbum creates an empty photo album.
+//
+// https://vk.com/dev/photos.createAlbum
+func (vk *VK) PhotosCreateAlbum(params Params) (response PhotosCreateAlbumResponse, err error) {
+ err = vk.RequestUnmarshal("photos.createAlbum", &response, params)
+ return
+}
+
+// PhotosCreateComment adds a new comment on the photo.
+//
+// https://vk.com/dev/photos.createComment
+func (vk *VK) PhotosCreateComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.createComment", &response, params)
+ return
+}
+
+// PhotosDelete deletes a photo.
+//
+// https://vk.com/dev/photos.delete
+func (vk *VK) PhotosDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.delete", &response, params)
+ return
+}
+
+// PhotosDeleteAlbum deletes a photo album belonging to the current user.
+//
+// https://vk.com/dev/photos.deleteAlbum
+func (vk *VK) PhotosDeleteAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.deleteAlbum", &response, params)
+ return
+}
+
+// PhotosDeleteComment deletes a comment on the photo.
+//
+// https://vk.com/dev/photos.deleteComment
+func (vk *VK) PhotosDeleteComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.deleteComment", &response, params)
+ return
+}
+
+// PhotosEdit edits the caption of a photo.
+//
+// https://vk.com/dev/photos.edit
+func (vk *VK) PhotosEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.edit", &response, params)
+ return
+}
+
+// PhotosEditAlbum edits information about a photo album.
+//
+// https://vk.com/dev/photos.editAlbum
+func (vk *VK) PhotosEditAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.editAlbum", &response, params)
+ return
+}
+
+// PhotosEditComment edits a comment on a photo.
+//
+// https://vk.com/dev/photos.editComment
+func (vk *VK) PhotosEditComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.editComment", &response, params)
+ return
+}
+
+// PhotosGetResponse struct.
+type PhotosGetResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhoto `json:"items"`
+}
+
+// PhotosGet returns a list of a user's or community's photos.
+//
+// extended=0
+//
+// https://vk.com/dev/photos.get
+func (vk *VK) PhotosGet(params Params) (response PhotosGetResponse, err error) {
+ err = vk.RequestUnmarshal("photos.get", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PhotosGetExtendedResponse struct.
+type PhotosGetExtendedResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhotoFull `json:"items"`
+}
+
+// PhotosGetExtended returns a list of a user's or community's photos.
+//
+// extended=1
+//
+// https://vk.com/dev/photos.get
+func (vk *VK) PhotosGetExtended(params Params) (response PhotosGetExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("photos.get", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PhotosGetAlbumsResponse struct.
+type PhotosGetAlbumsResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhotoAlbumFull `json:"items"`
+}
+
+// PhotosGetAlbums returns a list of a user's or community's photo albums.
+//
+// https://vk.com/dev/photos.getAlbums
+func (vk *VK) PhotosGetAlbums(params Params) (response PhotosGetAlbumsResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getAlbums", &response, params)
+ return
+}
+
+// PhotosGetAlbumsCount returns the number of photo albums belonging to a user or community.
+//
+// https://vk.com/dev/photos.getAlbumsCount
+func (vk *VK) PhotosGetAlbumsCount(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.getAlbumsCount", &response, params)
+ return
+}
+
+// PhotosGetAllResponse struct.
+type PhotosGetAllResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhotoXtrRealOffset `json:"items"`
+ More object.BaseBoolInt `json:"more"` // Information whether next page is presented
+}
+
+// PhotosGetAll returns a list of photos belonging to a user or community, in reverse chronological order.
+//
+// extended=0
+//
+// https://vk.com/dev/photos.getAll
+func (vk *VK) PhotosGetAll(params Params) (response PhotosGetAllResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getAll", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PhotosGetAllExtendedResponse struct.
+type PhotosGetAllExtendedResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhotoFullXtrRealOffset `json:"items"`
+ More object.BaseBoolInt `json:"more"` // Information whether next page is presented
+}
+
+// PhotosGetAllExtended returns a list of photos belonging to a user or community, in reverse chronological order.
+//
+// extended=1
+//
+// https://vk.com/dev/photos.getAll
+func (vk *VK) PhotosGetAllExtended(params Params) (response PhotosGetAllExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getAll", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PhotosGetAllCommentsResponse struct.
+type PhotosGetAllCommentsResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosCommentXtrPid `json:"items"`
+}
+
+// PhotosGetAllComments returns a list of comments on a specific
+// photo album or all albums of the user sorted in reverse chronological order.
+//
+// https://vk.com/dev/photos.getAllComments
+func (vk *VK) PhotosGetAllComments(params Params) (response PhotosGetAllCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getAllComments", &response, params)
+ return
+}
+
+// PhotosGetByIDResponse struct.
+type PhotosGetByIDResponse []object.PhotosPhoto
+
+// PhotosGetByID returns information about photos by their IDs.
+//
+// extended=0
+//
+// https://vk.com/dev/photos.getById
+func (vk *VK) PhotosGetByID(params Params) (response PhotosGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getById", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PhotosGetByIDExtendedResponse struct.
+type PhotosGetByIDExtendedResponse []object.PhotosPhotoFull
+
+// PhotosGetByIDExtended returns information about photos by their IDs.
+//
+// extended=1
+//
+// https://vk.com/dev/photos.getById
+func (vk *VK) PhotosGetByIDExtended(params Params) (response PhotosGetByIDExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getById", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PhotosGetChatUploadServerResponse struct.
+type PhotosGetChatUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// PhotosGetChatUploadServer returns an upload link for chat cover pictures.
+//
+// https://vk.com/dev/photos.getChatUploadServer
+func (vk *VK) PhotosGetChatUploadServer(params Params) (response PhotosGetChatUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getChatUploadServer", &response, params)
+ return
+}
+
+// PhotosGetCommentsResponse struct.
+type PhotosGetCommentsResponse struct {
+ Count int `json:"count"` // Total number
+ RealOffset int `json:"real_offset"` // Real offset of the comments
+ Items []object.WallWallComment `json:"items"`
+}
+
+// PhotosGetComments returns a list of comments on a photo.
+//
+// extended=0
+//
+// https://vk.com/dev/photos.getComments
+func (vk *VK) PhotosGetComments(params Params) (response PhotosGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getComments", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PhotosGetCommentsExtendedResponse struct.
+type PhotosGetCommentsExtendedResponse struct {
+ Count int `json:"count"` // Total number
+ RealOffset int `json:"real_offset"` // Real offset of the comments
+ Items []object.WallWallComment `json:"items"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+}
+
+// PhotosGetCommentsExtended returns a list of comments on a photo.
+//
+// extended=1
+//
+// https://vk.com/dev/photos.getComments
+func (vk *VK) PhotosGetCommentsExtended(params Params) (response PhotosGetCommentsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getComments", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PhotosGetMarketAlbumUploadServerResponse struct.
+type PhotosGetMarketAlbumUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// PhotosGetMarketAlbumUploadServer returns the server address for market album photo upload.
+//
+// https://vk.com/dev/photos.getMarketAlbumUploadServer
+func (vk *VK) PhotosGetMarketAlbumUploadServer(params Params) (
+ response PhotosGetMarketAlbumUploadServerResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("photos.getMarketAlbumUploadServer", &response, params)
+ return
+}
+
+// PhotosGetMarketUploadServerResponse struct.
+type PhotosGetMarketUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// PhotosGetMarketUploadServer returns the server address for market photo upload.
+//
+// https://vk.com/dev/photos.getMarketUploadServer
+func (vk *VK) PhotosGetMarketUploadServer(params Params) (response PhotosGetMarketUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getMarketUploadServer", &response, params)
+ return
+}
+
+// PhotosGetMessagesUploadServerResponse struct.
+type PhotosGetMessagesUploadServerResponse struct {
+ AlbumID int `json:"album_id"`
+ UploadURL string `json:"upload_url"`
+ UserID int `json:"user_id,omitempty"`
+ GroupID int `json:"group_id,omitempty"`
+}
+
+// PhotosGetMessagesUploadServer returns the server address for photo upload onto a messages.
+//
+// https://vk.com/dev/photos.getMessagesUploadServer
+func (vk *VK) PhotosGetMessagesUploadServer(params Params) (response PhotosGetMessagesUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getMessagesUploadServer", &response, params)
+ return
+}
+
+// PhotosGetNewTagsResponse struct.
+type PhotosGetNewTagsResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhotoXtrTagInfo `json:"items"`
+}
+
+// PhotosGetNewTags returns a list of photos with tags that have not been viewed.
+//
+// https://vk.com/dev/photos.getNewTags
+func (vk *VK) PhotosGetNewTags(params Params) (response PhotosGetNewTagsResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getNewTags", &response, params)
+ return
+}
+
+// PhotosGetOwnerCoverPhotoUploadServerResponse struct.
+type PhotosGetOwnerCoverPhotoUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// PhotosGetOwnerCoverPhotoUploadServer receives server address for uploading community cover.
+//
+// https://vk.com/dev/photos.getOwnerCoverPhotoUploadServer
+func (vk *VK) PhotosGetOwnerCoverPhotoUploadServer(params Params) (
+ response PhotosGetOwnerCoverPhotoUploadServerResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("photos.getOwnerCoverPhotoUploadServer", &response, params)
+ return
+}
+
+// PhotosGetOwnerPhotoUploadServerResponse struct.
+type PhotosGetOwnerPhotoUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// PhotosGetOwnerPhotoUploadServer returns an upload server address for a
+// profile or community photo.
+//
+// https://vk.com/dev/photos.getOwnerPhotoUploadServer
+func (vk *VK) PhotosGetOwnerPhotoUploadServer(params Params) (
+ response PhotosGetOwnerPhotoUploadServerResponse,
+ err error,
+) {
+ err = vk.RequestUnmarshal("photos.getOwnerPhotoUploadServer", &response, params)
+ return
+}
+
+// PhotosGetTagsResponse struct.
+type PhotosGetTagsResponse []object.PhotosPhotoTag
+
+// PhotosGetTags returns a list of tags on a photo.
+//
+// https://vk.com/dev/photos.getTags
+func (vk *VK) PhotosGetTags(params Params) (response PhotosGetTagsResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getTags", &response, params)
+ return
+}
+
+// PhotosGetUploadServerResponse struct.
+type PhotosGetUploadServerResponse object.PhotosPhotoUpload
+
+// PhotosGetUploadServer returns the server address for photo upload.
+//
+// https://vk.com/dev/photos.getUploadServer
+func (vk *VK) PhotosGetUploadServer(params Params) (response PhotosGetUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getUploadServer", &response, params)
+ return
+}
+
+// PhotosGetUserPhotosResponse struct.
+type PhotosGetUserPhotosResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhoto `json:"items"`
+}
+
+// PhotosGetUserPhotos returns a list of photos in which a user is tagged.
+//
+// extended=0
+//
+// https://vk.com/dev/photos.getUserPhotos
+func (vk *VK) PhotosGetUserPhotos(params Params) (response PhotosGetUserPhotosResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getUserPhotos", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PhotosGetUserPhotosExtendedResponse struct.
+type PhotosGetUserPhotosExtendedResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhotoFull `json:"items"`
+}
+
+// PhotosGetUserPhotosExtended returns a list of photos in which a user is tagged.
+//
+// extended=1
+//
+// https://vk.com/dev/photos.getUserPhotos
+func (vk *VK) PhotosGetUserPhotosExtended(params Params) (response PhotosGetUserPhotosExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getUserPhotos", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PhotosGetWallUploadServerResponse struct.
+type PhotosGetWallUploadServerResponse object.PhotosPhotoUpload
+
+// PhotosGetWallUploadServer returns the server address for photo upload onto a user's wall.
+//
+// https://vk.com/dev/photos.getWallUploadServer
+func (vk *VK) PhotosGetWallUploadServer(params Params) (response PhotosGetWallUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("photos.getWallUploadServer", &response, params)
+ return
+}
+
+// PhotosMakeCover makes a photo into an album cover.
+//
+// https://vk.com/dev/photos.makeCover
+func (vk *VK) PhotosMakeCover(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.makeCover", &response, params)
+ return
+}
+
+// PhotosMove a photo from one album to another.
+//
+// https://vk.com/dev/photos.moveMoves
+func (vk *VK) PhotosMove(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.move", &response, params)
+ return
+}
+
+// PhotosPutTag adds a tag on the photo.
+//
+// https://vk.com/dev/photos.putTag
+func (vk *VK) PhotosPutTag(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.putTag", &response, params)
+ return
+}
+
+// PhotosRemoveTag removes a tag from a photo.
+//
+// https://vk.com/dev/photos.removeTag
+func (vk *VK) PhotosRemoveTag(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.removeTag", &response, params)
+ return
+}
+
+// PhotosReorderAlbums reorders the album in the list of user albums.
+//
+// https://vk.com/dev/photos.reorderAlbums
+func (vk *VK) PhotosReorderAlbums(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.reorderAlbums", &response, params)
+ return
+}
+
+// PhotosReorderPhotos reorders the photo in the list of photos of the user album.
+//
+// https://vk.com/dev/photos.reorderPhotos
+func (vk *VK) PhotosReorderPhotos(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.reorderPhotos", &response, params)
+ return
+}
+
+// PhotosReport reports (submits a complaint about) a photo.
+//
+// https://vk.com/dev/photos.report
+func (vk *VK) PhotosReport(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.report", &response, params)
+ return
+}
+
+// PhotosReportComment reports (submits a complaint about) a comment on a photo.
+//
+// https://vk.com/dev/photos.reportComment
+func (vk *VK) PhotosReportComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.reportComment", &response, params)
+ return
+}
+
+// PhotosRestore restores a deleted photo.
+//
+// https://vk.com/dev/photos.restore
+func (vk *VK) PhotosRestore(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.restore", &response, params)
+ return
+}
+
+// PhotosRestoreComment restores a deleted comment on a photo.
+//
+// https://vk.com/dev/photos.restoreComment
+func (vk *VK) PhotosRestoreComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("photos.restoreComment", &response, params)
+ return
+}
+
+// PhotosSaveResponse struct.
+type PhotosSaveResponse []object.PhotosPhoto
+
+// PhotosSave saves photos after successful uploading.
+//
+// https://vk.com/dev/photos.save
+func (vk *VK) PhotosSave(params Params) (response PhotosSaveResponse, err error) {
+ err = vk.RequestUnmarshal("photos.save", &response, params)
+ return
+}
+
+// PhotosSaveMarketAlbumPhotoResponse struct.
+type PhotosSaveMarketAlbumPhotoResponse []object.PhotosPhoto
+
+// PhotosSaveMarketAlbumPhoto photo Saves market album photos after successful uploading.
+//
+// https://vk.com/dev/photos.saveMarketAlbumPhoto
+func (vk *VK) PhotosSaveMarketAlbumPhoto(params Params) (response PhotosSaveMarketAlbumPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("photos.saveMarketAlbumPhoto", &response, params)
+ return
+}
+
+// PhotosSaveMarketPhotoResponse struct.
+type PhotosSaveMarketPhotoResponse []object.PhotosPhoto
+
+// PhotosSaveMarketPhoto saves market photos after successful uploading.
+//
+// https://vk.com/dev/photos.saveMarketPhoto
+func (vk *VK) PhotosSaveMarketPhoto(params Params) (response PhotosSaveMarketPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("photos.saveMarketPhoto", &response, params)
+ return
+}
+
+// PhotosSaveMessagesPhotoResponse struct.
+type PhotosSaveMessagesPhotoResponse []object.PhotosPhoto
+
+// PhotosSaveMessagesPhoto saves a photo after being successfully.
+//
+// https://vk.com/dev/photos.saveMessagesPhoto
+func (vk *VK) PhotosSaveMessagesPhoto(params Params) (response PhotosSaveMessagesPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("photos.saveMessagesPhoto", &response, params)
+ return
+}
+
+// PhotosSaveOwnerCoverPhotoResponse struct.
+type PhotosSaveOwnerCoverPhotoResponse struct {
+ Images []object.PhotosImage `json:"images"`
+}
+
+// PhotosSaveOwnerCoverPhoto saves cover photo after successful uploading.
+//
+// https://vk.com/dev/photos.saveOwnerCoverPhoto
+func (vk *VK) PhotosSaveOwnerCoverPhoto(params Params) (response PhotosSaveOwnerCoverPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("photos.saveOwnerCoverPhoto", &response, params)
+ return
+}
+
+// PhotosSaveOwnerPhotoResponse struct.
+type PhotosSaveOwnerPhotoResponse struct {
+ PhotoHash string `json:"photo_hash"`
+ PhotoSrc string `json:"photo_src"`
+ PhotoSrcBig string `json:"photo_src_big"`
+ PhotoSrcSmall string `json:"photo_src_small"`
+ Saved int `json:"saved"`
+ PostID int `json:"post_id"`
+}
+
+// PhotosSaveOwnerPhoto saves a profile or community photo.
+//
+// https://vk.com/dev/photos.saveOwnerPhoto
+func (vk *VK) PhotosSaveOwnerPhoto(params Params) (response PhotosSaveOwnerPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("photos.saveOwnerPhoto", &response, params)
+ return
+}
+
+// PhotosSaveWallPhotoResponse struct.
+type PhotosSaveWallPhotoResponse []object.PhotosPhoto
+
+// PhotosSaveWallPhoto saves a photo to a user's or community's wall after being uploaded.
+//
+// https://vk.com/dev/photos.saveWallPhoto
+func (vk *VK) PhotosSaveWallPhoto(params Params) (response PhotosSaveWallPhotoResponse, err error) {
+ err = vk.RequestUnmarshal("photos.saveWallPhoto", &response, params)
+ return
+}
+
+// PhotosSearchResponse struct.
+type PhotosSearchResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PhotosPhotoFull `json:"items"`
+}
+
+// PhotosSearch returns a list of photos.
+//
+// https://vk.com/dev/photos.search
+func (vk *VK) PhotosSearch(params Params) (response PhotosSearchResponse, err error) {
+ err = vk.RequestUnmarshal("photos.search", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/podcasts.go b/vendor/github.com/SevereCloud/vksdk/v2/api/podcasts.go
new file mode 100644
index 00000000..8534d0fc
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/podcasts.go
@@ -0,0 +1,179 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// PodcastsGetCatalogResponse struct.
+type PodcastsGetCatalogResponse struct {
+ Items []object.PodcastsItem `json:"items"`
+}
+
+// PodcastsGetCatalog method.
+//
+// extended=0
+//
+// https://vk.com/dev/podcasts.getCatalog
+func (vk *VK) PodcastsGetCatalog(params Params) (response PodcastsGetCatalogResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getCatalog", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PodcastsGetCatalogExtendedResponse struct.
+type PodcastsGetCatalogExtendedResponse struct {
+ Items []object.PodcastsItem `json:"items"`
+ object.ExtendedResponse
+}
+
+// PodcastsGetCatalogExtended method.
+//
+// extended=1
+//
+// https://vk.com/dev/podcasts.getCatalog
+func (vk *VK) PodcastsGetCatalogExtended(params Params) (response PodcastsGetCatalogExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getCatalog", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PodcastsGetCategoriesResponse struct.
+type PodcastsGetCategoriesResponse []object.PodcastsCategory
+
+// PodcastsGetCategories method.
+//
+// https://vk.com/dev/podcasts.getCategories
+func (vk *VK) PodcastsGetCategories(params Params) (response PodcastsGetCategoriesResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getCategories", &response, params)
+ return
+}
+
+// PodcastsGetEpisodesResponse struct.
+type PodcastsGetEpisodesResponse struct {
+ Count int `json:"count"`
+ Items []object.PodcastsEpisode `json:"items"`
+}
+
+// PodcastsGetEpisodes method.
+//
+// https://vk.com/dev/podcasts.getEpisodes
+func (vk *VK) PodcastsGetEpisodes(params Params) (response PodcastsGetEpisodesResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getEpisodes", &response, params)
+ return
+}
+
+// PodcastsGetFeedResponse struct.
+type PodcastsGetFeedResponse struct {
+ Items []object.PodcastsEpisode `json:"items"`
+ NextFrom string `json:"next_from"`
+}
+
+// PodcastsGetFeed method.
+//
+// extended=0
+//
+// https://vk.com/dev/podcasts.getFeed
+func (vk *VK) PodcastsGetFeed(params Params) (response PodcastsGetFeedResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getFeed", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PodcastsGetFeedExtendedResponse struct.
+type PodcastsGetFeedExtendedResponse struct {
+ Items []object.PodcastsEpisode `json:"items"`
+ NextFrom string `json:"next_from"`
+ object.ExtendedResponse
+}
+
+// PodcastsGetFeedExtended method.
+//
+// extended=1
+//
+// https://vk.com/dev/podcasts.getFeed
+func (vk *VK) PodcastsGetFeedExtended(params Params) (response PodcastsGetFeedExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getFeed", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PodcastsGetStartPageResponse struct.
+type PodcastsGetStartPageResponse struct {
+ Order []string `json:"order"`
+ InProgress []object.PodcastsEpisode `json:"in_progress"`
+ Bookmarks []object.PodcastsEpisode `json:"bookmarks"`
+ Articles []object.Article `json:"articles"`
+ StaticHowTo []bool `json:"static_how_to"`
+ FriendsLiked []object.PodcastsEpisode `json:"friends_liked"`
+ Subscriptions []object.PodcastsEpisode `json:"subscriptions"`
+ CategoriesList []object.PodcastsCategory `json:"categories_list"`
+ RecommendedEpisodes []object.PodcastsEpisode `json:"recommended_episodes"`
+ Catalog []struct {
+ Category object.PodcastsCategory `json:"category"`
+ Items []object.PodcastsItem `json:"items"`
+ } `json:"catalog"`
+}
+
+// PodcastsGetStartPage method.
+//
+// extended=0
+//
+// https://vk.com/dev/podcasts.getStartPage
+func (vk *VK) PodcastsGetStartPage(params Params) (response PodcastsGetStartPageResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getStartPage", &response, params, Params{"extended": false})
+
+ return
+}
+
+// PodcastsGetStartPageExtendedResponse struct.
+type PodcastsGetStartPageExtendedResponse struct {
+ Order []string `json:"order"`
+ InProgress []object.PodcastsEpisode `json:"in_progress"`
+ Bookmarks []object.PodcastsEpisode `json:"bookmarks"`
+ Articles []object.Article `json:"articles"`
+ StaticHowTo []bool `json:"static_how_to"`
+ FriendsLiked []object.PodcastsEpisode `json:"friends_liked"`
+ Subscriptions []object.PodcastsEpisode `json:"subscriptions"`
+ CategoriesList []object.PodcastsCategory `json:"categories_list"`
+ RecommendedEpisodes []object.PodcastsEpisode `json:"recommended_episodes"`
+ Catalog []struct {
+ Category object.PodcastsCategory `json:"category"`
+ Items []object.PodcastsItem `json:"items"`
+ } `json:"catalog"`
+ object.ExtendedResponse
+}
+
+// PodcastsGetStartPageExtended method.
+//
+// extended=1
+//
+// https://vk.com/dev/podcasts.getStartPage
+func (vk *VK) PodcastsGetStartPageExtended(params Params) (response PodcastsGetStartPageExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("podcasts.getStartPage", &response, params, Params{"extended": true})
+
+ return
+}
+
+// PodcastsMarkAsListened method.
+//
+// https://vk.com/dev/podcasts.markAsListened
+func (vk *VK) PodcastsMarkAsListened(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("podcasts.markAsListened", &response, params)
+ return
+}
+
+// PodcastsSubscribe method.
+//
+// https://vk.com/dev/podcasts.subscribe
+func (vk *VK) PodcastsSubscribe(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("podcasts.subscribe", &response, params)
+ return
+}
+
+// PodcastsUnsubscribe method.
+//
+// https://vk.com/dev/podcasts.unsubscribe
+func (vk *VK) PodcastsUnsubscribe(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("podcasts.unsubscribe", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/polls.go b/vendor/github.com/SevereCloud/vksdk/v2/api/polls.go
new file mode 100644
index 00000000..968b242e
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/polls.go
@@ -0,0 +1,106 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import "github.com/SevereCloud/vksdk/v2/object"
+
+// PollsAddVote adds the current user's vote to the selected answer in the poll.
+//
+// https://vk.com/dev/polls.addVote
+func (vk *VK) PollsAddVote(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("polls.addVote", &response, params)
+ return
+}
+
+// PollsCreateResponse struct.
+type PollsCreateResponse object.PollsPoll
+
+// PollsCreate creates polls that can be attached to the users' or communities' posts.
+//
+// https://vk.com/dev/polls.create
+func (vk *VK) PollsCreate(params Params) (response PollsCreateResponse, err error) {
+ err = vk.RequestUnmarshal("polls.create", &response, params)
+ return
+}
+
+// PollsDeleteVote deletes the current user's vote from the selected answer in the poll.
+//
+// https://vk.com/dev/polls.deleteVote
+func (vk *VK) PollsDeleteVote(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("polls.deleteVote", &response, params)
+ return
+}
+
+// PollsEdit edits created polls.
+//
+// https://vk.com/dev/polls.edit
+func (vk *VK) PollsEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("polls.edit", &response, params)
+ return
+}
+
+// PollsGetBackgroundsResponse struct.
+type PollsGetBackgroundsResponse []object.PollsBackground
+
+// PollsGetBackgrounds return default backgrounds for polls.
+//
+// https://vk.com/dev/polls.getBackgrounds
+func (vk *VK) PollsGetBackgrounds(params Params) (response PollsGetBackgroundsResponse, err error) {
+ err = vk.RequestUnmarshal("polls.getBackgrounds", &response, params)
+ return
+}
+
+// PollsGetByIDResponse struct.
+type PollsGetByIDResponse object.PollsPoll
+
+// PollsGetByID returns detailed information about a poll by its ID.
+//
+// https://vk.com/dev/polls.getById
+func (vk *VK) PollsGetByID(params Params) (response PollsGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("polls.getById", &response, params)
+ return
+}
+
+// PollsGetPhotoUploadServerResponse struct.
+type PollsGetPhotoUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+}
+
+// PollsGetPhotoUploadServer returns a URL for uploading a photo to a poll.
+//
+// https://vk.com/dev/polls.getPhotoUploadServer
+func (vk *VK) PollsGetPhotoUploadServer(params Params) (response PollsGetPhotoUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("polls.getPhotoUploadServer", &response, params)
+ return
+}
+
+// PollsGetVotersResponse struct.
+type PollsGetVotersResponse []object.PollsVoters
+
+// PollsGetVoters returns a list of IDs of users who selected specific answers in the poll.
+//
+// https://vk.com/dev/polls.getVoters
+func (vk *VK) PollsGetVoters(params Params) (response PollsGetVotersResponse, err error) {
+ err = vk.RequestUnmarshal("polls.getVoters", &response, params)
+ return
+}
+
+// PollsGetVotersFieldsResponse struct.
+type PollsGetVotersFieldsResponse []object.PollsVotersFields
+
+// PollsGetVotersFields returns a list of IDs of users who selected specific answers in the poll.
+//
+// https://vk.com/dev/polls.getVoters
+func (vk *VK) PollsGetVotersFields(params Params) (response PollsGetVotersFieldsResponse, err error) {
+ err = vk.RequestUnmarshal("polls.getVoters", &response, params)
+ return
+}
+
+// PollsSavePhotoResponse struct.
+type PollsSavePhotoResponse object.PollsPhoto
+
+// PollsSavePhoto allows to save poll's uploaded photo.
+//
+// https://vk.com/dev/polls.savePhoto
+func (vk *VK) PollsSavePhoto(params Params) (response PollsSavePhotoResponse, err error) {
+ err = vk.RequestUnmarshal("polls.savePhoto", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/prettycards.go b/vendor/github.com/SevereCloud/vksdk/v2/api/prettycards.go
new file mode 100644
index 00000000..c51f5efa
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/prettycards.go
@@ -0,0 +1,79 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import "github.com/SevereCloud/vksdk/v2/object"
+
+// PrettyCardsCreateResponse struct.
+type PrettyCardsCreateResponse struct {
+ OwnerID int `json:"owner_id"` // Owner ID of created pretty card
+ CardID string `json:"card_id"` // Card ID of created pretty card
+}
+
+// PrettyCardsCreate method.
+//
+// https://vk.com/dev/prettyCards.create
+func (vk *VK) PrettyCardsCreate(params Params) (response PrettyCardsCreateResponse, err error) {
+ err = vk.RequestUnmarshal("prettyCards.create", &response, params)
+ return
+}
+
+// PrettyCardsDeleteResponse struct.
+type PrettyCardsDeleteResponse struct {
+ OwnerID int `json:"owner_id"` // Owner ID of created pretty card
+ CardID string `json:"card_id"` // Card ID of created pretty card
+ Error string `json:"error"` // Error reason if error happened
+}
+
+// PrettyCardsDelete method.
+//
+// https://vk.com/dev/prettyCards.delete
+func (vk *VK) PrettyCardsDelete(params Params) (response PrettyCardsDeleteResponse, err error) {
+ err = vk.RequestUnmarshal("prettyCards.delete", &response, params)
+ return
+}
+
+// PrettyCardsEditResponse struct.
+type PrettyCardsEditResponse struct {
+ OwnerID int `json:"owner_id"` // Owner ID of created pretty card
+ CardID string `json:"card_id"` // Card ID of created pretty card
+}
+
+// PrettyCardsEdit method.
+//
+// https://vk.com/dev/prettyCards.edit
+func (vk *VK) PrettyCardsEdit(params Params) (response PrettyCardsEditResponse, err error) {
+ err = vk.RequestUnmarshal("prettyCards.edit", &response, params)
+ return
+}
+
+// PrettyCardsGetResponse struct.
+type PrettyCardsGetResponse struct {
+ Count int `json:"count"` // Total number
+ Items []object.PrettyCardsPrettyCard `json:"items"`
+}
+
+// PrettyCardsGet method.
+//
+// https://vk.com/dev/prettyCards.get
+func (vk *VK) PrettyCardsGet(params Params) (response PrettyCardsGetResponse, err error) {
+ err = vk.RequestUnmarshal("prettyCards.get", &response, params)
+ return
+}
+
+// PrettyCardsGetByIDResponse struct.
+type PrettyCardsGetByIDResponse []object.PrettyCardsPrettyCard
+
+// PrettyCardsGetByID method.
+//
+// https://vk.com/dev/prettyCards.getById
+func (vk *VK) PrettyCardsGetByID(params Params) (response PrettyCardsGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("prettyCards.getById", &response, params)
+ return
+}
+
+// PrettyCardsGetUploadURL method.
+//
+// https://vk.com/dev/prettyCards.getUploadURL
+func (vk *VK) PrettyCardsGetUploadURL(params Params) (response string, err error) {
+ err = vk.RequestUnmarshal("prettyCards.getUploadURL", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/search.go b/vendor/github.com/SevereCloud/vksdk/v2/api/search.go
new file mode 100644
index 00000000..0d9f9549
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/search.go
@@ -0,0 +1,17 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import "github.com/SevereCloud/vksdk/v2/object"
+
+// SearchGetHintsResponse struct.
+type SearchGetHintsResponse struct {
+ Count int `json:"count"`
+ Items []object.SearchHint `json:"items"`
+}
+
+// SearchGetHints allows the programmer to do a quick search for any substring.
+//
+// https://vk.com/dev/search.getHints
+func (vk *VK) SearchGetHints(params Params) (response SearchGetHintsResponse, err error) {
+ err = vk.RequestUnmarshal("search.getHints", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/secure.go b/vendor/github.com/SevereCloud/vksdk/v2/api/secure.go
new file mode 100644
index 00000000..b5637f24
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/secure.go
@@ -0,0 +1,110 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// SecureAddAppEventResponse struct.
+type SecureAddAppEventResponse int // FIXME: not found documentation. https://github.com/VKCOM/vk-api-schema/issues/98
+
+// SecureAddAppEvent adds user activity information to an application.
+//
+// https://vk.com/dev/secure.addAppEvent
+func (vk *VK) SecureAddAppEvent(params Params) (response SecureAddAppEventResponse, err error) {
+ err = vk.RequestUnmarshal("secure.addAppEvent", &response, params)
+ return
+}
+
+// SecureCheckTokenResponse struct.
+type SecureCheckTokenResponse object.SecureTokenChecked
+
+// SecureCheckToken checks the user authentication in IFrame and Flash apps using the access_token parameter.
+//
+// https://vk.com/dev/secure.checkToken
+func (vk *VK) SecureCheckToken(params Params) (response SecureCheckTokenResponse, err error) {
+ err = vk.RequestUnmarshal("secure.checkToken", &response, params)
+ return
+}
+
+// SecureGetAppBalance returns payment balance of the application in hundredth of a vote.
+//
+// https://vk.com/dev/secure.getAppBalance
+func (vk *VK) SecureGetAppBalance(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("secure.getAppBalance", &response, params)
+ return
+}
+
+// SecureGetSMSHistoryResponse struct.
+type SecureGetSMSHistoryResponse []object.SecureSmsNotification
+
+// SecureGetSMSHistory shows a list of SMS notifications sent by the
+// application using secure.sendSMSNotification method.
+//
+// https://vk.com/dev/secure.getSMSHistory
+func (vk *VK) SecureGetSMSHistory(params Params) (response SecureGetSMSHistoryResponse, err error) {
+ err = vk.RequestUnmarshal("secure.getSMSHistory", &response, params)
+ return
+}
+
+// SecureGetTransactionsHistoryResponse struct.
+type SecureGetTransactionsHistoryResponse []object.SecureTransaction
+
+// SecureGetTransactionsHistory shows history of votes transaction between users and the application.
+//
+// https://vk.com/dev/secure.getTransactionsHistory
+func (vk *VK) SecureGetTransactionsHistory(params Params) (response SecureGetTransactionsHistoryResponse, err error) {
+ err = vk.RequestUnmarshal("secure.getTransactionsHistory", &response, params)
+ return
+}
+
+// SecureGetUserLevelResponse struct.
+type SecureGetUserLevelResponse []object.SecureLevel
+
+// SecureGetUserLevel returns one of the previously set game levels of one or more users in the application.
+//
+// https://vk.com/dev/secure.getUserLevel
+func (vk *VK) SecureGetUserLevel(params Params) (response SecureGetUserLevelResponse, err error) {
+ err = vk.RequestUnmarshal("secure.getUserLevel", &response, params)
+ return
+}
+
+// SecureGiveEventStickerResponse struct.
+type SecureGiveEventStickerResponse []struct {
+ UserID int `json:"user_id"`
+ Status string `json:"status"`
+}
+
+// SecureGiveEventSticker method.
+//
+// https://vk.com/dev/secure.giveEventSticker
+func (vk *VK) SecureGiveEventSticker(params Params) (response SecureGiveEventStickerResponse, err error) {
+ err = vk.RequestUnmarshal("secure.giveEventSticker", &response, params)
+ return
+}
+
+// SecureSendNotificationResponse struct.
+type SecureSendNotificationResponse []int // User ID
+
+// SecureSendNotification sends notification to the user.
+//
+// https://vk.com/dev/secure.sendNotification
+func (vk *VK) SecureSendNotification(params Params) (response SecureSendNotificationResponse, err error) {
+ err = vk.RequestUnmarshal("secure.sendNotification", &response, params)
+ return
+}
+
+// SecureSendSMSNotification sends SMS notification to a user's mobile device.
+//
+// https://vk.com/dev/secure.sendSMSNotification
+func (vk *VK) SecureSendSMSNotification(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("secure.sendSMSNotification", &response, params)
+ return
+}
+
+// SecureSetCounter sets a counter which is shown to the user in bold in the left menu.
+//
+// https://vk.com/dev/secure.setCounter
+func (vk *VK) SecureSetCounter(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("secure.setCounter", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/stats.go b/vendor/github.com/SevereCloud/vksdk/v2/api/stats.go
new file mode 100644
index 00000000..86572e01
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/stats.go
@@ -0,0 +1,35 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// StatsGetResponse struct.
+type StatsGetResponse []object.StatsPeriod
+
+// StatsGet returns statistics of a community or an application.
+//
+// https://vk.com/dev/stats.get
+func (vk *VK) StatsGet(params Params) (response StatsGetResponse, err error) {
+ err = vk.RequestUnmarshal("stats.get", &response, params)
+ return
+}
+
+// StatsGetPostReachResponse struct.
+type StatsGetPostReachResponse []object.StatsWallpostStat
+
+// StatsGetPostReach returns stats for a wall post.
+//
+// https://vk.com/dev/stats.getPostReach
+func (vk *VK) StatsGetPostReach(params Params) (response StatsGetPostReachResponse, err error) {
+ err = vk.RequestUnmarshal("stats.getPostReach", &response, params)
+ return
+}
+
+// StatsTrackVisitor adds current session's data in the application statistics.
+//
+// https://vk.com/dev/stats.trackVisitor
+func (vk *VK) StatsTrackVisitor(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("stats.trackVisitor", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/status.go b/vendor/github.com/SevereCloud/vksdk/v2/api/status.go
new file mode 100644
index 00000000..e9bb7775
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/status.go
@@ -0,0 +1,23 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// StatusGetResponse struct.
+type StatusGetResponse struct {
+ Audio object.AudioAudio `json:"audio"`
+ Text string `json:"text"`
+}
+
+// StatusGet returns data required to show the status of a user or community.
+func (vk *VK) StatusGet(params Params) (response StatusGetResponse, err error) {
+ err = vk.RequestUnmarshal("status.get", &response, params)
+ return
+}
+
+// StatusSet sets a new status for the current user.
+func (vk *VK) StatusSet(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("status.set", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/storage.go b/vendor/github.com/SevereCloud/vksdk/v2/api/storage.go
new file mode 100644
index 00000000..ed1d8c64
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/storage.go
@@ -0,0 +1,48 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// StorageGetResponse struct.
+type StorageGetResponse []object.BaseRequestParam
+
+// ToMap return map from StorageGetResponse.
+func (s StorageGetResponse) ToMap() map[string]string {
+ m := make(map[string]string)
+ for _, item := range s {
+ m[item.Key] = item.Value
+ }
+
+ return m
+}
+
+// StorageGet returns a value of variable with the name set by key parameter.
+//
+// StorageGet always return array!
+//
+// https://vk.com/dev/storage.get
+func (vk *VK) StorageGet(params Params) (response StorageGetResponse, err error) {
+ err = vk.RequestUnmarshal("storage.get", &response, params)
+
+ return
+}
+
+// StorageGetKeysResponse struct.
+type StorageGetKeysResponse []string
+
+// StorageGetKeys returns the names of all variables.
+//
+// https://vk.com/dev/storage.getKeys
+func (vk *VK) StorageGetKeys(params Params) (response StorageGetKeysResponse, err error) {
+ err = vk.RequestUnmarshal("storage.getKeys", &response, params)
+ return
+}
+
+// StorageSet saves a value of variable with the name set by key parameter.
+//
+// https://vk.com/dev/storage.set
+func (vk *VK) StorageSet(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("storage.set", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/stories.go b/vendor/github.com/SevereCloud/vksdk/v2/api/stories.go
new file mode 100644
index 00000000..46c643b9
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/stories.go
@@ -0,0 +1,305 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import "github.com/SevereCloud/vksdk/v2/object"
+
+// StoriesBanOwner allows to hide stories from chosen sources from current user's feed.
+//
+// https://vk.com/dev/stories.banOwner
+func (vk *VK) StoriesBanOwner(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("stories.banOwner", &response, params)
+ return
+}
+
+// StoriesDelete allows to delete story.
+//
+// https://vk.com/dev/stories.delete
+func (vk *VK) StoriesDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("stories.delete", &response, params)
+ return
+}
+
+// StoriesGetResponse struct.
+type StoriesGetResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesFeedItem `json:"items"`
+ PromoData object.StoriesPromoData `json:"promo_data"`
+ NeedUploadScreen object.BaseBoolInt `json:"need_upload_screen"`
+}
+
+// StoriesGet returns stories available for current user.
+//
+// extended=0
+//
+// https://vk.com/dev/stories.get
+func (vk *VK) StoriesGet(params Params) (response StoriesGetResponse, err error) {
+ err = vk.RequestUnmarshal("stories.get", &response, params, Params{"extended": false})
+
+ return
+}
+
+// StoriesGetExtendedResponse struct.
+type StoriesGetExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesFeedItem `json:"items"`
+ PromoData object.StoriesPromoData `json:"promo_data"`
+ NeedUploadScreen object.BaseBoolInt `json:"need_upload_screen"`
+ object.ExtendedResponse
+}
+
+// StoriesGetExtended returns stories available for current user.
+//
+// extended=1
+//
+// https://vk.com/dev/stories.get
+func (vk *VK) StoriesGetExtended(params Params) (response StoriesGetExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("stories.get", &response, params, Params{"extended": true})
+
+ return
+}
+
+// StoriesGetBannedResponse struct.
+type StoriesGetBannedResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// StoriesGetBanned returns list of sources hidden from current user's feed.
+//
+// extended=0
+//
+// https://vk.com/dev/stories.getBanned
+func (vk *VK) StoriesGetBanned(params Params) (response StoriesGetBannedResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getBanned", &response, params, Params{"extended": false})
+
+ return
+}
+
+// StoriesGetBannedExtendedResponse struct.
+type StoriesGetBannedExtendedResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+ object.ExtendedResponse
+}
+
+// StoriesGetBannedExtended returns list of sources hidden from current user's feed.
+//
+// extended=1
+//
+// https://vk.com/dev/stories.getBanned
+func (vk *VK) StoriesGetBannedExtended(params Params) (response StoriesGetBannedExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getBanned", &response, params, Params{"extended": true})
+
+ return
+}
+
+// StoriesGetByIDResponse struct.
+type StoriesGetByIDResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesStory `json:"items"`
+}
+
+// StoriesGetByID returns story by its ID.
+//
+// extended=0
+//
+// https://vk.com/dev/stories.getById
+func (vk *VK) StoriesGetByID(params Params) (response StoriesGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getById", &response, params, Params{"extended": false})
+
+ return
+}
+
+// StoriesGetByIDExtendedResponse struct.
+type StoriesGetByIDExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesStory `json:"items"`
+ object.ExtendedResponse
+}
+
+// StoriesGetByIDExtended returns story by its ID.
+//
+// extended=1
+//
+// https://vk.com/dev/stories.getById
+func (vk *VK) StoriesGetByIDExtended(params Params) (response StoriesGetByIDExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getById", &response, params, Params{"extended": true})
+
+ return
+}
+
+// StoriesGetPhotoUploadServerResponse struct.
+type StoriesGetPhotoUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+ PeerIDs []int `json:"peer_ids"`
+ UserIDs []int `json:"user_ids"`
+}
+
+// StoriesGetPhotoUploadServer returns URL for uploading a story with photo.
+//
+// https://vk.com/dev/stories.getPhotoUploadServer
+func (vk *VK) StoriesGetPhotoUploadServer(params Params) (response StoriesGetPhotoUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getPhotoUploadServer", &response, params)
+ return
+}
+
+// StoriesGetRepliesResponse struct.
+type StoriesGetRepliesResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesFeedItem `json:"items"`
+}
+
+// StoriesGetReplies returns replies to the story.
+//
+// extended=0
+//
+// https://vk.com/dev/stories.getReplies
+func (vk *VK) StoriesGetReplies(params Params) (response StoriesGetRepliesResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getReplies", &response, params, Params{"extended": false})
+
+ return
+}
+
+// StoriesGetRepliesExtendedResponse struct.
+type StoriesGetRepliesExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesFeedItem `json:"items"`
+ object.ExtendedResponse
+}
+
+// StoriesGetRepliesExtended returns replies to the story.
+//
+// extended=1
+//
+// https://vk.com/dev/stories.getReplies
+func (vk *VK) StoriesGetRepliesExtended(params Params) (response StoriesGetRepliesExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getReplies", &response, params, Params{"extended": true})
+
+ return
+}
+
+// StoriesGetStatsResponse struct.
+type StoriesGetStatsResponse object.StoriesStoryStats
+
+// StoriesGetStats return statistics data for the story.
+//
+// https://vk.com/dev/stories.getStats
+func (vk *VK) StoriesGetStats(params Params) (response StoriesGetStatsResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getStats", &response, params)
+ return
+}
+
+// StoriesGetVideoUploadServerResponse struct.
+type StoriesGetVideoUploadServerResponse struct {
+ UploadURL string `json:"upload_url"`
+ PeerIDs []int `json:"peer_ids"`
+ UserIDs []int `json:"user_ids"`
+}
+
+// StoriesGetVideoUploadServer allows to receive URL for uploading story with video.
+//
+// https://vk.com/dev/stories.getVideoUploadServer
+func (vk *VK) StoriesGetVideoUploadServer(params Params) (response StoriesGetVideoUploadServerResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getVideoUploadServer", &response, params)
+ return
+}
+
+// StoriesGetViewersResponse struct.
+type StoriesGetViewersResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesViewer `json:"items"`
+}
+
+// StoriesGetViewers returns a list of story viewers.
+//
+// extended=0
+//
+// https://vk.com/dev/stories.getViewers
+func (vk *VK) StoriesGetViewers(params Params) (response StoriesGetViewersResponse, err error) {
+ err = vk.RequestUnmarshal("stories.getViewers", &response, params)
+
+ return
+}
+
+// StoriesHideAllReplies hides all replies in the last 24 hours from the user to current user's stories.
+//
+// https://vk.com/dev/stories.hideAllReplies
+func (vk *VK) StoriesHideAllReplies(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("stories.hideAllReplies", &response, params)
+ return
+}
+
+// StoriesHideReply hides the reply to the current user's story.
+//
+// https://vk.com/dev/stories.hideReply
+func (vk *VK) StoriesHideReply(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("stories.hideReply", &response, params)
+ return
+}
+
+// StoriesSaveResponse struct.
+type StoriesSaveResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesStory `json:"items"`
+}
+
+// StoriesSave method.
+//
+// https://vk.com/dev/stories.save
+func (vk *VK) StoriesSave(params Params) (response StoriesSaveResponse, err error) {
+ err = vk.RequestUnmarshal("stories.save", &response, params)
+ return
+}
+
+// StoriesSearchResponse struct.
+type StoriesSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesFeedItem `json:"items"`
+}
+
+// StoriesSearch returns search results for stories.
+//
+// extended=0
+//
+// https://vk.com/dev/stories.search
+func (vk *VK) StoriesSearch(params Params) (response StoriesSearchResponse, err error) {
+ err = vk.RequestUnmarshal("stories.search", &response, params, Params{"extended": false})
+
+ return
+}
+
+// StoriesSearchExtendedResponse struct.
+type StoriesSearchExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.StoriesFeedItem `json:"items"`
+ object.ExtendedResponse
+}
+
+// StoriesSearchExtended returns search results for stories.
+//
+// extended=1
+//
+// https://vk.com/dev/stories.search
+func (vk *VK) StoriesSearchExtended(params Params) (response StoriesSearchExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("stories.search", &response, params, Params{"extended": true})
+
+ return
+}
+
+// StoriesSendInteraction sends feedback to the story.
+//
+// Available for applications with type VK Mini Apps. The default method is
+// not available to applications.
+//
+// https://vk.com/dev/stories.sendInteraction
+func (vk *VK) StoriesSendInteraction(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("stories.sendInteraction", &response, params)
+ return
+}
+
+// StoriesUnbanOwner allows to show stories from hidden sources in current user's feed.
+//
+// https://vk.com/dev/stories.unbanOwner
+func (vk *VK) StoriesUnbanOwner(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("stories.unbanOwner", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/streaming.go b/vendor/github.com/SevereCloud/vksdk/v2/api/streaming.go
new file mode 100644
index 00000000..c3484e69
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/streaming.go
@@ -0,0 +1,67 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+// StreamingGetServerURLResponse struct.
+type StreamingGetServerURLResponse struct {
+ Endpoint string `json:"endpoint"`
+ Key string `json:"key"`
+}
+
+// StreamingGetServerURL allows to receive data for the connection to Streaming API.
+//
+// https://vk.com/dev/streaming.getServerUrl
+func (vk *VK) StreamingGetServerURL(params Params) (response StreamingGetServerURLResponse, err error) {
+ err = vk.RequestUnmarshal("streaming.getServerUrl", &response, params)
+ return
+}
+
+// StreamingGetSettingsResponse struct.
+type StreamingGetSettingsResponse struct {
+ MonthlyLimit string `json:"monthly_limit"`
+}
+
+// StreamingGetSettings allows to receive monthly tier for Streaming API.
+//
+// https://vk.com/dev/streaming.getSettings
+func (vk *VK) StreamingGetSettings(params Params) (response StreamingGetSettingsResponse, err error) {
+ err = vk.RequestUnmarshal("streaming.getSettings", &response, params)
+ return
+}
+
+// StreamingGetStatsResponse struct.
+type StreamingGetStatsResponse []struct {
+ EventType string `json:"event_type"`
+ Stats []struct {
+ Timestamp int `json:"timestamp"`
+ Value int `json:"value"`
+ } `json:"stats"`
+}
+
+// StreamingGetStats allows to receive statistics for prepared and received events in Streaming API.
+//
+// https://vk.com/dev/streaming.getStats
+func (vk *VK) StreamingGetStats(params Params) (response StreamingGetStatsResponse, err error) {
+ err = vk.RequestUnmarshal("streaming.getStats", &response, params)
+ return
+}
+
+// StreamingGetStemResponse struct.
+type StreamingGetStemResponse struct {
+ Stem string `json:"stem"`
+}
+
+// StreamingGetStem allows to receive the stem of the word.
+//
+// https://vk.com/dev/streaming.getStem
+func (vk *VK) StreamingGetStem(params Params) (response StreamingGetStemResponse, err error) {
+ err = vk.RequestUnmarshal("streaming.getStem", &response, params)
+ return
+}
+
+// StreamingSetSettings allows to set monthly tier for Streaming API.
+//
+// https://vk.com/dev/streaming.setSettings
+func (vk *VK) StreamingSetSettings(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("streaming.setSettings", &response, params)
+
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/upload.go b/vendor/github.com/SevereCloud/vksdk/v2/api/upload.go
new file mode 100644
index 00000000..2c947c5d
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/upload.go
@@ -0,0 +1,961 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "bytes"
+ "encoding/json"
+ "io"
+ "io/ioutil"
+ "mime/multipart"
+
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// UploadFile uploading file.
+func (vk *VK) UploadFile(url string, file io.Reader, fieldname, filename string) (bodyContent []byte, err error) {
+ body := new(bytes.Buffer)
+ writer := multipart.NewWriter(body)
+
+ part, err := writer.CreateFormFile(fieldname, filename)
+ if err != nil {
+ return
+ }
+
+ _, err = io.Copy(part, file)
+ if err != nil {
+ return
+ }
+
+ contentType := writer.FormDataContentType()
+ _ = writer.Close()
+
+ resp, err := vk.Client.Post(url, contentType, body)
+ if err != nil {
+ return
+ }
+ defer resp.Body.Close()
+
+ bodyContent, err = ioutil.ReadAll(resp.Body)
+
+ return
+}
+
+// uploadPhoto uploading Photos into Album.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) uploadPhoto(params Params, file io.Reader) (response PhotosSaveResponse, err error) {
+ uploadServer, err := vk.PhotosGetUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "file1", "file1.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosPhotoUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.PhotosSave(Params{
+ "server": handler.Server,
+ "photos_list": handler.PhotosList,
+ "aid": handler.AID,
+ "hash": handler.Hash,
+ "album_id": params["album_id"],
+ "group_id": params["group_id"],
+ })
+
+ return
+}
+
+// UploadPhoto uploading Photos into User Album.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadPhoto(albumID int, file io.Reader) (response PhotosSaveResponse, err error) {
+ response, err = vk.uploadPhoto(Params{
+ "album_id": albumID,
+ }, file)
+
+ return
+}
+
+// UploadPhotoGroup uploading Photos into Group Album.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadPhotoGroup(groupID, albumID int, file io.Reader) (response PhotosSaveResponse, err error) {
+ response, err = vk.uploadPhoto(Params{
+ "album_id": albumID,
+ "group_id": groupID,
+ }, file)
+
+ return
+}
+
+// uploadWallPhoto uploading Photos on Wall.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) uploadWallPhoto(params Params, file io.Reader) (response PhotosSaveWallPhotoResponse, err error) {
+ uploadServer, err := vk.PhotosGetWallUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "photo", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosWallUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.PhotosSaveWallPhoto(Params{
+ "server": handler.Server,
+ "photo": handler.Photo,
+ "hash": handler.Hash,
+ "group_id": params["group_id"],
+ })
+
+ return
+}
+
+// UploadWallPhoto uploading Photos on User Wall.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadWallPhoto(file io.Reader) (response PhotosSaveWallPhotoResponse, err error) {
+ response, err = vk.uploadWallPhoto(Params{}, file)
+ return
+}
+
+// UploadGroupWallPhoto uploading Photos on Group Wall.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadGroupWallPhoto(groupID int, file io.Reader) (response PhotosSaveWallPhotoResponse, err error) {
+ response, err = vk.uploadWallPhoto(Params{
+ "group_id": groupID,
+ }, file)
+
+ return
+}
+
+// uploadOwnerPhoto uploading Photos into User Profile or Community
+// To upload a photo to a community send its negative id in the owner_id parameter.
+//
+// Following parameters can be sent in addition:
+// squareCrop in x,y,w (no quotes) format where x and y are the coordinates of
+// the preview upper-right corner and w is square side length.
+// That will create a square preview for a photo.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 200x200px, aspect ratio from 0.25 to 3,
+// width+height not more than 14000 px, file size up to 50 Mb.
+func (vk *VK) uploadOwnerPhoto(params Params, squareCrop string, file io.Reader) (
+ response PhotosSaveOwnerPhotoResponse,
+ err error,
+) {
+ uploadServer, err := vk.PhotosGetOwnerPhotoUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ body := new(bytes.Buffer)
+ writer := multipart.NewWriter(body)
+
+ part, err := writer.CreateFormFile("photo", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ _, err = io.Copy(part, file)
+ if err != nil {
+ return
+ }
+
+ contentType := writer.FormDataContentType()
+
+ if squareCrop != "" {
+ err = writer.WriteField("_square_crop", squareCrop)
+ if err != nil {
+ return
+ }
+ }
+
+ _ = writer.Close()
+
+ resp, err := vk.Client.Post(uploadServer.UploadURL, contentType, body)
+ if err != nil {
+ return
+ }
+ defer resp.Body.Close()
+
+ bodyContent, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosOwnerUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.PhotosSaveOwnerPhoto(Params{
+ "server": handler.Server,
+ "photo": handler.Photo,
+ "hash": handler.Hash,
+ })
+
+ return response, err
+}
+
+// UploadUserPhoto uploading Photos into User Profile.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 200x200px, aspect ratio from 0.25 to 3,
+// width+height not more than 14000 px, file size up to 50 Mb.
+func (vk *VK) UploadUserPhoto(file io.Reader) (response PhotosSaveOwnerPhotoResponse, err error) {
+ response, err = vk.uploadOwnerPhoto(Params{}, "", file)
+ return
+}
+
+// UploadOwnerPhoto uploading Photos into User Profile or Community
+// To upload a photo to a community send its negative id in the owner_id parameter.
+//
+// Following parameters can be sent in addition:
+// squareCrop in x,y,w (no quotes) format where x and y are the coordinates of
+// the preview upper-right corner and w is square side length.
+// That will create a square preview for a photo.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 200x200px, aspect ratio from 0.25 to 3,
+// width+height not more than 14000 px, file size up to 50 Mb.
+func (vk *VK) UploadOwnerPhoto(ownerID int, squareCrop string, file io.Reader) (
+ response PhotosSaveOwnerPhotoResponse,
+ err error,
+) {
+ response, err = vk.uploadOwnerPhoto(Params{
+ "owner_id": ownerID,
+ }, squareCrop, file)
+
+ return
+}
+
+// UploadMessagesPhoto uploading Photos into a Private Message.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadMessagesPhoto(peerID int, file io.Reader) (response PhotosSaveMessagesPhotoResponse, err error) {
+ uploadServer, err := vk.PhotosGetMessagesUploadServer(Params{
+ "peer_id": peerID,
+ })
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "photo", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosMessageUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.PhotosSaveMessagesPhoto(Params{
+ "server": handler.Server,
+ "photo": handler.Photo,
+ "hash": handler.Hash,
+ })
+
+ return
+}
+
+// uploadChatPhoto uploading a Main Photo to a Group Chat.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 200x200px,
+// width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) uploadChatPhoto(params Params, file io.Reader) (response MessagesSetChatPhotoResponse, err error) {
+ uploadServer, err := vk.PhotosGetChatUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "file", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosChatUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.MessagesSetChatPhoto(Params{
+ "file": handler.Response,
+ })
+
+ return
+}
+
+// UploadChatPhoto uploading a Main Photo to a Group Chat without crop.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 200x200px,
+// width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadChatPhoto(chatID int, file io.Reader) (response MessagesSetChatPhotoResponse, err error) {
+ response, err = vk.uploadChatPhoto(Params{
+ "chat_id": chatID,
+ }, file)
+
+ return
+}
+
+// UploadChatPhotoCrop uploading a Main Photo to a Group Chat with crop.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 200x200px,
+// width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadChatPhotoCrop(chatID, cropX, cropY, cropWidth int, file io.Reader) (
+ response MessagesSetChatPhotoResponse,
+ err error,
+) {
+ response, err = vk.uploadChatPhoto(Params{
+ "chat_id": chatID,
+ "crop_x": cropX,
+ "crop_y": cropY,
+ "crop_width": cropWidth,
+ }, file)
+
+ return
+}
+
+// uploadMarketPhoto uploading a Market Item Photo.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 400x400px,
+// width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) uploadMarketPhoto(params Params, file io.Reader) (response PhotosSaveMarketPhotoResponse, err error) {
+ uploadServer, err := vk.PhotosGetMarketUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "file", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosMarketUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.PhotosSaveMarketPhoto(Params{
+ "group_id": params["group_id"],
+ "server": handler.Server,
+ "photo": handler.Photo,
+ "hash": handler.Hash,
+ "crop_data": handler.CropData,
+ "crop_hash": handler.CropHash,
+ })
+
+ return
+}
+
+// UploadMarketPhoto uploading a Market Item Photo without crop.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 400x400px,
+// width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadMarketPhoto(groupID int, mainPhoto bool, file io.Reader) (
+ response PhotosSaveMarketPhotoResponse,
+ err error,
+) {
+ response, err = vk.uploadMarketPhoto(Params{
+ "group_id": groupID,
+ "main_photo": mainPhoto,
+ }, file)
+
+ return
+}
+
+// UploadMarketPhotoCrop uploading a Market Item Photo with crop.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 400x400px,
+// width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadMarketPhotoCrop(groupID, cropX, cropY, cropWidth int, file io.Reader) (
+ response PhotosSaveMarketPhotoResponse,
+ err error,
+) {
+ response, err = vk.uploadMarketPhoto(Params{
+ "group_id": groupID,
+ "main_photo": true,
+ "crop_x": cropX,
+ "crop_y": cropY,
+ "crop_width": cropWidth,
+ }, file)
+
+ return
+}
+
+// UploadMarketAlbumPhoto uploading a Main Photo to a Group Chat.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: size not less than 1280x720px,
+// width+height not more than 14000 px, file size up to 50 Mb,
+// aspect ratio of at least 1:20.
+func (vk *VK) UploadMarketAlbumPhoto(groupID int, file io.Reader) (
+ response PhotosSaveMarketAlbumPhotoResponse,
+ err error,
+) {
+ uploadServer, err := vk.PhotosGetMarketAlbumUploadServer(Params{
+ "group_id": groupID,
+ })
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "file", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosMarketAlbumUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ return vk.PhotosSaveMarketAlbumPhoto(Params{
+ "group_id": groupID,
+ "server": handler.Server,
+ "photo": handler.Photo,
+ "hash": handler.Hash,
+ })
+}
+
+// UploadVideo uploading Video Files.
+//
+// Supported formats: AVI, MP4, 3GP, MPEG, MOV, FLV, WMV.
+func (vk *VK) UploadVideo(params Params, file io.Reader) (response VideoSaveResponse, err error) {
+ response, err = vk.VideoSave(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(response.UploadURL, file, "video_file", "video.mp4")
+ if err != nil {
+ return
+ }
+
+ var videoUploadError UploadError
+
+ err = json.Unmarshal(bodyContent, &videoUploadError)
+ if err != nil {
+ return
+ }
+
+ if videoUploadError.Code != 0 {
+ err = &videoUploadError
+ }
+
+ return
+}
+
+// uploadDoc uploading Documents.
+//
+// Supported formats: any formats excepting mp3 and executable files.
+//
+// Limits: file size up to 200 MB.
+func (vk *VK) uploadDoc(url, title, tags string, file io.Reader) (response DocsSaveResponse, err error) {
+ bodyContent, err := vk.UploadFile(url, file, "file", title)
+ if err != nil {
+ return
+ }
+
+ var docUploadError UploadError
+
+ err = json.Unmarshal(bodyContent, &docUploadError)
+ if err != nil {
+ return
+ }
+
+ if docUploadError.Err != "" {
+ err = &docUploadError
+ return
+ }
+
+ var handler object.DocsDocUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.DocsSave(Params{
+ "file": handler.File,
+ "title": title,
+ "tags": tags,
+ })
+
+ return response, err
+}
+
+// UploadDoc uploading Documents.
+//
+// Supported formats: any formats excepting mp3 and executable files.
+//
+// Limits: file size up to 200 MB.
+func (vk *VK) UploadDoc(title, tags string, file io.Reader) (response DocsSaveResponse, err error) {
+ uploadServer, err := vk.DocsGetUploadServer(nil)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.uploadDoc(uploadServer.UploadURL, title, tags, file)
+
+ return
+}
+
+// UploadGroupDoc uploading Documents into Community.
+//
+// Supported formats: any formats excepting mp3 and executable files.
+//
+// Limits: file size up to 200 MB.
+func (vk *VK) UploadGroupDoc(groupID int, title, tags string, file io.Reader) (response DocsSaveResponse, err error) {
+ uploadServer, err := vk.DocsGetUploadServer(Params{
+ "group_id": groupID,
+ })
+ if err != nil {
+ return
+ }
+
+ response, err = vk.uploadDoc(uploadServer.UploadURL, title, tags, file)
+
+ return
+}
+
+// UploadWallDoc uploading Documents on Wall.
+//
+// Supported formats: any formats excepting mp3 and executable files.
+//
+// Limits: file size up to 200 MB.
+func (vk *VK) UploadWallDoc(title, tags string, file io.Reader) (response DocsSaveResponse, err error) {
+ uploadServer, err := vk.DocsGetWallUploadServer(nil)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.uploadDoc(uploadServer.UploadURL, title, tags, file)
+
+ return
+}
+
+// UploadGroupWallDoc uploading Documents on Group Wall.
+//
+// Supported formats: any formats excepting mp3 and executable files.
+//
+// Limits: file size up to 200 MB.
+func (vk *VK) UploadGroupWallDoc(groupID int, title, tags string, file io.Reader) (
+ response DocsSaveResponse,
+ err error,
+) {
+ uploadServer, err := vk.DocsGetWallUploadServer(Params{
+ "group_id": groupID,
+ })
+ if err != nil {
+ return
+ }
+
+ response, err = vk.uploadDoc(uploadServer.UploadURL, title, tags, file)
+
+ return
+}
+
+// UploadMessagesDoc uploading Documents into a Private Message.
+//
+// Supported formats: any formats excepting mp3 and executable files.
+//
+// Limits: file size up to 200 MB.
+func (vk *VK) UploadMessagesDoc(peerID int, typeDoc, title, tags string, file io.Reader) (
+ response DocsSaveResponse,
+ err error,
+) {
+ uploadServer, err := vk.DocsGetMessagesUploadServer(Params{
+ "peer_id": peerID,
+ "type": typeDoc,
+ })
+ if err != nil {
+ return
+ }
+
+ response, err = vk.uploadDoc(uploadServer.UploadURL, title, tags, file)
+
+ return
+}
+
+// UploadOwnerCoverPhoto uploading a Main Photo to a Group Chat.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: minimum photo size 795x200px, width+height not more than 14000px,
+// file size up to 50 MB. Recommended size: 1590x400px.
+func (vk *VK) UploadOwnerCoverPhoto(groupID, cropX, cropY, cropX2, cropY2 int, file io.Reader) (
+ response PhotosSaveOwnerCoverPhotoResponse,
+ err error,
+) {
+ uploadServer, err := vk.PhotosGetOwnerCoverPhotoUploadServer(Params{
+ "group_id": groupID,
+ "crop_x": cropX,
+ "crop_y": cropY,
+ "crop_x2": cropX2,
+ "crop_y2": cropY2,
+ })
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "photo", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PhotosOwnerUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ return vk.PhotosSaveOwnerCoverPhoto(Params{
+ "photo": handler.Photo,
+ "hash": handler.Hash,
+ })
+}
+
+// UploadStories struct.
+type UploadStories struct {
+ UploadResult string `json:"upload_result"`
+ Sig string `json:"_sig"`
+}
+
+type rawUploadStoriesPhoto struct {
+ Response UploadStories `json:"response"`
+ Error struct {
+ ErrorCode int `json:"error_code"`
+ Type string `json:"type"`
+ } `json:"error"`
+}
+
+type rawUploadStoriesVideo struct {
+ Response UploadStories `json:"response"`
+ UploadError
+}
+
+// UploadStoriesPhoto uploading Story.
+//
+// Supported formats: JPG, PNG, GIF.
+// Limits: sum of with and height no more than 14000px, file size no
+// more than 10 MB. Video format: h264 video, aac audio,
+// maximum 720х1280, 30fps.
+//
+// https://vk.com/dev/stories.getPhotoUploadServer
+func (vk *VK) UploadStoriesPhoto(params Params, file io.Reader) (response StoriesSaveResponse, err error) {
+ uploadServer, err := vk.StoriesGetPhotoUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "file", "file.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler rawUploadStoriesPhoto
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ if handler.Error.ErrorCode != 0 {
+ err = &UploadError{
+ Code: handler.Error.ErrorCode,
+ Err: handler.Error.Type,
+ }
+
+ return response, err
+ }
+
+ response, err = vk.StoriesSave(Params{
+ "upload_results": handler.Response.UploadResult,
+ })
+
+ return response, err
+}
+
+// UploadStoriesVideo uploading Story.
+//
+// Video format: h264 video, aac audio, maximum 720х1280, 30fps.
+func (vk *VK) UploadStoriesVideo(params Params, file io.Reader) (response StoriesSaveResponse, err error) {
+ uploadServer, err := vk.StoriesGetVideoUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "video_file", "video.mp4")
+ if err != nil {
+ return
+ }
+
+ var handler rawUploadStoriesVideo
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ if handler.UploadError.Code != 0 {
+ return response, &handler.UploadError
+ }
+
+ response, err = vk.StoriesSave(Params{
+ "upload_results": handler.Response.UploadResult,
+ })
+
+ return response, err
+}
+
+// uploadPollsPhoto uploading a Poll Photo.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: minimum photo size 795x200px, width+height not more than 14000px,
+// file size up to 50 MB. Recommended size: 1590x400px.
+func (vk *VK) uploadPollsPhoto(params Params, file io.Reader) (response PollsSavePhotoResponse, err error) {
+ uploadServer, err := vk.PollsGetPhotoUploadServer(params)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "photo", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.PollsPhotoUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.PollsSavePhoto(Params{
+ "photo": handler.Photo,
+ "hash": handler.Hash,
+ })
+
+ return
+}
+
+// UploadPollsPhoto uploading a Poll Photo.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: minimum photo size 795x200px, width+height not more than 14000px,
+// file size up to 50 MB. Recommended size: 1590x400px.
+func (vk *VK) UploadPollsPhoto(file io.Reader) (response PollsSavePhotoResponse, err error) {
+ return vk.uploadPollsPhoto(Params{}, file)
+}
+
+// UploadOwnerPollsPhoto uploading a Poll Photo.
+//
+// Supported formats: JPG, PNG, GIF.
+//
+// Limits: minimum photo size 795x200px, width+height not more than 14000px,
+// file size up to 50 MB. Recommended size: 1590x400px.
+func (vk *VK) UploadOwnerPollsPhoto(ownerID int, file io.Reader) (response PollsSavePhotoResponse, err error) {
+ return vk.uploadPollsPhoto(Params{"owner_id": ownerID}, file)
+}
+
+type uploadPrettyCardsPhotoHandler struct {
+ Photo string `json:"photo"`
+ ErrCode int `json:"errcode"`
+}
+
+// UploadPrettyCardsPhoto uploading a Pretty Card Photo.
+//
+// Supported formats: JPG, PNG, GIF.
+func (vk *VK) UploadPrettyCardsPhoto(file io.Reader) (response string, err error) {
+ uploadURL, err := vk.PrettyCardsGetUploadURL(nil)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadURL, file, "file", "photo.jpg")
+ if err != nil {
+ return
+ }
+
+ var handler uploadPrettyCardsPhotoHandler
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response = handler.Photo
+
+ if handler.ErrCode != 0 {
+ err = &UploadError{Code: handler.ErrCode}
+ }
+
+ return
+}
+
+type uploadLeadFormsPhotoHandler struct {
+ Photo string `json:"photo"`
+ ErrCode int `json:"errcode"`
+}
+
+// UploadLeadFormsPhoto uploading a Pretty Card Photo.
+//
+// Supported formats: JPG, PNG, GIF.
+func (vk *VK) UploadLeadFormsPhoto(file io.Reader) (response string, err error) {
+ uploadURL, err := vk.LeadFormsGetUploadURL(nil)
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadURL, file, "file", "photo.jpg")
+ if err != nil {
+ return
+ }
+
+ var handler uploadLeadFormsPhotoHandler
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response = handler.Photo
+
+ if handler.ErrCode != 0 {
+ err = &UploadError{Code: handler.ErrCode}
+ }
+
+ return
+}
+
+// UploadAppImage uploading a Image into App collection for community app widgets.
+func (vk *VK) UploadAppImage(imageType string, file io.Reader) (response object.AppWidgetsImage, err error) {
+ uploadServer, err := vk.AppWidgetsGetAppImageUploadServer(Params{
+ "image_type": imageType,
+ })
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "image", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.AppWidgetsAppImageUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.AppWidgetsSaveAppImage(Params{
+ "image": handler.Image,
+ "hash": handler.Hash,
+ })
+
+ return
+}
+
+// UploadGroupImage uploading a Image into Community collection for community app widgets.
+func (vk *VK) UploadGroupImage(imageType string, file io.Reader) (response object.AppWidgetsImage, err error) {
+ uploadServer, err := vk.AppWidgetsGetGroupImageUploadServer(Params{
+ "image_type": imageType,
+ })
+ if err != nil {
+ return
+ }
+
+ bodyContent, err := vk.UploadFile(uploadServer.UploadURL, file, "image", "photo.jpeg")
+ if err != nil {
+ return
+ }
+
+ var handler object.AppWidgetsGroupImageUploadResponse
+
+ err = json.Unmarshal(bodyContent, &handler)
+ if err != nil {
+ return
+ }
+
+ response, err = vk.AppWidgetsSaveGroupImage(Params{
+ "image": handler.Image,
+ "hash": handler.Hash,
+ })
+
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/users.go b/vendor/github.com/SevereCloud/vksdk/v2/api/users.go
new file mode 100644
index 00000000..2251d562
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/users.go
@@ -0,0 +1,104 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// UsersGetResponse users.get response.
+type UsersGetResponse []object.UsersUser
+
+// UsersGet returns detailed information on users.
+//
+// https://vk.com/dev/users.get
+func (vk *VK) UsersGet(params Params) (response UsersGetResponse, err error) {
+ err = vk.RequestUnmarshal("users.get", &response, params)
+ return
+}
+
+// UsersGetFollowersResponse struct.
+type UsersGetFollowersResponse struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+}
+
+// UsersGetFollowers returns a list of IDs of followers of the user in
+// question, sorted by date added, most recent first.
+//
+// fields="";
+//
+// https://vk.com/dev/users.getFollowers
+func (vk *VK) UsersGetFollowers(params Params) (response UsersGetFollowersResponse, err error) {
+ err = vk.RequestUnmarshal("users.getFollowers", &response, params, Params{"fields": ""})
+
+ return
+}
+
+// UsersGetFollowersFieldsResponse struct.
+type UsersGetFollowersFieldsResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// UsersGetFollowersFields returns a list of IDs of followers of the user in
+// question, sorted by date added, most recent first.
+//
+// fields not empty.
+//
+// https://vk.com/dev/users.getFollowers
+func (vk *VK) UsersGetFollowersFields(params Params) (response UsersGetFollowersFieldsResponse, err error) {
+ reqParams := make(Params)
+ if v, prs := params["fields"]; v == "" || !prs {
+ reqParams["fields"] = "id"
+ }
+
+ err = vk.RequestUnmarshal("users.getFollowers", &response, params, reqParams)
+
+ return
+}
+
+// UsersGetSubscriptionsResponse struct.
+type UsersGetSubscriptionsResponse struct {
+ Users struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+ } `json:"users"`
+ Groups struct {
+ Count int `json:"count"`
+ Items []int `json:"items"`
+ } `json:"groups"`
+}
+
+// UsersGetSubscriptions returns a list of IDs of users and public pages followed by the user.
+//
+// extended=0
+//
+// https://vk.com/dev/users.getSubscriptions
+//
+// BUG(SevereCloud): UsersGetSubscriptions bad response with extended=1.
+func (vk *VK) UsersGetSubscriptions(params Params) (response UsersGetSubscriptionsResponse, err error) {
+ err = vk.RequestUnmarshal("users.getSubscriptions", &response, params, Params{"extended": false})
+
+ return
+}
+
+// UsersReport reports (submits a complain about) a user.
+//
+// https://vk.com/dev/users.report
+func (vk *VK) UsersReport(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("users.report", &response, params)
+ return
+}
+
+// UsersSearchResponse struct.
+type UsersSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.UsersUser `json:"items"`
+}
+
+// UsersSearch returns a list of users matching the search criteria.
+//
+// https://vk.com/dev/users.search
+func (vk *VK) UsersSearch(params Params) (response UsersSearchResponse, err error) {
+ err = vk.RequestUnmarshal("users.search", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/utils.go b/vendor/github.com/SevereCloud/vksdk/v2/api/utils.go
new file mode 100644
index 00000000..63508fe2
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/utils.go
@@ -0,0 +1,105 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "encoding/json"
+
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// UtilsCheckLinkResponse struct.
+type UtilsCheckLinkResponse object.UtilsLinkChecked
+
+// UtilsCheckLink checks whether a link is blocked in VK.
+//
+// https://vk.com/dev/utils.checkLink
+func (vk *VK) UtilsCheckLink(params Params) (response UtilsCheckLinkResponse, err error) {
+ err = vk.RequestUnmarshal("utils.checkLink", &response, params)
+ return
+}
+
+// UtilsDeleteFromLastShortened deletes shortened link from user's list.
+//
+// https://vk.com/dev/utils.deleteFromLastShortened
+func (vk *VK) UtilsDeleteFromLastShortened(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("utils.deleteFromLastShortened", &response, params)
+ return
+}
+
+// UtilsGetLastShortenedLinksResponse struct.
+type UtilsGetLastShortenedLinksResponse struct {
+ Count int `json:"count"`
+ Items []object.UtilsLastShortenedLink `json:"items"`
+}
+
+// UtilsGetLastShortenedLinks returns a list of user's shortened links.
+//
+// https://vk.com/dev/utils.getLastShortenedLinks
+func (vk *VK) UtilsGetLastShortenedLinks(params Params) (response UtilsGetLastShortenedLinksResponse, err error) {
+ err = vk.RequestUnmarshal("utils.getLastShortenedLinks", &response, params)
+ return
+}
+
+// UtilsGetLinkStatsResponse struct.
+type UtilsGetLinkStatsResponse object.UtilsLinkStats
+
+// UtilsGetLinkStats returns stats data for shortened link.
+//
+// extended=0
+//
+// https://vk.com/dev/utils.getLinkStats
+func (vk *VK) UtilsGetLinkStats(params Params) (response UtilsGetLinkStatsResponse, err error) {
+ err = vk.RequestUnmarshal("utils.getLinkStats", &response, params, Params{"extended": false})
+
+ return
+}
+
+// UtilsGetLinkStatsExtendedResponse struct.
+type UtilsGetLinkStatsExtendedResponse object.UtilsLinkStatsExtended
+
+// UtilsGetLinkStatsExtended returns stats data for shortened link.
+//
+// extended=1
+//
+// https://vk.com/dev/utils.getLinkStats
+func (vk *VK) UtilsGetLinkStatsExtended(params Params) (response UtilsGetLinkStatsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("utils.getLinkStats", &response, params, Params{"extended": true})
+
+ return
+}
+
+// UtilsGetServerTime returns the current time of the VK server.
+//
+// https://vk.com/dev/utils.getServerTime
+func (vk *VK) UtilsGetServerTime(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("utils.getServerTime", &response, params)
+ return
+}
+
+// UtilsGetShortLinkResponse struct.
+type UtilsGetShortLinkResponse object.UtilsShortLink
+
+// UtilsGetShortLink allows to receive a link shortened via vk.cc.
+//
+// https://vk.com/dev/utils.getShortLink
+func (vk *VK) UtilsGetShortLink(params Params) (response UtilsGetShortLinkResponse, err error) {
+ err = vk.RequestUnmarshal("utils.getShortLink", &response, params)
+ return
+}
+
+// UtilsResolveScreenNameResponse struct.
+type UtilsResolveScreenNameResponse object.UtilsDomainResolved
+
+// UtilsResolveScreenName detects a type of object (e.g., user, community, application) and its ID by screen name.
+//
+// https://vk.com/dev/utils.resolveScreenName
+func (vk *VK) UtilsResolveScreenName(params Params) (response UtilsResolveScreenNameResponse, err error) {
+ rawResponse, err := vk.Request("utils.resolveScreenName", params)
+ // Если короткое имя screen_name не занято, то будет возвращён пустой объект.
+ if err != nil || string(rawResponse) == "[]" {
+ return
+ }
+
+ err = json.Unmarshal(rawResponse, &response)
+
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/video.go b/vendor/github.com/SevereCloud/vksdk/v2/api/video.go
new file mode 100644
index 00000000..b6e85b9a
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/video.go
@@ -0,0 +1,338 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// VideoAdd adds a video to a user or community page.
+//
+// https://vk.com/dev/video.add
+func (vk *VK) VideoAdd(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.add", &response, params)
+ return
+}
+
+// VideoAddAlbumResponse struct.
+type VideoAddAlbumResponse struct {
+ AlbumID int `json:"album_id"`
+}
+
+// VideoAddAlbum creates an empty album for videos.
+//
+// https://vk.com/dev/video.addAlbum
+func (vk *VK) VideoAddAlbum(params Params) (response VideoAddAlbumResponse, err error) {
+ err = vk.RequestUnmarshal("video.addAlbum", &response, params)
+ return
+}
+
+// VideoAddToAlbum allows you to add a video to the album.
+//
+// https://vk.com/dev/video.addToAlbum
+func (vk *VK) VideoAddToAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.addToAlbum", &response, params)
+ return
+}
+
+// VideoCreateComment adds a new comment on a video.
+//
+// https://vk.com/dev/video.createComment
+func (vk *VK) VideoCreateComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.createComment", &response, params)
+ return
+}
+
+// VideoDelete deletes a video from a user or community page.
+//
+// https://vk.com/dev/video.delete
+func (vk *VK) VideoDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.delete", &response, params)
+ return
+}
+
+// VideoDeleteAlbum deletes a video album.
+//
+// https://vk.com/dev/video.deleteAlbum
+func (vk *VK) VideoDeleteAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.deleteAlbum", &response, params)
+ return
+}
+
+// VideoDeleteComment deletes a comment on a video.
+//
+// https://vk.com/dev/video.deleteComment
+func (vk *VK) VideoDeleteComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.deleteComment", &response, params)
+ return
+}
+
+// VideoEdit edits information about a video on a user or community page.
+//
+// https://vk.com/dev/video.edit
+func (vk *VK) VideoEdit(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.edit", &response, params)
+ return
+}
+
+// VideoEditAlbum edits the title of a video album.
+//
+// https://vk.com/dev/video.editAlbum
+func (vk *VK) VideoEditAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.editAlbum", &response, params)
+ return
+}
+
+// VideoEditComment edits the text of a comment on a video.
+//
+// https://vk.com/dev/video.editComment
+func (vk *VK) VideoEditComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.editComment", &response, params)
+ return
+}
+
+// VideoGetResponse struct.
+type VideoGetResponse struct {
+ Count int `json:"count"`
+ Items []object.VideoVideo `json:"items"`
+}
+
+// VideoGet returns detailed information about videos.
+//
+// extended=0
+//
+// https://vk.com/dev/video.get
+func (vk *VK) VideoGet(params Params) (response VideoGetResponse, err error) {
+ err = vk.RequestUnmarshal("video.get", &response, params, Params{"extended": false})
+
+ return
+}
+
+// VideoGetExtendedResponse struct.
+type VideoGetExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.VideoVideo `json:"items"`
+ object.ExtendedResponse
+}
+
+// VideoGetExtended returns detailed information about videos.
+//
+// extended=1
+//
+// https://vk.com/dev/video.get
+func (vk *VK) VideoGetExtended(params Params) (response VideoGetExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("video.get", &response, params, Params{"extended": true})
+
+ return
+}
+
+// VideoGetAlbumByIDResponse struct.
+type VideoGetAlbumByIDResponse object.VideoVideoAlbumFull
+
+// VideoGetAlbumByID returns video album info.
+//
+// https://vk.com/dev/video.getAlbumById
+func (vk *VK) VideoGetAlbumByID(params Params) (response VideoGetAlbumByIDResponse, err error) {
+ err = vk.RequestUnmarshal("video.getAlbumById", &response, params)
+ return
+}
+
+// VideoGetAlbumsResponse struct.
+type VideoGetAlbumsResponse struct {
+ Count int `json:"count"`
+ Items []object.VideoVideoAlbum `json:"items"`
+}
+
+// VideoGetAlbums returns a list of video albums owned by a user or community.
+//
+// extended=0
+//
+// https://vk.com/dev/video.getAlbums
+func (vk *VK) VideoGetAlbums(params Params) (response VideoGetAlbumsResponse, err error) {
+ err = vk.RequestUnmarshal("video.getAlbums", &response, params, Params{"extended": false})
+
+ return
+}
+
+// VideoGetAlbumsExtendedResponse struct.
+type VideoGetAlbumsExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.VideoVideoAlbumFull `json:"items"`
+}
+
+// VideoGetAlbumsExtended returns a list of video albums owned by a user or community.
+//
+// extended=1
+//
+// https://vk.com/dev/video.getAlbums
+func (vk *VK) VideoGetAlbumsExtended(params Params) (response VideoGetAlbumsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("video.getAlbums", &response, params, Params{"extended": true})
+
+ return
+}
+
+// VideoGetAlbumsByVideoResponse struct.
+type VideoGetAlbumsByVideoResponse []int
+
+// VideoGetAlbumsByVideo returns a list of albums in which the video is located.
+//
+// extended=0
+//
+// https://vk.com/dev/video.getAlbumsByVideo
+func (vk *VK) VideoGetAlbumsByVideo(params Params) (response VideoGetAlbumsByVideoResponse, err error) {
+ err = vk.RequestUnmarshal("video.getAlbumsByVideo", &response, params, Params{"extended": false})
+
+ return
+}
+
+// VideoGetAlbumsByVideoExtendedResponse struct.
+type VideoGetAlbumsByVideoExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.VideoVideoAlbumFull `json:"items"`
+}
+
+// VideoGetAlbumsByVideoExtended returns a list of albums in which the video is located.
+//
+// extended=1
+//
+// https://vk.com/dev/video.getAlbumsByVideo
+func (vk *VK) VideoGetAlbumsByVideoExtended(params Params) (response VideoGetAlbumsByVideoExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("video.getAlbumsByVideo", &response, params, Params{"extended": true})
+
+ return
+}
+
+// VideoGetCommentsResponse struct.
+type VideoGetCommentsResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallComment `json:"items"`
+}
+
+// VideoGetComments returns a list of comments on a video.
+//
+// extended=0
+//
+// https://vk.com/dev/video.getComments
+func (vk *VK) VideoGetComments(params Params) (response VideoGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("video.getComments", &response, params, Params{"extended": false})
+
+ return
+}
+
+// VideoGetCommentsExtendedResponse struct.
+type VideoGetCommentsExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallComment `json:"items"`
+ object.ExtendedResponse
+}
+
+// VideoGetCommentsExtended returns a list of comments on a video.
+//
+// extended=1
+//
+// https://vk.com/dev/video.getComments
+func (vk *VK) VideoGetCommentsExtended(params Params) (response VideoGetCommentsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("video.getComments", &response, params, Params{"extended": true})
+
+ return
+}
+
+// VideoRemoveFromAlbum allows you to remove the video from the album.
+//
+// https://vk.com/dev/video.removeFromAlbum
+func (vk *VK) VideoRemoveFromAlbum(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.removeFromAlbum", &response, params)
+ return
+}
+
+// VideoReorderAlbums reorders the album in the list of user video albums.
+//
+// https://vk.com/dev/video.reorderAlbums
+func (vk *VK) VideoReorderAlbums(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.reorderAlbums", &response, params)
+ return
+}
+
+// VideoReorderVideos reorders the video in the video album.
+//
+// https://vk.com/dev/video.reorderVideos
+func (vk *VK) VideoReorderVideos(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.reorderVideos", &response, params)
+ return
+}
+
+// VideoReport reports (submits a complaint about) a video.
+//
+// https://vk.com/dev/video.report
+func (vk *VK) VideoReport(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.report", &response, params)
+ return
+}
+
+// VideoReportComment reports (submits a complaint about) a comment on a video.
+//
+// https://vk.com/dev/video.reportComment
+func (vk *VK) VideoReportComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.reportComment", &response, params)
+ return
+}
+
+// VideoRestore restores a previously deleted video.
+//
+// https://vk.com/dev/video.restore
+func (vk *VK) VideoRestore(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.restore", &response, params)
+ return
+}
+
+// VideoRestoreComment restores a previously deleted comment on a video.
+//
+// https://vk.com/dev/video.restoreComment
+func (vk *VK) VideoRestoreComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("video.restoreComment", &response, params)
+ return
+}
+
+// VideoSaveResponse struct.
+type VideoSaveResponse object.VideoSaveResult
+
+// VideoSave returns a server address (required for upload) and video data.
+//
+// https://vk.com/dev/video.save
+func (vk *VK) VideoSave(params Params) (response VideoSaveResponse, err error) {
+ err = vk.RequestUnmarshal("video.save", &response, params)
+ return
+}
+
+// VideoSearchResponse struct.
+type VideoSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.VideoVideo `json:"items"`
+}
+
+// VideoSearch returns a list of videos under the set search criterion.
+//
+// extended=0
+//
+// https://vk.com/dev/video.search
+func (vk *VK) VideoSearch(params Params) (response VideoSearchResponse, err error) {
+ err = vk.RequestUnmarshal("video.search", &response, params, Params{"extended": false})
+
+ return
+}
+
+// VideoSearchExtendedResponse struct.
+type VideoSearchExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.VideoVideo `json:"items"`
+ object.ExtendedResponse
+}
+
+// VideoSearchExtended returns a list of videos under the set search criterion.
+//
+// extended=1
+//
+// https://vk.com/dev/video.search
+func (vk *VK) VideoSearchExtended(params Params) (response VideoSearchExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("video.search", &response, params, Params{"extended": true})
+
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/wall.go b/vendor/github.com/SevereCloud/vksdk/v2/api/wall.go
new file mode 100644
index 00000000..e951a749
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/wall.go
@@ -0,0 +1,383 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// WallCheckCopyrightLink method.
+//
+// https://vk.com/dev/wall.checkCopyrightLink
+func (vk *VK) WallCheckCopyrightLink(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.checkCopyrightLink", &response, params)
+ return
+}
+
+// WallCloseComments turn off post commenting.
+//
+// https://vk.com/dev/wall.closeComments
+func (vk *VK) WallCloseComments(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.closeComments", &response, params)
+ return
+}
+
+// WallCreateCommentResponse struct.
+type WallCreateCommentResponse struct {
+ CommentID int `json:"comment_id"`
+ ParentsStack []int `json:"parents_stack"`
+}
+
+// WallCreateComment adds a comment to a post on a user wall or community wall.
+//
+// https://vk.com/dev/wall.createComment
+func (vk *VK) WallCreateComment(params Params) (response WallCreateCommentResponse, err error) {
+ err = vk.RequestUnmarshal("wall.createComment", &response, params)
+ return
+}
+
+// WallDelete deletes a post from a user wall or community wall.
+//
+// https://vk.com/dev/wall.delete
+func (vk *VK) WallDelete(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.delete", &response, params)
+ return
+}
+
+// WallDeleteComment deletes a comment on a post on a user wall or community wall.
+//
+// https://vk.com/dev/wall.deleteComment
+func (vk *VK) WallDeleteComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.deleteComment", &response, params)
+ return
+}
+
+// WallEditResponse struct.
+type WallEditResponse struct {
+ PostID int `json:"post_id"`
+}
+
+// WallEdit edits a post on a user wall or community wall.
+//
+// https://vk.com/dev/wall.edit
+func (vk *VK) WallEdit(params Params) (response WallEditResponse, err error) {
+ err = vk.RequestUnmarshal("wall.edit", &response, params)
+ return
+}
+
+// WallEditAdsStealth allows to edit hidden post.
+//
+// https://vk.com/dev/wall.editAdsStealth
+func (vk *VK) WallEditAdsStealth(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.editAdsStealth", &response, params)
+ return
+}
+
+// WallEditComment edits a comment on a user wall or community wall.
+//
+// https://vk.com/dev/wall.editComment
+func (vk *VK) WallEditComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.editComment", &response, params)
+ return
+}
+
+// WallGetResponse struct.
+type WallGetResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallpost `json:"items"`
+}
+
+// WallGet returns a list of posts on a user wall or community wall.
+//
+// extended=0
+//
+// https://vk.com/dev/wall.get
+func (vk *VK) WallGet(params Params) (response WallGetResponse, err error) {
+ err = vk.RequestUnmarshal("wall.get", &response, params, Params{"extended": false})
+
+ return
+}
+
+// WallGetExtendedResponse struct.
+type WallGetExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallpost `json:"items"`
+ object.ExtendedResponse
+}
+
+// WallGetExtended returns a list of posts on a user wall or community wall.
+//
+// extended=1
+//
+// https://vk.com/dev/wall.get
+func (vk *VK) WallGetExtended(params Params) (response WallGetExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("wall.get", &response, params, Params{"extended": true})
+
+ return
+}
+
+// WallGetByIDResponse struct.
+type WallGetByIDResponse []object.WallWallpost
+
+// WallGetByID returns a list of posts from user or community walls by their IDs.
+//
+// extended=0
+//
+// https://vk.com/dev/wall.getById
+func (vk *VK) WallGetByID(params Params) (response WallGetByIDResponse, err error) {
+ err = vk.RequestUnmarshal("wall.getById", &response, params, Params{"extended": false})
+
+ return
+}
+
+// WallGetByIDExtendedResponse struct.
+type WallGetByIDExtendedResponse struct {
+ Items []object.WallWallpost `json:"items"`
+ object.ExtendedResponse
+}
+
+// WallGetByIDExtended returns a list of posts from user or community walls by their IDs.
+//
+// extended=1
+//
+// https://vk.com/dev/wall.getById
+func (vk *VK) WallGetByIDExtended(params Params) (response WallGetByIDExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("wall.getById", &response, params, Params{"extended": true})
+
+ return
+}
+
+// WallGetCommentResponse struct.
+type WallGetCommentResponse struct {
+ Items []object.WallWallComment `json:"items"`
+ CanPost object.BaseBoolInt `json:"can_post"`
+ ShowReplyButton object.BaseBoolInt `json:"show_reply_button"`
+ GroupsCanPost object.BaseBoolInt `json:"groups_can_post"`
+ CurrentLevelCount int `json:"current_level_count"`
+}
+
+// WallGetComment allows to obtain wall comment info.
+//
+// extended=0
+//
+// https://vk.com/dev/wall.getComment
+func (vk *VK) WallGetComment(params Params) (response WallGetCommentResponse, err error) {
+ err = vk.RequestUnmarshal("wall.getComment", &response, params, Params{"extended": false})
+
+ return
+}
+
+// WallGetCommentExtendedResponse struct.
+type WallGetCommentExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallComment `json:"items"`
+ CanPost object.BaseBoolInt `json:"can_post"`
+ ShowReplyButton object.BaseBoolInt `json:"show_reply_button"`
+ GroupsCanPost object.BaseBoolInt `json:"groups_can_post"`
+ CurrentLevelCount int `json:"current_level_count"`
+ Profiles []object.UsersUser `json:"profiles"`
+ Groups []object.GroupsGroup `json:"groups"`
+}
+
+// WallGetCommentExtended allows to obtain wall comment info.
+//
+// extended=1
+//
+// https://vk.com/dev/wall.getComment
+func (vk *VK) WallGetCommentExtended(params Params) (response WallGetCommentExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("wall.getComment", &response, params, Params{"extended": true})
+
+ return
+}
+
+// WallGetCommentsResponse struct.
+type WallGetCommentsResponse struct {
+ CanPost object.BaseBoolInt `json:"can_post"`
+ ShowReplyButton object.BaseBoolInt `json:"show_reply_button"`
+ GroupsCanPost object.BaseBoolInt `json:"groups_can_post"`
+ CurrentLevelCount int `json:"current_level_count"`
+ Count int `json:"count"`
+ Items []object.WallWallComment `json:"items"`
+}
+
+// WallGetComments returns a list of comments on a post on a user wall or community wall.
+//
+// extended=0
+//
+// https://vk.com/dev/wall.getComments
+func (vk *VK) WallGetComments(params Params) (response WallGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("wall.getComments", &response, params, Params{"extended": false})
+
+ return
+}
+
+// WallGetCommentsExtendedResponse struct.
+type WallGetCommentsExtendedResponse struct {
+ CanPost object.BaseBoolInt `json:"can_post"`
+ ShowReplyButton object.BaseBoolInt `json:"show_reply_button"`
+ GroupsCanPost object.BaseBoolInt `json:"groups_can_post"`
+ CurrentLevelCount int `json:"current_level_count"`
+ Count int `json:"count"`
+ Items []object.WallWallComment `json:"items"`
+ object.ExtendedResponse
+}
+
+// WallGetCommentsExtended returns a list of comments on a post on a user wall or community wall.
+//
+// extended=1
+//
+// https://vk.com/dev/wall.getComments
+func (vk *VK) WallGetCommentsExtended(params Params) (response WallGetCommentsExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("wall.getComments", &response, params, Params{"extended": true})
+
+ return
+}
+
+// WallGetRepostsResponse struct.
+type WallGetRepostsResponse struct {
+ Items []object.WallWallpost `json:"items"`
+ object.ExtendedResponse
+}
+
+// WallGetReposts returns information about reposts of a post on user wall or community wall.
+//
+// https://vk.com/dev/wall.getReposts
+func (vk *VK) WallGetReposts(params Params) (response WallGetRepostsResponse, err error) {
+ err = vk.RequestUnmarshal("wall.getReposts", &response, params)
+ return
+}
+
+// WallOpenComments includes posting comments.
+//
+// https://vk.com/dev/wall.openComments
+func (vk *VK) WallOpenComments(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.openComments", &response, params)
+ return
+}
+
+// WallPin pins the post on wall.
+//
+// https://vk.com/dev/wall.pin
+func (vk *VK) WallPin(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.pin", &response, params)
+ return
+}
+
+// WallPostResponse struct.
+type WallPostResponse struct {
+ PostID int `json:"post_id"`
+}
+
+// WallPost adds a new post on a user wall or community wall.Can also be used to publish suggested or scheduled posts.
+//
+// https://vk.com/dev/wall.post
+func (vk *VK) WallPost(params Params) (response WallPostResponse, err error) {
+ err = vk.RequestUnmarshal("wall.post", &response, params)
+ return
+}
+
+// WallPostAdsStealthResponse struct.
+type WallPostAdsStealthResponse struct {
+ PostID int `json:"post_id"`
+}
+
+// WallPostAdsStealth allows to create hidden post which will
+// not be shown on the community's wall and can be used for creating
+// an ad with type "Community post".
+//
+// https://vk.com/dev/wall.postAdsStealth
+func (vk *VK) WallPostAdsStealth(params Params) (response WallPostAdsStealthResponse, err error) {
+ err = vk.RequestUnmarshal("wall.postAdsStealth", &response, params)
+ return
+}
+
+// WallReportComment reports (submits a complaint about) a comment on a post on a user wall or community wall.
+//
+// https://vk.com/dev/wall.reportComment
+func (vk *VK) WallReportComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.reportComment", &response, params)
+ return
+}
+
+// WallReportPost reports (submits a complaint about) a post on a user wall or community wall.
+//
+// https://vk.com/dev/wall.reportPost
+func (vk *VK) WallReportPost(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.reportPost", &response, params)
+ return
+}
+
+// WallRepostResponse struct.
+type WallRepostResponse struct {
+ Success int `json:"success"`
+ PostID int `json:"post_id"`
+ RepostsCount int `json:"reposts_count"`
+ LikesCount int `json:"likes_count"`
+ WallRepostCount int `json:"wall_repost_count"`
+ MailRepostCount int `json:"mail_repost_count"`
+}
+
+// WallRepost reposts ( copies) an object to a user wall or community wall.
+//
+// https://vk.com/dev/wall.repost
+func (vk *VK) WallRepost(params Params) (response WallRepostResponse, err error) {
+ err = vk.RequestUnmarshal("wall.repost", &response, params)
+ return
+}
+
+// WallRestore restores a post deleted from a user wall or community wall.
+//
+// https://vk.com/dev/wall.restore
+func (vk *VK) WallRestore(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.restore", &response, params)
+ return
+}
+
+// WallRestoreComment restores a comment deleted from a user wall or community wall.
+//
+// https://vk.com/dev/wall.restoreComment
+func (vk *VK) WallRestoreComment(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.restoreComment", &response, params)
+ return
+}
+
+// WallSearchResponse struct.
+type WallSearchResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallpost `json:"items"`
+}
+
+// WallSearch allows to search posts on user or community walls.
+//
+// extended=0
+//
+// https://vk.com/dev/wall.search
+func (vk *VK) WallSearch(params Params) (response WallSearchResponse, err error) {
+ err = vk.RequestUnmarshal("wall.search", &response, params, Params{"extended": false})
+
+ return
+}
+
+// WallSearchExtendedResponse struct.
+type WallSearchExtendedResponse struct {
+ Count int `json:"count"`
+ Items []object.WallWallpost `json:"items"`
+ object.ExtendedResponse
+}
+
+// WallSearchExtended allows to search posts on user or community walls.
+//
+// extended=1
+//
+// https://vk.com/dev/wall.search
+func (vk *VK) WallSearchExtended(params Params) (response WallSearchExtendedResponse, err error) {
+ err = vk.RequestUnmarshal("wall.search", &response, params, Params{"extended": true})
+
+ return
+}
+
+// WallUnpin unpins the post on wall.
+//
+// https://vk.com/dev/wall.unpin
+func (vk *VK) WallUnpin(params Params) (response int, err error) {
+ err = vk.RequestUnmarshal("wall.unpin", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/api/widgets.go b/vendor/github.com/SevereCloud/vksdk/v2/api/widgets.go
new file mode 100644
index 00000000..a5f83f0c
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/api/widgets.go
@@ -0,0 +1,33 @@
+package api // import "github.com/SevereCloud/vksdk/v2/api"
+
+import (
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// WidgetsGetCommentsResponse struct.
+type WidgetsGetCommentsResponse struct {
+ Count int `json:"count"`
+ Posts []object.WidgetsWidgetComment `json:"posts"`
+}
+
+// WidgetsGetComments gets a list of comments for the page added through the Comments widget.
+//
+// https://vk.com/dev/widgets.getComments
+func (vk *VK) WidgetsGetComments(params Params) (response WidgetsGetCommentsResponse, err error) {
+ err = vk.RequestUnmarshal("widgets.getComments", &response, params)
+ return
+}
+
+// WidgetsGetPagesResponse struct.
+type WidgetsGetPagesResponse struct {
+ Count int `json:"count"`
+ Pages []object.WidgetsWidgetPage `json:"pages"`
+}
+
+// WidgetsGetPages gets a list of application/site pages where the Comments widget or Like widget is installed.
+//
+// https://vk.com/dev/widgets.getPages
+func (vk *VK) WidgetsGetPages(params Params) (response WidgetsGetPagesResponse, err error) {
+ err = vk.RequestUnmarshal("widgets.getPages", &response, params)
+ return
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/doc.go b/vendor/github.com/SevereCloud/vksdk/v2/doc.go
new file mode 100644
index 00000000..7bb83d0c
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/doc.go
@@ -0,0 +1,12 @@
+/*
+Package vksdk implements the basic VK API functions.
+
+Source https://github.com/SevereCloud/vksdk
+*/
+package vksdk
+
+// Module constants.
+const (
+ Version = "2.9.0"
+ API = "5.126"
+)
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/events/context.go b/vendor/github.com/SevereCloud/vksdk/v2/events/context.go
new file mode 100644
index 00000000..91264cc7
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/events/context.go
@@ -0,0 +1,17 @@
+package events // import "github.com/SevereCloud/vksdk/v2/events"
+
+import (
+ "context"
+
+ "github.com/SevereCloud/vksdk/v2/internal"
+)
+
+// GroupIDFromContext returns the GroupID from context.
+func GroupIDFromContext(ctx context.Context) int {
+ return ctx.Value(internal.GroupIDKey).(int)
+}
+
+// EventIDFromContext returns the EventID from context.
+func EventIDFromContext(ctx context.Context) string {
+ return ctx.Value(internal.EventIDKey).(string)
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/events/events.go b/vendor/github.com/SevereCloud/vksdk/v2/events/events.go
new file mode 100644
index 00000000..3f907d48
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/events/events.go
@@ -0,0 +1,1241 @@
+/*
+Package events for community events handling.
+
+See more https://vk.com/dev/groups_events
+*/
+package events // import "github.com/SevereCloud/vksdk/v2/events"
+
+import (
+ "context"
+ "encoding/json"
+
+ "github.com/SevereCloud/vksdk/v2/internal"
+)
+
+// EventType type.
+type EventType string
+
+// EventType list.
+const (
+ EventConfirmation = "confirmation"
+ EventMessageNew = "message_new"
+ EventMessageReply = "message_reply"
+ EventMessageEdit = "message_edit"
+ EventMessageAllow = "message_allow"
+ EventMessageDeny = "message_deny"
+ EventMessageTypingState = "message_typing_state"
+ EventMessageEvent = "message_event"
+ EventPhotoNew = "photo_new"
+ EventPhotoCommentNew = "photo_comment_new"
+ EventPhotoCommentEdit = "photo_comment_edit"
+ EventPhotoCommentRestore = "photo_comment_restore"
+ EventPhotoCommentDelete = "photo_comment_delete"
+ EventAudioNew = "audio_new"
+ EventVideoNew = "video_new"
+ EventVideoCommentNew = "video_comment_new"
+ EventVideoCommentEdit = "video_comment_edit"
+ EventVideoCommentRestore = "video_comment_restore"
+ EventVideoCommentDelete = "video_comment_delete"
+ EventWallPostNew = "wall_post_new"
+ EventWallRepost = "wall_repost"
+ EventWallReplyNew = "wall_reply_new"
+ EventWallReplyEdit = "wall_reply_edit"
+ EventWallReplyRestore = "wall_reply_restore"
+ EventWallReplyDelete = "wall_reply_delete"
+ EventBoardPostNew = "board_post_new"
+ EventBoardPostEdit = "board_post_edit"
+ EventBoardPostRestore = "board_post_restore"
+ EventBoardPostDelete = "board_post_delete"
+ EventMarketCommentNew = "market_comment_new"
+ EventMarketCommentEdit = "market_comment_edit"
+ EventMarketCommentRestore = "market_comment_restore"
+ EventMarketCommentDelete = "market_comment_delete"
+ EventMarketOrderNew = "market_order_new"
+ EventMarketOrderEdit = "market_order_edit"
+ EventGroupLeave = "group_leave"
+ EventGroupJoin = "group_join"
+ EventUserBlock = "user_block"
+ EventUserUnblock = "user_unblock"
+ EventPollVoteNew = "poll_vote_new"
+ EventGroupOfficersEdit = "group_officers_edit"
+ EventGroupChangeSettings = "group_change_settings"
+ EventGroupChangePhoto = "group_change_photo"
+ EventVkpayTransaction = "vkpay_transaction"
+ EventLeadFormsNew = "lead_forms_new"
+ EventAppPayload = "app_payload"
+ EventMessageRead = "message_read"
+ EventLikeAdd = "like_add"
+ EventLikeRemove = "like_remove"
+ EventDonutSubscriptionCreate = "donut_subscription_create"
+ EventDonutSubscriptionProlonged = "donut_subscription_prolonged"
+ EventDonutSubscriptionExpired = "donut_subscription_expired"
+ EventDonutSubscriptionCancelled = "donut_subscription_cancelled"
+ EventDonutSubscriptionPriceChanged = "donut_subscription_price_changed"
+ EventDonutMoneyWithdraw = "donut_money_withdraw"
+ EventDonutMoneyWithdrawError = "donut_money_withdraw_error"
+)
+
+// GroupEvent struct.
+type GroupEvent struct {
+ Type EventType `json:"type"`
+ Object json.RawMessage `json:"object"`
+ GroupID int `json:"group_id"`
+ EventID string `json:"event_id"`
+ Secret string `json:"secret"`
+}
+
+// FuncList struct.
+type FuncList struct {
+ messageNew []func(context.Context, MessageNewObject)
+ messageReply []func(context.Context, MessageReplyObject)
+ messageEdit []func(context.Context, MessageEditObject)
+ messageAllow []func(context.Context, MessageAllowObject)
+ messageDeny []func(context.Context, MessageDenyObject)
+ messageTypingState []func(context.Context, MessageTypingStateObject)
+ messageEvent []func(context.Context, MessageEventObject)
+ photoNew []func(context.Context, PhotoNewObject)
+ photoCommentNew []func(context.Context, PhotoCommentNewObject)
+ photoCommentEdit []func(context.Context, PhotoCommentEditObject)
+ photoCommentRestore []func(context.Context, PhotoCommentRestoreObject)
+ photoCommentDelete []func(context.Context, PhotoCommentDeleteObject)
+ audioNew []func(context.Context, AudioNewObject)
+ videoNew []func(context.Context, VideoNewObject)
+ videoCommentNew []func(context.Context, VideoCommentNewObject)
+ videoCommentEdit []func(context.Context, VideoCommentEditObject)
+ videoCommentRestore []func(context.Context, VideoCommentRestoreObject)
+ videoCommentDelete []func(context.Context, VideoCommentDeleteObject)
+ wallPostNew []func(context.Context, WallPostNewObject)
+ wallRepost []func(context.Context, WallRepostObject)
+ wallReplyNew []func(context.Context, WallReplyNewObject)
+ wallReplyEdit []func(context.Context, WallReplyEditObject)
+ wallReplyRestore []func(context.Context, WallReplyRestoreObject)
+ wallReplyDelete []func(context.Context, WallReplyDeleteObject)
+ boardPostNew []func(context.Context, BoardPostNewObject)
+ boardPostEdit []func(context.Context, BoardPostEditObject)
+ boardPostRestore []func(context.Context, BoardPostRestoreObject)
+ boardPostDelete []func(context.Context, BoardPostDeleteObject)
+ marketCommentNew []func(context.Context, MarketCommentNewObject)
+ marketCommentEdit []func(context.Context, MarketCommentEditObject)
+ marketCommentRestore []func(context.Context, MarketCommentRestoreObject)
+ marketCommentDelete []func(context.Context, MarketCommentDeleteObject)
+ marketOrderNew []func(context.Context, MarketOrderNewObject)
+ marketOrderEdit []func(context.Context, MarketOrderEditObject)
+ groupLeave []func(context.Context, GroupLeaveObject)
+ groupJoin []func(context.Context, GroupJoinObject)
+ userBlock []func(context.Context, UserBlockObject)
+ userUnblock []func(context.Context, UserUnblockObject)
+ pollVoteNew []func(context.Context, PollVoteNewObject)
+ groupOfficersEdit []func(context.Context, GroupOfficersEditObject)
+ groupChangeSettings []func(context.Context, GroupChangeSettingsObject)
+ groupChangePhoto []func(context.Context, GroupChangePhotoObject)
+ vkpayTransaction []func(context.Context, VkpayTransactionObject)
+ leadFormsNew []func(context.Context, LeadFormsNewObject)
+ appPayload []func(context.Context, AppPayloadObject)
+ messageRead []func(context.Context, MessageReadObject)
+ likeAdd []func(context.Context, LikeAddObject)
+ likeRemove []func(context.Context, LikeRemoveObject)
+ donutSubscriptionCreate []func(context.Context, DonutSubscriptionCreateObject)
+ donutSubscriptionProlonged []func(context.Context, DonutSubscriptionProlongedObject)
+ donutSubscriptionExpired []func(context.Context, DonutSubscriptionExpiredObject)
+ donutSubscriptionCancelled []func(context.Context, DonutSubscriptionCancelledObject)
+ donutSubscriptionPriceChanged []func(context.Context, DonutSubscriptionPriceChangedObject)
+ donutMoneyWithdraw []func(context.Context, DonutMoneyWithdrawObject)
+ donutMoneyWithdrawError []func(context.Context, DonutMoneyWithdrawErrorObject)
+ special map[EventType][]func(context.Context, GroupEvent)
+ eventsList []EventType
+
+ goroutine bool
+}
+
+// NewFuncList returns a new FuncList.
+func NewFuncList() *FuncList {
+ return &FuncList{
+ special: make(map[EventType][]func(context.Context, GroupEvent)),
+ }
+}
+
+// Handler group event handler.
+func (fl FuncList) Handler(ctx context.Context, e GroupEvent) error { // nolint:gocyclo
+ ctx = context.WithValue(ctx, internal.GroupIDKey, e.GroupID)
+ ctx = context.WithValue(ctx, internal.EventIDKey, e.EventID)
+
+ if sliceFunc, ok := fl.special[e.Type]; ok {
+ for _, f := range sliceFunc {
+ if fl.goroutine {
+ go func() { f(ctx, e) }()
+ } else {
+ f(ctx, e)
+ }
+ }
+ }
+
+ switch e.Type {
+ case EventMessageNew:
+ var obj MessageNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMessageReply:
+ var obj MessageReplyObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageReply {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMessageEdit:
+ var obj MessageEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMessageAllow:
+ var obj MessageAllowObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageAllow {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMessageDeny:
+ var obj MessageDenyObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageDeny {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMessageTypingState: // На основе ответа
+ var obj MessageTypingStateObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageTypingState {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMessageEvent:
+ var obj MessageEventObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageEvent {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventPhotoNew:
+ var obj PhotoNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.photoNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventPhotoCommentNew:
+ var obj PhotoCommentNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.photoCommentNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventPhotoCommentEdit:
+ var obj PhotoCommentEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.photoCommentEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventPhotoCommentRestore:
+ var obj PhotoCommentRestoreObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.photoCommentRestore {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventPhotoCommentDelete:
+ var obj PhotoCommentDeleteObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.photoCommentDelete {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventAudioNew:
+ var obj AudioNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.audioNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventVideoNew:
+ var obj VideoNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.videoNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventVideoCommentNew:
+ var obj VideoCommentNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.videoCommentNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventVideoCommentEdit:
+ var obj VideoCommentEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.videoCommentEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventVideoCommentRestore:
+ var obj VideoCommentRestoreObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.videoCommentRestore {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventVideoCommentDelete:
+ var obj VideoCommentDeleteObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.videoCommentDelete {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventWallPostNew:
+ var obj WallPostNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.wallPostNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventWallRepost:
+ var obj WallRepostObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.wallRepost {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventWallReplyNew:
+ var obj WallReplyNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.wallReplyNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventWallReplyEdit:
+ var obj WallReplyEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.wallReplyEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventWallReplyRestore:
+ var obj WallReplyRestoreObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.wallReplyRestore {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventWallReplyDelete:
+ var obj WallReplyDeleteObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.wallReplyDelete {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventBoardPostNew:
+ var obj BoardPostNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.boardPostNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventBoardPostEdit:
+ var obj BoardPostEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.boardPostEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventBoardPostRestore:
+ var obj BoardPostRestoreObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.boardPostRestore {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventBoardPostDelete:
+ var obj BoardPostDeleteObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.boardPostDelete {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMarketCommentNew:
+ var obj MarketCommentNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.marketCommentNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMarketCommentEdit:
+ var obj MarketCommentEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.marketCommentEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMarketCommentRestore:
+ var obj MarketCommentRestoreObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.marketCommentRestore {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMarketCommentDelete:
+ var obj MarketCommentDeleteObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.marketCommentDelete {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMarketOrderNew:
+ var obj MarketOrderNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.marketOrderNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMarketOrderEdit:
+ var obj MarketOrderEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.marketOrderEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventGroupLeave:
+ var obj GroupLeaveObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.groupLeave {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventGroupJoin:
+ var obj GroupJoinObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.groupJoin {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventUserBlock:
+ var obj UserBlockObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.userBlock {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventUserUnblock:
+ var obj UserUnblockObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.userUnblock {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventPollVoteNew:
+ var obj PollVoteNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.pollVoteNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventGroupOfficersEdit:
+ var obj GroupOfficersEditObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.groupOfficersEdit {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventGroupChangeSettings:
+ var obj GroupChangeSettingsObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.groupChangeSettings {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventGroupChangePhoto:
+ var obj GroupChangePhotoObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.groupChangePhoto {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventVkpayTransaction:
+ var obj VkpayTransactionObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.vkpayTransaction {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventLeadFormsNew:
+ var obj LeadFormsNewObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.leadFormsNew {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventAppPayload:
+ var obj AppPayloadObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.appPayload {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventMessageRead:
+ var obj MessageReadObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.messageRead {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventLikeAdd:
+ var obj LikeAddObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.likeAdd {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventLikeRemove:
+ var obj LikeRemoveObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.likeRemove {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventDonutSubscriptionCreate:
+ var obj DonutSubscriptionCreateObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.donutSubscriptionCreate {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventDonutSubscriptionProlonged:
+ var obj DonutSubscriptionProlongedObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.donutSubscriptionProlonged {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventDonutSubscriptionExpired:
+ var obj DonutSubscriptionExpiredObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.donutSubscriptionExpired {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventDonutSubscriptionCancelled:
+ var obj DonutSubscriptionCancelledObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.donutSubscriptionCancelled {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventDonutSubscriptionPriceChanged:
+ var obj DonutSubscriptionPriceChangedObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.donutSubscriptionPriceChanged {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventDonutMoneyWithdraw:
+ var obj DonutMoneyWithdrawObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.donutMoneyWithdraw {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ case EventDonutMoneyWithdrawError:
+ var obj DonutMoneyWithdrawErrorObject
+ if err := json.Unmarshal(e.Object, &obj); err != nil {
+ return err
+ }
+
+ for _, f := range fl.donutMoneyWithdrawError {
+ if fl.goroutine {
+ go func() { f(ctx, obj) }()
+ } else {
+ f(ctx, obj)
+ }
+ }
+ }
+
+ return nil
+}
+
+// ListEvents return list of events.
+func (fl FuncList) ListEvents() []EventType {
+ return fl.eventsList
+}
+
+// Goroutine invoke functions in a goroutine.
+func (fl *FuncList) Goroutine(v bool) {
+ fl.goroutine = v
+}
+
+// OnEvent handler.
+func (fl *FuncList) OnEvent(eventType EventType, f func(context.Context, GroupEvent)) {
+ if fl.special == nil {
+ fl.special = make(map[EventType][]func(context.Context, GroupEvent))
+ }
+
+ fl.special[eventType] = append(fl.special[eventType], f)
+ fl.eventsList = append(fl.eventsList, eventType)
+}
+
+// MessageNew handler.
+func (fl *FuncList) MessageNew(f func(context.Context, MessageNewObject)) {
+ fl.messageNew = append(fl.messageNew, f)
+ fl.eventsList = append(fl.eventsList, EventMessageNew)
+}
+
+// MessageReply handler.
+func (fl *FuncList) MessageReply(f func(context.Context, MessageReplyObject)) {
+ fl.messageReply = append(fl.messageReply, f)
+ fl.eventsList = append(fl.eventsList, EventMessageReply)
+}
+
+// MessageEdit handler.
+func (fl *FuncList) MessageEdit(f func(context.Context, MessageEditObject)) {
+ fl.messageEdit = append(fl.messageEdit, f)
+ fl.eventsList = append(fl.eventsList, EventMessageEdit)
+}
+
+// MessageAllow handler.
+func (fl *FuncList) MessageAllow(f func(context.Context, MessageAllowObject)) {
+ fl.messageAllow = append(fl.messageAllow, f)
+ fl.eventsList = append(fl.eventsList, EventMessageAllow)
+}
+
+// MessageDeny handler.
+func (fl *FuncList) MessageDeny(f func(context.Context, MessageDenyObject)) {
+ fl.messageDeny = append(fl.messageDeny, f)
+ fl.eventsList = append(fl.eventsList, EventMessageDeny)
+}
+
+// MessageTypingState handler.
+func (fl *FuncList) MessageTypingState(f func(context.Context, MessageTypingStateObject)) {
+ fl.messageTypingState = append(fl.messageTypingState, f)
+ fl.eventsList = append(fl.eventsList, EventMessageTypingState)
+}
+
+// MessageEvent handler.
+func (fl *FuncList) MessageEvent(f func(context.Context, MessageEventObject)) {
+ fl.messageEvent = append(fl.messageEvent, f)
+ fl.eventsList = append(fl.eventsList, EventMessageEvent)
+}
+
+// PhotoNew handler.
+func (fl *FuncList) PhotoNew(f func(context.Context, PhotoNewObject)) {
+ fl.photoNew = append(fl.photoNew, f)
+ fl.eventsList = append(fl.eventsList, EventPhotoNew)
+}
+
+// PhotoCommentNew handler.
+func (fl *FuncList) PhotoCommentNew(f func(context.Context, PhotoCommentNewObject)) {
+ fl.photoCommentNew = append(fl.photoCommentNew, f)
+ fl.eventsList = append(fl.eventsList, EventPhotoCommentNew)
+}
+
+// PhotoCommentEdit handler.
+func (fl *FuncList) PhotoCommentEdit(f func(context.Context, PhotoCommentEditObject)) {
+ fl.photoCommentEdit = append(fl.photoCommentEdit, f)
+ fl.eventsList = append(fl.eventsList, EventPhotoCommentEdit)
+}
+
+// PhotoCommentRestore handler.
+func (fl *FuncList) PhotoCommentRestore(f func(context.Context, PhotoCommentRestoreObject)) {
+ fl.photoCommentRestore = append(fl.photoCommentRestore, f)
+ fl.eventsList = append(fl.eventsList, EventPhotoCommentRestore)
+}
+
+// PhotoCommentDelete handler.
+func (fl *FuncList) PhotoCommentDelete(f func(context.Context, PhotoCommentDeleteObject)) {
+ fl.photoCommentDelete = append(fl.photoCommentDelete, f)
+ fl.eventsList = append(fl.eventsList, EventPhotoCommentDelete)
+}
+
+// AudioNew handler.
+func (fl *FuncList) AudioNew(f func(context.Context, AudioNewObject)) {
+ fl.audioNew = append(fl.audioNew, f)
+ fl.eventsList = append(fl.eventsList, EventAudioNew)
+}
+
+// VideoNew handler.
+func (fl *FuncList) VideoNew(f func(context.Context, VideoNewObject)) {
+ fl.videoNew = append(fl.videoNew, f)
+ fl.eventsList = append(fl.eventsList, EventVideoNew)
+}
+
+// VideoCommentNew handler.
+func (fl *FuncList) VideoCommentNew(f func(context.Context, VideoCommentNewObject)) {
+ fl.videoCommentNew = append(fl.videoCommentNew, f)
+ fl.eventsList = append(fl.eventsList, EventVideoCommentNew)
+}
+
+// VideoCommentEdit handler.
+func (fl *FuncList) VideoCommentEdit(f func(context.Context, VideoCommentEditObject)) {
+ fl.videoCommentEdit = append(fl.videoCommentEdit, f)
+ fl.eventsList = append(fl.eventsList, EventVideoCommentEdit)
+}
+
+// VideoCommentRestore handler.
+func (fl *FuncList) VideoCommentRestore(f func(context.Context, VideoCommentRestoreObject)) {
+ fl.videoCommentRestore = append(fl.videoCommentRestore, f)
+ fl.eventsList = append(fl.eventsList, EventVideoCommentRestore)
+}
+
+// VideoCommentDelete handler.
+func (fl *FuncList) VideoCommentDelete(f func(context.Context, VideoCommentDeleteObject)) {
+ fl.videoCommentDelete = append(fl.videoCommentDelete, f)
+ fl.eventsList = append(fl.eventsList, EventVideoCommentDelete)
+}
+
+// WallPostNew handler.
+func (fl *FuncList) WallPostNew(f func(context.Context, WallPostNewObject)) {
+ fl.wallPostNew = append(fl.wallPostNew, f)
+ fl.eventsList = append(fl.eventsList, EventWallPostNew)
+}
+
+// WallRepost handler.
+func (fl *FuncList) WallRepost(f func(context.Context, WallRepostObject)) {
+ fl.wallRepost = append(fl.wallRepost, f)
+ fl.eventsList = append(fl.eventsList, EventWallRepost)
+}
+
+// WallReplyNew handler.
+func (fl *FuncList) WallReplyNew(f func(context.Context, WallReplyNewObject)) {
+ fl.wallReplyNew = append(fl.wallReplyNew, f)
+ fl.eventsList = append(fl.eventsList, EventWallReplyNew)
+}
+
+// WallReplyEdit handler.
+func (fl *FuncList) WallReplyEdit(f func(context.Context, WallReplyEditObject)) {
+ fl.wallReplyEdit = append(fl.wallReplyEdit, f)
+ fl.eventsList = append(fl.eventsList, EventWallReplyEdit)
+}
+
+// WallReplyRestore handler.
+func (fl *FuncList) WallReplyRestore(f func(context.Context, WallReplyRestoreObject)) {
+ fl.wallReplyRestore = append(fl.wallReplyRestore, f)
+ fl.eventsList = append(fl.eventsList, EventWallReplyRestore)
+}
+
+// WallReplyDelete handler.
+func (fl *FuncList) WallReplyDelete(f func(context.Context, WallReplyDeleteObject)) {
+ fl.wallReplyDelete = append(fl.wallReplyDelete, f)
+ fl.eventsList = append(fl.eventsList, EventWallReplyDelete)
+}
+
+// BoardPostNew handler.
+func (fl *FuncList) BoardPostNew(f func(context.Context, BoardPostNewObject)) {
+ fl.boardPostNew = append(fl.boardPostNew, f)
+ fl.eventsList = append(fl.eventsList, EventBoardPostNew)
+}
+
+// BoardPostEdit handler.
+func (fl *FuncList) BoardPostEdit(f func(context.Context, BoardPostEditObject)) {
+ fl.boardPostEdit = append(fl.boardPostEdit, f)
+ fl.eventsList = append(fl.eventsList, EventBoardPostEdit)
+}
+
+// BoardPostRestore handler.
+func (fl *FuncList) BoardPostRestore(f func(context.Context, BoardPostRestoreObject)) {
+ fl.boardPostRestore = append(fl.boardPostRestore, f)
+ fl.eventsList = append(fl.eventsList, EventBoardPostRestore)
+}
+
+// BoardPostDelete handler.
+func (fl *FuncList) BoardPostDelete(f func(context.Context, BoardPostDeleteObject)) {
+ fl.boardPostDelete = append(fl.boardPostDelete, f)
+ fl.eventsList = append(fl.eventsList, EventBoardPostDelete)
+}
+
+// MarketCommentNew handler.
+func (fl *FuncList) MarketCommentNew(f func(context.Context, MarketCommentNewObject)) {
+ fl.marketCommentNew = append(fl.marketCommentNew, f)
+ fl.eventsList = append(fl.eventsList, EventMarketCommentNew)
+}
+
+// MarketCommentEdit handler.
+func (fl *FuncList) MarketCommentEdit(f func(context.Context, MarketCommentEditObject)) {
+ fl.marketCommentEdit = append(fl.marketCommentEdit, f)
+ fl.eventsList = append(fl.eventsList, EventMarketCommentEdit)
+}
+
+// MarketCommentRestore handler.
+func (fl *FuncList) MarketCommentRestore(f func(context.Context, MarketCommentRestoreObject)) {
+ fl.marketCommentRestore = append(fl.marketCommentRestore, f)
+ fl.eventsList = append(fl.eventsList, EventMarketCommentRestore)
+}
+
+// MarketCommentDelete handler.
+func (fl *FuncList) MarketCommentDelete(f func(context.Context, MarketCommentDeleteObject)) {
+ fl.marketCommentDelete = append(fl.marketCommentDelete, f)
+ fl.eventsList = append(fl.eventsList, EventMarketCommentDelete)
+}
+
+// MarketOrderNew handler.
+func (fl *FuncList) MarketOrderNew(f func(context.Context, MarketOrderNewObject)) {
+ fl.marketOrderNew = append(fl.marketOrderNew, f)
+ fl.eventsList = append(fl.eventsList, EventMarketOrderNew)
+}
+
+// MarketOrderEdit handler.
+func (fl *FuncList) MarketOrderEdit(f func(context.Context, MarketOrderEditObject)) {
+ fl.marketOrderEdit = append(fl.marketOrderEdit, f)
+ fl.eventsList = append(fl.eventsList, EventMarketOrderEdit)
+}
+
+// GroupLeave handler.
+func (fl *FuncList) GroupLeave(f func(context.Context, GroupLeaveObject)) {
+ fl.groupLeave = append(fl.groupLeave, f)
+ fl.eventsList = append(fl.eventsList, EventGroupLeave)
+}
+
+// GroupJoin handler.
+func (fl *FuncList) GroupJoin(f func(context.Context, GroupJoinObject)) {
+ fl.groupJoin = append(fl.groupJoin, f)
+ fl.eventsList = append(fl.eventsList, EventGroupJoin)
+}
+
+// UserBlock handler.
+func (fl *FuncList) UserBlock(f func(context.Context, UserBlockObject)) {
+ fl.userBlock = append(fl.userBlock, f)
+ fl.eventsList = append(fl.eventsList, EventUserBlock)
+}
+
+// UserUnblock handler.
+func (fl *FuncList) UserUnblock(f func(context.Context, UserUnblockObject)) {
+ fl.userUnblock = append(fl.userUnblock, f)
+ fl.eventsList = append(fl.eventsList, EventUserUnblock)
+}
+
+// PollVoteNew handler.
+func (fl *FuncList) PollVoteNew(f func(context.Context, PollVoteNewObject)) {
+ fl.pollVoteNew = append(fl.pollVoteNew, f)
+ fl.eventsList = append(fl.eventsList, EventPollVoteNew)
+}
+
+// GroupOfficersEdit handler.
+func (fl *FuncList) GroupOfficersEdit(f func(context.Context, GroupOfficersEditObject)) {
+ fl.groupOfficersEdit = append(fl.groupOfficersEdit, f)
+ fl.eventsList = append(fl.eventsList, EventGroupOfficersEdit)
+}
+
+// GroupChangeSettings handler.
+func (fl *FuncList) GroupChangeSettings(f func(context.Context, GroupChangeSettingsObject)) {
+ fl.groupChangeSettings = append(fl.groupChangeSettings, f)
+ fl.eventsList = append(fl.eventsList, EventGroupChangeSettings)
+}
+
+// GroupChangePhoto handler.
+func (fl *FuncList) GroupChangePhoto(f func(context.Context, GroupChangePhotoObject)) {
+ fl.groupChangePhoto = append(fl.groupChangePhoto, f)
+ fl.eventsList = append(fl.eventsList, EventGroupChangePhoto)
+}
+
+// VkpayTransaction handler.
+func (fl *FuncList) VkpayTransaction(f func(context.Context, VkpayTransactionObject)) {
+ fl.vkpayTransaction = append(fl.vkpayTransaction, f)
+ fl.eventsList = append(fl.eventsList, EventVkpayTransaction)
+}
+
+// LeadFormsNew handler.
+func (fl *FuncList) LeadFormsNew(f func(context.Context, LeadFormsNewObject)) {
+ fl.leadFormsNew = append(fl.leadFormsNew, f)
+ fl.eventsList = append(fl.eventsList, EventLeadFormsNew)
+}
+
+// AppPayload handler.
+func (fl *FuncList) AppPayload(f func(context.Context, AppPayloadObject)) {
+ fl.appPayload = append(fl.appPayload, f)
+ fl.eventsList = append(fl.eventsList, EventAppPayload)
+}
+
+// MessageRead handler.
+func (fl *FuncList) MessageRead(f func(context.Context, MessageReadObject)) {
+ fl.messageRead = append(fl.messageRead, f)
+ fl.eventsList = append(fl.eventsList, EventMessageRead)
+}
+
+// LikeAdd handler.
+func (fl *FuncList) LikeAdd(f func(context.Context, LikeAddObject)) {
+ fl.likeAdd = append(fl.likeAdd, f)
+ fl.eventsList = append(fl.eventsList, EventLikeAdd)
+}
+
+// LikeRemove handler.
+func (fl *FuncList) LikeRemove(f func(context.Context, LikeRemoveObject)) {
+ fl.likeRemove = append(fl.likeRemove, f)
+ fl.eventsList = append(fl.eventsList, EventLikeRemove)
+}
+
+// DonutSubscriptionCreate handler.
+func (fl *FuncList) DonutSubscriptionCreate(f func(context.Context, DonutSubscriptionCreateObject)) {
+ fl.donutSubscriptionCreate = append(fl.donutSubscriptionCreate, f)
+ fl.eventsList = append(fl.eventsList, EventDonutSubscriptionCreate)
+}
+
+// DonutSubscriptionProlonged handler.
+func (fl *FuncList) DonutSubscriptionProlonged(f func(context.Context, DonutSubscriptionProlongedObject)) {
+ fl.donutSubscriptionProlonged = append(fl.donutSubscriptionProlonged, f)
+ fl.eventsList = append(fl.eventsList, EventDonutSubscriptionProlonged)
+}
+
+// DonutSubscriptionExpired handler.
+func (fl *FuncList) DonutSubscriptionExpired(f func(context.Context, DonutSubscriptionExpiredObject)) {
+ fl.donutSubscriptionExpired = append(fl.donutSubscriptionExpired, f)
+ fl.eventsList = append(fl.eventsList, EventDonutSubscriptionExpired)
+}
+
+// DonutSubscriptionCancelled handler.
+func (fl *FuncList) DonutSubscriptionCancelled(f func(context.Context, DonutSubscriptionCancelledObject)) {
+ fl.donutSubscriptionCancelled = append(fl.donutSubscriptionCancelled, f)
+ fl.eventsList = append(fl.eventsList, EventDonutSubscriptionCancelled)
+}
+
+// DonutSubscriptionPriceChanged handler.
+func (fl *FuncList) DonutSubscriptionPriceChanged(f func(context.Context, DonutSubscriptionPriceChangedObject)) {
+ fl.donutSubscriptionPriceChanged = append(fl.donutSubscriptionPriceChanged, f)
+ fl.eventsList = append(fl.eventsList, EventDonutSubscriptionPriceChanged)
+}
+
+// DonutMoneyWithdraw handler.
+func (fl *FuncList) DonutMoneyWithdraw(f func(context.Context, DonutMoneyWithdrawObject)) {
+ fl.donutMoneyWithdraw = append(fl.donutMoneyWithdraw, f)
+ fl.eventsList = append(fl.eventsList, EventDonutMoneyWithdraw)
+}
+
+// DonutMoneyWithdrawError handler.
+func (fl *FuncList) DonutMoneyWithdrawError(f func(context.Context, DonutMoneyWithdrawErrorObject)) {
+ fl.donutMoneyWithdrawError = append(fl.donutMoneyWithdrawError, f)
+ fl.eventsList = append(fl.eventsList, EventDonutMoneyWithdrawError)
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/events/objects.go b/vendor/github.com/SevereCloud/vksdk/v2/events/objects.go
new file mode 100644
index 00000000..8cd94a91
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/events/objects.go
@@ -0,0 +1,359 @@
+package events // import "github.com/SevereCloud/vksdk/v2/events"
+
+import (
+ "encoding/json"
+
+ "github.com/SevereCloud/vksdk/v2/object"
+)
+
+// MessageNewObject struct.
+type MessageNewObject struct {
+ Message object.MessagesMessage `json:"message"`
+ ClientInfo object.ClientInfo `json:"client_info"`
+}
+
+// MessageReplyObject struct.
+type MessageReplyObject object.MessagesMessage
+
+// MessageEditObject struct.
+type MessageEditObject object.MessagesMessage
+
+// MessageAllowObject struct.
+type MessageAllowObject struct {
+ UserID int `json:"user_id"`
+ Key string `json:"key"`
+}
+
+// MessageDenyObject struct.
+type MessageDenyObject struct {
+ UserID int `json:"user_id"`
+}
+
+// MessageTypingStateObject struct.
+type MessageTypingStateObject struct {
+ State string `json:"state"`
+ FromID int `json:"from_id"`
+ ToID int `json:"to_id"`
+}
+
+// MessageEventObject struct.
+type MessageEventObject struct {
+ UserID int `json:"user_id"`
+ PeerID int `json:"peer_id"`
+ EventID string `json:"event_id"`
+ Payload json.RawMessage `json:"payload"`
+ ConversationMessageID int `json:"conversation_message_id"`
+}
+
+// PhotoNewObject struct.
+type PhotoNewObject object.PhotosPhoto
+
+// PhotoCommentNewObject struct.
+type PhotoCommentNewObject object.WallWallComment
+
+// PhotoCommentEditObject struct.
+type PhotoCommentEditObject object.WallWallComment
+
+// PhotoCommentRestoreObject struct.
+type PhotoCommentRestoreObject object.WallWallComment
+
+// PhotoCommentDeleteObject struct.
+type PhotoCommentDeleteObject struct {
+ OwnerID int `json:"owner_id"`
+ ID int `json:"id"`
+ UserID int `json:"user_id"`
+ DeleterID int `json:"deleter_id"`
+ PhotoID int `json:"photo_id"`
+}
+
+// AudioNewObject struct.
+type AudioNewObject object.AudioAudio
+
+// VideoNewObject struct.
+type VideoNewObject object.VideoVideo
+
+// VideoCommentNewObject struct.
+type VideoCommentNewObject object.WallWallComment
+
+// VideoCommentEditObject struct.
+type VideoCommentEditObject object.WallWallComment
+
+// VideoCommentRestoreObject struct.
+type VideoCommentRestoreObject object.WallWallComment
+
+// VideoCommentDeleteObject struct.
+type VideoCommentDeleteObject struct {
+ OwnerID int `json:"owner_id"`
+ ID int `json:"id"`
+ UserID int `json:"user_id"`
+ DeleterID int `json:"deleter_id"`
+ VideoID int `json:"video_id"`
+}
+
+// WallPostNewObject struct.
+type WallPostNewObject object.WallWallpost
+
+// WallRepostObject struct.
+type WallRepostObject object.WallWallpost
+
+// WallReplyNewObject struct.
+type WallReplyNewObject object.WallWallComment
+
+// WallReplyEditObject struct.
+type WallReplyEditObject object.WallWallComment
+
+// WallReplyRestoreObject struct.
+type WallReplyRestoreObject object.WallWallComment
+
+// WallReplyDeleteObject struct.
+type WallReplyDeleteObject struct {
+ OwnerID int `json:"owner_id"`
+ ID int `json:"id"`
+ DeleterID int `json:"deleter_id"`
+ PostID int `json:"post_id"`
+}
+
+// BoardPostNewObject struct.
+type BoardPostNewObject object.BoardTopicComment
+
+// BoardPostEditObject struct.
+type BoardPostEditObject object.BoardTopicComment
+
+// BoardPostRestoreObject struct.
+type BoardPostRestoreObject object.BoardTopicComment
+
+// BoardPostDeleteObject struct.
+type BoardPostDeleteObject struct {
+ TopicOwnerID int `json:"topic_owner_id"`
+ TopicID int `json:"topic_id"`
+ ID int `json:"id"`
+}
+
+// MarketCommentNewObject struct.
+type MarketCommentNewObject object.WallWallComment
+
+// MarketCommentEditObject struct.
+type MarketCommentEditObject object.WallWallComment
+
+// MarketCommentRestoreObject struct.
+type MarketCommentRestoreObject object.WallWallComment
+
+// MarketCommentDeleteObject struct.
+type MarketCommentDeleteObject struct {
+ OwnerID int `json:"owner_id"`
+ ID int `json:"id"`
+ UserID int `json:"user_id"`
+ DeleterID int `json:"deleter_id"`
+ ItemID int `json:"item_id"`
+}
+
+// MarketOrderNewObject struct.
+type MarketOrderNewObject object.MarketOrder
+
+// MarketOrderEditObject struct.
+type MarketOrderEditObject object.MarketOrder
+
+// GroupLeaveObject struct.
+type GroupLeaveObject struct {
+ UserID int `json:"user_id"`
+ Self object.BaseBoolInt `json:"self"`
+}
+
+// GroupJoinObject struct.
+type GroupJoinObject struct {
+ UserID int `json:"user_id"`
+ JoinType string `json:"join_type"`
+}
+
+// UserBlockObject struct.
+type UserBlockObject struct {
+ AdminID int `json:"admin_id"`
+ UserID int `json:"user_id"`
+ UnblockDate int `json:"unblock_date"`
+ Reason int `json:"reason"`
+ Comment string `json:"comment"`
+}
+
+// UserUnblockObject struct.
+type UserUnblockObject struct {
+ AdminID int `json:"admin_id"`
+ UserID int `json:"user_id"`
+ ByEndDate int `json:"by_end_date"`
+}
+
+// PollVoteNewObject struct.
+//
+// BUG(VK): при голосовании за несколько вариантов, возвращается только один.
+type PollVoteNewObject struct {
+ OwnerID int `json:"owner_id"`
+ PollID int `json:"poll_id"`
+ OptionID int `json:"option_id"`
+ UserID int `json:"user_id"`
+}
+
+// GroupOfficersEditObject struct.
+type GroupOfficersEditObject struct {
+ AdminID int `json:"admin_id"`
+ UserID int `json:"user_id"`
+ LevelOld int `json:"level_old"`
+ LevelNew int `json:"level_new"`
+}
+
+// Changes struct.
+type Changes struct {
+ OldValue string `json:"old_value"`
+ NewValue string `json:"new_value"`
+}
+
+// ChangesInt struct.
+type ChangesInt struct {
+ OldValue int `json:"old_value"`
+ NewValue int `json:"new_value"`
+}
+
+// GroupChangeSettingsObject struct.
+//
+// BUG(VK): Phone https://vk.com/bugtracker?act=show&id=64240
+//
+// BUG(VK): Email https://vk.com/bugtracker?act=show&id=86650
+type GroupChangeSettingsObject struct {
+ UserID int `json:"user_id"`
+ Changes struct {
+ Title Changes `json:"title"`
+ Description Changes `json:"description"`
+ Access ChangesInt `json:"access"`
+ ScreenName Changes `json:"screen_name"`
+ PublicCategory ChangesInt `json:"public_category"`
+ PublicSubcategory ChangesInt `json:"public_subcategory"`
+ AgeLimits ChangesInt `json:"age_limits"`
+ Website Changes `json:"website"`
+ StatusDefault Changes `json:"status_default"`
+ Wall ChangesInt `json:"wall"` // на основе ответа
+ Replies ChangesInt `json:"replies"` // на основе ответа
+ Topics ChangesInt `json:"topics"` // на основе ответа
+ Audio ChangesInt `json:"audio"` // на основе ответа
+ Photos ChangesInt `json:"photos"` // на основе ответа
+ Video ChangesInt `json:"video"` // на основе ответа
+ Market ChangesInt `json:"market"` // на основе ответа
+ Docs ChangesInt `json:"docs"` // на основе ответа
+ Messages ChangesInt `json:"messages"` // на основе ответа
+ EventGroupID ChangesInt `json:"event_group_id"` // на основе ответа
+ Links Changes `json:"links"` // на основе ответа
+ Email Changes `json:"email"` // на основе ответа
+ EventStartDate ChangesInt `json:"event_start_date::"` // на основе ответа
+ EventFinishDate ChangesInt `json:"event_finish_date:"` // на основе ответа
+ Subject Changes `json:"subject"` // на основе ответа
+ MarketWiki Changes `json:"market_wiki"` // на основе ответа
+ DisableMarketComments ChangesInt `json:"disable_market_comments"` // на основе ответа
+ Phone ChangesInt `json:"phone"` // на основе ответа
+ CountryID ChangesInt `json:"country_id"` // на основе ответа
+ CityID ChangesInt `json:"city_id"` // на основе ответа
+ } `json:"Changes"`
+}
+
+// GroupChangePhotoObject struct.
+type GroupChangePhotoObject struct {
+ UserID int `json:"user_id"`
+ Photo object.PhotosPhoto `json:"photo"`
+}
+
+// VkpayTransactionObject struct.
+type VkpayTransactionObject struct {
+ FromID int `json:"from_id"`
+ Amount int `json:"amount"`
+ Description string `json:"description"`
+ Date int `json:"date"`
+}
+
+// LeadFormsNewObject struct.
+type LeadFormsNewObject struct {
+ LeadID int `json:"lead_id"`
+ GroupID int `json:"group_id"`
+ UserID int `json:"user_id"`
+ FormID int `json:"form_id"`
+ FormName string `json:"form_name"`
+ AdID int `json:"ad_id"`
+ Answers []struct {
+ Key string `json:"key"`
+ Question string `json:"question"`
+ Answer string `json:"answer"`
+ } `json:"answers"`
+}
+
+// AppPayloadObject struct.
+type AppPayloadObject struct {
+ UserID int `json:"user_id"`
+ AppID int `json:"app_id"`
+ Payload string `json:"payload"`
+}
+
+// MessageReadObject struct.
+type MessageReadObject struct {
+ FromID int `json:"from_id"`
+ PeerID int `json:"peer_id"`
+ ReadMessageID int `json:"read_message_id"`
+}
+
+// LikeAddObject struct.
+type LikeAddObject struct {
+ LikerID int `json:"liker_id"`
+ ObjectType string `json:"object_type"`
+ ObjectOwnerID int `json:"object_owner_id"`
+ ObjectID int `json:"object_id"`
+ ThreadReplyID int `json:"thread_reply_id"`
+ PostID int `json:"post_id"` // for comment
+}
+
+// LikeRemoveObject struct.
+type LikeRemoveObject struct {
+ LikerID int `json:"liker_id"`
+ ObjectType string `json:"object_type"`
+ ObjectOwnerID int `json:"object_owner_id"`
+ ObjectID int `json:"object_id"`
+ ThreadReplyID int `json:"thread_reply_id"`
+ PostID int `json:"post_id"` // for comment
+}
+
+// DonutSubscriptionCreateObject struct.
+type DonutSubscriptionCreateObject struct {
+ Amount int `json:"amount"`
+ AmountWithoutFee float64 `json:"amount_without_fee"`
+ UserID int `json:"user_id"`
+}
+
+// DonutSubscriptionProlongedObject struct.
+type DonutSubscriptionProlongedObject struct {
+ Amount int `json:"amount"`
+ AmountWithoutFee float64 `json:"amount_without_fee"`
+ UserID int `json:"user_id"`
+}
+
+// DonutSubscriptionExpiredObject struct.
+type DonutSubscriptionExpiredObject struct {
+ UserID int `json:"user_id"`
+}
+
+// DonutSubscriptionCancelledObject struct.
+type DonutSubscriptionCancelledObject struct {
+ UserID int `json:"user_id"`
+}
+
+// DonutSubscriptionPriceChangedObject struct.
+type DonutSubscriptionPriceChangedObject struct {
+ AmountOld int `json:"amount_old"`
+ AmountNew int `json:"amount_new"`
+ AmountDiff float64 `json:"amount_diff"`
+ AmountDiffWithoutFee float64 `json:"amount_diff_without_fee"`
+ UserID int `json:"user_id"`
+}
+
+// DonutMoneyWithdrawObject struct.
+type DonutMoneyWithdrawObject struct {
+ Amount int `json:"amount"`
+ AmountWithoutFee float64 `json:"amount_without_fee"`
+}
+
+// DonutMoneyWithdrawErrorObject struct.
+type DonutMoneyWithdrawErrorObject struct {
+ Reason string `json:"reason"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/go.mod b/vendor/github.com/SevereCloud/vksdk/v2/go.mod
new file mode 100644
index 00000000..27f7256f
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/go.mod
@@ -0,0 +1,10 @@
+module github.com/SevereCloud/vksdk/v2
+
+go 1.13
+
+require (
+ github.com/gorilla/schema v1.2.0
+ github.com/gorilla/websocket v1.4.2
+ github.com/stretchr/testify v1.6.1
+ golang.org/x/text v0.3.4
+)
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/go.sum b/vendor/github.com/SevereCloud/vksdk/v2/go.sum
new file mode 100644
index 00000000..a9885d73
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/go.sum
@@ -0,0 +1,18 @@
+github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc=
+github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/internal/charset.go b/vendor/github.com/SevereCloud/vksdk/v2/internal/charset.go
new file mode 100644
index 00000000..0174ebf2
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/internal/charset.go
@@ -0,0 +1,60 @@
+/*
+Package internal unimportable
+*/
+package internal // import "github.com/SevereCloud/vksdk/v2/internal"
+
+import (
+ "io"
+ "strings"
+
+ "golang.org/x/text/encoding/charmap"
+ "golang.org/x/text/runes"
+ "golang.org/x/text/transform"
+)
+
+// illegal is a collection of runes.
+type illegal struct{}
+
+// Contains return true.
+func (i illegal) Contains(r rune) bool {
+ return !(r == 0x09 ||
+ r == 0x0A ||
+ r == 0x0D ||
+ r >= 0x20 && r <= 0xDF77 ||
+ r >= 0xE000 && r <= 0xFFFD ||
+ r >= 0x10000 && r <= 0x10FFFF)
+}
+
+// XMLSanitizerReader creates an io.Reader that
+// wraps another io.Reader and removes illegal xml
+// characters from the io stream.
+func XMLSanitizerReader(xml io.Reader) io.Reader {
+ var i illegal
+ t := transform.Chain(runes.Remove(i))
+
+ return transform.NewReader(xml, t)
+}
+
+// CharsetUnknownError unknown charset.
+type CharsetUnknownError struct {
+ Name string
+}
+
+// Error returns the message of a CharsetUnknownError.
+func (c *CharsetUnknownError) Error() string {
+ return "unknown charset: " + c.Name
+}
+
+// CharsetReader if non-nil, defines a function to generate
+// charset-conversion readers, converting from the provided
+// non-UTF-8 charset into UTF-8. If CharsetReader is nil or
+// returns an error, parsing stops with an error. One of the
+// the CharsetReader's result values must be non-nil.
+func CharsetReader(charset string, input io.Reader) (io.Reader, error) {
+ switch strings.ToLower(charset) {
+ case "windows-1251":
+ return charmap.Windows1251.NewDecoder().Reader(input), nil
+ default:
+ return nil, &CharsetUnknownError{Name: charset}
+ }
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/internal/transport.go b/vendor/github.com/SevereCloud/vksdk/v2/internal/transport.go
new file mode 100644
index 00000000..2ff8fbb3
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/internal/transport.go
@@ -0,0 +1,74 @@
+/*
+Package internal unimportable
+*/
+package internal // import "github.com/SevereCloud/vksdk/v2/internal"
+
+import (
+ "context"
+ "net/http"
+
+ "github.com/SevereCloud/vksdk/v2"
+)
+
+// UserAgent module.
+const UserAgent = "vksdk/" + vksdk.Version + " (+https://github.com/SevereCloud/vksdk)"
+
+// ContextKey is just an empty struct. It exists so HTTPClient can be
+// an immutable public variable with a unique type. It's immutable
+// because nobody else can create a ContextKey, being unexported.
+type ContextKey int
+
+// ContextKey list.
+const (
+ HTTPClientKey ContextKey = iota
+ UserAgentKey
+ GroupIDKey
+ EventIDKey
+ LongPollTsKey
+ CallbackRetryCounterKey
+ CallbackRetryAfterKey
+)
+
+// ContextClient return *http.Client.
+func ContextClient(ctx context.Context) *http.Client {
+ if ctx != nil {
+ if hc, ok := ctx.Value(HTTPClientKey).(*http.Client); ok {
+ return hc
+ }
+ }
+
+ return http.DefaultClient
+}
+
+// ContextUserAgent return User-Agent from context.
+func ContextUserAgent(ctx context.Context) string {
+ if ctx != nil {
+ if hc, ok := ctx.Value(UserAgentKey).(string); ok {
+ return hc
+ }
+ }
+
+ return UserAgent
+}
+
+// DoRequest sends an HTTP request and returns an HTTP response.
+//
+// The provided ctx must be non-nil. If it is canceled or times out,
+// ctx.Err() will be returned.
+func DoRequest(ctx context.Context, req *http.Request) (*http.Response, error) {
+ client := ContextClient(ctx)
+
+ if req.UserAgent() == "" {
+ req.Header.Set("User-Agent", ContextUserAgent(ctx))
+ }
+
+ resp, err := client.Do(req.WithContext(ctx))
+ // If we got an error, and the context has been canceled,
+ // the context's error is probably more useful.
+ if err != nil {
+ <-ctx.Done()
+ err = ctx.Err()
+ }
+
+ return resp, err
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/README.md b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/README.md
new file mode 100644
index 00000000..94d87dba
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/README.md
@@ -0,0 +1,132 @@
+# Bots Long Poll API
+
+[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/longpoll-bot)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/longpoll-bot)
+[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/bots_longpoll)
+
+## Подключение Bots Long Poll API
+
+Long Poll настраивается автоматически. Вам не требуется заходить в настройки
+сообщества.
+
+### Версия API
+
+Данная библиотека поддерживает версию API **5.122**.
+
+### Инициализация
+
+Модуль можно использовать с ключом доступа пользователя, полученным в
+Standalone-приложении через Implicit Flow(требуются права доступа: **groups**)
+или с ключом доступа сообщества(требуются права доступа: **manage**).
+
+В начале необходимо инициализировать api:
+
+```go
+vk := api.NewVK("<TOKEN>")
+```
+
+А потом сам longpoll
+
+```go
+lp, err := longpoll.NewLongPoll(vk api.VK, groupID int)
+// По умолчанию Wait = 25
+// lp.Wait = 90
+// lp.Ts = "123"
+```
+
+### HTTP client
+
+В модуле реализована возможность изменять HTTP клиент - `lp.Client`
+
+Пример прокси
+
+```go
+dialer, _ := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, proxy.Direct)
+httpTransport := &http.Transport{
+ Dial: dialer.Dial,
+ // DisableKeepAlives: true,
+}
+httpTransport.Dial = dialer.Dial
+lp.Client.Transport = httpTransport
+```
+
+### Обработчик событий
+
+Для каждого события существует отдельный обработчик, который передает функции
+`ctx` и `object`.
+
+Пример для события `message_new`
+
+```go
+lp.MessageNew(func(ctx context.Context, obj events.MessageNewObject) {
+ ...
+})
+```
+
+Если вы хотите получать полный ответ от Long Poll(например для сохранения `ts`
+или специальной обработки `failed`), можно воспользоваться следующим обработчиком.
+
+```go
+lp.FullResponse(func(resp object.LongPollBotResponse) {
+ ...
+})
+```
+
+Полный список событий Вы найдёте [в документации](https://vk.com/dev/groups_events)
+
+### Контекст
+
+Поля `groupID`, `ts` и `eventID` передаются в `ctx`. Чтобы получить их, можно
+воспользоваться следующими функциями:
+
+```go
+groupID := events.GroupIDFromContext(ctx)
+eventID := events.EventIDFromContext(ctx)
+ts := longpoll.TsFromContext(ctx)
+```
+
+### Запуск и остановка
+
+```go
+// Запуск
+if err := lp.Run(); err != nil {
+ log.Fatal(err)
+}
+
+// Безопасное завершение
+// Ждет пока соединение закроется и события обработаются
+lp.Shutdown()
+
+// Закрыть соединение
+// Требует lp.Client.Transport = &http.Transport{DisableKeepAlives: true}
+lp.Client.CloseIdleConnections()
+```
+
+## Пример
+
+```go
+package main
+
+import (
+ "log"
+
+ "github.com/SevereCloud/vksdk/v2/api"
+
+ longpoll "github.com/SevereCloud/vksdk/v2/longpoll-bot"
+ "github.com/SevereCloud/vksdk/v2/events"
+)
+
+func main() {
+ vk := api.NewVK("<TOKEN>")
+ lp, err := longpoll.NewLongPoll(vk, 12345678)
+ if err != nil {
+ panic(err)
+ }
+
+ lp.MessageNew(func(ctx context.Context, obj events.MessageNewObject) {
+ log.Print(obj.Message.Text)
+ })
+
+ lp.Run()
+}
+
+```
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/context.go b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/context.go
new file mode 100644
index 00000000..cfc4fd90
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/context.go
@@ -0,0 +1,12 @@
+package longpoll // import "github.com/SevereCloud/vksdk/v2/longpoll-bot"
+
+import (
+ "context"
+
+ "github.com/SevereCloud/vksdk/v2/internal"
+)
+
+// TsFromContext returns the ts from context.
+func TsFromContext(ctx context.Context) int {
+ return ctx.Value(internal.LongPollTsKey).(int)
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/errors.go b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/errors.go
new file mode 100644
index 00000000..58d97c96
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/errors.go
@@ -0,0 +1,18 @@
+package longpoll
+
+import (
+ "fmt"
+)
+
+// Failed struct.
+type Failed struct {
+ Code int
+}
+
+// Error returns the message of a Failed.
+func (e Failed) Error() string {
+ return fmt.Sprintf(
+ "longpoll: failed code %d",
+ e.Code,
+ )
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/longpoll.go b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/longpoll.go
new file mode 100644
index 00000000..b230c4c1
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/longpoll-bot/longpoll.go
@@ -0,0 +1,219 @@
+/*
+Package longpoll implements Bots Long Poll API.
+
+See more https://vk.com/dev/bots_longpoll
+*/
+package longpoll // import "github.com/SevereCloud/vksdk/v2/longpoll-bot"
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+
+ "github.com/SevereCloud/vksdk/v2"
+ "github.com/SevereCloud/vksdk/v2/api"
+ "github.com/SevereCloud/vksdk/v2/events"
+ "github.com/SevereCloud/vksdk/v2/internal"
+)
+
+// Response struct.
+type Response struct {
+ Ts string `json:"ts"`
+ Updates []events.GroupEvent `json:"updates"`
+ Failed int `json:"failed"`
+}
+
+// LongPoll struct.
+type LongPoll struct {
+ GroupID int
+ Server string
+ Key string
+ Ts string
+ Wait int
+ VK *api.VK
+ Client *http.Client
+ cancel context.CancelFunc
+
+ funcFullResponseList []func(Response)
+
+ events.FuncList
+}
+
+// NewLongPoll returns a new LongPoll.
+//
+// The LongPoll will use the http.DefaultClient.
+// This means that if the http.DefaultClient is modified by other components
+// of your application the modifications will be picked up by the SDK as well.
+func NewLongPoll(vk *api.VK, groupID int) (*LongPoll, error) {
+ lp := &LongPoll{
+ VK: vk,
+ GroupID: groupID,
+ Wait: 25,
+ Client: http.DefaultClient,
+ }
+ lp.FuncList = *events.NewFuncList()
+
+ err := lp.updateServer(true)
+
+ return lp, err
+}
+
+// NewLongPollCommunity returns a new LongPoll for community token.
+//
+// The LongPoll will use the http.DefaultClient.
+// This means that if the http.DefaultClient is modified by other components
+// of your application the modifications will be picked up by the SDK as well.
+func NewLongPollCommunity(vk *api.VK) (*LongPoll, error) {
+ resp, err := vk.GroupsGetByID(nil)
+ if err != nil {
+ return nil, err
+ }
+
+ lp := &LongPoll{
+ VK: vk,
+ GroupID: resp[0].ID,
+ Wait: 25,
+ Client: http.DefaultClient,
+ }
+ lp.FuncList = *events.NewFuncList()
+
+ err = lp.updateServer(true)
+
+ return lp, err
+}
+
+func (lp *LongPoll) updateServer(updateTs bool) error {
+ params := api.Params{
+ "group_id": lp.GroupID,
+ }
+
+ serverSetting, err := lp.VK.GroupsGetLongPollServer(params)
+ if err != nil {
+ return err
+ }
+
+ lp.Key = serverSetting.Key
+ lp.Server = serverSetting.Server
+
+ if updateTs {
+ lp.Ts = serverSetting.Ts
+ }
+
+ return nil
+}
+
+func (lp *LongPoll) check(ctx context.Context) (response Response, err error) {
+ u := fmt.Sprintf("%s?act=a_check&key=%s&ts=%s&wait=%d", lp.Server, lp.Key, lp.Ts, lp.Wait)
+
+ req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
+ if err != nil {
+ return response, err
+ }
+
+ resp, err := lp.Client.Do(req)
+ if err != nil {
+ return response, err
+ }
+ defer resp.Body.Close()
+
+ err = json.NewDecoder(resp.Body).Decode(&response)
+ if err != nil {
+ return response, err
+ }
+
+ err = lp.checkResponse(response)
+
+ return response, err
+}
+
+func (lp *LongPoll) checkResponse(response Response) (err error) {
+ switch response.Failed {
+ case 0:
+ lp.Ts = response.Ts
+ case 1:
+ lp.Ts = response.Ts
+ case 2:
+ err = lp.updateServer(false)
+ case 3:
+ err = lp.updateServer(true)
+ default:
+ err = &Failed{response.Failed}
+ }
+
+ return
+}
+
+func (lp *LongPoll) autoSetting(ctx context.Context) error {
+ params := api.Params{
+ "group_id": lp.GroupID,
+ "enabled": true,
+ "api_version": vksdk.API,
+ }.WithContext(ctx)
+ for _, event := range lp.ListEvents() {
+ params[string(event)] = true
+ }
+
+ // Updating LongPoll settings
+ _, err := lp.VK.GroupsSetLongPollSettings(params)
+
+ return err
+}
+
+// Run handler.
+func (lp *LongPoll) Run() error {
+ return lp.RunWithContext(context.Background())
+}
+
+// RunWithContext handler.
+func (lp *LongPoll) RunWithContext(ctx context.Context) error {
+ return lp.run(ctx)
+}
+
+func (lp *LongPoll) run(ctx context.Context) error {
+ ctx, lp.cancel = context.WithCancel(ctx)
+
+ err := lp.autoSetting(ctx)
+ if err != nil {
+ return err
+ }
+
+ for {
+ select {
+ case _, ok := <-ctx.Done():
+ if !ok {
+ return nil
+ }
+ default:
+ resp, err := lp.check(ctx)
+ if err != nil {
+ return err
+ }
+
+ ctx = context.WithValue(ctx, internal.LongPollTsKey, resp.Ts)
+
+ for _, event := range resp.Updates {
+ err = lp.Handler(ctx, event)
+ if err != nil {
+ return err
+ }
+ }
+
+ for _, f := range lp.funcFullResponseList {
+ f(resp)
+ }
+ }
+ }
+}
+
+// Shutdown gracefully shuts down the longpoll without interrupting any active connections.
+func (lp *LongPoll) Shutdown() {
+ if lp.cancel != nil {
+ lp.cancel()
+ }
+}
+
+// FullResponse handler.
+func (lp *LongPoll) FullResponse(f func(Response)) {
+ lp.funcFullResponseList = append(lp.funcFullResponseList, f)
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/account.go b/vendor/github.com/SevereCloud/vksdk/v2/object/account.go
new file mode 100644
index 00000000..cac22def
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/account.go
@@ -0,0 +1,142 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// AccountNameRequest struct.
+type AccountNameRequest struct {
+ FirstName string `json:"first_name"` // First name in request
+ ID int `json:"id"` // Request ID needed to cancel the request
+ LastName string `json:"last_name"` // Last name in request
+ Status string `json:"status"`
+}
+
+// AccountPushConversations struct.
+type AccountPushConversations struct {
+ Count int `json:"count"` // Items count
+ Items []*AccountPushConversationsItem `json:"items"`
+}
+
+// AccountPushConversationsItem struct.
+type AccountPushConversationsItem struct {
+ DisabledUntil int `json:"disabled_until"` // Time until that notifications are disabled in seconds
+ PeerID int `json:"peer_id"` // Peer ID
+ Sound int `json:"sound"` // Information whether the sound are enabled
+}
+
+// AccountPushParams struct.
+type AccountPushParams struct {
+ AppRequest []string `json:"app_request"`
+ Birthday []string `json:"birthday"`
+ Chat []string `json:"chat"`
+ Comment []string `json:"comment"`
+ EventSoon []string `json:"event_soon"`
+ Friend []string `json:"friend"`
+ FriendAccepted []string `json:"friend_accepted"`
+ FriendFound []string `json:"friend_found"`
+ GroupAccepted []string `json:"group_accepted"`
+ GroupInvite []string `json:"group_invite"`
+ Like []string `json:"like"`
+ Mention []string `json:"mention"`
+ Msg []string `json:"msg"`
+ NewPost []string `json:"new_post"`
+ PhotosTag []string `json:"photos_tag"`
+ Reply []string `json:"reply"`
+ Repost []string `json:"repost"`
+ SdkOpen []string `json:"sdk_open"`
+ WallPost []string `json:"wall_post"`
+ WallPublish []string `json:"wall_publish"`
+}
+
+// AccountOffer struct.
+type AccountOffer struct {
+ Description string `json:"description"` // Offer description
+ ID int `json:"id"` // Offer ID
+ Img string `json:"img"` // URL of the preview image
+ Instruction string `json:"instruction"` // Instruction how to process the offer
+ InstructionHTML string `json:"instruction_html"` // Instruction how to process the offer (HTML format)
+ Price int `json:"price"` // Offer price
+ ShortDescription string `json:"short_description"` // Offer short description
+ Tag string `json:"tag"` // Offer tag
+ Title string `json:"title"` // Offer title
+}
+
+// AccountAccountCounters struct.
+type AccountAccountCounters struct {
+ AppRequests int `json:"app_requests"` // New app requests number
+ Events int `json:"events"` // New events number
+ Friends int `json:"friends"` // New friends requests number
+ FriendsRecommendations int `json:"friends_recommendations"` // New friends recommendations number
+ FriendsSuggestions int `json:"friends_suggestions"` // New friends suggestions number
+ Gifts int `json:"gifts"` // New gifts number
+ Groups int `json:"groups"` // New groups number
+ Messages int `json:"messages"` // New messages number
+ Notifications int `json:"notifications"` // New notifications number
+ Photos int `json:"photos"` // New photo tags number
+ SDK int `json:"sdk"` // New SDK number
+ MenuDiscoverBadge int `json:"menu_discover_badge"` // New menu discover badge number
+ MenuClipsBadge int `json:"menu_clips_badge"` // New menu clips badge number
+ Videos int `json:"videos"` // New video tags number
+ Faves int `json:"faves"` // New faves number
+}
+
+// AccountInfo struct.
+type AccountInfo struct {
+
+ // Country code.
+ Country string `json:"country"`
+
+ // Language ID.
+ Lang int `json:"lang"`
+
+ // Information whether HTTPS-only is enabled.
+ HTTPSRequired BaseBoolInt `json:"https_required"`
+
+ // Information whether user has been processed intro.
+ Intro BaseBoolInt `json:"intro"`
+
+ // Information whether wall comments should be hidden.
+ NoWallReplies BaseBoolInt `json:"no_wall_replies"`
+
+ // Information whether only owners posts should be shown.
+ OwnPostsDefault BaseBoolInt `json:"own_posts_default"`
+
+ // Two factor authentication is enabled.
+ TwoFactorRequired BaseBoolInt `json:"2fa_required"`
+ EuUser BaseBoolInt `json:"eu_user"`
+ CommunityComments BaseBoolInt `json:"community_comments"`
+ IsLiveStreamingEnabled BaseBoolInt `json:"is_live_streaming_enabled"`
+ IsNewLiveStreamingEnabled BaseBoolInt `json:"is_new_live_streaming_enabled"`
+ LinkRedirects map[string]string `json:"link_redirects"`
+}
+
+// AccountPushSettings struct.
+type AccountPushSettings struct {
+ Conversations AccountPushConversations `json:"conversations"`
+
+ // Information whether notifications are disabled.
+ Disabled BaseBoolInt `json:"disabled"`
+
+ // Time until that notifications are disabled in Unixtime.
+ DisabledUntil int `json:"disabled_until"`
+ Settings AccountPushParams `json:"settings"`
+}
+
+// AccountUserSettings struct.
+type AccountUserSettings struct {
+ Bdate string `json:"bdate"` // User's date of birth
+ BdateVisibility int `json:"bdate_visibility"` // Information whether user's birthdate are hidden
+ City BaseObject `json:"city"`
+ Country BaseCountry `json:"country"`
+ FirstName string `json:"first_name"` // User first name
+ HomeTown string `json:"home_town"` // User's hometown
+ LastName string `json:"last_name"` // User last name
+ MaidenName string `json:"maiden_name"` // User maiden name
+ NameRequest AccountNameRequest `json:"name_request"`
+ Phone string `json:"phone"` // User phone number with some hidden digits
+ Relation int `json:"relation"` // User relationship status
+ RelationPartner UsersUserMin `json:"relation_partner"`
+ RelationPending BaseBoolInt `json:"relation_pending"` // Information whether relation status is pending
+ RelationRequests []UsersUserMin `json:"relation_requests"`
+ ScreenName string `json:"screen_name"` // Domain name of the user's page
+ Sex int `json:"sex"` // User sex
+ Status string `json:"status"` // User status
+ ID int `json:"id"` // TODO: Check it https://vk.com/bug230405 (always return 0)
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/ads.go b/vendor/github.com/SevereCloud/vksdk/v2/object/ads.go
new file mode 100644
index 00000000..b2d7f135
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/ads.go
@@ -0,0 +1,321 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// AdsAccesses struct.
+type AdsAccesses struct {
+ ClientID string `json:"client_id"`
+ Role string `json:"role"`
+}
+
+// AdsAccount struct.
+type AdsAccount struct {
+ AccessRole string `json:"access_role"`
+ AccountID int `json:"account_id"` // Account ID
+ AccountName string `json:"account_name"`
+ AccountStatus BaseBoolInt `json:"account_status"` // Information whether account is active
+ CanViewBudget BaseBoolInt `json:"can_view_budget"`
+ AccountType string `json:"account_type"`
+}
+
+// AdsAdLayout struct.
+type AdsAdLayout struct {
+ AdFormat interface{} `json:"ad_format"` // Ad format
+ Description string `json:"description"` // Ad description
+ ImageSrc string `json:"image_src"` // Image URL
+ ImageSrc2x string `json:"image_src_2x"` // URL of the preview image in double size
+ LinkDomain string `json:"link_domain"` // Domain of advertised object
+ LinkURL string `json:"link_url"` // URL of advertised object
+ PreviewLink string `json:"preview_link"` // preview an ad as it is shown on the website
+ Title string `json:"title"` // Ad title
+ Video BaseBoolInt `json:"video"` // Information whether the ad is a video
+ ID string `json:"id"`
+ CampaignID int `json:"campaign_id"`
+ GoalType int `json:"goal_type"`
+ CostType int `json:"cost_type"`
+ AgeRestriction string `json:"age_restriction"`
+ LinkType string `json:"link_type"`
+}
+
+// AdsCampaign struct.
+type AdsCampaign struct {
+ AllLimit string `json:"all_limit"` // Campaign's total limit, rubles
+ DayLimit string `json:"day_limit"` // Campaign's day limit, rubles
+ ID int `json:"id"` // Campaign ID
+ Name string `json:"name"` // Campaign title
+ StartTime int `json:"start_time"` // Campaign start time, as Unixtime
+ Status int `json:"status"`
+ StopTime int `json:"stop_time"` // Campaign stop time, as Unixtime
+ Type string `json:"type"`
+}
+
+// AdsCategory struct.
+type AdsCategory struct {
+ ID int `json:"id"` // Category ID
+ Name string `json:"name"` // Category name
+ Subcategories []BaseObjectWithName `json:"subcategories"`
+}
+
+// AdsClient struct.
+type AdsClient struct {
+ AllLimit string `json:"all_limit"` // Client's total limit, rubles
+ DayLimit string `json:"day_limit"` // Client's day limit, rubles
+ ID int `json:"id"` // Client ID
+ Name string `json:"name"` // Client name
+}
+
+// AdsCriteria struct.
+type AdsCriteria struct {
+ AgeFrom int `json:"age_from"` // Age from
+ AgeTo int `json:"age_to"` // Age to
+ Apps string `json:"apps"` // Apps IDs
+ AppsNot string `json:"apps_not"` // Apps IDs to except
+ Birthday int `json:"birthday"` // Days to birthday
+ Cities string `json:"cities"` // Cities IDs
+ CitiesNot string `json:"cities_not"` // Cities IDs to except
+ Country int `json:"country"` // Country ID
+ Districts string `json:"districts"` // Districts IDs
+ Groups string `json:"groups"` // Communities IDs
+ InterestCategories string `json:"interest_categories"` // Interests categories IDs
+ Interests string `json:"interests"` // Interests
+
+ // Information whether the user has proceeded VK payments before.
+ Paying BaseBoolInt `json:"paying"`
+ Positions string `json:"positions"` // Positions IDs
+ Religions string `json:"religions"` // Religions IDs
+ RetargetingGroups string `json:"retargeting_groups"` // Retargeting groups IDs
+ RetargetingGroupsNot string `json:"retargeting_groups_not"` // Retargeting groups IDs to except
+ SchoolFrom int `json:"school_from"` // School graduation year from
+ SchoolTo int `json:"school_to"` // School graduation year to
+ Schools string `json:"schools"` // Schools IDs
+ Sex int `json:"sex"`
+ Stations string `json:"stations"` // Stations IDs
+ Statuses string `json:"statuses"` // Relationship statuses
+ Streets string `json:"streets"` // Streets IDs
+ Travellers int `json:"travellers"` // Travellers only
+ UniFrom int `json:"uni_from"` // University graduation year from
+ UniTo int `json:"uni_to"` // University graduation year to
+ UserBrowsers string `json:"user_browsers"` // Browsers
+ UserDevices string `json:"user_devices"` // Devices
+ UserOs string `json:"user_os"` // Operating systems
+}
+
+// AdsDemoStats struct.
+type AdsDemoStats struct {
+ ID int `json:"id"` // Object ID
+ Stats AdsDemostatsFormat `json:"stats"`
+ Type string `json:"type"`
+}
+
+// AdsDemostatsFormat struct.
+type AdsDemostatsFormat struct {
+ Age []AdsStatsAge `json:"age"`
+ Cities []AdsStatsCities `json:"cities"`
+ Day string `json:"day"` // Day as YYYY-MM-DD
+ Month string `json:"month"` // Month as YYYY-MM
+ Overall int `json:"overall"` // 1 if period=overall
+ Sex []AdsStatsSex `json:"sex"`
+ SexAge []AdsStatsSexAge `json:"sex_age"`
+}
+
+// AdsFloodStats struct.
+type AdsFloodStats struct {
+ Left int `json:"left"` // Requests left
+ Refresh int `json:"refresh"` // Time to refresh in seconds
+}
+
+// AdsLinkStatus link status.
+type AdsLinkStatus string
+
+// Possible values.
+const (
+ // allowed to use in ads.
+ AdsLinkAllowed AdsLinkStatus = "allowed"
+
+ // prohibited to use for this type of the object.
+ AdsLinkDisallowed AdsLinkStatus = "disallowed"
+
+ // checking, wait please.
+ AdsLinkInProgress AdsLinkStatus = "in_progress"
+)
+
+// AdsParagraphs struct.
+type AdsParagraphs struct {
+ Paragraph string `json:"paragraph"` // Rules paragraph
+}
+
+// AdsRejectReason struct.
+type AdsRejectReason struct {
+ Comment string `json:"comment"` // Comment text
+ Rules []AdsRules `json:"rules"`
+}
+
+// AdsRules struct.
+type AdsRules struct {
+ Paragraphs []AdsParagraphs `json:"paragraphs"`
+ Title string `json:"title"` // Comment
+}
+
+// AdsStats struct.
+type AdsStats struct {
+ ID int `json:"id"` // Object ID
+ Stats AdsStatsFormat `json:"stats"`
+ Type string `json:"type"`
+}
+
+// AdsStatsAge struct.
+type AdsStatsAge struct {
+ ClicksRate float64 `json:"clicks_rate"` // Clicks rate
+ ImpressionsRate float64 `json:"impressions_rate"` // Impressions rate
+ Value string `json:"value"` // Age interval
+}
+
+// AdsStatsCities struct.
+type AdsStatsCities struct {
+ ClicksRate float64 `json:"clicks_rate"` // Clicks rate
+ ImpressionsRate float64 `json:"impressions_rate"` // Impressions rate
+ Name string `json:"name"` // City name
+ Value int `json:"value"` // City ID
+}
+
+// AdsStatsFormat struct.
+type AdsStatsFormat struct {
+ Clicks int `json:"clicks"` // Clicks number
+ Day string `json:"day"` // Day as YYYY-MM-DD
+ Impressions int `json:"impressions"` // Impressions number
+ JoinRate int `json:"join_rate"` // Events number
+ Month string `json:"month"` // Month as YYYY-MM
+ Overall int `json:"overall"` // 1 if period=overall
+ Reach int `json:"reach"` // Reach
+ Spent int `json:"spent"` // Spent funds
+ VideoClicksSite int `json:"video_clicks_site"` // Click-thoughts to the advertised site
+ VideoViews int `json:"video_views"` // Video views number
+ VideoViewsFull int `json:"video_views_full"` // Video views (full video)
+ VideoViewsHalf int `json:"video_views_half"` // Video views (half of video)
+}
+
+// AdsStatsSex struct.
+type AdsStatsSex struct {
+ ClicksRate float64 `json:"clicks_rate"` // Clicks rate
+ ImpressionsRate float64 `json:"impressions_rate"` // Impressions rate
+ Value string `json:"value"`
+}
+
+// AdsStatsSexAge struct.
+type AdsStatsSexAge struct {
+ ClicksRate float64 `json:"clicks_rate"` // Clicks rate
+ ImpressionsRate float64 `json:"impressions_rate"` // Impressions rate
+ Value string `json:"value"` // Sex and age interval
+}
+
+// AdsTargSettings struct.
+type AdsTargSettings struct {
+}
+
+// AdsTargStats struct.
+type AdsTargStats struct {
+ AudienceCount int `json:"audience_count"` // Audience
+ RecommendedCpc float64 `json:"recommended_cpc"` // Recommended CPC value
+ RecommendedCpm float64 `json:"recommended_cpm"` // Recommended CPM value
+}
+
+// AdsTargSuggestions struct.
+type AdsTargSuggestions struct {
+ ID int `json:"id"` // Object ID
+ Name string `json:"name"` // Object name
+}
+
+// AdsTargSuggestionsCities struct.
+type AdsTargSuggestionsCities struct {
+ ID int `json:"id"` // Object ID
+ Name string `json:"name"` // Object name
+ Parent string `json:"parent"` // Parent object
+}
+
+// AdsTargSuggestionsRegions struct.
+type AdsTargSuggestionsRegions struct {
+ ID int `json:"id"` // Object ID
+ Name string `json:"name"` // Object name
+ Type string `json:"type"` // Object type
+}
+
+// AdsTargSuggestionsSchools struct.
+type AdsTargSuggestionsSchools struct {
+ Desc string `json:"desc"` // Full school title
+ ID int `json:"id"` // School ID
+ Name string `json:"name"` // School title
+ Parent string `json:"parent"` // City name
+ Type string `json:"type"`
+}
+
+// AdsTargetGroup struct.
+type AdsTargetGroup struct {
+ AudienceCount int `json:"audience_count"` // Audience
+ ID int `json:"id"` // Group ID
+ Lifetime int `json:"lifetime"` // Number of days for user to be in group
+ Name string `json:"name"` // Group name
+ LastUpdated int `json:"last_updated"`
+ IsAudience BaseBoolInt `json:"is_audience"`
+ IsShared BaseBoolInt `json:"is_shared"`
+ FileSource BaseBoolInt `json:"file_source"`
+ APISource BaseBoolInt `json:"api_source"`
+ LookalikeSource BaseBoolInt `json:"lookalike_source"`
+ Domain string `json:"domain,omitempty"` // Site domain
+ Pixel string `json:"pixel,omitempty"` // Pixel code
+}
+
+// AdsUsers struct.
+type AdsUsers struct {
+ Accesses []AdsAccesses `json:"accesses"`
+ UserID int `json:"user_id"` // User ID
+}
+
+// AdsAd struct.
+type AdsAd struct {
+ Approved string `json:"approved"`
+ AllLimit string `json:"all_limit"`
+ Category1ID string `json:"category1_id"`
+ Category2ID string `json:"category2_id"`
+ Cpm string `json:"cpm"`
+ AdFormat int `json:"ad_format"` // Ad format
+ AdPlatform interface{} `json:"ad_platform"` // Ad platform
+ CampaignID int `json:"campaign_id"` // Campaign ID
+ CostType int `json:"cost_type"`
+ Cpc int `json:"cpc"` // Cost of a click, kopecks
+ DisclaimerMedical BaseBoolInt `json:"disclaimer_medical"` // Information whether disclaimer is enabled
+ DisclaimerSpecialist BaseBoolInt `json:"disclaimer_specialist"` // Information whether disclaimer is enabled
+ DisclaimerSupplements BaseBoolInt `json:"disclaimer_supplements"` // Information whether disclaimer is enabled
+ Video BaseBoolInt `json:"video"` // Information whether the ad is a video
+ ImpressionsLimited BaseBoolInt `json:"impressions_limited"` // Information whether impressions are limited
+ Autobidding BaseBoolInt `json:"autobidding"`
+ ImpressionsLimit int `json:"impressions_limit"` // Impressions limit
+ ID string `json:"id"` // Ad ID
+ Name string `json:"name"` // Ad title
+ Status int `json:"status"`
+ CreateTime string `json:"create_time"`
+ UpdateTime string `json:"update_time"`
+ GoalType int `json:"goal_type"`
+ DayLimit string `json:"day_limit"`
+ StartTime string `json:"start_time"`
+ StopTime string `json:"stop_time"`
+ AgeRestriction string `json:"age_restriction"`
+ EventsRetargetingGroups interface{} `json:"events_retargeting_groups"`
+ ImpressionsLimitPeriod string `json:"impressions_limit_period"`
+}
+
+// AdsPromotedPostReach struct.
+type AdsPromotedPostReach struct {
+ Hide int `json:"hide"` // Hides amount
+ ID int `json:"id"` // Object ID from 'ids' parameter
+ JoinGroup int `json:"join_group"` // Community joins
+ Links int `json:"links"` // Link clicks
+ ReachSubscribers int `json:"reach_subscribers"` // Subscribers reach
+ ReachTotal int `json:"reach_total"` // Total reach
+ Report int `json:"report"` // Reports amount
+ ToGroup int `json:"to_group"` // Community clicks
+ Unsubscribe int `json:"unsubscribe"` // 'Unsubscribe' events amount
+ VideoViews100p int `json:"video_views_100p"` // Video views for 100 percent
+ VideoViews25p int `json:"video_views_25p"` // Video views for 25 percent
+ VideoViews3s int `json:"video_views_3s"` // Video views for 3 seconds
+ VideoViews50p int `json:"video_views_50p"` // Video views for 50 percent
+ VideoViews75p int `json:"video_views_75p"` // Video views for 75 percent
+ VideoViewsStart int `json:"video_views_start"` // Video starts
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/apps.go b/vendor/github.com/SevereCloud/vksdk/v2/object/apps.go
new file mode 100644
index 00000000..aaf4bbdb
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/apps.go
@@ -0,0 +1,101 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// AppsApp type application type.
+const (
+ AppTypeApp = "app"
+ AppTypeGame = "game"
+ AppTypeSite = "site"
+ AppTypeStandalone = "standalone"
+ AppTypeVkApp = "vk_app"
+ AppTypeCommunityApp = "community_app"
+ AppTypeHTML5Game = "html5_game"
+)
+
+// AppsLeaderboardType leaderboardType type.
+const (
+ AppsLeaderboardTypeNotSupported = iota
+ AppsLeaderboardTypeLevels
+ AppsLeaderboardTypePoints
+)
+
+// AppsScreenOrientation supported screen orientation.
+type AppsScreenOrientation int
+
+// Possible values.
+const (
+ AppsScreenOrientationBoth AppsScreenOrientation = iota
+ AppsScreenOrientationLandscape
+ AppsScreenOrientationPortrait
+)
+
+// AppsCatalogBanner struct.
+type AppsCatalogBanner struct {
+ BackgroundColor string `json:"background_color"`
+ DescriptionColor string `json:"description_color"`
+ Description string `json:"description"`
+ TitleColor string `json:"title_color"`
+}
+
+// AppsApp struct.
+type AppsApp struct {
+ AuthorOwnerID int `json:"author_owner_id"`
+ AuthorURL string `json:"author_url"`
+ Banner1120 string `json:"banner_1120"` // URL of the app banner with 1120 px in width
+ Banner560 string `json:"banner_560"` // URL of the app banner with 560 px in width
+ CatalogPosition int `json:"catalog_position"` // Catalog position
+ Description string `json:"description"` // Application description
+ Friends []int `json:"friends"`
+ Genre string `json:"genre"` // Genre name
+ GenreID int `json:"genre_id"` // Genre ID
+ Icon139 string `json:"icon_139"` // URL of the app icon with 139 px in width
+ Icon150 string `json:"icon_150"` // URL of the app icon with 150 px in width
+ Icon278 string `json:"icon_278"` // URL of the app icon with 279 px in width
+ Icon75 string `json:"icon_75"` // URL of the app icon with 75 px in width
+ ID int `json:"id"` // Application ID
+ International BaseBoolInt `json:"international"` // Information whether the application is multi language
+ IsInCatalog BaseBoolInt `json:"is_in_catalog"` // Information whether application is in mobile catalog
+ Installed BaseBoolInt `json:"installed"`
+ PushEnabled BaseBoolInt `json:"push_enabled"`
+ HideTabbar BaseBoolInt `json:"hide_tabbar"`
+ IsNew BaseBoolInt `json:"is_new"`
+ New BaseBoolInt `json:"new"`
+ IsInstalled BaseBoolInt `json:"is_installed"`
+ LeaderboardType int `json:"leaderboard_type"`
+ MembersCount int `json:"members_count"` // Members number
+ PlatformID int `json:"platform_id"` // Application ID in store
+
+ // Date when the application has been published in Unixtime.
+ PublishedDate int `json:"published_date"`
+ ScreenName string `json:"screen_name"` // Screen name
+ Screenshots []PhotosPhoto `json:"screenshots"`
+ Section string `json:"section"` // Application section name
+ Title string `json:"title"` // Application title
+ Type string `json:"type"`
+ Icon16 string `json:"icon_16"`
+ Icon576 string `json:"icon_576"`
+ ScreenOrientation AppsScreenOrientation `json:"screen_orientation"`
+ CatalogBanner AppsCatalogBanner `json:"catalog_banner"`
+
+ // mobile_controls_type = 0 - прозрачный элемент управления поверх области с игрой;
+ // mobile_controls_type = 1 - чёрная полоска над областью с игрой;
+ // mobile_controls_type = 2 - только для vk apps, без контроллов.
+ MobileControlsType int `json:"mobile_controls_type"`
+
+ // mobile_view_support_type = 0 - игра не использует нижнюю часть экрана на iPhoneX, черная полоса есть.
+ // mobile_view_support_type = 1 - игра использует нижнюю часть экрана на iPhoneX, черной полосы нет.
+ MobileViewSupportType int `json:"mobile_view_support_type"`
+}
+
+// AppsLeaderboard struct.
+type AppsLeaderboard struct {
+ Level int `json:"level"` // Level
+ Points int `json:"points"` // Points number
+ Score int `json:"score"` // Score number
+ UserID int `json:"user_id"` // User ID
+}
+
+// AppsScope Scope description.
+type AppsScope struct {
+ Name string `json:"name"` // Scope name
+ Title string `json:"title"` // Scope title
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/appwidgets.go b/vendor/github.com/SevereCloud/vksdk/v2/object/appwidgets.go
new file mode 100644
index 00000000..ac6d2492
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/appwidgets.go
@@ -0,0 +1,20 @@
+package object
+
+// AppWidgetsAppImageUploadResponse struct.
+type AppWidgetsAppImageUploadResponse struct {
+ Image string `json:"image"`
+ Hash string `json:"hash"`
+}
+
+// AppWidgetsGroupImageUploadResponse struct.
+type AppWidgetsGroupImageUploadResponse struct {
+ Image string `json:"image"`
+ Hash string `json:"hash"`
+}
+
+// AppWidgetsImage struct.
+type AppWidgetsImage struct {
+ ID string `json:"id"`
+ Type string `json:"type"`
+ Images []BaseImage `json:"images"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/audio.go b/vendor/github.com/SevereCloud/vksdk/v2/object/audio.go
new file mode 100644
index 00000000..4aec2412
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/audio.go
@@ -0,0 +1,67 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "fmt"
+)
+
+// AudioAudio struct.
+type AudioAudio struct {
+ AccessKey string `json:"access_key"` // Access key for the audio
+ ID int `json:"id"`
+ OwnerID int `json:"owner_id"`
+ Artist string `json:"artist"`
+ Title string `json:"title"`
+ Duration int `json:"duration"`
+ Date int `json:"date"`
+ URL string `json:"url"`
+ IsHq BaseBoolInt `json:"is_hq"`
+ IsExplicit BaseBoolInt `json:"is_explicit"`
+ StoriesAllowed BaseBoolInt `json:"stories_allowed"`
+ ShortVideosAllowed BaseBoolInt `json:"short_videos_allowed"`
+ IsFocusTrack BaseBoolInt `json:"is_focus_track"`
+ IsLicensed BaseBoolInt `json:"is_licensed"`
+ StoriesCoverAllowed BaseBoolInt `json:"stories_cover_allowed"`
+ LyricsID int `json:"lyrics_id"`
+ AlbumID int `json:"album_id"`
+ GenreID int `json:"genre_id"`
+ TrackCode string `json:"track_code"`
+ NoSearch int `json:"no_search"`
+ MainArtists []AudioAudioArtist `json:"main_artists"`
+ Ads AudioAds `json:"ads"`
+ Subtitle string `json:"subtitle"`
+}
+
+// ToAttachment return attachment format.
+func (audio AudioAudio) ToAttachment() string {
+ return fmt.Sprintf("audio%d_%d", audio.OwnerID, audio.ID)
+}
+
+// AudioAds struct.
+type AudioAds struct {
+ ContentID string `json:"content_id"`
+ Duration string `json:"duration"`
+ AccountAgeType string `json:"account_age_type"`
+ PUID1 string `json:"puid1"`
+ PUID22 string `json:"puid22"`
+}
+
+// AudioAudioArtist struct.
+type AudioAudioArtist struct {
+ Name string `json:"name"`
+ ID string `json:"id"`
+ Domain string `json:"domain"`
+}
+
+// AudioAudioUploadResponse struct.
+type AudioAudioUploadResponse struct {
+ Audio string `json:"audio"`
+ Hash string `json:"hash"`
+ Redirect string `json:"redirect"`
+ Server int `json:"server"`
+}
+
+// AudioLyrics struct.
+type AudioLyrics struct {
+ LyricsID int `json:"lyrics_id"`
+ Text string `json:"text"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/board.go b/vendor/github.com/SevereCloud/vksdk/v2/object/board.go
new file mode 100644
index 00000000..b8f6b5a3
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/board.go
@@ -0,0 +1,40 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// BoardTopic struct.
+type BoardTopic struct {
+ Comments int `json:"comments"` // Comments number
+ Created int `json:"created"` // Date when the topic has been created in Unixtime
+ CreatedBy int `json:"created_by"` // Creator ID
+ ID int `json:"id"` // Topic ID
+ IsClosed BaseBoolInt `json:"is_closed"` // Information whether the topic is closed
+ IsFixed BaseBoolInt `json:"is_fixed"` // Information whether the topic is fixed
+ Title string `json:"title"` // Topic title
+ Updated int `json:"updated"` // Date when the topic has been updated in Unixtime
+ UpdatedBy int `json:"updated_by"` // ID of user who updated the topic
+}
+
+// BoardTopicComment struct.
+type BoardTopicComment struct {
+ Attachments []WallCommentAttachment `json:"attachments"`
+ Date int `json:"date"` // Date when the comment has been added in Unixtime
+ FromID int `json:"from_id"` // Author ID
+ ID int `json:"id"` // Comment ID
+ // RealOffset int `json:"real_offset"` // Real position of the comment
+ Text string `json:"text"` // Comment text
+ // TopicID int `json:"topic_id"`
+ // TopicOwnerID int `json:"topic_owner_id"`
+ Likes BaseLikesInfo `json:"likes"`
+ CanEdit BaseBoolInt `json:"can_edit"` // Information whether current user can edit the comment
+}
+
+// BoardTopicPoll struct.
+type BoardTopicPoll struct {
+ AnswerID int `json:"answer_id"` // Current user's answer ID
+ Answers []PollsAnswer `json:"answers"`
+ Created int `json:"created"` // Date when poll has been created in Unixtime
+ IsClosed BaseBoolInt `json:"is_closed"` // Information whether the poll is closed
+ OwnerID int `json:"owner_id"` // Poll owner's ID
+ PollID int `json:"poll_id"` // Poll ID
+ Question string `json:"question"` // Poll question
+ Votes string `json:"votes"` // Votes number
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/database.go b/vendor/github.com/SevereCloud/vksdk/v2/object/database.go
new file mode 100644
index 00000000..e8cd9341
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/database.go
@@ -0,0 +1,50 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// DatabaseCity struct.
+type DatabaseCity struct {
+ ID int `json:"id"` // City ID
+ Title string `json:"title"` // City title
+ Area string `json:"area"`
+ Region string `json:"region"`
+ Important BaseBoolInt `json:"important"`
+}
+
+// DatabaseMetroStation struct.
+type DatabaseMetroStation struct {
+ ID int `json:"id"` // Metro station ID
+ Name string `json:"name"` // Metro station name
+ Color string `json:"color"` // Metro station color
+ CityID int `json:"city_id"` // Metro station city ID
+}
+
+// DatabaseFaculty struct.
+type DatabaseFaculty struct {
+ ID int `json:"id"` // Faculty ID
+ Title string `json:"title"` // Faculty title
+}
+
+// DatabaseRegion struct.
+type DatabaseRegion struct {
+ ID int `json:"id"` // Region ID
+ Title string `json:"title"` // Region title
+}
+
+// DatabaseSchool struct.
+type DatabaseSchool struct {
+ ID int `json:"id"` // School ID
+ Title string `json:"title"` // School title
+}
+
+// DatabaseStation struct.
+type DatabaseStation struct {
+ CityID int `json:"city_id"` // City ID
+ Color string `json:"color"` // Hex color code without #
+ ID int `json:"id"` // Station ID
+ Name string `json:"name"` // Station name
+}
+
+// DatabaseUniversity struct.
+type DatabaseUniversity struct {
+ ID int `json:"id"` // University ID
+ Title string `json:"title"` // University title
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/docs.go b/vendor/github.com/SevereCloud/vksdk/v2/object/docs.go
new file mode 100644
index 00000000..b7a880fa
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/docs.go
@@ -0,0 +1,117 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "fmt"
+)
+
+// DocsDoc struct.
+type DocsDoc struct {
+ AccessKey string `json:"access_key"` // Access key for the document
+ Date int `json:"date"` // Date when file has been uploaded in Unixtime
+ Ext string `json:"ext"` // File extension
+ ID int `json:"id"` // Document ID
+ IsLicensed BaseBoolInt `json:"is_licensed"`
+ OwnerID int `json:"owner_id"` // Document owner ID
+ Preview DocsDocPreview `json:"preview"`
+ Size int `json:"size"` // File size in bites
+ Title string `json:"title"` // Document title
+ Type int `json:"type"` // Document type
+ URL string `json:"url"` // File URL
+ DocsDocPreviewAudioMessage
+ DocsDocPreviewGraffiti
+}
+
+// ToAttachment return attachment format.
+func (doc DocsDoc) ToAttachment() string {
+ return fmt.Sprintf("doc%d_%d", doc.OwnerID, doc.ID)
+}
+
+// DocsDocPreview struct.
+type DocsDocPreview struct {
+ Photo DocsDocPreviewPhoto `json:"photo"`
+ Graffiti DocsDocPreviewGraffiti `json:"graffiti"`
+ Video DocsDocPreviewVideo `json:"video"`
+ AudioMessage DocsDocPreviewAudioMessage `json:"audio_message"`
+}
+
+// DocsDocPreviewPhoto struct.
+type DocsDocPreviewPhoto struct {
+ Sizes []DocsDocPreviewPhotoSizes `json:"sizes"`
+}
+
+// MaxSize return the largest DocsDocPreviewPhotoSizes.
+func (photo DocsDocPreviewPhoto) MaxSize() (maxPhotoSize DocsDocPreviewPhotoSizes) {
+ var max float64
+
+ for _, photoSize := range photo.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size > max {
+ max = size
+ maxPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// MinSize return the smallest DocsDocPreviewPhotoSizes.
+func (photo DocsDocPreviewPhoto) MinSize() (minPhotoSize DocsDocPreviewPhotoSizes) {
+ var min float64
+
+ for _, photoSize := range photo.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size < min || min == 0 {
+ min = size
+ minPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// DocsDocPreviewPhotoSizes struct.
+type DocsDocPreviewPhotoSizes struct {
+ // BUG(VK): json: cannot unmarshal number 162.000000 into Go struct field
+ // DocsDocPreviewPhotoSizes.doc.preview.photo.sizes.height of type Int
+ Height float64 `json:"height"` // Height in px
+ Src string `json:"src"` // URL of the image
+ Type string `json:"type"`
+ Width float64 `json:"width"` // Width in px
+}
+
+// DocsDocPreviewGraffiti struct.
+type DocsDocPreviewGraffiti struct {
+ Src string `json:"src"`
+ Width int `json:"width"`
+ Height int `json:"height"`
+}
+
+// DocsDocPreviewVideo struct.
+type DocsDocPreviewVideo struct {
+ FileSize int `json:"file_size"` // Video file size in bites
+ Height int `json:"height"` // Video's height in pixels
+ Src string `json:"src"` // Video URL
+ Width int `json:"width"` // Video's width in pixels
+}
+
+// DocsDocPreviewAudioMessage struct.
+type DocsDocPreviewAudioMessage struct {
+ Duration int `json:"duration"`
+ Waveform []int `json:"waveform"`
+ LinkOgg string `json:"link_ogg"`
+ LinkMp3 string `json:"link_mp3"`
+ Transcript string `json:"transcript"`
+ TranscriptState string `json:"transcript_state"`
+}
+
+// DocsDocTypes struct.
+type DocsDocTypes struct {
+ Count int `json:"count"` // Number of docs
+ ID int `json:"id"` // Doc type ID
+ Name string `json:"name"` // Doc type Title
+}
+
+// DocsDocUploadResponse struct.
+type DocsDocUploadResponse struct {
+ File string `json:"file"` // Uploaded file data
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/donut.go b/vendor/github.com/SevereCloud/vksdk/v2/object/donut.go
new file mode 100644
index 00000000..8148969b
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/donut.go
@@ -0,0 +1,9 @@
+package object
+
+// DonutDonatorSubscriptionInfo struct.
+type DonutDonatorSubscriptionInfo struct {
+ OwnerID int `json:"owner_id"`
+ NextPaymentDate int `json:"next_payment_date"`
+ Amount int `json:"amount"`
+ Status string `json:"status"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/fave.go b/vendor/github.com/SevereCloud/vksdk/v2/object/fave.go
new file mode 100644
index 00000000..802e7f66
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/fave.go
@@ -0,0 +1,41 @@
+package object
+
+// FaveTag struct.
+type FaveTag struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+}
+
+// FavePage struct.
+type FavePage struct {
+ Type string `json:"type"`
+ Description string `json:"description"`
+ Tags []FaveTag `json:"tags"`
+ UpdatedDate int `json:"updated_date"`
+ User UsersUser `json:"user"`
+ Group GroupsGroup `json:"group"`
+}
+
+// FaveFavesLink struct.
+type FaveFavesLink struct {
+ URL string `json:"url"`
+ Title string `json:"title"`
+ Caption string `json:"caption"`
+ Description string `json:"description"`
+ Photo PhotosPhoto `json:"photo"`
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ ID string `json:"id"`
+}
+
+// FaveItem struct.
+type FaveItem struct {
+ Type string `json:"type"`
+ Seen BaseBoolInt `json:"seen"`
+ AddedDate int `json:"added_date"`
+ Tags []FaveTag `json:"tags"`
+ Link FaveFavesLink `json:"link,omitempty"`
+ Post WallWallpost `json:"post,omitempty"`
+ Video VideoVideo `json:"video,omitempty"`
+ Product MarketMarketItem `json:"product,omitempty"`
+ Article Article `json:"article,omitempty"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/friends.go b/vendor/github.com/SevereCloud/vksdk/v2/object/friends.go
new file mode 100644
index 00000000..4f6866c3
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/friends.go
@@ -0,0 +1,63 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// FriendsFriendStatus FriendStatus type.
+const (
+ FriendsStatusNotFriend = iota // not a friend
+ FriendsStatusOutComingRequest // out coming request
+ FriendsStatusInComingRequest // incoming request
+ FriendsStatusIsFriend // is friend
+)
+
+// FriendsFriendStatus struct.
+type FriendsFriendStatus struct {
+ FriendStatus int `json:"friend_status"`
+ ReadState BaseBoolInt `json:"read_state"` // Information whether request is unviewed
+ RequestMessage string `json:"request_message"` // Message sent with request
+ Sign string `json:"sign"` // MD5 hash for the result validation
+ UserID int `json:"user_id"` // User ID
+}
+
+// FriendsFriendsList struct.
+type FriendsFriendsList struct {
+ ID int `json:"id"` // List ID
+ Name string `json:"name"` // List title
+}
+
+// type friendsMutualFriend struct {
+// CommonCount int `json:"common_count"` // Total mutual friends number
+// CommonFriends []int `json:"common_friends"`
+// ID int `json:"id"` // User ID
+// }
+
+// FriendsRequests struct.
+type FriendsRequests struct {
+ UsersUser
+ From string `json:"from"` // ID of the user by whom friend has been suggested
+ Mutual FriendsRequestsMutual `json:"mutual"`
+ UserID int `json:"user_id"` // User ID
+ TrackCode string `json:"track_code"`
+}
+
+// FriendsRequestsMutual struct.
+type FriendsRequestsMutual struct {
+ Count int `json:"count"` // Total mutual friends number
+ Users []int `json:"users"`
+}
+
+// FriendsRequestsXtrMessage struct.
+type FriendsRequestsXtrMessage struct {
+ FriendsRequests
+ Message string `json:"message"` // Message sent with a request
+}
+
+// FriendsUserXtrLists struct.
+type FriendsUserXtrLists struct {
+ UsersUser
+ Lists []int `json:"lists"` // IDs of friend lists with user
+}
+
+// FriendsUserXtrPhone struct.
+type FriendsUserXtrPhone struct {
+ UsersUser
+ Phone string `json:"phone"` // User phone
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/gifts.go b/vendor/github.com/SevereCloud/vksdk/v2/object/gifts.go
new file mode 100644
index 00000000..9abe95b2
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/gifts.go
@@ -0,0 +1,34 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// GiftsGift Privacy type.
+const (
+ GiftsGiftPrivacyForAll = iota // name and message for all
+ GiftsGiftPrivacyNameForAll // name for all
+ GiftsGiftPrivacyRecipientOnly // name and message for recipient only
+)
+
+// GiftsGift struct.
+type GiftsGift struct {
+ Date int `json:"date"` // Date when gist has been sent in Unixtime
+ FromID int `json:"from_id"` // Gift sender ID
+ Gift GiftsLayout `json:"gift"`
+ GiftHash string `json:"gift_hash"` // Hash
+ ID int `json:"id"` // Gift ID
+ Message string `json:"message"` // Comment text
+ Privacy int `json:"privacy"`
+
+ Description string `json:"description"`
+ PaymentType string `json:"payment_type"`
+ Price int `json:"price"`
+ PriceStr string `json:"price_str"`
+}
+
+// GiftsLayout struct.
+type GiftsLayout struct {
+ ID int `json:"id"`
+ Thumb256 string `json:"thumb_256"` // URL of the preview image with 256 px in width
+ Thumb48 string `json:"thumb_48"` // URL of the preview image with 48 px in width
+ Thumb96 string `json:"thumb_96"` // URL of the preview image with 96 px in width
+ StickersProductID int `json:"stickers_product_id"`
+ IsStickersStyle BaseBoolInt `json:"is_stickers_style"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/groups.go b/vendor/github.com/SevereCloud/vksdk/v2/object/groups.go
new file mode 100644
index 00000000..b66c1ee6
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/groups.go
@@ -0,0 +1,807 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "encoding/json"
+ "fmt"
+ "reflect"
+)
+
+// GroupsAddress WorkInfoStatus of information about timetable.
+const (
+ WorkStatusNoInformation = "no_information"
+ WorkStatusTemporarilyClosed = "temporarily_closed"
+ WorkStatusAlwaysOpened = "always_opened"
+ WorkStatusTimetable = "timetable"
+ WorkStatusForeverClosed = "forever_closed"
+)
+
+// GroupsAddress struct.
+type GroupsAddress struct {
+ // Additional address to the place (6 floor, left door).
+ AdditionalAddress string `json:"additional_address"`
+ Address string `json:"address"` // String address to the place (Nevsky, 28)
+ CityID int `json:"city_id"` // City id of address
+ CountryID int `json:"country_id"` // Country id of address
+ Distance int `json:"distance"` // Distance from the point
+ ID int `json:"id"` // Address id
+ Latitude float64 `json:"latitude"` // Address latitude
+ Longitude float64 `json:"longitude"` // Address longitude
+ MetroStationID int `json:"metro_station_id"` // Metro id of address
+ Phone string `json:"phone"` // Address phone
+ TimeOffset int `json:"time_offset"` // Time offset int minutes from utc time
+ Timetable GroupsAddressTimetable `json:"timetable"` // Week timetable for the address
+ Title string `json:"title"` // Title of the place (Zinger, etc)
+ WorkInfoStatus string `json:"work_info_status"` // Status of information about timetable
+}
+
+// GroupsAddressTimetable Timetable for a week.
+type GroupsAddressTimetable struct {
+ Fri GroupsAddressTimetableDay `json:"fri"` // Timetable for friday
+ Mon GroupsAddressTimetableDay `json:"mon"` // Timetable for monday
+ Sat GroupsAddressTimetableDay `json:"sat"` // Timetable for saturday
+ Sun GroupsAddressTimetableDay `json:"sun"` // Timetable for sunday
+ Thu GroupsAddressTimetableDay `json:"thu"` // Timetable for thursday
+ Tue GroupsAddressTimetableDay `json:"tue"` // Timetable for tuesday
+ Wed GroupsAddressTimetableDay `json:"wed"` // Timetable for wednesday
+}
+
+// GroupsAddressTimetableDay Timetable for one day.
+type GroupsAddressTimetableDay struct {
+ BreakCloseTime int `json:"break_close_time"` // Close time of the break in minutes
+ BreakOpenTime int `json:"break_open_time"` // Start time of the break in minutes
+ CloseTime int `json:"close_time"` // Close time in minutes
+ OpenTime int `json:"open_time"` // Open time in minutes
+}
+
+// GroupsAddressesInfo struct.
+type GroupsAddressesInfo struct {
+ IsEnabled BaseBoolInt `json:"is_enabled"` // Information whether addresses is enabled
+ MainAddressID int `json:"main_address_id"` // Main address id for group
+}
+
+// GroupsGroup AdminLevel type.
+const (
+ GroupsAdminLevelModerator = iota
+ GroupsAdminLevelEditor
+ GroupsAdminLevelAdministrator
+)
+
+// GroupsGroup MainSection type.
+const (
+ GroupsMainSectionAbsent = iota
+ GroupsMainSectionPhotos
+ GroupsMainSectionTopics
+ GroupsMainSectionAudio
+ GroupsMainSectionVideo
+ GroupsMainSectionMarket
+)
+
+// GroupsGroup MemberStatus(events_event_attach, newsfeed_event_activity).
+const (
+ GroupsMemberStatusNotMember = iota
+ GroupsMemberStatusMember
+ GroupsMemberStatusNotSure
+ GroupsMemberStatusDeclined
+ GroupsMemberStatusHasSentRequest
+ GroupsMemberStatusInvited
+)
+
+// GroupsGroup Access or IsClosed type.
+const (
+ GroupsGroupOpen = iota
+ GroupsGroupClosed
+ GroupsGroupPrivate
+)
+
+// GroupsGroup AgeLimits.
+const (
+ GroupsAgeLimitsNo = iota
+ GroupsAgeLimitsOver16
+ GroupsAgeLimitsOver18
+)
+
+// GroupsGroup type.
+const (
+ GroupsTypeGroup = "group"
+ GroupsTypePage = "page"
+ GroupsTypeEvent = "event"
+)
+
+// GroupsGroup struct.
+type GroupsGroup struct {
+ AdminLevel int `json:"admin_level"`
+ Deactivated string `json:"deactivated"` // Information whether community is banned
+ FinishDate int `json:"finish_date"` // Finish date in Unixtime format
+ ID int `json:"id"` // Community ID
+ Name string `json:"name"` // Community name
+ Photo100 string `json:"photo_100"` // URL of square photo of the community with 100 pixels in width
+ Photo200 string `json:"photo_200"` // URL of square photo of the community with 200 pixels in width
+ Photo50 string `json:"photo_50"` // URL of square photo of the community with 50 pixels in width
+ ScreenName string `json:"screen_name"` // Domain of the community page
+ StartDate int `json:"start_date"` // Start date in Unixtime format
+ Type string `json:"type"`
+ Market GroupsMarketInfo `json:"market"`
+ MemberStatus int `json:"member_status"` // Current user's member status
+ IsClosed int `json:"is_closed"`
+ City BaseObject `json:"city"`
+ Country BaseCountry `json:"country"`
+
+ // Information whether current user is administrator.
+ IsAdmin BaseBoolInt `json:"is_admin"`
+
+ // Information whether current user is advertiser.
+ IsAdvertiser BaseBoolInt `json:"is_advertiser"`
+
+ // Information whether current user is member.
+ IsMember BaseBoolInt `json:"is_member"`
+
+ // Information whether community is in faves.
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+
+ // Information whether community is adult.
+ IsAdult BaseBoolInt `json:"is_adult"`
+
+ // Information whether current user is subscribed.
+ IsSubscribed BaseBoolInt `json:"is_subscribed"`
+
+ // Information whether current user can post on community's wall.
+ CanPost BaseBoolInt `json:"can_post"`
+
+ // Information whether current user can see all posts on community's wall.
+ CanSeeAllPosts BaseBoolInt `json:"can_see_all_posts"`
+
+ // Information whether current user can create topic.
+ CanCreateTopic BaseBoolInt `json:"can_create_topic"`
+
+ // Information whether current user can upload video.
+ CanUploadVideo BaseBoolInt `json:"can_upload_video"`
+
+ // Information whether current user can upload doc.
+ CanUploadDoc BaseBoolInt `json:"can_upload_doc"`
+
+ // Information whether community has photo.
+ HasPhoto BaseBoolInt `json:"has_photo"`
+
+ // Information whether current user can send a message to community.
+ CanMessage BaseBoolInt `json:"can_message"`
+
+ // Information whether community can send a message to current user.
+ IsMessagesBlocked BaseBoolInt `json:"is_messages_blocked"`
+
+ // Information whether community can send notifications by phone number to current user.
+ CanSendNotify BaseBoolInt `json:"can_send_notify"`
+
+ // Information whether current user is subscribed to podcasts.
+ IsSubscribedPodcasts BaseBoolInt `json:"is_subscribed_podcasts"`
+
+ // Owner in whitelist or not.
+ CanSubscribePodcasts BaseBoolInt `json:"can_subscribe_podcasts"`
+
+ // Can subscribe to wall.
+ CanSubscribePosts BaseBoolInt `json:"can_subscribe_posts"`
+
+ // Information whether community has market app.
+ HasMarketApp BaseBoolInt `json:"has_market_app"`
+ IsHiddenFromFeed BaseBoolInt `json:"is_hidden_from_feed"`
+ IsMarketCartEnabled BaseBoolInt `json:"is_market_cart_enabled"`
+ Verified BaseBoolInt `json:"verified"` // Information whether community is verified
+
+ // Information whether the community has a fire pictogram.
+ Trending BaseBoolInt `json:"trending"`
+ Description string `json:"description"` // Community description
+ WikiPage string `json:"wiki_page"` // Community's main wiki page title
+ MembersCount int `json:"members_count"` // Community members number
+ Counters GroupsCountersGroup `json:"counters"`
+ Cover GroupsCover `json:"cover"`
+
+ // Type of group, start date of event or category of public page.
+ Activity string `json:"activity"`
+ FixedPost int `json:"fixed_post"` // Fixed post ID
+ Status string `json:"status"` // Community status
+ MainAlbumID int `json:"main_album_id"` // Community's main photo album ID
+ Links []GroupsLinksItem `json:"links"`
+ Contacts []GroupsContactsItem `json:"contacts"`
+ Site string `json:"site"` // Community's website
+ MainSection int `json:"main_section"`
+ OnlineStatus GroupsOnlineStatus `json:"online_status"` // Status of replies in community messages
+ AgeLimits int `json:"age_limits"` // Information whether age limit
+ BanInfo GroupsGroupBanInfo `json:"ban_info"` // User ban info
+ Addresses GroupsAddressesInfo `json:"addresses"` // Info about addresses in Groups
+ LiveCovers GroupsLiveCovers `json:"live_covers"`
+ CropPhoto UsersCropPhoto `json:"crop_photo"`
+ Wall int `json:"wall"`
+ ActionButton GroupsActionButton `json:"action_button"`
+ TrackCode string `json:"track_code"`
+ PublicDateLabel string `json:"public_date_label"`
+ AuthorID int `json:"author_id"`
+ Phone string `json:"phone"`
+}
+
+// ToMention return mention.
+func (group GroupsGroup) ToMention() string {
+ return fmt.Sprintf("[club%d|%s]", group.ID, group.Name)
+}
+
+// GroupsLiveCovers struct.
+type GroupsLiveCovers struct {
+ IsEnabled BaseBoolInt `json:"is_enabled"`
+ IsScalable BaseBoolInt `json:"is_scalable"`
+ StoryIds []string `json:"story_ids"`
+}
+
+// GroupsBanInfo reason type.
+const (
+ GroupsBanReasonOther = iota
+ GroupsBanReasonSpam
+ GroupsBanReasonVerbalAbuse
+ GroupsBanReasonStrongLanguage
+ GroupsBanReasonFlood
+)
+
+// GroupsBanInfo struct.
+type GroupsBanInfo struct {
+ AdminID int `json:"admin_id"` // Administrator ID
+ Comment string `json:"comment"` // Comment for a ban
+ Date int `json:"date"` // Date when user has been added to blacklist in Unixtime
+ EndDate int `json:"end_date"` // Date when user will be removed from blacklist in Unixtime
+ Reason int `json:"reason"`
+ CommentVisible BaseBoolInt `json:"comment_visible"`
+}
+
+// GroupsCallbackServer struct.
+type GroupsCallbackServer struct {
+ CreatorID int `json:"creator_id"`
+ ID int `json:"id"`
+ SecretKey string `json:"secret_key"`
+ Status string `json:"status"`
+ Title string `json:"title"`
+ URL string `json:"url"`
+}
+
+// GroupsCallbackSettings struct.
+type GroupsCallbackSettings struct {
+ APIVersion string `json:"api_version"` // API version used for the events
+ Events GroupsLongPollEvents `json:"events"`
+}
+
+// GroupsContactsItem struct.
+type GroupsContactsItem struct {
+ Desc string `json:"desc"` // Contact description
+ Email string `json:"email"` // Contact email
+ Phone string `json:"phone"` // Contact phone
+ UserID int `json:"user_id"` // User ID
+}
+
+// GroupsCountersGroup struct.
+type GroupsCountersGroup struct {
+ Addresses int `json:"addresses"` // Addresses number
+ Albums int `json:"albums"` // Photo albums number
+ Articles int `json:"articles"` // Articles number
+ Audios int `json:"audios"` // Audios number
+ Docs int `json:"docs"` // Docs number
+ Market int `json:"market"` // Market items number
+ Photos int `json:"photos"` // Photos number
+ Topics int `json:"topics"` // Topics number
+ Videos int `json:"videos"` // Videos number
+ Narratives int `json:"narratives"` // Narratives number
+}
+
+// GroupsCover struct.
+type GroupsCover struct {
+ Enabled BaseBoolInt `json:"enabled"` // Information whether cover is enabled
+ Images []BaseImage `json:"images"`
+}
+
+// GroupsGroupBanInfo struct.
+type GroupsGroupBanInfo struct {
+ Comment string `json:"comment"` // Ban comment
+ EndDate int `json:"end_date"` // End date of ban in Unixtime
+}
+
+// GroupsGroupCategory struct.
+type GroupsGroupCategory struct {
+ ID int `json:"id"` // Category ID
+ Name string `json:"name"` // Category name
+ Subcategories []BaseObjectWithName `json:"subcategories"`
+}
+
+// GroupsGroupCategoryFull struct.
+type GroupsGroupCategoryFull struct {
+ ID int `json:"id"` // Category ID
+ Name string `json:"name"` // Category name
+ PageCount int `json:"page_count"` // Pages number
+ PagePreviews []GroupsGroup `json:"page_previews"`
+ Subcategories []GroupsGroupCategoryFull `json:"subcategories"`
+}
+
+// GroupsGroupCategoryType struct.
+type GroupsGroupCategoryType struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+}
+
+// GroupsGroupLink struct.
+type GroupsGroupLink struct {
+ Desc string `json:"desc"` // Link description
+ EditTitle BaseBoolInt `json:"edit_title"` // Information whether the title can be edited
+ ImageProcessing BaseBoolInt `json:"image_processing"` // Information whether the image on processing
+ Name string `json:"name"`
+ ID int `json:"id"` // Link ID
+ URL string `json:"url"` // Link URL
+}
+
+// GroupsGroupPublicCategoryList struct.
+type GroupsGroupPublicCategoryList struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+ Subcategories []GroupsGroupCategoryType `json:"subcategories"`
+}
+
+// GroupsGroupSettings Photos type.
+const (
+ GroupsGroupPhotosDisabled = iota
+ GroupsGroupPhotosOpen
+ GroupsGroupPhotosLimited
+)
+
+// GroupsGroupSettings Subject type.
+const (
+ _ = iota
+ GroupsGroupSubjectAuto
+ GroupsGroupSubjectActivityHolidays
+ GroupsGroupSubjectBusiness
+ GroupsGroupSubjectPets
+ GroupsGroupSubjectHealth
+ GroupsGroupSubjectDatingAndCommunication
+ GroupsGroupSubjectGames
+ GroupsGroupSubjectIt
+ GroupsGroupSubjectCinema
+ GroupsGroupSubjectBeautyAndFashion
+ GroupsGroupSubjectCooking
+ GroupsGroupSubjectArtAndCulture
+ GroupsGroupSubjectLiterature
+ GroupsGroupSubjectMobileServicesAndInternet
+ GroupsGroupSubjectMusic
+ GroupsGroupSubjectScienceAndTechnology
+ GroupsGroupSubjectRealEstate
+ GroupsGroupSubjectNewsAndMedia
+ GroupsGroupSubjectSecurity
+ GroupsGroupSubjectEducation
+ GroupsGroupSubjectHomeAndRenovations
+ GroupsGroupSubjectPolitics
+ GroupsGroupSubjectFood
+ GroupsGroupSubjectIndustry
+ GroupsGroupSubjectTravel
+ GroupsGroupSubjectWork
+ GroupsGroupSubjectEntertainment
+ GroupsGroupSubjectReligion
+ GroupsGroupSubjectFamily
+ GroupsGroupSubjectSports
+ GroupsGroupSubjectInsurance
+ GroupsGroupSubjectTelevision
+ GroupsGroupSubjectGoodsAndServices
+ GroupsGroupSubjectHobbies
+ GroupsGroupSubjectFinance
+ GroupsGroupSubjectPhoto
+ GroupsGroupSubjectEsoterics
+ GroupsGroupSubjectElectronicsAndAppliances
+ GroupsGroupSubjectErotic
+ GroupsGroupSubjectHumor
+ GroupsGroupSubjectSocietyHumanities
+ GroupsGroupSubjectDesignAndGraphics
+)
+
+// GroupsGroupSettings Topics type.
+const (
+ GroupsGroupTopicsDisabled = iota
+ GroupsGroupTopicsOpen
+ GroupsGroupTopicsLimited
+)
+
+// GroupsGroupSettings Docs type.
+const (
+ GroupsGroupDocsDisabled = iota
+ GroupsGroupDocsOpen
+ GroupsGroupDocsLimited
+)
+
+// GroupsGroupSettings Audio type.
+const (
+ GroupsGroupAudioDisabled = iota
+ GroupsGroupAudioOpen
+ GroupsGroupAudioLimited
+)
+
+// GroupsGroupSettings Video type.
+const (
+ GroupsGroupVideoDisabled = iota
+ GroupsGroupVideoOpen
+ GroupsGroupVideoLimited
+)
+
+// GroupsGroupSettings Wall type.
+const (
+ GroupsGroupWallDisabled = iota
+ GroupsGroupWallOpen
+ GroupsGroupWallLimited
+ GroupsGroupWallClosed
+)
+
+// GroupsGroupSettings Wiki type.
+const (
+ GroupsGroupWikiDisabled = iota
+ GroupsGroupWikiOpen
+ GroupsGroupWikiLimited
+)
+
+// GroupsGroupSettings struct.
+type GroupsGroupSettings struct {
+ Access int `json:"access"` // Community access settings
+ Address string `json:"address"` // Community's page domain
+ Audio int `json:"audio"` // Audio settings
+ Description string `json:"description"` // Community description
+ Docs int `json:"docs"` // Docs settings
+ ObsceneWords []string `json:"obscene_words"` // The list of stop words
+ Photos int `json:"photos"` // Photos settings
+ PublicCategory int `json:"public_category"` // Information about the group category
+ PublicCategoryList []GroupsGroupPublicCategoryList `json:"public_category_list"`
+
+ // Information about the group subcategory.
+ PublicSubcategory int `json:"public_subcategory"`
+ Rss string `json:"rss"` // URL of the RSS feed
+ Subject int `json:"subject"` // Community subject ID
+ SubjectList []GroupsSubjectItem `json:"subject_list"`
+ Title string `json:"title"` // Community title
+ Topics int `json:"topics"` // Topics settings
+ Video int `json:"video"` // Video settings
+ Wall int `json:"wall"` // Wall settings
+ Website string `json:"website"` // Community website
+ Wiki int `json:"wiki"` // Wiki settings
+ CountryID int `json:"country_id"`
+ CityID int `json:"city_id"`
+ Messages int `json:"messages"`
+ Articles int `json:"articles"`
+ Events int `json:"events"`
+ AgeLimits int `json:"age_limits"`
+
+ // Information whether the obscene filter is enabled.
+ ObsceneFilter BaseBoolInt `json:"obscene_filter"`
+
+ // Information whether the stopwords filter is enabled.
+ ObsceneStopwords BaseBoolInt `json:"obscene_stopwords"`
+ LiveCovers struct {
+ IsEnabled BaseBoolInt `json:"is_enabled"`
+ } `json:"live_covers"`
+ Market GroupsMarketInfo `json:"market"`
+ SectionsList []GroupsSectionsList `json:"sections_list"`
+ MainSection int `json:"main_section"`
+ SecondarySection int `json:"secondary_section"`
+ ActionButton GroupsActionButton `json:"action_button"`
+ Phone string `json:"phone"`
+}
+
+// GroupsSectionsList struct.
+type GroupsSectionsList struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+}
+
+// UnmarshalJSON need for unmarshal dynamic array (Example: [1, "Фотографии"]) to struct.
+//
+// To unmarshal JSON into a value implementing the Unmarshaler interface,
+// Unmarshal calls that value's UnmarshalJSON method.
+// See more https://golang.org/pkg/encoding/json/#Unmarshal
+func (g *GroupsSectionsList) UnmarshalJSON(data []byte) error {
+ var alias []interface{}
+ if err := json.Unmarshal(data, &alias); err != nil {
+ return err
+ }
+
+ if len(alias) != 2 {
+ return &json.UnmarshalTypeError{
+ Value: string(data),
+ Type: reflect.TypeOf((*GroupsSectionsList)(nil)),
+ }
+ }
+
+ // default concrete Go type float64 for JSON numbers
+ id, ok := alias[0].(float64)
+ if !ok {
+ return &json.UnmarshalTypeError{
+ Value: string(data),
+ Type: reflect.TypeOf((*GroupsSectionsList)(nil)),
+ Struct: "GroupsSectionsList",
+ Field: "ID",
+ }
+ }
+
+ name, ok := alias[1].(string)
+ if !ok {
+ return &json.UnmarshalTypeError{
+ Value: string(data),
+ Type: reflect.TypeOf((*GroupsSectionsList)(nil)),
+ Struct: "GroupsSectionsList",
+ Field: "Name",
+ }
+ }
+
+ g.ID = int(id)
+ g.Name = name
+
+ return nil
+}
+
+// GroupsActionType for action_button in groups.
+type GroupsActionType string
+
+// GroupsActionType enums.
+const (
+ GroupsActionTypeOpenURL GroupsActionType = "open_url"
+ GroupsActionTypeSendEmail GroupsActionType = "send_email"
+ GroupsActionTypeCallPhone GroupsActionType = "call_phone"
+ GroupsActionTypeCallVK GroupsActionType = "call_vk"
+ GroupsActionTypeOpenGroupApp GroupsActionType = "open_group_app"
+ GroupsActionTypeOpenApp GroupsActionType = "open_app"
+)
+
+// GroupsActionButton struct.
+type GroupsActionButton struct {
+ ActionType GroupsActionType `json:"action_type"`
+ Target GroupsActionButtonTarget `json:"target"`
+ Title string `json:"title"`
+
+ // IsEnabled for GroupsGroupSettings
+ IsEnabled BaseBoolInt `json:"is_enabled,omitempty"`
+}
+
+// GroupsActionButtonTarget struct.
+type GroupsActionButtonTarget struct {
+ // ActionType == ActionTypeSendEmail
+ Email string `json:"email"`
+
+ // ActionType == ActionTypeCallPhone
+ Phone string `json:"phone"`
+
+ // ActionType == ActionTypeCallVK
+ UserID int `json:"user_id"`
+
+ // ActionType == ActionTypeOpenURL
+ URL string `json:"url"`
+
+ // ActionType == ActionTypeOpenApp
+ GoogleStoreURL string `json:"google_store_url"`
+ ItunesURL string `json:"itunes_url"`
+ // URL string `json:"url"`
+
+ // ActionType == ActionTypeOpenGroupApp
+ AppID int `json:"app_id"`
+
+ IsInternal BaseBoolInt `json:"is_internal"`
+}
+
+// GroupsGroupXtrInvitedBy struct.
+type GroupsGroupXtrInvitedBy struct {
+ AdminLevel int `json:"admin_level"`
+ ID int `json:"id"` // Community ID
+ InvitedBy int `json:"invited_by"` // Inviter ID
+ Name string `json:"name"` // Community name
+ Photo100 string `json:"photo_100"` // URL of square photo of the community with 100 pixels in width
+ Photo200 string `json:"photo_200"` // URL of square photo of the community with 200 pixels in width
+ Photo50 string `json:"photo_50"` // URL of square photo of the community with 50 pixels in width
+ ScreenName string `json:"screen_name"` // Domain of the community page
+ Type string `json:"type"`
+ IsClosed int `json:"is_closed"` // Information whether community is closed
+ IsAdmin BaseBoolInt `json:"is_admin"` // Information whether current user is manager
+ IsMember BaseBoolInt `json:"is_member"` // Information whether current user is member
+ IsAdvertiser BaseBoolInt `json:"is_advertiser"` // Information whether current user is advertiser
+}
+
+// ToMention return mention.
+func (group GroupsGroupXtrInvitedBy) ToMention() string {
+ return fmt.Sprintf("[club%d|%s]", group.ID, group.Name)
+}
+
+// GroupsLinksItem struct.
+type GroupsLinksItem struct {
+ Desc string `json:"desc"` // Link description
+ EditTitle BaseBoolInt `json:"edit_title"` // Information whether the link title can be edited
+ ID int `json:"id"` // Link ID
+ Name string `json:"name"` // Link title
+ Photo100 string `json:"photo_100"` // URL of square image of the link with 100 pixels in width
+ Photo50 string `json:"photo_50"` // URL of square image of the link with 50 pixels in width
+ URL string `json:"url"` // Link URL
+}
+
+// GroupsLongPollEvents struct.
+type GroupsLongPollEvents struct {
+ MessageNew BaseBoolInt `json:"message_new"`
+ MessageReply BaseBoolInt `json:"message_reply"`
+ PhotoNew BaseBoolInt `json:"photo_new"`
+ AudioNew BaseBoolInt `json:"audio_new"`
+ VideoNew BaseBoolInt `json:"video_new"`
+ WallReplyNew BaseBoolInt `json:"wall_reply_new"`
+ WallReplyEdit BaseBoolInt `json:"wall_reply_edit"`
+ WallReplyDelete BaseBoolInt `json:"wall_reply_delete"`
+ WallReplyRestore BaseBoolInt `json:"wall_reply_restore"`
+ WallPostNew BaseBoolInt `json:"wall_post_new"`
+ BoardPostNew BaseBoolInt `json:"board_post_new"`
+ BoardPostEdit BaseBoolInt `json:"board_post_edit"`
+ BoardPostRestore BaseBoolInt `json:"board_post_restore"`
+ BoardPostDelete BaseBoolInt `json:"board_post_delete"`
+ PhotoCommentNew BaseBoolInt `json:"photo_comment_new"`
+ PhotoCommentEdit BaseBoolInt `json:"photo_comment_edit"`
+ PhotoCommentDelete BaseBoolInt `json:"photo_comment_delete"`
+ PhotoCommentRestore BaseBoolInt `json:"photo_comment_restore"`
+ VideoCommentNew BaseBoolInt `json:"video_comment_new"`
+ VideoCommentEdit BaseBoolInt `json:"video_comment_edit"`
+ VideoCommentDelete BaseBoolInt `json:"video_comment_delete"`
+ VideoCommentRestore BaseBoolInt `json:"video_comment_restore"`
+ MarketCommentNew BaseBoolInt `json:"market_comment_new"`
+ MarketCommentEdit BaseBoolInt `json:"market_comment_edit"`
+ MarketCommentDelete BaseBoolInt `json:"market_comment_delete"`
+ MarketCommentRestore BaseBoolInt `json:"market_comment_restore"`
+ MarketOrderNew BaseBoolInt `json:"market_order_new"`
+ MarketOrderEdit BaseBoolInt `json:"market_order_edit"`
+ PollVoteNew BaseBoolInt `json:"poll_vote_new"`
+ GroupJoin BaseBoolInt `json:"group_join"`
+ GroupLeave BaseBoolInt `json:"group_leave"`
+ GroupChangeSettings BaseBoolInt `json:"group_change_settings"`
+ GroupChangePhoto BaseBoolInt `json:"group_change_photo"`
+ GroupOfficersEdit BaseBoolInt `json:"group_officers_edit"`
+ MessageAllow BaseBoolInt `json:"message_allow"`
+ MessageDeny BaseBoolInt `json:"message_deny"`
+ WallRepost BaseBoolInt `json:"wall_repost"`
+ UserBlock BaseBoolInt `json:"user_block"`
+ UserUnblock BaseBoolInt `json:"user_unblock"`
+ MessageEdit BaseBoolInt `json:"message_edit"`
+ MessageTypingState BaseBoolInt `json:"message_typing_state"`
+ LeadFormsNew BaseBoolInt `json:"lead_forms_new"`
+ LikeAdd BaseBoolInt `json:"like_add"`
+ LikeRemove BaseBoolInt `json:"like_remove"`
+ VkpayTransaction BaseBoolInt `json:"vkpay_transaction"`
+ AppPayload BaseBoolInt `json:"app_payload"`
+ MessageRead BaseBoolInt `json:"message_read"`
+ MessageEvent BaseBoolInt `json:"message_event"`
+ DonutSubscriptionCreate BaseBoolInt `json:"donut_subscription_create"`
+ DonutSubscriptionProlonged BaseBoolInt `json:"donut_subscription_prolonged"`
+ DonutSubscriptionExpired BaseBoolInt `json:"donut_subscription_expired"`
+ DonutSubscriptionCancelled BaseBoolInt `json:"donut_subscription_cancelled"`
+ DonutSubscriptionPriceChanged BaseBoolInt `json:"donut_subscription_price_changed"`
+ DonutMoneyWithdraw BaseBoolInt `json:"donut_money_withdraw"`
+ DonutMoneyWithdrawError BaseBoolInt `json:"donut_money_withdraw_error"`
+
+ // Bugs
+ // MessagesEdit BaseBoolInt `json:"messages_edit"`
+ // WallNew BaseBoolInt `json:"wall_new"`
+ // WallNewReply BaseBoolInt `json:"wall_new_reply"`
+ // WallEditReply BaseBoolInt `json:"wall_edit_reply"`
+}
+
+// GroupsLongPollServer struct.
+type GroupsLongPollServer struct {
+ Key string `json:"key"` // Long Poll key
+ Server string `json:"server"` // Long Poll server address
+ Ts string `json:"ts"` // Number of the last event
+}
+
+// TODO: func (g GroupsLongPollServer) GetURL() string {
+
+// GroupsLongPollSettings struct.
+type GroupsLongPollSettings struct {
+ APIVersion string `json:"api_version"` // API version used for the events
+ Events GroupsLongPollEvents `json:"events"`
+ IsEnabled BaseBoolInt `json:"is_enabled"` // Shows whether Long Poll is enabled
+}
+
+// GroupsMarketType ...
+type GroupsMarketType string
+
+// Possible values.
+const (
+ GroupsMarketBasic GroupsMarketType = "basic"
+ GroupsMarketAdvanced GroupsMarketType = "advanced"
+)
+
+// GroupsMarketInfo struct.
+type GroupsMarketInfo struct {
+ // information about the type of store. Returned if the group includes
+ // the "Products" section.
+ Type GroupsMarketType `json:"type,omitempty"`
+ ContactID int `json:"contact_id,omitempty"` // Contact person ID
+ Currency MarketCurrency `json:"currency,omitempty"`
+ CurrencyText string `json:"currency_text,omitempty"` // Currency name
+ Enabled BaseBoolInt `json:"enabled"` // Information whether the market is enabled
+ CommentsEnabled BaseBoolInt `json:"comments_enabled,omitempty"`
+ CanMessage BaseBoolInt `json:"can_message,omitempty"`
+ MainAlbumID int `json:"main_album_id,omitempty"` // Main market album ID
+ PriceMax string `json:"price_max,omitempty"` // Maximum price
+ PriceMin string `json:"price_min,omitempty"` // Minimum price
+ Wiki PagesWikipageFull `json:"wiki,omitempty"`
+ CityIDs []int `json:"city_ids"`
+ CountryIDs []int `json:"country_ids,omitempty"`
+}
+
+// GroupsGroupRole Role type.
+const (
+ GroupsGroupRoleModerator = "moderator"
+ GroupsGroupRoleEditor = "editor"
+ GroupsGroupRoleAdministrator = "administrator"
+ GroupsGroupRoleCreator = "creator"
+)
+
+// GroupsMemberRole struct.
+type GroupsMemberRole struct {
+ ID int `json:"id"` // User ID
+ Role string `json:"role"`
+ Permissions []string `json:"permissions"`
+}
+
+// GroupsMemberRoleXtrUsersUser struct.
+type GroupsMemberRoleXtrUsersUser struct {
+ UsersUser
+ Role string `json:"role"`
+ Permissions []string `json:"permissions"`
+}
+
+// GroupsMemberStatus struct.
+type GroupsMemberStatus struct {
+ Member BaseBoolInt `json:"member"` // Information whether user is a member of the group
+ UserID int `json:"user_id"` // User ID
+ Permissions []string `json:"permissions"`
+}
+
+// GroupsMemberStatusFull struct.
+type GroupsMemberStatusFull struct {
+ Invitation BaseBoolInt `json:"invitation"` // Information whether user has been invited to the group
+ Member BaseBoolInt `json:"member"` // Information whether user is a member of the group
+ Request BaseBoolInt `json:"request"` // Information whether user has send request to the group
+ CanInvite BaseBoolInt `json:"can_invite"` // Information whether user can be invite
+ CanRecall BaseBoolInt `json:"can_recall"` // Information whether user's invite to the group can be recalled
+ UserID int `json:"user_id"` // User ID
+}
+
+// GroupsOnlineStatus Status type.
+const (
+ GroupsOnlineStatusTypeNone = "none"
+ GroupsOnlineStatusTypeOnline = "online"
+ GroupsOnlineStatusTypeAnswerMark = "answer_mark"
+)
+
+// GroupsOnlineStatus struct.
+type GroupsOnlineStatus struct {
+ Minutes int `json:"minutes"` // Estimated time of answer (for status = answer_mark)
+ Status string `json:"status"`
+}
+
+// GroupsOwnerXtrBanInfo struct.
+type GroupsOwnerXtrBanInfo struct {
+ BanInfo GroupsBanInfo `json:"ban_info"`
+ Group GroupsGroup `json:"group"`
+ Profile UsersUser `json:"profile"`
+ Type string `json:"type"`
+}
+
+// GroupsSubjectItem struct.
+type GroupsSubjectItem struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+}
+
+// GroupsTokenPermissionSetting struct.
+type GroupsTokenPermissionSetting struct {
+ Name string `json:"name"`
+ Setting int `json:"setting"`
+}
+
+// GroupsTokenPermissions struct.
+type GroupsTokenPermissions struct {
+ Mask int `json:"mask"`
+ Permissions []GroupsTokenPermissionSetting `json:"permissions"`
+}
+
+// GroupsTag struct.
+type GroupsTag struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+ Color string `json:"color"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/leadforms.go b/vendor/github.com/SevereCloud/vksdk/v2/object/leadforms.go
new file mode 100644
index 00000000..6159fdf2
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/leadforms.go
@@ -0,0 +1,44 @@
+package object
+
+// LeadFormsForm struct.
+type LeadFormsForm struct {
+ FormID int `json:"form_id"`
+ GroupID int `json:"group_id"`
+ Photo interface{} `json:"photo"`
+ Name string `json:"name"`
+ Title string `json:"title"`
+ Description string `json:"description"`
+ Confirmation string `json:"confirmation"`
+ SiteLinkURL string `json:"site_link_url"`
+ PolicyLinkURL string `json:"policy_link_url"`
+ Questions []struct {
+ Type string `json:"type"`
+ Key string `json:"key"`
+ Label string `json:"label,omitempty"`
+ Options []struct {
+ Label string `json:"label"`
+ Key string `json:"key"`
+ } `json:"options,omitempty"`
+ } `json:"questions"`
+ Active int `json:"active"`
+ LeadsCount int `json:"leads_count"`
+ PixelCode string `json:"pixel_code"`
+ OncePerUser int `json:"once_per_user"`
+ NotifyAdmins string `json:"notify_admins"`
+ NotifyEmails string `json:"notify_emails"`
+ URL string `json:"url"`
+}
+
+// LeadFormsLead struct.
+type LeadFormsLead struct {
+ LeadID string `json:"lead_id"`
+ UserID string `json:"user_id"`
+ Date string `json:"date"`
+ Answers []struct {
+ Key string `json:"key"`
+ Answer struct {
+ Value string `json:"value"`
+ } `json:"answer"`
+ } `json:"answers"`
+ AdID string `json:"ad_id"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/leads.go b/vendor/github.com/SevereCloud/vksdk/v2/object/leads.go
new file mode 100644
index 00000000..a5d78fa0
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/leads.go
@@ -0,0 +1,55 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// LeadsChecked struct.
+type LeadsChecked struct {
+ Reason string `json:"reason"` // Reason why user can't start the lead
+ Result string `json:"result"`
+ Sid string `json:"sid"` // Session ID
+ StartLink string `json:"start_link"` // URL user should open to start the lead
+}
+
+// LeadsComplete struct.
+type LeadsComplete struct {
+ Cost int `json:"cost"` // Offer cost
+ Limit int `json:"limit"` // Offer limit
+ Spent int `json:"spent"` // Amount of spent votes
+ Success BaseBoolInt `json:"success"`
+ TestMode BaseBoolInt `json:"test_mode"` // Information whether test mode is enabled
+}
+
+// LeadsEntry struct.
+type LeadsEntry struct {
+ Aid int `json:"aid"` // Application ID
+ Comment string `json:"comment"` // Comment text
+ Date int `json:"date"` // Date when the action has been started in Unixtime
+ Sid string `json:"sid"` // Session string ID
+ StartDate int `json:"start_date"` // Start date in Unixtime (for status=2)
+ Status int `json:"status"` // Action type
+ TestMode BaseBoolInt `json:"test_mode"` // Information whether test mode is enabled
+ UID int `json:"uid"` // User ID
+}
+
+// LeadsLead struct.
+type LeadsLead struct {
+ Completed int `json:"completed"` // Completed offers number
+ Cost int `json:"cost"` // Offer cost
+ Days LeadsLeadDays `json:"days"`
+ Impressions int `json:"impressions"` // Impressions number
+ Limit int `json:"limit"` // Lead limit
+ Spent int `json:"spent"` // Amount of spent votes
+ Started int `json:"started"` // Started offers number
+}
+
+// LeadsLeadDays struct.
+type LeadsLeadDays struct {
+ Completed int `json:"completed"` // Completed offers number
+ Impressions int `json:"impressions"` // Impressions number
+ Spent int `json:"spent"` // Amount of spent votes
+ Started int `json:"started"` // Started offers number
+}
+
+// LeadsStart struct.
+type LeadsStart struct {
+ TestMode BaseBoolInt `json:"test_mode"` // Information whether test mode is enabled
+ VkSid string `json:"vk_sid"` // Session data
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/market.go b/vendor/github.com/SevereCloud/vksdk/v2/object/market.go
new file mode 100644
index 00000000..8f5d172f
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/market.go
@@ -0,0 +1,244 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+)
+
+// Information whether the MarketMarketItem is available.
+const (
+ MarketItemAvailable = iota
+ MarketItemRemoved
+ MarketItemUnavailable
+)
+
+// MarketCurrency struct.
+type MarketCurrency struct {
+ ID int `json:"id"` // Currency ID
+ Name string `json:"name"` // Currency sign
+}
+
+// MarketMarketAlbum struct.
+type MarketMarketAlbum struct {
+ Count int `json:"count"` // Items number
+ ID int `json:"id"` // Market album ID
+ OwnerID int `json:"owner_id"` // Market album owner's ID
+ Photo PhotosPhoto `json:"photo"`
+ Title string `json:"title"` // Market album title
+ UpdatedTime int `json:"updated_time"` // Date when album has been updated last time in Unixtime
+}
+
+// ToAttachment return attachment format.
+func (marketAlbum MarketMarketAlbum) ToAttachment() string {
+ return fmt.Sprintf("market_album%d_%d", marketAlbum.OwnerID, marketAlbum.ID)
+}
+
+// MarketMarketCategory struct.
+type MarketMarketCategory struct {
+ ID int `json:"id"` // Category ID
+ Name string `json:"name"` // Category name
+ Section MarketSection `json:"section"`
+}
+
+// MarketMarketItem struct.
+type MarketMarketItem struct {
+ AccessKey string `json:"access_key"` // Access key for the market item
+ Availability int `json:"availability"` // Information whether the item is available
+ Category MarketMarketCategory `json:"category"`
+
+ // Date when the item has been created in Unixtime.
+ Date int `json:"date,omitempty"`
+ Description string `json:"description"` // Item description
+ ID int `json:"id"` // Item ID
+ OwnerID int `json:"owner_id"` // Item owner's ID
+ Price MarketPrice `json:"price"`
+ ThumbPhoto string `json:"thumb_photo"` // URL of the preview image
+ Title string `json:"title"` // Item title
+ CanComment BaseBoolInt `json:"can_comment"`
+ CanRepost BaseBoolInt `json:"can_repost"`
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ IsMainVariant BaseBoolInt `json:"is_main_variant"`
+ AlbumsIDs []int `json:"albums_ids"`
+ Photos []PhotosPhoto `json:"photos"`
+ Likes BaseLikesInfo `json:"likes"`
+ Reposts BaseRepostsInfo `json:"reposts"`
+ ViewsCount int `json:"views_count,omitempty"`
+ URL string `json:"url"` // URL to item
+ ButtonTitle string `json:"button_title"`
+ ExternalID string `json:"external_id"`
+ Dimensions MarketDimensions `json:"dimensions"`
+ Weight int `json:"weight"`
+ VariantsGroupingID int `json:"variants_grouping_id"`
+ PropertyValues []MarketMarketItemProperty `json:"property_values"`
+ CartQuantity int `json:"cart_quantity"`
+}
+
+// UnmarshalJSON MarketMarketItem.
+//
+// BUG(VK): https://github.com/SevereCloud/vksdk/issues/147
+func (market *MarketMarketItem) UnmarshalJSON(data []byte) error {
+ if bytes.Equal(data, []byte("false")) {
+ return nil
+ }
+
+ type renamedMarketMarketItem MarketMarketItem
+
+ var r renamedMarketMarketItem
+
+ err := json.Unmarshal(data, &r)
+ if err != nil {
+ return err
+ }
+
+ *market = MarketMarketItem(r)
+
+ return nil
+}
+
+// MarketMarketItemProperty struct.
+type MarketMarketItemProperty struct {
+ VariantID int `json:"variant_id"`
+ VariantName string `json:"variant_name"`
+ PropertyName string `json:"property_name"`
+}
+
+// MarketDimensions struct.
+type MarketDimensions struct {
+ Width int `json:"width"`
+ Height int `json:"height"`
+ Length int `json:"length"`
+}
+
+// ToAttachment return attachment format.
+func (market MarketMarketItem) ToAttachment() string {
+ return fmt.Sprintf("market%d_%d", market.OwnerID, market.ID)
+}
+
+// MarketPrice struct.
+type MarketPrice struct {
+ Amount string `json:"amount"` // Amount
+ Currency MarketCurrency `json:"currency"`
+ DiscountRate int `json:"discount_rate"`
+ OldAmount string `json:"old_amount"`
+ Text string `json:"text"` // Text
+ OldAmountText string `json:"old_amount_text"`
+}
+
+// UnmarshalJSON MarketPrice.
+//
+// BUG(VK): unavailable product, in fave.get return [].
+func (m *MarketPrice) UnmarshalJSON(data []byte) error {
+ if bytes.Equal(data, []byte("[]")) {
+ return nil
+ }
+
+ type renamedMarketPrice MarketPrice
+
+ var r renamedMarketPrice
+
+ err := json.Unmarshal(data, &r)
+ if err != nil {
+ return err
+ }
+
+ *m = MarketPrice(r)
+
+ return nil
+}
+
+// MarketSection struct.
+type MarketSection struct {
+ ID int `json:"id"` // Section ID
+ Name string `json:"name"` // Section name
+}
+
+// MarketOrderStatus order status.
+type MarketOrderStatus int
+
+// Possible values.
+const (
+ MarketOrderNew MarketOrderStatus = iota
+ MarketOrderPending
+ MarketOrderProcessing
+ MarketOrderShipped
+ MarketOrderComplete
+ MarketOrderCanceled
+ MarketOrderRefund
+)
+
+// MarketOrder struct.
+type MarketOrder struct {
+ ID int `json:"id"`
+ GroupID int `json:"group_id"`
+ UserID int `json:"user_id"`
+ Date int `json:"date"`
+ Status MarketOrderStatus `json:"status"`
+ ItemsCount int `json:"items_count"`
+ TotalPrice MarketPrice `json:"total_price"`
+ DisplayOrderID string `json:"display_order_id"`
+ Comment string `json:"comment"`
+ PreviewOrderItems []MarketOrderItem `json:"preview_order_items"`
+ PriceDetails []MarketPriceDetail `json:"price_details"`
+ Delivery MarketOrderDelivery `json:"delivery"`
+ Recipient MarketOrderRecipient `json:"recipient"`
+}
+
+// MarketOrderDelivery struct.
+type MarketOrderDelivery struct {
+ TrackNumber string `json:"track_number"`
+ TrackLink string `json:"track_link"`
+ Address string `json:"address"`
+ Type string `json:"type"`
+ DeliveryPoint MarketDeliveryPoint `json:"delivery_point,omitempty"`
+}
+
+// MarketDeliveryPoint struct.
+type MarketDeliveryPoint struct {
+ ID int `json:"id"`
+ ExternalID string `json:"external_id"`
+ OutpostOnly BaseBoolInt `json:"outpost_only"`
+ CashOnly BaseBoolInt `json:"cash_only"`
+ Address MarketDeliveryPointAddress `json:"address"`
+ DisplayTitle string `json:"display_title"`
+ ServiceID int `json:"service_id"`
+}
+
+// MarketDeliveryPointAddress struct.
+type MarketDeliveryPointAddress struct {
+ ID int `json:"id"`
+ Address string `json:"address"`
+ CityID int `json:"city_id"`
+ CountryID int `json:"country_id"`
+ Latitude float64 `json:"latitude"`
+ Longitude float64 `json:"longitude"`
+ Phone string `json:"phone"`
+ Title string `json:"title"`
+ WorkInfoStatus string `json:"work_info_status"`
+}
+
+// MarketOrderRecipient struct.
+type MarketOrderRecipient struct {
+ Name string `json:"name"`
+ Phone string `json:"phone"`
+ DisplayText string `json:"display_text"`
+}
+
+// MarketOrderItem struct.
+type MarketOrderItem struct {
+ OwnerID int `json:"owner_id"`
+ ItemID int `json:"item_id"`
+ Price MarketPrice `json:"price"`
+ Quantity int `json:"quantity"`
+ Item MarketMarketItem `json:"item"`
+ Title string `json:"title"`
+ Photo PhotosPhoto `json:"photo"`
+ Variants []string `json:"variants"`
+}
+
+// MarketPriceDetail struct.
+type MarketPriceDetail struct {
+ Title string `json:"title"`
+ Price MarketPrice `json:"price"`
+ IsAccent BaseBoolInt `json:"is_accent,omitempty"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/messages.go b/vendor/github.com/SevereCloud/vksdk/v2/object/messages.go
new file mode 100644
index 00000000..dc2648b1
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/messages.go
@@ -0,0 +1,756 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+// MessagesAudioMessage struct.
+type MessagesAudioMessage struct {
+ AccessKey string `json:"access_key"` // Access key for the document
+ ID int `json:"id"` // Document ID
+ OwnerID int `json:"owner_id"` // Document owner ID
+ Duration int `json:"duration"` // Audio message duration in seconds
+ LinkMp3 string `json:"link_mp3"` // MP3 file URL
+ LinkOgg string `json:"link_ogg"` // OGG file URL
+ Waveform []int `json:"waveform"` // Sound visualisation
+}
+
+// ToAttachment return attachment format.
+func (doc MessagesAudioMessage) ToAttachment() string {
+ return fmt.Sprintf("doc%d_%d", doc.OwnerID, doc.ID)
+}
+
+// MessagesGraffiti struct.
+type MessagesGraffiti struct {
+ AccessKey string `json:"access_key"` // Access key for the document
+ ID int `json:"id"` // Document ID
+ OwnerID int `json:"owner_id"` // Document owner ID
+ URL string `json:"url"` // Graffiti URL
+ Width int `json:"width"` // Graffiti width
+ Height int `json:"height"` // Graffiti height
+}
+
+// ToAttachment return attachment format.
+func (doc MessagesGraffiti) ToAttachment() string {
+ return fmt.Sprintf("doc%d_%d", doc.OwnerID, doc.ID)
+}
+
+// MessagesMessage struct.
+type MessagesMessage struct {
+ // Only for messages from community. Contains user ID of community admin,
+ // who sent this message.
+ AdminAuthorID int `json:"admin_author_id"`
+ Action MessagesMessageAction `json:"action"`
+ Attachments []MessagesMessageAttachment `json:"attachments"`
+
+ // Unique auto-incremented number for all messages with this peer.
+ ConversationMessageID int `json:"conversation_message_id"`
+
+ // Date when the message has been sent in Unixtime.
+ Date int `json:"date"`
+
+ // Message author's ID.
+ FromID int `json:"from_id"`
+
+ // Forwarded messages.
+ FwdMessages []MessagesMessage `json:"fwd_Messages"`
+ ReplyMessage *MessagesMessage `json:"reply_message"`
+ Geo BaseMessageGeo `json:"geo"`
+ PinnedAt int `json:"pinned_at,omitempty"`
+ ID int `json:"id"` // Message ID
+ Deleted BaseBoolInt `json:"deleted"` // Is it an deleted message
+ Important BaseBoolInt `json:"important"` // Is it an important message
+ IsHidden BaseBoolInt `json:"is_hidden"`
+ IsCropped BaseBoolInt `json:"is_cropped"`
+ Out BaseBoolInt `json:"out"` // Information whether the message is outcoming
+ WasListened BaseBoolInt `json:"was_listened,omitempty"`
+ Keyboard MessagesKeyboard `json:"keyboard"`
+ Template MessagesTemplate `json:"template"`
+ Payload string `json:"payload"`
+ PeerID int `json:"peer_id"` // Peer ID
+
+ // ID used for sending messages. It returned only for outgoing messages.
+ RandomID int `json:"random_id"`
+ Ref string `json:"ref"`
+ RefSource string `json:"ref_source"`
+ Text string `json:"text"` // Message text
+ UpdateTime int `json:"update_time"` // Date when the message has been updated in Unixtime
+ MembersCount int `json:"members_count"` // Members number
+ ExpireTTL int `json:"expire_ttl"`
+}
+
+// MessagesBasePayload struct.
+type MessagesBasePayload struct {
+ ButtonType string `json:"button_type,omitempty"`
+ Command string `json:"command,omitempty"`
+ Payload string `json:"payload,omitempty"`
+}
+
+// Command for MessagesBasePayload.
+const (
+ CommandNotSupportedButton = "not_supported_button"
+)
+
+// MessagesKeyboard struct.
+type MessagesKeyboard struct {
+ AuthorID int `json:"author_id,omitempty"` // Community or bot, which set this keyboard
+ Buttons [][]MessagesKeyboardButton `json:"buttons"`
+ OneTime BaseBoolInt `json:"one_time,omitempty"` // Should this keyboard disappear on first use
+ Inline BaseBoolInt `json:"inline,omitempty"`
+}
+
+// NewMessagesKeyboard returns a new MessagesKeyboard.
+func NewMessagesKeyboard(oneTime BaseBoolInt) *MessagesKeyboard {
+ return &MessagesKeyboard{
+ Buttons: [][]MessagesKeyboardButton{},
+ OneTime: oneTime,
+ }
+}
+
+// NewMessagesKeyboardInline returns a new inline MessagesKeyboard.
+func NewMessagesKeyboardInline() *MessagesKeyboard {
+ return &MessagesKeyboard{
+ Buttons: [][]MessagesKeyboardButton{},
+ Inline: true,
+ }
+}
+
+// AddRow add row in MessagesKeyboard.
+func (keyboard *MessagesKeyboard) AddRow() *MessagesKeyboard {
+ if len(keyboard.Buttons) == 0 {
+ keyboard.Buttons = make([][]MessagesKeyboardButton, 1)
+ } else {
+ row := make([]MessagesKeyboardButton, 0)
+ keyboard.Buttons = append(keyboard.Buttons, row)
+ }
+
+ return keyboard
+}
+
+// AddTextButton add Text button in last row.
+func (keyboard *MessagesKeyboard) AddTextButton(label string, payload interface{}, color string) *MessagesKeyboard {
+ b, err := json.Marshal(payload)
+ if err != nil {
+ panic(err)
+ }
+
+ button := MessagesKeyboardButton{
+ Action: MessagesKeyboardButtonAction{
+ Type: ButtonText,
+ Label: label,
+ Payload: string(b),
+ },
+ Color: color,
+ }
+
+ lastRow := len(keyboard.Buttons) - 1
+ keyboard.Buttons[lastRow] = append(keyboard.Buttons[lastRow], button)
+
+ return keyboard
+}
+
+// AddOpenLinkButton add Open Link button in last row.
+func (keyboard *MessagesKeyboard) AddOpenLinkButton(link, label string, payload interface{}) *MessagesKeyboard {
+ b, err := json.Marshal(payload)
+ if err != nil {
+ panic(err)
+ }
+
+ button := MessagesKeyboardButton{
+ Action: MessagesKeyboardButtonAction{
+ Type: ButtonOpenLink,
+ Payload: string(b),
+ Label: label,
+ Link: link,
+ },
+ }
+
+ lastRow := len(keyboard.Buttons) - 1
+ keyboard.Buttons[lastRow] = append(keyboard.Buttons[lastRow], button)
+
+ return keyboard
+}
+
+// AddLocationButton add Location button in last row.
+func (keyboard *MessagesKeyboard) AddLocationButton(payload interface{}) *MessagesKeyboard {
+ b, err := json.Marshal(payload)
+ if err != nil {
+ panic(err)
+ }
+
+ button := MessagesKeyboardButton{
+ Action: MessagesKeyboardButtonAction{
+ Type: ButtonLocation,
+ Payload: string(b),
+ },
+ }
+
+ lastRow := len(keyboard.Buttons) - 1
+ keyboard.Buttons[lastRow] = append(keyboard.Buttons[lastRow], button)
+
+ return keyboard
+}
+
+// AddVKPayButton add VK Pay button in last row.
+func (keyboard *MessagesKeyboard) AddVKPayButton(payload interface{}, hash string) *MessagesKeyboard {
+ b, err := json.Marshal(payload)
+ if err != nil {
+ panic(err)
+ }
+
+ button := MessagesKeyboardButton{
+ Action: MessagesKeyboardButtonAction{
+ Type: ButtonVKPay,
+ Payload: string(b),
+ Hash: hash,
+ },
+ }
+
+ lastRow := len(keyboard.Buttons) - 1
+ keyboard.Buttons[lastRow] = append(keyboard.Buttons[lastRow], button)
+
+ return keyboard
+}
+
+// AddVKAppsButton add VK Apps button in last row.
+func (keyboard *MessagesKeyboard) AddVKAppsButton(
+ appID, ownerID int,
+ payload interface{},
+ label, hash string,
+) *MessagesKeyboard {
+ b, err := json.Marshal(payload)
+ if err != nil {
+ panic(err)
+ }
+
+ button := MessagesKeyboardButton{
+ Action: MessagesKeyboardButtonAction{
+ Type: ButtonVKApp,
+ AppID: appID,
+ OwnerID: ownerID,
+ Payload: string(b),
+ Label: label,
+ Hash: hash,
+ },
+ }
+
+ lastRow := len(keyboard.Buttons) - 1
+ keyboard.Buttons[lastRow] = append(keyboard.Buttons[lastRow], button)
+
+ return keyboard
+}
+
+// AddCallbackButton add Callback button in last row.
+func (keyboard *MessagesKeyboard) AddCallbackButton(label string, payload interface{}, color string) *MessagesKeyboard {
+ b, err := json.Marshal(payload)
+ if err != nil {
+ panic(err)
+ }
+
+ button := MessagesKeyboardButton{
+ Action: MessagesKeyboardButtonAction{
+ Type: ButtonCallback,
+ Label: label,
+ Payload: string(b),
+ },
+ Color: color,
+ }
+
+ lastRow := len(keyboard.Buttons) - 1
+ keyboard.Buttons[lastRow] = append(keyboard.Buttons[lastRow], button)
+
+ return keyboard
+}
+
+// ToJSON returns the JSON encoding of MessagesKeyboard.
+func (keyboard MessagesKeyboard) ToJSON() string {
+ b, _ := json.Marshal(keyboard)
+ return string(b)
+}
+
+// MessagesKeyboardButton struct.
+type MessagesKeyboardButton struct {
+ Action MessagesKeyboardButtonAction `json:"action"`
+ Color string `json:"color,omitempty"` // Button color
+}
+
+// MessagesKeyboardButtonAction struct.
+type MessagesKeyboardButtonAction struct {
+ AppID int `json:"app_id,omitempty"` // Fragment value in app link like vk.com/app{app_id}_-654321#hash
+ Hash string `json:"hash,omitempty"` // Fragment value in app link like vk.com/app123456_-654321#{hash}
+ Label string `json:"label,omitempty"` // Label for button
+ OwnerID int `json:"owner_id,omitempty"` // Fragment value in app link like vk.com/app123456_{owner_id}#hash
+ Payload string `json:"payload,omitempty"` // Additional data sent along with message for developer convenience
+ Type string `json:"type"` // Button type
+ Link string `json:"link,omitempty"` // Link URL
+}
+
+// MessagesEventDataShowSnackbar struct.
+type MessagesEventDataShowSnackbar struct {
+ Text string `json:"text,omitempty"`
+}
+
+// MessagesEventDataOpenLink struct.
+type MessagesEventDataOpenLink struct {
+ Link string `json:"link,omitempty"`
+}
+
+// MessagesEventDataOpenApp struct.
+type MessagesEventDataOpenApp struct {
+ AppID int `json:"app_id,omitempty"`
+ OwnerID int `json:"owner_id,omitempty"`
+ Hash string `json:"hash,omitempty"`
+}
+
+// MessagesEventData struct.
+type MessagesEventData struct {
+ Type string `json:"type"`
+ MessagesEventDataShowSnackbar
+ MessagesEventDataOpenLink
+ MessagesEventDataOpenApp
+}
+
+// NewMessagesEventDataShowSnackbar show disappearing message.
+//
+// Contains the field text - the text you want to print
+// (maximum 90 characters). Snackbar is shown for 10 seconds and automatically
+// hides, while the user has the ability to flick it off the screen.
+func NewMessagesEventDataShowSnackbar(text string) *MessagesEventData {
+ return &MessagesEventData{
+ Type: "show_snackbar",
+ MessagesEventDataShowSnackbar: MessagesEventDataShowSnackbar{
+ Text: text,
+ },
+ }
+}
+
+// NewMessagesEventDataOpenLink open the link. Click on the specified address.
+func NewMessagesEventDataOpenLink(link string) *MessagesEventData {
+ return &MessagesEventData{
+ Type: "open_link",
+ MessagesEventDataOpenLink: MessagesEventDataOpenLink{
+ Link: link,
+ },
+ }
+}
+
+// NewMessagesEventDataOpenApp open the link. Click on the specified address.
+func NewMessagesEventDataOpenApp(appID, ownerID int, hash string) *MessagesEventData {
+ return &MessagesEventData{
+ Type: "open_app",
+ MessagesEventDataOpenApp: MessagesEventDataOpenApp{
+ AppID: appID,
+ OwnerID: ownerID,
+ Hash: hash,
+ },
+ }
+}
+
+// ToJSON returns the JSON encoding of MessagesEventData.
+func (eventData MessagesEventData) ToJSON() string {
+ b, _ := json.Marshal(eventData)
+ return string(b)
+}
+
+// MessagesTemplate struct.
+//
+// https://vk.com/dev/bot_docs_templates
+type MessagesTemplate struct {
+ Type string `json:"type"`
+ Elements []MessagesTemplateElement `json:"elements"`
+}
+
+// ToJSON returns the JSON encoding of MessagesKeyboard.
+func (template MessagesTemplate) ToJSON() string {
+ b, _ := json.Marshal(template)
+ return string(b)
+}
+
+// MessagesTemplateElement struct.
+type MessagesTemplateElement struct {
+ MessagesTemplateElementCarousel
+}
+
+// MessagesTemplateElementCarousel struct.
+type MessagesTemplateElementCarousel struct {
+ Title string `json:"title"`
+ Action MessagesTemplateElementCarouselAction `json:"action"`
+ Description string `json:"description"`
+ Photo PhotosPhoto `json:"photo"`
+ Buttons []MessagesKeyboardButton `json:"buttons"`
+}
+
+// MessagesTemplateElementCarouselAction struct.
+type MessagesTemplateElementCarouselAction struct {
+ Type string `json:"type"`
+ Link string `json:"link"`
+}
+
+// MessageContentSourceMessage ...
+type MessageContentSourceMessage struct {
+ OwnerID int `json:"owner_id,omitempty"`
+ PeerID int `json:"peer_id,omitempty"`
+ ConversationMessageID int `json:"conversation_message_id,omitempty"`
+}
+
+// MessageContentSourceURL ...
+type MessageContentSourceURL struct {
+ URL string `json:"url,omitempty"`
+}
+
+// MessageContentSource struct.
+//
+// https://vk.com/dev/bots_docs_2
+type MessageContentSource struct {
+ Type string `json:"type"`
+ MessageContentSourceMessage // type message
+ MessageContentSourceURL // type url
+
+}
+
+// NewMessageContentSourceMessage ...
+func NewMessageContentSourceMessage(ownerID, peerID, conversationMessageID int) *MessageContentSource {
+ return &MessageContentSource{
+ Type: "message",
+ MessageContentSourceMessage: MessageContentSourceMessage{
+ OwnerID: ownerID,
+ PeerID: peerID,
+ ConversationMessageID: conversationMessageID,
+ },
+ }
+}
+
+// NewMessageContentSourceURL ...
+func NewMessageContentSourceURL(u string) *MessageContentSource {
+ return &MessageContentSource{
+ Type: "url",
+ MessageContentSourceURL: MessageContentSourceURL{
+ URL: u,
+ },
+ }
+}
+
+// ToJSON returns the JSON encoding of MessageContentSource.
+func (contentSource MessageContentSource) ToJSON() string {
+ b, _ := json.Marshal(contentSource)
+ return string(b)
+}
+
+// MessagesChat struct.
+type MessagesChat struct {
+ AdminID int `json:"admin_id"` // Chat creator ID
+ ID int `json:"id"` // Chat ID
+ IsDefaultPhoto BaseBoolInt `json:"is_default_photo"`
+ Photo100 string `json:"photo_100"` // URL of the preview image with 100 px in width
+ Photo200 string `json:"photo_200"` // URL of the preview image with 200 px in width
+ Photo50 string `json:"photo_50"` // URL of the preview image with 50 px in width
+ Title string `json:"title"` // Chat title
+ Type string `json:"type"` // Chat type
+ Users []int `json:"users"`
+ MembersCount int `json:"members_count"`
+}
+
+// MessagesChatPreview struct.
+type MessagesChatPreview struct {
+ AdminID int `json:"admin_id"`
+ MembersCount int `json:"members_count"`
+ Members []int `json:"members"`
+ Title string `json:"title"`
+ Photo MessagesChatSettingsPhoto `json:"photo"`
+ LocalID int `json:"local_id"`
+ Joined bool `json:"joined"`
+ ChatSettings MessagesConversationChatSettings `json:"chat_settings"`
+}
+
+// MessagesChatPushSettings struct.
+type MessagesChatPushSettings struct {
+ DisabledUntil int `json:"disabled_until"` // Time until that notifications are disabled
+ Sound BaseBoolInt `json:"sound"` // Information whether the sound is on
+}
+
+// MessagesChatSettingsPhoto struct.
+type MessagesChatSettingsPhoto struct {
+ Photo100 string `json:"photo_100"`
+ Photo200 string `json:"photo_200"`
+ Photo50 string `json:"photo_50"`
+ IsDefaultPhoto BaseBoolInt `json:"is_default_photo"`
+}
+
+// MessagesConversation struct.
+type MessagesConversation struct {
+ CanWrite MessagesConversationCanWrite `json:"can_write"`
+ ChatSettings MessagesConversationChatSettings `json:"chat_settings"`
+ InRead int `json:"in_read"` // Last message user have read
+ LastMessageID int `json:"last_message_id"` // ID of the last message in conversation
+ Mentions []int `json:"mentions"` // IDs of messages with mentions
+ MessageRequest string `json:"message_request"`
+
+ // Last outcoming message have been read by the opponent.
+ OutRead int `json:"out_read"`
+ Peer MessagesConversationPeer `json:"peer"`
+ PushSettings MessagesConversationPushSettings `json:"push_settings"`
+ Important BaseBoolInt `json:"important"`
+ Unanswered BaseBoolInt `json:"unanswered"`
+ IsMarkedUnread BaseBoolInt `json:"is_marked_unread"`
+ UnreadCount int `json:"unread_count"` // Unread messages number
+ CurrentKeyboard MessagesKeyboard `json:"current_keyboard"`
+ SortID struct {
+ MajorID int `json:"major_id"`
+ MinorID int `json:"minor_id"`
+ } `json:"sort_id"`
+}
+
+// MessagesConversationCanWrite struct.
+type MessagesConversationCanWrite struct {
+ Allowed BaseBoolInt `json:"allowed"`
+ Reason int `json:"reason"`
+}
+
+// MessagesConversationChatSettings struct.
+type MessagesConversationChatSettings struct {
+ MembersCount int `json:"members_count"`
+ Photo MessagesChatSettingsPhoto `json:"photo"`
+ PinnedMessage MessagesPinnedMessage `json:"pinned_message"`
+ State string `json:"state"`
+ Title string `json:"title"`
+ ActiveIDs []int `json:"active_ids"`
+ ACL struct {
+ CanInvite BaseBoolInt `json:"can_invite"`
+ CanChangeInfo BaseBoolInt `json:"can_change_info"`
+ CanChangePin BaseBoolInt `json:"can_change_pin"`
+ CanPromoteUsers BaseBoolInt `json:"can_promote_users"`
+ CanSeeInviteLink BaseBoolInt `json:"can_see_invite_link"`
+ CanChangeInviteLink BaseBoolInt `json:"can_change_invite_link"`
+ CanCopyChat BaseBoolInt `json:"can_copy_chat"`
+ CanModerate BaseBoolInt `json:"can_moderate"`
+ CanCall BaseBoolInt `json:"can_call"`
+ CanUseMassMentions BaseBoolInt `json:"can_use_mass_mentions"`
+ CanChangeServiceType BaseBoolInt `json:"can_change_service_type"`
+ } `json:"acl"`
+ IsGroupChannel BaseBoolInt `json:"is_group_channel"`
+ IsDisappearing BaseBoolInt `json:"is_disappearing"`
+ IsService BaseBoolInt `json:"is_service"`
+ IsCreatedForCall BaseBoolInt `json:"is_created_for_call"`
+ OwnerID int `json:"owner_id"`
+ AdminIDs []int `json:"admin_ids"`
+ Permissions MessagesChatPermissions `json:"permissions"`
+}
+
+// MessagesChatPermission struct.
+type MessagesChatPermission string
+
+// Possible values.
+const (
+ OwnerChatPermission MessagesChatPermission = "owner"
+ OwnerAndAdminsChatPermission MessagesChatPermission = "owner_and_admins"
+ AllChatPermission MessagesChatPermission = "all"
+)
+
+// MessagesChatPermissions struct.
+type MessagesChatPermissions struct {
+ Invite MessagesChatPermission `json:"invite"`
+ ChangeInfo MessagesChatPermission `json:"change_info"`
+ ChangePin MessagesChatPermission `json:"change_pin"`
+ UseMassMentions MessagesChatPermission `json:"use_mass_mentions"`
+ SeeInviteLink MessagesChatPermission `json:"see_invite_link"`
+ Call MessagesChatPermission `json:"call"`
+ ChangeAdmins MessagesChatPermission `json:"change_admins"`
+}
+
+// MessagesConversationPeer struct.
+type MessagesConversationPeer struct {
+ ID int `json:"id"`
+ LocalID int `json:"local_id"`
+ Type string `json:"type"`
+}
+
+// MessagesConversationPushSettings struct.
+type MessagesConversationPushSettings struct {
+ DisabledUntil int `json:"disabled_until"`
+ DisabledForever BaseBoolInt `json:"disabled_forever"`
+ NoSound BaseBoolInt `json:"no_sound"`
+}
+
+// MessagesConversationWithMessage struct.
+type MessagesConversationWithMessage struct {
+ Conversation MessagesConversation `json:"conversation"`
+ // BUG(VK): https://vk.com/bug229134
+ LastMessage MessagesMessage `json:"last_message"`
+}
+
+// MessagesDialog struct.
+type MessagesDialog struct {
+ Important int `json:"important"`
+ InRead int `json:"in_read"`
+ Message MessagesMessage `json:"message"`
+ OutRead int `json:"out_read"`
+ Unanswered int `json:"unanswered"`
+ Unread int `json:"unread"`
+}
+
+// MessagesHistoryAttachment struct.
+type MessagesHistoryAttachment struct {
+ Attachment MessagesHistoryMessageAttachment `json:"attachment"`
+ MessageID int `json:"message_id"` // Message ID
+ FromID int `json:"from_id"`
+}
+
+// MessagesHistoryMessageAttachment struct.
+type MessagesHistoryMessageAttachment struct {
+ Audio AudioAudio `json:"audio"`
+ Doc DocsDoc `json:"doc"`
+ Link BaseLink `json:"link"`
+ Market BaseLink `json:"market"`
+ Photo PhotosPhoto `json:"photo"`
+ Share BaseLink `json:"share"`
+ Type string `json:"type"`
+ Video VideoVideo `json:"video"`
+ Wall BaseLink `json:"wall"`
+}
+
+// MessagesLastActivity struct.
+type MessagesLastActivity struct {
+ Online BaseBoolInt `json:"online"` // Information whether user is online
+ Time int `json:"time"` // Time when user was online in Unixtime
+}
+
+// MessagesLongPollParams struct.
+type MessagesLongPollParams struct {
+ Key string `json:"key"` // Key
+ Pts int `json:"pts"` // Persistent timestamp
+ Server string `json:"server"` // Server URL
+ Ts int `json:"ts"` // Timestamp
+}
+
+// MessagesMessageAction status.
+const (
+ ChatPhotoUpdate = "chat_photo_update"
+ ChatPhotoRemove = "chat_photo_remove"
+ ChatCreate = "chat_create"
+ ChatTitleUpdate = "chat_title_update"
+ ChatInviteUser = "chat_invite_user"
+ ChatKickUser = "chat_kick_user"
+ ChatPinMessage = "chat_pin_message"
+ ChatUnpinMessage = "chat_unpin_message"
+ ChatInviteUserByLink = "chat_invite_user_by_link"
+ AcceptedMessageRequest = "accepted_message_request"
+)
+
+// MessagesMessageAction struct.
+type MessagesMessageAction struct {
+ ConversationMessageID int `json:"conversation_message_id"` // Message ID
+
+ // Email address for chat_invite_user or chat_kick_user actions.
+ Email string `json:"email"`
+ MemberID int `json:"member_id"` // User or email peer ID
+ Message string `json:"message"` // Message body of related message
+ Photo MessagesMessageActionPhoto `json:"photo"`
+
+ // New chat title for chat_create and chat_title_update actions.
+ Text string `json:"text"`
+ Type string `json:"type"`
+}
+
+// MessagesMessageActionPhoto struct.
+type MessagesMessageActionPhoto struct {
+ Photo100 string `json:"photo_100"` // URL of the preview image with 100px in width
+ Photo200 string `json:"photo_200"` // URL of the preview image with 200px in width
+ Photo50 string `json:"photo_50"` // URL of the preview image with 50px in width
+}
+
+// MessagesMessageAttachment struct.
+type MessagesMessageAttachment struct {
+ Audio AudioAudio `json:"audio"`
+ Doc DocsDoc `json:"doc"`
+ Gift GiftsLayout `json:"gift"`
+ Link BaseLink `json:"link"`
+ Market MarketMarketItem `json:"market"`
+ MarketMarketAlbum MarketMarketAlbum `json:"market_market_album"`
+ Photo PhotosPhoto `json:"photo"`
+ Sticker BaseSticker `json:"sticker"`
+ Type string `json:"type"`
+ Video VideoVideo `json:"video"`
+ Wall WallWallpost `json:"wall"`
+ WallReply WallWallComment `json:"wall_reply"`
+ AudioMessage DocsDoc `json:"audio_message"`
+ Graffiti DocsDoc `json:"graffiti"`
+ Poll PollsPoll `json:"poll"`
+ Call MessageCall `json:"call"`
+ Story StoriesStory `json:"story"`
+ Podcast PodcastsEpisode `json:"podcast"`
+}
+
+// State in which call ended up.
+//
+// TODO: v3 type CallEndState.
+const (
+ CallEndStateCanceledByInitiator = "canceled_by_initiator"
+ CallEndStateCanceledByReceiver = "canceled_by_receiver"
+ CallEndStateReached = "reached"
+)
+
+// MessageCall struct.
+type MessageCall struct {
+ InitiatorID int `json:"initiator_id"`
+ ReceiverID int `json:"receiver_id"`
+ State string `json:"state"`
+ Time int `json:"time"`
+ Duration int `json:"duration"`
+ Video BaseBoolInt `json:"video"`
+}
+
+// MessagesPinnedMessage struct.
+type MessagesPinnedMessage struct {
+ Attachments []MessagesMessageAttachment `json:"attachments"`
+
+ // Unique auto-incremented number for all Messages with this peer.
+ ConversationMessageID int `json:"conversation_message_id"`
+
+ // Date when the message has been sent in Unixtime.
+ Date int `json:"date"`
+
+ // Message author's ID.
+ FromID int `json:"from_id"`
+ FwdMessages []*MessagesMessage `json:"fwd_Messages"`
+ Geo BaseMessageGeo `json:"geo"`
+ ID int `json:"id"` // Message ID
+ PeerID int `json:"peer_id"` // Peer ID
+ ReplyMessage *MessagesMessage `json:"reply_message"`
+ Text string `json:"text"` // Message text
+}
+
+// MessagesUserXtrInvitedBy struct.
+type MessagesUserXtrInvitedBy struct {
+}
+
+// MessagesForward struct.
+type MessagesForward struct {
+ // Message owner. It is worth passing it on if you want to forward messages
+ // from the community to a dialog.
+ OwnerID int `json:"owner_id,omitempty"`
+
+ // Identifier of the place from which the messages are to be sent.
+ PeerID int `json:"peer_id,omitempty"`
+
+ // Messages can be passed to conversation_message_ids array:
+ //
+ // - that are in a personal dialog with the bot;
+ //
+ // - which are outbound messages from the bot;
+ //
+ // - written after the bot has entered the conversation.
+ ConversationMessageIDs []int `json:"conversation_message_ids,omitempty"`
+ MessageIDs []int `json:"message_ids,omitempty"`
+
+ // Reply to messages. It is worth passing if you want to reply to messages
+ // in the chat room where the messages are. In this case there should be
+ // only one element in the conversation_message_ids/message_ids.
+ IsReply bool `json:"is_reply,omitempty"`
+}
+
+// ToJSON returns the JSON encoding of MessagesForward.
+func (forward MessagesForward) ToJSON() string {
+ b, _ := json.Marshal(forward)
+ return string(b)
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/newsfeed.go b/vendor/github.com/SevereCloud/vksdk/v2/object/newsfeed.go
new file mode 100644
index 00000000..e9bda35a
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/newsfeed.go
@@ -0,0 +1,187 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// NewsfeedEventActivity struct.
+type NewsfeedEventActivity struct {
+ Address string `json:"address"` // address of event
+ ButtonText string `json:"button_text"` // text of attach
+ Friends []int `json:"friends"` // array of friends ids
+ MemberStatus int `json:"member_status"` // Current user's member status
+ Text string `json:"text"` // text of attach
+ Time int `json:"time"` // event start time
+}
+
+// NewsfeedItemAudio struct.
+type NewsfeedItemAudio struct {
+ Audio NewsfeedItemAudioAudio `json:"audio"`
+}
+
+// NewsfeedItemAudioAudio struct.
+type NewsfeedItemAudioAudio struct {
+ Count int `json:"count"` // Audios number
+ Items []AudioAudio `json:"items"`
+}
+
+// NewsfeedItemDigest struct.
+type NewsfeedItemDigest struct {
+ ButtonText string `json:"button_text"`
+ FeedID string `json:"feed_id"` // id of feed in digest
+ Items []WallWallpost `json:"items"`
+ MainPostIDs []string `json:"main_post_ids"`
+ Template string `json:"template"` // type of digest
+ Title string `json:"title"`
+ TrackCode string `json:"track_code"`
+ // Type string `json:"type"`
+}
+
+// NewsfeedItemFriend struct.
+type NewsfeedItemFriend struct {
+ Friends NewsfeedItemFriendFriends `json:"friends"`
+}
+
+// NewsfeedItemFriendFriends struct.
+type NewsfeedItemFriendFriends struct {
+ Count int `json:"count"` // Number of friends has been added
+ Items []BaseUserID `json:"items"`
+}
+
+// NewsfeedItemNote struct.
+type NewsfeedItemNote struct {
+ Notes NewsfeedItemNoteNotes `json:"notes"`
+}
+
+// NewsfeedItemNoteNotes struct.
+type NewsfeedItemNoteNotes struct {
+ Count int `json:"count"` // Notes number
+ Items []NewsfeedNewsfeedNote `json:"items"`
+}
+
+// NewsfeedItemPhoto struct.
+type NewsfeedItemPhoto struct {
+ Photos NewsfeedItemPhotoPhotos `json:"photos"`
+}
+
+// NewsfeedItemPhotoPhotos struct.
+type NewsfeedItemPhotoPhotos struct {
+ Count int `json:"count"` // Photos number
+ Items []PhotosPhotoFull `json:"items"`
+}
+
+// NewsfeedItemPhotoTag struct.
+type NewsfeedItemPhotoTag struct {
+ PhotoTags NewsfeedItemPhotoTagPhotoTags `json:"photo_tags"`
+}
+
+// NewsfeedItemPhotoTagPhotoTags struct.
+type NewsfeedItemPhotoTagPhotoTags struct {
+ Count int `json:"count"` // Tags number
+ Items []PhotosPhotoFull `json:"items"`
+}
+
+// NewsfeedItemStoriesBlock struct.
+type NewsfeedItemStoriesBlock struct {
+ BlockType string `json:"block_type"`
+ Stories []StoriesStory `json:"stories"`
+ // Title string `json:"title"`
+ // TrackCode string `json:"track_code"`
+ // Type string `json:"type"`
+}
+
+// NewsfeedItemTopic struct.
+type NewsfeedItemTopic struct {
+ // Comments BaseCommentsInfo `json:"comments"`
+ // Likes BaseLikesInfo `json:"likes"`
+ // Text string `json:"text"` // Post text
+}
+
+// NewsfeedItemVideo struct.
+type NewsfeedItemVideo struct {
+ Video NewsfeedItemVideoVideo `json:"video"`
+}
+
+// NewsfeedItemVideoVideo struct.
+type NewsfeedItemVideoVideo struct {
+ Count int `json:"count"` // Tags number
+ Items []VideoVideo `json:"items"`
+}
+
+// NewsfeedItemWallpost struct.
+type NewsfeedItemWallpost struct {
+ Activity NewsfeedEventActivity `json:"activity"`
+ Attachments []WallWallpostAttachment `json:"attachments"`
+ Comments BaseCommentsInfo `json:"comments"`
+ FromID int `json:"from_id"`
+ CopyHistory []WallWallpost `json:"copy_history"`
+ Geo BaseGeo `json:"geo"`
+ Likes BaseLikesInfo `json:"likes"`
+ PostSource WallPostSource `json:"post_source"`
+ PostType string `json:"post_type"`
+ Reposts BaseRepostsInfo `json:"reposts"`
+ MarkedAsAds int `json:"marked_as_ads,omitempty"`
+ Views interface{} `json:"views,omitempty"` // BUG: Views int or wallViews
+ IsFavorite BaseBoolInt `json:"is_favorite,omitempty"`
+ CanDelete BaseBoolInt `json:"can_delete"`
+ CanArchive BaseBoolInt `json:"can_archive"`
+ IsArchived BaseBoolInt `json:"is_archived"`
+ SignerID int `json:"signer_id,omitempty"`
+ Text string `json:"text"` // Post text
+ Copyright WallPostCopyright `json:"copyright"`
+ CategoryAction NewsfeedCategoryAction `json:"category_action"`
+}
+
+// NewsfeedCategoryAction struct.
+type NewsfeedCategoryAction struct {
+ Action struct {
+ Target string `json:"target"`
+ Type string `json:"type"`
+ URL string `json:"url"`
+ } `json:"action"`
+ Name string `json:"name"`
+}
+
+// NewsfeedList struct.
+type NewsfeedList struct {
+ ID int `json:"id"` // List ID
+ Title string `json:"title"` // List title
+}
+
+// NewsfeedItemMarket struct.
+type NewsfeedItemMarket struct {
+ MarketMarketItem
+}
+
+// NewsfeedNewsfeedItem struct.
+type NewsfeedNewsfeedItem struct {
+ Type string `json:"type"`
+ SourceID int `json:"source_id"`
+ Date int `json:"date"`
+ TopicID int `json:"topic_id"`
+
+ PostID int `json:"post_id,omitempty"`
+
+ NewsfeedItemWallpost
+ NewsfeedItemPhoto
+ NewsfeedItemPhotoTag
+ NewsfeedItemFriend
+ NewsfeedItemNote
+ NewsfeedItemAudio
+ NewsfeedItemTopic
+ NewsfeedItemVideo
+ NewsfeedItemDigest
+ NewsfeedItemStoriesBlock
+ NewsfeedItemMarket
+
+ CreatedBy int `json:"created_by,omitempty"`
+ CanEdit BaseBoolInt `json:"can_edit,omitempty"`
+ CanDelete BaseBoolInt `json:"can_delete,omitempty"`
+ CanDoubtCategory BaseBoolInt `json:"can_doubt_category"`
+ CanSetCategory BaseBoolInt `json:"can_set_category"`
+ // TODO: Need more fields
+}
+
+// NewsfeedNewsfeedNote struct.
+type NewsfeedNewsfeedNote struct {
+ Comments int `json:"comments"` // Comments Number
+ ID int `json:"id"` // Note ID
+ OwnerID int `json:"owner_id"` // integer
+ Title string `json:"title"` // Note title
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/notes.go b/vendor/github.com/SevereCloud/vksdk/v2/object/notes.go
new file mode 100644
index 00000000..c238256e
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/notes.go
@@ -0,0 +1,37 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "fmt"
+)
+
+// NotesNote struct.
+type NotesNote struct {
+ CanComment BaseBoolInt `json:"can_comment"` // Information whether current user can comment the note
+ Comments int `json:"comments"` // Comments number
+ Date int `json:"date"` // Date when the note has been created in Unixtime
+ ID int `json:"id"` // Note ID
+ OwnerID int `json:"owner_id"` // Note owner's ID
+ Text string `json:"text"` // Note text
+ TextWiki string `json:"text_wiki"` // Note text in wiki format
+ Title string `json:"title"` // Note title
+ ViewURL string `json:"view_url"` // URL of the page with note preview
+ ReadComments int `json:"read_comments"`
+ PrivacyView []interface{} `json:"privacy_view"` // NOTE: old type privacy
+ PrivacyComment []interface{} `json:"privacy_comment"` // NOTE: old type privacy
+}
+
+// ToAttachment return attachment format.
+func (note NotesNote) ToAttachment() string {
+ return fmt.Sprintf("note%d_%d", note.OwnerID, note.ID)
+}
+
+// NotesNoteComment struct.
+type NotesNoteComment struct {
+ Date int `json:"date"` // Date when the comment has been added in Unixtime
+ ID int `json:"id"` // Comment ID
+ Message string `json:"message"` // Comment text
+ NID int `json:"nid"` // Note ID
+ OID int `json:"oid"` // Note ID
+ ReplyTo int `json:"reply_to"` // ID of replied comment
+ UID int `json:"uid"` // Comment author's ID
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/notifications.go b/vendor/github.com/SevereCloud/vksdk/v2/object/notifications.go
new file mode 100644
index 00000000..119c3f9f
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/notifications.go
@@ -0,0 +1,42 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import "encoding/json"
+
+// NotificationsFeedback struct.
+type NotificationsFeedback struct {
+ Attachments []WallWallpostAttachment `json:"attachments"`
+ FromID int `json:"from_id"` // Reply author's ID
+ Geo BaseGeo `json:"geo"`
+ ID int `json:"id"` // Item ID
+ Likes BaseLikesInfo `json:"likes"`
+ Text string `json:"text"` // Reply text
+ ToID int `json:"to_id"` // Wall owner's ID
+}
+
+// NotificationsNotification struct.
+type NotificationsNotification struct {
+ Date int `json:"date"` // Date when the event has been occurred
+ Feedback json.RawMessage `json:"feedback"`
+ Parent json.RawMessage `json:"parent"`
+ Reply NotificationsReply `json:"reply"`
+ Type string `json:"type"` // Notification type
+}
+
+// NotificationsNotificationsComment struct.
+type NotificationsNotificationsComment struct {
+ Date int `json:"date"` // Date when the comment has been added in Unixtime
+ ID int `json:"id"` // Comment ID
+ OwnerID int `json:"owner_id"` // Author ID
+ Photo PhotosPhoto `json:"photo"`
+ Post WallWallpost `json:"post"`
+ Text string `json:"text"` // Comment text
+ Topic BoardTopic `json:"topic"`
+ Video VideoVideo `json:"video"`
+}
+
+// NotificationsReply struct.
+type NotificationsReply struct {
+ Date string `json:"date"` // Date when the reply has been created in Unixtime
+ ID int `json:"id"` // Reply ID
+ Text string `json:"text"` // Reply text
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/object.go b/vendor/github.com/SevereCloud/vksdk/v2/object/object.go
new file mode 100644
index 00000000..4daf7c07
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/object.go
@@ -0,0 +1,566 @@
+/*
+Package object contains objects for VK.
+
+See more https://vk.com/dev/objects
+*/
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "bytes"
+ "encoding/json"
+ "reflect"
+)
+
+// Attachment interface.
+type Attachment interface {
+ ToAttachment() string
+}
+
+// JSONObject interface.
+type JSONObject interface {
+ ToJSON() string
+}
+
+// BaseBoolInt type.
+type BaseBoolInt bool
+
+// UnmarshalJSON func.
+func (b *BaseBoolInt) UnmarshalJSON(data []byte) (err error) {
+ switch {
+ case bytes.Equal(data, []byte("1")), bytes.Equal(data, []byte("true")):
+ *b = true
+ case bytes.Equal(data, []byte("0")), bytes.Equal(data, []byte("false")):
+ *b = false
+ default:
+ // return json error
+ err = &json.UnmarshalTypeError{
+ Value: string(data),
+ Type: reflect.TypeOf((*BaseBoolInt)(nil)),
+ }
+ }
+
+ return
+}
+
+// BaseCountry struct.
+type BaseCountry struct {
+ ID int `json:"id"`
+ Title string `json:"title"`
+}
+
+// BaseObject struct.
+type BaseObject struct {
+ ID int `json:"id"`
+ Title string `json:"title"`
+}
+
+// BaseObjectCount struct.
+type BaseObjectCount struct {
+ Count int `json:"count"`
+}
+
+// BaseObjectWithName struct.
+type BaseObjectWithName struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+}
+
+// BaseRequestParam struct.
+type BaseRequestParam struct {
+ Key string `json:"key"`
+ Value string `json:"value"`
+}
+
+// BaseSex const.
+const (
+ SexUnknown = iota
+ SexFemale
+ SexMale
+)
+
+// LongPollResponse struct.
+type LongPollResponse struct {
+ Ts int `json:"ts"`
+ Updates [][]interface{} `json:"updates"`
+ Failed int `json:"failed"`
+}
+
+// BaseCommentsInfo struct.
+type BaseCommentsInfo struct {
+ Count int `json:"count"`
+ CanPost BaseBoolInt `json:"can_post"`
+ GroupsCanPost BaseBoolInt `json:"groups_can_post"`
+ CanClose BaseBoolInt `json:"can_close"`
+ CanOpen BaseBoolInt `json:"can_open"`
+}
+
+// BaseGeo struct.
+type BaseGeo struct {
+ Coordinates string `json:"coordinates"`
+ Place BasePlace `json:"place"`
+ Showmap int `json:"showmap"`
+ Type string `json:"type"`
+}
+
+// BaseMessageGeo struct.
+type BaseMessageGeo struct {
+ Coordinates BaseGeoCoordinates `json:"coordinates"`
+ Place BasePlace `json:"place"`
+ Showmap int `json:"showmap"`
+ Type string `json:"type"`
+}
+
+// BaseGeoCoordinates struct.
+type BaseGeoCoordinates struct {
+ Latitude float64 `json:"latitude"`
+ Longitude float64 `json:"longitude"`
+}
+
+// BaseImage struct.
+type BaseImage struct {
+ Height float64 `json:"height"`
+ URL string `json:"url"`
+ Width float64 `json:"width"`
+ Type string `json:"type"`
+}
+
+// UnmarshalJSON is required to support images with `src` field.
+func (obj *BaseImage) UnmarshalJSON(data []byte) (err error) {
+ type renamedBaseImage struct {
+ Height float64 `json:"height"`
+ URL string `json:"url"`
+ Src string `json:"src"`
+ Width float64 `json:"width"`
+ Type string `json:"type"`
+ }
+
+ var renamedObj renamedBaseImage
+
+ err = json.Unmarshal(data, &renamedObj)
+
+ obj.Height = renamedObj.Height
+ obj.Width = renamedObj.Width
+ obj.Type = renamedObj.Type
+
+ if renamedObj.Src == "" {
+ obj.URL = renamedObj.URL
+ } else {
+ obj.URL = renamedObj.Src
+ }
+
+ return err
+}
+
+// BaseLikes struct.
+type BaseLikes struct {
+ UserLikes BaseBoolInt `json:"user_likes"` // Information whether current user likes
+ Count int `json:"count"` // Likes number
+}
+
+// BaseLikesInfo struct.
+type BaseLikesInfo struct {
+ CanLike BaseBoolInt `json:"can_like"` // Information whether current user can like the post
+ CanPublish BaseBoolInt `json:"can_publish"` // Information whether current user can repost
+ UserLikes BaseBoolInt `json:"user_likes"` // Information whether current uer has liked the post
+ Count int `json:"count"` // Likes number
+}
+
+// BaseLink struct.
+type BaseLink struct {
+ Application BaseLinkApplication `json:"application"`
+ Button BaseLinkButton `json:"button"`
+ ButtonText string `json:"button_text"`
+ ButtonAction string `json:"button_action"`
+ Caption string `json:"caption"`
+ Description string `json:"description"`
+ Photo PhotosPhoto `json:"photo"`
+ Video VideoVideo `json:"video"`
+ PreviewPage string `json:"preview_page"`
+ PreviewURL string `json:"preview_url"`
+ Product BaseLinkProduct `json:"product"`
+ Rating BaseLinkRating `json:"rating"`
+ Title string `json:"title"`
+ Target string `json:"target"`
+ URL string `json:"url"`
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+}
+
+// BaseLinkApplication struct.
+type BaseLinkApplication struct {
+ AppID float64 `json:"app_id"`
+ Store BaseLinkApplicationStore `json:"store"`
+}
+
+// BaseLinkApplicationStore struct.
+type BaseLinkApplicationStore struct {
+ ID float64 `json:"id"`
+ Name string `json:"name"`
+}
+
+// BaseLinkButton struct.
+type BaseLinkButton struct {
+ Action BaseLinkButtonAction `json:"action"`
+ Title string `json:"title"`
+}
+
+// BaseLinkButtonAction struct.
+type BaseLinkButtonAction struct {
+ Type string `json:"type"`
+ URL string `json:"url"`
+}
+
+// BaseLinkProduct struct.
+type BaseLinkProduct struct {
+ Price MarketPrice `json:"price"`
+ Merchant string `json:"merchant"`
+ OrdersCount int `json:"orders_count"`
+}
+
+// BaseLinkRating struct.
+type BaseLinkRating struct {
+ ReviewsCount int `json:"reviews_count"`
+ Stars float64 `json:"stars"`
+}
+
+// BasePlace struct.
+type BasePlace struct {
+ Address string `json:"address"`
+ Checkins int `json:"checkins"`
+ City interface{} `json:"city"` // BUG(VK): https://github.com/VKCOM/vk-api-schema/issues/143
+ Country interface{} `json:"country"`
+ Created int `json:"created"`
+ ID int `json:"id"`
+ Icon string `json:"icon"`
+ Latitude float64 `json:"latitude"`
+ Longitude float64 `json:"longitude"`
+ Title string `json:"title"`
+ Type string `json:"type"`
+ IsDeleted BaseBoolInt `json:"is_deleted"`
+ TotalCheckins int `json:"total_checkins"`
+ Updated int `json:"updated"`
+ CategoryObject BaseCategoryObject `json:"category_object"`
+}
+
+// BaseCategoryObject struct.
+type BaseCategoryObject struct {
+ ID int `json:"id"`
+ Title string `json:"title"`
+ Icons []BaseImage `json:"icons"`
+}
+
+// BaseRepostsInfo struct.
+type BaseRepostsInfo struct {
+ Count int `json:"count"`
+ WallCount int `json:"wall_count"`
+ MailCount int `json:"mail_count"`
+ UserReposted int `json:"user_reposted"`
+}
+
+// BaseSticker struct.
+type BaseSticker struct {
+ Images []BaseImage `json:"images"`
+ ImagesWithBackground []BaseImage `json:"images_with_background"`
+ ProductID int `json:"product_id"`
+ StickerID int `json:"sticker_id"`
+ AnimationURL string `json:"animation_url"`
+}
+
+// MaxSize return the largest BaseSticker.
+func (sticker BaseSticker) MaxSize() (maxImageSize BaseImage) {
+ var max float64
+
+ for _, imageSize := range sticker.Images {
+ size := imageSize.Height * imageSize.Width
+ if size > max {
+ max = size
+ maxImageSize = imageSize
+ }
+ }
+
+ return
+}
+
+// MinSize return the smallest BaseSticker.
+func (sticker BaseSticker) MinSize() (minImageSize BaseImage) {
+ var min float64
+
+ for _, imageSize := range sticker.Images {
+ size := imageSize.Height * imageSize.Width
+ if size < min || min == 0 {
+ min = size
+ minImageSize = imageSize
+ }
+ }
+
+ return
+}
+
+// MaxSizeBackground return the largest BaseSticker with background.
+func (sticker BaseSticker) MaxSizeBackground() (maxImageSize BaseImage) {
+ var max float64
+
+ for _, imageSize := range sticker.ImagesWithBackground {
+ size := imageSize.Height * imageSize.Width
+ if size > max {
+ max = size
+ maxImageSize = imageSize
+ }
+ }
+
+ return
+}
+
+// MinSizeBackground return the smallest BaseSticker with background.
+func (sticker BaseSticker) MinSizeBackground() (minImageSize BaseImage) {
+ var min float64
+
+ for _, imageSize := range sticker.ImagesWithBackground {
+ size := imageSize.Height * imageSize.Width
+ if size < min || min == 0 {
+ min = size
+ minImageSize = imageSize
+ }
+ }
+
+ return
+}
+
+// BaseUserID struct.
+type BaseUserID struct {
+ UserID int `json:"user_id"`
+}
+
+// PrivacyCategory type.
+type PrivacyCategory string
+
+// Possible values.
+const (
+ PrivacyAll PrivacyCategory = "all"
+ PrivacyOnlyMe PrivacyCategory = "only_me"
+ PrivacyFriends PrivacyCategory = "friends"
+ PrivacyFriendsOfFriends PrivacyCategory = "friends_of_friends"
+)
+
+// Privacy struct.
+type Privacy struct {
+ Category PrivacyCategory `json:"category,omitempty"`
+ Lists struct {
+ Allowed []int `json:"allowed"`
+ } `json:"lists,omitempty"`
+ Owners struct {
+ Excluded []int `json:"excluded"`
+ } `json:"owners,omitempty"`
+}
+
+// EventsEventAttach struct.
+type EventsEventAttach struct {
+ Address string `json:"address,omitempty"` // address of event
+ ButtonText string `json:"button_text"` // text of attach
+ Friends []int `json:"friends"` // array of friends ids
+ ID int `json:"id"` // event ID
+ IsFavorite BaseBoolInt `json:"is_favorite"` // is favorite
+ MemberStatus int `json:"member_status,omitempty"` // Current user's member status
+ Text string `json:"text"` // text of attach
+ Time int `json:"time,omitempty"` // event start time
+}
+
+// OauthError struct.
+type OauthError struct {
+ Error string `json:"error"`
+ ErrorDescription string `json:"error_description"`
+ RedirectURI string `json:"redirect_uri"`
+}
+
+// Article struct.
+type Article struct {
+ ID int `json:"id"`
+ OwnerID int `json:"owner_id"`
+ OwnerName string `json:"owner_name"`
+ OwnerPhoto string `json:"owner_photo"`
+ State string `json:"state"`
+ CanReport BaseBoolInt `json:"can_report"`
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ NoFooter BaseBoolInt `json:"no_footer"`
+ Title string `json:"title"`
+ Subtitle string `json:"subtitle"`
+ Views int `json:"views"`
+ Shares int `json:"shares"`
+ URL string `json:"url"`
+ ViewURL string `json:"view_url"`
+ AccessKey string `json:"access_key"`
+ PublishedDate int `json:"published_date"`
+ Photo PhotosPhoto `json:"photo"`
+}
+
+// ExtendedResponse struct.
+type ExtendedResponse struct {
+ Profiles []UsersUser `json:"profiles,omitempty"`
+ Groups []GroupsGroup `json:"groups,omitempty"`
+}
+
+// ClientInfo struct.
+type ClientInfo struct {
+ ButtonActions []string `json:"button_actions"`
+ Keyboard BaseBoolInt `json:"keyboard"`
+ InlineKeyboard BaseBoolInt `json:"inline_keyboard"`
+ Carousel BaseBoolInt `json:"carousel"`
+ LangID int `json:"lang_id"`
+}
+
+// Language code.
+const (
+ LangRU = 0 // Русский
+ LangUK = 1 // Українська
+ LangBE = 2 // Беларуская (тарашкевiца)
+ LangEN = 3 // English
+ LangES = 4 // Español
+ LangFI = 5 // Suomi
+ LangDE = 6 // Deutsch
+ LangIT = 7 // Italiano
+ LangBG = 8 // Български
+ LangHR = 9 // Hrvatski
+ LangHU = 10 // Magyar
+ LangSR = 11 // Српски
+ LangPT = 12 // Português
+ LangEL = 14 // Ελληνικά
+ LangPL = 15 // Polski
+ LangFR = 16 // Français
+ LangKO = 17 // 한국어
+ LangZH = 18 // 汉语
+ LangLT = 19 // Lietuvių
+ LangJA = 20 // 日本語
+ LangCS = 21 // Čeština
+ LangET = 22 // Eesti
+ LangTT = 50 // Татарча
+ LangBA = 51 // Башҡортса
+ LangCV = 52 // Чăвашла
+ LangSK = 53 // Slovenčina
+ LangRO = 54 // Română
+ LangNO = 55 // Norsk
+ LangLV = 56 // Latviešu
+ LangAZ = 57 // Azərbaycan dili
+ LangHY = 58 // Հայերեն
+ LangSQ = 59 // Shqip
+ LangSV = 60 // Svenska
+ LangNL = 61 // Nederlands
+ LangTK = 62 // Türkmen
+ LangKA = 63 // ქართული
+ LangDA = 64 // Dansk
+ LangUZ = 65 // O‘zbek
+ LangMO = 66 // Moldovenească
+ LangBUA = 67 // Буряад
+ LangTH = 68 // ภาษาไทย
+ LangID = 69 // Bahasa Indonesia
+ LangTG = 70 // Тоҷикӣ
+ LangSL = 71 // Slovenščina
+ LangBS = 72 // Bosanski
+ LangPTBR = 73 // Português brasileiro
+ LangFA = 74 // فارسی
+ LangVI = 75 // Tiếng Việt
+ LangHI = 76 // हिन्दी
+ LangSI = 77 // සිංහල
+ LangBN = 78 // বাংলা
+ LangTL = 79 // Tagalog
+ LangMN = 80 // Монгол
+ LangMY = 81 // ဗမာစာ
+ LangTR = 82 // Türkçe
+ LangNE = 83 // नेपाली
+ LangUR = 85 // اردو
+ LangKY = 87 // Кыргыз тили
+ LangPA = 90 // پنجابی
+ LangOS = 91 // Ирон
+ LangKN = 94 // ಕನ್ನಡ
+ LangSW = 95 // Kiswahili
+ LangKK = 97 // Қазақша
+ LangAR = 98 // العربية
+ LangHE = 99 // עברית
+ LangPreRevolutionary = 100 // Дореволюцiонный
+ LangMYV = 101 // Эрзянь кель
+ LangKDB = 102 // Адыгэбзэ
+ LangSAH = 105 // Саха тыла
+ LangADY = 106 // Адыгабзэ
+ LangUDM = 107 // Удмурт
+ LangCHM = 108 // Марий йылме
+ LangBE2 = 114 // Беларуская
+ LangLEZ = 118 // Лезги чІал
+ LangTW = 119 // 臺灣話
+ LangKUM = 236 // Къумукъ тил
+ LangMVL = 270 // Mirandés
+ LangSLA = 298 // Русинськый
+ LangKRL = 379 // Karjalan kieli
+ LangTYV = 344 // Тыва дыл
+ LangXAL = 357 // Хальмг келн
+ LangTLY = 373 // Tolışə zıvon
+ LangKV = 375 // Коми кыв
+ LangUKClassic = 452 // Українська (клясична)
+ LangUKGalitska = 454 // Українська (Галицка)
+ LangKAB = 457 // Taqbaylit
+ LangEO = 555 // Esperanto
+ LangLA = 666 // Lingua Latina
+ LangSoviet = 777 // Советский
+)
+
+// Button action type.
+const (
+ // A button that sends a message with text specified in the label.
+ ButtonText = "text"
+
+ // Opens the VK Pay window with predefined parameters. The button is called
+ // “Pay with VK Pay” (VK Pay is displayed as a logo). This button always
+ // stretches to the whole keyboard width.
+ ButtonVKPay = "vkpay"
+
+ // Opens a specified VK Apps app. This button always stretches to the whole
+ // keyboard width.
+ ButtonVKApp = "open_app"
+
+ // Sends the location to the chat. This button always stretches to the
+ // whole keyboard width.
+ ButtonLocation = "location"
+
+ // Opens the specified link.
+ ButtonOpenLink = "open_link"
+
+ // Allows, without sending a message from the user, to receive a
+ // notification about pressing the button and perform the necessary action.
+ ButtonCallback = "callback"
+)
+
+// Button color. This parameter is used only for buttons with the text and callback types.
+const (
+ Primary = "primary" // Blue button, indicates the main action. #5181B8
+ ButtonBlue
+
+ Secondary = "secondary" // Default white button. #FFFFFF
+ ButtonWhite
+
+ Negative = "negative" // Dangerous or negative action (cancel, delete etc.) #E64646
+ ButtonRed
+
+ Positive = "positive" // Accept, agree. #4BB34B
+ ButtonGreen
+)
+
+// Platform content creation platform.
+type Platform int
+
+// Possible values.
+const (
+ _ Platform = iota
+ PlatformMobile // mobile web version
+ PlatformIPhone // iPhone
+ PlatformIPad // iPad
+ PlatformAndroid // Android
+ PlatformWindowsPhone // Windows Phone
+ PlatformWindows // Windows 8
+ PlatformFull // full web version
+ PlatformOther // other apps
+)
+
+// Conversations types.
+const (
+ PeerUser = "user"
+ PeerChat = "chat"
+ PeerGroup = "group"
+ PeerEmail = "email"
+)
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/orders.go b/vendor/github.com/SevereCloud/vksdk/v2/object/orders.go
new file mode 100644
index 00000000..0d29dfb5
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/orders.go
@@ -0,0 +1,45 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// OrdersAmount struct.
+type OrdersAmount struct {
+ Amounts []OrdersAmountItem `json:"amounts"`
+ Currency string `json:"currency"` // Currency name
+}
+
+// OrdersAmountItem struct.
+type OrdersAmountItem struct {
+ Amount int `json:"amount"` // Votes amount in user's currency
+ Description string `json:"description"` // Amount description
+ Votes string `json:"votes"` // Votes number
+}
+
+// OrdersOrder struct.
+type OrdersOrder struct {
+ Amount int `json:"amount"` // Amount
+ AppOrderID int `json:"app_order_id"` // App order ID
+ CancelTransactionID int `json:"cancel_transaction_id"` // Cancel transaction ID
+ Date int `json:"date"` // Date of creation in Unixtime
+ ID int `json:"id"` // Order ID
+ Item string `json:"item"` // Order item
+ ReceiverID int `json:"receiver_id"` // Receiver ID
+ Status string `json:"status"` // Order status
+ TransactionID int `json:"transaction_id"` // Transaction ID
+ UserID int `json:"user_id"` // User ID
+}
+
+// OrdersSubscription struct.
+type OrdersSubscription struct {
+ CancelReason string `json:"cancel_reason"` // Cancel reason
+ CreateTime int `json:"create_time"` // Date of creation in Unixtime
+ ID int `json:"id"` // Subscription ID
+ ItemID string `json:"item_id"` // Subscription order item
+ NextBillTime int `json:"next_bill_time"` // Date of next bill in Unixtime
+ Period int `json:"period"` // Subscription period
+ PeriodStartTime int `json:"period_start_time"` // Date of last period start in Unixtime
+ Price int `json:"price"` // Subscription price
+ Status string `json:"status"` // Subscription status
+ PendingCancel BaseBoolInt `json:"pending_cancel"` // Pending cancel state
+ TestMode BaseBoolInt `json:"test_mode"` // Is test subscription
+ TrialExpireTime int `json:"trial_expire_time"` // Date of trial expire in Unixtime
+ UpdateTime int `json:"update_time"` // Date of last change in Unixtime
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/pages.go b/vendor/github.com/SevereCloud/vksdk/v2/object/pages.go
new file mode 100644
index 00000000..616830cc
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/pages.go
@@ -0,0 +1,85 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// Pages privacy settings.
+const (
+ PagesPrivacyCommunityManagers = iota // community managers only
+ PagesPrivacyCommunityMembers // community members only
+ PagesPrivacyEveryone // everyone
+)
+
+// PagesWikipage struct.
+type PagesWikipage struct {
+ CreatorID int `json:"creator_id"` // Page creator ID
+ CreatorName int `json:"creator_name"` // Page creator name
+ EditorID int `json:"editor_id"` // Last editor ID
+ EditorName string `json:"editor_name"` // Last editor name
+ GroupID int `json:"group_id"` // Community ID
+ ID int `json:"id"` // Page ID
+ Title string `json:"title"` // Page title
+ Views int `json:"views"` // Views number
+ WhoCanEdit int `json:"who_can_edit"` // Edit settings of the page
+ WhoCanView int `json:"who_can_view"` // View settings of the page
+}
+
+// PagesWikipageFull struct.
+type PagesWikipageFull struct {
+ // Date when the page has been created in Unixtime.
+ Created int `json:"created"`
+
+ // Page creator ID.
+ CreatorID int `json:"creator_id"`
+
+ // Information whether current user can edit the page.
+ CurrentUserCanEdit BaseBoolInt `json:"current_user_can_edit"`
+
+ // Information whether current user can edit the page access settings.
+ CurrentUserCanEditAccess BaseBoolInt `json:"current_user_can_edit_access"`
+
+ // Date when the page has been edited in Unixtime.
+ Edited int `json:"edited"`
+
+ // Last editor ID.
+ EditorID int `json:"editor_id"`
+
+ // Page ID.
+ PageID int `json:"page_id"`
+
+ // Community ID.
+ GroupID int `json:"group_id"`
+
+ // Page content, HTML.
+ HTML string `json:"html"`
+
+ // Page ID.
+ ID int `json:"id"`
+
+ // Page content, wiki.
+ Source string `json:"source"`
+
+ // Page title.
+ Title string `json:"title"`
+
+ // URL of the page preview.
+ ViewURL string `json:"view_url"`
+
+ // Views number.
+ Views int `json:"views"`
+
+ // Edit settings of the page.
+ WhoCanEdit int `json:"who_can_edit"`
+
+ // View settings of the page.
+ WhoCanView int `json:"who_can_view"`
+ VersionCreated int `json:"version_created"`
+}
+
+// PagesWikipageHistory struct.
+//
+// BUG(VK): https://vk.com/dev/pages.getHistory edited and date.
+type PagesWikipageHistory struct {
+ Date int `json:"date"` // Date when the page has been edited in Unixtime
+ EditorID int `json:"editor_id"` // Last editor ID
+ EditorName string `json:"editor_name"` // Last editor name
+ ID int `json:"id"` // Version ID
+ Length int `json:"length"` // Page size in bytes
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/photos.go b/vendor/github.com/SevereCloud/vksdk/v2/object/photos.go
new file mode 100644
index 00000000..5adfcae8
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/photos.go
@@ -0,0 +1,339 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "fmt"
+)
+
+// PhotosPhoto struct.
+type PhotosPhoto struct {
+ AccessKey string `json:"access_key"` // Access key for the photo
+ AlbumID int `json:"album_id"` // Album ID
+ Date int `json:"date"` // Date when uploaded
+ Height int `json:"height"` // Original photo height
+ ID int `json:"id"` // Photo ID
+ Images []PhotosImage `json:"images"`
+ Lat float64 `json:"lat"` // Latitude
+ Long float64 `json:"long"` // Longitude
+ OwnerID int `json:"owner_id"` // Photo owner's ID
+ PostID int `json:"post_id"` // Post ID
+ Text string `json:"text"` // Photo caption
+ UserID int `json:"user_id"` // ID of the user who have uploaded the photo
+ Width int `json:"width"` // Original photo width
+ CanUpload BaseBoolInt `json:"can_upload"`
+ CommentsDisabled BaseBoolInt `json:"comments_disabled"`
+ ThumbIsLast BaseBoolInt `json:"thumb_is_last"`
+ UploadByAdminsOnly BaseBoolInt `json:"upload_by_admins_only"`
+ HasTags BaseBoolInt `json:"has_tags"`
+ Created int `json:"created"`
+ Description string `json:"description"`
+ PrivacyComment []string `json:"privacy_comment"`
+ PrivacyView []string `json:"privacy_view"`
+ Size int `json:"size"`
+ Sizes []PhotosPhotoSizes `json:"sizes"`
+ ThumbID int `json:"thumb_id"`
+ ThumbSrc string `json:"thumb_src"`
+ Title string `json:"title"`
+ Updated int `json:"updated"`
+ Color string `json:"color"`
+}
+
+// ToAttachment return attachment format.
+func (photo PhotosPhoto) ToAttachment() string {
+ return fmt.Sprintf("photo%d_%d", photo.OwnerID, photo.ID)
+}
+
+// MaxSize return the largest PhotosPhotoSizes.
+func (photo PhotosPhoto) MaxSize() (maxPhotoSize PhotosPhotoSizes) {
+ var max float64
+
+ for _, photoSize := range photo.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size > max {
+ max = size
+ maxPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// MinSize return the smallest PhotosPhotoSizes.
+func (photo PhotosPhoto) MinSize() (minPhotoSize PhotosPhotoSizes) {
+ var min float64
+
+ for _, photoSize := range photo.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size < min || min == 0 {
+ min = size
+ minPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// PhotosCommentXtrPid struct.
+type PhotosCommentXtrPid struct {
+ Attachments []WallCommentAttachment `json:"attachments"`
+ Date int `json:"date"` // Date when the comment has been added in Unixtime
+ FromID int `json:"from_id"` // Author ID
+ ID int `json:"id"` // Comment ID
+ Likes BaseLikesInfo `json:"likes"`
+ ParentsStack []int `json:"parents_stack"`
+ Pid int `json:"pid"` // Photo ID
+ ReplyToComment int `json:"reply_to_comment"` // Replied comment ID
+ ReplyToUser int `json:"reply_to_user"` // Replied user ID
+ Text string `json:"text"` // Comment text
+ Thread WallWallCommentThread `json:"thread"`
+}
+
+// PhotosImage struct.
+type PhotosImage struct {
+ BaseImage
+ Type string `json:"type"`
+}
+
+// PhotosChatUploadResponse struct.
+type PhotosChatUploadResponse struct {
+ Response string `json:"response"` // Uploaded photo data
+}
+
+// PhotosMarketAlbumUploadResponse struct.
+type PhotosMarketAlbumUploadResponse struct {
+ GID int `json:"gid"` // Community ID
+ Hash string `json:"hash"` // Uploading hash
+ Photo string `json:"photo"` // Uploaded photo data
+ Server int `json:"server"` // Upload server number
+}
+
+// PhotosMarketUploadResponse struct.
+type PhotosMarketUploadResponse struct {
+ CropData string `json:"crop_data"` // Crop data
+ CropHash string `json:"crop_hash"` // Crop hash
+ GroupID int `json:"group_id"` // Community ID
+ Hash string `json:"hash"` // Uploading hash
+ Photo string `json:"photo"` // Uploaded photo data
+ Server int `json:"server"` // Upload server number
+}
+
+// PhotosMessageUploadResponse struct.
+type PhotosMessageUploadResponse struct {
+ Hash string `json:"hash"` // Uploading hash
+ Photo string `json:"photo"` // Uploaded photo data
+ Server int `json:"server"` // Upload server number
+}
+
+// PhotosOwnerUploadResponse struct.
+type PhotosOwnerUploadResponse struct {
+ Hash string `json:"hash"` // Uploading hash
+ Photo string `json:"photo"` // Uploaded photo data
+ Server int `json:"server"` // Upload server number
+}
+
+// PhotosPhotoAlbum struct.
+type PhotosPhotoAlbum struct {
+ Created int `json:"created"` // Date when the album has been created in Unixtime
+ Description string `json:"description"` // Photo album description
+ ID string `json:"id"` // BUG(VK): Photo album ID
+ OwnerID int `json:"owner_id"` // Album owner's ID
+ Size int `json:"size"` // Photos number
+ Thumb PhotosPhoto `json:"thumb"`
+ Title string `json:"title"` // Photo album title
+ Updated int `json:"updated"` // Date when the album has been updated last time in Unixtime
+}
+
+// ToAttachment return attachment format.
+func (album PhotosPhotoAlbum) ToAttachment() string {
+ return fmt.Sprintf("album%d_%s", album.OwnerID, album.ID)
+}
+
+// PhotosPhotoAlbumFull struct.
+type PhotosPhotoAlbumFull struct {
+ // Information whether current user can upload photo to the album.
+ CanUpload BaseBoolInt `json:"can_upload"`
+ CommentsDisabled BaseBoolInt `json:"comments_disabled"` // Information whether album comments are disabled
+ Created int `json:"created"` // Date when the album has been created in Unixtime
+ Description string `json:"description"` // Photo album description
+ ID int `json:"id"` // Photo album ID
+ OwnerID int `json:"owner_id"` // Album owner's ID
+ Size int `json:"size"` // Photos number
+ PrivacyComment Privacy `json:"privacy_comment"`
+ PrivacyView Privacy `json:"privacy_view"`
+ Sizes []PhotosPhotoSizes `json:"sizes"`
+ ThumbID int `json:"thumb_id"` // Thumb photo ID
+
+ // Information whether the album thumb is last photo.
+ ThumbIsLast int `json:"thumb_is_last"`
+ ThumbSrc string `json:"thumb_src"` // URL of the thumb image
+ Title string `json:"title"` // Photo album title
+
+ // Date when the album has been updated last time in Unixtime.
+ Updated int `json:"updated"`
+
+ // Information whether only community administrators can upload photos.
+ UploadByAdminsOnly int `json:"upload_by_admins_only"`
+}
+
+// ToAttachment return attachment format.
+func (album PhotosPhotoAlbumFull) ToAttachment() string {
+ return fmt.Sprintf("album%d_%d", album.OwnerID, album.ID)
+}
+
+// MaxSize return the largest PhotosPhotoSizes.
+func (album PhotosPhotoAlbumFull) MaxSize() (maxPhotoSize PhotosPhotoSizes) {
+ var max float64
+
+ for _, photoSize := range album.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size > max {
+ max = size
+ maxPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// MinSize return the smallest PhotosPhotoSizes.
+func (album PhotosPhotoAlbumFull) MinSize() (minPhotoSize PhotosPhotoSizes) {
+ var min float64
+
+ for _, photoSize := range album.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size < min || min == 0 {
+ min = size
+ minPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// PhotosPhotoFull struct.
+type PhotosPhotoFull struct {
+ AccessKey string `json:"access_key"` // Access key for the photo
+ AlbumID int `json:"album_id"` // Album ID
+ CanComment BaseBoolInt `json:"can_comment"` // Information whether current user can comment the photo
+ CanRepost BaseBoolInt `json:"can_repost"` // Information whether current user can repost the photo
+ HasTags BaseBoolInt `json:"has_tags"`
+ Comments BaseObjectCount `json:"comments"`
+ Date int `json:"date"` // Date when uploaded
+ Height int `json:"height"` // Original photo height
+ ID int `json:"id"` // Photo ID
+ Images []PhotosImage `json:"images"`
+ Lat float64 `json:"lat"` // Latitude
+ Likes BaseLikes `json:"likes"`
+ Long float64 `json:"long"` // Longitude
+ OwnerID int `json:"owner_id"` // Photo owner's ID
+ PostID int `json:"post_id"` // Post ID
+ Reposts BaseRepostsInfo `json:"reposts"`
+ Tags BaseObjectCount `json:"tags"`
+ Text string `json:"text"` // Photo caption
+ UserID int `json:"user_id"` // ID of the user who have uploaded the photo
+ Width int `json:"width"` // Original photo width
+ Hidden int `json:"hidden"` // Returns if the photo is hidden above the wall
+ Photo75 string `json:"photo_75"` // URL of image with 75 px width
+ Photo130 string `json:"photo_130"` // URL of image with 130 px width
+ Photo604 string `json:"photo_604"` // URL of image with 604 px width
+ Photo807 string `json:"photo_807"` // URL of image with 807 px width
+ Photo1280 string `json:"photo_1280"` // URL of image with 1280 px width
+ Photo2560 string `json:"photo_2560"` // URL of image with 2560 px width
+ Sizes []PhotosPhotoSizes `json:"sizes"`
+}
+
+// ToAttachment return attachment format.
+func (photo PhotosPhotoFull) ToAttachment() string {
+ return fmt.Sprintf("photo%d_%d", photo.OwnerID, photo.ID)
+}
+
+// MaxSize return the largest PhotosPhotoSizes.
+func (photo PhotosPhotoFull) MaxSize() (maxPhotoSize PhotosPhotoSizes) {
+ var max float64
+
+ for _, photoSize := range photo.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size > max {
+ max = size
+ maxPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// MinSize return the smallest PhotosPhotoSizes.
+func (photo PhotosPhotoFull) MinSize() (minPhotoSize PhotosPhotoSizes) {
+ var min float64
+
+ for _, photoSize := range photo.Sizes {
+ size := photoSize.Height * photoSize.Width
+ if size < min || min == 0 {
+ min = size
+ minPhotoSize = photoSize
+ }
+ }
+
+ return
+}
+
+// PhotosPhotoFullXtrRealOffset struct.
+type PhotosPhotoFullXtrRealOffset struct {
+ PhotosPhotoFull
+ RealOffset int `json:"real_offset"` // Real position of the photo
+}
+
+// PhotosPhotoSizes struct.
+type PhotosPhotoSizes struct {
+ // BUG(VK): json: cannot unmarshal number 180.000000 into Go struct field PhotosPhotoSizes.height of type int
+ BaseImage
+}
+
+// PhotosPhotoTag struct.
+type PhotosPhotoTag struct {
+ Date int `json:"date"` // Date when tag has been added in Unixtime
+ ID int `json:"id"` // Tag ID
+ PlacerID int `json:"placer_id"` // ID of the tag creator
+ TaggedName string `json:"tagged_name"` // Tag description
+ Description string `json:"description"` // Tagged description.
+ UserID int `json:"user_id"` // Tagged user ID
+ Viewed BaseBoolInt `json:"viewed"` // Information whether the tag is reviewed
+ X float64 `json:"x"` // Coordinate X of the left upper corner
+ X2 float64 `json:"x2"` // Coordinate X of the right lower corner
+ Y float64 `json:"y"` // Coordinate Y of the left upper corner
+ Y2 float64 `json:"y2"` // Coordinate Y of the right lower corner
+}
+
+// PhotosPhotoUpload struct.
+type PhotosPhotoUpload struct {
+ AlbumID int `json:"album_id"` // Album ID
+ UploadURL string `json:"upload_url"` // URL to upload photo
+ UserID int `json:"user_id"` // User ID
+}
+
+// PhotosPhotoUploadResponse struct.
+type PhotosPhotoUploadResponse struct {
+ AID int `json:"aid"` // Album ID
+ Hash string `json:"hash"` // Uploading hash
+ PhotosList string `json:"photos_list"` // Uploaded photos data
+ Server int `json:"server"` // Upload server number
+}
+
+// PhotosPhotoXtrRealOffset struct.
+type PhotosPhotoXtrRealOffset struct {
+ PhotosPhoto
+ RealOffset int `json:"real_offset"` // Real position of the photo
+}
+
+// PhotosPhotoXtrTagInfo struct.
+type PhotosPhotoXtrTagInfo struct {
+ PhotosPhoto
+ TagCreated int `json:"tag_created"` // Date when tag has been added in Unixtime
+ TagID int `json:"tag_id"` // Tag ID
+}
+
+// PhotosWallUploadResponse struct.
+type PhotosWallUploadResponse struct {
+ Hash string `json:"hash"` // Uploading hash
+ Photo string `json:"photo"` // Uploaded photo data
+ Server int `json:"server"` // Upload server number
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/podcasts.go b/vendor/github.com/SevereCloud/vksdk/v2/object/podcasts.go
new file mode 100644
index 00000000..a332da43
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/podcasts.go
@@ -0,0 +1,45 @@
+package object
+
+// PodcastsItem struct.
+type PodcastsItem struct {
+ OwnerID int `json:"owner_id"`
+}
+
+// PodcastsCategory struct.
+type PodcastsCategory struct {
+ ID int `json:"id"`
+ Title string `json:"title"`
+ Cover []BaseImage `json:"cover"`
+}
+
+// PodcastsEpisode struct.
+type PodcastsEpisode struct {
+ ID int `json:"id"`
+ OwnerID int `json:"owner_id"`
+ Artist string `json:"artist"`
+ Title string `json:"title"`
+ Duration int `json:"duration"`
+ Date int `json:"date"`
+ URL string `json:"url"`
+ LyricsID int `json:"lyrics_id"`
+ NoSearch int `json:"no_search"`
+ TrackCode string `json:"track_code"`
+ IsHq BaseBoolInt `json:"is_hq"`
+ IsFocusTrack BaseBoolInt `json:"is_focus_track"`
+ IsExplicit BaseBoolInt `json:"is_explicit"`
+ ShortVideosAllowed BaseBoolInt `json:"short_videos_allowed"`
+ StoriesAllowed BaseBoolInt `json:"stories_allowed"`
+ StoriesCoverAllowed BaseBoolInt `json:"stories_cover_allowed"`
+ PodcastInfo PodcastsPodcastInfo `json:"podcast_info"`
+}
+
+// PodcastsPodcastInfo struct.
+type PodcastsPodcastInfo struct {
+ Cover struct {
+ Sizes []BaseImage `json:"cover"`
+ }
+ Plays int `json:"plays"`
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ Description string `json:"description"`
+ Position int `json:"position"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/polls.go b/vendor/github.com/SevereCloud/vksdk/v2/object/polls.go
new file mode 100644
index 00000000..a2f69656
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/polls.go
@@ -0,0 +1,101 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "fmt"
+)
+
+// PollsAnswer struct.
+type PollsAnswer struct {
+ ID int `json:"id"`
+ Rate float64 `json:"rate"`
+ Text string `json:"text"`
+ Votes int `json:"votes"`
+}
+
+// PollsPoll struct.
+type PollsPoll struct {
+ AnswerID int `json:"answer_id"` // Current user's answer ID
+ Answers []PollsAnswer `json:"answers"`
+ Created int `json:"created"` // Date when poll has been created in Unixtime
+ ID int `json:"id"` // Poll ID
+ OwnerID int `json:"owner_id"` // Poll owner's ID
+ Question string `json:"question"` // Poll question
+ Votes int `json:"votes"` // Votes number
+ AnswerIDs []int `json:"answer_ids"`
+ EndDate int `json:"end_date"`
+ Anonymous BaseBoolInt `json:"anonymous"` // Information whether the pole is anonymous
+ Closed BaseBoolInt `json:"closed"`
+ IsBoard BaseBoolInt `json:"is_board"`
+ CanEdit BaseBoolInt `json:"can_edit"`
+ CanVote BaseBoolInt `json:"can_vote"`
+ CanReport BaseBoolInt `json:"can_report"`
+ CanShare BaseBoolInt `json:"can_share"`
+ Multiple BaseBoolInt `json:"multiple"`
+ DisableUnvote BaseBoolInt `json:"disable_unvote"`
+ Photo PhotosPhoto `json:"photo"`
+ AuthorID int `json:"author_id"`
+ Background PollsBackground `json:"background"`
+ Friends []PollsFriend `json:"friends"`
+ Profiles []UsersUser `json:"profiles"`
+ Groups []GroupsGroup `json:"groups"`
+}
+
+// ToAttachment return attachment format.
+func (poll PollsPoll) ToAttachment() string {
+ return fmt.Sprintf("poll%d_%d", poll.OwnerID, poll.ID)
+}
+
+// PollsFriend struct.
+type PollsFriend struct {
+ ID int `json:"id"`
+}
+
+// PollsVoters struct.
+type PollsVoters struct {
+ AnswerID int `json:"answer_id"` // Answer ID
+ Users PollsVotersUsers `json:"users"`
+}
+
+// PollsVotersUsers struct.
+type PollsVotersUsers struct {
+ Count int `json:"count"` // Votes number
+ Items []int `json:"items"`
+}
+
+// PollsVotersFields struct.
+type PollsVotersFields struct {
+ AnswerID int `json:"answer_id"` // Answer ID
+ Users PollsVotersUsersFields `json:"users"`
+}
+
+// PollsVotersUsersFields struct.
+type PollsVotersUsersFields struct {
+ Count int `json:"count"` // Votes number
+ Items []UsersUser `json:"items"`
+}
+
+// PollsBackground struct.
+type PollsBackground struct {
+ Type string `json:"type"`
+ Angle int `json:"angle"`
+ Color string `json:"color"`
+ Points []struct {
+ Position float64 `json:"position"`
+ Color string `json:"color"`
+ } `json:"points"`
+ ID int `json:"id"`
+ Name string `json:"name"`
+}
+
+// PollsPhoto struct.
+type PollsPhoto struct {
+ ID int `json:"id"`
+ Color string `json:"color"`
+ Images []PhotosImage `json:"images"`
+}
+
+// PollsPhotoUploadResponse struct.
+type PollsPhotoUploadResponse struct {
+ Photo string `json:"photo"` // Uploaded photo data
+ Hash string `json:"hash"` // Uploaded hash
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/prettycards.go b/vendor/github.com/SevereCloud/vksdk/v2/object/prettycards.go
new file mode 100644
index 00000000..4cb14a01
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/prettycards.go
@@ -0,0 +1,14 @@
+package object
+
+// PrettyCardsPrettyCard struct.
+type PrettyCardsPrettyCard struct {
+ Button string `json:"button"` // Button key
+ ButtonText string `json:"button_text"` // Button text in current language
+ CardID string `json:"card_id"` // Card ID (long int returned as string)
+ Images []BaseImage `json:"images"`
+ LinkURL string `json:"link_url"` // Link URL
+ Photo string `json:"photo"` // Photo ID (format "<owner_id>_<media_id>")
+ Price string `json:"price"` // Price if set (decimal number returned as string)
+ PriceOld string `json:"price_old"` // Old price if set (decimal number returned as string)
+ Title string `json:"title"` // Title
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/search.go b/vendor/github.com/SevereCloud/vksdk/v2/object/search.go
new file mode 100644
index 00000000..81b0e17a
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/search.go
@@ -0,0 +1,11 @@
+package object
+
+// SearchHint struct.
+type SearchHint struct {
+ Description string `json:"description"` // Object description
+ Global int `json:"global,omitempty"` // Information whether the object has been found globally
+ Group GroupsGroup `json:"group,omitempty"`
+ Profile UsersUser `json:"profile,omitempty"`
+ Section string `json:"section"`
+ Type string `json:"type"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/secure.go b/vendor/github.com/SevereCloud/vksdk/v2/object/secure.go
new file mode 100644
index 00000000..5d64059f
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/secure.go
@@ -0,0 +1,33 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// SecureLevel struct.
+type SecureLevel struct {
+ Level int `json:"level"` // Level
+ UID int `json:"uid"` // User ID
+}
+
+// SecureSmsNotification struct.
+type SecureSmsNotification struct {
+ AppID int `json:"app_id"` // Application ID
+ Date int `json:"date"` // Date when message has been sent in Unixtime
+ ID int `json:"id"` // Notification ID
+ Message string `json:"message"` // Message text
+ UserID int `json:"user_id"` // User ID
+}
+
+// SecureTokenChecked struct.
+type SecureTokenChecked struct {
+ Date int `json:"date"` // Date when access_token has been generated in Unixtime
+ Expire int `json:"expire"` // Date when access_token will expire in Unixtime
+ Success int `json:"success"` // Returns if successfully processed
+ UserID int `json:"user_id"` // User ID
+}
+
+// SecureTransaction struct.
+type SecureTransaction struct {
+ Date int `json:"date"` // Transaction date in Unixtime
+ ID int `json:"id"` // Transaction ID
+ UIDFrom int `json:"uid_from"` // From ID
+ UIDTo int `json:"uid_to"` // To ID
+ Votes int `json:"votes"` // Votes number
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/stats.go b/vendor/github.com/SevereCloud/vksdk/v2/object/stats.go
new file mode 100644
index 00000000..b8fe5001
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/stats.go
@@ -0,0 +1,77 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// StatsActivity struct.
+type StatsActivity struct {
+ Comments int `json:"comments"` // Comments number
+ Copies int `json:"copies"` // Reposts number
+ Hidden int `json:"hidden"` // Hidden from news count
+ Likes int `json:"likes"` // Likes number
+ Subscribed int `json:"subscribed"` // New subscribers count
+ Unsubscribed int `json:"unsubscribed"` // Unsubscribed count
+}
+
+// StatsCity struct.
+type StatsCity struct {
+ Count int `json:"count"` // Visitors number
+ Name string `json:"name"` // City name
+ Value int `json:"value"` // City ID
+}
+
+// StatsCountry struct.
+type StatsCountry struct {
+ Code string `json:"code"` // Country code
+ Count int `json:"count"` // Visitors number
+ Name string `json:"name"` // Country name
+ Value int `json:"value"` // Country ID
+}
+
+// StatsPeriod struct.
+type StatsPeriod struct {
+ Activity StatsActivity `json:"activity"`
+ PeriodFrom int `json:"period_from"` // Unix timestamp
+ PeriodTo int `json:"period_to"` // Unix timestamp
+ Reach StatsReach `json:"reach"`
+ Visitors StatsViews `json:"visitors"`
+}
+
+// StatsReach struct.
+type StatsReach struct {
+ Age []StatsSexAge `json:"age"`
+ Cities []StatsCity `json:"cities"`
+ Countries []StatsCountry `json:"countries"`
+ MobileReach int `json:"mobile_reach"` // Reach count from mobile devices
+ Reach int `json:"reach"` // Reach count
+ ReachSubscribers int `json:"reach_subscribers"` // Subscribers reach count
+ Sex []StatsSexAge `json:"sex"`
+ SexAge []StatsSexAge `json:"sex_age"`
+}
+
+// StatsSexAge struct.
+type StatsSexAge struct {
+ Count int `json:"count"` // Visitors number
+ Value string `json:"value"` // Sex/age value
+}
+
+// StatsViews struct.
+type StatsViews struct {
+ Age []StatsSexAge `json:"age"`
+ Cities []StatsCity `json:"cities"`
+ Countries []StatsCountry `json:"countries"`
+ MobileViews int `json:"mobile_views"` // Number of views from mobile devices
+ Sex []StatsSexAge `json:"sex"`
+ SexAge []StatsSexAge `json:"sex_age"`
+ Views int `json:"views"` // Views number
+ Visitors int `json:"visitors"` // Visitors number
+}
+
+// StatsWallpostStat struct.
+type StatsWallpostStat struct {
+ Hide int `json:"hide"` // Hidings number
+ JoinGroup int `json:"join_group"` // People have joined the group
+ Links int `json:"links"` // Link click-through
+ ReachSubscribers int `json:"reach_subscribers"` // Subscribers reach
+ ReachTotal int `json:"reach_total"` // Total reach
+ Report int `json:"report"` // Reports number
+ ToGroup int `json:"to_group"` // Click-through to community
+ Unsubscribe int `json:"unsubscribe"` // Unsubscribed members
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/stories.go b/vendor/github.com/SevereCloud/vksdk/v2/object/stories.go
new file mode 100644
index 00000000..8995e8d4
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/stories.go
@@ -0,0 +1,335 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "encoding/json"
+)
+
+// StoriesViewer struct.
+type StoriesViewer struct {
+ IsLiked bool `json:"is_liked"`
+ UserID int `json:"user_id"`
+
+ // For extended
+ User struct {
+ Type string `json:"type"`
+ ID int `json:"id"`
+ FirstName string `json:"first_name"`
+ LastName string `json:"last_name"`
+ IsClosed bool `json:"is_closed"`
+ CanAccessClosed bool `json:"can_access_closed"`
+ } `json:"user,omitempty"`
+}
+
+// StoriesNarrativeInfo type.
+type StoriesNarrativeInfo struct {
+ Author string `json:"author"`
+ Title string `json:"title"`
+ Views int `json:"views"`
+}
+
+// StoriesPromoData struct.
+type StoriesPromoData struct {
+ Name string `json:"name"`
+ Photo50 string `json:"photo_50"`
+ Photo100 string `json:"photo_100"`
+ NotAnimated BaseBoolInt `json:"not_animated"`
+}
+
+// StoriesStoryLink struct.
+type StoriesStoryLink struct {
+ Text string `json:"text"` // Link text
+ URL string `json:"url"` // Link URL
+}
+
+// StoriesReplies struct.
+type StoriesReplies struct {
+ Count int `json:"count"` // Replies number.
+ New int `json:"new"` // New replies number.
+}
+
+// StoriesQuestions struct.
+type StoriesQuestions struct {
+ Count int `json:"count"` // Replies number.
+ New int `json:"new"` // New replies number.
+}
+
+// StoriesStoryStats struct.
+type StoriesStoryStats struct {
+ Answer StoriesStoryStatsStat `json:"answer"`
+ Bans StoriesStoryStatsStat `json:"bans"`
+ OpenLink StoriesStoryStatsStat `json:"open_link"`
+ Replies StoriesStoryStatsStat `json:"replies"`
+ Shares StoriesStoryStatsStat `json:"shares"`
+ Subscribers StoriesStoryStatsStat `json:"subscribers"`
+ Views StoriesStoryStatsStat `json:"views"`
+ Likes StoriesStoryStatsStat `json:"likes"`
+}
+
+// StoriesStoryStatsStat struct.
+type StoriesStoryStatsStat struct {
+ Count int `json:"count"` // Stat value
+ State string `json:"state"`
+}
+
+// StoriesStoryType story type.
+type StoriesStoryType string
+
+// Possible values.
+const (
+ StoriesStoryPhoto StoriesStoryType = "photo"
+ StoriesStoryVideo StoriesStoryType = "video"
+ StoriesStoryLiveActive StoriesStoryType = "live_active"
+ StoriesStoryLiveFinished StoriesStoryType = "live_finished"
+ StoriesStoryBirthdayInvite StoriesStoryType = "birthday_invite"
+)
+
+// StoriesStory struct.
+type StoriesStory struct {
+ AccessKey string `json:"access_key"` // Access key for private object.
+ ExpiresAt int `json:"expires_at"` // Story expiration time. Unixtime.
+ CanHide BaseBoolInt `json:"can_hide"`
+ // Information whether story has question sticker and current user can send question to the author
+ CanAsk BaseBoolInt `json:"can_ask"`
+ // Information whether story has question sticker and current user can send anonymous question to the author
+ CanAskAnonymous BaseBoolInt `json:"can_ask_anonymous"`
+
+ // Information whether current user can comment the story (0 - no, 1 - yes).
+ CanComment BaseBoolInt `json:"can_comment"`
+
+ // Information whether current user can reply to the story
+ // (0 - no, 1 - yes).
+ CanReply BaseBoolInt `json:"can_reply"`
+
+ // Information whether current user can see the story (0 - no, 1 - yes).
+ CanSee BaseBoolInt `json:"can_see"`
+
+ // Information whether current user can share the story (0 - no, 1 - yes).
+ CanShare BaseBoolInt `json:"can_share"`
+
+ // Information whether the story is deleted (false - no, true - yes).
+ IsDeleted BaseBoolInt `json:"is_deleted"`
+
+ // Information whether the story is expired (false - no, true - yes).
+ IsExpired BaseBoolInt `json:"is_expired"`
+
+ // Is video without sound
+ NoSound BaseBoolInt `json:"no_sound"`
+
+ // Does author have stories privacy restrictions
+ IsRestricted BaseBoolInt `json:"is_restricted"`
+
+ CanUseInNarrative BaseBoolInt `json:"can_use_in_narrative"`
+
+ // Information whether current user has seen the story or not
+ // (0 - no, 1 - yes).
+ Seen BaseBoolInt `json:"seen"`
+ IsOwnerPinned BaseBoolInt `json:"is_owner_pinned"`
+ IsOneTime BaseBoolInt `json:"is_one_time"`
+ NeedMute BaseBoolInt `json:"need_mute"`
+ MuteReply BaseBoolInt `json:"mute_reply"`
+ CanLike BaseBoolInt `json:"can_like"`
+ Date int `json:"date"` // Date when story has been added in Unixtime.
+ ID int `json:"id"` // Story ID.
+ Link StoriesStoryLink `json:"link"`
+ OwnerID int `json:"owner_id"` // Story owner's ID.
+ ParentStory *StoriesStory `json:"parent_story"`
+ ParentStoryAccessKey string `json:"parent_story_access_key"` // Access key for private object.
+ ParentStoryID int `json:"parent_story_id"` // Parent story ID.
+ ParentStoryOwnerID int `json:"parent_story_owner_id"` // Parent story owner's ID.
+ Photo PhotosPhoto `json:"photo"`
+ Replies StoriesReplies `json:"replies"` // Replies to current story.
+ Type string `json:"type"`
+ Video VideoVideo `json:"video"`
+ Views int `json:"views"` // Views number.
+ ClickableStickers StoriesClickableStickers `json:"clickable_stickers"`
+ TrackCode string `json:"track_code"`
+ LikesCount int `json:"likes_count"`
+ NarrativeID int `json:"narrative_id"`
+ NarrativeOwnerID int `json:"narrative_owner_id"`
+ NarrativeInfo StoriesNarrativeInfo `json:"narrative_info"`
+ NarrativesCount int `json:"narratives_count"`
+ FirstNarrativeTitle string `json:"first_narrative_title"`
+ Questions StoriesQuestions `json:"questions"`
+}
+
+// StoriesFeedItemType type.
+type StoriesFeedItemType string
+
+// Possible values.
+const (
+ StoriesFeedItemStories StoriesFeedItemType = "stories"
+ StoriesFeedItemCommunity StoriesFeedItemType = "community_grouped_stories"
+ StoriesFeedItemApp StoriesFeedItemType = "app_grouped_stories"
+)
+
+// StoriesFeedItem struct.
+type StoriesFeedItem struct {
+ Type StoriesFeedItemType `json:"type"`
+ ID string `json:"id"`
+ Stories []StoriesStory `json:"stories"`
+ Grouped StoriesFeedItemType `json:"grouped"`
+ App AppsApp `json:"app"`
+}
+
+// StoriesClickableStickers struct.
+//
+// The field clickable_stickers is available in the history object.
+// The sticker object is pasted by the developer on the client himself, only
+// coordinates are transmitted to the server.
+//
+// https://vk.com/dev/objects/clickable_stickers
+type StoriesClickableStickers struct {
+ OriginalWidth int `json:"original_width"`
+ OriginalHeight int `json:"original_height"`
+ ClickableStickers []StoriesClickableSticker `json:"clickable_stickers"`
+}
+
+// NewClickableStickers return new StoriesClickableStickers.
+//
+// Requires the width and height of the original photo or video.
+func NewClickableStickers(width, height int) *StoriesClickableStickers {
+ return &StoriesClickableStickers{
+ OriginalWidth: width,
+ OriginalHeight: height,
+ ClickableStickers: []StoriesClickableSticker{},
+ }
+}
+
+// AddMention add mention sticker.
+//
+// Mention should be in the format of a VK mentioning, for example: [id1|name] or [club1|name].
+func (cs *StoriesClickableStickers) AddMention(mention string, area []StoriesClickablePoint) *StoriesClickableStickers {
+ cs.ClickableStickers = append(cs.ClickableStickers, StoriesClickableSticker{
+ Type: ClickableStickerMention,
+ ClickableArea: area,
+ Mention: mention,
+ })
+
+ return cs
+}
+
+// AddHashtag add hashtag sticker.
+//
+// Hashtag must necessarily begin with the symbol #.
+func (cs *StoriesClickableStickers) AddHashtag(hashtag string, area []StoriesClickablePoint) *StoriesClickableStickers {
+ cs.ClickableStickers = append(cs.ClickableStickers, StoriesClickableSticker{
+ Type: ClickableStickerHashtag,
+ ClickableArea: area,
+ Hashtag: hashtag,
+ })
+
+ return cs
+}
+
+// TODO: Add more clickable stickers func
+
+// ToJSON returns the JSON encoding of StoriesClickableStickers.
+func (cs StoriesClickableStickers) ToJSON() string {
+ b, _ := json.Marshal(cs)
+ return string(b)
+}
+
+// StoriesClickableSticker struct.
+type StoriesClickableSticker struct { // nolint: maligned
+ ID int `json:"id"`
+ Type string `json:"type"`
+ ClickableArea []StoriesClickablePoint `json:"clickable_area"`
+ Style string `json:"style,omitempty"`
+
+ // type=post
+ PostOwnerID int `json:"post_owner_id,omitempty"`
+ PostID int `json:"post_id,omitempty"`
+
+ // type=sticker
+ StickerID int `json:"sticker_id,omitempty"`
+ StickerPackID int `json:"sticker_pack_id,omitempty"`
+
+ // type=place
+ PlaceID int `json:"place_id,omitempty"`
+
+ // type=question
+ Question string `json:"question,omitempty"`
+ QuestionButton string `json:"question_button,omitempty"`
+ QuestionDefaultPrivate BaseBoolInt `json:"question_default_private,omitempty"`
+ Color string `json:"color,omitempty"`
+
+ // type=mention
+ Mention string `json:"mention,omitempty"`
+
+ // type=hashtag
+ Hashtag string `json:"hashtag,omitempty"`
+
+ // type=link
+ LinkObject BaseLink `json:"link_object,omitempty"`
+ TooltipText string `json:"tooltip_text,omitempty"`
+
+ // type=market_item
+ Subtype string `json:"subtype,omitempty"`
+ // LinkObject BaseLink `json:"link_object,omitempty"` // subtype=aliexpress_product
+ MarketItem MarketMarketItem `json:"market_item,omitempty"` // subtype=market_item
+
+ // type=story_reply
+ OwnerID int `json:"owner_id,omitempty"`
+ StoryID int `json:"story_id,omitempty"`
+
+ // type=owner
+ // OwnerID int `json:"owner_id,omitempty"`
+
+ // type=poll
+ Poll PollsPoll `json:"poll,omitempty"`
+
+ // type=music
+ Audio AudioAudio `json:"audio,omitempty"`
+ AudioStartTime int `json:"audio_start_time,omitempty"`
+
+ // type=app
+ App AppsApp `json:"app"`
+ AppContext string `json:"app_context"`
+ HasNewInteractions BaseBoolInt `json:"has_new_interactions"`
+ IsBroadcastNotifyAllowed BaseBoolInt `json:"is_broadcast_notify_allowed"`
+}
+
+// TODO: сделать несколько структур для кликабельного стикера
+
+// Type of clickable sticker.
+const (
+ ClickableStickerPost = "post"
+ ClickableStickerSticker = "sticker"
+ ClickableStickerPlace = "place"
+ ClickableStickerQuestion = "question"
+ ClickableStickerMention = "mention"
+ ClickableStickerHashtag = "hashtag"
+ ClickableStickerMarketItem = "market_item"
+ ClickableStickerLink = "link"
+ ClickableStickerStoryReply = "story_reply"
+ ClickableStickerOwner = "owner"
+ ClickableStickerPoll = "poll"
+ ClickableStickerMusic = "music"
+ ClickableStickerApp = "app"
+)
+
+// Subtype of clickable sticker.
+const (
+ ClickableStickerSubtypeMarketItem = "market_item"
+ ClickableStickerSubtypeAliexpressProduct = "aliexpress_product"
+)
+
+// Clickable sticker style.
+const (
+ ClickableStickerTransparent = "transparent"
+ ClickableStickerBlueGradient = "blue_gradient"
+ ClickableStickerRedGradient = "red_gradient"
+ ClickableStickerUnderline = "underline"
+ ClickableStickerBlue = "blue"
+ ClickableStickerGreen = "green"
+ ClickableStickerWhite = "white"
+ ClickableStickerQuestionReply = "question_reply"
+ ClickableStickerLight = "light"
+ ClickableStickerImpressive = "impressive"
+)
+
+// StoriesClickablePoint struct.
+type StoriesClickablePoint struct {
+ X int `json:"x"`
+ Y int `json:"y"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/users.go b/vendor/github.com/SevereCloud/vksdk/v2/object/users.go
new file mode 100644
index 00000000..07e1049f
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/users.go
@@ -0,0 +1,299 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "fmt"
+)
+
+// User relationship status.
+const (
+ UserRelationNotSpecified = iota // not specified
+ UserRelationSingle // single
+ UserRelationInRelationship // in a relationship
+ UserRelationEngaged // engaged
+ UserRelationMarried // married
+ UserRelationComplicated // complicated
+ UserRelationActivelySearching // actively searching
+ UserRelationInLove // in love
+ UserRelationCivilUnion // in a civil union
+)
+
+// UsersUser struct.
+type UsersUser struct {
+ ID int `json:"id"`
+ FirstName string `json:"first_name"`
+ LastName string `json:"last_name"`
+ FirstNameNom string `json:"first_name_nom"`
+ FirstNameGen string `json:"first_name_gen"`
+ FirstNameDat string `json:"first_name_dat"`
+ FirstNameAcc string `json:"first_name_acc"`
+ FirstNameIns string `json:"first_name_ins"`
+ FirstNameAbl string `json:"first_name_abl"`
+ LastNameNom string `json:"last_name_nom"`
+ LastNameGen string `json:"last_name_gen"`
+ LastNameDat string `json:"last_name_dat"`
+ LastNameAcc string `json:"last_name_acc"`
+ LastNameIns string `json:"last_name_ins"`
+ LastNameAbl string `json:"last_name_abl"`
+ MaidenName string `json:"maiden_name"`
+ Sex int `json:"sex"`
+ Nickname string `json:"nickname"`
+ Domain string `json:"domain"`
+ ScreenName string `json:"screen_name"`
+ Bdate string `json:"bdate"`
+ City BaseObject `json:"city"`
+ Country BaseObject `json:"country"`
+ Photo50 string `json:"photo_50"`
+ Photo100 string `json:"photo_100"`
+ Photo200 string `json:"photo_200"`
+ PhotoMax string `json:"photo_max"`
+ Photo200Orig string `json:"photo_200_orig"`
+ Photo400Orig string `json:"photo_400_orig"`
+ PhotoMaxOrig string `json:"photo_max_orig"`
+ PhotoID string `json:"photo_id"`
+ FriendStatus int `json:"friend_status"` // see FriendStatus const
+ OnlineApp int `json:"online_app"`
+ Online BaseBoolInt `json:"online"`
+ OnlineMobile BaseBoolInt `json:"online_mobile"`
+ HasPhoto BaseBoolInt `json:"has_photo"`
+ HasMobile BaseBoolInt `json:"has_mobile"`
+ IsClosed BaseBoolInt `json:"is_closed"`
+ IsFriend BaseBoolInt `json:"is_friend"`
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ IsHiddenFromFeed BaseBoolInt `json:"is_hidden_from_feed"`
+ CanAccessClosed BaseBoolInt `json:"can_access_closed"`
+ CanBeInvitedGroup BaseBoolInt `json:"can_be_invited_group"`
+ CanPost BaseBoolInt `json:"can_post"`
+ CanSeeAllPosts BaseBoolInt `json:"can_see_all_posts"`
+ CanSeeAudio BaseBoolInt `json:"can_see_audio"`
+ CanWritePrivateMessage BaseBoolInt `json:"can_write_private_message"`
+ CanSendFriendRequest BaseBoolInt `json:"can_send_friend_request"`
+ Verified BaseBoolInt `json:"verified"`
+ Trending BaseBoolInt `json:"trending"`
+ Blacklisted BaseBoolInt `json:"blacklisted"`
+ BlacklistedByMe BaseBoolInt `json:"blacklisted_by_me"`
+ Facebook string `json:"facebook"`
+ FacebookName string `json:"facebook_name"`
+ Twitter string `json:"twitter"`
+ Instagram string `json:"instagram"`
+ Site string `json:"site"`
+ Status string `json:"status"`
+ StatusAudio AudioAudio `json:"status_audio"`
+ LastSeen UsersLastSeen `json:"last_seen"`
+ CropPhoto UsersCropPhoto `json:"crop_photo"`
+ FollowersCount int `json:"followers_count"`
+ CommonCount int `json:"common_count"`
+ Occupation UsersOccupation `json:"occupation"`
+ Career []UsersCareer `json:"career"`
+ Military []UsersMilitary `json:"military"`
+ University int `json:"university"`
+ UniversityName string `json:"university_name"`
+ Faculty int `json:"faculty"`
+ FacultyName string `json:"faculty_name"`
+ Graduation int `json:"graduation"`
+ EducationForm string `json:"education_form"`
+ EducationStatus string `json:"education_status"`
+ HomeTown string `json:"home_town"`
+ Relation int `json:"relation"`
+ Personal UsersPersonal `json:"personal"`
+ Interests string `json:"interests"`
+ Music string `json:"music"`
+ Activities string `json:"activities"`
+ Movies string `json:"movies"`
+ Tv string `json:"tv"`
+ Books string `json:"books"`
+ Games string `json:"games"`
+ Universities []UsersUniversity `json:"universities"`
+ Schools []UsersSchool `json:"schools"`
+ About string `json:"about"`
+ Relatives []UsersRelative `json:"relatives"`
+ Quotes string `json:"quotes"`
+ Lists []int `json:"lists"`
+ Deactivated string `json:"deactivated"`
+ WallDefault string `json:"wall_default"`
+ Timezone int `json:"timezone"`
+ Exports UsersExports `json:"exports"`
+ Counters UsersUserCounters `json:"counters"`
+ MobilePhone string `json:"mobile_phone"`
+ HomePhone string `json:"home_phone"`
+ FoundWith int `json:"found_with"` // TODO: check it
+ OnlineInfo UsersOnlineInfo `json:"online_info"`
+ Mutual FriendsRequestsMutual `json:"mutual"`
+ TrackCode string `json:"track_code"`
+ RelationPartner UsersUserMin `json:"relation_partner"`
+ Type string `json:"type"`
+ Skype string `json:"skype"`
+}
+
+// ToMention return mention.
+func (user UsersUser) ToMention() string {
+ return fmt.Sprintf("[id%d|%s %s]", user.ID, user.FirstName, user.LastName)
+}
+
+// UsersOnlineInfo struct.
+type UsersOnlineInfo struct {
+ AppID int `json:"app_id"`
+ LastSeen int `json:"last_seen"`
+ Status string `json:"status"`
+ Visible BaseBoolInt `json:"visible"`
+ IsOnline BaseBoolInt `json:"is_online"`
+ IsMobile BaseBoolInt `json:"is_mobile"`
+}
+
+// UsersUserMin struct.
+type UsersUserMin struct {
+ Deactivated string `json:"deactivated"` // Returns if a profile is deleted or blocked
+ FirstName string `json:"first_name"` // User first name
+ Hidden int `json:"hidden"` // Returns if a profile is hidden.
+ ID int `json:"id"` // User ID
+ LastName string `json:"last_name"` // User last name
+}
+
+// ToMention return mention.
+func (user UsersUserMin) ToMention() string {
+ return fmt.Sprintf("[id%d|%s %s]", user.ID, user.FirstName, user.LastName)
+}
+
+// UsersCareer struct.
+type UsersCareer struct {
+ CityID int `json:"city_id"` // City ID
+ CityName string `json:"city_name"` // City name
+ Company string `json:"company"` // Company name
+ CountryID int `json:"country_id"` // Country ID
+ From int `json:"from"` // From year
+ GroupID int `json:"group_id"` // Community ID
+ ID int `json:"id"` // Career ID
+ Position string `json:"position"` // Position
+ Until int `json:"until"` // Till year
+}
+
+// UsersCropPhoto struct.
+type UsersCropPhoto struct {
+ Crop UsersCropPhotoCrop `json:"crop"`
+ Photo PhotosPhoto `json:"photo"`
+ Rect UsersCropPhotoRect `json:"rect"`
+}
+
+// UsersCropPhotoCrop struct.
+type UsersCropPhotoCrop struct {
+ X float64 `json:"x"` // Coordinate X of the left upper corner
+ X2 float64 `json:"x2"` // Coordinate X of the right lower corner
+ Y float64 `json:"y"` // Coordinate Y of the left upper corner
+ Y2 float64 `json:"y2"` // Coordinate Y of the right lower corner
+}
+
+// UsersCropPhotoRect struct.
+type UsersCropPhotoRect struct {
+ X float64 `json:"x"` // Coordinate X of the left upper corner
+ X2 float64 `json:"x2"` // Coordinate X of the right lower corner
+ Y float64 `json:"y"` // Coordinate Y of the left upper corner
+ Y2 float64 `json:"y2"` // Coordinate Y of the right lower corner
+}
+
+// UsersExports struct.
+type UsersExports struct {
+ Facebook int `json:"facebook"`
+ Livejournal int `json:"livejournal"`
+ Twitter int `json:"twitter"`
+}
+
+// UsersLastSeen struct.
+type UsersLastSeen struct {
+ Platform int `json:"platform"` // Type of the platform that used for the last authorization
+ Time int `json:"time"` // Last visit date (in Unix time)
+}
+
+// UsersMilitary struct.
+type UsersMilitary struct {
+ CountryID int `json:"country_id"` // Country ID
+ From int `json:"from"` // From year
+ ID int `json:"id"` // Military ID
+ Unit string `json:"unit"` // Unit name
+ UnitID int `json:"unit_id"` // Unit ID
+ Until int `json:"until"` // Till year
+}
+
+// UsersOccupation struct.
+type UsersOccupation struct {
+ // BUG(VK): UsersOccupation.ID is float https://vk.com/bug136108
+ ID float64 `json:"id"` // ID of school, university, company group
+ Name string `json:"name"` // Name of occupation
+ Type string `json:"type"` // Type of occupation
+}
+
+// UsersPersonal struct.
+type UsersPersonal struct {
+ Alcohol int `json:"alcohol"` // User's views on alcohol
+ InspiredBy string `json:"inspired_by"` // User's inspired by
+ Langs []string `json:"langs"`
+ LifeMain int `json:"life_main"` // User's personal priority in life
+ PeopleMain int `json:"people_main"` // User's personal priority in people
+ Political int `json:"political"` // User's political views
+ Religion string `json:"religion"` // User's religion
+ Smoking int `json:"smoking"` // User's views on smoking
+ ReligionID int `json:"religion_id"`
+}
+
+// UsersRelative struct.
+type UsersRelative struct {
+ BirthDate string `json:"birth_date"` // Date of child birthday (format dd.mm.yyyy)
+ ID int `json:"id"` // Relative ID
+ Name string `json:"name"` // Name of relative
+ Type string `json:"type"` // Relative type
+}
+
+// UsersSchool struct.
+type UsersSchool struct {
+ City int `json:"city"` // City ID
+ Class string `json:"class"` // School class letter
+ Country int `json:"country"` // Country ID
+ ID string `json:"id"` // School ID
+ Name string `json:"name"` // School name
+ Type int `json:"type"` // School type ID
+ TypeStr string `json:"type_str"` // School type name
+ YearFrom int `json:"year_from"` // Year the user started to study
+ YearGraduated int `json:"year_graduated"` // Graduation year
+ YearTo int `json:"year_to"` // Year the user finished to study
+ Speciality string `json:"speciality,omitempty"`
+}
+
+// UsersUniversity struct.
+type UsersUniversity struct {
+ Chair int `json:"chair"` // Chair ID
+ ChairName string `json:"chair_name"` // Chair name
+ City int `json:"city"` // City ID
+ Country int `json:"country"` // Country ID
+ EducationForm string `json:"education_form"` // Education form
+ EducationStatus string `json:"education_status"` // Education status
+ Faculty int `json:"faculty"` // Faculty ID
+ FacultyName string `json:"faculty_name"` // Faculty name
+ Graduation int `json:"graduation"` // Graduation year
+ ID int `json:"id"` // University ID
+ Name string `json:"name"` // University name
+}
+
+// UsersUserCounters struct.
+type UsersUserCounters struct {
+ Albums int `json:"albums"` // Albums number
+ Audios int `json:"audios"` // Audios number
+ Followers int `json:"followers"` // Followers number
+ Friends int `json:"friends"` // Friends number
+ Gifts int `json:"gifts"` // Gifts number
+ Groups int `json:"groups"` // Communities number
+ Notes int `json:"notes"` // Notes number
+ OnlineFriends int `json:"online_friends"` // Online friends number
+ Pages int `json:"pages"` // Public pages number
+ Photos int `json:"photos"` // Photos number
+ Subscriptions int `json:"subscriptions"` // Subscriptions number
+ UserPhotos int `json:"user_photos"` // Number of photos with user
+ UserVideos int `json:"user_videos"` // Number of videos with user
+ Videos int `json:"videos"` // Videos number
+ MutualFriends int `json:"mutual_friends"`
+}
+
+// UsersUserLim struct.
+type UsersUserLim struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+ NameGen string `json:"name_gen"`
+ Photo string `json:"photo"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/utils.go b/vendor/github.com/SevereCloud/vksdk/v2/object/utils.go
new file mode 100644
index 00000000..3bbd775d
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/utils.go
@@ -0,0 +1,93 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// UtilsDomainResolvedType object type.
+const (
+ UtilsDomainResolvedTypeUser = "user"
+ UtilsDomainResolvedTypeGroup = "group"
+ UtilsDomainResolvedTypeApplication = "application"
+ UtilsDomainResolvedTypePage = "page"
+ UtilsDomainResolvedTypeVkApp = "vk_app"
+)
+
+// UtilsDomainResolved struct.
+type UtilsDomainResolved struct {
+ ObjectID int `json:"object_id"` // Object ID
+ Type string `json:"type"`
+}
+
+// UtilsLastShortenedLink struct.
+type UtilsLastShortenedLink struct {
+ AccessKey string `json:"access_key"` // Access key for private stats
+ Key string `json:"key"` // Link key (characters after vk.cc/)
+ ShortURL string `json:"short_url"` // Short link URL
+ Timestamp int `json:"timestamp"` // Creation time in Unixtime
+ URL string `json:"url"` // Full URL
+ Views int `json:"views"` // Total views number
+}
+
+// Link status.
+const (
+ UtilsLinkCheckedStatusNotBanned = "not_banned"
+ UtilsLinkCheckedStatusBanned = "banned"
+ UtilsLinkCheckedStatusProcessing = "processing"
+)
+
+// UtilsLinkChecked struct.
+type UtilsLinkChecked struct {
+ Link string `json:"link"` // Link URL
+ Status string `json:"status"`
+}
+
+// UtilsLinkStats struct.
+type UtilsLinkStats struct {
+ Key string `json:"key"` // Link key (characters after vk.cc/)
+ Stats []UtilsStats `json:"stats"`
+}
+
+// UtilsLinkStatsExtended struct.
+type UtilsLinkStatsExtended struct {
+ Key string `json:"key"` // Link key (characters after vk.cc/)
+ Stats []UtilsStatsExtended `json:"stats"`
+}
+
+// UtilsShortLink struct.
+type UtilsShortLink struct {
+ AccessKey string `json:"access_key"` // Access key for private stats
+ Key string `json:"key"` // Link key (characters after vk.cc/)
+ ShortURL string `json:"short_url"` // Short link URL
+ URL string `json:"url"` // Full URL
+}
+
+// UtilsStats struct.
+type UtilsStats struct {
+ Timestamp int `json:"timestamp"` // Start time
+ Views int `json:"views"` // Total views number
+}
+
+// UtilsStatsCity struct.
+type UtilsStatsCity struct {
+ CityID int `json:"city_id"` // City ID
+ Views int `json:"views"` // Views number
+}
+
+// UtilsStatsCountry struct.
+type UtilsStatsCountry struct {
+ CountryID int `json:"country_id"` // Country ID
+ Views int `json:"views"` // Views number
+}
+
+// UtilsStatsExtended struct.
+type UtilsStatsExtended struct {
+ Cities []UtilsStatsCity `json:"cities"`
+ Countries []UtilsStatsCountry `json:"countries"`
+ SexAge []UtilsStatsSexAge `json:"sex_age"`
+ Timestamp int `json:"timestamp"` // Start time
+ Views int `json:"views"` // Total views number
+}
+
+// UtilsStatsSexAge struct.
+type UtilsStatsSexAge struct {
+ AgeRange string `json:"age_range"` // Age denotation
+ Female int `json:"female"` // Views by female users
+ Male int `json:"male"` // Views by male users
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/video.go b/vendor/github.com/SevereCloud/vksdk/v2/object/video.go
new file mode 100644
index 00000000..62110243
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/video.go
@@ -0,0 +1,277 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+import (
+ "fmt"
+)
+
+// VideoVideo struct.
+type VideoVideo struct {
+ // Video access key.
+ AccessKey string `json:"access_key"`
+
+ // Date when the video has been added in Unixtime.
+ AddingDate int `json:"adding_date"`
+
+ // Information whether current user can add the video.
+ CanAdd BaseBoolInt `json:"can_add"`
+
+ // Information whether current user can add the video to faves.
+ CanAddToFaves BaseBoolInt `json:"can_add_to_faves"`
+
+ // Information whether current user can comment the video.
+ CanComment BaseBoolInt `json:"can_comment"`
+
+ // Information whether current user can edit the video.
+ CanEdit BaseBoolInt `json:"can_edit"`
+
+ // Information whether current user can like the video.
+ CanLike BaseBoolInt `json:"can_like"`
+
+ // Information whether current user can repost this video.
+ CanRepost BaseBoolInt `json:"can_repost"`
+ CanSubscribe BaseBoolInt `json:"can_subscribe"`
+ CanAttachLink BaseBoolInt `json:"can_attach_link"`
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ IsPrivate BaseBoolInt `json:"is_private"`
+ Added BaseBoolInt `json:"added"`
+ Repeat BaseBoolInt `json:"repeat"` // Information whether the video is repeated
+ ContentRestricted BaseBoolInt `json:"content_restricted"`
+ Live BaseBoolInt `json:"live"` // Returns if the video is a live stream
+ Upcoming BaseBoolInt `json:"upcoming"`
+ Comments int `json:"comments"` // Number of comments
+ Date int `json:"date"` // Date when video has been uploaded in Unixtime
+ Description string `json:"description"` // Video description
+ Duration int `json:"duration"` // Video duration in seconds
+ Files VideoVideoFiles `json:"files"`
+ FirstFrame []VideoVideoImage `json:"first_frame"`
+ Image []VideoVideoImage `json:"image"`
+ Height int `json:"height"` // Video height
+ ID int `json:"id"` // Video ID
+ OwnerID int `json:"owner_id"` // Video owner ID
+ UserID int `json:"user_id"`
+ Photo130 string `json:"photo_130"` // URL of the preview image with 130 px in width
+ Photo320 string `json:"photo_320"` // URL of the preview image with 320 px in width
+ Photo640 string `json:"photo_640"` // URL of the preview image with 640 px in width
+ Photo800 string `json:"photo_800"` // URL of the preview image with 800 px in width
+ Photo1280 string `json:"photo_1280"` // URL of the preview image with 1280 px in width
+
+ // URL of the page with a player that can be used to play the video in the browser.
+ Player string `json:"player"`
+ Processing int `json:"processing"` // Returns if the video is processing
+ Title string `json:"title"` // Video title
+ Type string `json:"type"`
+ Views int `json:"views"` // Number of views
+ Width int `json:"width"` // Video width
+ Platform string `json:"platform"`
+ LocalViews int `json:"local_views"`
+ Likes BaseLikesInfo `json:"likes"` // Count of likes
+ Reposts BaseRepostsInfo `json:"reposts"` // Count of views
+ TrackCode string `json:"track_code"`
+ PrivacyView Privacy `json:"privacy_view"`
+ PrivacyComment Privacy `json:"privacy_comment"`
+ ActionButton VideoActionButton `json:"action_button"`
+ Restriction VideoRestriction `json:"restriction"`
+ ContentRestrictedMessage string `json:"content_restricted_message"`
+}
+
+// ToAttachment return attachment format.
+func (video VideoVideo) ToAttachment() string {
+ return fmt.Sprintf("video%d_%d", video.OwnerID, video.ID)
+}
+
+// VideoRestriction struct.
+type VideoRestriction struct {
+ Title string `json:"title"`
+ Text string `json:"text"`
+ AlwaysShown BaseBoolInt `json:"always_shown"`
+ Blur BaseBoolInt `json:"blur"`
+ CanPlay BaseBoolInt `json:"can_play"`
+ CanPreview BaseBoolInt `json:"can_preview"`
+ CardIcon []BaseImage `json:"card_icon"`
+ ListIcon []BaseImage `json:"list_icon"`
+}
+
+// VideoActionButton struct.
+type VideoActionButton struct {
+ ID string `json:"id"`
+ Type string `json:"type"`
+ URL string `json:"url"`
+ Snippet VideoSnippet `json:"snippet"`
+}
+
+// VideoSnippet struct.
+type VideoSnippet struct {
+ Description string `json:"description"`
+ OpenTitle string `json:"open_title"`
+ Title string `json:"title"`
+ TypeName string `json:"type_name"`
+ Date int `json:"date"`
+ Image []BaseImage `json:"image"`
+}
+
+// VideoVideoFiles struct.
+type VideoVideoFiles struct {
+ External string `json:"external"` // URL of the external player
+ Mp4_1080 string `json:"mp4_1080"` // URL of the mpeg4 file with 1080p quality
+ Mp4_240 string `json:"mp4_240"` // URL of the mpeg4 file with 240p quality
+ Mp4_360 string `json:"mp4_360"` // URL of the mpeg4 file with 360p quality
+ Mp4_480 string `json:"mp4_480"` // URL of the mpeg4 file with 480p quality
+ Mp4_720 string `json:"mp4_720"` // URL of the mpeg4 file with 720p quality
+ Live string `json:"live"`
+ HLS string `json:"hls"`
+}
+
+// VideoCatBlock struct.
+type VideoCatBlock struct {
+ CanHide BaseBoolInt `json:"can_hide"`
+ ID int `json:"id"`
+ Items []VideoCatElement `json:"items"`
+ Name string `json:"name"`
+ Next string `json:"next"`
+ Type string `json:"type"`
+ View string `json:"view"`
+}
+
+// VideoCatElement struct.
+type VideoCatElement struct {
+ CanAdd BaseBoolInt `json:"can_add"`
+ CanEdit BaseBoolInt `json:"can_edit"`
+ IsPrivate BaseBoolInt `json:"is_private"`
+ Comments int `json:"comments"`
+ Count int `json:"count"`
+ Date int `json:"date"`
+ Description string `json:"description"`
+ Duration int `json:"duration"`
+ ID int `json:"id"`
+ OwnerID int `json:"owner_id"`
+ Photo130 string `json:"photo_130"`
+ Photo160 string `json:"photo_160"`
+ Photo320 string `json:"photo_320"`
+ Photo640 string `json:"photo_640"`
+ Photo800 string `json:"photo_800"`
+ Title string `json:"title"`
+ Type string `json:"type"`
+ UpdatedTime int `json:"updated_time"`
+ Views int `json:"views"`
+}
+
+// VideoSaveResult struct.
+type VideoSaveResult struct {
+ Description string `json:"description"` // Video description
+ OwnerID int `json:"owner_id"` // Video owner ID
+ Title string `json:"title"` // Video title
+ UploadURL string `json:"upload_url"` // URL for the video uploading
+ VideoID int `json:"video_id"` // Video ID
+ AccessKey string `json:"access_key"` // Video access key
+}
+
+// VideoUploadResponse struct.
+type VideoUploadResponse struct {
+ Size int `json:"size"`
+ VideoID int `json:"video_id"`
+}
+
+// VideoVideoAlbum struct.
+type VideoVideoAlbum struct {
+ ID int `json:"id"`
+ OwnerID int `json:"owner_id"`
+ Title string `json:"title"`
+}
+
+// VideoVideoAlbumFull struct.
+type VideoVideoAlbumFull struct {
+ Count int `json:"count"` // Total number of videos in album
+ ID int `json:"id"` // Album ID
+ Image []VideoVideoImage `json:"image"` // Album cover image in different sizes
+ IsSystem BaseBoolInt `json:"is_system"` // Information whether album is system
+ OwnerID int `json:"owner_id"` // Album owner's ID
+ Photo160 string `json:"photo_160"` // URL of the preview image with 160px in width
+ Photo320 string `json:"photo_320"` // URL of the preview image with 320px in width
+ Title string `json:"title"` // Album title
+ UpdatedTime int `json:"updated_time"` // Date when the album has been updated last time in Unixtime
+ ImageBlur int `json:"image_blur"`
+ Privacy Privacy `json:"privacy"`
+}
+
+// VideoVideoFull struct.
+type VideoVideoFull struct {
+ AccessKey string `json:"access_key"` // Video access key
+ AddingDate int `json:"adding_date"` // Date when the video has been added in Unixtime
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ CanAdd BaseBoolInt `json:"can_add"` // Information whether current user can add the video
+ CanComment BaseBoolInt `json:"can_comment"` // Information whether current user can comment the video
+ CanEdit BaseBoolInt `json:"can_edit"` // Information whether current user can edit the video
+ CanRepost BaseBoolInt `json:"can_repost"` // Information whether current user can comment the video
+ CanLike BaseBoolInt `json:"can_like"`
+ CanAddToFaves BaseBoolInt `json:"can_add_to_faves"`
+ Repeat BaseBoolInt `json:"repeat"` // Information whether the video is repeated
+ Comments int `json:"comments"` // Number of comments
+ Date int `json:"date"` // Date when video has been uploaded in Unixtime
+ Description string `json:"description"` // Video description
+ Duration int `json:"duration"` // Video duration in seconds
+ Files VideoVideoFiles `json:"files"`
+ ID int `json:"id"` // Video ID
+ Likes BaseLikes `json:"likes"`
+ Live int `json:"live"` // Returns if the video is live translation
+ OwnerID int `json:"owner_id"` // Video owner ID
+
+ // URL of the page with a player that can be used to play the video in the browser.
+ Player string `json:"player"`
+ Processing int `json:"processing"` // Returns if the video is processing
+ Title string `json:"title"` // Video title
+ Views int `json:"views"` // Number of views
+ Width int `json:"width"`
+ Height int `json:"height"`
+ Image []VideoVideoImage `json:"image"`
+ FirstFrame []VideoVideoImage `json:"first_frame"`
+ Added int `json:"added"`
+ Type string `json:"type"`
+ Reposts BaseRepostsInfo `json:"reposts"`
+}
+
+// ToAttachment return attachment format.
+func (video VideoVideoFull) ToAttachment() string {
+ return fmt.Sprintf("video%d_%d", video.OwnerID, video.ID)
+}
+
+// VideoVideoTag struct.
+type VideoVideoTag struct {
+ Date int `json:"date"`
+ ID int `json:"id"`
+ PlacerID int `json:"placer_id"`
+ TaggedName string `json:"tagged_name"`
+ UserID int `json:"user_id"`
+ Viewed BaseBoolInt `json:"viewed"`
+}
+
+// VideoVideoTagInfo struct.
+type VideoVideoTagInfo struct {
+ AccessKey string `json:"access_key"`
+ AddingDate int `json:"adding_date"`
+ CanAdd BaseBoolInt `json:"can_add"`
+ CanEdit BaseBoolInt `json:"can_edit"`
+ Comments int `json:"comments"`
+ Date int `json:"date"`
+ Description string `json:"description"`
+ Duration int `json:"duration"`
+ Files VideoVideoFiles `json:"files"`
+ ID int `json:"id"`
+ Live int `json:"live"`
+ OwnerID int `json:"owner_id"`
+ Photo130 string `json:"photo_130"`
+ Photo320 string `json:"photo_320"`
+ Photo800 string `json:"photo_800"`
+ PlacerID int `json:"placer_id"`
+ Player string `json:"player"`
+ Processing int `json:"processing"`
+ TagCreated int `json:"tag_created"`
+ TagID int `json:"tag_id"`
+ Title string `json:"title"`
+ Views int `json:"views"`
+}
+
+// VideoVideoImage struct.
+type VideoVideoImage struct {
+ BaseImage
+ WithPadding BaseBoolInt `json:"with_padding"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/wall.go b/vendor/github.com/SevereCloud/vksdk/v2/object/wall.go
new file mode 100644
index 00000000..5345fc5c
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/wall.go
@@ -0,0 +1,257 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// WallAppPost struct.
+type WallAppPost struct {
+ ID int `json:"id"` // Application ID
+ Name string `json:"name"` // Application name
+ Photo130 string `json:"photo_130"` // URL of the preview image with 130 px in width
+ Photo604 string `json:"photo_604"` // URL of the preview image with 604 px in width
+}
+
+// WallAttachedNote struct.
+type WallAttachedNote struct {
+ Comments int `json:"comments"` // Comments number
+ Date int `json:"date"` // Date when the note has been created in Unixtime
+ ID int `json:"id"` // Note ID
+ OwnerID int `json:"owner_id"` // Note owner's ID
+ ReadComments int `json:"read_comments"` // Read comments number
+ Title string `json:"title"` // Note title
+ ViewURL string `json:"view_url"` // URL of the page with note preview
+}
+
+// WallCommentAttachment struct.
+type WallCommentAttachment struct {
+ Audio AudioAudio `json:"audio"`
+ Doc DocsDoc `json:"doc"`
+ Link BaseLink `json:"link"`
+ Market MarketMarketItem `json:"market"`
+ MarketMarketAlbum MarketMarketAlbum `json:"market_market_album"`
+ Note WallAttachedNote `json:"note"`
+ Page PagesWikipageFull `json:"page"`
+ Photo PhotosPhoto `json:"photo"`
+ Sticker BaseSticker `json:"sticker"`
+ Type string `json:"type"`
+ Video VideoVideo `json:"video"`
+ Graffiti WallGraffiti `json:"graffiti"`
+}
+
+// WallGraffiti struct.
+type WallGraffiti struct {
+ ID int `json:"id"` // Graffiti ID
+ OwnerID int `json:"owner_id"` // Graffiti owner's ID
+ Photo200 string `json:"photo_200"` // URL of the preview image with 200 px in width
+ Photo586 string `json:"photo_586"` // URL of the preview image with 586 px in width
+ URL string `json:"url"`
+ Width int `json:"width"`
+ Height int `json:"height"`
+ AccessKey string `json:"access_key"`
+}
+
+// Type of post source.
+const (
+ WallPostSourceTypeVk = "vk"
+ WallPostSourceTypeWidget = "widget"
+ WallPostSourceTypeAPI = "api"
+ WallPostSourceTypeRss = "rss"
+ WallPostSourceTypeSms = "sms"
+)
+
+// WallPostSource struct.
+type WallPostSource struct {
+ Link BaseLink `json:"link"`
+ Data string `json:"data"` // Additional data
+ Platform string `json:"platform"` // Platform name
+ Type string `json:"type"`
+ URL string `json:"url"` // URL to an external site used to publish the post
+}
+
+// WallPostedPhoto struct.
+type WallPostedPhoto struct {
+ ID int `json:"id"` // Photo ID
+ OwnerID int `json:"owner_id"` // Photo owner's ID
+ Photo130 string `json:"photo_130"` // URL of the preview image with 130 px in width
+ Photo604 string `json:"photo_604"` // URL of the preview image with 604 px in width
+}
+
+// WallViews struct.
+type WallViews struct {
+ Count int `json:"count"` // Count
+}
+
+// WallWallCommentThread struct.
+type WallWallCommentThread struct {
+ Count int `json:"count"` // Comments number
+ Items []WallWallComment `json:"items"`
+ CanPost BaseBoolInt `json:"can_post"` // Information whether current user can comment the post
+ GroupsCanPost BaseBoolInt `json:"groups_can_post"` // Information whether groups can comment the post
+ ShowReplyButton BaseBoolInt `json:"show_reply_button"`
+}
+
+// WallWallComment struct.
+type WallWallComment struct {
+ Attachments []WallCommentAttachment `json:"attachments"`
+ Date int `json:"date"` // Date when the comment has been added in Unixtime
+ Deleted BaseBoolInt `json:"deleted"`
+ FromID int `json:"from_id"` // Author ID
+ ID int `json:"id"` // Comment ID
+ Likes BaseLikesInfo `json:"likes"`
+ RealOffset int `json:"real_offset"` // Real position of the comment
+ ReplyToComment int `json:"reply_to_comment"` // Replied comment ID
+ ReplyToUser int `json:"reply_to_user"` // Replied user ID
+ Text string `json:"text"` // Comment text
+ PostID int `json:"post_id"`
+ PostOwnerID int `json:"post_owner_id"`
+ PhotoID int `json:"photo_id"`
+ PhotoOwnerID int `json:"photo_owner_id"`
+ VideoID int `json:"video_id"`
+ VideoOwnerID int `json:"video_owner_id"`
+ ItemID int `json:"item_id"`
+ MarketOwnerID int `json:"market_owner_id"`
+ ParentsStack []int `json:"parents_stack"`
+ OwnerID int `json:"owner_id"`
+ Thread WallWallCommentThread `json:"thread"`
+ Donut WallWallCommentDonut `json:"donut"`
+}
+
+// WallWallCommentDonut info about VK Donut.
+type WallWallCommentDonut struct {
+ IsDonut BaseBoolInt `json:"is_donut"`
+ Placeholder string `json:"placeholder"`
+}
+
+// WallPost type.
+const (
+ WallPostTypePost = "post"
+ WallPostTypeCopy = "copy"
+ WallPostTypeReply = "reply"
+ WallPostTypePostpone = "postpone"
+ WallPostTypeSuggest = "suggest"
+)
+
+// WallWallpost struct.
+type WallWallpost struct {
+ AccessKey string `json:"access_key"` // Access key to private object
+ ID int `json:"id"` // Post ID
+ OwnerID int `json:"owner_id"` // Wall owner's ID
+ FromID int `json:"from_id"` // Post author ID
+ CreatedBy int `json:"created_by"`
+ Date int `json:"date"` // Date of publishing in Unixtime
+ Text string `json:"text"` // Post text
+ ReplyOwnerID int `json:"reply_owner_id"`
+ ReplyPostID int `json:"reply_post_id"`
+ FriendsOnly int `json:"friends_only"`
+ Comments BaseCommentsInfo `json:"comments"`
+ Likes BaseLikesInfo `json:"likes"` // Count of likes
+ Reposts BaseRepostsInfo `json:"reposts"` // Count of views
+ Views WallViews `json:"views"` // Count of views
+ PostType string `json:"post_type"`
+ PostSource WallPostSource `json:"post_source"`
+ Attachments []WallWallpostAttachment `json:"attachments"`
+ Geo BaseGeo `json:"geo"`
+ SignerID int `json:"signer_id"` // Post signer ID
+ CopyHistory []WallWallpost `json:"copy_history"`
+ CanPin BaseBoolInt `json:"can_pin"`
+ CanDelete BaseBoolInt `json:"can_delete"`
+ CanEdit BaseBoolInt `json:"can_edit"`
+ IsPinned BaseBoolInt `json:"is_pinned"`
+ IsFavorite BaseBoolInt `json:"is_favorite"` // Information whether the post in favorites list
+ IsArchived BaseBoolInt `json:"is_archived"` // Is post archived, only for post owners
+ MarkedAsAds BaseBoolInt `json:"marked_as_ads"`
+ Edited int `json:"edited"` // Date of editing in Unixtime
+ Copyright WallPostCopyright `json:"copyright"`
+ PostID int `json:"post_id"`
+ ParentsStack []int `json:"parents_stack"`
+ Donut WallWallpostDonut `json:"donut"` // need api v5.125
+ ShortTextRate float64 `json:"short_text_rate"`
+ CarouselOffset int `json:"carousel_offset"`
+}
+
+// Attachment type.
+//
+// TODO: check this.
+const (
+ AttachmentTypePhoto = "photo"
+ AttachmentTypePostedPhoto = "posted_photo"
+ AttachmentTypeAudio = "audio"
+ AttachmentTypeVideo = "video"
+ AttachmentTypeDoc = "doc"
+ AttachmentTypeLink = "link"
+ AttachmentTypeGraffiti = "graffiti"
+ AttachmentTypeNote = "note"
+ AttachmentTypeApp = "app"
+ AttachmentTypePoll = "poll"
+ AttachmentTypePage = "page"
+ AttachmentTypeAlbum = "album"
+ AttachmentTypePhotosList = "photos_list"
+ AttachmentTypeMarketAlbum = "market_album"
+ AttachmentTypeMarket = "market"
+ AttachmentTypeEvent = "event"
+ AttachmentTypeWall = "wall"
+ AttachmentTypeStory = "story"
+ AttachmentTypePodcast = "podcast"
+)
+
+// WallWallpostAttachment struct.
+type WallWallpostAttachment struct {
+ AccessKey string `json:"access_key"` // Access key for the audio
+ Album PhotosPhotoAlbum `json:"album"`
+ App WallAppPost `json:"app"`
+ Audio AudioAudio `json:"audio"`
+ Doc DocsDoc `json:"doc"`
+ Event EventsEventAttach `json:"event"`
+ Graffiti WallGraffiti `json:"graffiti"`
+ Link BaseLink `json:"link"`
+ Market MarketMarketItem `json:"market"`
+ MarketMarketAlbum MarketMarketAlbum `json:"market_market_album"`
+ Note WallAttachedNote `json:"note"`
+ Page PagesWikipageFull `json:"page"`
+ Photo PhotosPhoto `json:"photo"`
+ PhotosList []string `json:"photos_list"`
+ Poll PollsPoll `json:"poll"`
+ PostedPhoto WallPostedPhoto `json:"posted_photo"`
+ Type string `json:"type"`
+ Video VideoVideo `json:"video"`
+ Podcast PodcastsEpisode `json:"podcast"`
+}
+
+// WallWallpostToID struct.
+type WallWallpostToID struct {
+ Attachments []WallWallpostAttachment `json:"attachments"`
+ Comments BaseCommentsInfo `json:"comments"`
+ CopyOwnerID int `json:"copy_owner_id"` // ID of the source post owner
+ CopyPostID int `json:"copy_post_id"` // ID of the source post
+ Date int `json:"date"` // Date of publishing in Unixtime
+ FromID int `json:"from_id"` // Post author ID
+ Geo BaseGeo `json:"geo"`
+ ID int `json:"id"` // Post ID
+ Likes BaseLikesInfo `json:"likes"`
+ PostID int `json:"post_id"` // wall post ID (if comment)
+ PostSource WallPostSource `json:"post_source"`
+ PostType string `json:"post_type"`
+ Reposts BaseRepostsInfo `json:"reposts"`
+ SignerID int `json:"signer_id"` // Post signer ID
+ Text string `json:"text"` // Post text
+ ToID int `json:"to_id"` // Wall owner's ID
+ IsFavorite BaseBoolInt `json:"is_favorite"` // Information whether the post in favorites list
+ MarkedAsAds BaseBoolInt `json:"marked_as_ads"`
+ ParentsStack []int `json:"parents_stack"`
+ Donut WallWallpostDonut `json:"donut"` // need api v5.125
+ ShortTextRate float64 `json:"short_text_rate"`
+}
+
+// WallWallpostDonut info about VK Donut.
+type WallWallpostDonut struct {
+ IsDonut BaseBoolInt `json:"is_donut"`
+ CanPublishFreeCopy BaseBoolInt `json:"can_publish_free_copy"`
+ PaidDuration int `json:"paid_duration"`
+ EditMode string `json:"edit_mode"`
+ Durations []BaseObjectWithName `json:"durations"`
+}
+
+// WallPostCopyright information about the source of the post.
+type WallPostCopyright struct {
+ ID int `json:"id,omitempty"`
+ Link string `json:"link"`
+ Type string `json:"type"`
+ Name string `json:"name"`
+}
diff --git a/vendor/github.com/SevereCloud/vksdk/v2/object/widgets.go b/vendor/github.com/SevereCloud/vksdk/v2/object/widgets.go
new file mode 100644
index 00000000..80905a3f
--- /dev/null
+++ b/vendor/github.com/SevereCloud/vksdk/v2/object/widgets.go
@@ -0,0 +1,68 @@
+package object // import "github.com/SevereCloud/vksdk/v2/object"
+
+// WidgetsCommentMedia struct.
+type WidgetsCommentMedia struct {
+ ItemID int `json:"item_id"` // Media item ID
+ OwnerID int `json:"owner_id"` // Media owner's ID
+ ThumbSrc string `json:"thumb_src"` // URL of the preview image (type=photo only)
+ Type string `json:"type"`
+}
+
+// WidgetsCommentReplies struct.
+type WidgetsCommentReplies struct {
+ CanPost BaseBoolInt `json:"can_post"` // Information whether current user can comment the post
+ GroupsCanPost BaseBoolInt `json:"groups_can_post"`
+ Count int `json:"count"` // Comments number
+ Replies []WidgetsCommentRepliesItem `json:"replies"`
+}
+
+// WidgetsCommentRepliesItem struct.
+type WidgetsCommentRepliesItem struct {
+ Cid int `json:"cid"` // Comment ID
+ Date int `json:"date"` // Date when the comment has been added in Unixtime
+ Likes WidgetsWidgetLikes `json:"likes"`
+ Text string `json:"text"` // Comment text
+ UID int `json:"uid"` // User ID
+ User UsersUser `json:"user"`
+}
+
+// WidgetsWidgetComment struct.
+type WidgetsWidgetComment struct {
+ Attachments []WallCommentAttachment `json:"attachments"`
+ CanDelete BaseBoolInt `json:"can_delete"` // Information whether current user can delete the comment
+ IsFavorite BaseBoolInt `json:"is_favorite"`
+ Comments WidgetsCommentReplies `json:"comments"`
+ Date int `json:"date"` // Date when the comment has been added in Unixtime
+ FromID int `json:"from_id"` // Comment author ID
+ ID int `json:"id"` // Comment ID
+ Likes BaseLikesInfo `json:"likes"`
+ Media WidgetsCommentMedia `json:"media"`
+ PostType string `json:"post_type"` // Post type
+ Reposts BaseRepostsInfo `json:"reposts"`
+ Text string `json:"text"` // Comment text
+ ToID int `json:"to_id"` // Wall owner
+ PostSource WallPostSource `json:"post_source"`
+ Views struct {
+ Count int `json:"count"`
+ } `json:"views"`
+}
+
+// WidgetsWidgetLikes struct.
+type WidgetsWidgetLikes struct {
+ Count int `json:"count"` // Likes number
+}
+
+// WidgetsWidgetPage struct.
+type WidgetsWidgetPage struct {
+ Comments WidgetsWidgetLikes `json:"comments,omitempty"`
+
+ // Date when Widgets on the page has been initialized firstly in Unixtime
+ Date int `json:"date,omitempty"`
+ Description string `json:"description,omitempty"` // Page description
+ ID int `json:"id,omitempty"` // Page ID
+ Likes WidgetsWidgetLikes `json:"likes,omitempty"`
+ PageID string `json:"page_id,omitempty"` // page_id parameter value
+ Photo string `json:"photo,omitempty"` // URL of the preview image
+ Title string `json:"title,omitempty"` // Page title
+ URL string `json:"url,omitempty"` // Page absolute URL
+}