gui: fix channel ordering
Build Mumble Web 2 / linux_build (push) Successful in 1m25s
Build Mumble Web 2 / windows_build (push) Successful in 2m41s
Build Mumble Web 2 / android_build (push) Successful in 5m58s

This commit is contained in:
2026-01-25 01:29:28 -07:00
parent a30082eebe
commit 53a0ad0125
2 changed files with 125 additions and 47 deletions
+5 -34
View File
@@ -335,41 +335,11 @@ fn accept_packet(
}
ControlPacket::ChannelState(u) => {
let mut server = STATE.server.write();
let id = u.get_channel_id();
let state = server.channels.entry(id).or_default();
let new_parent = if u.has_parent() {
if let Some(parent) = state.parent.and_then(|p| server.channels.get_mut(&p)) {
parent.children.remove(&id);
}
let parent_id = u.get_parent();
let parent = server.channels.entry(parent_id).or_default();
if u.has_position() && u.get_position() as usize <= parent.children.len() {
// TODO: what if positions are received out of order? we need to sort afterwards?
parent.children.insert_before(u.get_position() as usize, id);
} else {
parent.children.insert(id);
}
Some(parent_id)
} else {
None
};
let state = server.channels.entry(id).or_default();
state.parent = new_parent;
if u.has_name() {
state.name = u.get_name().to_string();
}
server.channels_state.update_from_ChannelState(&u);
}
ControlPacket::ChannelRemove(u) => {
let mut server = STATE.server.write();
let id = u.get_channel_id();
if let Some(channel) = server.channels.remove(&id) {
if let Some(parent) = channel.parent.and_then(|p| server.channels.get_mut(&p)) {
parent.children.remove(&id);
}
}
server.channels_state.update_from_ChannelRemove(&u);
}
ControlPacket::UserState(u) => {
let mut server = STATE.server.write();
@@ -381,12 +351,13 @@ fn accept_packet(
let state = state_entry.or_default();
// the server might now send a channel_id if the user is in channel=0
if u.has_channel_id() || new {
if let Some(parent) = server.channels.get_mut(&state.channel) {
if let Some(parent) = server.channels_state.channels.get_mut(&state.channel) {
parent.users.remove(&id);
}
let channel_id = u.get_channel_id();
server
.channels_state
.channels
.entry(channel_id)
.or_default()
@@ -418,7 +389,7 @@ fn accept_packet(
let mut server = STATE.server.write();
let id = u.get_session();
if let Some(state) = server.users.remove(&id) {
if let Some(parent) = server.channels.get_mut(&state.channel) {
if let Some(parent) = server.channels_state.channels.get_mut(&state.channel) {
parent.users.remove(&id);
}
}