Compare commits
67 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afcd362cd1 | ||
|
|
0452be0cb3 | ||
|
|
1624f10773 | ||
|
|
8764be7461 | ||
|
|
5dd15ef8e7 | ||
|
|
4ac6366706 | ||
|
|
adc0912efa | ||
|
|
536823ce55 | ||
|
|
207cd24edb | ||
|
|
b039da1eba | ||
|
|
8fcd0f3b6f | ||
|
|
16fde6935c | ||
|
|
9592cff9fa | ||
|
|
109148988c | ||
|
|
cf13fff7d2 | ||
|
|
a9d8ac8bc0 | ||
|
|
1a4717b366 | ||
|
|
6cadf12260 | ||
|
|
19d47784bd | ||
|
|
b89102c5fc | ||
|
|
4f20ebead3 | ||
|
|
a9f89dbc64 | ||
|
|
58ea1e07d2 | ||
|
|
6de4c7e971 | ||
|
|
03dc51ffa2 | ||
|
|
aef2dcdfdd | ||
|
|
0494119bf4 | ||
|
|
0a17e21119 | ||
|
|
52e2f926f4 | ||
|
|
611fb279bc | ||
|
|
41b4e64be9 | ||
|
|
0d7315249d | ||
|
|
4913766d58 | ||
|
|
92da8c7044 | ||
|
|
9dba3d5385 | ||
|
|
2d3c26a4b2 | ||
|
|
8eba2d3e50 | ||
|
|
a8d4a27de1 | ||
|
|
c42167c6f4 | ||
|
|
44d182e2f9 | ||
|
|
ad95e35687 | ||
|
|
640a9995f4 | ||
|
|
95625f6871 | ||
|
|
2c20f72a9c | ||
|
|
5ad788e768 | ||
|
|
ed98c586c6 | ||
|
|
3e865708d6 | ||
|
|
c3bcbd63c0 | ||
|
|
29e29439ee | ||
|
|
0c19716f44 | ||
|
|
b24e1bafa1 | ||
|
|
64b899ac89 | ||
|
|
aa274e5ab7 | ||
|
|
7b3eaf3ccf | ||
|
|
1a5353d768 | ||
|
|
eff41759bc | ||
|
|
c23252ab53 | ||
|
|
1a3c57a031 | ||
|
|
4cc2c914e6 | ||
|
|
cbb46293ab | ||
|
|
765e00c949 | ||
|
|
662359908b | ||
|
|
0d99766686 | ||
|
|
ae3bc3358b | ||
|
|
1e0b4532bd | ||
|
|
4f8b19c686 | ||
|
|
84ab223b81 |
@@ -91,7 +91,6 @@ linters-settings:
|
||||
# Correct spellings using locale preferences for US or UK.
|
||||
# Default is to use a neutral variety of English.
|
||||
# Setting locale to US will correct the British spelling of 'colour' to 'color'.
|
||||
locale: US
|
||||
lll:
|
||||
# max line length, lines longer will be reported. Default is 120.
|
||||
# '\t' is counted as 1 character by default, and can be changed with the tab-width option
|
||||
|
||||
10
Dockerfile
10
Dockerfile
@@ -1,11 +1,9 @@
|
||||
FROM alpine AS builder
|
||||
|
||||
COPY . /go/src/github.com/42wim/matterbridge
|
||||
RUN apk update && apk add go git gcc musl-dev \
|
||||
&& cd /go/src/github.com/42wim/matterbridge \
|
||||
&& export GOPATH=/go \
|
||||
&& go get \
|
||||
&& go build -x -ldflags "-X main.githash=$(git log --pretty=format:'%h' -n 1)" -o /bin/matterbridge
|
||||
COPY . /go/src/matterbridge
|
||||
RUN apk --no-cache add go git \
|
||||
&& cd /go/src/matterbridge \
|
||||
&& go build -mod vendor -ldflags "-X main.githash=$(git log --pretty=format:'%h' -n 1)" -o /bin/matterbridge
|
||||
|
||||
FROM alpine
|
||||
RUN apk --no-cache add ca-certificates mailcap
|
||||
|
||||
28
README.md
28
README.md
@@ -70,7 +70,7 @@ And more...
|
||||
- [Changelog](#changelog)
|
||||
- [FAQ](#faq)
|
||||
- [Related projects](#related-projects)
|
||||
- [Articles](#articles)
|
||||
- [Articles / Tutorials](#articles--tutorials)
|
||||
- [Thanks](#thanks)
|
||||
|
||||
## Features
|
||||
@@ -91,16 +91,18 @@ And more...
|
||||
- [IRC](http://www.mirc.com/servers.html)
|
||||
- [Keybase](https://keybase.io)
|
||||
- [Matrix](https://matrix.org)
|
||||
- [Mattermost](https://github.com/mattermost/mattermost-server/) 4.x, 5.x
|
||||
- [Mattermost](https://github.com/mattermost/mattermost-server/)
|
||||
- [Microsoft Teams](https://teams.microsoft.com)
|
||||
- [Mumble](https://www.mumble.info/)
|
||||
- [Nextcloud Talk](https://nextcloud.com/talk/)
|
||||
- [Rocket.chat](https://rocket.chat)
|
||||
- [Slack](https://slack.com)
|
||||
- [Ssh-chat](https://github.com/shazow/ssh-chat)
|
||||
- [Steam](https://store.steampowered.com/)
|
||||
- ~~[Steam](https://store.steampowered.com/)~~
|
||||
- Not supported anymore, see [here](https://github.com/Philipp15b/go-steam/issues/94) for more info.
|
||||
- [Telegram](https://telegram.org)
|
||||
- [Twitch](https://twitch.tv)
|
||||
- [VK](https://vk.com/)
|
||||
- [WhatsApp](https://www.whatsapp.com/)
|
||||
- [XMPP](https://xmpp.org)
|
||||
- [Zulip](https://zulipchat.com)
|
||||
@@ -110,9 +112,11 @@ And more...
|
||||
- [Discourse](https://github.com/DeclanHoare/matterbabble)
|
||||
- [Facebook messenger](https://github.com/VictorNine/fbridge)
|
||||
- [Minecraft](https://github.com/elytra/MatterLink)
|
||||
- [Minecraft](https://github.com/raws/mattercraft)
|
||||
- [Reddit](https://github.com/bonehurtingjuice/mattereddit)
|
||||
- [Counter-Strike, half-life and more](https://forums.alliedmods.net/showthread.php?t=319430)
|
||||
- [MatterAMXX](https://github.com/GabeIggy/MatterAMXX)
|
||||
- [Vintage Story](https://github.com/NikkyAI/vs-matterbridge)
|
||||
|
||||
### API
|
||||
|
||||
@@ -122,11 +126,13 @@ More info and examples on the [wiki](https://github.com/42wim/matterbridge/wiki/
|
||||
Used by the projects below. Feel free to make a PR to add your project to this list.
|
||||
|
||||
- [MatterLink](https://github.com/elytra/MatterLink) (Matterbridge link for Minecraft Server chat)
|
||||
- [Minecraft](https://github.com/raws/mattercraft) (Matterbridge link for Minecraft Server chat)
|
||||
- [pyCord](https://github.com/NikkyAI/pyCord) (crossplatform chatbot)
|
||||
- [Mattereddit](https://github.com/bonehurtingjuice/mattereddit) (Reddit chat support)
|
||||
- [fbridge](https://github.com/VictorNine/fbridge) (Facebook messenger support)
|
||||
- [matterbabble](https://github.com/DeclanHoare/matterbabble) (Discourse support)
|
||||
- [MatterAMXX](https://forums.alliedmods.net/showthread.php?t=319430) (Counter-Strike, half-life and more via AMXX mod)
|
||||
- [Vintage Story](https://github.com/NikkyAI/vs-matterbridge)
|
||||
|
||||
## Chat with us
|
||||
|
||||
@@ -153,10 +159,10 @@ See <https://github.com/42wim/matterbridge/wiki>
|
||||
|
||||
### Binaries
|
||||
|
||||
- Latest stable release [v1.19.0](https://github.com/42wim/matterbridge/releases/latest)
|
||||
- Latest stable release [v1.22.0](https://github.com/42wim/matterbridge/releases/latest)
|
||||
- Development releases (follows master) can be downloaded [here](https://github.com/42wim/matterbridge/actions) selecting the latest green build and then artifacts.
|
||||
|
||||
To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest) and follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
||||
To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest). On \*nix platforms you may need to make the binary executable - you can do this by running `chmod a+x` on the binary (example: `chmod a+x matterbridge-1.20.0-linux-64bit`). After downloading (and making the binary executable, if necessary), follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
||||
|
||||
### Packages
|
||||
|
||||
@@ -168,7 +174,7 @@ To install or upgrade just download the latest [binary](https://github.com/42wim
|
||||
Most people just want to use binaries, you can find those [here](https://github.com/42wim/matterbridge/releases/latest)
|
||||
|
||||
If you really want to build from source, follow these instructions:
|
||||
Go 1.12+ is required. Make sure you have [Go](https://golang.org/doc/install) properly installed.
|
||||
Go 1.13+ is required. Make sure you have [Go](https://golang.org/doc/install) properly installed.
|
||||
|
||||
```bash
|
||||
go get github.com/42wim/matterbridge
|
||||
@@ -296,8 +302,11 @@ See [FAQ](https://github.com/42wim/matterbridge/wiki/FAQ)
|
||||
- [fbridge](https://github.com/VictorNine/fbridge) (Facebook messenger support)
|
||||
- [isla](https://github.com/alphachung/isla) (Bot for Discord-Telegram groups used alongside matterbridge)
|
||||
- [matterbabble](https://github.com/DeclanHoare/matterbabble) (Connect Discourse threads to Matterbridge)
|
||||
- [nextcloud talk](https://github.com/nextcloud/talk_matterbridge) (Integrates matterbridge in Nextcloud Talk)
|
||||
- [mattercraft](https://github.com/raws/mattercraft) (Minecraft bridge)
|
||||
- [vs-matterbridge](https://github.com/NikkyAI/vs-matterbridge) (Vintage Story bridge)
|
||||
|
||||
## Articles
|
||||
## Articles / Tutorials
|
||||
|
||||
- [matterbridge on kubernetes](https://medium.freecodecamp.org/using-kubernetes-to-deploy-a-chat-gateway-or-when-technology-works-like-its-supposed-to-a169a8cd69a3)
|
||||
- <https://mattermost.com/blog/connect-irc-to-mattermost/>
|
||||
@@ -308,6 +317,8 @@ See [FAQ](https://github.com/42wim/matterbridge/wiki/FAQ)
|
||||
- <https://www.stitcher.com/s/?eid=52382713>
|
||||
- <https://daniele.tech/2019/02/how-to-use-matterbridge-to-connect-2-different-slack-workspaces/>
|
||||
- <https://userlinux.net/mattermost-and-matterbridge.html>
|
||||
- <https://nextcloud.com/blog/bridging-chat-services-in-talk/>
|
||||
- Youtube: [whatsapp - telegram bridging](https://www.youtube.com/watch?v=W-VXISoKtNc)
|
||||
|
||||
## Thanks
|
||||
|
||||
@@ -338,6 +349,7 @@ Matterbridge wouldn't exist without these libraries:
|
||||
- steam - <https://github.com/Philipp15b/go-steam>
|
||||
- telegram - <https://github.com/go-telegram-bot-api/telegram-bot-api>
|
||||
- tengo - <https://github.com/d5/tengo>
|
||||
- vk - <https://github.com/SevereCloud/vksdk>
|
||||
- whatsapp - <https://github.com/Rhymen/go-whatsapp>
|
||||
- xmpp - <https://github.com/mattn/go-xmpp>
|
||||
- zulip - <https://github.com/ifo/gozulipbot>
|
||||
@@ -352,7 +364,7 @@ Matterbridge wouldn't exist without these libraries:
|
||||
[mb-mattermost]: https://framateam.org/signup_user_complete/?id=tfqm33ggop8x3qgu4boeieta6e
|
||||
[mb-msteams]: https://teams.microsoft.com/join/hj92x75gd3y7
|
||||
[mb-rocketchat]: https://open.rocket.chat/channel/matterbridge
|
||||
[mb-slack]: https://join.slack.com/matterbridgechat/shared_invite/MjEwODMxNjU1NDMwLTE0OTk2MTU3NTMtMzZkZmRiNDZhOA
|
||||
[mb-slack]: https://join.slack.com/t/matterbridgechat/shared_invite/zt-2ourq2h2-7YvyYBq2WFGC~~zEzA68_Q
|
||||
[mb-telegram]: https://t.me/Matterbridge
|
||||
[mb-twitch]: https://www.twitch.tv/matterbridge
|
||||
[mb-whatsapp]: https://www.whatsapp.com/
|
||||
|
||||
@@ -26,8 +26,11 @@ const (
|
||||
EventAPIConnected = "api_connected"
|
||||
EventUserTyping = "user_typing"
|
||||
EventGetChannelMembers = "get_channel_members"
|
||||
EventNoticeIRC = "notice_irc"
|
||||
)
|
||||
|
||||
const ParentIDNotFound = "msg-parent-not-found"
|
||||
|
||||
type Message struct {
|
||||
Text string `json:"text"`
|
||||
Channel string `json:"channel"`
|
||||
@@ -44,6 +47,14 @@ type Message struct {
|
||||
Extra map[string][]interface{}
|
||||
}
|
||||
|
||||
func (m Message) ParentNotFound() bool {
|
||||
return m.ParentID == ParentIDNotFound
|
||||
}
|
||||
|
||||
func (m Message) ParentValid() bool {
|
||||
return m.ParentID != "" && !m.ParentNotFound()
|
||||
}
|
||||
|
||||
type FileInfo struct {
|
||||
Name string
|
||||
Data *[]byte
|
||||
@@ -117,7 +128,7 @@ type Protocol struct {
|
||||
NicksPerRow int // mattermost, slack
|
||||
NoHomeServerSuffix bool // matrix
|
||||
NoSendJoinPart bool // all protocols
|
||||
NoTLS bool // mattermost
|
||||
NoTLS bool // mattermost, xmpp
|
||||
Password string // IRC,mattermost,XMPP,matrix
|
||||
PrefixMessagesWithNick bool // mattemost, slack
|
||||
PreserveThreading bool // slack
|
||||
@@ -154,7 +165,7 @@ type Protocol struct {
|
||||
UseTLS bool // IRC
|
||||
UseDiscriminator bool // discord
|
||||
UseFirstName bool // telegram
|
||||
UseUserName bool // discord
|
||||
UseUserName bool // discord, matrix
|
||||
UseInsecureURL bool // telegram
|
||||
VerboseJoinPart bool // IRC
|
||||
WebhookBindAddress string // mattermost, slack
|
||||
|
||||
@@ -2,13 +2,13 @@ package bdiscord
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/42wim/matterbridge/bridge"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/bridge/discord/transmitter"
|
||||
"github.com/42wim/matterbridge/bridge/helper"
|
||||
"github.com/matterbridge/discordgo"
|
||||
)
|
||||
@@ -20,12 +20,9 @@ type Bdiscord struct {
|
||||
|
||||
c *discordgo.Session
|
||||
|
||||
nick string
|
||||
userID string
|
||||
guildID string
|
||||
webhookID string
|
||||
webhookToken string
|
||||
canEditWebhooks bool
|
||||
nick string
|
||||
userID string
|
||||
guildID string
|
||||
|
||||
channelsMutex sync.RWMutex
|
||||
channels []*discordgo.Channel
|
||||
@@ -34,8 +31,10 @@ type Bdiscord struct {
|
||||
membersMutex sync.RWMutex
|
||||
userMemberMap map[string]*discordgo.Member
|
||||
nickMemberMap map[string]*discordgo.Member
|
||||
webhookCache map[string]string
|
||||
webhookMutex sync.RWMutex
|
||||
|
||||
// Webhook specific logic
|
||||
useAutoWebhooks bool
|
||||
transmitter *transmitter.Transmitter
|
||||
}
|
||||
|
||||
func New(cfg *bridge.Config) bridge.Bridger {
|
||||
@@ -43,24 +42,18 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
||||
b.userMemberMap = make(map[string]*discordgo.Member)
|
||||
b.nickMemberMap = make(map[string]*discordgo.Member)
|
||||
b.channelInfoMap = make(map[string]*config.ChannelInfo)
|
||||
b.webhookCache = make(map[string]string)
|
||||
if b.GetString("WebhookURL") != "" {
|
||||
b.Log.Debug("Configuring Discord Incoming Webhook")
|
||||
b.webhookID, b.webhookToken = b.splitURL(b.GetString("WebhookURL"))
|
||||
|
||||
b.useAutoWebhooks = b.GetBool("AutoWebhooks")
|
||||
if b.useAutoWebhooks {
|
||||
b.Log.Debug("Using automatic webhooks")
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *Bdiscord) Connect() error {
|
||||
var err error
|
||||
var guildFound bool
|
||||
token := b.GetString("Token")
|
||||
b.Log.Info("Connecting")
|
||||
if b.GetString("WebhookURL") == "" {
|
||||
b.Log.Info("Connecting using token")
|
||||
} else {
|
||||
b.Log.Info("Connecting using webhookurl (for posting) and token")
|
||||
}
|
||||
if !strings.HasPrefix(b.GetString("Token"), "Bot ") {
|
||||
token = "Bot " + b.GetString("Token")
|
||||
}
|
||||
@@ -97,62 +90,107 @@ func (b *Bdiscord) Connect() error {
|
||||
serverName := strings.Replace(b.GetString("Server"), "ID:", "", -1)
|
||||
b.nick = userinfo.Username
|
||||
b.userID = userinfo.ID
|
||||
|
||||
// Try and find this account's guild, and populate channels
|
||||
b.channelsMutex.Lock()
|
||||
for _, guild := range guilds {
|
||||
if guild.Name == serverName || guild.ID == serverName {
|
||||
b.channels, err = b.c.GuildChannels(guild.ID)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
b.guildID = guild.ID
|
||||
guildFound = true
|
||||
// Skip, if the server name does not match the visible name or the ID
|
||||
if guild.Name != serverName && guild.ID != serverName {
|
||||
continue
|
||||
}
|
||||
|
||||
// Complain about an ambiguous Server setting. Two Discord servers could have the same title!
|
||||
// For IDs, practically this will never happen. It would only trigger if some server's name is also an ID.
|
||||
if b.guildID != "" {
|
||||
return fmt.Errorf("found multiple Discord servers with the same name %#v, expected to see only one", serverName)
|
||||
}
|
||||
|
||||
// Getting this guild's channel could result in a permission error
|
||||
b.channels, err = b.c.GuildChannels(guild.ID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not get %#v's channels: %w", b.GetString("Server"), err)
|
||||
}
|
||||
|
||||
b.guildID = guild.ID
|
||||
}
|
||||
b.channelsMutex.Unlock()
|
||||
if !guildFound {
|
||||
msg := fmt.Sprintf("Server \"%s\" not found", b.GetString("Server"))
|
||||
err = errors.New(msg)
|
||||
b.Log.Error(msg)
|
||||
b.Log.Info("Possible values:")
|
||||
|
||||
// If we couldn't find a guild, we print extra debug information and return a nice error
|
||||
if b.guildID == "" {
|
||||
err = fmt.Errorf("could not find Discord server %#v", b.GetString("Server"))
|
||||
b.Log.Error(err.Error())
|
||||
|
||||
// Print all of the possible server values
|
||||
b.Log.Info("Possible server values:")
|
||||
for _, guild := range guilds {
|
||||
b.Log.Infof("Server=\"%s\" # Server name", guild.Name)
|
||||
b.Log.Infof("Server=\"%s\" # Server ID", guild.ID)
|
||||
b.Log.Infof("\t- Server=%#v # by name", guild.Name)
|
||||
b.Log.Infof("\t- Server=%#v # by ID", guild.ID)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
|
||||
// If there are no results, we should say that
|
||||
if len(guilds) == 0 {
|
||||
b.Log.Info("\t- (none found)")
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
b.channelsMutex.RLock()
|
||||
if b.GetString("WebhookURL") == "" {
|
||||
for _, channel := range b.channels {
|
||||
b.Log.Debugf("found channel %#v", channel)
|
||||
}
|
||||
} else {
|
||||
manageWebhooks := discordgo.PermissionManageWebhooks
|
||||
var channelsDenied []string
|
||||
for _, info := range b.Channels {
|
||||
id := b.getChannelID(info.Name) // note(qaisjp): this readlocks channelsMutex
|
||||
b.Log.Debugf("Verifying PermissionManageWebhooks for %s with ID %s", info.ID, id)
|
||||
// Legacy note: WebhookURL used to have an actual webhook URL that we would edit,
|
||||
// but we stopped doing that due to Discord making rate limits more aggressive.
|
||||
//
|
||||
// Even older: the same WebhookURL used to be used by every channel, which is usually unexpected.
|
||||
// This is no longer possible.
|
||||
if b.GetString("WebhookURL") != "" {
|
||||
message := "The global WebhookURL setting has been removed. "
|
||||
message += "You can get similar \"webhook editing\" behaviour by replacing this line with `AutoWebhooks=true`. "
|
||||
message += "If you rely on the old-OLD (non-editing) behaviour, can move the WebhookURL to specific channel sections."
|
||||
b.Log.Errorln(message)
|
||||
return fmt.Errorf("use of removed WebhookURL setting")
|
||||
}
|
||||
|
||||
perms, permsErr := b.c.UserChannelPermissions(userinfo.ID, id)
|
||||
if permsErr != nil {
|
||||
b.Log.Warnf("Failed to check PermissionManageWebhooks in channel \"%s\": %s", info.Name, permsErr.Error())
|
||||
} else if perms&manageWebhooks == manageWebhooks {
|
||||
continue
|
||||
if b.GetInt("debuglevel") > 0 {
|
||||
b.Log.Debug("enabling even more discord debug")
|
||||
b.c.Debug = true
|
||||
}
|
||||
|
||||
// Initialise webhook management
|
||||
b.transmitter = transmitter.New(b.c, b.guildID, "matterbridge", b.useAutoWebhooks)
|
||||
b.transmitter.Log = b.Log
|
||||
|
||||
var webhookChannelIDs []string
|
||||
for _, channel := range b.Channels {
|
||||
channelID := b.getChannelID(channel.Name) // note(qaisjp): this readlocks channelsMutex
|
||||
|
||||
// If a WebhookURL was not explicitly provided for this channel,
|
||||
// there are two options: just a regular bot message (ugly) or this is should be webhook sent
|
||||
if channel.Options.WebhookURL == "" {
|
||||
// If it should be webhook sent, we should enforce this via the transmitter
|
||||
if b.useAutoWebhooks {
|
||||
webhookChannelIDs = append(webhookChannelIDs, channelID)
|
||||
}
|
||||
channelsDenied = append(channelsDenied, fmt.Sprintf("%#v", info.Name))
|
||||
continue
|
||||
}
|
||||
|
||||
b.canEditWebhooks = len(channelsDenied) == 0
|
||||
if b.canEditWebhooks {
|
||||
b.Log.Info("Can manage webhooks; will edit channel for global webhook on send")
|
||||
} else {
|
||||
b.Log.Warn("Can't manage webhooks; won't edit channel for global webhook on send")
|
||||
b.Log.Warn("Can't manage webhooks in channels: ", strings.Join(channelsDenied, ", "))
|
||||
whID, whToken, ok := b.splitURL(channel.Options.WebhookURL)
|
||||
if !ok {
|
||||
return fmt.Errorf("failed to parse WebhookURL %#v for channel %#v", channel.Options.WebhookURL, channel.ID)
|
||||
}
|
||||
|
||||
b.transmitter.AddWebhook(channelID, &discordgo.Webhook{
|
||||
ID: whID,
|
||||
Token: whToken,
|
||||
GuildID: b.guildID,
|
||||
ChannelID: channelID,
|
||||
})
|
||||
}
|
||||
|
||||
if b.useAutoWebhooks {
|
||||
err = b.transmitter.RefreshGuildWebhooks(webhookChannelIDs)
|
||||
if err != nil {
|
||||
b.Log.WithError(err).Println("transmitter could not refresh guild webhooks")
|
||||
return err
|
||||
}
|
||||
}
|
||||
b.channelsMutex.RUnlock()
|
||||
|
||||
// Obtaining guild members and initializing nickname mapping.
|
||||
b.membersMutex.Lock()
|
||||
@@ -191,8 +229,6 @@ func (b *Bdiscord) JoinChannel(channel config.ChannelInfo) error {
|
||||
func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
||||
b.Log.Debugf("=> Receiving %#v", msg)
|
||||
|
||||
origMsgID := msg.ID
|
||||
|
||||
channelID := b.getChannelID(msg.Channel)
|
||||
if channelID == "" {
|
||||
return "", fmt.Errorf("Could not find channelID for %v", msg.Channel)
|
||||
@@ -211,79 +247,23 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
||||
msg.Text = "_" + msg.Text + "_"
|
||||
}
|
||||
|
||||
// use initial webhook configured for the entire Discord account
|
||||
isGlobalWebhook := true
|
||||
wID := b.webhookID
|
||||
wToken := b.webhookToken
|
||||
|
||||
// check if have a channel specific webhook
|
||||
b.channelsMutex.RLock()
|
||||
if ci, ok := b.channelInfoMap[msg.Channel+b.Account]; ok {
|
||||
if ci.Options.WebhookURL != "" {
|
||||
wID, wToken = b.splitURL(ci.Options.WebhookURL)
|
||||
isGlobalWebhook = false
|
||||
}
|
||||
// Handle prefix hint for unthreaded messages.
|
||||
if msg.ParentNotFound() {
|
||||
msg.ParentID = ""
|
||||
msg.Text = fmt.Sprintf("[thread]: %s", msg.Text)
|
||||
}
|
||||
b.channelsMutex.RUnlock()
|
||||
|
||||
// Use webhook to send the message
|
||||
if wID != "" && msg.Event != config.EventMsgDelete {
|
||||
// skip events
|
||||
if msg.Event != "" && msg.Event != config.EventUserAction && msg.Event != config.EventJoinLeave && msg.Event != config.EventTopicChange {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// If we are editing a message, delete the old message
|
||||
if msg.ID != "" {
|
||||
msg.ID = b.getCacheID(msg.ID)
|
||||
b.Log.Debugf("Deleting edited webhook message")
|
||||
err := b.c.ChannelMessageDelete(channelID, msg.ID)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not delete edited webhook message: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
b.Log.Debugf("Broadcasting using Webhook")
|
||||
|
||||
// skip empty messages
|
||||
if msg.Text == "" && (msg.Extra == nil || len(msg.Extra["file"]) == 0) {
|
||||
b.Log.Debugf("Skipping empty message %#v", msg)
|
||||
return "", nil
|
||||
}
|
||||
|
||||
msg.Text = helper.ClipMessage(msg.Text, MessageLength)
|
||||
msg.Text = b.replaceUserMentions(msg.Text)
|
||||
// discord username must be [0..32] max
|
||||
if len(msg.Username) > 32 {
|
||||
msg.Username = msg.Username[0:32]
|
||||
}
|
||||
// if we have a global webhook for this Discord account, and permission
|
||||
// to modify webhooks (previously verified), then set its channel to
|
||||
// the message channel before using it
|
||||
// TODO: this isn't necessary if the last message from this webhook was
|
||||
// sent to the current channel
|
||||
if isGlobalWebhook && b.canEditWebhooks {
|
||||
b.Log.Debugf("Setting webhook channel to \"%s\"", msg.Channel)
|
||||
_, err := b.c.WebhookEdit(wID, "", "", channelID)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not set webhook channel: %s", err)
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
b.Log.Debugf("Processing webhook sending for message %#v", msg)
|
||||
msg, err := b.webhookSend(&msg, wID, wToken)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not broadcast via webook for message %#v: %s", msg, err)
|
||||
return "", err
|
||||
}
|
||||
if msg == nil {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
b.updateCacheID(origMsgID, msg.ID)
|
||||
return msg.ID, nil
|
||||
useWebhooks := b.shouldMessageUseWebhooks(&msg)
|
||||
if useWebhooks && msg.Event != config.EventMsgDelete && msg.ParentID == "" {
|
||||
return b.handleEventWebhook(&msg, channelID)
|
||||
}
|
||||
|
||||
return b.handleEventBotUser(&msg, channelID)
|
||||
}
|
||||
|
||||
// handleEventDirect handles events via the bot user
|
||||
func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (string, error) {
|
||||
b.Log.Debugf("Broadcasting using token (API)")
|
||||
|
||||
// Delete message
|
||||
@@ -291,14 +271,13 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
msg.ID = b.getCacheID(msg.ID)
|
||||
err := b.c.ChannelMessageDelete(channelID, msg.ID)
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Upload a file if it exists
|
||||
if msg.Extra != nil {
|
||||
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
||||
for _, rmsg := range helper.HandleExtra(msg, b.General) {
|
||||
rmsg.Text = helper.ClipMessage(rmsg.Text, MessageLength)
|
||||
if _, err := b.c.ChannelMessageSend(channelID, rmsg.Username+rmsg.Text); err != nil {
|
||||
b.Log.Errorf("Could not send message %#v: %s", rmsg, err)
|
||||
@@ -306,7 +285,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
// check if we have files to upload (from slack, telegram or mattermost)
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
return b.handleUploadFile(&msg, channelID)
|
||||
return b.handleUploadFile(msg, channelID)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,54 +298,27 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
||||
return msg.ID, err
|
||||
}
|
||||
|
||||
m := discordgo.MessageSend{
|
||||
Content: msg.Username + msg.Text,
|
||||
}
|
||||
|
||||
if msg.ParentValid() {
|
||||
m.Reference = &discordgo.MessageReference{
|
||||
MessageID: msg.ParentID,
|
||||
ChannelID: channelID,
|
||||
GuildID: b.guildID,
|
||||
}
|
||||
}
|
||||
|
||||
// Post normal message
|
||||
res, err := b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)
|
||||
res, err := b.c.ChannelMessageSendComplex(channelID, &m)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return res.ID, nil
|
||||
}
|
||||
|
||||
// useWebhook returns true if we have a webhook defined somewhere
|
||||
func (b *Bdiscord) useWebhook() bool {
|
||||
if b.GetString("WebhookURL") != "" {
|
||||
return true
|
||||
}
|
||||
|
||||
b.channelsMutex.RLock()
|
||||
defer b.channelsMutex.RUnlock()
|
||||
|
||||
for _, channel := range b.channelInfoMap {
|
||||
if channel.Options.WebhookURL != "" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// isWebhookID returns true if the specified id is used in a defined webhook
|
||||
func (b *Bdiscord) isWebhookID(id string) bool {
|
||||
if b.GetString("WebhookURL") != "" {
|
||||
wID, _ := b.splitURL(b.GetString("WebhookURL"))
|
||||
if wID == id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
b.channelsMutex.RLock()
|
||||
defer b.channelsMutex.RUnlock()
|
||||
|
||||
for _, channel := range b.channelInfoMap {
|
||||
if channel.Options.WebhookURL != "" {
|
||||
wID, _ := b.splitURL(channel.Options.WebhookURL)
|
||||
if wID == id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// handleUploadFile handles native upload of files
|
||||
func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (string, error) {
|
||||
var err error
|
||||
@@ -388,83 +340,3 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// webhookSend send one or more message via webhook, taking care of file
|
||||
// uploads (from slack, telegram or mattermost).
|
||||
// Returns messageID and error.
|
||||
func (b *Bdiscord) webhookSend(msg *config.Message, webhookID, token string) (*discordgo.Message, error) {
|
||||
var (
|
||||
res *discordgo.Message
|
||||
err error
|
||||
)
|
||||
|
||||
// If avatar is unset, check if UseLocalAvatar contains the message's
|
||||
// account or protocol, and if so, try to find a local avatar
|
||||
if msg.Avatar == "" {
|
||||
for _, val := range b.GetStringSlice("UseLocalAvatar") {
|
||||
if msg.Protocol == val || msg.Account == val {
|
||||
if avatar := b.findAvatar(msg); avatar != "" {
|
||||
msg.Avatar = avatar
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// WebhookParams can have either `Content` or `File`.
|
||||
|
||||
// We can't send empty messages.
|
||||
if msg.Text != "" {
|
||||
res, err = b.c.WebhookExecute(
|
||||
webhookID,
|
||||
token,
|
||||
true,
|
||||
&discordgo.WebhookParams{
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not send text (%s) for message %#v: %s", msg.Text, msg, err)
|
||||
}
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
file := discordgo.File{
|
||||
Name: fi.Name,
|
||||
ContentType: "",
|
||||
Reader: bytes.NewReader(*fi.Data),
|
||||
}
|
||||
content := ""
|
||||
if msg.Text == "" {
|
||||
content = fi.Comment
|
||||
}
|
||||
_, e2 := b.c.WebhookExecute(
|
||||
webhookID,
|
||||
token,
|
||||
false,
|
||||
&discordgo.WebhookParams{
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
File: &file,
|
||||
Content: content,
|
||||
},
|
||||
)
|
||||
if e2 != nil {
|
||||
b.Log.Errorf("Could not send file %#v for message %#v: %s", file, msg, e2)
|
||||
}
|
||||
}
|
||||
}
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (b *Bdiscord) findAvatar(m *config.Message) string {
|
||||
member, err := b.getGuildMemberByNick(m.Username)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return member.User.AvatarURL("")
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat
|
||||
return
|
||||
}
|
||||
// if using webhooks, do not relay if it's ours
|
||||
if b.useWebhook() && m.Author.Bot && b.isWebhookID(m.Author.ID) {
|
||||
if m.Author.Bot && b.transmitter.HasWebhook(m.Author.ID) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -127,6 +127,11 @@ func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat
|
||||
// Replace emotes
|
||||
rmsg.Text = replaceEmotes(rmsg.Text)
|
||||
|
||||
// Add our parent id if it exists, and if it's not referring to a message in another channel
|
||||
if ref := m.MessageReference; ref != nil && ref.ChannelID == m.ChannelID {
|
||||
rmsg.ParentID = ref.MessageID
|
||||
}
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", m.Author.Username, b.Account)
|
||||
b.Log.Debugf("<= Message is %#v", rmsg)
|
||||
b.Remote <- rmsg
|
||||
|
||||
@@ -196,7 +196,7 @@ func (b *Bdiscord) replaceAction(text string) (string, bool) {
|
||||
}
|
||||
|
||||
// splitURL splits a webhookURL and returns the ID and token.
|
||||
func (b *Bdiscord) splitURL(url string) (string, string) {
|
||||
func (b *Bdiscord) splitURL(url string) (string, string, bool) {
|
||||
const (
|
||||
expectedWebhookSplitCount = 7
|
||||
webhookIdxID = 5
|
||||
@@ -204,43 +204,9 @@ func (b *Bdiscord) splitURL(url string) (string, string) {
|
||||
)
|
||||
webhookURLSplit := strings.Split(url, "/")
|
||||
if len(webhookURLSplit) != expectedWebhookSplitCount {
|
||||
b.Log.Fatalf("%s is no correct discord WebhookURL", url)
|
||||
return "", "", false
|
||||
}
|
||||
return webhookURLSplit[webhookIdxID], webhookURLSplit[webhookIdxToken]
|
||||
}
|
||||
|
||||
// getcacheID tries to find a corresponding msgID in the webhook cache.
|
||||
// if not found returns the original request.
|
||||
func (b *Bdiscord) getCacheID(msgID string) string {
|
||||
b.webhookMutex.RLock()
|
||||
defer b.webhookMutex.RUnlock()
|
||||
for k, v := range b.webhookCache {
|
||||
if msgID == k {
|
||||
return v
|
||||
}
|
||||
}
|
||||
return msgID
|
||||
}
|
||||
|
||||
// updateCacheID updates the cache so that the newID takes the place of
|
||||
// the original ID. This is used for edit/deletes in combination with webhooks
|
||||
// as editing a message via webhook means deleting the message and creating a
|
||||
// new message (with a new ID). This ID needs to be set instead of the original ID
|
||||
func (b *Bdiscord) updateCacheID(origID, newID string) {
|
||||
b.webhookMutex.Lock()
|
||||
match := false
|
||||
for k, v := range b.webhookCache {
|
||||
if v == origID {
|
||||
delete(b.webhookCache, k)
|
||||
b.webhookCache[origID] = newID
|
||||
match = true
|
||||
continue
|
||||
}
|
||||
}
|
||||
if !match && origID != "" {
|
||||
b.webhookCache[origID] = newID
|
||||
}
|
||||
b.webhookMutex.Unlock()
|
||||
return webhookURLSplit[webhookIdxID], webhookURLSplit[webhookIdxToken], true
|
||||
}
|
||||
|
||||
func enumerateUsernames(s string) []string {
|
||||
|
||||
257
bridge/discord/transmitter/transmitter.go
Normal file
257
bridge/discord/transmitter/transmitter.go
Normal file
@@ -0,0 +1,257 @@
|
||||
// Package transmitter provides functionality for transmitting
|
||||
// arbitrary webhook messages to Discord.
|
||||
//
|
||||
// The package provides the following functionality:
|
||||
//
|
||||
// - Creating new webhooks, whenever necessary
|
||||
// - Loading webhooks that we have previously created
|
||||
// - Sending new messages
|
||||
// - Editing messages, via message ID
|
||||
// - Deleting messages, via message ID
|
||||
//
|
||||
// The package has been designed for matterbridge, but with other
|
||||
// Go bots in mind. The public API should be matterbridge-agnostic.
|
||||
package transmitter
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/matterbridge/discordgo"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// A Transmitter represents a message manager for a single guild.
|
||||
type Transmitter struct {
|
||||
session *discordgo.Session
|
||||
guild string
|
||||
title string
|
||||
autoCreate bool
|
||||
|
||||
// channelWebhooks maps from a channel ID to a webhook instance
|
||||
channelWebhooks map[string]*discordgo.Webhook
|
||||
|
||||
mutex sync.RWMutex
|
||||
|
||||
Log *log.Entry
|
||||
}
|
||||
|
||||
// ErrWebhookNotFound is returned when a valid webhook for this channel/message combination does not exist
|
||||
var ErrWebhookNotFound = errors.New("webhook for this channel and message does not exist")
|
||||
|
||||
// ErrPermissionDenied is returned if the bot does not have permission to manage webhooks.
|
||||
//
|
||||
// Bots can be granted a guild-wide permission and channel-specific permissions to manage webhooks.
|
||||
// Despite potentially having guild-wide permission, channel specific overrides could deny a bot's permission to manage webhooks.
|
||||
var ErrPermissionDenied = errors.New("missing 'Manage Webhooks' permission")
|
||||
|
||||
// New returns a new Transmitter given a Discord session, guild ID, and title.
|
||||
func New(session *discordgo.Session, guild string, title string, autoCreate bool) *Transmitter {
|
||||
return &Transmitter{
|
||||
session: session,
|
||||
guild: guild,
|
||||
title: title,
|
||||
autoCreate: autoCreate,
|
||||
|
||||
channelWebhooks: make(map[string]*discordgo.Webhook),
|
||||
|
||||
Log: log.NewEntry(nil),
|
||||
}
|
||||
}
|
||||
|
||||
// Send transmits a message to the given channel with the provided webhook data, and waits until Discord responds with message data.
|
||||
func (t *Transmitter) Send(channelID string, params *discordgo.WebhookParams) (*discordgo.Message, error) {
|
||||
wh, err := t.getOrCreateWebhook(channelID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
msg, err := t.session.WebhookExecute(wh.ID, wh.Token, true, params)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("execute failed: %w", err)
|
||||
}
|
||||
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
// Edit will edit a message in a channel, if possible.
|
||||
func (t *Transmitter) Edit(channelID string, messageID string, params *discordgo.WebhookParams) error {
|
||||
wh := t.getWebhook(channelID)
|
||||
|
||||
if wh == nil {
|
||||
return ErrWebhookNotFound
|
||||
}
|
||||
|
||||
uri := discordgo.EndpointWebhookToken(wh.ID, wh.Token) + "/messages/" + messageID
|
||||
_, err := t.session.RequestWithBucketID("PATCH", uri, params, discordgo.EndpointWebhookToken("", ""))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// HasWebhook checks whether the transmitter is using a particular webhook.
|
||||
func (t *Transmitter) HasWebhook(id string) bool {
|
||||
t.mutex.RLock()
|
||||
defer t.mutex.RUnlock()
|
||||
|
||||
for _, wh := range t.channelWebhooks {
|
||||
if wh.ID == id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// AddWebhook allows you to register a channel's webhook with the transmitter.
|
||||
func (t *Transmitter) AddWebhook(channelID string, webhook *discordgo.Webhook) bool {
|
||||
t.Log.Debugf("Manually added webhook %#v to channel %#v", webhook.ID, channelID)
|
||||
t.mutex.Lock()
|
||||
defer t.mutex.Unlock()
|
||||
|
||||
_, replaced := t.channelWebhooks[channelID]
|
||||
t.channelWebhooks[channelID] = webhook
|
||||
return replaced
|
||||
}
|
||||
|
||||
// RefreshGuildWebhooks loads "relevant" webhooks into the transmitter, with careful permission handling.
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// - A webhook is "relevant" if it was created by this bot -- the ApplicationID should match the bot's ID.
|
||||
// - The term "having permission" means having the "Manage Webhooks" permission. See ErrPermissionDenied for more information.
|
||||
// - This function is additive and will not unload previously loaded webhooks.
|
||||
// - A nil channelIDs slice is treated the same as an empty one.
|
||||
//
|
||||
// If the bot has guild-wide permission:
|
||||
//
|
||||
// 1. it will load any "relevant" webhooks from the entire guild
|
||||
// 2. the given slice is ignored
|
||||
//
|
||||
// If the bot does not have guild-wide permission:
|
||||
//
|
||||
// 1. it will load any "relevant" webhooks in each channel
|
||||
// 2. a single error will be returned if any error occurs (incl. if there is no permission for any of these channels)
|
||||
//
|
||||
// If any channel has more than one "relevant" webhook, it will randomly pick one.
|
||||
func (t *Transmitter) RefreshGuildWebhooks(channelIDs []string) error {
|
||||
t.Log.Debugln("Refreshing guild webhooks")
|
||||
|
||||
botID, err := getDiscordUserID(t.session)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not get current user: %w", err)
|
||||
}
|
||||
|
||||
// Get all existing webhooks
|
||||
hooks, err := t.session.GuildWebhooks(t.guild)
|
||||
if err != nil {
|
||||
switch {
|
||||
case isDiscordPermissionError(err):
|
||||
// We fallback on manually fetching hooks from individual channels
|
||||
// if we don't have the "Manage Webhooks" permission globally.
|
||||
// We can only do this if we were provided channelIDs, though.
|
||||
if len(channelIDs) == 0 {
|
||||
return ErrPermissionDenied
|
||||
}
|
||||
t.Log.Debugln("Missing global 'Manage Webhooks' permission, falling back on per-channel permission")
|
||||
return t.fetchChannelsHooks(channelIDs, botID)
|
||||
default:
|
||||
return fmt.Errorf("could not get webhooks: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
t.Log.Debugln("Refreshing guild webhooks using global permission")
|
||||
t.assignHooksByAppID(hooks, botID, false)
|
||||
return nil
|
||||
}
|
||||
|
||||
// createWebhook creates a webhook for a specific channel.
|
||||
func (t *Transmitter) createWebhook(channel string) (*discordgo.Webhook, error) {
|
||||
t.mutex.Lock()
|
||||
defer t.mutex.Unlock()
|
||||
|
||||
wh, err := t.session.WebhookCreate(channel, t.title+time.Now().Format(" 3:04:05PM"), "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
t.channelWebhooks[channel] = wh
|
||||
return wh, nil
|
||||
}
|
||||
|
||||
func (t *Transmitter) getWebhook(channel string) *discordgo.Webhook {
|
||||
t.mutex.RLock()
|
||||
defer t.mutex.RUnlock()
|
||||
|
||||
return t.channelWebhooks[channel]
|
||||
}
|
||||
|
||||
func (t *Transmitter) getOrCreateWebhook(channelID string) (*discordgo.Webhook, error) {
|
||||
// If we have a webhook for this channel, immediately return it
|
||||
wh := t.getWebhook(channelID)
|
||||
if wh != nil {
|
||||
return wh, nil
|
||||
}
|
||||
|
||||
// Early exit if we don't want to automatically create one
|
||||
if !t.autoCreate {
|
||||
return nil, ErrWebhookNotFound
|
||||
}
|
||||
|
||||
t.Log.Infof("Creating a webhook for %s\n", channelID)
|
||||
wh, err := t.createWebhook(channelID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not create webhook: %w", err)
|
||||
}
|
||||
|
||||
return wh, nil
|
||||
}
|
||||
|
||||
// fetchChannelsHooks fetches hooks for the given channelIDs and calls assignHooksByAppID for each channel's hooks
|
||||
func (t *Transmitter) fetchChannelsHooks(channelIDs []string, botID string) error {
|
||||
// For each channel, search for relevant hooks
|
||||
var failedHooks []string
|
||||
for _, channelID := range channelIDs {
|
||||
hooks, err := t.session.ChannelWebhooks(channelID)
|
||||
if err != nil {
|
||||
failedHooks = append(failedHooks, "\n- "+channelID+": "+err.Error())
|
||||
continue
|
||||
}
|
||||
t.assignHooksByAppID(hooks, botID, true)
|
||||
}
|
||||
|
||||
// Compose an error if any hooks failed
|
||||
if len(failedHooks) > 0 {
|
||||
return errors.New("failed to fetch hooks:" + strings.Join(failedHooks, ""))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *Transmitter) assignHooksByAppID(hooks []*discordgo.Webhook, appID string, channelTargeted bool) {
|
||||
logLine := "Picking up webhook"
|
||||
if channelTargeted {
|
||||
logLine += " (channel targeted)"
|
||||
}
|
||||
|
||||
t.mutex.Lock()
|
||||
defer t.mutex.Unlock()
|
||||
|
||||
for _, wh := range hooks {
|
||||
if wh.ApplicationID != appID {
|
||||
continue
|
||||
}
|
||||
|
||||
t.channelWebhooks[wh.ChannelID] = wh
|
||||
t.Log.WithFields(log.Fields{
|
||||
"id": wh.ID,
|
||||
"name": wh.Name,
|
||||
"channel": wh.ChannelID,
|
||||
}).Println(logLine)
|
||||
}
|
||||
}
|
||||
32
bridge/discord/transmitter/utils.go
Normal file
32
bridge/discord/transmitter/utils.go
Normal file
@@ -0,0 +1,32 @@
|
||||
package transmitter
|
||||
|
||||
import (
|
||||
"github.com/matterbridge/discordgo"
|
||||
)
|
||||
|
||||
// isDiscordPermissionError returns false for nil, and true if a Discord RESTError with code discordgo.ErrorCodeMissionPermissions
|
||||
func isDiscordPermissionError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
restErr, ok := err.(*discordgo.RESTError)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
return restErr.Message != nil && restErr.Message.Code == discordgo.ErrCodeMissingPermissions
|
||||
}
|
||||
|
||||
// getDiscordUserID gets own user ID from state, and fallback on API request
|
||||
func getDiscordUserID(session *discordgo.Session) (string, error) {
|
||||
if user := session.State.User; user != nil {
|
||||
return user.ID, nil
|
||||
}
|
||||
|
||||
user, err := session.User("@me")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return user.ID, nil
|
||||
}
|
||||
147
bridge/discord/webhook.go
Normal file
147
bridge/discord/webhook.go
Normal file
@@ -0,0 +1,147 @@
|
||||
package bdiscord
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/bridge/helper"
|
||||
"github.com/matterbridge/discordgo"
|
||||
)
|
||||
|
||||
// shouldMessageUseWebhooks checks if have a channel specific webhook, if we're not using auto webhooks
|
||||
func (b *Bdiscord) shouldMessageUseWebhooks(msg *config.Message) bool {
|
||||
if b.useAutoWebhooks {
|
||||
return true
|
||||
}
|
||||
|
||||
b.channelsMutex.RLock()
|
||||
defer b.channelsMutex.RUnlock()
|
||||
if ci, ok := b.channelInfoMap[msg.Channel+b.Account]; ok {
|
||||
if ci.Options.WebhookURL != "" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// maybeGetLocalAvatar checks if UseLocalAvatar contains the message's
|
||||
// account or protocol, and if so, returns the Discord avatar (if exists)
|
||||
func (b *Bdiscord) maybeGetLocalAvatar(msg *config.Message) string {
|
||||
for _, val := range b.GetStringSlice("UseLocalAvatar") {
|
||||
if msg.Protocol != val && msg.Account != val {
|
||||
continue
|
||||
}
|
||||
|
||||
member, err := b.getGuildMemberByNick(msg.Username)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
return member.User.AvatarURL("")
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// webhookSend send one or more message via webhook, taking care of file
|
||||
// uploads (from slack, telegram or mattermost).
|
||||
// Returns messageID and error.
|
||||
func (b *Bdiscord) webhookSend(msg *config.Message, channelID string) (*discordgo.Message, error) {
|
||||
var (
|
||||
res *discordgo.Message
|
||||
err error
|
||||
)
|
||||
|
||||
// If avatar is unset, mutate the message to include the local avatar (but only if settings say we should do this)
|
||||
if msg.Avatar == "" {
|
||||
msg.Avatar = b.maybeGetLocalAvatar(msg)
|
||||
}
|
||||
|
||||
// WebhookParams can have either `Content` or `File`.
|
||||
|
||||
// We can't send empty messages.
|
||||
if msg.Text != "" {
|
||||
res, err = b.transmitter.Send(
|
||||
channelID,
|
||||
&discordgo.WebhookParams{
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not send text (%s) for message %#v: %s", msg.Text, msg, err)
|
||||
}
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
file := discordgo.File{
|
||||
Name: fi.Name,
|
||||
ContentType: "",
|
||||
Reader: bytes.NewReader(*fi.Data),
|
||||
}
|
||||
content := ""
|
||||
if msg.Text == "" {
|
||||
content = fi.Comment
|
||||
}
|
||||
_, e2 := b.transmitter.Send(
|
||||
channelID,
|
||||
&discordgo.WebhookParams{
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
File: &file,
|
||||
Content: content,
|
||||
},
|
||||
)
|
||||
if e2 != nil {
|
||||
b.Log.Errorf("Could not send file %#v for message %#v: %s", file, msg, e2)
|
||||
}
|
||||
}
|
||||
}
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (b *Bdiscord) handleEventWebhook(msg *config.Message, channelID string) (string, error) {
|
||||
// skip events
|
||||
if msg.Event != "" && msg.Event != config.EventUserAction && msg.Event != config.EventJoinLeave && msg.Event != config.EventTopicChange {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// skip empty messages
|
||||
if msg.Text == "" && (msg.Extra == nil || len(msg.Extra["file"]) == 0) {
|
||||
b.Log.Debugf("Skipping empty message %#v", msg)
|
||||
return "", nil
|
||||
}
|
||||
|
||||
msg.Text = helper.ClipMessage(msg.Text, MessageLength)
|
||||
msg.Text = b.replaceUserMentions(msg.Text)
|
||||
// discord username must be [0..32] max
|
||||
if len(msg.Username) > 32 {
|
||||
msg.Username = msg.Username[0:32]
|
||||
}
|
||||
|
||||
if msg.ID != "" {
|
||||
b.Log.Debugf("Editing webhook message")
|
||||
err := b.transmitter.Edit(channelID, msg.ID, &discordgo.WebhookParams{
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
})
|
||||
if err == nil {
|
||||
return msg.ID, nil
|
||||
}
|
||||
b.Log.Errorf("Could not edit webhook message: %s", err)
|
||||
}
|
||||
|
||||
b.Log.Debugf("Processing webhook sending for message %#v", msg)
|
||||
discordMsg, err := b.webhookSend(msg, channelID)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Could not broadcast via webhook for message %#v: %s", msg, err)
|
||||
return "", err
|
||||
}
|
||||
if discordMsg == nil {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
return discordMsg.ID, nil
|
||||
}
|
||||
@@ -183,7 +183,7 @@ func ClipMessage(text string, length int) string {
|
||||
|
||||
// ParseMarkdown takes in an input string as markdown and parses it to html
|
||||
func ParseMarkdown(input string) string {
|
||||
extensions := parser.HardLineBreak | parser.NoIntraEmphasis
|
||||
extensions := parser.HardLineBreak | parser.NoIntraEmphasis | parser.FencedCode
|
||||
markdownParser := parser.NewWithExtensions(extensions)
|
||||
renderer := html.NewRenderer(html.RendererOptions{
|
||||
Flags: 0,
|
||||
|
||||
@@ -67,6 +67,20 @@ func (b *Birc) handleFiles(msg *config.Message) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (b *Birc) handleInvite(client *girc.Client, event girc.Event) {
|
||||
if len(event.Params) != 2 {
|
||||
return
|
||||
}
|
||||
|
||||
channel := event.Params[1]
|
||||
|
||||
b.Log.Debugf("got invite for %s", channel)
|
||||
|
||||
if _, ok := b.channels[channel]; ok {
|
||||
b.i.Cmd.Join(channel)
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Birc) handleJoinPart(client *girc.Client, event girc.Event) {
|
||||
if len(event.Params) == 0 {
|
||||
b.Log.Debugf("handleJoinPart: empty Params? %#v", event)
|
||||
@@ -109,14 +123,15 @@ func (b *Birc) handleNewConnection(client *girc.Client, event girc.Event) {
|
||||
i := b.i
|
||||
b.Nick = event.Params[0]
|
||||
|
||||
i.Handlers.Add("PRIVMSG", b.handlePrivMsg)
|
||||
i.Handlers.Add("CTCP_ACTION", b.handlePrivMsg)
|
||||
i.Handlers.AddBg("PRIVMSG", b.handlePrivMsg)
|
||||
i.Handlers.AddBg("CTCP_ACTION", b.handlePrivMsg)
|
||||
i.Handlers.Add(girc.RPL_TOPICWHOTIME, b.handleTopicWhoTime)
|
||||
i.Handlers.Add(girc.NOTICE, b.handleNotice)
|
||||
i.Handlers.Add("JOIN", b.handleJoinPart)
|
||||
i.Handlers.Add("PART", b.handleJoinPart)
|
||||
i.Handlers.Add("QUIT", b.handleJoinPart)
|
||||
i.Handlers.Add("KICK", b.handleJoinPart)
|
||||
i.Handlers.AddBg(girc.NOTICE, b.handleNotice)
|
||||
i.Handlers.AddBg("JOIN", b.handleJoinPart)
|
||||
i.Handlers.AddBg("PART", b.handleJoinPart)
|
||||
i.Handlers.AddBg("QUIT", b.handleJoinPart)
|
||||
i.Handlers.AddBg("KICK", b.handleJoinPart)
|
||||
i.Handlers.Add("INVITE", b.handleInvite)
|
||||
}
|
||||
|
||||
func (b *Birc) handleNickServ() {
|
||||
@@ -170,7 +185,14 @@ func (b *Birc) handlePrivMsg(client *girc.Client, event girc.Event) {
|
||||
if b.skipPrivMsg(event) {
|
||||
return
|
||||
}
|
||||
rmsg := config.Message{Username: event.Source.Name, Channel: strings.ToLower(event.Params[0]), Account: b.Account, UserID: event.Source.Ident + "@" + event.Source.Host}
|
||||
|
||||
rmsg := config.Message{
|
||||
Username: event.Source.Name,
|
||||
Channel: strings.ToLower(event.Params[0]),
|
||||
Account: b.Account,
|
||||
UserID: event.Source.Ident + "@" + event.Source.Host,
|
||||
}
|
||||
|
||||
b.Log.Debugf("== Receiving PRIVMSG: %s %s %#v", event.Source.Name, event.Last(), event)
|
||||
|
||||
// set action event
|
||||
@@ -178,6 +200,11 @@ func (b *Birc) handlePrivMsg(client *girc.Client, event girc.Event) {
|
||||
rmsg.Event = config.EventUserAction
|
||||
}
|
||||
|
||||
// set NOTICE event
|
||||
if event.Command == "NOTICE" {
|
||||
rmsg.Event = config.EventNoticeIRC
|
||||
}
|
||||
|
||||
// strip action, we made an event if it was an action
|
||||
rmsg.Text += event.StripAction()
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ type Birc struct {
|
||||
Local chan config.Message // local queue for flood control
|
||||
FirstConnection, authDone bool
|
||||
MessageDelay, MessageQueue, MessageLength int
|
||||
channels map[string]bool
|
||||
|
||||
*bridge.Config
|
||||
}
|
||||
@@ -40,6 +41,8 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
||||
b.Nick = b.GetString("Nick")
|
||||
b.names = make(map[string][]string)
|
||||
b.connected = make(chan error)
|
||||
b.channels = make(map[string]bool)
|
||||
|
||||
if b.GetInt("MessageDelay") == 0 {
|
||||
b.MessageDelay = 1300
|
||||
} else {
|
||||
@@ -112,6 +115,7 @@ func (b *Birc) Disconnect() error {
|
||||
}
|
||||
|
||||
func (b *Birc) JoinChannel(channel config.ChannelInfo) error {
|
||||
b.channels[channel.Name] = true
|
||||
// need to check if we have nickserv auth done before joining channels
|
||||
for {
|
||||
if b.authDone {
|
||||
@@ -201,22 +205,58 @@ func (b *Birc) doConnect() {
|
||||
}
|
||||
}
|
||||
|
||||
// Sanitize nicks for RELAYMSG: replace IRC characters with special meanings with "-"
|
||||
func sanitizeNick(nick string) string {
|
||||
sanitize := func(r rune) rune {
|
||||
if strings.ContainsRune("!+%@&#$:'\"?*,. ", r) {
|
||||
return '-'
|
||||
}
|
||||
return r
|
||||
}
|
||||
return strings.Map(sanitize, nick)
|
||||
}
|
||||
|
||||
func (b *Birc) doSend() {
|
||||
rate := time.Millisecond * time.Duration(b.MessageDelay)
|
||||
throttle := time.NewTicker(rate)
|
||||
for msg := range b.Local {
|
||||
<-throttle.C
|
||||
username := msg.Username
|
||||
if b.GetBool("Colornicks") && len(username) > 1 {
|
||||
checksum := crc32.ChecksumIEEE([]byte(msg.Username))
|
||||
colorCode := checksum%14 + 2 // quick fix - prevent white or black color codes
|
||||
username = fmt.Sprintf("\x03%02d%s\x0F", colorCode, msg.Username)
|
||||
}
|
||||
if msg.Event == config.EventUserAction {
|
||||
b.i.Cmd.Action(msg.Channel, username+msg.Text)
|
||||
// Optional support for the proposed RELAYMSG extension, described at
|
||||
// https://github.com/jlu5/ircv3-specifications/blob/master/extensions/relaymsg.md
|
||||
// nolint:nestif
|
||||
if (b.i.HasCapability("overdrivenetworks.com/relaymsg") || b.i.HasCapability("draft/relaymsg")) &&
|
||||
b.GetBool("UseRelayMsg") {
|
||||
username = sanitizeNick(username)
|
||||
text := msg.Text
|
||||
|
||||
// Work around girc chomping leading commas on single word messages?
|
||||
if strings.HasPrefix(text, ":") && !strings.ContainsRune(text, ' ') {
|
||||
text = ":" + text
|
||||
}
|
||||
|
||||
if msg.Event == config.EventUserAction {
|
||||
b.i.Cmd.SendRawf("RELAYMSG %s %s :\x01ACTION %s\x01", msg.Channel, username, text) //nolint:errcheck
|
||||
} else {
|
||||
b.Log.Debugf("Sending RELAYMSG to channel %s: nick=%s", msg.Channel, username)
|
||||
b.i.Cmd.SendRawf("RELAYMSG %s %s :%s", msg.Channel, username, text) //nolint:errcheck
|
||||
}
|
||||
} else {
|
||||
b.Log.Debugf("Sending to channel %s", msg.Channel)
|
||||
b.i.Cmd.Message(msg.Channel, username+msg.Text)
|
||||
if b.GetBool("Colornicks") {
|
||||
checksum := crc32.ChecksumIEEE([]byte(msg.Username))
|
||||
colorCode := checksum%14 + 2 // quick fix - prevent white or black color codes
|
||||
username = fmt.Sprintf("\x03%02d%s\x0F", colorCode, msg.Username)
|
||||
}
|
||||
switch msg.Event {
|
||||
case config.EventUserAction:
|
||||
b.i.Cmd.Action(msg.Channel, username+msg.Text)
|
||||
case config.EventNoticeIRC:
|
||||
b.Log.Debugf("Sending notice to channel %s", msg.Channel)
|
||||
b.i.Cmd.Notice(msg.Channel, username+msg.Text)
|
||||
default:
|
||||
b.Log.Debugf("Sending to channel %s", msg.Channel)
|
||||
b.i.Cmd.Message(msg.Channel, username+msg.Text)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,6 +286,13 @@ func (b *Birc) getClient() (*girc.Client, error) {
|
||||
debug = b.Log.Writer()
|
||||
}
|
||||
|
||||
pingDelay, err := time.ParseDuration(b.GetString("pingdelay"))
|
||||
if err != nil || pingDelay == 0 {
|
||||
pingDelay = time.Minute
|
||||
}
|
||||
|
||||
b.Log.Debugf("setting pingdelay to %s", pingDelay)
|
||||
|
||||
i := girc.New(girc.Config{
|
||||
Server: server,
|
||||
ServerPass: b.GetString("Password"),
|
||||
@@ -255,10 +302,11 @@ func (b *Birc) getClient() (*girc.Client, error) {
|
||||
Name: b.GetString("Nick"),
|
||||
SSL: b.GetBool("UseTLS"),
|
||||
TLSConfig: &tls.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"), ServerName: server}, //nolint:gosec
|
||||
PingDelay: time.Minute,
|
||||
PingDelay: pingDelay,
|
||||
// skip gIRC internal rate limiting, since we have our own throttling
|
||||
AllowFlood: true,
|
||||
Debug: debug,
|
||||
AllowFlood: true,
|
||||
Debug: debug,
|
||||
SupportedCaps: map[string][]string{"overdrivenetworks.com/relaymsg": nil, "draft/relaymsg": nil},
|
||||
})
|
||||
return i, nil
|
||||
}
|
||||
@@ -284,7 +332,7 @@ func (b *Birc) skipPrivMsg(event girc.Event) bool {
|
||||
b.Nick = b.i.GetNick()
|
||||
|
||||
// freenode doesn't send 001 as first reply
|
||||
if event.Command == "NOTICE" {
|
||||
if event.Command == "NOTICE" && len(event.Params) != 2 {
|
||||
return true
|
||||
}
|
||||
// don't forward queries to the bot
|
||||
@@ -295,6 +343,15 @@ func (b *Birc) skipPrivMsg(event girc.Event) bool {
|
||||
if event.Source.Name == b.Nick {
|
||||
return true
|
||||
}
|
||||
// don't forward messages we sent via RELAYMSG
|
||||
if relayedNick, ok := event.Tags.Get("draft/relaymsg"); ok && relayedNick == b.Nick {
|
||||
return true
|
||||
}
|
||||
// This is the old name of the cap sent in spoofed messages; I've kept this in
|
||||
// for compatibility reasons
|
||||
if relayedNick, ok := event.Tags.Get("relaymsg"); ok && relayedNick == b.Nick {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
215
bridge/matrix/helpers.go
Normal file
215
bridge/matrix/helpers.go
Normal file
@@ -0,0 +1,215 @@
|
||||
package bmatrix
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"html"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
matrix "github.com/matrix-org/gomatrix"
|
||||
)
|
||||
|
||||
func newMatrixUsername(username string) *matrixUsername {
|
||||
mUsername := new(matrixUsername)
|
||||
|
||||
// check if we have a </tag>. if we have, we don't escape HTML. #696
|
||||
if htmlTag.MatchString(username) {
|
||||
mUsername.formatted = username
|
||||
// remove the HTML formatting for beautiful push messages #1188
|
||||
mUsername.plain = htmlReplacementTag.ReplaceAllString(username, "")
|
||||
} else {
|
||||
mUsername.formatted = html.EscapeString(username)
|
||||
mUsername.plain = username
|
||||
}
|
||||
|
||||
return mUsername
|
||||
}
|
||||
|
||||
// getRoomID retrieves a matching room ID from the channel name.
|
||||
func (b *Bmatrix) getRoomID(channel string) string {
|
||||
b.RLock()
|
||||
defer b.RUnlock()
|
||||
for ID, name := range b.RoomMap {
|
||||
if name == channel {
|
||||
return ID
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// interface2Struct marshals and immediately unmarshals an interface.
|
||||
// Useful for converting map[string]interface{} to a struct.
|
||||
func interface2Struct(in interface{}, out interface{}) error {
|
||||
jsonObj, err := json.Marshal(in)
|
||||
if err != nil {
|
||||
return err //nolint:wrapcheck
|
||||
}
|
||||
|
||||
return json.Unmarshal(jsonObj, out)
|
||||
}
|
||||
|
||||
// getDisplayName retrieves the displayName for mxid, querying the homserver if the mxid is not in the cache.
|
||||
func (b *Bmatrix) getDisplayName(mxid string) string {
|
||||
if b.GetBool("UseUserName") {
|
||||
return mxid[1:]
|
||||
}
|
||||
|
||||
b.RLock()
|
||||
if val, present := b.NicknameMap[mxid]; present {
|
||||
b.RUnlock()
|
||||
|
||||
return val.displayName
|
||||
}
|
||||
b.RUnlock()
|
||||
|
||||
displayName, err := b.mc.GetDisplayName(mxid)
|
||||
var httpError *matrix.HTTPError
|
||||
if errors.As(err, &httpError) {
|
||||
b.Log.Warnf("Couldn't retrieve the display name for %s", mxid)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return b.cacheDisplayName(mxid, mxid[1:])
|
||||
}
|
||||
|
||||
return b.cacheDisplayName(mxid, displayName.DisplayName)
|
||||
}
|
||||
|
||||
// cacheDisplayName stores the mapping between a mxid and a display name, to be reused later without performing a query to the homserver.
|
||||
// Note that old entries are cleaned when this function is called.
|
||||
func (b *Bmatrix) cacheDisplayName(mxid string, displayName string) string {
|
||||
now := time.Now()
|
||||
|
||||
// scan to delete old entries, to stop memory usage from becoming too high with old entries.
|
||||
// In addition, we also detect if another user have the same username, and if so, we append their mxids to their usernames to differentiate them.
|
||||
toDelete := []string{}
|
||||
conflict := false
|
||||
|
||||
b.Lock()
|
||||
for mxid, v := range b.NicknameMap {
|
||||
// to prevent username reuse across matrix servers - or even on the same server, append
|
||||
// the mxid to the username when there is a conflict
|
||||
if v.displayName == displayName {
|
||||
conflict = true
|
||||
// TODO: it would be nice to be able to rename previous messages from this user.
|
||||
// The current behavior is that only users with clashing usernames and *that have spoken since the bridge last started* will get their mxids shown, and I don't know if that's the expected behavior.
|
||||
v.displayName = fmt.Sprintf("%s (%s)", displayName, mxid)
|
||||
b.NicknameMap[mxid] = v
|
||||
}
|
||||
|
||||
if now.Sub(v.lastUpdated) > 10*time.Minute {
|
||||
toDelete = append(toDelete, mxid)
|
||||
}
|
||||
}
|
||||
|
||||
if conflict {
|
||||
displayName = fmt.Sprintf("%s (%s)", displayName, mxid)
|
||||
}
|
||||
|
||||
for _, v := range toDelete {
|
||||
delete(b.NicknameMap, v)
|
||||
}
|
||||
|
||||
b.NicknameMap[mxid] = NicknameCacheEntry{
|
||||
displayName: displayName,
|
||||
lastUpdated: now,
|
||||
}
|
||||
b.Unlock()
|
||||
|
||||
return displayName
|
||||
}
|
||||
|
||||
// handleError converts errors into httpError.
|
||||
//nolint:exhaustivestruct
|
||||
func handleError(err error) *httpError {
|
||||
var mErr matrix.HTTPError
|
||||
if !errors.As(err, &mErr) {
|
||||
return &httpError{
|
||||
Err: "not a HTTPError",
|
||||
}
|
||||
}
|
||||
|
||||
var httpErr httpError
|
||||
|
||||
if err := json.Unmarshal(mErr.Contents, &httpErr); err != nil {
|
||||
return &httpError{
|
||||
Err: "unmarshal failed",
|
||||
}
|
||||
}
|
||||
|
||||
return &httpErr
|
||||
}
|
||||
|
||||
func (b *Bmatrix) containsAttachment(content map[string]interface{}) bool {
|
||||
// Skip empty messages
|
||||
if content["msgtype"] == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// Only allow image,video or file msgtypes
|
||||
if !(content["msgtype"].(string) == "m.image" ||
|
||||
content["msgtype"].(string) == "m.video" ||
|
||||
content["msgtype"].(string) == "m.file") {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// getAvatarURL returns the avatar URL of the specified sender.
|
||||
func (b *Bmatrix) getAvatarURL(sender string) string {
|
||||
urlPath := b.mc.BuildURL("profile", sender, "avatar_url")
|
||||
|
||||
s := struct {
|
||||
AvatarURL string `json:"avatar_url"`
|
||||
}{}
|
||||
|
||||
err := b.mc.MakeRequest("GET", urlPath, nil, &s)
|
||||
if err != nil {
|
||||
b.Log.Errorf("getAvatarURL failed: %s", err)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
url := strings.ReplaceAll(s.AvatarURL, "mxc://", b.GetString("Server")+"/_matrix/media/r0/thumbnail/")
|
||||
if url != "" {
|
||||
url += "?width=37&height=37&method=crop"
|
||||
}
|
||||
|
||||
return url
|
||||
}
|
||||
|
||||
// handleRatelimit handles the ratelimit errors and return if we're ratelimited and the amount of time to sleep
|
||||
func (b *Bmatrix) handleRatelimit(err error) (time.Duration, bool) {
|
||||
httpErr := handleError(err)
|
||||
if httpErr.Errcode != "M_LIMIT_EXCEEDED" {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
b.Log.Debugf("ratelimited: %s", httpErr.Err)
|
||||
b.Log.Infof("getting ratelimited by matrix, sleeping approx %d seconds before retrying", httpErr.RetryAfterMs/1000)
|
||||
|
||||
return time.Duration(httpErr.RetryAfterMs) * time.Millisecond, true
|
||||
}
|
||||
|
||||
// retry function will check if we're ratelimited and retries again when backoff time expired
|
||||
// returns original error if not 429 ratelimit
|
||||
func (b *Bmatrix) retry(f func() error) error {
|
||||
b.rateMutex.Lock()
|
||||
defer b.rateMutex.Unlock()
|
||||
|
||||
for {
|
||||
if err := f(); err != nil {
|
||||
if backoff, ok := b.handleRatelimit(err); ok {
|
||||
time.Sleep(backoff)
|
||||
} else {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,7 @@ package bmatrix
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"html"
|
||||
"mime"
|
||||
"regexp"
|
||||
"strings"
|
||||
@@ -22,10 +20,17 @@ var (
|
||||
htmlReplacementTag = regexp.MustCompile("<[^>]*>")
|
||||
)
|
||||
|
||||
type NicknameCacheEntry struct {
|
||||
displayName string
|
||||
lastUpdated time.Time
|
||||
}
|
||||
|
||||
type Bmatrix struct {
|
||||
mc *matrix.Client
|
||||
UserID string
|
||||
RoomMap map[string]string
|
||||
mc *matrix.Client
|
||||
UserID string
|
||||
NicknameMap map[string]NicknameCacheEntry
|
||||
RoomMap map[string]string
|
||||
rateMutex sync.RWMutex
|
||||
sync.RWMutex
|
||||
*bridge.Config
|
||||
}
|
||||
@@ -41,25 +46,29 @@ type matrixUsername struct {
|
||||
formatted string
|
||||
}
|
||||
|
||||
func newMatrixUsername(username string) *matrixUsername {
|
||||
mUsername := new(matrixUsername)
|
||||
// SubTextMessage represents the new content of the message in edit messages.
|
||||
type SubTextMessage struct {
|
||||
MsgType string `json:"msgtype"`
|
||||
Body string `json:"body"`
|
||||
}
|
||||
|
||||
// check if we have a </tag>. if we have, we don't escape HTML. #696
|
||||
if htmlTag.MatchString(username) {
|
||||
mUsername.formatted = username
|
||||
// remove the HTML formatting for beautiful push messages #1188
|
||||
mUsername.plain = htmlReplacementTag.ReplaceAllString(username, "")
|
||||
} else {
|
||||
mUsername.formatted = html.EscapeString(username)
|
||||
mUsername.plain = username
|
||||
}
|
||||
// MessageRelation explains how the current message relates to a previous message.
|
||||
// Notably used for message edits.
|
||||
type MessageRelation struct {
|
||||
EventID string `json:"event_id"`
|
||||
Type string `json:"rel_type"`
|
||||
}
|
||||
|
||||
return mUsername
|
||||
type EditedMessage struct {
|
||||
NewContent SubTextMessage `json:"m.new_content"`
|
||||
RelatedTo MessageRelation `json:"m.relates_to"`
|
||||
matrix.TextMessage
|
||||
}
|
||||
|
||||
func New(cfg *bridge.Config) bridge.Bridger {
|
||||
b := &Bmatrix{Config: cfg}
|
||||
b.RoomMap = make(map[string]string)
|
||||
b.NicknameMap = make(map[string]NicknameCacheEntry)
|
||||
return b
|
||||
}
|
||||
|
||||
@@ -91,25 +100,18 @@ func (b *Bmatrix) Disconnect() error {
|
||||
}
|
||||
|
||||
func (b *Bmatrix) JoinChannel(channel config.ChannelInfo) error {
|
||||
retry:
|
||||
resp, err := b.mc.JoinRoom(channel.Name, "", nil)
|
||||
if err != nil {
|
||||
httpErr := handleError(err)
|
||||
if httpErr.Errcode == "M_LIMIT_EXCEEDED" {
|
||||
b.Log.Infof("getting ratelimited by matrix, sleeping approx %d seconds before joining %s", httpErr.RetryAfterMs/1000, channel.Name)
|
||||
time.Sleep((time.Duration(httpErr.RetryAfterMs) * time.Millisecond))
|
||||
|
||||
goto retry
|
||||
return b.retry(func() error {
|
||||
resp, err := b.mc.JoinRoom(channel.Name, "", nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
b.Lock()
|
||||
b.RoomMap[resp.RoomID] = channel.Name
|
||||
b.Unlock()
|
||||
|
||||
b.Lock()
|
||||
b.RoomMap[resp.RoomID] = channel.Name
|
||||
b.Unlock()
|
||||
|
||||
return nil
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (b *Bmatrix) Send(msg config.Message) (string, error) {
|
||||
@@ -127,11 +129,21 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) {
|
||||
Body: username.plain + msg.Text,
|
||||
FormattedBody: username.formatted + msg.Text,
|
||||
}
|
||||
resp, err := b.mc.SendMessageEvent(channel, "m.room.message", m)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.EventID, err
|
||||
|
||||
msgID := ""
|
||||
|
||||
err := b.retry(func() error {
|
||||
resp, err := b.mc.SendMessageEvent(channel, "m.room.message", m)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
msgID = resp.EventID
|
||||
|
||||
return err
|
||||
})
|
||||
|
||||
return msgID, err
|
||||
}
|
||||
|
||||
// Delete message
|
||||
@@ -139,17 +151,34 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
resp, err := b.mc.RedactEvent(channel, msg.ID, &matrix.ReqRedact{})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.EventID, err
|
||||
|
||||
msgID := ""
|
||||
|
||||
err := b.retry(func() error {
|
||||
resp, err := b.mc.RedactEvent(channel, msg.ID, &matrix.ReqRedact{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
msgID = resp.EventID
|
||||
|
||||
return err
|
||||
})
|
||||
|
||||
return msgID, err
|
||||
}
|
||||
|
||||
// Upload a file if it exists
|
||||
if msg.Extra != nil {
|
||||
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
||||
if _, err := b.mc.SendText(channel, rmsg.Username+rmsg.Text); err != nil {
|
||||
rmsg := rmsg
|
||||
|
||||
err := b.retry(func() error {
|
||||
_, err := b.mc.SendText(channel, rmsg.Username+rmsg.Text)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("sendText failed: %s", err)
|
||||
}
|
||||
}
|
||||
@@ -160,7 +189,37 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
|
||||
// Edit message if we have an ID
|
||||
// matrix has no editing support
|
||||
if msg.ID != "" {
|
||||
rmsg := EditedMessage{TextMessage: matrix.TextMessage{
|
||||
Body: username.plain + msg.Text,
|
||||
MsgType: "m.text",
|
||||
}}
|
||||
if b.GetBool("HTMLDisable") {
|
||||
rmsg.TextMessage.FormattedBody = username.formatted + "* " + msg.Text
|
||||
} else {
|
||||
rmsg.Format = "org.matrix.custom.html"
|
||||
rmsg.TextMessage.FormattedBody = username.formatted + "* " + helper.ParseMarkdown(msg.Text)
|
||||
}
|
||||
rmsg.NewContent = SubTextMessage{
|
||||
Body: rmsg.TextMessage.Body,
|
||||
MsgType: "m.text",
|
||||
}
|
||||
rmsg.RelatedTo = MessageRelation{
|
||||
EventID: msg.ID,
|
||||
Type: "m.replace",
|
||||
}
|
||||
|
||||
err := b.retry(func() error {
|
||||
_, err := b.mc.SendMessageEvent(channel, "m.room.message", rmsg)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return msg.ID, nil
|
||||
}
|
||||
|
||||
// Use notices to send join/leave events
|
||||
if msg.Event == config.EventJoinLeave {
|
||||
@@ -169,44 +228,66 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) {
|
||||
Body: username.plain + msg.Text,
|
||||
FormattedBody: username.formatted + msg.Text,
|
||||
}
|
||||
resp, err := b.mc.SendMessageEvent(channel, "m.room.message", m)
|
||||
|
||||
var (
|
||||
resp *matrix.RespSendEvent
|
||||
err error
|
||||
)
|
||||
|
||||
err = b.retry(func() error {
|
||||
resp, err = b.mc.SendMessageEvent(channel, "m.room.message", m)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.EventID, err
|
||||
}
|
||||
|
||||
if b.GetBool("HTMLDisable") {
|
||||
resp, err := b.mc.SendText(channel, username.plain+msg.Text)
|
||||
var (
|
||||
resp *matrix.RespSendEvent
|
||||
err error
|
||||
)
|
||||
|
||||
err = b.retry(func() error {
|
||||
resp, err = b.mc.SendText(channel, username.plain+msg.Text)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.EventID, err
|
||||
}
|
||||
|
||||
// Post normal message with HTML support (eg riot.im)
|
||||
resp, err := b.mc.SendFormattedText(channel, username.plain+msg.Text, username.formatted+helper.ParseMarkdown(msg.Text))
|
||||
var (
|
||||
resp *matrix.RespSendEvent
|
||||
err error
|
||||
)
|
||||
|
||||
err = b.retry(func() error {
|
||||
resp, err = b.mc.SendFormattedText(channel, username.plain+msg.Text,
|
||||
username.formatted+helper.ParseMarkdown(msg.Text))
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.EventID, err
|
||||
}
|
||||
|
||||
func (b *Bmatrix) getRoomID(channel string) string {
|
||||
b.RLock()
|
||||
defer b.RUnlock()
|
||||
for ID, name := range b.RoomMap {
|
||||
if name == channel {
|
||||
return ID
|
||||
}
|
||||
}
|
||||
return ""
|
||||
return resp.EventID, err
|
||||
}
|
||||
|
||||
func (b *Bmatrix) handlematrix() {
|
||||
syncer := b.mc.Syncer.(*matrix.DefaultSyncer)
|
||||
syncer.OnEventType("m.room.redaction", b.handleEvent)
|
||||
syncer.OnEventType("m.room.message", b.handleEvent)
|
||||
syncer.OnEventType("m.room.member", b.handleMemberChange)
|
||||
go func() {
|
||||
for {
|
||||
if err := b.mc.Sync(); err != nil {
|
||||
@@ -216,6 +297,45 @@ func (b *Bmatrix) handlematrix() {
|
||||
}()
|
||||
}
|
||||
|
||||
func (b *Bmatrix) handleEdit(ev *matrix.Event, rmsg config.Message) bool {
|
||||
relationInterface, present := ev.Content["m.relates_to"]
|
||||
newContentInterface, present2 := ev.Content["m.new_content"]
|
||||
if !(present && present2) {
|
||||
return false
|
||||
}
|
||||
|
||||
var relation MessageRelation
|
||||
if err := interface2Struct(relationInterface, &relation); err != nil {
|
||||
b.Log.Warnf("Couldn't parse 'm.relates_to' object with value %#v", relationInterface)
|
||||
return false
|
||||
}
|
||||
|
||||
var newContent SubTextMessage
|
||||
if err := interface2Struct(newContentInterface, &newContent); err != nil {
|
||||
b.Log.Warnf("Couldn't parse 'm.new_content' object with value %#v", newContentInterface)
|
||||
return false
|
||||
}
|
||||
|
||||
if relation.Type != "m.replace" {
|
||||
return false
|
||||
}
|
||||
|
||||
rmsg.ID = relation.EventID
|
||||
rmsg.Text = newContent.Body
|
||||
b.Remote <- rmsg
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (b *Bmatrix) handleMemberChange(ev *matrix.Event) {
|
||||
// Update the displayname on join messages, according to https://matrix.org/docs/spec/client_server/r0.6.1#events-on-change-of-profile-information
|
||||
if ev.Content["membership"] == "join" {
|
||||
if dn, ok := ev.Content["displayname"].(string); ok {
|
||||
b.cacheDisplayName(ev.Sender, dn)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bmatrix) handleEvent(ev *matrix.Event) {
|
||||
b.Log.Debugf("== Receiving event: %#v", ev)
|
||||
if ev.Sender != b.UserID {
|
||||
@@ -229,7 +349,7 @@ func (b *Bmatrix) handleEvent(ev *matrix.Event) {
|
||||
|
||||
// Create our message
|
||||
rmsg := config.Message{
|
||||
Username: ev.Sender[1:],
|
||||
Username: b.getDisplayName(ev.Sender),
|
||||
Channel: channel,
|
||||
Account: b.Account,
|
||||
UserID: ev.Sender,
|
||||
@@ -264,6 +384,11 @@ func (b *Bmatrix) handleEvent(ev *matrix.Event) {
|
||||
rmsg.Event = config.EventUserAction
|
||||
}
|
||||
|
||||
// Is it an edit?
|
||||
if b.handleEdit(ev, rmsg) {
|
||||
return
|
||||
}
|
||||
|
||||
// Do we have attachments
|
||||
if b.containsAttachment(ev.Content) {
|
||||
err := b.handleDownloadFile(&rmsg, ev.Content)
|
||||
@@ -274,6 +399,11 @@ func (b *Bmatrix) handleEvent(ev *matrix.Event) {
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", ev.Sender, b.Account)
|
||||
b.Remote <- rmsg
|
||||
|
||||
// not crucial, so no ratelimit check here
|
||||
if err := b.mc.MarkRead(ev.RoomID, ev.ID); err != nil {
|
||||
b.Log.Errorf("couldn't mark message as read %s", err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -353,13 +483,25 @@ func (b *Bmatrix) handleUploadFile(msg *config.Message, channel string, fi *conf
|
||||
sp := strings.Split(fi.Name, ".")
|
||||
mtype := mime.TypeByExtension("." + sp[len(sp)-1])
|
||||
// image and video uploads send no username, we have to do this ourself here #715
|
||||
_, err := b.mc.SendFormattedText(channel, username.plain+fi.Comment, username.formatted+fi.Comment)
|
||||
err := b.retry(func() error {
|
||||
_, err := b.mc.SendFormattedText(channel, username.plain+fi.Comment, username.formatted+fi.Comment)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("file comment failed: %#v", err)
|
||||
}
|
||||
|
||||
b.Log.Debugf("uploading file: %s %s", fi.Name, mtype)
|
||||
res, err := b.mc.UploadToContentRepo(content, mtype, int64(len(*fi.Data)))
|
||||
|
||||
var res *matrix.RespMediaUpload
|
||||
|
||||
err = b.retry(func() error {
|
||||
res, err = b.mc.UploadToContentRepo(content, mtype, int64(len(*fi.Data)))
|
||||
|
||||
return err
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
b.Log.Errorf("file upload failed: %#v", err)
|
||||
return
|
||||
@@ -368,40 +510,56 @@ func (b *Bmatrix) handleUploadFile(msg *config.Message, channel string, fi *conf
|
||||
switch {
|
||||
case strings.Contains(mtype, "video"):
|
||||
b.Log.Debugf("sendVideo %s", res.ContentURI)
|
||||
_, err = b.mc.SendVideo(channel, fi.Name, res.ContentURI)
|
||||
err = b.retry(func() error {
|
||||
_, err = b.mc.SendVideo(channel, fi.Name, res.ContentURI)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("sendVideo failed: %#v", err)
|
||||
}
|
||||
case strings.Contains(mtype, "image"):
|
||||
b.Log.Debugf("sendImage %s", res.ContentURI)
|
||||
_, err = b.mc.SendImage(channel, fi.Name, res.ContentURI)
|
||||
err = b.retry(func() error {
|
||||
_, err = b.mc.SendImage(channel, fi.Name, res.ContentURI)
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("sendImage failed: %#v", err)
|
||||
}
|
||||
case strings.Contains(mtype, "audio"):
|
||||
b.Log.Debugf("sendAudio %s", res.ContentURI)
|
||||
_, err = b.mc.SendMessageEvent(channel, "m.room.message", matrix.AudioMessage{
|
||||
MsgType: "m.audio",
|
||||
Body: fi.Name,
|
||||
URL: res.ContentURI,
|
||||
Info: matrix.AudioInfo{
|
||||
Mimetype: mtype,
|
||||
Size: uint(len(*fi.Data)),
|
||||
},
|
||||
err = b.retry(func() error {
|
||||
_, err = b.mc.SendMessageEvent(channel, "m.room.message", matrix.AudioMessage{
|
||||
MsgType: "m.audio",
|
||||
Body: fi.Name,
|
||||
URL: res.ContentURI,
|
||||
Info: matrix.AudioInfo{
|
||||
Mimetype: mtype,
|
||||
Size: uint(len(*fi.Data)),
|
||||
},
|
||||
})
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("sendAudio failed: %#v", err)
|
||||
}
|
||||
default:
|
||||
b.Log.Debugf("sendFile %s", res.ContentURI)
|
||||
_, err = b.mc.SendMessageEvent(channel, "m.room.message", matrix.FileMessage{
|
||||
MsgType: "m.file",
|
||||
Body: fi.Name,
|
||||
URL: res.ContentURI,
|
||||
Info: matrix.FileInfo{
|
||||
Mimetype: mtype,
|
||||
Size: uint(len(*fi.Data)),
|
||||
},
|
||||
err = b.retry(func() error {
|
||||
_, err = b.mc.SendMessageEvent(channel, "m.room.message", matrix.FileMessage{
|
||||
MsgType: "m.file",
|
||||
Body: fi.Name,
|
||||
URL: res.ContentURI,
|
||||
Info: matrix.FileInfo{
|
||||
Mimetype: mtype,
|
||||
Size: uint(len(*fi.Data)),
|
||||
},
|
||||
})
|
||||
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("sendFile failed: %#v", err)
|
||||
@@ -409,58 +567,3 @@ func (b *Bmatrix) handleUploadFile(msg *config.Message, channel string, fi *conf
|
||||
}
|
||||
b.Log.Debugf("result: %#v", res)
|
||||
}
|
||||
|
||||
// skipMessages returns true if this message should not be handled
|
||||
func (b *Bmatrix) containsAttachment(content map[string]interface{}) bool {
|
||||
// Skip empty messages
|
||||
if content["msgtype"] == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// Only allow image,video or file msgtypes
|
||||
if !(content["msgtype"].(string) == "m.image" ||
|
||||
content["msgtype"].(string) == "m.video" ||
|
||||
content["msgtype"].(string) == "m.file") {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// getAvatarURL returns the avatar URL of the specified sender
|
||||
func (b *Bmatrix) getAvatarURL(sender string) string {
|
||||
urlPath := b.mc.BuildURL("profile", sender, "avatar_url")
|
||||
|
||||
s := struct {
|
||||
AvatarURL string `json:"avatar_url"`
|
||||
}{}
|
||||
|
||||
err := b.mc.MakeRequest("GET", urlPath, nil, &s)
|
||||
if err != nil {
|
||||
b.Log.Errorf("getAvatarURL failed: %s", err)
|
||||
return ""
|
||||
}
|
||||
url := strings.ReplaceAll(s.AvatarURL, "mxc://", b.GetString("Server")+"/_matrix/media/r0/thumbnail/")
|
||||
if url != "" {
|
||||
url += "?width=37&height=37&method=crop"
|
||||
}
|
||||
return url
|
||||
}
|
||||
|
||||
func handleError(err error) *httpError {
|
||||
mErr, ok := err.(matrix.HTTPError)
|
||||
if !ok {
|
||||
return &httpError{
|
||||
Err: "not a HTTPError",
|
||||
}
|
||||
}
|
||||
|
||||
var httpErr httpError
|
||||
|
||||
if err := json.Unmarshal(mErr.Contents, &httpErr); err != nil {
|
||||
return &httpError{
|
||||
Err: "unmarshal failed",
|
||||
}
|
||||
}
|
||||
|
||||
return &httpErr
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ func (b *Bmattermost) handleMatterClient(messages chan *config.Message) {
|
||||
Channel: message.Channel,
|
||||
Text: message.Text,
|
||||
ID: message.Post.Id,
|
||||
ParentID: message.Post.ParentId,
|
||||
ParentID: message.Post.RootId, // ParentID is obsolete with mattermost
|
||||
Extra: make(map[string][]interface{}),
|
||||
}
|
||||
|
||||
|
||||
@@ -122,11 +122,20 @@ func (b *Bmattermost) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
|
||||
// Handle prefix hint for unthreaded messages.
|
||||
if msg.ParentID == "msg-parent-not-found" {
|
||||
if msg.ParentNotFound() {
|
||||
msg.ParentID = ""
|
||||
msg.Text = fmt.Sprintf("[thread]: %s", msg.Text)
|
||||
}
|
||||
|
||||
// we only can reply to the root of the thread, not to a specific ID (like discord for example does)
|
||||
if msg.ParentID != "" {
|
||||
post, res := b.mc.Client.GetPost(msg.ParentID, "")
|
||||
if res.Error != nil {
|
||||
b.Log.Errorf("getting post %s failed: %s", msg.ParentID, res.Error.DetailedError)
|
||||
}
|
||||
msg.ParentID = post.RootId
|
||||
}
|
||||
|
||||
// Upload a file if it exists
|
||||
if msg.Extra != nil {
|
||||
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
||||
|
||||
@@ -86,13 +86,16 @@ func (b *Bmsteams) JoinChannel(channel config.ChannelInfo) error {
|
||||
|
||||
func (b *Bmsteams) Send(msg config.Message) (string, error) {
|
||||
b.Log.Debugf("=> Receiving %#v", msg)
|
||||
if msg.ParentID != "" && msg.ParentID != "msg-parent-not-found" {
|
||||
if msg.ParentValid() {
|
||||
return b.sendReply(msg)
|
||||
}
|
||||
if msg.ParentID == "msg-parent-not-found" {
|
||||
|
||||
// Handle prefix hint for unthreaded messages.
|
||||
if msg.ParentNotFound() {
|
||||
msg.ParentID = ""
|
||||
msg.Text = fmt.Sprintf("[thread]: %s", msg.Text)
|
||||
}
|
||||
|
||||
ct := b.gc.Teams().ID(b.GetString("TeamID")).Channels().ID(msg.Channel).Messages().Request()
|
||||
text := msg.Username + msg.Text
|
||||
content := &msgraph.ItemBody{Content: &text}
|
||||
|
||||
@@ -19,6 +19,12 @@ func (b *Bmumble) handleTextMessage(event *gumble.TextMessageEvent) {
|
||||
if event.TextMessage.Sender != nil {
|
||||
sender = event.TextMessage.Sender.Name
|
||||
}
|
||||
// If the text message is received before receiving a ServerSync
|
||||
// and UserState, Client.Self or Self.Channel are nil
|
||||
if event.Client.Self == nil || event.Client.Self.Channel == nil {
|
||||
b.Log.Warn("Connection bootstrap not finished, discarding text message")
|
||||
return
|
||||
}
|
||||
// Convert Mumble HTML messages to markdown
|
||||
parts, err := b.convertHTMLtoMarkdown(event.TextMessage.Message)
|
||||
if err != nil {
|
||||
|
||||
@@ -83,6 +83,13 @@ func (b *Btalk) JoinChannel(channel config.ChannelInfo) error {
|
||||
go func() {
|
||||
for msg := range c {
|
||||
msg := msg
|
||||
|
||||
if msg.Error != nil {
|
||||
b.Log.Errorf("Fatal message poll error: %s\n", msg.Error)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// ignore messages that are one of the following
|
||||
// * not a message from a user
|
||||
// * from ourselves
|
||||
|
||||
@@ -299,7 +299,7 @@ func (b *Bslack) sendRTM(msg config.Message) (string, error) {
|
||||
}
|
||||
|
||||
// Handle prefix hint for unthreaded messages.
|
||||
if msg.ParentID == "msg-parent-not-found" {
|
||||
if msg.ParentNotFound() {
|
||||
msg.ParentID = ""
|
||||
msg.Text = fmt.Sprintf("[thread]: %s", msg.Text)
|
||||
}
|
||||
|
||||
@@ -311,6 +311,11 @@ func (b *Btelegram) handleDownload(rmsg *config.Message, message *tgbotapi.Messa
|
||||
b.maybeConvertWebp(&name, data)
|
||||
}
|
||||
|
||||
// rename .oga to .ogg https://github.com/42wim/matterbridge/issues/906#issuecomment-741793512
|
||||
if strings.HasSuffix(name, ".oga") && message.Audio != nil {
|
||||
name = strings.Replace(name, ".oga", ".ogg", 1)
|
||||
}
|
||||
|
||||
helper.HandleDownloadData(b.Log, rmsg, name, message.Caption, "", data, b.General)
|
||||
return nil
|
||||
}
|
||||
@@ -384,7 +389,7 @@ func (b *Btelegram) handleUploadFile(msg *config.Message, chatid int64) string {
|
||||
Name: fi.Name,
|
||||
Bytes: *fi.Data,
|
||||
}
|
||||
re := regexp.MustCompile(".(jpg|png)$")
|
||||
re := regexp.MustCompile(".(jpg|jpe|png)$")
|
||||
if re.MatchString(fi.Name) {
|
||||
c = tgbotapi.NewPhotoUpload(chatid, file)
|
||||
} else {
|
||||
|
||||
327
bridge/vk/vk.go
Normal file
327
bridge/vk/vk.go
Normal file
@@ -0,0 +1,327 @@
|
||||
package bvk
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/42wim/matterbridge/bridge"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/bridge/helper"
|
||||
|
||||
"github.com/SevereCloud/vksdk/v2/api"
|
||||
"github.com/SevereCloud/vksdk/v2/events"
|
||||
longpoll "github.com/SevereCloud/vksdk/v2/longpoll-bot"
|
||||
"github.com/SevereCloud/vksdk/v2/object"
|
||||
)
|
||||
|
||||
const (
|
||||
audioMessage = "audio_message"
|
||||
document = "doc"
|
||||
photo = "photo"
|
||||
video = "video"
|
||||
graffiti = "graffiti"
|
||||
sticker = "sticker"
|
||||
wall = "wall"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
lastname, firstname, avatar string
|
||||
}
|
||||
|
||||
type Bvk struct {
|
||||
c *api.VK
|
||||
usernamesMap map[int]user // cache of user names and avatar URLs
|
||||
*bridge.Config
|
||||
}
|
||||
|
||||
func New(cfg *bridge.Config) bridge.Bridger {
|
||||
return &Bvk{usernamesMap: make(map[int]user), Config: cfg}
|
||||
}
|
||||
|
||||
func (b *Bvk) Connect() error {
|
||||
b.Log.Info("Connecting")
|
||||
b.c = api.NewVK(b.GetString("Token"))
|
||||
lp, err := longpoll.NewLongPoll(b.c, b.GetInt("GroupID"))
|
||||
if err != nil {
|
||||
b.Log.Debugf("%#v", err)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
lp.MessageNew(func(ctx context.Context, obj events.MessageNewObject) {
|
||||
b.handleMessage(obj.Message, false)
|
||||
})
|
||||
|
||||
b.Log.Info("Connection succeeded")
|
||||
|
||||
go func() {
|
||||
err := lp.Run()
|
||||
if err != nil {
|
||||
b.Log.Fatal("Enable longpoll in group management")
|
||||
}
|
||||
}()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bvk) Disconnect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bvk) JoinChannel(channel config.ChannelInfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bvk) Send(msg config.Message) (string, error) {
|
||||
b.Log.Debugf("=> Receiving %#v", msg)
|
||||
|
||||
peerID, err := strconv.Atoi(msg.Channel)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
params := api.Params{}
|
||||
|
||||
text := msg.Username + msg.Text
|
||||
|
||||
if msg.Extra != nil {
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
// generate attachments string
|
||||
attachment, urls := b.uploadFiles(msg.Extra, peerID)
|
||||
params["attachment"] = attachment
|
||||
text += urls
|
||||
}
|
||||
}
|
||||
|
||||
params["message"] = text
|
||||
|
||||
if msg.ID == "" {
|
||||
// New message
|
||||
params["random_id"] = time.Now().Unix()
|
||||
params["peer_ids"] = msg.Channel
|
||||
|
||||
res, e := b.c.MessagesSendPeerIDs(params)
|
||||
if e != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return strconv.Itoa(res[0].ConversationMessageID), nil
|
||||
}
|
||||
// Edit message
|
||||
messageID, err := strconv.ParseInt(msg.ID, 10, 64)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
params["peer_id"] = peerID
|
||||
params["conversation_message_id"] = messageID
|
||||
|
||||
_, err = b.c.MessagesEdit(params)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return msg.ID, nil
|
||||
}
|
||||
|
||||
func (b *Bvk) getUser(id int) user {
|
||||
u, found := b.usernamesMap[id]
|
||||
if !found {
|
||||
b.Log.Debug("Fetching username for ", id)
|
||||
|
||||
if id >= 0 {
|
||||
result, _ := b.c.UsersGet(api.Params{
|
||||
"user_ids": id,
|
||||
"fields": "photo_200",
|
||||
})
|
||||
|
||||
resUser := result[0]
|
||||
u = user{lastname: resUser.LastName, firstname: resUser.FirstName, avatar: resUser.Photo200}
|
||||
b.usernamesMap[id] = u
|
||||
} else {
|
||||
result, _ := b.c.GroupsGetByID(api.Params{
|
||||
"group_id": id * -1,
|
||||
})
|
||||
|
||||
resGroup := result[0]
|
||||
u = user{lastname: resGroup.Name, avatar: resGroup.Photo200}
|
||||
}
|
||||
}
|
||||
|
||||
return u
|
||||
}
|
||||
|
||||
func (b *Bvk) handleMessage(msg object.MessagesMessage, isFwd bool) {
|
||||
b.Log.Debug("ChatID: ", msg.PeerID)
|
||||
// fetch user info
|
||||
u := b.getUser(msg.FromID)
|
||||
|
||||
rmsg := config.Message{
|
||||
Text: msg.Text,
|
||||
Username: u.firstname + " " + u.lastname,
|
||||
Avatar: u.avatar,
|
||||
Channel: strconv.Itoa(msg.PeerID),
|
||||
Account: b.Account,
|
||||
UserID: strconv.Itoa(msg.FromID),
|
||||
ID: strconv.Itoa(msg.ConversationMessageID),
|
||||
Extra: make(map[string][]interface{}),
|
||||
}
|
||||
|
||||
if msg.ReplyMessage != nil {
|
||||
ur := b.getUser(msg.ReplyMessage.FromID)
|
||||
rmsg.Text = "Re: " + ur.firstname + " " + ur.lastname + "\n" + rmsg.Text
|
||||
}
|
||||
|
||||
if isFwd {
|
||||
rmsg.Username = "Fwd: " + rmsg.Username
|
||||
}
|
||||
|
||||
if len(msg.Attachments) > 0 {
|
||||
urls, text := b.getFiles(msg.Attachments)
|
||||
|
||||
if text != "" {
|
||||
rmsg.Text += "\n" + text
|
||||
}
|
||||
|
||||
// download
|
||||
b.downloadFiles(&rmsg, urls)
|
||||
}
|
||||
|
||||
if len(msg.FwdMessages) > 0 {
|
||||
rmsg.Text += strconv.Itoa(len(msg.FwdMessages)) + " forwarded messages"
|
||||
}
|
||||
|
||||
b.Remote <- rmsg
|
||||
|
||||
if len(msg.FwdMessages) > 0 {
|
||||
// recursive processing of forwarded messages
|
||||
for _, m := range msg.FwdMessages {
|
||||
m.PeerID = msg.PeerID
|
||||
b.handleMessage(m, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bvk) uploadFiles(extra map[string][]interface{}, peerID int) (string, string) {
|
||||
var attachments []string
|
||||
text := ""
|
||||
|
||||
for _, f := range extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
|
||||
if fi.Comment != "" {
|
||||
text += fi.Comment + "\n"
|
||||
}
|
||||
a, err := b.uploadFile(fi, peerID)
|
||||
if err != nil {
|
||||
b.Log.Error("File upload error ", fi.Name)
|
||||
}
|
||||
|
||||
attachments = append(attachments, a)
|
||||
}
|
||||
|
||||
return strings.Join(attachments, ","), text
|
||||
}
|
||||
|
||||
func (b *Bvk) uploadFile(file config.FileInfo, peerID int) (string, error) {
|
||||
r := bytes.NewReader(*file.Data)
|
||||
|
||||
photoRE := regexp.MustCompile(".(jpg|jpe|png)$")
|
||||
if photoRE.MatchString(file.Name) {
|
||||
p, err := b.c.UploadMessagesPhoto(peerID, r)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return photo + strconv.Itoa(p[0].OwnerID) + "_" + strconv.Itoa(p[0].ID), nil
|
||||
}
|
||||
|
||||
var doctype string
|
||||
if strings.Contains(file.Name, ".ogg") {
|
||||
doctype = audioMessage
|
||||
} else {
|
||||
doctype = document
|
||||
}
|
||||
|
||||
doc, err := b.c.UploadMessagesDoc(peerID, doctype, file.Name, "", r)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
switch doc.Type {
|
||||
case audioMessage:
|
||||
return document + strconv.Itoa(doc.AudioMessage.OwnerID) + "_" + strconv.Itoa(doc.AudioMessage.ID), nil
|
||||
case document:
|
||||
return document + strconv.Itoa(doc.Doc.OwnerID) + "_" + strconv.Itoa(doc.Doc.ID), nil
|
||||
}
|
||||
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (b *Bvk) getFiles(attachments []object.MessagesMessageAttachment) ([]string, string) {
|
||||
var urls []string
|
||||
var text []string
|
||||
|
||||
for _, a := range attachments {
|
||||
switch a.Type {
|
||||
case photo:
|
||||
var resolution float64 = 0
|
||||
url := a.Photo.Sizes[0].URL
|
||||
for _, size := range a.Photo.Sizes {
|
||||
r := size.Height * size.Width
|
||||
if resolution < r {
|
||||
resolution = r
|
||||
url = size.URL
|
||||
}
|
||||
}
|
||||
|
||||
urls = append(urls, url)
|
||||
|
||||
case document:
|
||||
urls = append(urls, a.Doc.URL)
|
||||
|
||||
case graffiti:
|
||||
urls = append(urls, a.Graffiti.URL)
|
||||
|
||||
case audioMessage:
|
||||
urls = append(urls, a.AudioMessage.DocsDocPreviewAudioMessage.LinkOgg)
|
||||
|
||||
case sticker:
|
||||
var resolution float64 = 0
|
||||
url := a.Sticker.Images[0].URL
|
||||
for _, size := range a.Sticker.Images {
|
||||
r := size.Height * size.Width
|
||||
if resolution < r {
|
||||
resolution = r
|
||||
url = size.URL
|
||||
}
|
||||
}
|
||||
urls = append(urls, url+".png")
|
||||
case video:
|
||||
text = append(text, "https://vk.com/video"+strconv.Itoa(a.Video.OwnerID)+"_"+strconv.Itoa(a.Video.ID))
|
||||
|
||||
case wall:
|
||||
text = append(text, "https://vk.com/wall"+strconv.Itoa(a.Wall.FromID)+"_"+strconv.Itoa(a.Wall.ID))
|
||||
|
||||
default:
|
||||
text = append(text, "This attachment is not supported ("+a.Type+")")
|
||||
}
|
||||
}
|
||||
|
||||
return urls, strings.Join(text, "\n")
|
||||
}
|
||||
|
||||
func (b *Bvk) downloadFiles(rmsg *config.Message, urls []string) {
|
||||
for _, url := range urls {
|
||||
data, err := helper.DownloadFile(url)
|
||||
if err == nil {
|
||||
urlPart := strings.Split(url, "/")
|
||||
name := strings.Split(urlPart[len(urlPart)-1], "?")[0]
|
||||
helper.HandleDownloadData(b.Log, rmsg, name, "", url, data, b.General)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,8 @@ Check:
|
||||
func (b *Bwhatsapp) HandleError(err error) {
|
||||
// ignore received invalid data errors. https://github.com/42wim/matterbridge/issues/843
|
||||
// ignore tag 174 errors. https://github.com/42wim/matterbridge/issues/1094
|
||||
if strings.Contains(err.Error(), "error processing data: received invalid data") || strings.Contains(err.Error(), "invalid string with tag 174") {
|
||||
if strings.Contains(err.Error(), "error processing data: received invalid data") ||
|
||||
strings.Contains(err.Error(), "invalid string with tag 174") {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -47,16 +48,22 @@ func (b *Bwhatsapp) reconnect(err error) {
|
||||
Max: 5 * time.Minute,
|
||||
Jitter: true,
|
||||
}
|
||||
|
||||
for {
|
||||
d := bf.Duration()
|
||||
|
||||
b.Log.Errorf("Connection failed, underlying error: %v", err)
|
||||
b.Log.Infof("Waiting %s...", d)
|
||||
|
||||
time.Sleep(d)
|
||||
|
||||
b.Log.Info("Reconnecting...")
|
||||
|
||||
err := b.conn.Restore()
|
||||
if err == nil {
|
||||
bf.Reset()
|
||||
b.startedAt = uint64(time.Now().Unix())
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -64,7 +71,7 @@ func (b *Bwhatsapp) reconnect(err error) {
|
||||
|
||||
// HandleTextMessage sent from WhatsApp, relay it to the brige
|
||||
func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) {
|
||||
if message.Info.FromMe { // || !strings.Contains(strings.ToLower(message.Text), "@echo") {
|
||||
if message.Info.FromMe {
|
||||
return
|
||||
}
|
||||
// whatsapp sends last messages to show context , cut them
|
||||
@@ -72,12 +79,10 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) {
|
||||
return
|
||||
}
|
||||
|
||||
messageTime := time.Unix(int64(message.Info.Timestamp), 0) // TODO check how behaves between timezones
|
||||
groupJID := message.Info.RemoteJid
|
||||
|
||||
senderJID := message.Info.SenderJid
|
||||
|
||||
if len(senderJID) == 0 {
|
||||
// TODO workaround till https://github.com/Rhymen/go-whatsapp/issues/86 resolved
|
||||
if message.Info.Source != nil && message.Info.Source.Participant != nil {
|
||||
senderJID = *message.Info.Source.Participant
|
||||
}
|
||||
@@ -101,110 +106,205 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) {
|
||||
if mention == "" {
|
||||
mention = "someone"
|
||||
}
|
||||
|
||||
message.Text = strings.Replace(message.Text, "@"+numberAndSuffix[0], "@"+mention, 1)
|
||||
}
|
||||
}
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account)
|
||||
rmsg := config.Message{
|
||||
UserID: senderJID,
|
||||
Username: senderName,
|
||||
Text: message.Text,
|
||||
Timestamp: messageTime,
|
||||
Channel: groupJID,
|
||||
Account: b.Account,
|
||||
Protocol: b.Protocol,
|
||||
Extra: make(map[string][]interface{}),
|
||||
UserID: senderJID,
|
||||
Username: senderName,
|
||||
Text: message.Text,
|
||||
Channel: groupJID,
|
||||
Account: b.Account,
|
||||
Protocol: b.Protocol,
|
||||
Extra: make(map[string][]interface{}),
|
||||
// ParentID: TODO, // TODO handle thread replies // map from Info.QuotedMessageID string
|
||||
// Event string `json:"event"`
|
||||
// Gateway string // will be added during message processing
|
||||
ID: message.Info.Id}
|
||||
ID: message.Info.Id,
|
||||
}
|
||||
|
||||
if avatarURL, exists := b.userAvatars[senderJID]; exists {
|
||||
rmsg.Avatar = avatarURL
|
||||
}
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account)
|
||||
b.Log.Debugf("<= Message is %#v", rmsg)
|
||||
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
// HandleImageMessage sent from WhatsApp, relay it to the brige
|
||||
func (b *Bwhatsapp) HandleImageMessage(message whatsapp.ImageMessage) {
|
||||
if message.Info.FromMe { // || !strings.Contains(strings.ToLower(message.Text), "@echo") {
|
||||
if message.Info.FromMe || message.Info.Timestamp < b.startedAt {
|
||||
return
|
||||
}
|
||||
|
||||
// whatsapp sends last messages to show context , cut them
|
||||
if message.Info.Timestamp < b.startedAt {
|
||||
return
|
||||
}
|
||||
|
||||
messageTime := time.Unix(int64(message.Info.Timestamp), 0) // TODO check how behaves between timezones
|
||||
groupJID := message.Info.RemoteJid
|
||||
|
||||
senderJID := message.Info.SenderJid
|
||||
if len(senderJID) == 0 {
|
||||
// TODO workaround till https://github.com/Rhymen/go-whatsapp/issues/86 resolved
|
||||
if message.Info.Source != nil && message.Info.Source.Participant != nil {
|
||||
senderJID = *message.Info.Source.Participant
|
||||
}
|
||||
if len(message.Info.SenderJid) == 0 && message.Info.Source != nil && message.Info.Source.Participant != nil {
|
||||
senderJID = *message.Info.Source.Participant
|
||||
}
|
||||
|
||||
// translate sender's Jid to the nicest username we can get
|
||||
senderName := b.getSenderName(senderJID)
|
||||
senderName := b.getSenderName(message.Info.SenderJid)
|
||||
if senderName == "" {
|
||||
senderName = "Someone" // don't expose telephone number
|
||||
}
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account)
|
||||
rmsg := config.Message{
|
||||
UserID: senderJID,
|
||||
Username: senderName,
|
||||
Timestamp: messageTime,
|
||||
Channel: groupJID,
|
||||
Account: b.Account,
|
||||
Protocol: b.Protocol,
|
||||
Extra: make(map[string][]interface{}),
|
||||
// ParentID: TODO, // TODO handle thread replies // map from Info.QuotedMessageID string
|
||||
// Event string `json:"event"`
|
||||
// Gateway string // will be added during message processing
|
||||
ID: message.Info.Id}
|
||||
UserID: senderJID,
|
||||
Username: senderName,
|
||||
Channel: message.Info.RemoteJid,
|
||||
Account: b.Account,
|
||||
Protocol: b.Protocol,
|
||||
Extra: make(map[string][]interface{}),
|
||||
ID: message.Info.Id,
|
||||
}
|
||||
|
||||
if avatarURL, exists := b.userAvatars[senderJID]; exists {
|
||||
rmsg.Avatar = avatarURL
|
||||
}
|
||||
|
||||
// Download and unencrypt content
|
||||
data, err := message.Download()
|
||||
fileExt, err := mime.ExtensionsByType(message.Type)
|
||||
if err != nil {
|
||||
b.Log.Errorf("%v", err)
|
||||
b.Log.Errorf("Mimetype detection error: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Get file extension by mimetype
|
||||
// rename .jfif to .jpg https://github.com/42wim/matterbridge/issues/1292
|
||||
if fileExt[0] == ".jfif" {
|
||||
fileExt[0] = ".jpg"
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("%v%v", message.Info.Id, fileExt[0])
|
||||
|
||||
b.Log.Debugf("Trying to download %s with type %s", filename, message.Type)
|
||||
|
||||
data, err := message.Download()
|
||||
if err != nil {
|
||||
b.Log.Errorf("Download image failed: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Move file to bridge storage
|
||||
helper.HandleDownloadData(b.Log, &rmsg, filename, message.Caption, "", &data, b.General)
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account)
|
||||
b.Log.Debugf("<= Message is %#v", rmsg)
|
||||
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
// HandleVideoMessage downloads video messages
|
||||
func (b *Bwhatsapp) HandleVideoMessage(message whatsapp.VideoMessage) {
|
||||
if message.Info.FromMe || message.Info.Timestamp < b.startedAt {
|
||||
return
|
||||
}
|
||||
|
||||
senderJID := message.Info.SenderJid
|
||||
if len(message.Info.SenderJid) == 0 && message.Info.Source != nil && message.Info.Source.Participant != nil {
|
||||
senderJID = *message.Info.Source.Participant
|
||||
}
|
||||
|
||||
senderName := b.getSenderName(message.Info.SenderJid)
|
||||
if senderName == "" {
|
||||
senderName = "Someone" // don't expose telephone number
|
||||
}
|
||||
|
||||
rmsg := config.Message{
|
||||
UserID: senderJID,
|
||||
Username: senderName,
|
||||
Channel: message.Info.RemoteJid,
|
||||
Account: b.Account,
|
||||
Protocol: b.Protocol,
|
||||
Extra: make(map[string][]interface{}),
|
||||
ID: message.Info.Id,
|
||||
}
|
||||
|
||||
if avatarURL, exists := b.userAvatars[senderJID]; exists {
|
||||
rmsg.Avatar = avatarURL
|
||||
}
|
||||
|
||||
fileExt, err := mime.ExtensionsByType(message.Type)
|
||||
if err != nil {
|
||||
b.Log.Errorf("%v", err)
|
||||
b.Log.Errorf("Mimetype detection error: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("%v%v", message.Info.Id, fileExt[0])
|
||||
|
||||
b.Log.Debugf("<= Image downloaded and unencrypted")
|
||||
b.Log.Debugf("Trying to download %s with size %#v and type %s", filename, message.Length, message.Type)
|
||||
|
||||
data, err := message.Download()
|
||||
if err != nil {
|
||||
b.Log.Errorf("Download video failed: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Move file to bridge storage
|
||||
helper.HandleDownloadData(b.Log, &rmsg, filename, message.Caption, "", &data, b.General)
|
||||
|
||||
b.Log.Debugf("<= Image Message is %#v", rmsg)
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account)
|
||||
b.Log.Debugf("<= Message is %#v", rmsg)
|
||||
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
//func (b *Bwhatsapp) HandleVideoMessage(message whatsapp.VideoMessage) {
|
||||
// fmt.Println(message) // TODO implement
|
||||
//}
|
||||
//
|
||||
//func (b *Bwhatsapp) HandleJsonMessage(message string) {
|
||||
// fmt.Println(message) // TODO implement
|
||||
//}
|
||||
// TODO HandleRawMessage
|
||||
// TODO HandleAudioMessage
|
||||
// HandleAudioMessage downloads audio messages
|
||||
func (b *Bwhatsapp) HandleAudioMessage(message whatsapp.AudioMessage) {
|
||||
if message.Info.FromMe || message.Info.Timestamp < b.startedAt {
|
||||
return
|
||||
}
|
||||
|
||||
senderJID := message.Info.SenderJid
|
||||
if len(message.Info.SenderJid) == 0 && message.Info.Source != nil && message.Info.Source.Participant != nil {
|
||||
senderJID = *message.Info.Source.Participant
|
||||
}
|
||||
|
||||
senderName := b.getSenderName(message.Info.SenderJid)
|
||||
if senderName == "" {
|
||||
senderName = "Someone" // don't expose telephone number
|
||||
}
|
||||
|
||||
rmsg := config.Message{
|
||||
UserID: senderJID,
|
||||
Username: senderName,
|
||||
Channel: message.Info.RemoteJid,
|
||||
Account: b.Account,
|
||||
Protocol: b.Protocol,
|
||||
Extra: make(map[string][]interface{}),
|
||||
ID: message.Info.Id,
|
||||
}
|
||||
|
||||
if avatarURL, exists := b.userAvatars[senderJID]; exists {
|
||||
rmsg.Avatar = avatarURL
|
||||
}
|
||||
|
||||
fileExt, err := mime.ExtensionsByType(message.Type)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Mimetype detection error: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("%v%v", message.Info.Id, fileExt[0])
|
||||
|
||||
b.Log.Debugf("Trying to download %s with size %#v and type %s", filename, message.Length, message.Type)
|
||||
|
||||
data, err := message.Download()
|
||||
if err != nil {
|
||||
b.Log.Errorf("Download audio failed: %s", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Move file to bridge storage
|
||||
helper.HandleDownloadData(b.Log, &rmsg, filename, "audio message", "", &data, b.General)
|
||||
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account)
|
||||
b.Log.Debugf("<= Message is %#v", rmsg)
|
||||
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
@@ -6,22 +6,24 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go"
|
||||
"github.com/Rhymen/go-whatsapp"
|
||||
)
|
||||
|
||||
type ProfilePicInfo struct {
|
||||
URL string `json:"eurl"`
|
||||
Tag string `json:"tag"`
|
||||
|
||||
Status int16 `json:"status"`
|
||||
URL string `json:"eurl"`
|
||||
Tag string `json:"tag"`
|
||||
Status int16 `json:"status"`
|
||||
}
|
||||
|
||||
func qrFromTerminal(invert bool) chan string {
|
||||
qr := make(chan string)
|
||||
|
||||
go func() {
|
||||
terminal := qrcodeTerminal.New()
|
||||
|
||||
if invert {
|
||||
terminal = qrcodeTerminal.New2(qrcodeTerminal.ConsoleColors.BrightWhite, qrcodeTerminal.ConsoleColors.BrightBlack, qrcodeTerminal.QRCodeRecoveryLevels.Medium)
|
||||
}
|
||||
@@ -44,13 +46,12 @@ func (b *Bwhatsapp) readSession() (whatsapp.Session, error) {
|
||||
if err != nil {
|
||||
return session, err
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
|
||||
decoder := gob.NewDecoder(file)
|
||||
err = decoder.Decode(&session)
|
||||
if err != nil {
|
||||
return session, err
|
||||
}
|
||||
return session, nil
|
||||
|
||||
return session, decoder.Decode(&session)
|
||||
}
|
||||
|
||||
func (b *Bwhatsapp) writeSession(session whatsapp.Session) error {
|
||||
@@ -65,11 +66,31 @@ func (b *Bwhatsapp) writeSession(session whatsapp.Session) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
encoder := gob.NewEncoder(file)
|
||||
err = encoder.Encode(session)
|
||||
|
||||
return err
|
||||
defer file.Close()
|
||||
|
||||
encoder := gob.NewEncoder(file)
|
||||
|
||||
return encoder.Encode(session)
|
||||
}
|
||||
|
||||
func (b *Bwhatsapp) restoreSession() (*whatsapp.Session, error) {
|
||||
session, err := b.readSession()
|
||||
if err != nil {
|
||||
b.Log.Warn(err.Error())
|
||||
}
|
||||
|
||||
b.Log.Debugln("Restoring WhatsApp session..")
|
||||
|
||||
session, err = b.conn.RestoreWithSession(session)
|
||||
if err != nil {
|
||||
// restore session connection timed out (I couldn't get over it without logging in again)
|
||||
return nil, errors.New("failed to restore session: " + err.Error())
|
||||
}
|
||||
|
||||
b.Log.Debugln("Session restored successfully!")
|
||||
|
||||
return &session, nil
|
||||
}
|
||||
|
||||
func (b *Bwhatsapp) getSenderName(senderJid string) string {
|
||||
@@ -114,6 +135,7 @@ func (b *Bwhatsapp) getSenderNotify(senderJid string) string {
|
||||
if sender, exists := b.users[senderJid]; exists {
|
||||
return sender.Notify
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -122,11 +144,20 @@ func (b *Bwhatsapp) GetProfilePicThumb(jid string) (*ProfilePicInfo, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get avatar: %v", err)
|
||||
}
|
||||
|
||||
content := <-data
|
||||
info := &ProfilePicInfo{}
|
||||
|
||||
err = json.Unmarshal([]byte(content), info)
|
||||
if err != nil {
|
||||
return info, fmt.Errorf("failed to unmarshal avatar info: %v", err)
|
||||
}
|
||||
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func isGroupJid(identifier string) bool {
|
||||
return strings.HasSuffix(identifier, "@g.us") ||
|
||||
strings.HasSuffix(identifier, "@temp") ||
|
||||
strings.HasSuffix(identifier, "@broadcast")
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ const (
|
||||
type Bwhatsapp struct {
|
||||
*bridge.Config
|
||||
|
||||
// https://github.com/Rhymen/go-whatsapp/blob/c31092027237441cffba1b9cb148eadf7c83c3d2/session.go#L18-L21
|
||||
session *whatsapp.Session
|
||||
conn *whatsapp.Conn
|
||||
startedAt uint64
|
||||
@@ -40,6 +39,7 @@ type Bwhatsapp struct {
|
||||
// New Create a new WhatsApp bridge. This will be called for each [whatsapp.<server>] entry you have in the config file
|
||||
func New(cfg *bridge.Config) bridge.Bridger {
|
||||
number := cfg.GetString(cfgNumber)
|
||||
|
||||
if number == "" {
|
||||
cfg.Log.Fatalf("Missing configuration for WhatsApp bridge: Number")
|
||||
}
|
||||
@@ -50,21 +50,17 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
||||
users: make(map[string]whatsapp.Contact),
|
||||
userAvatars: make(map[string]string),
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// Connect to WhatsApp. Required implementation of the Bridger interface
|
||||
// https://github.com/42wim/matterbridge/blob/2cfd880cdb0df29771bf8f31df8d990ab897889d/bridge/bridge.go#L11-L16
|
||||
func (b *Bwhatsapp) Connect() error {
|
||||
b.RLock() // TODO do we need locking for Whatsapp?
|
||||
defer b.RUnlock()
|
||||
|
||||
number := b.GetString(cfgNumber)
|
||||
if number == "" {
|
||||
return errors.New("WhatsApp's telephone Number need to be configured")
|
||||
return errors.New("whatsapp's telephone number need to be configured")
|
||||
}
|
||||
|
||||
// https://github.com/Rhymen/go-whatsapp#creating-a-connection
|
||||
b.Log.Debugln("Connecting to WhatsApp..")
|
||||
conn, err := whatsapp.NewConn(20 * time.Second)
|
||||
if err != nil {
|
||||
@@ -77,35 +73,18 @@ func (b *Bwhatsapp) Connect() error {
|
||||
b.Log.Debugln("WhatsApp connection successful")
|
||||
|
||||
// load existing session in order to keep it between restarts
|
||||
if b.session == nil {
|
||||
var session whatsapp.Session
|
||||
session, err = b.readSession()
|
||||
|
||||
if err == nil {
|
||||
b.Log.Debugln("Restoring WhatsApp session..")
|
||||
|
||||
// https://github.com/Rhymen/go-whatsapp#restore
|
||||
session, err = b.conn.RestoreWithSession(session)
|
||||
if err != nil {
|
||||
// TODO return or continue to normal login?
|
||||
// restore session connection timed out (I couldn't get over it without logging in again)
|
||||
return errors.New("failed to restore session: " + err.Error())
|
||||
}
|
||||
|
||||
b.session = &session
|
||||
b.Log.Debugln("Session restored successfully!")
|
||||
} else {
|
||||
b.Log.Warn(err.Error())
|
||||
}
|
||||
b.session, err = b.restoreSession()
|
||||
if err != nil {
|
||||
b.Log.Warn(err.Error())
|
||||
}
|
||||
|
||||
// login to a new session
|
||||
if b.session == nil {
|
||||
err = b.Login()
|
||||
if err != nil {
|
||||
if err = b.Login(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
b.startedAt = uint64(time.Now().Unix())
|
||||
|
||||
_, err = b.conn.Contacts()
|
||||
@@ -113,6 +92,13 @@ func (b *Bwhatsapp) Connect() error {
|
||||
return fmt.Errorf("error on update of contacts: %v", err)
|
||||
}
|
||||
|
||||
// see https://github.com/Rhymen/go-whatsapp/issues/137#issuecomment-480316013
|
||||
for len(b.conn.Store.Contacts) == 0 {
|
||||
b.conn.Contacts() // nolint:errcheck
|
||||
|
||||
<-time.After(1 * time.Second)
|
||||
}
|
||||
|
||||
// map all the users
|
||||
for id, contact := range b.conn.Store.Contacts {
|
||||
if !isGroupJid(id) && id != "status@broadcast" {
|
||||
@@ -129,12 +115,13 @@ func (b *Bwhatsapp) Connect() error {
|
||||
info, err := b.GetProfilePicThumb(jid)
|
||||
if err != nil {
|
||||
b.Log.Warnf("Could not get profile photo of %s: %v", jid, err)
|
||||
|
||||
} else {
|
||||
// TODO any race conditions here?
|
||||
b.Lock()
|
||||
b.userAvatars[jid] = info.URL
|
||||
b.Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
b.Log.Debug("Finished getting avatars..")
|
||||
}()
|
||||
|
||||
@@ -151,8 +138,10 @@ func (b *Bwhatsapp) Login() error {
|
||||
session, err := b.conn.Login(qrChan)
|
||||
if err != nil {
|
||||
b.Log.Warnln("Failed to log in:", err)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
b.session = &session
|
||||
|
||||
b.Log.Infof("Logged into session: %#v", session)
|
||||
@@ -163,74 +152,62 @@ func (b *Bwhatsapp) Login() error {
|
||||
fmt.Fprintf(os.Stderr, "error saving session: %v\n", err)
|
||||
}
|
||||
|
||||
// TODO change connection strings to configured ones longClientName:"github.com/rhymen/go-whatsapp", shortClientName:"go-whatsapp"}" prefix=whatsapp
|
||||
// TODO get also a nice logo
|
||||
|
||||
// TODO notification about unplugged and dead battery
|
||||
// conn.Info: Wid, Pushname, Connected, Battery, Plugged
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Disconnect is called while reconnecting to the bridge
|
||||
// TODO 42wim Documentation would be helpful on when reconnects happen and what should be done in this function
|
||||
// Required implementation of the Bridger interface
|
||||
// https://github.com/42wim/matterbridge/blob/2cfd880cdb0df29771bf8f31df8d990ab897889d/bridge/bridge.go#L11-L16
|
||||
func (b *Bwhatsapp) Disconnect() error {
|
||||
// We could Logout, but that would close the session completely and would require a new QR code scan
|
||||
// https://github.com/Rhymen/go-whatsapp/blob/c31092027237441cffba1b9cb148eadf7c83c3d2/session.go#L377-L381
|
||||
return nil
|
||||
}
|
||||
|
||||
func isGroupJid(identifier string) bool {
|
||||
return strings.HasSuffix(identifier, "@g.us") || strings.HasSuffix(identifier, "@temp") || strings.HasSuffix(identifier, "@broadcast")
|
||||
}
|
||||
|
||||
// JoinChannel Join a WhatsApp group specified in gateway config as channel='number-id@g.us' or channel='Channel name'
|
||||
// Required implementation of the Bridger interface
|
||||
// https://github.com/42wim/matterbridge/blob/2cfd880cdb0df29771bf8f31df8d990ab897889d/bridge/bridge.go#L11-L16
|
||||
func (b *Bwhatsapp) JoinChannel(channel config.ChannelInfo) error {
|
||||
byJid := isGroupJid(channel.Name)
|
||||
|
||||
// see https://github.com/Rhymen/go-whatsapp/issues/137#issuecomment-480316013
|
||||
for len(b.conn.Store.Contacts) == 0 {
|
||||
b.conn.Contacts() // nolint:errcheck
|
||||
<-time.After(1 * time.Second)
|
||||
}
|
||||
|
||||
// verify if we are member of the given group
|
||||
if byJid {
|
||||
// channel.Name specifies static group jID, not the name
|
||||
if _, exists := b.conn.Store.Contacts[channel.Name]; !exists {
|
||||
return fmt.Errorf("account doesn't belong to group with jid %s", channel.Name)
|
||||
}
|
||||
} else {
|
||||
// channel.Name specifies group name that might change, warn about it
|
||||
var jids []string
|
||||
for id, contact := range b.conn.Store.Contacts {
|
||||
if isGroupJid(id) && contact.Name == channel.Name {
|
||||
jids = append(jids, id)
|
||||
}
|
||||
}
|
||||
|
||||
switch len(jids) {
|
||||
case 0:
|
||||
// didn't match any group - print out possibilites
|
||||
// TODO sort
|
||||
// copy b;
|
||||
//sort.Slice(people, func(i, j int) bool {
|
||||
// return people[i].Age > people[j].Age
|
||||
//})
|
||||
for id, contact := range b.conn.Store.Contacts {
|
||||
if isGroupJid(id) {
|
||||
b.Log.Infof("%s %s", contact.Jid, contact.Name)
|
||||
}
|
||||
}
|
||||
return fmt.Errorf("please specify group's JID from the list above instead of the name '%s'", channel.Name)
|
||||
return nil
|
||||
}
|
||||
|
||||
case 1:
|
||||
return fmt.Errorf("group name might change. Please configure gateway with channel=\"%v\" instead of channel=\"%v\"", jids[0], channel.Name)
|
||||
|
||||
default:
|
||||
return fmt.Errorf("there is more than one group with name '%s'. Please specify one of JIDs as channel name: %v", channel.Name, jids)
|
||||
// channel.Name specifies group name that might change, warn about it
|
||||
var jids []string
|
||||
for id, contact := range b.conn.Store.Contacts {
|
||||
if isGroupJid(id) && contact.Name == channel.Name {
|
||||
jids = append(jids, id)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
switch len(jids) {
|
||||
case 0:
|
||||
// didn't match any group - print out possibilites
|
||||
for id, contact := range b.conn.Store.Contacts {
|
||||
if isGroupJid(id) {
|
||||
b.Log.Infof("%s %s", contact.Jid, contact.Name)
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Errorf("please specify group's JID from the list above instead of the name '%s'", channel.Name)
|
||||
case 1:
|
||||
return fmt.Errorf("group name might change. Please configure gateway with channel=\"%v\" instead of channel=\"%v\"", jids[0], channel.Name)
|
||||
default:
|
||||
return fmt.Errorf("there is more than one group with name '%s'. Please specify one of JIDs as channel name: %v", channel.Name, jids)
|
||||
}
|
||||
}
|
||||
|
||||
// Post a document message from the bridge to WhatsApp
|
||||
@@ -304,14 +281,12 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) {
|
||||
if msg.ID == "" {
|
||||
// No message ID in case action is executed on a message sent before the bridge was started
|
||||
// and then the bridge cache doesn't have this message ID mapped
|
||||
|
||||
// TODO 42wim Doesn't the app get clogged with a ton of IDs after some time of running?
|
||||
// WhatsApp allows to set any ID so in that case we could use external IDs and don't do mapping
|
||||
// but external IDs are not set
|
||||
return "", nil
|
||||
}
|
||||
// TODO delete message on WhatsApp https://github.com/Rhymen/go-whatsapp/issues/100
|
||||
return "", nil
|
||||
|
||||
_, err := b.conn.RevokeMessage(msg.Channel, msg.ID, true)
|
||||
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Edit message
|
||||
@@ -319,7 +294,6 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) {
|
||||
b.Log.Debugf("updating message with id %s", msg.ID)
|
||||
|
||||
msg.Text += " (edited)"
|
||||
// TODO handle edit as a message reply with updated text
|
||||
}
|
||||
|
||||
// Handle Upload a file
|
||||
@@ -349,16 +323,7 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) {
|
||||
|
||||
b.Log.Debugf("=> Sending %#v", msg)
|
||||
|
||||
// create message ID
|
||||
// TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented
|
||||
idBytes := make([]byte, 10)
|
||||
if _, err := rand.Read(idBytes); err != nil {
|
||||
b.Log.Warn(err.Error())
|
||||
}
|
||||
message.Info.Id = strings.ToUpper(hex.EncodeToString(idBytes))
|
||||
_, err := b.conn.Send(message)
|
||||
|
||||
return message.Info.Id, err
|
||||
return b.conn.Send(message)
|
||||
}
|
||||
|
||||
// TODO do we want that? to allow login with QR code from a bridged channel? https://github.com/tulir/mautrix-whatsapp/blob/513eb18e2d59bada0dd515ee1abaaf38a3bfe3d5/commands.go#L76
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package bxmpp
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -86,14 +89,21 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
|
||||
// Upload a file (in XMPP case send the upload URL because XMPP has no native upload support).
|
||||
var err error
|
||||
if msg.Extra != nil {
|
||||
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
||||
b.Log.Debugf("=> Sending attachement message %#v", rmsg)
|
||||
if _, err := b.xc.Send(xmpp.Chat{
|
||||
Type: "groupchat",
|
||||
Remote: rmsg.Channel + "@" + b.GetString("Muc"),
|
||||
Text: rmsg.Username + rmsg.Text,
|
||||
}); err != nil {
|
||||
if b.GetString("WebhookURL") != "" {
|
||||
err = b.postSlackCompatibleWebhook(msg)
|
||||
} else {
|
||||
_, err = b.xc.Send(xmpp.Chat{
|
||||
Type: "groupchat",
|
||||
Remote: rmsg.Channel + "@" + b.GetString("Muc"),
|
||||
Text: rmsg.Username + rmsg.Text,
|
||||
})
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
b.Log.WithError(err).Error("Unable to send message with share URL.")
|
||||
}
|
||||
}
|
||||
@@ -102,13 +112,24 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
||||
}
|
||||
}
|
||||
|
||||
if b.GetString("WebhookURL") != "" {
|
||||
b.Log.Debugf("Sending message using Webhook")
|
||||
err := b.postSlackCompatibleWebhook(msg)
|
||||
if err != nil {
|
||||
b.Log.Errorf("Failed to send message using webhook: %s", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// Post normal message.
|
||||
var msgReplaceID string
|
||||
msgID := xid.New().String()
|
||||
if msg.ID != "" {
|
||||
msgID = msg.ID
|
||||
msgReplaceID = msg.ID
|
||||
}
|
||||
// Post normal message.
|
||||
b.Log.Debugf("=> Sending message %#v", msg)
|
||||
if _, err := b.xc.Send(xmpp.Chat{
|
||||
Type: "groupchat",
|
||||
@@ -122,6 +143,25 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
||||
return msgID, nil
|
||||
}
|
||||
|
||||
func (b *Bxmpp) postSlackCompatibleWebhook(msg config.Message) error {
|
||||
type XMPPWebhook struct {
|
||||
Username string `json:"username"`
|
||||
Text string `json:"text"`
|
||||
}
|
||||
webhookBody, err := json.Marshal(XMPPWebhook{
|
||||
Username: msg.Username,
|
||||
Text: msg.Text,
|
||||
})
|
||||
if err != nil {
|
||||
b.Log.Errorf("Failed to marshal webhook: %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
resp, err := http.Post(b.GetString("WebhookURL")+"/"+msg.Channel, "application/json", bytes.NewReader(webhookBody))
|
||||
resp.Body.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
func (b *Bxmpp) createXMPP() error {
|
||||
if !strings.Contains(b.GetString("Jid"), "@") {
|
||||
return fmt.Errorf("the Jid %s doesn't contain an @", b.GetString("Jid"))
|
||||
@@ -138,14 +178,14 @@ func (b *Bxmpp) createXMPP() error {
|
||||
User: b.GetString("Jid"),
|
||||
Password: b.GetString("Password"),
|
||||
NoTLS: true,
|
||||
StartTLS: true,
|
||||
StartTLS: !b.GetBool("NoTLS"),
|
||||
TLSConfig: tc,
|
||||
Debug: b.GetBool("debug"),
|
||||
Session: true,
|
||||
Status: "",
|
||||
StatusMessage: "",
|
||||
Resource: "",
|
||||
InsecureAllowUnencryptedAuth: false,
|
||||
InsecureAllowUnencryptedAuth: b.GetBool("NoTLS"),
|
||||
}
|
||||
var err error
|
||||
b.xc, err = options.NewClient()
|
||||
@@ -378,6 +418,11 @@ func (b *Bxmpp) skipMessage(message xmpp.Chat) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// Ignore messages posted by our webhook
|
||||
if b.GetString("WebhookURL") != "" && strings.Contains(message.ID, "webhookbot") {
|
||||
return true
|
||||
}
|
||||
|
||||
// skip delayed messages
|
||||
return !message.Stamp.IsZero() && time.Since(message.Stamp).Minutes() > 5
|
||||
}
|
||||
|
||||
94
changelog.md
94
changelog.md
@@ -1,3 +1,97 @@
|
||||
# v1.22.0
|
||||
|
||||
Discord users using autowebhooks are encouraged to upgrade to this release.
|
||||
|
||||
## New features
|
||||
|
||||
- vk: new protocol added: Add vk support (#1245)
|
||||
- xmpp: Allow the XMPP bridge to use slack compatible webhooks (xmpp) (#1364)
|
||||
|
||||
## Enhancements
|
||||
|
||||
- telegram: Rename .oga audio files to .ogg (telegram) (#1349)
|
||||
- telegram: Add jpe as valid image filename extension (telegram) (#1360)
|
||||
- discord: Add an even more debug option (discord) (#1368)
|
||||
- general: Update vendor (#1384)
|
||||
|
||||
## Bugfixes
|
||||
|
||||
- discord: Pick up all the webhooks (discord) (#1383). Fixes #1353
|
||||
|
||||
This release couldn't exist without the following contributors:
|
||||
@ivanik7, @Polynomdivision, @PeterDaveHello, @Humorhenker, @qaisjp
|
||||
|
||||
# v1.21.0
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
- discord: Remove WebhookURL support (discord) (#1323)
|
||||
|
||||
`WebhookURL` global setting for discord is removed and will quit matterbridge.
|
||||
New `AutoWebhooks=true` setting, which will automatically use (and create, if they do not exist) webhooks inside specific channels. This only works if the bot has Manage Webhooks permission in bridged channels (global permission or as a channel permission override). Backwards compatibility with channel-specific webhooks. More info [here](https://github.com/42wim/matterbridge/blob/master/matterbridge.toml.sample#L862).
|
||||
|
||||
## New features
|
||||
|
||||
- discord: Create webhooks automatically (#1323)
|
||||
- discord: Add threading support with token (discord) (#1342)
|
||||
- irc: Join on invite (irc). Fixes #1231 (#1306)
|
||||
- irc: Add support for stateless bridging via draft/relaymsg (irc) (#1339)
|
||||
- whatsapp: Add support for deleting messages (whatsapp) (#1316)
|
||||
- whatsapp: Handle video downloads (whatsapp) (#1316)
|
||||
- whatsapp: Handle audio downloads (whatsapp) (#1316)
|
||||
|
||||
## Enhancements
|
||||
|
||||
- general: Parse fencedcode in ParseMarkdown. Fixes #1127 (#1329)
|
||||
- discord: Refactor guild finding code (discord) (#1319)
|
||||
- discord: Add a prefix handler for unthreaded messages (discord) (#1346)
|
||||
- irc: Add support for irc to irc notice (irc). Fixes #754 (#1305)
|
||||
- irc: Make handlers run async (irc) (#1325)
|
||||
- matrix: Show mxids in case of clashing usernames (matrix) (#1309)
|
||||
- matrix: Implement ratelimiting (matrix). Fixes #1238 (#1326)
|
||||
- matrix: Mark messages as read (matrix). Fixes #1317 (#1328)
|
||||
- nctalk: Update go-nc-talk (nctalk) (#1333)
|
||||
- rocketchat: Update rocketchat vendor (#1327)
|
||||
- tengo: Add UserID to RemoteNickFormat and Tengo (#1308)
|
||||
- whatsapp: Retry until we have contacts (whatsapp). Fixes #1122 (#1304)
|
||||
- whatsapp: Refactor/cleanup code (whatsapp)
|
||||
- whatsapp: Refactor handleTextMessage (whatsapp)
|
||||
- whatsapp: Refactor image downloads (whatsapp)
|
||||
- whatsapp: Rename jfif to jpg (whatsapp). Fixes #1292
|
||||
|
||||
## Bugfix
|
||||
|
||||
- discord: Reject cross-channel message references (discord) (#1345)
|
||||
- mumble: Add nil checks to text message handling (mumble) (#1321)
|
||||
|
||||
This release couldn't exist without the following contributors:
|
||||
@nightmared, @qaisjp, @jlu5, @wschwab, @gary-kim, @s3lph, @JeremyRand
|
||||
|
||||
# v1.20.0
|
||||
|
||||
## Breaking
|
||||
|
||||
- matrix: Send the display name instead of the user name (matrix) (#1282)
|
||||
Matrix now sends the displayname if set instead of the username. If you want to keep the username, add `UseUsername=true` to your matrix config. <https://github.com/42wim/matterbridge/wiki/Settings#useusername-1>
|
||||
- discord: Disable webhook editing (discord) (#1296)
|
||||
Because of issues with ratelimiting of webhook editing, this feature is now disabled. If you have multiple discord channels you bridge, you'll need to add a `webhookURL` to the `[gateway.inout.options]`. See <https://github.com/42wim/matterbridge/blob/master/matterbridge.toml.sample#L1864-L1870> for an example.
|
||||
|
||||
## New features
|
||||
|
||||
- general: Allow tengo to drop messages using msgDrop (#1272)
|
||||
- general: Update libraries (whatsapp,markdown,mattermost,ssh-chat)
|
||||
- irc: Add PingDelay option (irc) (#1269)
|
||||
- matrix: Allow message edits on matrix (#1286)
|
||||
- xmpp: add NoTLS option to allow plaintext XMPP connections (#1288)
|
||||
|
||||
## Enhancements
|
||||
|
||||
- discord: Edit messages via webhook (1287)
|
||||
- general: Add extra debug to log time spent sending a message per bridge (#1299)
|
||||
|
||||
This release couldn't exist without the following contributors:
|
||||
@nightmared, @zhoreeq
|
||||
|
||||
# v1.19.0
|
||||
|
||||
## New features
|
||||
|
||||
11
gateway/bridgemap/bvk.go
Normal file
11
gateway/bridgemap/bvk.go
Normal file
@@ -0,0 +1,11 @@
|
||||
// +build !novk
|
||||
|
||||
package bridgemap
|
||||
|
||||
import (
|
||||
bvk "github.com/42wim/matterbridge/bridge/vk"
|
||||
)
|
||||
|
||||
func init() {
|
||||
FullMap["vk"] = bvk.New
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package gateway
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"regexp"
|
||||
@@ -336,20 +337,21 @@ func (gw *Gateway) modifyUsername(msg *config.Message, dest *bridge.Bridge) stri
|
||||
}
|
||||
i++
|
||||
}
|
||||
nick = strings.Replace(nick, "{NOPINGNICK}", msg.Username[:i]+""+msg.Username[i:], -1)
|
||||
nick = strings.ReplaceAll(nick, "{NOPINGNICK}", msg.Username[:i]+"\u200b"+msg.Username[i:])
|
||||
}
|
||||
|
||||
nick = strings.Replace(nick, "{BRIDGE}", br.Name, -1)
|
||||
nick = strings.Replace(nick, "{PROTOCOL}", br.Protocol, -1)
|
||||
nick = strings.Replace(nick, "{GATEWAY}", gw.Name, -1)
|
||||
nick = strings.Replace(nick, "{LABEL}", br.GetString("Label"), -1)
|
||||
nick = strings.Replace(nick, "{NICK}", msg.Username, -1)
|
||||
nick = strings.Replace(nick, "{CHANNEL}", msg.Channel, -1)
|
||||
nick = strings.ReplaceAll(nick, "{BRIDGE}", br.Name)
|
||||
nick = strings.ReplaceAll(nick, "{PROTOCOL}", br.Protocol)
|
||||
nick = strings.ReplaceAll(nick, "{GATEWAY}", gw.Name)
|
||||
nick = strings.ReplaceAll(nick, "{LABEL}", br.GetString("Label"))
|
||||
nick = strings.ReplaceAll(nick, "{NICK}", msg.Username)
|
||||
nick = strings.ReplaceAll(nick, "{USERID}", msg.UserID)
|
||||
nick = strings.ReplaceAll(nick, "{CHANNEL}", msg.Channel)
|
||||
tengoNick, err := gw.modifyUsernameTengo(msg, br)
|
||||
if err != nil {
|
||||
gw.logger.Errorf("modifyUsernameTengo error: %s", err)
|
||||
}
|
||||
nick = strings.Replace(nick, "{TENGO}", tengoNick, -1) //nolint:gocritic
|
||||
nick = strings.ReplaceAll(nick, "{TENGO}", tengoNick)
|
||||
return nick
|
||||
}
|
||||
|
||||
@@ -363,10 +365,23 @@ func (gw *Gateway) modifyAvatar(msg *config.Message, dest *bridge.Bridge) string
|
||||
}
|
||||
|
||||
func (gw *Gateway) modifyMessage(msg *config.Message) {
|
||||
if err := modifyMessageTengo(gw.BridgeValues().General.TengoModifyMessage, msg); err != nil {
|
||||
if gw.BridgeValues().General.TengoModifyMessage != "" {
|
||||
gw.logger.Warnf("General TengoModifyMessage=%s is deprecated and will be removed in v1.20.0, please move to Tengo InMessage=%s", gw.BridgeValues().General.TengoModifyMessage, gw.BridgeValues().General.TengoModifyMessage)
|
||||
}
|
||||
|
||||
if err := modifyInMessageTengo(gw.BridgeValues().General.TengoModifyMessage, msg); err != nil {
|
||||
gw.logger.Errorf("TengoModifyMessage failed: %s", err)
|
||||
}
|
||||
if err := modifyMessageTengo(gw.BridgeValues().Tengo.Message, msg); err != nil {
|
||||
|
||||
inMessage := gw.BridgeValues().Tengo.InMessage
|
||||
if inMessage == "" {
|
||||
inMessage = gw.BridgeValues().Tengo.Message
|
||||
if inMessage != "" {
|
||||
gw.logger.Warnf("Tengo Message=%s is deprecated and will be removed in v1.20.0, please move to Tengo InMessage=%s", inMessage, inMessage)
|
||||
}
|
||||
}
|
||||
|
||||
if err := modifyInMessageTengo(inMessage, msg); err != nil {
|
||||
gw.logger.Errorf("Tengo.Message failed: %s", err)
|
||||
}
|
||||
|
||||
@@ -416,9 +431,15 @@ func (gw *Gateway) SendMessage(
|
||||
}
|
||||
}
|
||||
|
||||
// Only send irc notices to irc
|
||||
if msg.Event == config.EventNoticeIRC && dest.Protocol != "irc" {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// Too noisy to log like other events
|
||||
debugSendMessage := ""
|
||||
if msg.Event != config.EventUserTyping {
|
||||
gw.logger.Debugf("=> Sending %#v from %s (%s) to %s (%s)", msg, msg.Account, rmsg.Channel, dest.Account, channel.Name)
|
||||
debugSendMessage = fmt.Sprintf("=> Sending %#v from %s (%s) to %s (%s)", msg, msg.Account, rmsg.Channel, dest.Account, channel.Name)
|
||||
}
|
||||
|
||||
msg.Channel = channel.Name
|
||||
@@ -438,22 +459,34 @@ func (gw *Gateway) SendMessage(
|
||||
}
|
||||
|
||||
// if the parentID is still empty and we have a parentID set in the original message
|
||||
// this means that we didn't find it in the cache so set it "msg-parent-not-found"
|
||||
// this means that we didn't find it in the cache so set it to a "msg-parent-not-found" constant
|
||||
if msg.ParentID == "" && rmsg.ParentID != "" {
|
||||
msg.ParentID = "msg-parent-not-found"
|
||||
msg.ParentID = config.ParentIDNotFound
|
||||
}
|
||||
|
||||
err := gw.modifySendMessageTengo(rmsg, &msg, dest)
|
||||
drop, err := gw.modifyOutMessageTengo(rmsg, &msg, dest)
|
||||
if err != nil {
|
||||
gw.logger.Errorf("modifySendMessageTengo: %s", err)
|
||||
}
|
||||
|
||||
if drop {
|
||||
gw.logger.Debugf("=> Tengo dropping %#v from %s (%s) to %s (%s)", msg, msg.Account, rmsg.Channel, dest.Account, channel.Name)
|
||||
return "", nil
|
||||
}
|
||||
|
||||
if debugSendMessage != "" {
|
||||
gw.logger.Debug(debugSendMessage)
|
||||
}
|
||||
// if we are using mattermost plugin account, send messages to MattermostPlugin channel
|
||||
// that can be picked up by the mattermost matterbridge plugin
|
||||
if dest.Account == "mattermost.plugin" {
|
||||
gw.Router.MattermostPlugin <- msg
|
||||
}
|
||||
|
||||
defer func(t time.Time) {
|
||||
gw.logger.Debugf("=> Send from %s (%s) to %s (%s) took %s", msg.Account, rmsg.Channel, dest.Account, channel.Name, time.Since(t))
|
||||
}(time.Now())
|
||||
|
||||
mID, err := dest.Send(msg)
|
||||
if err != nil {
|
||||
return mID, err
|
||||
@@ -505,7 +538,7 @@ func getProtocol(msg *config.Message) string {
|
||||
return p[0]
|
||||
}
|
||||
|
||||
func modifyMessageTengo(filename string, msg *config.Message) error {
|
||||
func modifyInMessageTengo(filename string, msg *config.Message) error {
|
||||
if filename == "" {
|
||||
return nil
|
||||
}
|
||||
@@ -517,6 +550,7 @@ func modifyMessageTengo(filename string, msg *config.Message) error {
|
||||
s.SetImports(stdlib.GetModuleMap(stdlib.AllModuleNames()...))
|
||||
_ = s.Add("msgText", msg.Text)
|
||||
_ = s.Add("msgUsername", msg.Username)
|
||||
_ = s.Add("msgUserID", msg.UserID)
|
||||
_ = s.Add("msgAccount", msg.Account)
|
||||
_ = s.Add("msgChannel", msg.Channel)
|
||||
c, err := s.Compile()
|
||||
@@ -545,6 +579,7 @@ func (gw *Gateway) modifyUsernameTengo(msg *config.Message, br *bridge.Bridge) (
|
||||
_ = s.Add("result", "")
|
||||
_ = s.Add("msgText", msg.Text)
|
||||
_ = s.Add("msgUsername", msg.Username)
|
||||
_ = s.Add("msgUserID", msg.UserID)
|
||||
_ = s.Add("nick", msg.Username)
|
||||
_ = s.Add("msgAccount", msg.Account)
|
||||
_ = s.Add("msgChannel", msg.Channel)
|
||||
@@ -564,22 +599,28 @@ func (gw *Gateway) modifyUsernameTengo(msg *config.Message, br *bridge.Bridge) (
|
||||
return c.Get("result").String(), nil
|
||||
}
|
||||
|
||||
func (gw *Gateway) modifySendMessageTengo(origmsg *config.Message, msg *config.Message, br *bridge.Bridge) error {
|
||||
func (gw *Gateway) modifyOutMessageTengo(origmsg *config.Message, msg *config.Message, br *bridge.Bridge) (bool, error) {
|
||||
filename := gw.BridgeValues().Tengo.OutMessage
|
||||
var res []byte
|
||||
var err error
|
||||
var (
|
||||
res []byte
|
||||
err error
|
||||
drop bool
|
||||
)
|
||||
|
||||
if filename == "" {
|
||||
res, err = internal.Asset("tengo/outmessage.tengo")
|
||||
if err != nil {
|
||||
return err
|
||||
return drop, err
|
||||
}
|
||||
} else {
|
||||
res, err = ioutil.ReadFile(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
return drop, err
|
||||
}
|
||||
}
|
||||
|
||||
s := tengo.NewScript(res)
|
||||
|
||||
s.SetImports(stdlib.GetModuleMap(stdlib.AllModuleNames()...))
|
||||
_ = s.Add("inAccount", origmsg.Account)
|
||||
_ = s.Add("inProtocol", origmsg.Protocol)
|
||||
@@ -593,14 +634,20 @@ func (gw *Gateway) modifySendMessageTengo(origmsg *config.Message, msg *config.M
|
||||
_ = s.Add("outEvent", msg.Event)
|
||||
_ = s.Add("msgText", msg.Text)
|
||||
_ = s.Add("msgUsername", msg.Username)
|
||||
_ = s.Add("msgUserID", msg.UserID)
|
||||
_ = s.Add("msgDrop", drop)
|
||||
c, err := s.Compile()
|
||||
if err != nil {
|
||||
return err
|
||||
return drop, err
|
||||
}
|
||||
|
||||
if err := c.Run(); err != nil {
|
||||
return err
|
||||
return drop, err
|
||||
}
|
||||
|
||||
drop = c.Get("msgDrop").Bool()
|
||||
msg.Text = c.Get("msgText").String()
|
||||
msg.Username = c.Get("msgUsername").String()
|
||||
return nil
|
||||
|
||||
return drop, nil
|
||||
}
|
||||
|
||||
@@ -533,7 +533,7 @@ func (s *ignoreTestSuite) TestIgnoreNicks() {
|
||||
func BenchmarkTengo(b *testing.B) {
|
||||
msg := &config.Message{Username: "user", Text: "blah testing", Account: "protocol.account", Channel: "mychannel"}
|
||||
for n := 0; n < b.N; n++ {
|
||||
err := modifyMessageTengo("bench.tengo", msg)
|
||||
err := modifyInMessageTengo("bench.tengo", msg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ func (r *Router) handleReceive() {
|
||||
// For some bridges we always add/update the message ID.
|
||||
// This is necessary as msgIDs will change if a bridge returns
|
||||
// a different ID in response to edits.
|
||||
if !exists || msg.Protocol == "discord" {
|
||||
if !exists {
|
||||
gw.Messages.Add(msg.Protocol+" "+msg.ID, msgIDs)
|
||||
}
|
||||
}
|
||||
|
||||
40
go.mod
40
go.mod
@@ -3,16 +3,16 @@ module github.com/42wim/matterbridge
|
||||
require (
|
||||
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
|
||||
github.com/Jeffail/gabs v1.1.1 // indirect
|
||||
github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560
|
||||
github.com/Rhymen/go-whatsapp v0.1.1-0.20201007125822-005103751b7a
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210126174449-3c094ebae0ce
|
||||
github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20200922220614-e4a51dfb52e4 // indirect
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.0
|
||||
github.com/d5/tengo/v2 v2.6.2
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/go-telegram-bot-api/telegram-bot-api v1.0.1-0.20200524105306-7434b0456e81
|
||||
github.com/gomarkdown/markdown v0.0.0-20200824053859-8c8b3816f167
|
||||
github.com/google/gops v0.3.11
|
||||
github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 // indirect
|
||||
github.com/gomarkdown/markdown v0.0.0-20201113031856-722100d81a8e
|
||||
github.com/google/gops v0.3.14
|
||||
github.com/gorilla/schema v1.2.0
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/hashicorp/golang-lru v0.5.4
|
||||
@@ -21,38 +21,42 @@ require (
|
||||
github.com/labstack/echo/v4 v4.1.17
|
||||
github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7
|
||||
github.com/matrix-org/gomatrix v0.0.0-20200827122206-7dd5e2a05bcd
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20200411204219-d5c18ce75048
|
||||
github.com/matterbridge/discordgo v0.22.0
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20201206215757-c1d86d75b9f8
|
||||
github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7
|
||||
github.com/matterbridge/emoji v2.1.1-0.20191117213217-af507f6b02db+incompatible
|
||||
github.com/matterbridge/go-xmpp v0.0.0-20200418225040-c8a3a57b4050
|
||||
github.com/matterbridge/gozulipbot v0.0.0-20200820220548-be5824faa913
|
||||
github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba
|
||||
github.com/mattermost/mattermost-server/v5 v5.28.1
|
||||
github.com/mattn/godown v0.0.0-20200217152941-afc959f6a561
|
||||
github.com/mattermost/mattermost-server/v5 v5.30.1
|
||||
github.com/mattn/godown v0.0.1
|
||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
|
||||
github.com/missdeer/golib v1.0.3
|
||||
github.com/missdeer/golib v1.0.4
|
||||
github.com/mitchellh/mapstructure v1.3.3 // indirect
|
||||
github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474 // indirect
|
||||
github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff // indirect
|
||||
github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9
|
||||
github.com/paulrosania/go-charset v0.0.0-20190326053356-55c9d7a5834c
|
||||
github.com/rs/xid v1.2.1
|
||||
github.com/russross/blackfriday v1.5.2
|
||||
github.com/russross/blackfriday v1.6.0
|
||||
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca
|
||||
github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98
|
||||
github.com/shazow/ssh-chat v1.10.1
|
||||
github.com/sirupsen/logrus v1.7.0
|
||||
github.com/slack-go/slack v0.7.2
|
||||
github.com/slack-go/slack v0.8.0
|
||||
github.com/spf13/afero v1.3.4 // indirect
|
||||
github.com/spf13/cast v1.3.1 // indirect
|
||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||
github.com/spf13/viper v1.7.1
|
||||
github.com/stretchr/testify v1.6.1
|
||||
github.com/stretchr/testify v1.7.0
|
||||
github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50
|
||||
github.com/writeas/go-strip-markdown v2.0.1+incompatible
|
||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
|
||||
github.com/yaegashi/msgraph.go v0.1.4
|
||||
github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2
|
||||
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5
|
||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
|
||||
gomod.garykim.dev/nc-talk v0.1.5
|
||||
golang.org/x/image v0.0.0-20201208152932-35266b937fa6
|
||||
golang.org/x/oauth2 v0.0.0-20210201163806-010130855d6c
|
||||
gomod.garykim.dev/nc-talk v0.1.7
|
||||
gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376
|
||||
layeh.com/gumble v0.0.0-20200818122324-146f9205029b
|
||||
)
|
||||
|
||||
go 1.13
|
||||
go 1.15
|
||||
|
||||
254
go.sum
254
go.sum
@@ -34,6 +34,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
code.cloudfoundry.org/bytefmt v0.0.0-20190710193110-1eb035ffe2b6/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc=
|
||||
code.sajari.com/docconv v1.1.1-0.20200701232649-d9ea05fbd50a/go.mod h1:DooS873W9YwUjTwEYGpg55aDlvnx1VcEdr7IJ9rEW8g=
|
||||
contrib.go.opencensus.io/exporter/ocagent v0.4.9/go.mod h1:ueLzZcP7LPhPulEBukGn4aLh7Mx9YJwpVJ9nL2FYltw=
|
||||
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
@@ -55,8 +57,10 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
||||
github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw=
|
||||
github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w=
|
||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E=
|
||||
github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
|
||||
github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4=
|
||||
github.com/JalfResi/justext v0.0.0-20170829062021-c0282dea7198/go.mod h1:0SURuH1rsE8aVWvutuMZghRNrNrYEUzibzJfhEYR8L0=
|
||||
github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo=
|
||||
github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
|
||||
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
|
||||
github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
@@ -70,21 +74,31 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE
|
||||
github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788/go.mod h1:lY1dZd8HBzJ10eqKERHn3CU59tfhzcAVb2c0ZhIWSOk=
|
||||
github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560 h1:ItnC9PEEMESzTbFayxrhKBbuFQOXDBI8yy7NudTcEWs=
|
||||
github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560/go.mod h1:o38AwUFFS4gzbjSoyIgrZ1h9UeDrKwcci1Pj6baifvI=
|
||||
github.com/PuerkitoBio/goquery v1.4.1/go.mod h1:T9ezsOHcCrDCgA8aF1Cqr3sSYbO/xgdy8/R/XiIMAhA=
|
||||
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
|
||||
github.com/Rhymen/go-whatsapp v0.0.0/go.mod h1:rdQr95g2C1xcOfM7QGOhza58HeI3I+tZ/bbluv7VazA=
|
||||
github.com/Rhymen/go-whatsapp v0.1.1-0.20201007125822-005103751b7a h1:LW+rX0NY6LzMPa2hJcgmQlfiFJUihzOMAaIoCq+P3xc=
|
||||
github.com/Rhymen/go-whatsapp v0.1.1-0.20201007125822-005103751b7a/go.mod h1:o7jjkvKnigfu432dMbQ/w4PH0Yp5u4Y6ysCNjUlcYCk=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20201226125722-8029c28f5c5a h1:xE1ogaIgFJQbEDoIkiAkMH9wVEAmlKOy/M+kf1xmtCY=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20201226125722-8029c28f5c5a/go.mod h1:o7jjkvKnigfu432dMbQ/w4PH0Yp5u4Y6ysCNjUlcYCk=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210126174449-3c094ebae0ce h1:qitALaMtz6i05smexphqLty1gGc7Viwhn8bdSRmp4UM=
|
||||
github.com/Rhymen/go-whatsapp v0.1.2-0.20210126174449-3c094ebae0ce/go.mod h1:o7jjkvKnigfu432dMbQ/w4PH0Yp5u4Y6ysCNjUlcYCk=
|
||||
github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:zgCiQtBtZ4P4gFWvwl9aashsdwOcbb/EHOGRmSzM8ME=
|
||||
github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:5sCUSpG616ZoSJhlt9iBNI/KXBqrVLcNUJqg7J9+8pU=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:RdiyhanVEGXTam+mZ3k6Y3VDCCvXYCwReOoxGozqhHw=
|
||||
github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:suwzklatySS3Q0+NCxCDh5hYfgXdQUWU1DNcxwAxStM=
|
||||
github.com/RoaringBitmap/roaring v0.4.21/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
||||
github.com/RoaringBitmap/roaring v0.5.0/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
||||
github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
||||
github.com/RoaringBitmap/roaring v0.5.1/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
||||
github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20200922220614-e4a51dfb52e4 h1:u7UvmSK6McEMXFZB310/YZ6uvfDaSFrSoqWoy/qaOW0=
|
||||
github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20200922220614-e4a51dfb52e4/go.mod h1:wVff6N8s2foRPCYeynerOM/FF44uyI60/HMiboL0SXw=
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.0 h1:39qjzmozK5FDfnDkfA+YN0CtKi4mDrzjPtoT5GN9Xg0=
|
||||
github.com/SevereCloud/vksdk/v2 v2.9.0/go.mod h1:IBmfJ3rs+zDLD9NHCoJEpgg5A4UOoxgUU/g8p5lYb48=
|
||||
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||
github.com/advancedlogic/GoOse v0.0.0-20191112112754-e742535969c1/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w=
|
||||
github.com/advancedlogic/GoOse v0.0.0-20200830213114-1225d531e0ad/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
@@ -92,10 +106,17 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58 h1:MkpmYfld/S8kXqTYI68DfL8/hHXjHogL120Dy00TIxc=
|
||||
github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58/go.mod h1:YNfsMyWSs+h+PaYkxGeMVmVCX75Zj/pqdjbu12ciCYE=
|
||||
github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
|
||||
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
|
||||
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
|
||||
github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/araddon/dateparse v0.0.0-20180729174819-cfd92a431d0e/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI=
|
||||
github.com/araddon/dateparse v0.0.0-20200409225146-d820a6159ab1/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI=
|
||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
@@ -106,6 +127,7 @@ github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1/go.mod h1:noBAuukeYO
|
||||
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
||||
github.com/aws/aws-sdk-go v1.19.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/aws/aws-sdk-go v1.35.5/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
|
||||
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
|
||||
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
|
||||
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
|
||||
@@ -116,16 +138,17 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
|
||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
||||
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
|
||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||
github.com/blevesearch/bleve v1.0.9/go.mod h1:tb04/rbU29clbtNgorgFd8XdJea4x3ybYaOjWKr+UBU=
|
||||
github.com/blevesearch/bleve v1.0.12/go.mod h1:G0ErXWdIrUSYZLPoMpS9Z3saTnTsk4ebhPsVv/+0nxk=
|
||||
github.com/blevesearch/blevex v0.0.0-20190916190636-152f0fe5c040/go.mod h1:WH+MU2F4T0VmSdaPX+Wu5GYoZBrYWdOZWSjzvYcDmqQ=
|
||||
github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M=
|
||||
github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA=
|
||||
github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ=
|
||||
github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs=
|
||||
github.com/blevesearch/zap/v11 v11.0.9/go.mod h1:47hzinvmY2EvvJruzsSCJpro7so8L1neseaGjrtXHOY=
|
||||
github.com/blevesearch/zap/v12 v12.0.9/go.mod h1:paQuvxy7yXor+0Mx8p2KNmJgygQbQNN+W6HRfL5Hvwc=
|
||||
github.com/blevesearch/zap/v13 v13.0.1/go.mod h1:XmyNLMvMf8Z5FjLANXwUeDW3e1+o77TTGUWrth7T9WI=
|
||||
github.com/blevesearch/zap/v14 v14.0.0/go.mod h1:sUc/gPGJlFbSQ2ZUh/wGRYwkKx+Dg/5p+dd+eq6QMXk=
|
||||
github.com/blevesearch/zap/v11 v11.0.12/go.mod h1:JLfFhc8DWP01zMG/6VwEY2eAnlJsTN1vDE4S0rC5Y78=
|
||||
github.com/blevesearch/zap/v12 v12.0.12/go.mod h1:1HrB4hhPfI8u8x4SPYbluhb8xhflpPvvj8EcWImNnJY=
|
||||
github.com/blevesearch/zap/v13 v13.0.4/go.mod h1:YdB7UuG7TBWu/1dz9e2SaLp1RKfFfdJx+ulIK5HR1bA=
|
||||
github.com/blevesearch/zap/v14 v14.0.3/go.mod h1:oObAhcDHw7p1ahiTCqhRkdxdl7UA8qpvX10pSgrTMHc=
|
||||
github.com/blevesearch/zap/v15 v15.0.1/go.mod h1:ho0frqAex2ktT9cYFAxQpoQXsxb/KEfdjpx4s49rf/M=
|
||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
|
||||
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
||||
@@ -161,11 +184,12 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
|
||||
github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU=
|
||||
github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k=
|
||||
github.com/couchbase/moss v0.1.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs=
|
||||
github.com/couchbase/vellum v1.0.1/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4=
|
||||
github.com/couchbase/vellum v1.0.2/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8=
|
||||
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
|
||||
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
|
||||
@@ -180,11 +204,15 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3/go.mod h1:hEfFauPHz7+NnjR/yHJGhrKo1Za+zStgwUETx3yzqgY=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/die-net/lrucache v0.0.0-20181227122439-19a39ef22a11/go.mod h1:ew0MSjCVDdtGMjF3kzLK9hwdgF5mOE8SbYVF3Rc7mkU=
|
||||
github.com/disintegration/imaging v1.6.0/go.mod h1:xuIt+sRxDFrHS0drzXUlCJthkJ8k7lkkUojDSR247MQ=
|
||||
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
|
||||
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
|
||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||
github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
|
||||
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dyatlov/go-opengraph v0.0.0-20180429202543-816b6608b3c8 h1:6muCmMJat6z7qptVrIf/+OWPxsjAfvhw5/6t+FwEkgg=
|
||||
@@ -206,7 +234,9 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+ne
|
||||
github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||
github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI=
|
||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||
@@ -214,6 +244,8 @@ github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJn
|
||||
github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
|
||||
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
|
||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||
github.com/frankban/quicktest v1.4.0/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ=
|
||||
github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
@@ -221,6 +253,7 @@ github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05
|
||||
github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc=
|
||||
github.com/getsentry/sentry-go v0.7.0/go.mod h1:pLFpD2Y5RHIKF9Bw3KH6/68DeN2K/XBJd8awjdPnUwg=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gigawattio/window v0.0.0-20180317192513-0f5467e35573/go.mod h1:eBvb3i++NHDH4Ugo9qCvMw8t0mTSctaEa5blJbWcNxs=
|
||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
|
||||
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||
@@ -244,6 +277,9 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
|
||||
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
|
||||
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
|
||||
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||
github.com/go-redis/redis/v8 v8.0.0/go.mod h1:isLoQT/NFSP7V67lyvM9GmdvLdyZ7pEhsXvvyQtnQTo=
|
||||
github.com/go-resty/resty/v2 v2.0.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8=
|
||||
github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU=
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
@@ -291,8 +327,9 @@ github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/gomarkdown/markdown v0.0.0-20200824053859-8c8b3816f167 h1:LP/6EfrZ/LyCc+SXvANDrIJ4sP9u2NAtqyv6QknetNQ=
|
||||
github.com/gomarkdown/markdown v0.0.0-20200824053859-8c8b3816f167/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
|
||||
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/gomarkdown/markdown v0.0.0-20201113031856-722100d81a8e h1:/Y3B7hM9H3TOWPhe8eWGBGS4r09pjvS5Z0uoPADyjmU=
|
||||
github.com/gomarkdown/markdown v0.0.0-20201113031856-722100d81a8e/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
|
||||
github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
@@ -306,11 +343,13 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
|
||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gops v0.3.11 h1:TJThjZOyavVoT7C+tkjLMzcUGud9WiWHKPLRCcd2Sro=
|
||||
github.com/google/gops v0.3.11/go.mod h1:38bMPVKFh+1X106CPpbLAWtZIR1+xwgzT9gew0kn6w4=
|
||||
github.com/google/gops v0.3.14 h1:4Gpv4sABlEsVqrtKxiSynzD0//kzjTIUwUm5UgkGILI=
|
||||
github.com/google/gops v0.3.14/go.mod h1:zjT9F4XsKzazOvdVad3+Zwga79UHKziX3r9TN05rVN8=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
@@ -324,6 +363,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4
|
||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
@@ -337,12 +378,10 @@ github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORR
|
||||
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
||||
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||
github.com/gorilla/schema v1.1.0 h1:CamqUDOFUBqzrvxuz2vEwo8+SUdwsluFh7IlzJh30LY=
|
||||
github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
|
||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||
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 v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
@@ -369,12 +408,14 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN
|
||||
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
|
||||
github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||
github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4=
|
||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||
@@ -403,7 +444,7 @@ github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn
|
||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||
github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||
github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
|
||||
github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
|
||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
|
||||
@@ -417,15 +458,19 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/
|
||||
github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI=
|
||||
github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
|
||||
github.com/jamiealquiza/envy v1.1.0/go.mod h1:MP36BriGCLwEHhi1OU8E9569JNZrjWfCvzG7RsPnHus=
|
||||
github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk=
|
||||
github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk=
|
||||
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
|
||||
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
||||
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
|
||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
@@ -454,11 +499,16 @@ github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8
|
||||
github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.11.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
|
||||
github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||
github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
@@ -466,10 +516,14 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
|
||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
|
||||
github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3fo=
|
||||
github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ=
|
||||
@@ -477,6 +531,8 @@ github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0
|
||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
|
||||
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
|
||||
github.com/ledongthuc/pdf v0.0.0-20200323191019-23c5852adbd2/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs=
|
||||
github.com/levigross/exp-html v0.0.0-20120902181939-8df60c69a8f5/go.mod h1:QMe2wuKJ0o7zIVE8AqiT8rd8epmm6WDIZ2wyuBqYPzM=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
@@ -490,14 +546,16 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP
|
||||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
|
||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.7.3/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
|
||||
github.com/matrix-org/gomatrix v0.0.0-20200827122206-7dd5e2a05bcd h1:xVrqJK3xHREMNjwjljkAUaadalWc0rRbmVuQatzmgwg=
|
||||
github.com/matrix-org/gomatrix v0.0.0-20200827122206-7dd5e2a05bcd/go.mod h1:/gBX06Kw0exX1HrwmoBibFA98yBk/jxKpGVeyQbff+s=
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20200411204219-d5c18ce75048 h1:B9HaistmV+MD8/33BXmZe1zPIn+RImAFVXNNSOrwU2E=
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20200411204219-d5c18ce75048/go.mod h1:c6MxwqHD+0HvtAJjsHMIdPCiAwGiQwPRPTp69ACMg8A=
|
||||
github.com/matterbridge/discordgo v0.22.0 h1:6EnYacrU28X5Bc6BQDOqR6O8/b+588RKqoQJPUXEJAw=
|
||||
github.com/matterbridge/discordgo v0.22.0/go.mod h1:411nZYv0UMMrtppR5glXop1foboJiFAowy+42U+Ahvw=
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20201206215757-c1d86d75b9f8 h1:2iHni9FGPRRnaZrknLp+Kyr1CWbRIRUjp89TNpkqy3I=
|
||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20201206215757-c1d86d75b9f8/go.mod h1:c6MxwqHD+0HvtAJjsHMIdPCiAwGiQwPRPTp69ACMg8A=
|
||||
github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7 h1:4J2YZuY8dIYrxbLMsWGqPZb/B59ygCwSBkyZHez5PSY=
|
||||
github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7/go.mod h1:411nZYv0UMMrtppR5glXop1foboJiFAowy+42U+Ahvw=
|
||||
github.com/matterbridge/discordgo v0.22.1 h1:Wh2NXfvF4egJDxX7jEvtgxJgT/ZOqD/5tfcIsNnHJ9o=
|
||||
github.com/matterbridge/discordgo v0.22.1/go.mod h1:411nZYv0UMMrtppR5glXop1foboJiFAowy+42U+Ahvw=
|
||||
github.com/matterbridge/emoji v2.1.1-0.20191117213217-af507f6b02db+incompatible h1:oaOqwbg5HxHRxvAbd84ks0Okwoc1ISyUZ87EiVJFhGI=
|
||||
github.com/matterbridge/emoji v2.1.1-0.20191117213217-af507f6b02db+incompatible/go.mod h1:igE6rUAn3jai2wCdsjFHfhUoekjrFthoEjFObKKwSb4=
|
||||
github.com/matterbridge/go-xmpp v0.0.0-20200418225040-c8a3a57b4050 h1:kWkP1lXpkvtoNL08jkP3XQH/zvDOEXJpdCJd/DlIvMw=
|
||||
@@ -514,16 +572,17 @@ github.com/mattermost/ldap v0.0.0-20191128190019-9f62ba4b8d4d h1:2DV7VIlEv6J5R5o
|
||||
github.com/mattermost/ldap v0.0.0-20191128190019-9f62ba4b8d4d/go.mod h1:HLbgMEI5K131jpxGazJ97AxfPDt31osq36YS1oxFQPQ=
|
||||
github.com/mattermost/logr v1.0.13 h1:6F/fM3csvH6Oy5sUpJuW7YyZSzZZAhJm5VcgKMxA2P8=
|
||||
github.com/mattermost/logr v1.0.13/go.mod h1:Mt4DPu1NXMe6JxPdwCC0XBoxXmN9eXOIRPoZarU2PXs=
|
||||
github.com/mattermost/mattermost-server/v5 v5.28.1 h1:zCPvSlEYCs0REHzGxaf06Dha4UnFlhBVutH3Fthw7J0=
|
||||
github.com/mattermost/mattermost-server/v5 v5.28.1/go.mod h1:9FfgZY9Ywx64bzPBYo4mmR05ApyOxO+tr43eDhpWups=
|
||||
github.com/mattermost/mattermost-server/v5 v5.30.1 h1:vsTTMyQcsZGevgsvR1EbQM4/RAiYC0lF4gEPcXhe84w=
|
||||
github.com/mattermost/mattermost-server/v5 v5.30.1/go.mod h1:+6oGzqA4hEsoYpmFHT9j+3BtAscj7LJa/qNDxbGvrp4=
|
||||
github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0/go.mod h1:nV5bfVpT//+B1RPD2JvRnxbkLmJEYXmRaaVl15fsXjs=
|
||||
github.com/mattermost/viper v1.0.4/go.mod h1:uc5hKG9lv4/KRwPOt2c1omOyirS/UnuA2TytiZQSFHM=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw=
|
||||
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
@@ -535,6 +594,7 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0=
|
||||
github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
@@ -542,25 +602,27 @@ github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/Qd
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mattn/godown v0.0.0-20200217152941-afc959f6a561 h1:0YGo77enc6tJpXQxUeQWs9bPIQPTH1lbOmc5tgRuq4o=
|
||||
github.com/mattn/godown v0.0.0-20200217152941-afc959f6a561/go.mod h1:/ivCKurgV/bx6yqtP/Jtc2Xmrv3beCYBvlfAUl4X5g4=
|
||||
github.com/mattn/godown v0.0.1 h1:39uk50ufLVQFs0eapIJVX5fCS74a1Fs2g5f1MVqIHdE=
|
||||
github.com/mattn/godown v0.0.1/go.mod h1:/ivCKurgV/bx6yqtP/Jtc2Xmrv3beCYBvlfAUl4X5g4=
|
||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg=
|
||||
github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ=
|
||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
|
||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||
github.com/mholt/archiver/v3 v3.4.0/go.mod h1:00RcBMhNszoMqnda/5VHHL9+cBoTgj+AkLnmwr3HGrA=
|
||||
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
|
||||
github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
|
||||
github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
|
||||
github.com/minio/minio-go/v7 v7.0.4/go.mod h1:CSt2ETZNs+bIIhWTse0mcZKZWMGrFU7Er7RR0TmkDYk=
|
||||
github.com/minio/minio-go/v7 v7.0.5/go.mod h1:TA0CQCjJZHM5SJj9IjqR0NmpmQJ6bCbXifAJ3mUU6Hw=
|
||||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||
github.com/missdeer/golib v1.0.3 h1:+kz/tn1lXlPS8i+gjHHVAZC8YcgrmfiMTqELyvOwI4g=
|
||||
github.com/missdeer/golib v1.0.3/go.mod h1:Cys1ITPPZxIk2eTcQcKT3jDsBdhICAfrrw+ki/eRXxA=
|
||||
github.com/missdeer/golib v1.0.4 h1:tM7MJIPffXSmwFCTOCMjL5C7JsT5SQ+OmZwzssZQOa8=
|
||||
github.com/missdeer/golib v1.0.4/go.mod h1:mPN/UcszFq0GxKfQsZI3aFOiRjnzXCBZ392od3guGEY=
|
||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||
@@ -578,8 +640,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/monaco-io/request v1.0.4 h1:AbogA+IvPOWqyGZIFU7kSb8YS2Jv5Dnl5ncMj8cQV+o=
|
||||
github.com/monaco-io/request v1.0.4/go.mod h1:EmggwHktBsbJmCgwZXqy7o0H1NNsAstQBWZrFVd3xtQ=
|
||||
github.com/monaco-io/request v1.0.5 h1:QAJb5m1pCPZUGv3zzTZn7GlQI3q+uJWi7fH9QxDGbm4=
|
||||
github.com/monaco-io/request v1.0.5/go.mod h1:EmggwHktBsbJmCgwZXqy7o0H1NNsAstQBWZrFVd3xtQ=
|
||||
github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
|
||||
github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474 h1:oKIteTqeSpenyTrOVj5zkiyCaflLa8B+CD0324otT+o=
|
||||
github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
|
||||
@@ -606,6 +668,7 @@ github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9 h1:mp6tU1r0xLostUGL
|
||||
github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9/go.mod h1:A5SRAcpTemjGgIuBq6Kic2yHcoeUFWUinOAlMP/i9xo=
|
||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||
github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM=
|
||||
github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
|
||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
||||
@@ -613,22 +676,29 @@ github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQ
|
||||
github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20180506121414-d4647c9c7a84/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
|
||||
github.com/olivere/elastic v6.2.34+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
|
||||
github.com/olivere/elastic v6.2.35+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
|
||||
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y=
|
||||
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
|
||||
github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
|
||||
github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/oov/psd v0.0.0-20200705094106-99303fb2511f/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8=
|
||||
github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
|
||||
github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/oov/psd v0.0.0-20201002182931-74231384897f/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
@@ -641,6 +711,9 @@ github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
|
||||
github.com/otiai10/gosseract/v2 v2.2.4/go.mod h1:ahOp/kHojnOMGv1RaUnR0jwY5JVa6BYKhYAS8nbMLSo=
|
||||
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
||||
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
|
||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
@@ -652,14 +725,16 @@ github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=
|
||||
github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw=
|
||||
github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs=
|
||||
github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
|
||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
|
||||
github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||
github.com/pierrec/cmdflag v0.0.2/go.mod h1:a3zKGZ3cdQUfxjd0RGMLZr8xI3nvpJOB+m6o/1X5BmU=
|
||||
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
|
||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
github.com/pierrec/lz4/v3 v3.3.2/go.mod h1:280XNCGS8jAcG++AHdd6SeWnzyJ1w9oow2vbORyey8Q=
|
||||
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
@@ -694,7 +769,7 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
|
||||
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
|
||||
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||
github.com/prometheus/common v0.12.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
|
||||
github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
|
||||
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
@@ -702,6 +777,7 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
@@ -717,9 +793,11 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
|
||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||
github.com/rudderlabs/analytics-go v3.2.1+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30=
|
||||
github.com/russellhaering/goxmldsig v0.0.0-20180430223755-7acd5e4a6ef7/go.mod h1:Oz4y6ImuOQZxynhbSXk7btjEfNBtGlj2dcaOvXl2FSM=
|
||||
github.com/russellhaering/goxmldsig v1.1.0/go.mod h1:QK8GhXPB3+AfuCrfo0oRISa9NfzeCpWmxeGnqEpDF9o=
|
||||
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
|
||||
github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
|
||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
@@ -728,14 +806,15 @@ github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxT
|
||||
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/schollz/progressbar/v2 v2.13.2/go.mod h1:6YZjqdthH6SCZKv2rqGryrxPtfmRB/DWZxSMfCXPyD8=
|
||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||
github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
github.com/shazow/rateio v0.0.0-20150116013248-e8e00881e5c1 h1:Lx3BlDGFElJt4u/zKc9A3BuGYbQAGlEFyPuUA3jeMD0=
|
||||
github.com/shazow/rateio v0.0.0-20150116013248-e8e00881e5c1/go.mod h1:vt2jWY/3Qw1bIzle5thrJWucsLuuX9iUNnp20CqCciI=
|
||||
github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98 h1:sN07ff+PSRsUNhpSod4uGKAQ+Nc0FXsBPG9FmYMNg4w=
|
||||
github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98/go.mod h1:xkTgfD+WP+KR4HuG76oal25BBEeu5kJyi2EOsgiu/4Q=
|
||||
github.com/shazow/rateio v0.0.0-20200113175441-4461efc8bdc4 h1:zwQ1HBo5FYwn1ksMd19qBCKO8JAWE9wmHivEpkw/DvE=
|
||||
github.com/shazow/rateio v0.0.0-20200113175441-4461efc8bdc4/go.mod h1:vt2jWY/3Qw1bIzle5thrJWucsLuuX9iUNnp20CqCciI=
|
||||
github.com/shazow/ssh-chat v1.10.1 h1:ePS+ngEYqm+yUuXegDPutysqLV2WoI22XDOeRgI6CE0=
|
||||
github.com/shazow/ssh-chat v1.10.1/go.mod h1:0+7szsKylcre0vljkVnbuI6q7Odtc+QCDHxa+fFNV54=
|
||||
github.com/shirou/gopsutil v2.20.4+incompatible h1:cMT4rxS55zx9NVUnCkrmXCsEB/RNfG9SwHY9evtX8Ng=
|
||||
github.com/shirou/gopsutil v2.20.4+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
|
||||
@@ -761,6 +840,7 @@ github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
|
||||
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
|
||||
github.com/simplereach/timeutils v1.2.0/go.mod h1:VVbQDfN/FHRZa1LSqcwo4kNZ62OOyqLLGQKYB3pB0Q8=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||
@@ -768,8 +848,10 @@ github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM
|
||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 h1:lpEzuenPuO1XNTeikEmvqYFcU37GVLl8SRNblzyvGBE=
|
||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo=
|
||||
github.com/slack-go/slack v0.7.2 h1:oLy2a2YqrtoHSSxbjRhrtLDGbCKcZJwgbuQ826BWxaI=
|
||||
github.com/slack-go/slack v0.7.2/go.mod h1:FGqNzJBmxIsZURAxh2a8D21AnOVvvXZvGligs4npPUM=
|
||||
github.com/slack-go/slack v0.7.4 h1:Z+7CmUDV+ym4lYLA4NNLFIpr3+nDgViHrx8xsuXgrYs=
|
||||
github.com/slack-go/slack v0.7.4/go.mod h1:FGqNzJBmxIsZURAxh2a8D21AnOVvvXZvGligs4npPUM=
|
||||
github.com/slack-go/slack v0.8.0 h1:ANyLY5KHLV+MxLJDQum2IuHTLwbCbDtaWY405X1EU9U=
|
||||
github.com/slack-go/slack v0.8.0/go.mod h1:FGqNzJBmxIsZURAxh2a8D21AnOVvvXZvGligs4npPUM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
|
||||
@@ -806,6 +888,9 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
|
||||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||
github.com/splitio/go-client/v6 v6.0.0/go.mod h1:dTs/FpMfHb01sLso64uvudHFItiAW59ypqsK2Pbhuq4=
|
||||
github.com/splitio/go-split-commons/v2 v2.0.0/go.mod h1:iJVknIQ96Ezic+5FJ4vHYdqDfOV5w7s+w2wKjwgjFB0=
|
||||
github.com/splitio/go-toolkit/v3 v3.0.0/go.mod h1:HGgawLnM2RlM84zVRbATpPMjF7H6u9CUYG6RlpwOlOk=
|
||||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM=
|
||||
github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y=
|
||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||
@@ -813,6 +898,7 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3
|
||||
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As=
|
||||
github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
@@ -821,6 +907,8 @@ github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
@@ -837,11 +925,13 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
github.com/tylerb/graceful v1.2.15/go.mod h1:LPYTbOYmUTdabwRt0TGhLllQ0MUNbs0Y5q1WXJOI9II=
|
||||
github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||
github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||
github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
|
||||
github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
|
||||
@@ -859,6 +949,7 @@ github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50/go.mod h
|
||||
github.com/vmihailenco/msgpack/v4 v4.3.11/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
|
||||
github.com/vmihailenco/msgpack/v5 v5.0.0-beta.1/go.mod h1:xlngVLeyQ/Qi05oQxhQ+oTuqa03RjMwMfk/7/TCs+QI=
|
||||
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
|
||||
github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
|
||||
github.com/wiggin77/cfg v1.0.2 h1:NBUX+iJRr+RTncTqTNvajHwzduqbhCQjEqxLHr6Fk7A=
|
||||
github.com/wiggin77/cfg v1.0.2/go.mod h1:b3gotba2e5bXTqTW48DwIFoLc+4lWKP7WPi/CdvZ4aE=
|
||||
github.com/wiggin77/merror v1.0.2 h1:V0nH9eFp64ASyaXC+pB5WpvBoCg7NUwvaCSKdzlcHqw=
|
||||
@@ -874,6 +965,7 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7V
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xlab/treeprint v1.0.0 h1:J0TkWtiuYgtdlrkkrDLISYBQ92M+X5m4LrIIMKrbDTs=
|
||||
github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg=
|
||||
@@ -889,12 +981,12 @@ github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZ
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2 h1:UQwvu7FjUEdVYofx0U6bsc5odNE7wa5TSA0fl559GcA=
|
||||
github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2/go.mod h1:0MsIttMJIF/8Y7x0XjonJP7K99t3sR6bjj4m5S4JmqU=
|
||||
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
||||
@@ -907,24 +999,29 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
|
||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
|
||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM=
|
||||
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
|
||||
go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
|
||||
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
|
||||
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
||||
golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ=
|
||||
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
|
||||
@@ -936,7 +1033,6 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf
|
||||
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
@@ -946,9 +1042,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg=
|
||||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
|
||||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -959,14 +1057,16 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20200908183739-ae8ad444f925/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200801110659-972c09e46d76/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM=
|
||||
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20201208152932-35266b937fa6 h1:nfeHNc1nAqecKCy2FCy4HY+soOOe5sDLJ/gZLbx6GYI=
|
||||
golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
@@ -990,6 +1090,9 @@ golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 h1:xUIPaMhvROX9dhPvRCenIJtU78+lbEenGbgqB5hfHCQ=
|
||||
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -1032,11 +1135,15 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/
|
||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA=
|
||||
golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M=
|
||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
@@ -1046,8 +1153,10 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr
|
||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc=
|
||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5 h1:Lm4OryKCca1vehdsWogr9N4t7NfZxLbJoc/H0w4K4S4=
|
||||
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210201163806-010130855d6c h1:HiAZXo96zOhVhtFHchj/ojzoxCFiPrp9/j0GtS38V3g=
|
||||
golang.org/x/oauth2 v0.0.0-20210201163806-010130855d6c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@@ -1073,7 +1182,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
@@ -1114,9 +1222,14 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 h1:DvY3Zkh7KabQE/kfzMvYvKirSiguP9Q/veMtkYyf0o8=
|
||||
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201007165808-a893ed343c85/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65 h1:Qo9oJ566/Sq7N4hrGftVXs8GI2CXBCuOd4S2wHE/e0M=
|
||||
golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d h1:MiWWjyhUzZ+jvhZvloX6ZrUsdEghn8a64Upd8EMHglE=
|
||||
golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -1124,6 +1237,8 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
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/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@@ -1184,17 +1299,18 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY
|
||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200818005847-188abfa75333/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d h1:W07d4xkoAUSNOkOzdzXCdFGxT7o2rW4q8M34tB2i//k=
|
||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20201008025239-9df69603baec h1:RY2OghEV/7X1MLaecgm1mwFd3sGvUddm5pGVSxQvX0c=
|
||||
golang.org/x/tools v0.0.0-20201008025239-9df69603baec/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gomod.garykim.dev/nc-talk v0.1.5 h1:zZ/FviVpwJuhD/YrKiAvs6Z3Oew/DL/w6RKbKaanhFA=
|
||||
gomod.garykim.dev/nc-talk v0.1.5/go.mod h1:zKg8yxCk2KaTy6aPDEfRac0Jik72czX+nRsG8CZuhtc=
|
||||
gomod.garykim.dev/nc-talk v0.1.7 h1:G2qsiRcyaj5FEADQlulsBAFJHs27tPmH9VtKK+at9SM=
|
||||
gomod.garykim.dev/nc-talk v0.1.7/go.mod h1:DNucAJ6zeaumBEwV5NiYk+Eea8Ca+Q5f+plhz9F7d58=
|
||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
@@ -1263,8 +1379,8 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEY
|
||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200815001618-f69a88009b70/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20201007142714-5c0e72c5e71e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
||||
@@ -1286,6 +1402,7 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
|
||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
@@ -1316,15 +1433,16 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
|
||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.60.0 h1:P5ZzC7RJO04094NJYlEnBdFK2wwmnCAy/+7sAzvWs60=
|
||||
gopkg.in/ini.v1 v1.60.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
|
||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||
gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376 h1:sY2a+y0j4iDrajJcorb+a0hJIQ6uakU5gybjfLWHlXo=
|
||||
gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376/go.mod h1:BHKOc1m5wm8WwQkMqYBoo4vNxhmF7xg8+xhG8L+Cy3M=
|
||||
gopkg.in/olivere/elastic.v6 v6.2.34/go.mod h1:2cTT8Z+/LcArSWpCgvZqBgt3VOqXiy7v00w12Lz8bd4=
|
||||
gopkg.in/olivere/elastic.v6 v6.2.35/go.mod h1:2cTT8Z+/LcArSWpCgvZqBgt3VOqXiy7v00w12Lz8bd4=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
|
||||
@@ -16,7 +16,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
version = "1.19.0"
|
||||
version = "1.22.0"
|
||||
githash string
|
||||
|
||||
flagConfig = flag.String("conf", "matterbridge.toml", "config file")
|
||||
|
||||
@@ -103,6 +103,12 @@ ColorNicks=false
|
||||
#OPTIONAL (default empty)
|
||||
RunCommands=["PRIVMSG user hello","PRIVMSG chanserv something"]
|
||||
|
||||
#PingDelay specifies how long to wait to send a ping to the irc server.
|
||||
#You can use s for second, m for minute
|
||||
#String
|
||||
#OPTIONAL (default 1m)
|
||||
PingDelay="1m"
|
||||
|
||||
#StripMarkdown strips markdown from messages
|
||||
#OPTIONAL (default false)
|
||||
StripMarkdown=false
|
||||
@@ -187,6 +193,19 @@ ShowTopicChange=false
|
||||
#OPTIONAL (default 0)
|
||||
JoinDelay=0
|
||||
|
||||
#Use the optional RELAYMSG extension for username spoofing on IRC.
|
||||
#This requires an IRCd that supports the draft/relaymsg specification: currently this includes
|
||||
#Oragono 2.4.0+ and InspIRCd 3 with the m_relaymsg contrib module.
|
||||
#See https://github.com/42wim/matterbridge/issues/667#issuecomment-634214165 for more details.
|
||||
#Spoofed nicks will use the configured RemoteNickFormat, replacing reserved IRC characters
|
||||
#(!+%@&#$:'"?*,.) with a hyphen (-).
|
||||
#On most configurations, the RemoteNickFormat must include a separator character such as "/".
|
||||
#You should make sure that the settings here match your IRCd.
|
||||
#This option overrides ColorNicks.
|
||||
#OPTIONAL (default false)
|
||||
UseRelayMsg=false
|
||||
#RemoteNickFormat="{NICK}/{PROTOCOL}"
|
||||
|
||||
###################################################################
|
||||
#XMPP section
|
||||
###################################################################
|
||||
@@ -221,6 +240,10 @@ Nick="xmppbot"
|
||||
#OPTIONAL (default false)
|
||||
SkipTLSVerify=true
|
||||
|
||||
#Enable to use plaintext connection to your XMPP server.
|
||||
#OPTIONAL (default false)
|
||||
NoTLS=true
|
||||
|
||||
## RELOADABLE SETTINGS
|
||||
## Settings below can be reloaded by editing the file
|
||||
|
||||
@@ -287,6 +310,11 @@ StripNick=false
|
||||
#OPTIONAL (default false)
|
||||
ShowTopicChange=false
|
||||
|
||||
#Enable sending messages using a webhook instead of regular MUC messages.
|
||||
#Only works with a prosody server using mod_slack_webhook. Does not support editing.
|
||||
#OPTIONAL (default "")
|
||||
WebhookURL="https://yourdomain/prosody/msg/someid"
|
||||
|
||||
###################################################################
|
||||
#mattermost section
|
||||
###################################################################
|
||||
@@ -836,10 +864,11 @@ UseUserName=false
|
||||
# UseDiscriminator appends the `#xxxx` discriminator when used with UseUserName
|
||||
UseDiscriminator=false
|
||||
|
||||
# WebhookURL sends messages in the style of puppets.
|
||||
# This only works if you have one discord channel, if you have multiple discord channels you'll have to specify it in the gateway config
|
||||
# Example: "https://discordapp.com/api/webhooks/1234/abcd_xyzw"
|
||||
WebhookURL=""
|
||||
# AutoWebhooks automatically configures message sending in the style of puppets.
|
||||
# This is an easier alternative to manually configuring "WebhookURL" for each gateway,
|
||||
# as turning this on will automatically load or create webhooks for each channel.
|
||||
# This feature requires the "Manage Webhooks" permission (either globally or as per-channel).
|
||||
AutoWebhooks=false
|
||||
|
||||
# EditDisable disables sending of edits to other bridges
|
||||
EditDisable=false
|
||||
@@ -1221,6 +1250,9 @@ HTMLDisable=false
|
||||
## RELOADABLE SETTINGS
|
||||
## Settings below can be reloaded by editing the file
|
||||
|
||||
# UseUserName shows the username instead of the server nickname
|
||||
UseUserName=false
|
||||
|
||||
#Whether to prefix messages from other bridges to matrix with the sender's nick.
|
||||
#Useful if username overrides for incoming webhooks isn't enabled on the
|
||||
#matrix server. If you set PrefixMessagesWithNick to true, each message
|
||||
@@ -1422,7 +1454,7 @@ Server = "mumble.yourdomain.me:64738"
|
||||
# Nickname to log in as
|
||||
Nick = "matterbridge"
|
||||
|
||||
# Some servers require a password
|
||||
# Some servers require a password
|
||||
# OPTIONAL (default empty)
|
||||
Password = "serverpasswordhere"
|
||||
|
||||
@@ -1454,6 +1486,18 @@ TLSCACertificate=mumble-ca.crt
|
||||
# OPTIONAL (default false)
|
||||
SkipTLSVerify=false
|
||||
|
||||
###################################################################
|
||||
#VK
|
||||
###################################################################
|
||||
[vk.myvk]
|
||||
#Group access token
|
||||
#See https://vk.com/dev/bots_docs
|
||||
Token="Yourtokenhere"
|
||||
|
||||
#Group ID
|
||||
#For example in URL https://vk.com/public168963511 group ID is 168963511
|
||||
GroupID=123456789
|
||||
|
||||
###################################################################
|
||||
#
|
||||
# WhatsApp
|
||||
@@ -1619,7 +1663,8 @@ RemoteNickFormat="{NICK}"
|
||||
## Settings below can be reloaded by editing the file
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick.
|
||||
#The string "{USERID}" (case sensitive) will be replaced by the user ID.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
#The string "{LABEL}" (case sensitive) will be replaced by label= field of the sending bridge
|
||||
#The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge
|
||||
@@ -1694,7 +1739,7 @@ LogFile="/var/log/matterbridge.log"
|
||||
#This script will receive every incoming message and can be used to modify the Username and the Text of that message.
|
||||
#The script will have the following global variables:
|
||||
#to modify: msgUsername and msgText
|
||||
#to read: msgChannel and msgAccount
|
||||
#to read: msgUserID, msgChannel, msgAccount
|
||||
#
|
||||
#The script is reloaded on every message, so you can modify the script on the fly.
|
||||
#
|
||||
@@ -1718,9 +1763,12 @@ InMessage="example.tengo"
|
||||
#read-only:
|
||||
#inAccount, inProtocol, inChannel, inGateway, inEvent
|
||||
#outAccount, outProtocol, outChannel, outGateway, outEvent
|
||||
#msgUserID
|
||||
#
|
||||
#read-write:
|
||||
#msgText, msgUsername
|
||||
#msgText, msgUsername, msgDrop
|
||||
#
|
||||
#msgDrop is a bool which is default false, when set true this message will be dropped
|
||||
#
|
||||
#The script is reloaded on every message, so you can modify the script on the fly.
|
||||
#
|
||||
@@ -1733,7 +1781,7 @@ OutMessage="example.tengo"
|
||||
#RemoteNickFormat allows you to specify the location of a tengo (https://github.com/d5/tengo/) script.
|
||||
#The script will have the following global variables:
|
||||
#to modify: result
|
||||
#to read: channel, bridge, gateway, protocol, nick
|
||||
#to read: channel, bridge, gateway, protocol, nick, msgUserID
|
||||
#
|
||||
#The result will be set in {TENGO} in the RemoteNickFormat key of every bridge where {TENGO} is specified
|
||||
#
|
||||
@@ -1807,6 +1855,8 @@ enable=true
|
||||
# -------------------------------------------------------------------------------------------------------------------------------------
|
||||
# telegram | chatid | -123456789 | A large negative number. see https://www.linkedin.com/pulse/telegram-bots-beginners-marco-frau
|
||||
# -------------------------------------------------------------------------------------------------------------------------------------
|
||||
# vk | peerid | 2000000002 | A number that starts form 2000000000. Use --debug and send any message in chat to get PeerID in the logs
|
||||
# -------------------------------------------------------------------------------------------------------------------------------------
|
||||
# whatsapp | group JID | 48111222333-123455678999@g.us | A unique group JID. If you specify an empty string, bridge will list all the possibilities
|
||||
# | "Group Name" | "Family Chat" | if you specify a group name, the bridge will find hint the JID to specify. Names can change over time and are not stable.
|
||||
# -------------------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -1846,13 +1896,16 @@ enable=true
|
||||
#OPTIONAL - your irc / xmpp channel key
|
||||
key="yourkey"
|
||||
|
||||
# Discord specific gateway options
|
||||
[[gateway.inout]]
|
||||
account="discord.game"
|
||||
channel="mygreatgame"
|
||||
|
||||
#OPTIONAL - webhookurl only works for discord (it needs a different URL for each cahnnel)
|
||||
[gateway.inout.options]
|
||||
webhookurl="https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y"
|
||||
# WebhookURL sends messages in the style of "puppets". You must configure a webhook URL for each channel you want to bridge.
|
||||
# If you have more than one channel and don't wnat to configure each channel manually, see the "AutoWebhooks" option in the gateway config.
|
||||
# Example: "https://discord.com/api/webhooks/1234/abcd_xyzw"
|
||||
WebhookURL=""
|
||||
|
||||
[[gateway.inout]]
|
||||
account="zulip.streamchat"
|
||||
|
||||
77
vendor/github.com/Jeffail/gabs/README.md
generated
vendored
77
vendor/github.com/Jeffail/gabs/README.md
generated
vendored
@@ -7,21 +7,17 @@ It does nothing spectacular except for being fabulous.
|
||||
|
||||
https://godoc.org/github.com/Jeffail/gabs
|
||||
|
||||
## How to install:
|
||||
## Install
|
||||
|
||||
``` bash
|
||||
go get github.com/Jeffail/gabs
|
||||
```
|
||||
|
||||
## How to use
|
||||
## Use
|
||||
|
||||
### Parsing and searching JSON
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
import "github.com/Jeffail/gabs"
|
||||
|
||||
jsonParsed, err := gabs.ParseJSON([]byte(`{
|
||||
"outter":{
|
||||
"inner":{
|
||||
@@ -29,7 +25,10 @@ jsonParsed, err := gabs.ParseJSON([]byte(`{
|
||||
"value2":22
|
||||
},
|
||||
"alsoInner":{
|
||||
"value1":20
|
||||
"value1":20,
|
||||
"array1":[
|
||||
30, 40
|
||||
]
|
||||
}
|
||||
}
|
||||
}`))
|
||||
@@ -43,26 +42,26 @@ value, ok = jsonParsed.Path("outter.inner.value1").Data().(float64)
|
||||
value, ok = jsonParsed.Search("outter", "inner", "value1").Data().(float64)
|
||||
// value == 10.0, ok == true
|
||||
|
||||
gObj, err := jsonParsed.JSONPointer("/outter/alsoInner/array1/1")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
value, ok = gObj.Data().(float64)
|
||||
// value == 40.0, ok == true
|
||||
|
||||
value, ok = jsonParsed.Path("does.not.exist").Data().(float64)
|
||||
// value == 0.0, ok == false
|
||||
|
||||
exists := jsonParsed.Exists("outter", "inner", "value1")
|
||||
// exists == true
|
||||
|
||||
exists := jsonParsed.Exists("does", "not", "exist")
|
||||
// exists == false
|
||||
|
||||
exists := jsonParsed.ExistsP("does.not.exist")
|
||||
// exists == false
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
### Iterating objects
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonParsed, _ := gabs.ParseJSON([]byte(`{"object":{ "first": 1, "second": 2, "third": 3 }}`))
|
||||
|
||||
// S is shorthand for Search
|
||||
@@ -70,24 +69,25 @@ children, _ := jsonParsed.S("object").ChildrenMap()
|
||||
for key, child := range children {
|
||||
fmt.Printf("key: %v, value: %v\n", key, child.Data().(string))
|
||||
}
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
### Iterating arrays
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`))
|
||||
jsonParsed, err := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// S is shorthand for Search
|
||||
children, _ := jsonParsed.S("array").Children()
|
||||
children, err := jsonParsed.S("array").Children()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, child := range children {
|
||||
fmt.Println(child.Data().(string))
|
||||
}
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
Will print:
|
||||
@@ -108,12 +108,11 @@ objects within the array, this returns a JSON array containing the results for
|
||||
each element.
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`))
|
||||
jsonParsed, err := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println(jsonParsed.Path("array.value").String())
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
Will print:
|
||||
@@ -125,8 +124,6 @@ Will print:
|
||||
### Generating JSON
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonObj := gabs.New()
|
||||
// or gabs.Consume(jsonObject) to work on an existing map[string]interface{}
|
||||
|
||||
@@ -135,8 +132,6 @@ jsonObj.SetP(20, "outter.inner.value2")
|
||||
jsonObj.Set(30, "outter", "inner2", "value3")
|
||||
|
||||
fmt.Println(jsonObj.String())
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
Will print:
|
||||
@@ -148,11 +143,7 @@ Will print:
|
||||
To pretty-print:
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
fmt.Println(jsonObj.StringIndent("", " "))
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
Will print:
|
||||
@@ -174,8 +165,6 @@ Will print:
|
||||
### Generating Arrays
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonObj := gabs.New()
|
||||
|
||||
jsonObj.Array("foo", "array")
|
||||
@@ -186,8 +175,6 @@ jsonObj.ArrayAppend(20, "foo", "array")
|
||||
jsonObj.ArrayAppend(30, "foo", "array")
|
||||
|
||||
fmt.Println(jsonObj.String())
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
Will print:
|
||||
@@ -199,8 +186,6 @@ Will print:
|
||||
Working with arrays by index:
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonObj := gabs.New()
|
||||
|
||||
// Create an array with the length of 3
|
||||
@@ -217,8 +202,6 @@ jsonObj.S("foo").Index(2).SetIndex(2, 1)
|
||||
jsonObj.S("foo").Index(2).SetIndex(3, 2)
|
||||
|
||||
fmt.Println(jsonObj.String())
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
Will print:
|
||||
@@ -232,8 +215,6 @@ Will print:
|
||||
This is the easiest part:
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonParsedObj, _ := gabs.ParseJSON([]byte(`{
|
||||
"outter":{
|
||||
"values":{
|
||||
@@ -246,15 +227,11 @@ jsonParsedObj, _ := gabs.ParseJSON([]byte(`{
|
||||
|
||||
jsonOutput := jsonParsedObj.String()
|
||||
// Becomes `{"outter":{"values":{"first":10,"second":11}},"outter2":"hello world"}`
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
And to serialize a specific segment is as simple as:
|
||||
|
||||
``` go
|
||||
...
|
||||
|
||||
jsonParsedObj := gabs.ParseJSON([]byte(`{
|
||||
"outter":{
|
||||
"values":{
|
||||
@@ -267,8 +244,6 @@ jsonParsedObj := gabs.ParseJSON([]byte(`{
|
||||
|
||||
jsonOutput := jsonParsedObj.Search("outter").String()
|
||||
// Becomes `{"values":{"first":10,"second":11}}`
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
### Merge two containers
|
||||
|
||||
344
vendor/github.com/Jeffail/gabs/gabs.go
generated
vendored
344
vendor/github.com/Jeffail/gabs/gabs.go
generated
vendored
@@ -20,58 +20,85 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
// Package gabs implements a simplified wrapper around creating and parsing JSON.
|
||||
// Package gabs implements a simplified wrapper around creating and parsing
|
||||
// unknown or dynamic JSON.
|
||||
package gabs
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
var (
|
||||
// ErrOutOfBounds - Index out of bounds.
|
||||
// ErrOutOfBounds indicates an index was out of bounds.
|
||||
ErrOutOfBounds = errors.New("out of bounds")
|
||||
|
||||
// ErrNotObjOrArray - The target is not an object or array type.
|
||||
// ErrNotObjOrArray is returned when a target is not an object or array type
|
||||
// but needs to be for the intended operation.
|
||||
ErrNotObjOrArray = errors.New("not an object or array")
|
||||
|
||||
// ErrNotObj - The target is not an object type.
|
||||
// ErrNotObj is returned when a target is not an object but needs to be for
|
||||
// the intended operation.
|
||||
ErrNotObj = errors.New("not an object")
|
||||
|
||||
// ErrNotArray - The target is not an array type.
|
||||
// ErrNotArray is returned when a target is not an array but needs to be for
|
||||
// the intended operation.
|
||||
ErrNotArray = errors.New("not an array")
|
||||
|
||||
// ErrPathCollision - Creating a path failed because an element collided with an existing value.
|
||||
// ErrPathCollision is returned when creating a path failed because an
|
||||
// element collided with an existing value.
|
||||
ErrPathCollision = errors.New("encountered value collision whilst building path")
|
||||
|
||||
// ErrInvalidInputObj - The input value was not a map[string]interface{}.
|
||||
// ErrInvalidInputObj is returned when the input value was not a
|
||||
// map[string]interface{}.
|
||||
ErrInvalidInputObj = errors.New("invalid input object")
|
||||
|
||||
// ErrInvalidInputText - The input data could not be parsed.
|
||||
// ErrInvalidInputText is returned when the input data could not be parsed.
|
||||
ErrInvalidInputText = errors.New("input text could not be parsed")
|
||||
|
||||
// ErrInvalidPath - The filepath was not valid.
|
||||
// ErrInvalidPath is returned when the filepath was not valid.
|
||||
ErrInvalidPath = errors.New("invalid file path")
|
||||
|
||||
// ErrInvalidBuffer - The input buffer contained an invalid JSON string
|
||||
// ErrInvalidBuffer is returned when the input buffer contained an invalid
|
||||
// JSON string.
|
||||
ErrInvalidBuffer = errors.New("input buffer contained invalid JSON")
|
||||
)
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Container - an internal structure that holds a reference to the core interface map of the parsed
|
||||
// json. Use this container to move context.
|
||||
func resolveJSONPointerHierarchy(path string) ([]string, error) {
|
||||
if len(path) < 1 {
|
||||
return nil, errors.New("failed to resolve JSON pointer: path must not be empty")
|
||||
}
|
||||
if path[0] != '/' {
|
||||
return nil, errors.New("failed to resolve JSON pointer: path must begin with '/'")
|
||||
}
|
||||
hierarchy := strings.Split(path, "/")[1:]
|
||||
for i, v := range hierarchy {
|
||||
v = strings.Replace(v, "~1", "/", -1)
|
||||
v = strings.Replace(v, "~0", "~", -1)
|
||||
hierarchy[i] = v
|
||||
}
|
||||
return hierarchy, nil
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Container references a specific element within a JSON structure.
|
||||
type Container struct {
|
||||
object interface{}
|
||||
}
|
||||
|
||||
// Data - Return the contained data as an interface{}.
|
||||
// Data returns the underlying interface{} of the target element in the JSON
|
||||
// structure.
|
||||
func (g *Container) Data() interface{} {
|
||||
if g == nil {
|
||||
return nil
|
||||
@@ -79,17 +106,18 @@ func (g *Container) Data() interface{} {
|
||||
return g.object
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Path - Search for a value using dot notation.
|
||||
// Path searches the JSON structure following a path in dot notation.
|
||||
func (g *Container) Path(path string) *Container {
|
||||
return g.Search(strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// Search - Attempt to find and return an object within the JSON structure by specifying the
|
||||
// hierarchy of field names to locate the target. If the search encounters an array and has not
|
||||
// reached the end target then it will iterate each object of the array for the target and return
|
||||
// all of the results in a JSON array.
|
||||
// Search attempts to find and return an object within the JSON structure by
|
||||
// following a provided hierarchy of field names to locate the target. If the
|
||||
// search encounters an array and has not reached the end target then it will
|
||||
// iterate each object of the array for the target and return all of the results
|
||||
// in a JSON array.
|
||||
func (g *Container) Search(hierarchy ...string) *Container {
|
||||
var object interface{}
|
||||
|
||||
@@ -120,22 +148,55 @@ func (g *Container) Search(hierarchy ...string) *Container {
|
||||
return &Container{object}
|
||||
}
|
||||
|
||||
// S - Shorthand method, does the same thing as Search.
|
||||
// JSONPointer parses a JSON pointer path (https://tools.ietf.org/html/rfc6901)
|
||||
// and either returns a *gabs.Container containing the result or an error if the
|
||||
// referenced item could not be found.
|
||||
func (g *Container) JSONPointer(path string) (*Container, error) {
|
||||
hierarchy, err := resolveJSONPointerHierarchy(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
object := g.Data()
|
||||
for target := 0; target < len(hierarchy); target++ {
|
||||
pathSeg := hierarchy[target]
|
||||
if mmap, ok := object.(map[string]interface{}); ok {
|
||||
object, ok = mmap[pathSeg]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
|
||||
}
|
||||
} else if marray, ok := object.([]interface{}); ok {
|
||||
index, err := strconv.Atoi(pathSeg)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to resolve JSON pointer: could not parse index '%v' value '%v' into array index: %v", target, pathSeg, err)
|
||||
}
|
||||
if len(marray) <= index {
|
||||
return nil, fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' exceeded target array size of '%v'", target, pathSeg, len(marray))
|
||||
}
|
||||
object = marray[index]
|
||||
} else {
|
||||
return &Container{nil}, fmt.Errorf("failed to resolve JSON pointer: index '%v' field '%v' was not found", target, pathSeg)
|
||||
}
|
||||
}
|
||||
return &Container{object}, nil
|
||||
}
|
||||
|
||||
// S is a shorthand alias for Search.
|
||||
func (g *Container) S(hierarchy ...string) *Container {
|
||||
return g.Search(hierarchy...)
|
||||
}
|
||||
|
||||
// Exists - Checks whether a path exists.
|
||||
// Exists checks whether a path exists.
|
||||
func (g *Container) Exists(hierarchy ...string) bool {
|
||||
return g.Search(hierarchy...) != nil
|
||||
}
|
||||
|
||||
// ExistsP - Checks whether a dot notation path exists.
|
||||
// ExistsP checks whether a dot notation path exists.
|
||||
func (g *Container) ExistsP(path string) bool {
|
||||
return g.Exists(strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// Index - Attempt to find and return an object within a JSON array by index.
|
||||
// Index attempts to find and return an element within a JSON array by an index.
|
||||
func (g *Container) Index(index int) *Container {
|
||||
if array, ok := g.Data().([]interface{}); ok {
|
||||
if index >= len(array) {
|
||||
@@ -146,9 +207,9 @@ func (g *Container) Index(index int) *Container {
|
||||
return &Container{nil}
|
||||
}
|
||||
|
||||
// Children - Return a slice of all the children of the array. This also works for objects, however,
|
||||
// the children returned for an object will NOT be in order and you lose the names of the returned
|
||||
// objects this way.
|
||||
// Children returns a slice of all children of an array element. This also works
|
||||
// for objects, however, the children returned for an object will be in a random
|
||||
// order and you lose the names of the returned objects this way.
|
||||
func (g *Container) Children() ([]*Container, error) {
|
||||
if array, ok := g.Data().([]interface{}); ok {
|
||||
children := make([]*Container, len(array))
|
||||
@@ -167,7 +228,7 @@ func (g *Container) Children() ([]*Container, error) {
|
||||
return nil, ErrNotObjOrArray
|
||||
}
|
||||
|
||||
// ChildrenMap - Return a map of all the children of an object.
|
||||
// ChildrenMap returns a map of all the children of an object element.
|
||||
func (g *Container) ChildrenMap() (map[string]*Container, error) {
|
||||
if mmap, ok := g.Data().(map[string]interface{}); ok {
|
||||
children := map[string]*Container{}
|
||||
@@ -179,11 +240,11 @@ func (g *Container) ChildrenMap() (map[string]*Container, error) {
|
||||
return nil, ErrNotObj
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Set - Set the value of a field at a JSON path, any parts of the path that do not exist will be
|
||||
// constructed, and if a collision occurs with a non object type whilst iterating the path an error
|
||||
// is returned.
|
||||
// Set the value of a field at a JSON path, any parts of the path that do not
|
||||
// exist will be constructed, and if a collision occurs with a non object type
|
||||
// whilst iterating the path an error is returned.
|
||||
func (g *Container) Set(value interface{}, path ...string) (*Container, error) {
|
||||
if len(path) == 0 {
|
||||
g.object = value
|
||||
@@ -209,12 +270,14 @@ func (g *Container) Set(value interface{}, path ...string) (*Container, error) {
|
||||
return &Container{object}, nil
|
||||
}
|
||||
|
||||
// SetP - Does the same as Set, but using a dot notation JSON path.
|
||||
// SetP sets the value of a field at a JSON path using dot notation, any parts
|
||||
// of the path that do not exist will be constructed, and if a collision occurs
|
||||
// with a non object type whilst iterating the path an error is returned.
|
||||
func (g *Container) SetP(value interface{}, path string) (*Container, error) {
|
||||
return g.Set(value, strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// SetIndex - Set a value of an array element based on the index.
|
||||
// SetIndex attempts to set a value of an array element based on an index.
|
||||
func (g *Container) SetIndex(value interface{}, index int) (*Container, error) {
|
||||
if array, ok := g.Data().([]interface{}); ok {
|
||||
if index >= len(array) {
|
||||
@@ -226,60 +289,112 @@ func (g *Container) SetIndex(value interface{}, index int) (*Container, error) {
|
||||
return &Container{nil}, ErrNotArray
|
||||
}
|
||||
|
||||
// Object - Create a new JSON object at a path. Returns an error if the path contains a collision
|
||||
// with a non object type.
|
||||
// SetJSONPointer parses a JSON pointer path
|
||||
// (https://tools.ietf.org/html/rfc6901) and sets the leaf to a value. Returns
|
||||
// an error if the pointer could not be resolved due to missing fields.
|
||||
func (g *Container) SetJSONPointer(value interface{}, path string) error {
|
||||
hierarchy, err := resolveJSONPointerHierarchy(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(hierarchy) == 0 {
|
||||
g.object = value
|
||||
return nil
|
||||
}
|
||||
|
||||
object := g.object
|
||||
|
||||
for target := 0; target < len(hierarchy); target++ {
|
||||
pathSeg := hierarchy[target]
|
||||
if mmap, ok := object.(map[string]interface{}); ok {
|
||||
if target == len(hierarchy)-1 {
|
||||
object = value
|
||||
mmap[pathSeg] = object
|
||||
} else if object = mmap[pathSeg]; object == nil {
|
||||
return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
|
||||
}
|
||||
} else if marray, ok := object.([]interface{}); ok {
|
||||
index, err := strconv.Atoi(pathSeg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to resolve JSON pointer: could not parse index '%v' value '%v' into array index: %v", target, pathSeg, err)
|
||||
}
|
||||
if len(marray) <= index {
|
||||
return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' exceeded target array size of '%v'", target, pathSeg, len(marray))
|
||||
}
|
||||
if target == len(hierarchy)-1 {
|
||||
object = value
|
||||
marray[index] = object
|
||||
} else if object = marray[index]; object == nil {
|
||||
return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
|
||||
}
|
||||
} else {
|
||||
return fmt.Errorf("failed to resolve JSON pointer: index '%v' value '%v' was not found", target, pathSeg)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Object creates a new JSON object at a target path. Returns an error if the
|
||||
// path contains a collision with a non object type.
|
||||
func (g *Container) Object(path ...string) (*Container, error) {
|
||||
return g.Set(map[string]interface{}{}, path...)
|
||||
}
|
||||
|
||||
// ObjectP - Does the same as Object, but using a dot notation JSON path.
|
||||
// ObjectP creates a new JSON object at a target path using dot notation.
|
||||
// Returns an error if the path contains a collision with a non object type.
|
||||
func (g *Container) ObjectP(path string) (*Container, error) {
|
||||
return g.Object(strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// ObjectI - Create a new JSON object at an array index. Returns an error if the object is not an
|
||||
// array or the index is out of bounds.
|
||||
// ObjectI creates a new JSON object at an array index. Returns an error if the
|
||||
// object is not an array or the index is out of bounds.
|
||||
func (g *Container) ObjectI(index int) (*Container, error) {
|
||||
return g.SetIndex(map[string]interface{}{}, index)
|
||||
}
|
||||
|
||||
// Array - Create a new JSON array at a path. Returns an error if the path contains a collision with
|
||||
// a non object type.
|
||||
// Array creates a new JSON array at a path. Returns an error if the path
|
||||
// contains a collision with a non object type.
|
||||
func (g *Container) Array(path ...string) (*Container, error) {
|
||||
return g.Set([]interface{}{}, path...)
|
||||
}
|
||||
|
||||
// ArrayP - Does the same as Array, but using a dot notation JSON path.
|
||||
// ArrayP creates a new JSON array at a path using dot notation. Returns an
|
||||
// error if the path contains a collision with a non object type.
|
||||
func (g *Container) ArrayP(path string) (*Container, error) {
|
||||
return g.Array(strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// ArrayI - Create a new JSON array at an array index. Returns an error if the object is not an
|
||||
// array or the index is out of bounds.
|
||||
// ArrayI creates a new JSON array within an array at an index. Returns an error
|
||||
// if the element is not an array or the index is out of bounds.
|
||||
func (g *Container) ArrayI(index int) (*Container, error) {
|
||||
return g.SetIndex([]interface{}{}, index)
|
||||
}
|
||||
|
||||
// ArrayOfSize - Create a new JSON array of a particular size at a path. Returns an error if the
|
||||
// path contains a collision with a non object type.
|
||||
// ArrayOfSize creates a new JSON array of a particular size at a path. Returns
|
||||
// an error if the path contains a collision with a non object type.
|
||||
func (g *Container) ArrayOfSize(size int, path ...string) (*Container, error) {
|
||||
a := make([]interface{}, size)
|
||||
return g.Set(a, path...)
|
||||
}
|
||||
|
||||
// ArrayOfSizeP - Does the same as ArrayOfSize, but using a dot notation JSON path.
|
||||
// ArrayOfSizeP creates a new JSON array of a particular size at a path using
|
||||
// dot notation. Returns an error if the path contains a collision with a non
|
||||
// object type.
|
||||
func (g *Container) ArrayOfSizeP(size int, path string) (*Container, error) {
|
||||
return g.ArrayOfSize(size, strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// ArrayOfSizeI - Create a new JSON array of a particular size at an array index. Returns an error
|
||||
// if the object is not an array or the index is out of bounds.
|
||||
// ArrayOfSizeI create a new JSON array of a particular size within an array at
|
||||
// an index. Returns an error if the element is not an array or the index is out
|
||||
// of bounds.
|
||||
func (g *Container) ArrayOfSizeI(size, index int) (*Container, error) {
|
||||
a := make([]interface{}, size)
|
||||
return g.SetIndex(a, index)
|
||||
}
|
||||
|
||||
// Delete - Delete an element at a JSON path, an error is returned if the element does not exist.
|
||||
// Delete an element at a path, an error is returned if the element does not
|
||||
// exist.
|
||||
func (g *Container) Delete(path ...string) error {
|
||||
var object interface{}
|
||||
|
||||
@@ -304,45 +419,40 @@ func (g *Container) Delete(path ...string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteP - Does the same as Delete, but using a dot notation JSON path.
|
||||
// DeleteP deletes an element at a path using dot notation, an error is returned
|
||||
// if the element does not exist.
|
||||
func (g *Container) DeleteP(path string) error {
|
||||
return g.Delete(strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// Merge - Merges two gabs-containers
|
||||
func (g *Container) Merge(toMerge *Container) error {
|
||||
// MergeFn merges two objects using a provided function to resolve collisions.
|
||||
//
|
||||
// The collision function receives two interface{} arguments, destination (the
|
||||
// original object) and source (the object being merged into the destination).
|
||||
// Which ever value is returned becomes the new value in the destination object
|
||||
// at the location of the collision.
|
||||
func (g *Container) MergeFn(source *Container, collisionFn func(destination, source interface{}) interface{}) error {
|
||||
var recursiveFnc func(map[string]interface{}, []string) error
|
||||
recursiveFnc = func(mmap map[string]interface{}, path []string) error {
|
||||
for key, value := range mmap {
|
||||
newPath := append(path, key)
|
||||
if g.Exists(newPath...) {
|
||||
target := g.Search(newPath...)
|
||||
existingData := g.Search(newPath...).Data()
|
||||
switch t := value.(type) {
|
||||
case map[string]interface{}:
|
||||
switch targetV := target.Data().(type) {
|
||||
switch existingVal := existingData.(type) {
|
||||
case map[string]interface{}:
|
||||
if err := recursiveFnc(t, newPath); err != nil {
|
||||
return err
|
||||
}
|
||||
case []interface{}:
|
||||
g.Set(append(targetV, t), newPath...)
|
||||
default:
|
||||
newSlice := append([]interface{}{}, targetV)
|
||||
g.Set(append(newSlice, t), newPath...)
|
||||
}
|
||||
case []interface{}:
|
||||
for _, valueOfSlice := range t {
|
||||
if err := g.ArrayAppend(valueOfSlice, newPath...); err != nil {
|
||||
if _, err := g.Set(collisionFn(existingVal, t), newPath...); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
default:
|
||||
switch targetV := target.Data().(type) {
|
||||
case []interface{}:
|
||||
g.Set(append(targetV, t), newPath...)
|
||||
default:
|
||||
newSlice := append([]interface{}{}, targetV)
|
||||
g.Set(append(newSlice, t), newPath...)
|
||||
if _, err := g.Set(collisionFn(existingData, t), newPath...); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -354,21 +464,48 @@ func (g *Container) Merge(toMerge *Container) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if mmap, ok := toMerge.Data().(map[string]interface{}); ok {
|
||||
if mmap, ok := source.Data().(map[string]interface{}); ok {
|
||||
return recursiveFnc(mmap, []string{})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
// Merge a source object into an existing destination object. When a collision
|
||||
// is found within the merged structures (both a source and destination object
|
||||
// contain the same non-object keys) the result will be an array containing both
|
||||
// values, where values that are already arrays will be expanded into the
|
||||
// resulting array.
|
||||
//
|
||||
// It is possible to merge structures will different collision behaviours with
|
||||
// MergeFn.
|
||||
func (g *Container) Merge(source *Container) error {
|
||||
return g.MergeFn(source, func(dest, source interface{}) interface{} {
|
||||
destArr, destIsArray := dest.([]interface{})
|
||||
sourceArr, sourceIsArray := source.([]interface{})
|
||||
if destIsArray {
|
||||
if sourceIsArray {
|
||||
return append(destArr, sourceArr...)
|
||||
}
|
||||
return append(destArr, source)
|
||||
}
|
||||
if sourceIsArray {
|
||||
return append(append([]interface{}{}, dest), sourceArr...)
|
||||
}
|
||||
return []interface{}{dest, source}
|
||||
})
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
Array modification/search - Keeping these options simple right now, no need for anything more
|
||||
complicated since you can just cast to []interface{}, modify and then reassign with Set.
|
||||
Array modification/search - Keeping these options simple right now, no need for
|
||||
anything more complicated since you can just cast to []interface{}, modify and
|
||||
then reassign with Set.
|
||||
*/
|
||||
|
||||
// ArrayAppend - Append a value onto a JSON array. If the target is not a JSON array then it will be
|
||||
// converted into one, with its contents as the first element of the array.
|
||||
// ArrayAppend attempts to append a value onto a JSON array at a path. If the
|
||||
// target is not a JSON array then it will be converted into one, with its
|
||||
// original contents set to the first element of the array.
|
||||
func (g *Container) ArrayAppend(value interface{}, path ...string) error {
|
||||
if array, ok := g.Search(path...).Data().([]interface{}); ok {
|
||||
array = append(array, value)
|
||||
@@ -386,12 +523,15 @@ func (g *Container) ArrayAppend(value interface{}, path ...string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// ArrayAppendP - Append a value onto a JSON array using a dot notation JSON path.
|
||||
// ArrayAppendP attempts to append a value onto a JSON array at a path using dot
|
||||
// notation. If the target is not a JSON array then it will be converted into
|
||||
// one, with its original contents set to the first element of the array.
|
||||
func (g *Container) ArrayAppendP(value interface{}, path string) error {
|
||||
return g.ArrayAppend(value, strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// ArrayRemove - Remove an element from a JSON array.
|
||||
// ArrayRemove attempts to remove an element identified by an index from a JSON
|
||||
// array at a path.
|
||||
func (g *Container) ArrayRemove(index int, path ...string) error {
|
||||
if index < 0 {
|
||||
return ErrOutOfBounds
|
||||
@@ -409,12 +549,14 @@ func (g *Container) ArrayRemove(index int, path ...string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// ArrayRemoveP - Remove an element from a JSON array using a dot notation JSON path.
|
||||
// ArrayRemoveP attempts to remove an element identified by an index from a JSON
|
||||
// array at a path using dot notation.
|
||||
func (g *Container) ArrayRemoveP(index int, path string) error {
|
||||
return g.ArrayRemove(index, strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// ArrayElement - Access an element from a JSON array.
|
||||
// ArrayElement attempts to access an element by an index from a JSON array at a
|
||||
// path.
|
||||
func (g *Container) ArrayElement(index int, path ...string) (*Container, error) {
|
||||
if index < 0 {
|
||||
return &Container{nil}, ErrOutOfBounds
|
||||
@@ -429,12 +571,13 @@ func (g *Container) ArrayElement(index int, path ...string) (*Container, error)
|
||||
return &Container{nil}, ErrOutOfBounds
|
||||
}
|
||||
|
||||
// ArrayElementP - Access an element from a JSON array using a dot notation JSON path.
|
||||
// ArrayElementP attempts to access an element by an index from a JSON array at
|
||||
// a path using dot notation.
|
||||
func (g *Container) ArrayElementP(index int, path string) (*Container, error) {
|
||||
return g.ArrayElement(index, strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
// ArrayCount - Count the number of elements in a JSON array.
|
||||
// ArrayCount counts the number of elements in a JSON array at a path.
|
||||
func (g *Container) ArrayCount(path ...string) (int, error) {
|
||||
if array, ok := g.Search(path...).Data().([]interface{}); ok {
|
||||
return len(array), nil
|
||||
@@ -442,14 +585,15 @@ func (g *Container) ArrayCount(path ...string) (int, error) {
|
||||
return 0, ErrNotArray
|
||||
}
|
||||
|
||||
// ArrayCountP - Count the number of elements in a JSON array using a dot notation JSON path.
|
||||
// ArrayCountP counts the number of elements in a JSON array at a path using dot
|
||||
// notation.
|
||||
func (g *Container) ArrayCountP(path string) (int, error) {
|
||||
return g.ArrayCount(strings.Split(path, ".")...)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Bytes - Converts the contained object back to a JSON []byte blob.
|
||||
// Bytes marshals an element to a JSON []byte blob.
|
||||
func (g *Container) Bytes() []byte {
|
||||
if g.Data() != nil {
|
||||
if bytes, err := json.Marshal(g.object); err == nil {
|
||||
@@ -459,7 +603,8 @@ func (g *Container) Bytes() []byte {
|
||||
return []byte("{}")
|
||||
}
|
||||
|
||||
// BytesIndent - Converts the contained object to a JSON []byte blob formatted with prefix, indent.
|
||||
// BytesIndent marshals an element to a JSON []byte blob formatted with a prefix
|
||||
// and indent string.
|
||||
func (g *Container) BytesIndent(prefix string, indent string) []byte {
|
||||
if g.object != nil {
|
||||
if bytes, err := json.MarshalIndent(g.object, prefix, indent); err == nil {
|
||||
@@ -469,12 +614,13 @@ func (g *Container) BytesIndent(prefix string, indent string) []byte {
|
||||
return []byte("{}")
|
||||
}
|
||||
|
||||
// String - Converts the contained object to a JSON formatted string.
|
||||
// String marshals an element to a JSON formatted string.
|
||||
func (g *Container) String() string {
|
||||
return string(g.Bytes())
|
||||
}
|
||||
|
||||
// StringIndent - Converts the contained object back to a JSON formatted string with prefix, indent.
|
||||
// StringIndent marshals an element to a JSON string formatted with a prefix and
|
||||
// indent string.
|
||||
func (g *Container) StringIndent(prefix string, indent string) string {
|
||||
return string(g.BytesIndent(prefix, indent))
|
||||
}
|
||||
@@ -496,10 +642,9 @@ func EncodeOptIndent(prefix string, indent string) EncodeOpt {
|
||||
}
|
||||
}
|
||||
|
||||
// EncodeJSON - Encodes the contained object back to a JSON formatted []byte
|
||||
// using a variant list of modifier functions for the encoder being used.
|
||||
// Functions for modifying the output are prefixed with EncodeOpt, e.g.
|
||||
// EncodeOptHTMLEscape.
|
||||
// EncodeJSON marshals an element to a JSON formatted []byte using a variant
|
||||
// list of modifier functions for the encoder being used. Functions for
|
||||
// modifying the output are prefixed with EncodeOpt, e.g. EncodeOptHTMLEscape.
|
||||
func (g *Container) EncodeJSON(encodeOpts ...EncodeOpt) []byte {
|
||||
var b bytes.Buffer
|
||||
encoder := json.NewEncoder(&b)
|
||||
@@ -517,17 +662,18 @@ func (g *Container) EncodeJSON(encodeOpts ...EncodeOpt) []byte {
|
||||
return result
|
||||
}
|
||||
|
||||
// New - Create a new gabs JSON object.
|
||||
// New creates a new gabs JSON object.
|
||||
func New() *Container {
|
||||
return &Container{map[string]interface{}{}}
|
||||
}
|
||||
|
||||
// Consume - Gobble up an already converted JSON object, or a fresh map[string]interface{} object.
|
||||
// Consume an already unmarshalled JSON object (or a new map[string]interface{})
|
||||
// into a *Container.
|
||||
func Consume(root interface{}) (*Container, error) {
|
||||
return &Container{root}, nil
|
||||
}
|
||||
|
||||
// ParseJSON - Convert a string into a representation of the parsed JSON.
|
||||
// ParseJSON unmarshals a JSON byte slice into a *Container.
|
||||
func ParseJSON(sample []byte) (*Container, error) {
|
||||
var gabs Container
|
||||
|
||||
@@ -538,7 +684,7 @@ func ParseJSON(sample []byte) (*Container, error) {
|
||||
return &gabs, nil
|
||||
}
|
||||
|
||||
// ParseJSONDecoder - Convert a json.Decoder into a representation of the parsed JSON.
|
||||
// ParseJSONDecoder applies a json.Decoder to a *Container.
|
||||
func ParseJSONDecoder(decoder *json.Decoder) (*Container, error) {
|
||||
var gabs Container
|
||||
|
||||
@@ -549,7 +695,7 @@ func ParseJSONDecoder(decoder *json.Decoder) (*Container, error) {
|
||||
return &gabs, nil
|
||||
}
|
||||
|
||||
// ParseJSONFile - Read a file and convert into a representation of the parsed JSON.
|
||||
// ParseJSONFile reads a file and unmarshals the contents into a *Container.
|
||||
func ParseJSONFile(path string) (*Container, error) {
|
||||
if len(path) > 0 {
|
||||
cBytes, err := ioutil.ReadFile(path)
|
||||
@@ -567,7 +713,7 @@ func ParseJSONFile(path string) (*Container, error) {
|
||||
return nil, ErrInvalidPath
|
||||
}
|
||||
|
||||
// ParseJSONBuffer - Read the contents of a buffer into a representation of the parsed JSON.
|
||||
// ParseJSONBuffer reads a buffer and unmarshals the contents into a *Container.
|
||||
func ParseJSONBuffer(buffer io.Reader) (*Container, error) {
|
||||
var gabs Container
|
||||
jsonDecoder := json.NewDecoder(buffer)
|
||||
@@ -578,4 +724,4 @@ func ParseJSONBuffer(buffer io.Reader) (*Container, error) {
|
||||
return &gabs, nil
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
1
vendor/github.com/Jeffail/gabs/go.mod
generated
vendored
Normal file
1
vendor/github.com/Jeffail/gabs/go.mod
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
module github.com/Jeffail/gabs
|
||||
5
vendor/github.com/Rhymen/go-whatsapp/binary/token/token.go
generated
vendored
5
vendor/github.com/Rhymen/go-whatsapp/binary/token/token.go
generated
vendored
@@ -24,7 +24,10 @@ var SingleByteTokens = [...]string{"", "", "", "200", "400", "404", "500", "501"
|
||||
"invite", "gif", "vcard", "frequent", "privacy", "blacklist", "whitelist",
|
||||
"verify", "location", "document", "elapsed", "revoke_invite", "expiration",
|
||||
"unsubscribe", "disable", "vname", "old_jid", "new_jid", "announcement",
|
||||
"locked", "prop", "label", "color", "call", "offer", "call-id"}
|
||||
"locked", "prop", "label", "color", "call", "offer", "call-id",
|
||||
"quick_reply", "sticker", "pay_t", "accept", "reject", "sticker_pack",
|
||||
"invalid", "canceled", "missed", "connected", "result", "audio",
|
||||
"video", "recent"}
|
||||
|
||||
var doubleByteTokens = [...]string{}
|
||||
|
||||
|
||||
82
vendor/github.com/Rhymen/go-whatsapp/conn.go
generated
vendored
82
vendor/github.com/Rhymen/go-whatsapp/conn.go
generated
vendored
@@ -116,31 +116,59 @@ Creates a new connection with a given timeout. The websocket connection to the W
|
||||
The goroutine for handling incoming messages is started
|
||||
*/
|
||||
func NewConn(timeout time.Duration) (*Conn, error) {
|
||||
wac := &Conn{
|
||||
handler: make([]Handler, 0),
|
||||
msgCount: 0,
|
||||
msgTimeout: timeout,
|
||||
Store: newStore(),
|
||||
|
||||
longClientName: "github.com/rhymen/go-whatsapp",
|
||||
shortClientName: "go-whatsapp",
|
||||
clientVersion: "0.1.0",
|
||||
}
|
||||
return wac, wac.connect()
|
||||
return NewConnWithOptions(&Options{
|
||||
Timeout: timeout,
|
||||
})
|
||||
}
|
||||
|
||||
// NewConnWithProxy Create a new connect with a given timeout and a http proxy.
|
||||
func NewConnWithProxy(timeout time.Duration, proxy func(*http.Request) (*url.URL, error)) (*Conn, error) {
|
||||
return NewConnWithOptions(&Options{
|
||||
Timeout: timeout,
|
||||
Proxy: proxy,
|
||||
})
|
||||
}
|
||||
|
||||
// NewConnWithOptions Create a new connect with a given options.
|
||||
type Options struct {
|
||||
Proxy func(*http.Request) (*url.URL, error)
|
||||
Timeout time.Duration
|
||||
Handler []Handler
|
||||
ShortClientName string
|
||||
LongClientName string
|
||||
ClientVersion string
|
||||
Store *Store
|
||||
}
|
||||
func NewConnWithOptions(opt *Options) (*Conn, error) {
|
||||
if opt == nil {
|
||||
return nil, ErrOptionsNotProvided
|
||||
}
|
||||
wac := &Conn{
|
||||
handler: make([]Handler, 0),
|
||||
msgCount: 0,
|
||||
msgTimeout: timeout,
|
||||
msgTimeout: opt.Timeout,
|
||||
Store: newStore(),
|
||||
|
||||
longClientName: "github.com/rhymen/go-whatsapp",
|
||||
longClientName: "github.com/Rhymen/go-whatsapp",
|
||||
shortClientName: "go-whatsapp",
|
||||
clientVersion: "0.1.0",
|
||||
Proxy: proxy,
|
||||
}
|
||||
if opt.Handler != nil {
|
||||
wac.handler = opt.Handler
|
||||
}
|
||||
if opt.Store != nil {
|
||||
wac.Store = opt.Store
|
||||
}
|
||||
if opt.Proxy != nil {
|
||||
wac.Proxy = opt.Proxy
|
||||
}
|
||||
if len(opt.ShortClientName) != 0 {
|
||||
wac.shortClientName = opt.ShortClientName
|
||||
}
|
||||
if len(opt.LongClientName) != 0 {
|
||||
wac.longClientName = opt.LongClientName
|
||||
}
|
||||
if len(opt.ClientVersion) != 0 {
|
||||
wac.clientVersion = opt.ClientVersion
|
||||
}
|
||||
return wac, wac.connect()
|
||||
}
|
||||
@@ -249,10 +277,26 @@ func (wac *Conn) keepAlive(minIntervalMs int, maxIntervalMs int) {
|
||||
}
|
||||
}
|
||||
|
||||
func (wac *Conn) GetConnected() bool {
|
||||
return wac.connected
|
||||
// IsConnected returns whether the server connection is established or not
|
||||
func (wac *Conn) IsConnected() bool {
|
||||
return wac.connected
|
||||
}
|
||||
|
||||
func (wac *Conn) GetLoggedIn() bool {
|
||||
return wac.loggedIn
|
||||
// GetConnected returns whether the server connection is established or not
|
||||
//
|
||||
// Deprecated: function name is not go idiomatic, use IsConnected instead
|
||||
func (wac *Conn) GetConnected() bool {
|
||||
return wac.connected
|
||||
}
|
||||
|
||||
//IsLoggedIn returns whether the you are logged in or not
|
||||
func (wac *Conn) IsLoggedIn() bool {
|
||||
return wac.loggedIn
|
||||
}
|
||||
|
||||
// GetLoggedIn returns whether the you are logged in or not
|
||||
//
|
||||
// Deprecated: function name is not go idiomatic, use IsLoggedIn instead.
|
||||
func (wac *Conn) GetLoggedIn() bool {
|
||||
return wac.loggedIn
|
||||
}
|
||||
|
||||
47
vendor/github.com/Rhymen/go-whatsapp/contact.go
generated
vendored
47
vendor/github.com/Rhymen/go-whatsapp/contact.go
generated
vendored
@@ -2,9 +2,11 @@ package whatsapp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/Rhymen/go-whatsapp/binary"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Rhymen/go-whatsapp/binary"
|
||||
)
|
||||
|
||||
type Presence string
|
||||
@@ -241,3 +243,46 @@ func buildParticipantNodes(participants []string) []binary.Node {
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
func (wac *Conn) BlockContact(jid string) (<-chan string, error) {
|
||||
return wac.handleBlockContact("add", jid)
|
||||
}
|
||||
|
||||
func (wac *Conn) UnblockContact(jid string) (<-chan string, error) {
|
||||
return wac.handleBlockContact("remove", jid)
|
||||
}
|
||||
|
||||
func (wac *Conn) handleBlockContact(action, jid string) (<-chan string, error) {
|
||||
ts := time.Now().Unix()
|
||||
tag := fmt.Sprintf("%d.--%d", ts, wac.msgCount)
|
||||
|
||||
netsplit := strings.Split(jid, "@")
|
||||
cusjid := netsplit[0] + "@c.us"
|
||||
|
||||
n := binary.Node{
|
||||
Description: "action",
|
||||
Attributes: map[string]string{
|
||||
"type": "set",
|
||||
"epoch": strconv.Itoa(wac.msgCount),
|
||||
},
|
||||
Content: []interface{}{
|
||||
binary.Node{
|
||||
Description: "block",
|
||||
Attributes: map[string]string{
|
||||
"type": action,
|
||||
},
|
||||
Content: []binary.Node{
|
||||
{
|
||||
Description: "user",
|
||||
Attributes: map[string]string{
|
||||
"jid": cusjid,
|
||||
},
|
||||
Content: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
return wac.writeBinary(n, contact, ignore, tag)
|
||||
}
|
||||
|
||||
30
vendor/github.com/Rhymen/go-whatsapp/errors.go
generated
vendored
30
vendor/github.com/Rhymen/go-whatsapp/errors.go
generated
vendored
@@ -7,21 +7,21 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrAlreadyConnected = errors.New("already connected")
|
||||
ErrAlreadyLoggedIn = errors.New("already logged in")
|
||||
ErrInvalidSession = errors.New("invalid session")
|
||||
ErrLoginInProgress = errors.New("login or restore already running")
|
||||
ErrNotConnected = errors.New("not connected")
|
||||
ErrInvalidWsData = errors.New("received invalid data")
|
||||
ErrInvalidWsState = errors.New("can't handle binary data when not logged in")
|
||||
ErrConnectionTimeout = errors.New("connection timed out")
|
||||
ErrMissingMessageTag = errors.New("no messageTag specified or to short")
|
||||
ErrInvalidHmac = errors.New("invalid hmac")
|
||||
ErrInvalidServerResponse = errors.New("invalid response received from server")
|
||||
ErrServerRespondedWith404 = errors.New("server responded with status 404")
|
||||
ErrMediaDownloadFailedWith404 = errors.New("download failed with status code 404")
|
||||
ErrMediaDownloadFailedWith410 = errors.New("download failed with status code 410")
|
||||
ErrInvalidWebsocket = errors.New("invalid websocket")
|
||||
ErrAlreadyConnected = errors.New("already connected")
|
||||
ErrAlreadyLoggedIn = errors.New("already logged in")
|
||||
ErrInvalidSession = errors.New("invalid session")
|
||||
ErrLoginInProgress = errors.New("login or restore already running")
|
||||
ErrNotConnected = errors.New("not connected")
|
||||
ErrInvalidWsData = errors.New("received invalid data")
|
||||
ErrInvalidWsState = errors.New("can't handle binary data when not logged in")
|
||||
ErrConnectionTimeout = errors.New("connection timed out")
|
||||
ErrMissingMessageTag = errors.New("no messageTag specified or to short")
|
||||
ErrInvalidHmac = errors.New("invalid hmac")
|
||||
ErrInvalidServerResponse = errors.New("invalid response received from server")
|
||||
ErrServerRespondedWith404 = errors.New("server responded with status 404")
|
||||
ErrInvalidWebsocket = errors.New("invalid websocket")
|
||||
ErrMessageTypeNotImplemented = errors.New("message type not implemented")
|
||||
ErrOptionsNotProvided = errors.New("new conn options not provided")
|
||||
)
|
||||
|
||||
type ErrConnectionFailed struct {
|
||||
|
||||
1
vendor/github.com/Rhymen/go-whatsapp/go.sum
generated
vendored
1
vendor/github.com/Rhymen/go-whatsapp/go.sum
generated
vendored
@@ -32,5 +32,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6Zh
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
|
||||
65
vendor/github.com/Rhymen/go-whatsapp/media.go
generated
vendored
65
vendor/github.com/Rhymen/go-whatsapp/media.go
generated
vendored
@@ -10,6 +10,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"time"
|
||||
@@ -38,7 +39,7 @@ func Download(url string, mediaKey []byte, appInfo MediaType, fileLength int) ([
|
||||
return nil, err
|
||||
}
|
||||
if len(data) != fileLength {
|
||||
return nil, fmt.Errorf("file length does not match")
|
||||
return nil, fmt.Errorf("file length does not match. Expected: %v, got: %v", fileLength, len(data))
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
@@ -71,16 +72,10 @@ func downloadMedia(url string) (file []byte, mac []byte, err error) {
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
if resp.StatusCode != 200 {
|
||||
if resp.StatusCode == 404 {
|
||||
return nil, nil, ErrMediaDownloadFailedWith404
|
||||
}
|
||||
if resp.StatusCode == 410 {
|
||||
return nil, nil, ErrMediaDownloadFailedWith410
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return nil, nil, fmt.Errorf("download failed with status code %d", resp.StatusCode)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.ContentLength <= 10 {
|
||||
return nil, nil, fmt.Errorf("file to short")
|
||||
}
|
||||
@@ -93,21 +88,21 @@ func downloadMedia(url string) (file []byte, mac []byte, err error) {
|
||||
return data[:n-10], data[n-10 : n], nil
|
||||
}
|
||||
|
||||
|
||||
type MediaConn struct {
|
||||
Status int `json:"status"`
|
||||
MediaConn struct {
|
||||
Auth string `json:"auth"`
|
||||
TTL int `json:"ttl"`
|
||||
Hosts []struct {
|
||||
Hostname string `json:"hostname"`
|
||||
IPs []interface{} `json:"ips"`
|
||||
} `json:"hosts"`
|
||||
} `json:"media_conn"`
|
||||
type MediaConn struct {
|
||||
Status int `json:"status"`
|
||||
MediaConn struct {
|
||||
Auth string `json:"auth"`
|
||||
TTL int `json:"ttl"`
|
||||
Hosts []struct {
|
||||
Hostname string `json:"hostname"`
|
||||
IPs []struct {
|
||||
IP4 net.IP `json:"ip4"`
|
||||
IP6 net.IP `json:"ip6"`
|
||||
} `json:"ips"`
|
||||
} `json:"hosts"`
|
||||
} `json:"media_conn"`
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (wac *Conn) queryMediaConn() (hostname, auth string, ttl int, err error) {
|
||||
queryReq := []interface{}{"query", "mediaConn"}
|
||||
ch, err := wac.writeJson(queryReq)
|
||||
@@ -125,28 +120,24 @@ func (wac *Conn) queryMediaConn() (hostname, auth string, ttl int, err error) {
|
||||
return "", "", 0, fmt.Errorf("query media conn timed out")
|
||||
}
|
||||
|
||||
if resp.Status != 200 {
|
||||
if resp.Status != http.StatusOK {
|
||||
return "", "", 0, fmt.Errorf("query media conn responded with %d", resp.Status)
|
||||
}
|
||||
|
||||
var host string
|
||||
for _, h := range resp.MediaConn.Hosts {
|
||||
if h.Hostname!="" {
|
||||
host = h.Hostname
|
||||
break
|
||||
if h.Hostname != "" {
|
||||
return h.Hostname, resp.MediaConn.Auth, resp.MediaConn.TTL, nil
|
||||
}
|
||||
}
|
||||
if host == "" {
|
||||
return "", "", 0, fmt.Errorf("query media conn responded with no host")
|
||||
}
|
||||
return host, resp.MediaConn.Auth, resp.MediaConn.TTL, nil
|
||||
|
||||
return "", "", 0, fmt.Errorf("query media conn responded with no host")
|
||||
}
|
||||
|
||||
var mediaTypeMap = map[MediaType]string{
|
||||
MediaImage: "/mms/image",
|
||||
MediaVideo: "/mms/video",
|
||||
MediaImage: "/mms/image",
|
||||
MediaVideo: "/mms/video",
|
||||
MediaDocument: "/mms/document",
|
||||
MediaAudio: "/mms/audio",
|
||||
MediaAudio: "/mms/audio",
|
||||
}
|
||||
|
||||
func (wac *Conn) Upload(reader io.Reader, appInfo MediaType) (downloadURL string, mediaKey []byte, fileEncSha256 []byte, fileSha256 []byte, fileLength uint64, err error) {
|
||||
@@ -202,7 +193,7 @@ func (wac *Conn) Upload(reader io.Reader, appInfo MediaType) (downloadURL string
|
||||
|
||||
body := bytes.NewReader(append(enc, mac...))
|
||||
|
||||
req, err := http.NewRequest("POST", uploadURL.String(), body)
|
||||
req, err := http.NewRequest(http.MethodPost, uploadURL.String(), body)
|
||||
if err != nil {
|
||||
return "", nil, nil, nil, 0, err
|
||||
}
|
||||
@@ -222,7 +213,9 @@ func (wac *Conn) Upload(reader io.Reader, appInfo MediaType) (downloadURL string
|
||||
}
|
||||
|
||||
var jsonRes map[string]string
|
||||
json.NewDecoder(res.Body).Decode(&jsonRes)
|
||||
if err := json.NewDecoder(res.Body).Decode(&jsonRes); err != nil {
|
||||
return "", nil, nil, nil, 0, err
|
||||
}
|
||||
|
||||
return jsonRes["url"], mediaKey, fileEncSha256, fileSha256, fileLength, nil
|
||||
}
|
||||
|
||||
17
vendor/github.com/Rhymen/go-whatsapp/message.go
generated
vendored
17
vendor/github.com/Rhymen/go-whatsapp/message.go
generated
vendored
@@ -238,7 +238,7 @@ func getMessageInfo(msg *proto.WebMessageInfo) MessageInfo {
|
||||
return MessageInfo{
|
||||
Id: msg.GetKey().GetId(),
|
||||
RemoteJid: msg.GetKey().GetRemoteJid(),
|
||||
SenderJid: msg.GetKey().GetParticipant(),
|
||||
SenderJid: msg.GetParticipant(),
|
||||
FromMe: msg.GetKey().GetFromMe(),
|
||||
Timestamp: msg.GetMessageTimestamp(),
|
||||
Status: MessageStatus(msg.GetStatus()),
|
||||
@@ -838,19 +838,16 @@ func ParseProtoMessage(msg *proto.WebMessageInfo) interface{} {
|
||||
|
||||
default:
|
||||
//cannot match message
|
||||
|
||||
return ErrMessageTypeNotImplemented
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
BatteryMessage represents a battery level and charging state.
|
||||
*/
|
||||
type BatteryMessage struct {
|
||||
Plugged bool
|
||||
Powersave bool
|
||||
Plugged bool
|
||||
Powersave bool
|
||||
Percentage int
|
||||
}
|
||||
|
||||
@@ -859,8 +856,8 @@ func getBatteryMessage(msg map[string]string) BatteryMessage {
|
||||
powersave, _ := strconv.ParseBool(msg["powersave"])
|
||||
percentage, _ := strconv.Atoi(msg["value"])
|
||||
batteryMessage := BatteryMessage{
|
||||
Plugged: plugged,
|
||||
Powersave: powersave,
|
||||
Plugged: plugged,
|
||||
Powersave: powersave,
|
||||
Percentage: percentage,
|
||||
}
|
||||
|
||||
@@ -869,7 +866,7 @@ func getBatteryMessage(msg map[string]string) BatteryMessage {
|
||||
|
||||
func getNewContact(msg map[string]string) Contact {
|
||||
contact := Contact{
|
||||
Jid: msg["jid"],
|
||||
Jid: msg["jid"],
|
||||
Notify: msg["notify"],
|
||||
}
|
||||
|
||||
|
||||
21
vendor/github.com/Rhymen/go-whatsapp/read.go
generated
vendored
21
vendor/github.com/Rhymen/go-whatsapp/read.go
generated
vendored
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/Rhymen/go-whatsapp/binary"
|
||||
@@ -62,6 +63,10 @@ func (wac *Conn) processReadData(msgType int, msg []byte) error {
|
||||
data[0] = "!"
|
||||
}
|
||||
|
||||
if len(data) == 2 && len(data[1]) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(data) != 2 || len(data[1]) == 0 {
|
||||
return ErrInvalidWsData
|
||||
}
|
||||
@@ -78,10 +83,8 @@ func (wac *Conn) processReadData(msgType int, msg []byte) error {
|
||||
// chan string to something like chan map[string]interface{}. The unmarshalling
|
||||
// in several places, especially in session.go, would then be gone.
|
||||
listener <- data[1]
|
||||
|
||||
wac.listener.Lock()
|
||||
delete(wac.listener.m, data[0])
|
||||
wac.listener.Unlock()
|
||||
close(listener)
|
||||
wac.removeListener(data[0])
|
||||
} else if msgType == websocket.BinaryMessage {
|
||||
wac.loginSessionLock.RLock()
|
||||
sess := wac.session
|
||||
@@ -107,16 +110,16 @@ func (wac *Conn) decryptBinaryMessage(msg []byte) (*binary.Node, error) {
|
||||
var response struct {
|
||||
Status int `json:"status"`
|
||||
}
|
||||
err := json.Unmarshal(msg, &response)
|
||||
if err == nil {
|
||||
if response.Status == 404 {
|
||||
|
||||
if err := json.Unmarshal(msg, &response); err == nil {
|
||||
if response.Status == http.StatusNotFound {
|
||||
return nil, ErrServerRespondedWith404
|
||||
}
|
||||
return nil, errors.New(fmt.Sprintf("server responded with %d", response.Status))
|
||||
} else {
|
||||
return nil, ErrInvalidServerResponse
|
||||
}
|
||||
|
||||
return nil, ErrInvalidServerResponse
|
||||
|
||||
}
|
||||
h2.Write([]byte(msg[32:]))
|
||||
if !hmac.Equal(h2.Sum(nil), msg[:32]) {
|
||||
|
||||
73
vendor/github.com/Rhymen/go-whatsapp/write.go
generated
vendored
73
vendor/github.com/Rhymen/go-whatsapp/write.go
generated
vendored
@@ -15,15 +15,30 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func (wac *Conn) addListener(ch chan string, messageTag string) {
|
||||
wac.listener.Lock()
|
||||
wac.listener.m[messageTag] = ch
|
||||
wac.listener.Unlock()
|
||||
}
|
||||
|
||||
func (wac *Conn) removeListener(answerMessageTag string) {
|
||||
wac.listener.Lock()
|
||||
delete(wac.listener.m, answerMessageTag)
|
||||
wac.listener.Unlock()
|
||||
}
|
||||
|
||||
//writeJson enqueues a json message into the writeChan
|
||||
func (wac *Conn) writeJson(data []interface{}) (<-chan string, error) {
|
||||
|
||||
ch := make(chan string, 1)
|
||||
|
||||
wac.writerLock.Lock()
|
||||
defer wac.writerLock.Unlock()
|
||||
|
||||
d, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
close(ch)
|
||||
return ch, err
|
||||
}
|
||||
|
||||
ts := time.Now().Unix()
|
||||
@@ -35,9 +50,13 @@ func (wac *Conn) writeJson(data []interface{}) (<-chan string, error) {
|
||||
wac.timeTag = tss[len(tss)-3:]
|
||||
}
|
||||
|
||||
ch, err := wac.write(websocket.TextMessage, messageTag, bytes)
|
||||
wac.addListener(ch, messageTag)
|
||||
|
||||
err = wac.write(websocket.TextMessage, bytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
close(ch)
|
||||
wac.removeListener(messageTag)
|
||||
return ch, err
|
||||
}
|
||||
|
||||
wac.msgCount++
|
||||
@@ -45,8 +64,12 @@ func (wac *Conn) writeJson(data []interface{}) (<-chan string, error) {
|
||||
}
|
||||
|
||||
func (wac *Conn) writeBinary(node binary.Node, metric metric, flag flag, messageTag string) (<-chan string, error) {
|
||||
|
||||
ch := make(chan string, 1)
|
||||
|
||||
if len(messageTag) < 2 {
|
||||
return nil, ErrMissingMessageTag
|
||||
close(ch)
|
||||
return ch, ErrMissingMessageTag
|
||||
}
|
||||
|
||||
wac.writerLock.Lock()
|
||||
@@ -54,16 +77,21 @@ func (wac *Conn) writeBinary(node binary.Node, metric metric, flag flag, message
|
||||
|
||||
data, err := wac.encryptBinaryMessage(node)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "encryptBinaryMessage(node) failed")
|
||||
close(ch)
|
||||
return ch, errors.Wrap(err, "encryptBinaryMessage(node) failed")
|
||||
}
|
||||
|
||||
bytes := []byte(messageTag + ",")
|
||||
bytes = append(bytes, byte(metric), byte(flag))
|
||||
bytes = append(bytes, data...)
|
||||
|
||||
ch, err := wac.write(websocket.BinaryMessage, messageTag, bytes)
|
||||
wac.addListener(ch, messageTag)
|
||||
|
||||
err = wac.write(websocket.BinaryMessage, bytes)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to write message")
|
||||
close(ch)
|
||||
wac.removeListener(messageTag)
|
||||
return ch, errors.Wrap(err, "failed to write message")
|
||||
}
|
||||
|
||||
wac.msgCount++
|
||||
@@ -71,9 +99,15 @@ func (wac *Conn) writeBinary(node binary.Node, metric metric, flag flag, message
|
||||
}
|
||||
|
||||
func (wac *Conn) sendKeepAlive() error {
|
||||
|
||||
respChan := make(chan string, 1)
|
||||
wac.addListener(respChan, "!")
|
||||
|
||||
bytes := []byte("?,,")
|
||||
respChan, err := wac.write(websocket.TextMessage, "!", bytes)
|
||||
err := wac.write(websocket.TextMessage, bytes)
|
||||
if err != nil {
|
||||
close(respChan)
|
||||
wac.removeListener("!")
|
||||
return errors.Wrap(err, "error sending keepAlive")
|
||||
}
|
||||
|
||||
@@ -122,32 +156,21 @@ func (wac *Conn) sendAdminTest() (bool, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func (wac *Conn) write(messageType int, answerMessageTag string, data []byte) (<-chan string, error) {
|
||||
var ch chan string
|
||||
if answerMessageTag != "" {
|
||||
ch = make(chan string, 1)
|
||||
|
||||
wac.listener.Lock()
|
||||
wac.listener.m[answerMessageTag] = ch
|
||||
wac.listener.Unlock()
|
||||
}
|
||||
func (wac *Conn) write(messageType int, data []byte) error {
|
||||
|
||||
if wac == nil || wac.ws == nil {
|
||||
return nil, ErrInvalidWebsocket
|
||||
return ErrInvalidWebsocket
|
||||
}
|
||||
|
||||
wac.ws.Lock()
|
||||
err := wac.ws.conn.WriteMessage(messageType, data)
|
||||
wac.ws.Unlock()
|
||||
|
||||
if err != nil {
|
||||
if answerMessageTag != "" {
|
||||
wac.listener.Lock()
|
||||
delete(wac.listener.m, answerMessageTag)
|
||||
wac.listener.Unlock()
|
||||
}
|
||||
return nil, errors.Wrap(err, "error writing to websocket")
|
||||
return errors.Wrap(err, "error writing to websocket")
|
||||
}
|
||||
return ch, nil
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (wac *Conn) encryptBinaryMessage(node binary.Node) (data []byte, err error) {
|
||||
|
||||
5
vendor/github.com/SevereCloud/vksdk/v2/.gitignore
generated
vendored
Normal file
5
vendor/github.com/SevereCloud/vksdk/v2/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
_vendor/
|
||||
vendor/
|
||||
*.out
|
||||
coverage.txt
|
||||
*.test
|
||||
84
vendor/github.com/SevereCloud/vksdk/v2/.golangci.yml
generated
vendored
Normal file
84
vendor/github.com/SevereCloud/vksdk/v2/.golangci.yml
generated
vendored
Normal file
@@ -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
|
||||
2
vendor/github.com/SevereCloud/vksdk/v2/.markdownlint.yml
generated
vendored
Normal file
2
vendor/github.com/SevereCloud/vksdk/v2/.markdownlint.yml
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
---
|
||||
no-hard-tabs: false
|
||||
20
vendor/github.com/SevereCloud/vksdk/v2/.travis.yml
generated
vendored
Normal file
20
vendor/github.com/SevereCloud/vksdk/v2/.travis.yml
generated
vendored
Normal file
@@ -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)
|
||||
92
vendor/github.com/SevereCloud/vksdk/v2/CONTRIBUTING.md
generated
vendored
Normal file
92
vendor/github.com/SevereCloud/vksdk/v2/CONTRIBUTING.md
generated
vendored
Normal file
@@ -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` если это новая фича
|
||||
21
vendor/github.com/SevereCloud/vksdk/v2/LICENSE
generated
vendored
Normal file
21
vendor/github.com/SevereCloud/vksdk/v2/LICENSE
generated
vendored
Normal file
@@ -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.
|
||||
121
vendor/github.com/SevereCloud/vksdk/v2/README.md
generated
vendored
Normal file
121
vendor/github.com/SevereCloud/vksdk/v2/README.md
generated
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
# VK SDK for Golang
|
||||
|
||||
[](https://travis-ci.com/SevereCloud/vksdk)
|
||||
[](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2?tab=subdirectories)
|
||||
[](https://vk.com/dev/)
|
||||
[](https://codecov.io/gh/SevereCloud/vksdk)
|
||||
[](https://vk.me/join/AJQ1d6Or8Q00Y_CSOESfbqGt)
|
||||
[](https://github.com/SevereCloud/vksdk/releases)
|
||||
[](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
|
||||
|
||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2FSevereCloud%2Fvksdk?ref=badge_large)
|
||||
555
vendor/github.com/SevereCloud/vksdk/v2/api/README.md
generated
vendored
Normal file
555
vendor/github.com/SevereCloud/vksdk/v2/api/README.md
generated
vendored
Normal file
@@ -0,0 +1,555 @@
|
||||
# API
|
||||
|
||||
[](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api)
|
||||
[](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)
|
||||
}
|
||||
```
|
||||
|
||||
### Параметры
|
||||
|
||||
[](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)
|
||||
```
|
||||
|
||||
### Обработка ошибок
|
||||
|
||||
[](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
|
||||
|
||||
[](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api#VK.Execute)
|
||||
[](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
|
||||
|
||||
[](https://vk.com/dev/captcha_error)
|
||||
|
||||
Если какое-либо действие (например, отправка сообщения) выполняется
|
||||
пользователем слишком часто, то запрос к API может возвращать ошибку
|
||||
"Captcha needed". При этом пользователю понадобится ввести код с изображения
|
||||
и отправить запрос повторно с передачей введенного кода Captcha в параметрах
|
||||
запроса.
|
||||
|
||||
**Код ошибки**: 14
|
||||
**Текст ошибки**: Captcha needed
|
||||
|
||||
Если возникает данная ошибка, то в сообщении об ошибке передаются также
|
||||
следующие параметры:
|
||||
|
||||
- `err.CaptchaSID` - идентификатор captcha
|
||||
- `err.CaptchaImg` - ссылка на изображение, которое нужно показать
|
||||
пользователю, чтобы он ввел текст с этого изображения.
|
||||
|
||||
В этом случае следует запросить пользователя ввести текст с изображения
|
||||
`err.CaptchaImg` и повторить запрос, добавив в него параметры:
|
||||
|
||||
- `captcha_sid` - полученный идентификатор
|
||||
- `captcha_key` - текст, который ввел пользователь
|
||||
|
||||
## Загрузка файлов
|
||||
|
||||
[](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)
|
||||
}
|
||||
```
|
||||
196
vendor/github.com/SevereCloud/vksdk/v2/api/account.go
generated
vendored
Normal file
196
vendor/github.com/SevereCloud/vksdk/v2/api/account.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
581
vendor/github.com/SevereCloud/vksdk/v2/api/ads.go
generated
vendored
Normal file
581
vendor/github.com/SevereCloud/vksdk/v2/api/ads.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
359
vendor/github.com/SevereCloud/vksdk/v2/api/api.go
generated
vendored
Normal file
359
vendor/github.com/SevereCloud/vksdk/v2/api/api.go
generated
vendored
Normal file
@@ -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)
|
||||
}
|
||||
149
vendor/github.com/SevereCloud/vksdk/v2/api/apps.go
generated
vendored
Normal file
149
vendor/github.com/SevereCloud/vksdk/v2/api/apps.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
100
vendor/github.com/SevereCloud/vksdk/v2/api/appwidgets.go
generated
vendored
Normal file
100
vendor/github.com/SevereCloud/vksdk/v2/api/appwidgets.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
26
vendor/github.com/SevereCloud/vksdk/v2/api/auth.go
generated
vendored
Normal file
26
vendor/github.com/SevereCloud/vksdk/v2/api/auth.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
173
vendor/github.com/SevereCloud/vksdk/v2/api/board.go
generated
vendored
Normal file
173
vendor/github.com/SevereCloud/vksdk/v2/api/board.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
7
vendor/github.com/SevereCloud/vksdk/v2/api/captcha.go
generated
vendored
Normal file
7
vendor/github.com/SevereCloud/vksdk/v2/api/captcha.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
163
vendor/github.com/SevereCloud/vksdk/v2/api/database.go
generated
vendored
Normal file
163
vendor/github.com/SevereCloud/vksdk/v2/api/database.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
137
vendor/github.com/SevereCloud/vksdk/v2/api/docs.go
generated
vendored
Normal file
137
vendor/github.com/SevereCloud/vksdk/v2/api/docs.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
49
vendor/github.com/SevereCloud/vksdk/v2/api/donut.go
generated
vendored
Normal file
49
vendor/github.com/SevereCloud/vksdk/v2/api/donut.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
19
vendor/github.com/SevereCloud/vksdk/v2/api/downloadedGames.go
generated
vendored
Normal file
19
vendor/github.com/SevereCloud/vksdk/v2/api/downloadedGames.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
927
vendor/github.com/SevereCloud/vksdk/v2/api/errors.go
generated
vendored
Normal file
927
vendor/github.com/SevereCloud/vksdk/v2/api/errors.go
generated
vendored
Normal file
@@ -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}§ion=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
|
||||
}
|
||||
52
vendor/github.com/SevereCloud/vksdk/v2/api/execute.go
generated
vendored
Normal file
52
vendor/github.com/SevereCloud/vksdk/v2/api/execute.go
generated
vendored
Normal file
@@ -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"
|
||||
}
|
||||
231
vendor/github.com/SevereCloud/vksdk/v2/api/fave.go
generated
vendored
Normal file
231
vendor/github.com/SevereCloud/vksdk/v2/api/fave.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
295
vendor/github.com/SevereCloud/vksdk/v2/api/friends.go
generated
vendored
Normal file
295
vendor/github.com/SevereCloud/vksdk/v2/api/friends.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
32
vendor/github.com/SevereCloud/vksdk/v2/api/gifts.go
generated
vendored
Normal file
32
vendor/github.com/SevereCloud/vksdk/v2/api/gifts.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
712
vendor/github.com/SevereCloud/vksdk/v2/api/groups.go
generated
vendored
Normal file
712
vendor/github.com/SevereCloud/vksdk/v2/api/groups.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
89
vendor/github.com/SevereCloud/vksdk/v2/api/leadforms.go
generated
vendored
Normal file
89
vendor/github.com/SevereCloud/vksdk/v2/api/leadforms.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
74
vendor/github.com/SevereCloud/vksdk/v2/api/leads.go
generated
vendored
Normal file
74
vendor/github.com/SevereCloud/vksdk/v2/api/leads.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
79
vendor/github.com/SevereCloud/vksdk/v2/api/likes.go
generated
vendored
Normal file
79
vendor/github.com/SevereCloud/vksdk/v2/api/likes.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
319
vendor/github.com/SevereCloud/vksdk/v2/api/market.go
generated
vendored
Normal file
319
vendor/github.com/SevereCloud/vksdk/v2/api/market.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
616
vendor/github.com/SevereCloud/vksdk/v2/api/messages.go
generated
vendored
Normal file
616
vendor/github.com/SevereCloud/vksdk/v2/api/messages.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
230
vendor/github.com/SevereCloud/vksdk/v2/api/newsfeed.go
generated
vendored
Normal file
230
vendor/github.com/SevereCloud/vksdk/v2/api/newsfeed.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
100
vendor/github.com/SevereCloud/vksdk/v2/api/notes.go
generated
vendored
Normal file
100
vendor/github.com/SevereCloud/vksdk/v2/api/notes.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
54
vendor/github.com/SevereCloud/vksdk/v2/api/notifications.go
generated
vendored
Normal file
54
vendor/github.com/SevereCloud/vksdk/v2/api/notifications.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
90
vendor/github.com/SevereCloud/vksdk/v2/api/orders.go
generated
vendored
Normal file
90
vendor/github.com/SevereCloud/vksdk/v2/api/orders.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
81
vendor/github.com/SevereCloud/vksdk/v2/api/pages.go
generated
vendored
Normal file
81
vendor/github.com/SevereCloud/vksdk/v2/api/pages.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
613
vendor/github.com/SevereCloud/vksdk/v2/api/photos.go
generated
vendored
Normal file
613
vendor/github.com/SevereCloud/vksdk/v2/api/photos.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
179
vendor/github.com/SevereCloud/vksdk/v2/api/podcasts.go
generated
vendored
Normal file
179
vendor/github.com/SevereCloud/vksdk/v2/api/podcasts.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
106
vendor/github.com/SevereCloud/vksdk/v2/api/polls.go
generated
vendored
Normal file
106
vendor/github.com/SevereCloud/vksdk/v2/api/polls.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
79
vendor/github.com/SevereCloud/vksdk/v2/api/prettycards.go
generated
vendored
Normal file
79
vendor/github.com/SevereCloud/vksdk/v2/api/prettycards.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
17
vendor/github.com/SevereCloud/vksdk/v2/api/search.go
generated
vendored
Normal file
17
vendor/github.com/SevereCloud/vksdk/v2/api/search.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
110
vendor/github.com/SevereCloud/vksdk/v2/api/secure.go
generated
vendored
Normal file
110
vendor/github.com/SevereCloud/vksdk/v2/api/secure.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
35
vendor/github.com/SevereCloud/vksdk/v2/api/stats.go
generated
vendored
Normal file
35
vendor/github.com/SevereCloud/vksdk/v2/api/stats.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
23
vendor/github.com/SevereCloud/vksdk/v2/api/status.go
generated
vendored
Normal file
23
vendor/github.com/SevereCloud/vksdk/v2/api/status.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
48
vendor/github.com/SevereCloud/vksdk/v2/api/storage.go
generated
vendored
Normal file
48
vendor/github.com/SevereCloud/vksdk/v2/api/storage.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
305
vendor/github.com/SevereCloud/vksdk/v2/api/stories.go
generated
vendored
Normal file
305
vendor/github.com/SevereCloud/vksdk/v2/api/stories.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
67
vendor/github.com/SevereCloud/vksdk/v2/api/streaming.go
generated
vendored
Normal file
67
vendor/github.com/SevereCloud/vksdk/v2/api/streaming.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
961
vendor/github.com/SevereCloud/vksdk/v2/api/upload.go
generated
vendored
Normal file
961
vendor/github.com/SevereCloud/vksdk/v2/api/upload.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
104
vendor/github.com/SevereCloud/vksdk/v2/api/users.go
generated
vendored
Normal file
104
vendor/github.com/SevereCloud/vksdk/v2/api/users.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
105
vendor/github.com/SevereCloud/vksdk/v2/api/utils.go
generated
vendored
Normal file
105
vendor/github.com/SevereCloud/vksdk/v2/api/utils.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
338
vendor/github.com/SevereCloud/vksdk/v2/api/video.go
generated
vendored
Normal file
338
vendor/github.com/SevereCloud/vksdk/v2/api/video.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
383
vendor/github.com/SevereCloud/vksdk/v2/api/wall.go
generated
vendored
Normal file
383
vendor/github.com/SevereCloud/vksdk/v2/api/wall.go
generated
vendored
Normal file
@@ -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
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user