forked from jshiffer/matterbridge
2f33fe86f5
* Update dependencies and build to go1.22 * Fix api changes wrt to dependencies * Update golangci config
637 lines
18 KiB
Go
637 lines
18 KiB
Go
/*
|
||
Package object contains objects for VK.
|
||
|
||
See more https://vk.com/dev/objects
|
||
*/
|
||
package object // import "github.com/SevereCloud/vksdk/v2/object"
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/json"
|
||
"reflect"
|
||
|
||
"github.com/vmihailenco/msgpack/v5"
|
||
)
|
||
|
||
// Attachment interface.
|
||
type Attachment interface {
|
||
ToAttachment() string
|
||
}
|
||
|
||
// JSONObject interface.
|
||
type JSONObject interface {
|
||
ToJSON() string
|
||
}
|
||
|
||
// BaseBoolInt type.
|
||
type BaseBoolInt bool
|
||
|
||
// UnmarshalJSON func.
|
||
func (b *BaseBoolInt) UnmarshalJSON(data []byte) (err error) {
|
||
switch {
|
||
case bytes.Equal(data, []byte("1")), bytes.Equal(data, []byte("true")):
|
||
*b = true
|
||
case bytes.Equal(data, []byte("0")), bytes.Equal(data, []byte("false")):
|
||
*b = false
|
||
default:
|
||
// return json error
|
||
err = &json.UnmarshalTypeError{
|
||
Value: string(data),
|
||
Type: reflect.TypeOf((*BaseBoolInt)(nil)),
|
||
}
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
// DecodeMsgpack func.
|
||
func (b *BaseBoolInt) DecodeMsgpack(dec *msgpack.Decoder) (err error) {
|
||
data, err := dec.DecodeRaw()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
var (
|
||
valueInt int
|
||
valueBool bool
|
||
)
|
||
|
||
switch {
|
||
case msgpack.Unmarshal(data, &valueBool) == nil:
|
||
*b = BaseBoolInt(valueBool)
|
||
case msgpack.Unmarshal(data, &valueInt) == nil:
|
||
if valueInt == 1 {
|
||
*b = true
|
||
break
|
||
}
|
||
|
||
if valueInt == 0 {
|
||
*b = false
|
||
break
|
||
}
|
||
|
||
fallthrough
|
||
default:
|
||
// return msgpack error
|
||
err = &json.UnmarshalTypeError{
|
||
Value: string(data),
|
||
Type: reflect.TypeOf((*BaseBoolInt)(nil)),
|
||
}
|
||
}
|
||
|
||
return err
|
||
}
|
||
|
||
// BaseCountry struct.
|
||
type BaseCountry struct {
|
||
ID int `json:"id"`
|
||
Title string `json:"title"`
|
||
}
|
||
|
||
// BaseObject struct.
|
||
type BaseObject struct {
|
||
ID int `json:"id"`
|
||
Title string `json:"title"`
|
||
}
|
||
|
||
// BaseObjectCount struct.
|
||
type BaseObjectCount struct {
|
||
Count int `json:"count"`
|
||
}
|
||
|
||
// BaseObjectWithName struct.
|
||
type BaseObjectWithName struct {
|
||
ID int `json:"id"`
|
||
Name string `json:"name"`
|
||
}
|
||
|
||
// BaseRequestParam struct.
|
||
type BaseRequestParam struct {
|
||
Key string `json:"key"`
|
||
Value string `json:"value"`
|
||
}
|
||
|
||
// BaseSex const.
|
||
const (
|
||
SexUnknown = iota
|
||
SexFemale
|
||
SexMale
|
||
)
|
||
|
||
// LongPollResponse struct.
|
||
type LongPollResponse struct {
|
||
Ts int `json:"ts"`
|
||
Updates [][]interface{} `json:"updates"`
|
||
Failed int `json:"failed"`
|
||
}
|
||
|
||
// BaseCommentsInfo struct.
|
||
type BaseCommentsInfo struct {
|
||
Count int `json:"count"`
|
||
CanPost BaseBoolInt `json:"can_post"`
|
||
GroupsCanPost BaseBoolInt `json:"groups_can_post"`
|
||
CanClose BaseBoolInt `json:"can_close"`
|
||
CanOpen BaseBoolInt `json:"can_open"`
|
||
}
|
||
|
||
// BaseGeo struct.
|
||
type BaseGeo struct {
|
||
Coordinates string `json:"coordinates"`
|
||
Place BasePlace `json:"place"`
|
||
Showmap int `json:"showmap"`
|
||
Type string `json:"type"`
|
||
}
|
||
|
||
// BaseMessageGeo struct.
|
||
type BaseMessageGeo struct {
|
||
Coordinates BaseGeoCoordinates `json:"coordinates"`
|
||
Place BasePlace `json:"place"`
|
||
Showmap int `json:"showmap"`
|
||
Type string `json:"type"`
|
||
}
|
||
|
||
// BaseGeoCoordinates struct.
|
||
type BaseGeoCoordinates struct {
|
||
Latitude float64 `json:"latitude"`
|
||
Longitude float64 `json:"longitude"`
|
||
}
|
||
|
||
// BaseImage struct.
|
||
type BaseImage struct {
|
||
Height float64 `json:"height"`
|
||
URL string `json:"url"`
|
||
Width float64 `json:"width"`
|
||
Type string `json:"type"`
|
||
}
|
||
|
||
// UnmarshalJSON is required to support images with `src` field.
|
||
func (obj *BaseImage) UnmarshalJSON(data []byte) (err error) {
|
||
type renamedBaseImage struct {
|
||
Height float64 `json:"height"`
|
||
URL string `json:"url"`
|
||
Src string `json:"src"`
|
||
Width float64 `json:"width"`
|
||
Type string `json:"type"`
|
||
}
|
||
|
||
var renamedObj renamedBaseImage
|
||
|
||
err = json.Unmarshal(data, &renamedObj)
|
||
|
||
obj.Height = renamedObj.Height
|
||
obj.Width = renamedObj.Width
|
||
obj.Type = renamedObj.Type
|
||
|
||
if renamedObj.Src == "" {
|
||
obj.URL = renamedObj.URL
|
||
} else {
|
||
obj.URL = renamedObj.Src
|
||
}
|
||
|
||
return err
|
||
}
|
||
|
||
// DecodeMsgpack is required to support images with `src` field.
|
||
func (obj *BaseImage) DecodeMsgpack(dec *msgpack.Decoder) (err error) {
|
||
type renamedBaseImage struct {
|
||
Height float64 `msgpack:"height"`
|
||
URL string `msgpack:"url"`
|
||
Src string `msgpack:"src"`
|
||
Width float64 `msgpack:"width"`
|
||
Type string `msgpack:"type"`
|
||
}
|
||
|
||
var renamedObj renamedBaseImage
|
||
|
||
err = dec.Decode(&renamedObj)
|
||
|
||
obj.Height = renamedObj.Height
|
||
obj.Width = renamedObj.Width
|
||
obj.Type = renamedObj.Type
|
||
|
||
if renamedObj.Src == "" {
|
||
obj.URL = renamedObj.URL
|
||
} else {
|
||
obj.URL = renamedObj.Src
|
||
}
|
||
|
||
return err
|
||
}
|
||
|
||
// BaseLikes struct.
|
||
type BaseLikes struct {
|
||
UserLikes BaseBoolInt `json:"user_likes"` // Information whether current user likes
|
||
Count int `json:"count"` // Likes number
|
||
}
|
||
|
||
// BaseLikesInfo struct.
|
||
type BaseLikesInfo struct {
|
||
CanLike BaseBoolInt `json:"can_like"` // Information whether current user can like the post
|
||
CanPublish BaseBoolInt `json:"can_publish"` // Information whether current user can repost
|
||
UserLikes BaseBoolInt `json:"user_likes"` // Information whether current uer has liked the post
|
||
Count int `json:"count"` // Likes number
|
||
}
|
||
|
||
// BaseLink struct.
|
||
type BaseLink struct {
|
||
Application BaseLinkApplication `json:"application"`
|
||
Button BaseLinkButton `json:"button"`
|
||
ButtonText string `json:"button_text"`
|
||
ButtonAction string `json:"button_action"`
|
||
Caption string `json:"caption"`
|
||
Description string `json:"description"`
|
||
Photo PhotosPhoto `json:"photo"`
|
||
Video VideoVideo `json:"video"`
|
||
PreviewPage string `json:"preview_page"`
|
||
PreviewURL string `json:"preview_url"`
|
||
Product BaseLinkProduct `json:"product"`
|
||
Rating BaseLinkRating `json:"rating"`
|
||
Title string `json:"title"`
|
||
Target string `json:"target"`
|
||
URL string `json:"url"`
|
||
IsFavorite BaseBoolInt `json:"is_favorite"`
|
||
}
|
||
|
||
// BaseLinkApplication struct.
|
||
type BaseLinkApplication struct {
|
||
AppID float64 `json:"app_id"`
|
||
Store BaseLinkApplicationStore `json:"store"`
|
||
}
|
||
|
||
// BaseLinkApplicationStore struct.
|
||
type BaseLinkApplicationStore struct {
|
||
ID float64 `json:"id"`
|
||
Name string `json:"name"`
|
||
}
|
||
|
||
// BaseLinkButton struct.
|
||
type BaseLinkButton struct {
|
||
Action BaseLinkButtonAction `json:"action"`
|
||
Title string `json:"title"`
|
||
}
|
||
|
||
// BaseLinkButtonAction struct.
|
||
type BaseLinkButtonAction struct {
|
||
Type string `json:"type"`
|
||
URL string `json:"url"`
|
||
}
|
||
|
||
// BaseLinkProduct struct.
|
||
type BaseLinkProduct struct {
|
||
Price MarketPrice `json:"price"`
|
||
Merchant string `json:"merchant"`
|
||
OrdersCount int `json:"orders_count"`
|
||
}
|
||
|
||
// BaseLinkRating struct.
|
||
type BaseLinkRating struct {
|
||
ReviewsCount json.Number `json:"reviews_count"`
|
||
Stars float64 `json:"stars"`
|
||
}
|
||
|
||
// BasePlace struct.
|
||
type BasePlace struct {
|
||
Address string `json:"address"`
|
||
Checkins int `json:"checkins"`
|
||
City interface{} `json:"city"` // BUG(VK): https://github.com/VKCOM/vk-api-schema/issues/143
|
||
Country interface{} `json:"country"`
|
||
Created int `json:"created"`
|
||
ID int `json:"id"`
|
||
Icon string `json:"icon"`
|
||
Latitude float64 `json:"latitude"`
|
||
Longitude float64 `json:"longitude"`
|
||
Title string `json:"title"`
|
||
Type string `json:"type"`
|
||
IsDeleted BaseBoolInt `json:"is_deleted"`
|
||
TotalCheckins int `json:"total_checkins"`
|
||
Updated int `json:"updated"`
|
||
CategoryObject BaseCategoryObject `json:"category_object"`
|
||
}
|
||
|
||
// BaseCategoryObject struct.
|
||
type BaseCategoryObject struct {
|
||
ID int `json:"id"`
|
||
Title string `json:"title"`
|
||
Icons []BaseImage `json:"icons"`
|
||
}
|
||
|
||
// BaseRepostsInfo struct.
|
||
type BaseRepostsInfo struct {
|
||
Count int `json:"count"`
|
||
WallCount int `json:"wall_count"`
|
||
MailCount int `json:"mail_count"`
|
||
UserReposted int `json:"user_reposted"`
|
||
}
|
||
|
||
// BaseSticker struct.
|
||
type BaseSticker struct {
|
||
Images []BaseImage `json:"images"`
|
||
ImagesWithBackground []BaseImage `json:"images_with_background"`
|
||
ProductID int `json:"product_id"`
|
||
StickerID int `json:"sticker_id"`
|
||
IsAllowed bool `json:"is_allowed"`
|
||
AnimationURL string `json:"animation_url"`
|
||
}
|
||
|
||
// MaxSize return the largest BaseSticker.
|
||
func (sticker BaseSticker) MaxSize() (maxImageSize BaseImage) {
|
||
var max float64
|
||
|
||
for _, imageSize := range sticker.Images {
|
||
size := imageSize.Height * imageSize.Width
|
||
if size > max {
|
||
max = size
|
||
maxImageSize = imageSize
|
||
}
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
// MinSize return the smallest BaseSticker.
|
||
func (sticker BaseSticker) MinSize() (minImageSize BaseImage) {
|
||
var min float64
|
||
|
||
for _, imageSize := range sticker.Images {
|
||
size := imageSize.Height * imageSize.Width
|
||
if size < min || min == 0 {
|
||
min = size
|
||
minImageSize = imageSize
|
||
}
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
// MaxSizeBackground return the largest BaseSticker with background.
|
||
func (sticker BaseSticker) MaxSizeBackground() (maxImageSize BaseImage) {
|
||
var max float64
|
||
|
||
for _, imageSize := range sticker.ImagesWithBackground {
|
||
size := imageSize.Height * imageSize.Width
|
||
if size > max {
|
||
max = size
|
||
maxImageSize = imageSize
|
||
}
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
// MinSizeBackground return the smallest BaseSticker with background.
|
||
func (sticker BaseSticker) MinSizeBackground() (minImageSize BaseImage) {
|
||
var min float64
|
||
|
||
for _, imageSize := range sticker.ImagesWithBackground {
|
||
size := imageSize.Height * imageSize.Width
|
||
if size < min || min == 0 {
|
||
min = size
|
||
minImageSize = imageSize
|
||
}
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
// BaseUserID struct.
|
||
type BaseUserID struct {
|
||
UserID int `json:"user_id"`
|
||
}
|
||
|
||
// PrivacyCategory type.
|
||
type PrivacyCategory string
|
||
|
||
// Possible values.
|
||
const (
|
||
PrivacyAll PrivacyCategory = "all"
|
||
PrivacyOnlyMe PrivacyCategory = "only_me"
|
||
PrivacyFriends PrivacyCategory = "friends"
|
||
PrivacyFriendsOfFriends PrivacyCategory = "friends_of_friends"
|
||
)
|
||
|
||
// Privacy struct.
|
||
type Privacy struct {
|
||
Category PrivacyCategory `json:"category,omitempty"`
|
||
Lists struct {
|
||
Allowed []int `json:"allowed"`
|
||
Excluded []int `json:"excluded"`
|
||
} `json:"lists,omitempty"`
|
||
Owners struct {
|
||
Allowed []int `json:"allowed"`
|
||
Excluded []int `json:"excluded"`
|
||
} `json:"owners,omitempty"`
|
||
}
|
||
|
||
// EventsEventAttach struct.
|
||
type EventsEventAttach struct {
|
||
Address string `json:"address,omitempty"` // address of event
|
||
ButtonText string `json:"button_text"` // text of attach
|
||
Friends []int `json:"friends"` // array of friends ids
|
||
ID int `json:"id"` // event ID
|
||
IsFavorite BaseBoolInt `json:"is_favorite"` // is favorite
|
||
MemberStatus int `json:"member_status,omitempty"` // Current user's member status
|
||
Text string `json:"text"` // text of attach
|
||
Time int `json:"time,omitempty"` // event start time
|
||
}
|
||
|
||
// OauthError struct.
|
||
type OauthError struct {
|
||
Error string `json:"error"`
|
||
ErrorDescription string `json:"error_description"`
|
||
RedirectURI string `json:"redirect_uri"`
|
||
}
|
||
|
||
// Article struct.
|
||
type Article struct {
|
||
ID int `json:"id"`
|
||
OwnerID int `json:"owner_id"`
|
||
OwnerName string `json:"owner_name"`
|
||
OwnerPhoto string `json:"owner_photo"`
|
||
State string `json:"state"`
|
||
CanReport BaseBoolInt `json:"can_report"`
|
||
IsFavorite BaseBoolInt `json:"is_favorite"`
|
||
NoFooter BaseBoolInt `json:"no_footer"`
|
||
Title string `json:"title"`
|
||
Subtitle string `json:"subtitle"`
|
||
Views int `json:"views"`
|
||
Shares int `json:"shares"`
|
||
URL string `json:"url"`
|
||
ViewURL string `json:"view_url"`
|
||
AccessKey string `json:"access_key"`
|
||
PublishedDate int `json:"published_date"`
|
||
Photo PhotosPhoto `json:"photo"`
|
||
}
|
||
|
||
// ExtendedResponse struct.
|
||
type ExtendedResponse struct {
|
||
Profiles []UsersUser `json:"profiles,omitempty"`
|
||
Groups []GroupsGroup `json:"groups,omitempty"`
|
||
}
|
||
|
||
// ClientInfo struct.
|
||
type ClientInfo struct {
|
||
ButtonActions []string `json:"button_actions"`
|
||
Keyboard BaseBoolInt `json:"keyboard"`
|
||
InlineKeyboard BaseBoolInt `json:"inline_keyboard"`
|
||
Carousel BaseBoolInt `json:"carousel"`
|
||
LangID int `json:"lang_id"`
|
||
}
|
||
|
||
// Language code.
|
||
const (
|
||
LangRU = 0 // Русский
|
||
LangUK = 1 // Українська
|
||
LangBE = 2 // Беларуская (тарашкевiца)
|
||
LangEN = 3 // English
|
||
LangES = 4 // Español
|
||
LangFI = 5 // Suomi
|
||
LangDE = 6 // Deutsch
|
||
LangIT = 7 // Italiano
|
||
LangBG = 8 // Български
|
||
LangHR = 9 // Hrvatski
|
||
LangHU = 10 // Magyar
|
||
LangSR = 11 // Српски
|
||
LangPT = 12 // Português
|
||
LangEL = 14 // Ελληνικά
|
||
LangPL = 15 // Polski
|
||
LangFR = 16 // Français
|
||
LangKO = 17 // 한국어
|
||
LangZH = 18 // 汉语
|
||
LangLT = 19 // Lietuvių
|
||
LangJA = 20 // 日本語
|
||
LangCS = 21 // Čeština
|
||
LangET = 22 // Eesti
|
||
LangTT = 50 // Татарча
|
||
LangBA = 51 // Башҡортса
|
||
LangCV = 52 // Чăвашла
|
||
LangSK = 53 // Slovenčina
|
||
LangRO = 54 // Română
|
||
LangNO = 55 // Norsk
|
||
LangLV = 56 // Latviešu
|
||
LangAZ = 57 // Azərbaycan dili
|
||
LangHY = 58 // Հայերեն
|
||
LangSQ = 59 // Shqip
|
||
LangSV = 60 // Svenska
|
||
LangNL = 61 // Nederlands
|
||
LangTK = 62 // Türkmen
|
||
LangKA = 63 // ქართული
|
||
LangDA = 64 // Dansk
|
||
LangUZ = 65 // O‘zbek
|
||
LangMO = 66 // Moldovenească
|
||
LangBUA = 67 // Буряад
|
||
LangTH = 68 // ภาษาไทย
|
||
LangID = 69 // Bahasa Indonesia
|
||
LangTG = 70 // Тоҷикӣ
|
||
LangSL = 71 // Slovenščina
|
||
LangBS = 72 // Bosanski
|
||
LangPTBR = 73 // Português brasileiro
|
||
LangFA = 74 // فارسی
|
||
LangVI = 75 // Tiếng Việt
|
||
LangHI = 76 // हिन्दी
|
||
LangSI = 77 // සිංහල
|
||
LangBN = 78 // বাংলা
|
||
LangTL = 79 // Tagalog
|
||
LangMN = 80 // Монгол
|
||
LangMY = 81 // ဗမာစာ
|
||
LangTR = 82 // Türkçe
|
||
LangNE = 83 // नेपाली
|
||
LangUR = 85 // اردو
|
||
LangKY = 87 // Кыргыз тили
|
||
LangPA = 90 // پنجابی
|
||
LangOS = 91 // Ирон
|
||
LangKN = 94 // ಕನ್ನಡ
|
||
LangSW = 95 // Kiswahili
|
||
LangKK = 97 // Қазақша
|
||
LangAR = 98 // العربية
|
||
LangHE = 99 // עברית
|
||
LangPreRevolutionary = 100 // Дореволюцiонный
|
||
LangMYV = 101 // Эрзянь кель
|
||
LangKDB = 102 // Адыгэбзэ
|
||
LangSAH = 105 // Саха тыла
|
||
LangADY = 106 // Адыгабзэ
|
||
LangUDM = 107 // Удмурт
|
||
LangCHM = 108 // Марий йылме
|
||
LangBE2 = 114 // Беларуская
|
||
LangLEZ = 118 // Лезги чІал
|
||
LangTW = 119 // 臺灣話
|
||
LangKUM = 236 // Къумукъ тил
|
||
LangMVL = 270 // Mirandés
|
||
LangSLA = 298 // Русинськый
|
||
LangKRL = 379 // Karjalan kieli
|
||
LangTYV = 344 // Тыва дыл
|
||
LangXAL = 357 // Хальмг келн
|
||
LangTLY = 373 // Tolışə zıvon
|
||
LangKV = 375 // Коми кыв
|
||
LangUKClassic = 452 // Українська (клясична)
|
||
LangUKGalitska = 454 // Українська (Галицка)
|
||
LangKAB = 457 // Taqbaylit
|
||
LangEO = 555 // Esperanto
|
||
LangLA = 666 // Lingua Latina
|
||
LangSoviet = 777 // Советский
|
||
)
|
||
|
||
// Button action type.
|
||
const (
|
||
// A button that sends a message with text specified in the label.
|
||
ButtonText = "text"
|
||
|
||
// Opens the VK Pay window with predefined parameters. The button is called
|
||
// “Pay with VK Pay” (VK Pay is displayed as a logo). This button always
|
||
// stretches to the whole keyboard width.
|
||
ButtonVKPay = "vkpay"
|
||
|
||
// Opens a specified VK Apps app. This button always stretches to the whole
|
||
// keyboard width.
|
||
ButtonVKApp = "open_app"
|
||
|
||
// Sends the location to the chat. This button always stretches to the
|
||
// whole keyboard width.
|
||
ButtonLocation = "location"
|
||
|
||
// Opens the specified link.
|
||
ButtonOpenLink = "open_link"
|
||
|
||
// Allows, without sending a message from the user, to receive a
|
||
// notification about pressing the button and perform the necessary action.
|
||
ButtonCallback = "callback"
|
||
)
|
||
|
||
// Button color. This parameter is used only for buttons with the text and callback types.
|
||
const (
|
||
Primary = "primary" // Blue button, indicates the main action. #5181B8
|
||
ButtonBlue
|
||
|
||
Secondary = "secondary" // Default white button. #FFFFFF
|
||
ButtonWhite
|
||
|
||
Negative = "negative" // Dangerous or negative action (cancel, delete etc.) #E64646
|
||
ButtonRed
|
||
|
||
Positive = "positive" // Accept, agree. #4BB34B
|
||
ButtonGreen
|
||
)
|
||
|
||
// Platform content creation platform.
|
||
type Platform int
|
||
|
||
// Possible values.
|
||
const (
|
||
_ Platform = iota
|
||
PlatformMobile // mobile web version
|
||
PlatformIPhone // iPhone
|
||
PlatformIPad // iPad
|
||
PlatformAndroid // Android
|
||
PlatformWindowsPhone // Windows Phone
|
||
PlatformWindows // Windows 8
|
||
PlatformFull // full web version
|
||
PlatformOther // other apps
|
||
)
|
||
|
||
// Conversations types.
|
||
const (
|
||
PeerUser = "user"
|
||
PeerChat = "chat"
|
||
PeerGroup = "group"
|
||
PeerEmail = "email"
|
||
)
|