simple channel & user tree

This commit is contained in:
2024-09-28 03:16:57 -06:00
parent e19333d686
commit 8fd40a9a5a
4 changed files with 161 additions and 5 deletions
+78 -3
View File
@@ -1,5 +1,7 @@
pub mod app;
use app::ChannelState;
use app::UserState;
use dioxus::prelude::*;
use anyhow::Error;
@@ -28,7 +30,6 @@ use web_sys::window;
use web_sys::AudioContext;
use web_sys::AudioContextOptions;
use web_sys::AudioData;
use web_sys::AudioDataInit;
use web_sys::AudioDecoder;
use web_sys::AudioDecoderConfig;
use web_sys::AudioDecoderInit;
@@ -368,6 +369,7 @@ pub async fn network_entrypoint(mut event_rx: UnboundedReceiver<Command>) {
panic!("Did not receive connect command")
};
*STATE.server.write() = Default::default();
*STATE.status.write() = ConnectionState::Connecting;
console::log_1(&"Rust via WASM!".into());
@@ -540,6 +542,9 @@ fn accept_packet(
audio_context: &AudioContext,
decoder_map: &mut HashMap<u32, AudioDecoder>,
) {
if !matches!(msg, ControlPacket::UDPTunnel(_)) {
console::log_1(&format!("{:#?}", msg).into());
}
match msg {
ControlPacket::UDPTunnel(u) => {
match *u.clone() {
@@ -579,8 +584,78 @@ fn accept_packet(
}
}
}
_ => {
console::log_1(&format!("{:#?}", msg).into());
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();
}
}
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);
}
}
}
ControlPacket::UserState(u) => {
let mut server = STATE.server.write();
let server = &mut *server;
let id = u.get_session();
let state = server.users.entry(id).or_default();
if u.has_channel_id() {
if let Some(parent) = server.channels.get_mut(&state.channel) {
parent.users.remove(&id);
}
let channel_id = u.get_channel_id();
server
.channels
.entry(channel_id)
.or_default()
.users
.insert(id);
state.channel = channel_id;
}
if u.has_name() {
state.name = u.get_name().to_string();
}
}
ControlPacket::UserRemove(u) => {
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) {
parent.users.remove(&id);
}
}
}
_ => {}
}
}