diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2020-10-23 02:48:16 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2020-10-23 02:48:16 +0200 |
| commit | 3294a1a552ab596a04191672c54b66deb73fe6e1 (patch) | |
| tree | 7a9f9c499663fb19cc8649c4bc1887b0fc51e670 /mumd/src | |
| parent | 83e144ef7ce0e922be14cd2ef2abc938ab971c65 (diff) | |
| download | mum-3294a1a552ab596a04191672c54b66deb73fe6e1.tar.gz | |
refactor parsing initial and updated user state
Diffstat (limited to 'mumd/src')
| -rw-r--r-- | mumd/src/state.rs | 90 |
1 files changed, 49 insertions, 41 deletions
diff --git a/mumd/src/state.rs b/mumd/src/state.rs index 85245a6..b27d401 100644 --- a/mumd/src/state.rs +++ b/mumd/src/state.rs @@ -210,59 +210,67 @@ impl State { warn!("Can't parse user state without session"); return None; } - let sess = msg.get_session(); + let session = msg.get_session(); // check if this is initial state - if !self.server().unwrap().users().contains_key(&sess) { - if !msg.has_name() { - warn!("Missing name in initial user state"); - } else if msg.get_name() == self.server().unwrap().username().unwrap() { - // this is us - *self.server_mut().unwrap().session_id_mut() = Some(sess); - } else { - // this is someone else - self.audio_mut().add_client(sess); - - // send notification only if we've passed the connecting phase - if *self.phase_receiver().borrow() == StatePhase::Connected { - let channel_id = if msg.has_channel_id() { - msg.get_channel_id() - } else { - 0 - }; - if let Some(channel) = self.server().unwrap().channels().get(&channel_id) { - libnotify::Notification::new("mumd", - Some(format!("{} connected and joined {}", - &msg.get_name(), - channel.name()).as_str()), - None) - .show().unwrap(); - } - } - } - self.server_mut().unwrap().users_mut().insert(sess, user::User::new(msg)); + if !self.server().unwrap().users().contains_key(&session) { + self.parse_initial_user_state(session, msg); None } else { - let user = self.server_mut().unwrap().users_mut().get_mut(&sess).unwrap(); - let diff = mumlib::state::UserDiff::from(msg); - user.apply_user_diff(&diff); - let user = self.server().unwrap().users().get(&sess).unwrap(); + Some(self.parse_updated_user_state(session, msg)) + } + } + + fn parse_initial_user_state(&mut self, session: u32, msg: msgs::UserState) { + if !msg.has_name() { + warn!("Missing name in initial user state"); + } else if msg.get_name() == self.server().unwrap().username().unwrap() { + // this is us + *self.server_mut().unwrap().session_id_mut() = Some(session); + } else { + // this is someone else + self.audio_mut().add_client(session); - // send notification - if let Some(channel_id) = diff.channel_id { + // send notification only if we've passed the connecting phase + if *self.phase_receiver().borrow() == StatePhase::Connected { + let channel_id = if msg.has_channel_id() { + msg.get_channel_id() + } else { + 0 + }; if let Some(channel) = self.server().unwrap().channels().get(&channel_id) { libnotify::Notification::new("mumd", - Some(format!("{} moved to channel {}", - &user.name(), - channel.name()).as_str()), + Some(format!("{} connected and joined {}", + &msg.get_name(), + channel.name()).as_str()), None) .show().unwrap(); - } else { - warn!("{} moved to invalid channel {}", &user.name(), channel_id); } } + } + self.server_mut().unwrap().users_mut().insert(session, user::User::new(msg)); + } - Some(diff) + fn parse_updated_user_state(&mut self, session: u32, msg: msgs::UserState) -> mumlib::state::UserDiff { + let user = self.server_mut().unwrap().users_mut().get_mut(&session).unwrap(); + let diff = mumlib::state::UserDiff::from(msg); + user.apply_user_diff(&diff); + let user = self.server().unwrap().users().get(&session).unwrap(); + + // send notification + if let Some(channel_id) = diff.channel_id { + if let Some(channel) = self.server().unwrap().channels().get(&channel_id) { + libnotify::Notification::new("mumd", + Some(format!("{} moved to channel {}", + &user.name(), + channel.name()).as_str()), + None) + .show().unwrap(); + } else { + warn!("{} moved to invalid channel {}", &user.name(), channel_id); + } } + + diff } pub fn remove_client(&mut self, msg: msgs::UserRemove) { |
