aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/state.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-10-23 02:48:16 +0200
committerGustav Sörnäs <gustav@sornas.net>2020-10-23 02:48:16 +0200
commit3294a1a552ab596a04191672c54b66deb73fe6e1 (patch)
tree7a9f9c499663fb19cc8649c4bc1887b0fc51e670 /mumd/src/state.rs
parent83e144ef7ce0e922be14cd2ef2abc938ab971c65 (diff)
downloadmum-3294a1a552ab596a04191672c54b66deb73fe6e1.tar.gz
refactor parsing initial and updated user state
Diffstat (limited to 'mumd/src/state.rs')
-rw-r--r--mumd/src/state.rs90
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) {