aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-10-21 01:41:34 +0200
committerGustav Sörnäs <gustav@sornas.net>2020-10-21 01:41:34 +0200
commitf98c4d84b24698187102bcc3660246b2a1acb23d (patch)
tree48d9076940ff2c9b4d24856490f9309d01dd62d2
parentd9a3470fcb4c8c63dd5fb76dd7f2f7eb977d8b0d (diff)
downloadmum-f98c4d84b24698187102bcc3660246b2a1acb23d.tar.gz
update user state in mumd
-rw-r--r--mumctl/src/main.rs4
-rw-r--r--mumd/src/state.rs57
-rw-r--r--mumlib/src/state.rs45
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::<String>(),
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<String>,
}
+
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<String>,
+ pub comment: Option<String>, //TODO not option, empty string instead
pub hash: Option<String>,
pub name: String,
pub priority_speaker: bool,
@@ -148,6 +149,8 @@ pub struct UserDiff {
pub self_deaf: Option<bool>, // by self
pub mute: Option<bool>, // by admin
pub deaf: Option<bool>, // by admin
+
+ pub channel_id: Option<u32>,
}
impl UserDiff {
@@ -155,3 +158,43 @@ impl UserDiff {
UserDiff::default()
}
}
+
+impl From<msgs::UserState> 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
+ }
+}