Skip to content

Commit 02fc1c3

Browse files
committed
Add channel group commands
- ChannelGroups: List channel groups - SetChannelGroup - ResetChannelGroup: Sets the user back to the guest channel group - ChannelGroupMembers: - PokeChannelGroup
1 parent 98cdcb3 commit 02fc1c3

6 files changed

Lines changed: 223 additions & 32 deletions

File tree

channelgroups.go

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package ts3
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"strings"
7+
)
8+
9+
type ChannelGroup struct {
10+
Id int64
11+
Name string
12+
Type GroupType // found in servergroup.go
13+
// IconId int
14+
// SaveDb int
15+
// SortId int
16+
// NameMode int
17+
}
18+
19+
// Get a list of channel groups on the server
20+
func (TSClient *Conn) ChannelGroups() (*QueryResponse, *[]ChannelGroup, error) {
21+
var channelGroups []ChannelGroup
22+
23+
res, body, err := TSClient.Exec("channelgrouplist")
24+
if err != nil || !res.IsSuccess {
25+
Log(Error, "Failed to get channel groups from TS server \n%v \n%v", res, err)
26+
return res, nil, err
27+
}
28+
29+
groups := strings.Split(body, "|")
30+
for i := 0; i < len(groups); i++ {
31+
seg := strings.Split(groups[i], " ")
32+
33+
// Get the channel group ID
34+
cgid, err := strconv.ParseInt(GetVal(seg[0]), 10, 64)
35+
if err != nil {
36+
Log(Error, "Failed to parse the Group ID \n%v", err)
37+
return nil, nil, err
38+
}
39+
40+
// Get the Group Type ID so we can convert it to an enum later
41+
groupTypeId, err := strconv.ParseInt(GetVal(seg[2]), 10, 64)
42+
if err != nil {
43+
Log(Error, "Failed to parse the Group Type \n%v", err)
44+
}
45+
46+
channelGroups = append(channelGroups, ChannelGroup{
47+
Id: cgid,
48+
Type: GroupType(groupTypeId),
49+
Name: Decode(GetVal(seg[1])),
50+
})
51+
}
52+
53+
return res, &channelGroups, nil
54+
}
55+
56+
// Add a client to a specific channel group for a given channel
57+
func (TSClient *Conn) SetChannelGroup(cgid int, cid int, cldbid int) (*QueryResponse, error) {
58+
res, _, err := TSClient.Exec("setclientchannelgroup cgid=%v cid=%v cldbid=%v", cgid, cid, cldbid)
59+
if err != nil || !res.IsSuccess {
60+
Log(Error, "Unable to update client channel group {clientDbId: %v, channelId: %v, channelGroupId: %v}. \n%v \n%v", cldbid, cid, cgid, res, err)
61+
return res, err
62+
}
63+
64+
return res, nil
65+
}
66+
67+
// Set a user back to the default channel group. The default channel group is a group that:
68+
// a) has the name "guest" && b) is a RegularGroup type
69+
func (TSClient *Conn) ResetChannelGroup(cid int, cldbid int) (*QueryResponse, error) {
70+
res, groups, err := TSClient.ChannelGroups()
71+
if err != nil || !res.IsSuccess {
72+
Log(Error, "Failed to get avaliable channel groups \n%v \n%v", res, err)
73+
return res, err
74+
}
75+
76+
// Find the group ID of the guest channel group
77+
var cgid int64
78+
for _, group := range *groups {
79+
if group.Name == "Guest" && group.Type == RegularGroup {
80+
cgid = group.Id
81+
}
82+
}
83+
84+
// Set the channel group
85+
res, err = TSClient.SetChannelGroup(int(cgid), cid, cldbid)
86+
if err != nil || !res.IsSuccess {
87+
Log(Error, "Failed to reset the users channel group \n%v \n%v", res, err)
88+
return res, err
89+
}
90+
91+
return res, nil
92+
}
93+
94+
// Return the members of a specific channel group for a given channel
95+
func (TSClient *Conn) ChannelGroupMembers(cgid int, cid int) (*QueryResponse, []User, error) {
96+
users := []User{}
97+
98+
// Get a list of channel group members for a given channel
99+
res, body, err := TSClient.Exec("channelgroupclientlist cid=%v cgid=%v", cid, cgid)
100+
if err != nil || !res.IsSuccess {
101+
Log(Error, "Failed to get the list of channel group members {cid: %v, cgid: %v} \n%v \n%v", cid, cgid, res, err)
102+
return res, nil, err
103+
}
104+
105+
// Map of active clients using their DatabaseID as the map key
106+
sessions, err := TSClient.ActiveClients()
107+
if err != nil {
108+
Log(Error, "Fauked to get the list of active clients \n%v \n%v", res, err)
109+
return nil, nil, err
110+
}
111+
112+
clients := strings.Split(body, "|")
113+
for i := 0; i < len(clients); i++ {
114+
parts := strings.Split(clients[i], " ")
115+
116+
// Parse the client database id
117+
cldbid, err := strconv.ParseInt(GetVal(parts[1]), 10, 64)
118+
if err != nil {
119+
Log(Error, "Failed to parse the client database ID \n%v", err)
120+
return nil, nil, err
121+
}
122+
123+
// Find the user using their CLDBID
124+
user, err := TSClient.FindUserByDbId(cldbid)
125+
if err != nil {
126+
Log(Error, "Failed to find user using the cldbid %v \n%v", cldbid, err)
127+
return nil, nil, err
128+
}
129+
130+
// Assign the CLID (active client IDs) for the users active sessions
131+
user.ActiveSessionIds = sessions[user.Cldbid]
132+
133+
// Add user object to result array
134+
users = append(users, *user)
135+
}
136+
137+
return res, users, nil
138+
}
139+
140+
// Poke all clients who belong to a given channel group in a specific channel
141+
func (TSClient *Conn) ChannelGroupPoke(cgid int, cid int, msg string) (*QueryResponse, error) {
142+
res, body, err := TSClient.ChannelGroupMembers(cgid, cid)
143+
if err != nil || !res.IsSuccess {
144+
Log(Error, "Failed to get channel group members \n%v \n%v", res, err)
145+
return res, err
146+
}
147+
148+
var successful int = 0
149+
var attempted int = 0
150+
151+
for _, user := range body {
152+
for i := 0; i < len(user.ActiveSessionIds); i++ {
153+
res, err := TSClient.PokeUser(int(user.ActiveSessionIds[i]), msg)
154+
if err != nil {
155+
Log(Error, "Failed to poke %v \n%v \n%v", user.Nickname, res, err)
156+
}
157+
158+
// Increase counters
159+
attempted++
160+
if res.IsSuccess {
161+
successful++
162+
}
163+
}
164+
}
165+
166+
return &QueryResponse{
167+
Id: -1,
168+
Msg: fmt.Sprintf("%v out of %v clients sucesfully poked", successful, attempted),
169+
IsSuccess: true,
170+
}, nil
171+
}

privilegekey.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (this *Conn) TokensAdd(groupId int, description string, customFields map[st
4141
// Create token
4242
res, body, err := this.Exec(s)
4343
if err != nil || !res.IsSuccess {
44-
Log(Error, "Failed to create privilege token\n%v\n%v", res, err)
44+
Log(Error, "Failed to create privilege token \n%v \n%v", res, err)
4545
return res, nil, err
4646
}
4747

@@ -61,7 +61,7 @@ func (this *Conn) TokensAdd(groupId int, description string, customFields map[st
6161
func (this *Conn) TokensDelete(token string) (*QueryResponse, error) {
6262
res, _, err := this.Exec("privilegekeydelete token=%v", token)
6363
if err != nil || !res.IsSuccess {
64-
Log(Error, "Failed to delete privilege token %v\n%v\n%v", token, res, err)
64+
Log(Error, "Failed to delete privilege token %v \n%v \n%v", token, res, err)
6565
return res, err
6666
}
6767

@@ -74,15 +74,15 @@ func (this *Conn) Tokenslist() (*QueryResponse, *[]PrivilegeKey, error) { //[]to
7474

7575
res, body, err := this.Exec("privilegekeylist")
7676
if err != nil || !res.IsSuccess {
77-
Log(Error, "Failed to get privilege keys\n%v\n%v", res, err)
77+
Log(Error, "Failed to get privilege keys \n%v \n%v", res, err)
7878
return res, nil, err
7979
}
8080

8181
keys := strings.Split(body, "|")
8282
for i := 0; i < len(keys); i++ {
8383
token, err := ParsePrivilegeKey(keys[i])
8484
if err != nil {
85-
Log(Error, "Failed to parse privilege keys\n%v\n%v", res, err)
85+
Log(Error, "Failed to parse privilege keys \n%v \n%v", res, err)
8686
return res, nil, err
8787
}
8888

server.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type VirtualServer struct {
2121
func (this *Conn) Use(sid int) (*QueryResponse, error) {
2222
res, _, err := this.Exec("use %v", sid)
2323
if err != nil || !res.IsSuccess {
24-
Log(Error, "Failed to select virtual server %v.\n%v\n%v", sid, res, err)
24+
Log(Error, "Failed to select virtual server %v.\n%v \n%v", sid, res, err)
2525
return res, err
2626
}
2727

@@ -32,7 +32,7 @@ func (this *Conn) Use(sid int) (*QueryResponse, error) {
3232
func (this *Conn) GlobalMessage(msg string) (*QueryResponse, error) {
3333
res, _, err := this.Exec("gm msg=%v", Encode(msg))
3434
if err != nil || !res.IsSuccess {
35-
Log(Error, "Failed to send a global message %v.\n%v\n%v", msg, res, err)
35+
Log(Error, "Failed to send a global message %v.\n%v \n%v", msg, res, err)
3636
return res, err
3737
}
3838

@@ -43,7 +43,7 @@ func (this *Conn) GlobalMessage(msg string) (*QueryResponse, error) {
4343
func (this *Conn) Start(sid int) (*QueryResponse, error) {
4444
res, _, err := this.Exec("serverstart sid=%v", sid)
4545
if err != nil || !res.IsSuccess {
46-
Log(Error, "Failed to start virtual server %v.\n%v\n%v", sid, res, err)
46+
Log(Error, "Failed to start virtual server %v.\n%v \n%v", sid, res, err)
4747
return res, err
4848
}
4949

@@ -54,7 +54,7 @@ func (this *Conn) Start(sid int) (*QueryResponse, error) {
5454
func (this *Conn) Stop(sid int) (*QueryResponse, error) {
5555
res, _, err := this.Exec("serverstop sid=%v", sid)
5656
if err != nil || !res.IsSuccess {
57-
Log(Error, "Failed to stop virtual server %v.\n%v\n%v", sid, res, err)
57+
Log(Error, "Failed to stop virtual server %v.\n%v \n%v", sid, res, err)
5858
return res, err
5959
}
6060

@@ -67,15 +67,15 @@ func (this *Conn) List() (*QueryResponse, []VirtualServer, error) {
6767

6868
res, body, err := this.Exec("serverlist")
6969
if err != nil || !res.IsSuccess {
70-
Log(Error, "Failed to get virtual servers from Team Speak.\n%v\n%v", res, err)
70+
Log(Error, "Failed to get virtual servers from Team Speak. \n%v \n%v", res, err)
7171
return res, ServerList, err
7272
}
7373

7474
servers := strings.Split(body, "|")
7575
for i := 0; i < len(servers); i++ {
7676
server, err := ParseVirtualServer(servers[i])
7777
if err != nil {
78-
Log(Error, "Failed to parse server information.\n%v\n%v", res, err)
78+
Log(Error, "Failed to parse server information. \n%v \n%v", res, err)
7979
return res, nil, err
8080
}
8181

servergroups.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ func (TSClient *Conn) ServerGroups() (*QueryResponse, *[]ServerGroup, error) {
4141

4242
id, err := strconv.ParseInt(GetVal(seg[0]), 10, 64)
4343
if err != nil {
44-
Log(Error, "Failed to parse the server group ID")
44+
Log(Error, "Failed to parse the server group ID \n%v", err)
4545
return res, nil, err
4646
}
4747

4848
// Get the group ID so we can convert it into an Enum
4949
groupTypeId, err := strconv.ParseInt(GetVal(seg[2]), 10, 64)
5050
if err != nil {
51-
Log(Error, "Failed to parse the group type ID")
51+
Log(Error, "Failed to parse the group type ID \n%v", err)
5252
return res, nil, err
5353
}
5454

@@ -67,7 +67,7 @@ func (TSClient *Conn) ServerGroups() (*QueryResponse, *[]ServerGroup, error) {
6767
func (TSClient *Conn) ServerGroupAddClient(sgid int, cldbid int) (*QueryResponse, error) {
6868
res, _, err := TSClient.Exec("servergroupaddclient sgid=%v cldbid=%v", sgid, cldbid)
6969
if err != nil || !res.IsSuccess {
70-
Log(Error, "Failed to add user %v to server group %v\n%v\n%v", cldbid, sgid, res, err)
70+
Log(Error, "Failed to add user %v to server group %v \n%v \n%v", cldbid, sgid, res, err)
7171
return res, err
7272
}
7373

@@ -78,7 +78,7 @@ func (TSClient *Conn) ServerGroupAddClient(sgid int, cldbid int) (*QueryResponse
7878
func (TSClient *Conn) ServerGroupRemoveClient(sgid int, cldbid int) (*QueryResponse, error) {
7979
res, _, err := TSClient.Exec("servergroupdelclient sgid=%v cldbid=%v", sgid, cldbid)
8080
if err != nil || !res.IsSuccess {
81-
Log(Error, "Failed to remove user %v from server group %v\n%v\n%v", cldbid, sgid, res, err)
81+
Log(Error, "Failed to remove user %v from server group %v \n%v \n%v", cldbid, sgid, res, err)
8282
return res, err
8383
}
8484

@@ -93,29 +93,29 @@ func (TSClient *Conn) ServerGroupMembers(gid int) (*QueryResponse, *[]User, erro
9393
// This list returns a CLDBID, this isn't of huge use so we need to look up more info
9494
res, body, err := TSClient.Exec(fmt.Sprintf("servergroupclientlist sgid=%v", gid))
9595
if err != nil || !res.IsSuccess {
96-
Log(Error, "Failed to get the server group client list\n%v\n%v", res, err)
96+
Log(Error, "Failed to get the server group client list \n%v \n%v", res, err)
9797
return res, nil, err
9898
}
9999

100100
// Map of active clients using their DatabseID as the map key
101101
sessions, err := TSClient.ActiveClients()
102102
if err != nil {
103-
Log(Error, "Failed to get the list of active clients\n%v\n%v", res, err)
103+
Log(Error, "Failed to get the list of active clients \n%v \n%v", res, err)
104104
return res, nil, err
105105
}
106106

107107
parts := strings.Split(body, "|")
108108
for i := 0; i < len(parts); i++ {
109109
cldbid, err := strconv.ParseInt(strings.ReplaceAll(parts[i], "cldbid=", ""), 10, 64)
110110
if err != nil {
111-
Log(Error, "Error parsing the CLDBID\n%v\n%v", res, err)
111+
Log(Error, "Error parsing the CLDBID \n%v \n%v", res, err)
112112
return res, nil, err
113113
}
114114

115115
// Get the user information using their Client DB ID
116116
user, err := TSClient.FindUserByDbId(cldbid)
117117
if err != nil {
118-
Log(Error, "Error finding the user by their cldbid\n%v\n%v", res, err)
118+
Log(Error, "Error finding the user by their cldbid \n%v \n%v", res, err)
119119
return res, nil, err
120120
}
121121

@@ -134,17 +134,31 @@ func (TSClient *Conn) ServerGroupPoke(sgid int, msg string) (*QueryResponse, err
134134
// Get a list of users who belong to the specified GID (group)
135135
res, body, err := TSClient.ServerGroupMembers(sgid)
136136
if err != nil || !res.IsSuccess {
137-
Log(Error, "Error getting a list of server group members\n%v\n%v", res, err)
137+
Log(Error, "Error getting a list of server group members \n%v \n%v", res, err)
138138
return res, err
139139
}
140140

141-
msg = Encode(msg)
141+
var successful int = 0
142+
var attempted int = 0
142143

143144
for _, user := range *body {
144145
for i := 0; i < len(user.ActiveSessionIds); i++ {
145-
TSClient.Exec("clientpoke clid=%v msg=%v", user.ActiveSessionIds[i], msg)
146+
res, err := TSClient.PokeUser(int(user.ActiveSessionIds[i]), msg)
147+
if err != nil {
148+
Log(Error, "Failed to poke %v \n%v \n%v", user.Nickname, res, err)
149+
}
150+
151+
// Increase counters
152+
attempted++
153+
if res.IsSuccess {
154+
successful++
155+
}
146156
}
147157
}
148158

149-
return res, nil
159+
return &QueryResponse{
160+
Id: -1,
161+
Msg: fmt.Sprintf("%v out of %v clients sucesffuly poked", successful, attempted),
162+
IsSuccess: true,
163+
}, nil
150164
}

0 commit comments

Comments
 (0)