From f98c4d84b24698187102bcc3660246b2a1acb23d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Wed, 21 Oct 2020 01:41:34 +0200 Subject: update user state in mumd --- mumctl/src/main.rs | 4 ++-- mumd/src/state.rs | 57 ++++++++++++++++++++++++++++++----------------------- mumlib/src/state.rs | 45 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 28 deletions(-) diff --git a/mumctl/src/main.rs b/mumctl/src/main.rs index 6e97296..1ed48dc 100644 --- a/mumctl/src/main.rs +++ b/mumctl/src/main.rs @@ -172,7 +172,7 @@ fn main() { }; if let Some(config) = config { - config.write_default_cfg(); + config.write_default_cfg().unwrap(); } } @@ -364,7 +364,7 @@ fn print_channel(channel: &Channel, depth: usize) { ); for user in &channel.users { println!( - "{}-{}", + "{}- {}", iter::repeat(INDENTATION) .take(depth + 1) .collect::(), diff --git a/mumd/src/state.rs b/mumd/src/state.rs index 8dc3d68..e9db616 100644 --- a/mumd/src/state.rs +++ b/mumd/src/state.rs @@ -198,9 +198,12 @@ impl State { self.audio_mut().add_client(sess); } self.server_mut().unwrap().users_mut().insert(sess, User::new(msg)); - return None; + None } else { - return Some(self.server_mut().unwrap().users_mut().get(&sess).unwrap().parse_state_diff(msg)); + let user = self.server_mut().unwrap().users_mut().get_mut(&sess).unwrap(); + let diff = UserDiff::from(msg); + user.apply_user_diff(&diff); + Some(diff) } } @@ -270,6 +273,7 @@ pub struct Server { host: Option, } + impl Server { pub fn new() -> Self { Self { @@ -600,39 +604,42 @@ impl User { } } - pub fn parse_state_diff(&self, mut msg: msgs::UserState) -> UserDiff { - let mut ud = UserDiff::new(); - if msg.has_comment() { - ud.comment = Some(msg.take_comment()); + pub fn apply_user_diff(&mut self, diff: &UserDiff) { + debug!("applying user diff\n{:#?}", diff); + if let Some(comment) = diff.comment.clone() { + self.comment = Some(comment); } - if msg.has_hash() { - ud.hash = Some(msg.take_hash()); + if let Some(hash) = diff.hash.clone() { + self.hash = Some(hash); } - if msg.has_name() { - ud.name = Some(msg.take_name()); + if let Some(name) = diff.name.clone() { + self.name = name; } - if msg.has_priority_speaker() { - ud.priority_speaker = Some(msg.get_priority_speaker()); + if let Some(priority_speaker) = diff.priority_speaker { + self.priority_speaker = priority_speaker; } - if msg.has_recording() { - ud.recording = Some(msg.get_recording()); + if let Some(recording) = diff.recording { + self.recording = recording; } - if msg.has_suppress() { - ud.suppress = Some(msg.get_suppress()); + if let Some(suppress) = diff.suppress { + self.suppress = suppress; } - if msg.has_self_mute() { - ud.self_mute = Some(msg.get_self_mute()); + if let Some(self_mute) = diff.self_mute { + self.self_mute = self_mute; } - if msg.has_self_deaf() { - ud.self_deaf = Some(msg.get_self_deaf()); + if let Some(self_deaf) = diff.self_deaf { + self.self_deaf = self_deaf; } - if msg.has_mute() { - ud.mute = Some(msg.get_mute()); + if let Some(mute) = diff.mute { + self.mute = mute; } - if msg.has_deaf() { - ud.deaf = Some(msg.get_deaf()); + if let Some(deaf) = diff.deaf { + self.deaf = deaf; + } + + if let Some(channel_id) = diff.channel_id { + self.channel = channel_id; } - ud } pub fn name(&self) -> &str { diff --git a/mumlib/src/state.rs b/mumlib/src/state.rs index ef25a79..b6b4039 100644 --- a/mumlib/src/state.rs +++ b/mumlib/src/state.rs @@ -1,3 +1,4 @@ +use mumble_protocol::control::msgs; use serde::export::Formatter; use serde::{Deserialize, Serialize}; use std::fmt::Display; @@ -116,7 +117,7 @@ impl<'a> Iterator for UsersIter<'a> { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct User { - pub comment: Option, + pub comment: Option, //TODO not option, empty string instead pub hash: Option, pub name: String, pub priority_speaker: bool, @@ -148,6 +149,8 @@ pub struct UserDiff { pub self_deaf: Option, // by self pub mute: Option, // by admin pub deaf: Option, // by admin + + pub channel_id: Option, } impl UserDiff { @@ -155,3 +158,43 @@ impl UserDiff { UserDiff::default() } } + +impl From for UserDiff { + fn from(mut msg: msgs::UserState) -> Self { + let mut ud = UserDiff::new(); + if msg.has_comment() { + ud.comment = Some(msg.take_comment()); + } + if msg.has_hash() { + ud.hash = Some(msg.take_hash()); + } + if msg.has_name() { + ud.name = Some(msg.take_name()); + } + if msg.has_priority_speaker() { + ud.priority_speaker = Some(msg.get_priority_speaker()); + } + if msg.has_recording() { + ud.recording = Some(msg.get_recording()); + } + if msg.has_suppress() { + ud.suppress = Some(msg.get_suppress()); + } + if msg.has_self_mute() { + ud.self_mute = Some(msg.get_self_mute()); + } + if msg.has_self_deaf() { + ud.self_deaf = Some(msg.get_self_deaf()); + } + if msg.has_mute() { + ud.mute = Some(msg.get_mute()); + } + if msg.has_deaf() { + ud.deaf = Some(msg.get_deaf()); + } + if msg.has_channel_id() { + ud.channel_id = Some(msg.get_channel_id()); + } + ud + } +} -- cgit v1.2.1