Skip to content

Commit

Permalink
add registered user list request
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim Cooper committed Nov 26, 2014
1 parent dc6dc1f commit f346d02
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 1 deletion.
3 changes: 3 additions & 0 deletions barnard/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,6 @@ func (b *Barnard) OnPermissionDenied(e *gumble.PermissionDeniedEvent) {
}
b.AddOutputLine(fmt.Sprintf("Permission denied: %s", info))
}

func (b *Barnard) OnUserList(e *gumble.UserListEvent) {
}
10 changes: 10 additions & 0 deletions gumble/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const (
RequestComment
RequestTexture
RequestStats
RequestUserList
)

// PingInterval is the interval at which ping packets are be sent by the client
Expand Down Expand Up @@ -197,6 +198,15 @@ func (c *Client) AudioEncoder() *gopus.Encoder {
return c.audioEncoder
}

// Request requests that specific server information be sent to the client.
func (c *Client) Request(request Request) {
if (request & RequestUserList) != 0 {
packet := MumbleProto.UserList{}
proto := protoMessage{&packet}
c.Send(proto)
}
}

// Disconnect disconnects the client from the server.
func (c *Client) Disconnect() error {
return c.close(&DisconnectEvent{
Expand Down
6 changes: 6 additions & 0 deletions gumble/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ type EventListener interface {
OnUserChange(e *UserChangeEvent)
OnChannelChange(e *ChannelChangeEvent)
OnPermissionDenied(e *PermissionDeniedEvent)
OnUserList(e *UserListEvent)
}

type ConnectEvent struct {
Expand Down Expand Up @@ -98,3 +99,8 @@ type PermissionDeniedEvent struct {
Permission Permission
String string
}

type UserListEvent struct {
Client *Client
Users RegisteredUserList
}
6 changes: 6 additions & 0 deletions gumble/event_multiplexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,9 @@ func (em *eventMux) OnPermissionDenied(event *PermissionDeniedEvent) {
item.listener.OnPermissionDenied(event)
}
}

func (em *eventMux) OnUserList(event *UserListEvent) {
for item := em.head; item != nil; item = item.next {
item.listener.OnUserList(event)
}
}
23 changes: 22 additions & 1 deletion gumble/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,28 @@ func handleContextAction(client *Client, buffer []byte) error {
}

func handleUserList(client *Client, buffer []byte) error {
return errUnimplementedHandler
var packet MumbleProto.UserList
if err := proto.Unmarshal(buffer, &packet); err != nil {
return err
}

event := UserListEvent{
Client: client,
Users: make(RegisteredUserList, 0, len(packet.Users)),
}

for _, user := range packet.Users {
registeredUser := &RegisteredUser{
userId: *user.UserId,
}
if user.Name != nil {
registeredUser.name = *user.Name
}
event.Users = append(event.Users, registeredUser)
}

client.listeners.OnUserList(&event)
return nil
}

func handleVoiceTarget(client *Client, buffer []byte) error {
Expand Down
7 changes: 7 additions & 0 deletions gumble/listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ type Listener struct {
UserChange func(e *UserChangeEvent)
ChannelChange func(e *ChannelChangeEvent)
PermissionDenied func(e *PermissionDeniedEvent)
UserList func(e *UserListEvent)
}

func (l Listener) OnConnect(e *ConnectEvent) {
Expand Down Expand Up @@ -47,3 +48,9 @@ func (l Listener) OnPermissionDenied(e *PermissionDeniedEvent) {
l.PermissionDenied(e)
}
}

func (l Listener) OnUserList(e *UserListEvent) {
if l.UserList != nil {
l.UserList(e)
}
}
18 changes: 18 additions & 0 deletions gumble/message_userlist.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package gumble

type RegisteredUser struct {
userId uint32
name string
}

// UserId returns the registered user's Id
func (ru *RegisteredUser) UserId() uint {
return uint(ru.userId)
}

// Name returns the registered user's name
func (ru *RegisteredUser) Name() string {
return ru.name
}

type RegisteredUserList []*RegisteredUser

0 comments on commit f346d02

Please sign in to comment.