Implement handleChannelRemove.

This commit is contained in:
Mikkel Krautz 2011-05-17 23:06:17 +02:00
parent 1e164668e5
commit 96df319036
2 changed files with 67 additions and 4 deletions

View file

@ -158,10 +158,29 @@ func (server *Server) handlePingMessage(client *Client, msg *Message) {
}) })
} }
func (server *Server) handleChannelAddMessage(client *Client, msg *Message) {
}
func (server *Server) handleChannelRemoveMessage(client *Client, msg *Message) { func (server *Server) handleChannelRemoveMessage(client *Client, msg *Message) {
chanremove := &mumbleproto.ChannelRemove{}
err := proto.Unmarshal(msg.buf, chanremove)
if err != nil {
client.Panic(err.String())
return
}
if chanremove.ChannelId == nil {
return
}
channel, exists := server.Channels[int(*chanremove.ChannelId)]
if !exists {
return
}
if !server.HasPermission(client, channel, WritePermission) {
client.sendPermissionDenied(client, channel, WritePermission)
return
}
server.RemoveChannel(channel)
} }
// Handle channel state change. // Handle channel state change.

View file

@ -830,7 +830,7 @@ func (server *Server) handleIncomingMessage(client *Client, msg *Message) {
case MessagePing: case MessagePing:
server.handlePingMessage(msg.client, msg) server.handlePingMessage(msg.client, msg)
case MessageChannelRemove: case MessageChannelRemove:
server.handlePingMessage(msg.client, msg) server.handleChannelRemoveMessage(msg.client, msg)
case MessageChannelState: case MessageChannelState:
server.handleChannelStateMessage(msg.client, msg) server.handleChannelStateMessage(msg.client, msg)
case MessageUserState: case MessageUserState:
@ -1109,6 +1109,50 @@ func (s *Server) removeRegisteredUserFromChannel(uid uint32, channel *Channel) {
} }
} }
// Remove a channel
func (server *Server) RemoveChannel(channel *Channel) {
// Can't remove root
if channel.parent == nil {
return
}
// Remove all links
for _, linkedChannel := range channel.Links {
linkedChannel.Links[channel.Id] = nil, false
}
// Remove all subchannels
for _, subChannel := range channel.children {
server.RemoveChannel(subChannel)
}
// Remove all clients
for _, client := range channel.clients {
target := channel.parent
for target.parent != nil && !server.HasPermission(client, target, EnterPermission) {
target = target.parent
}
userstate := &mumbleproto.UserState{}
userstate.Session = proto.Uint32(client.Session)
userstate.ChannelId = proto.Uint32(uint32(target.Id))
server.userEnterChannel(client, target, userstate)
if err := server.broadcastProtoMessage(MessageUserState, userstate); err != nil {
server.Panicf("%v", err)
}
}
// Remove the channel itself
parent := channel.parent
parent.children[channel.Id] = nil, false
chanremove := &mumbleproto.ChannelRemove{
ChannelId: proto.Uint32(uint32(channel.Id)),
}
if err := server.broadcastProtoMessage(MessageChannelRemove, chanremove); err != nil {
server.Panicf("%v", err)
}
}
// Is the incoming connection conn banned? // Is the incoming connection conn banned?
func (server *Server) IsBanned(conn net.Conn) bool { func (server *Server) IsBanned(conn net.Conn) bool {
server.banlock.RLock() server.banlock.RLock()