-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathservergroups.go
More file actions
211 lines (171 loc) · 5.54 KB
/
servergroups.go
File metadata and controls
211 lines (171 loc) · 5.54 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
package ts3
import (
"encoding/json"
"fmt"
)
type GroupType int
const (
TemplateGroup GroupType = 0
RegularGroup GroupType = 1
QueryGroup GroupType = 2
)
type ServerGroup struct {
Id int64 `json:"sgid,string"`
Name string `json:"name"`
Type GroupType `json:"type,string"`
}
// List all of the server groups on the server
func ServerGroups() (*status, []ServerGroup, error) {
qres, body, err := get("servergrouplist", false)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to get a list server groups")
return qres, nil, err
}
var groups []ServerGroup
json.Unmarshal([]byte(body), &groups)
return qres, groups, err
}
// Add a client to a server group
func ServerGroupsAddClient(sgid int64, cldbid int64) (*status, error) {
queries := []KeyValue{
{key: "sgid", value: i64tostr(sgid)},
{key: "cldbid", value: i64tostr(cldbid)},
}
qres, _, err := get("servergroupaddclient", false, queries)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to assign servergroup %v to clientdbid %v \n%v\n%v", sgid, cldbid, qres, err)
}
return qres, err
}
// Remove a client from a server group
func ServerGroupsRevokeClient(sgid int64, cldbid int64) (*status, error) {
queries := []KeyValue{
{key: "sgid", value: i64tostr(sgid)},
{key: "cldbid", value: i64tostr(cldbid)},
}
qres, _, err := get("servergroupdelclient", false, queries)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to revoke servergroup %v from cldboid %v \n%v\n%v", sgid, cldbid, qres, err)
}
return qres, err
}
//List the users who belong to a specific server group
func ServerGroupMembers(sgid int64) (*status, []User, error) {
queries := []KeyValue{
{key: "sgid", value: i64tostr(sgid)},
}
qres, body, err := get("servergroupclientlist", false, queries)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to get servergroup %v members \n%v\n%v", sgid, qres, err)
return qres, nil, err
}
// For reasons that continue to baffle me
// teamspeak devs use the term 'cldbid' in the servergroupclientlist
// yet in other endpoints they use 'client_database_id'
// so I need to have this struct for this one edge case....
type cldbid_ struct {
Clid int64 `json:"cldbid,string"`
}
var cldbid []cldbid_
json.Unmarshal([]byte(body), &cldbid)
qres1, sessions, err := ActiveClients()
if err != nil {
return qres1, nil, err
}
// Build an array of Users with their active session IDs (CLIDs) included
groupmembers := []User{}
for _, member := range cldbid {
_, u, err := UserFindByDbId(member.Clid)
if err != nil {
Log(Error, "Failed to look up cldbid %v \n%v", member.Clid, err)
continue
}
u.ActiveSessionIds = sessions[member.Clid]
groupmembers = append(groupmembers, *u)
}
return qres, groupmembers, err
}
// // Pokes all active clients belonging to databaseusers in a specific server group
func ServerGroupPoke(sgid int64, msg string) (*status, error) {
qres, users, err := ServerGroupMembers(sgid)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to get server group members")
return qres, err
}
attempted := 0
failed := 0
for _, user := range users {
for i := 0; i < len(user.ActiveSessionIds); i++ {
qres1, err := UserPoke(user.ActiveSessionIds[i], msg)
if err != nil || !qres1.IsSuccess() {
failed++
Log(Error, "Failed to poke %v \n%v\n%v", user.Nickname, qres1, err)
}
attempted++
}
}
qres.Code = -1
qres.Message = fmt.Sprintf("%v%% of clients successfully poked (%v failed)", ((attempted-failed)/attempted)*100, failed)
return qres, err
}
// List a users server groups
func ServerGroupsByClientDbId(cldbid int64) (*status, []ServerGroup, error) {
queries := []KeyValue{
{key: "cldbid", value: i64tostr(cldbid)},
}
qres, body, err := get("servergroupsbyclientid", false, queries)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to get a list of cldbid %v servergroups \n%v\n%v", cldbid, qres, err)
return qres, nil, err
}
var groups []ServerGroup
json.Unmarshal([]byte(body), &groups)
return qres, groups, err
}
// Creates a server group
func ServerGroupAdd(name string) (*status, int64, error) {
queries := []KeyValue{
{key: "name", value: name},
}
qres, body, err := get("servergroupadd", false, queries)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to create a new servergroup \n%v\n%v", qres, err)
return qres, -1, err
}
var group []ServerGroup
json.Unmarshal([]byte(body), &group)
return qres, group[0].Id, err
}
// Create a duplicate of the server group {ssgid}. The new group will be named {name}
func ServerGroupCopy(ssgid int64, name string) (*status, int64, error) {
queries := []KeyValue{
{key: "ssgid", value: i64tostr(ssgid)},
{key: "tsgid", value: "0"}, // We want to make a new group
{key: "name", value: name},
{key: "type", value: i64tostr(int64(RegularGroup))},
}
qres, body, err := get("servergroupcopy", false, queries)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to copy group %v \n%v\n%v", ssgid, qres, err)
return qres, -1, err
}
var group []ServerGroup
json.Unmarshal([]byte(body), &group)
return qres, group[0].Id, err
}
// Delete a server group, forceDelete deletes a group with members
func ServerGroupDel(sgid int64, forceDelete bool) (*status, error) {
var force int64 = 0
if forceDelete {
force = 1
}
queries := []KeyValue{
{key: "sgid", value: i64tostr(sgid)},
{key: "force", value: i64tostr(force)},
}
qres, _, err := get("servergroupdel", false, queries)
if err != nil || !qres.IsSuccess() {
Log(Error, "Failed to delete servergroup %v \n%v\n%v", sgid, qres, err)
}
return qres, err
}