forked from go-vk-api/vk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vk.go
129 lines (98 loc) · 2.59 KB
/
vk.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package vk
import (
"encoding/json"
"errors"
"fmt"
"log"
"os"
"github.com/go-resty/resty"
)
// VK struct
type VK struct {
url string
lang string
version string
token string
logFile *os.File
longPoll *longPoll
Messages *Messages
Proxy string
}
// RequestParams struct
type RequestParams map[string]string
// CallMethod calls VK API method
func (client *VK) CallMethod(method string, params RequestParams) ([]byte, error) {
params["access_token"] = client.token
params["lang"] = client.lang
params["v"] = client.version
if client.Proxy != "" {
resty.SetProxy(fmt.Sprint("http://", client.Proxy))
}
resp, err := resty.R().
SetQueryParams(params).
Get(client.url + method)
if err != nil {
client.Log("[Error] VK::CallMethod:", err.Error(), "WebResponse:", string(resp.Body()))
return nil, err
}
type JSONBody struct {
Error map[string]interface{} `json:"error"`
}
var body JSONBody
if err := json.Unmarshal(resp.Body(), &body); err != nil {
client.Log("[Error] VK::CallMethod:", err.Error(), "WebResponse:", string(resp.Body()))
return nil, err
}
if body.Error != nil {
if errorMsg, exists := body.Error["error_msg"].(string); exists {
client.Log("[Error] VK::CallMethod:", errorMsg, "WebResponse:", string(resp.Body()))
return nil, errors.New(errorMsg)
}
client.Log("[Error] VK::CallMethod:", "Unknown error", "WebResponse:", string(resp.Body()))
return nil, errors.New("Unknown error")
}
return resp.Body(), nil
}
// Init sets the token
func (client *VK) Init(token string) error {
client.token = token
return nil
}
// RunLongPoll starts longpoll process
func (client *VK) RunLongPoll() {
if err := client.longPoll.update(); err != nil {
client.Log("[Error] VK::RunLongPoll:", err.Error())
return
}
client.longPoll.chanNewMessage = make(chan *LPMessage)
go client.longPoll.processEvents()
client.longPoll.process()
}
// OnNewMessage sets event
func (client *VK) OnNewMessage(event EventNewMessage) {
client.longPoll.eventNewMessage = event
}
// SetLogFile sets pointer to logfile
func (client *VK) SetLogFile(logFile *os.File) {
client.logFile = logFile
}
// Log writes data in stdout and logfile
func (client *VK) Log(a ...interface{}) {
log.SetFlags(log.LstdFlags)
log.SetOutput(os.Stdout)
log.Println(a...)
if client.logFile != nil {
log.SetOutput(client.logFile)
log.Println(a...)
}
}
// New returns a new VK instance
func New(lang string) *VK {
vk := new(VK)
vk.url = "https://api.vk.com/method/"
vk.lang = lang
vk.version = "5.52"
vk.longPoll = &longPoll{client: vk}
vk.Messages = &Messages{client: vk}
return vk
}