-
Notifications
You must be signed in to change notification settings - Fork 906
/
clientutil.go
113 lines (91 loc) · 2.62 KB
/
clientutil.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
package internalapi
import (
"bytes"
"encoding/json"
"net/http"
"emperror.dev/errors"
"github.com/botlabs-gg/yagpdb/v2/common"
)
var (
ErrServerError = errors.New("internal api server is having issues")
ErrCantFindAddress = errors.New("can't find address for provided shard")
)
func GetServerAddrForGuild(guildID int64) string {
addr, _ := common.ServicePoller.GetGuildAddress(guildID)
return addr
}
func GetServerAddrForShard(shard int) string {
addr, _ := common.ServicePoller.GetShardAddress(shard)
return addr
}
func GetWithGuild(guildID int64, url string, dest interface{}) error {
serverAddr := GetServerAddrForGuild(guildID)
if serverAddr == "" {
return ErrCantFindAddress
}
return GetWithAddress(serverAddr, url, dest)
}
func GetWithShard(shard int, url string, dest interface{}) error {
serverAddr := GetServerAddrForShard(shard)
if serverAddr == "" {
return ErrCantFindAddress
}
return GetWithAddress(serverAddr, url, dest)
}
func GetWithAddress(addr string, url string, dest interface{}) error {
resp, err := http.Get("http://" + addr + "/" + url)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
var errDest string
err := json.NewDecoder(resp.Body).Decode(&errDest)
if err != nil {
return ErrServerError
}
return errors.New(errDest)
}
return errors.WithMessage(json.NewDecoder(resp.Body).Decode(dest), "json.Decode")
}
func PostWithGuild(guildID int64, url string, bodyData interface{}, dest interface{}) error {
serverAddr := GetServerAddrForGuild(guildID)
if serverAddr == "" {
return ErrCantFindAddress
}
return PostWithAddress(serverAddr, url, bodyData, dest)
}
func PostWithShard(shard int, url string, bodyData interface{}, dest interface{}) error {
serverAddr := GetServerAddrForShard(shard)
if serverAddr == "" {
return ErrCantFindAddress
}
return PostWithAddress(serverAddr, url, bodyData, dest)
}
func PostWithAddress(serverAddr string, url string, bodyData interface{}, dest interface{}) error {
var bodyBuf bytes.Buffer
if bodyData != nil {
encoder := json.NewEncoder(&bodyBuf)
err := encoder.Encode(bodyData)
if err != nil {
return err
}
}
resp, err := http.Post("http://"+serverAddr+"/"+url, "application/json", &bodyBuf)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
var errDest string
err := json.NewDecoder(resp.Body).Decode(&errDest)
if err != nil {
return errors.Errorf("Resp code:%d, Error: %v", resp.StatusCode, err)
}
return errors.New(errDest)
}
if dest == nil {
return nil
}
return errors.WithMessage(json.NewDecoder(resp.Body).Decode(dest), "json.Decode")
}