aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'mumd/src/state.rs')
-rw-r--r--mumd/src/state.rs99
1 files changed, 97 insertions, 2 deletions
diff --git a/mumd/src/state.rs b/mumd/src/state.rs
index 56ce030..a767d30 100644
--- a/mumd/src/state.rs
+++ b/mumd/src/state.rs
@@ -68,9 +68,13 @@ impl State {
packet_sender: mpsc::UnboundedSender<ControlPacket<Serverbound>>,
connection_info_sender: watch::Sender<Option<ConnectionInfo>>,
) -> Self {
- let audio = Audio::new();
+ let config = mumlib::config::read_default_cfg();
+ let audio = Audio::new(
+ config.audio.input_volume.unwrap_or(1.0),
+ config.audio.output_volume.unwrap_or(1.0),
+ );
let mut state = Self {
- config: mumlib::config::read_default_cfg(),
+ config,
server: None,
audio,
packet_sender,
@@ -229,6 +233,97 @@ impl State {
self.audio.set_output_volume(volume);
now!(Ok(None))
}
+ Command::DeafenSelf(toggle) => {
+ if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) {
+ return now!(Err(Error::DisconnectedError));
+ }
+
+ let action = match toggle {
+ Some(state) => {
+ if self.server().unwrap().deafened() != state {
+ Some(state)
+ } else {
+ None
+ }
+ }
+ None => Some(!self.server().unwrap().deafened()),
+ };
+
+ if let Some(action) = action {
+ if action {
+ self.server_mut().unwrap().set_muted(true);
+ }
+ let mut msg = msgs::UserState::new();
+ msg.set_self_deaf(action);
+ self.packet_sender.send(msg.into()).unwrap();
+ self.server_mut().unwrap().set_deafened(action);
+ }
+
+ now!(Ok(None))
+ }
+ Command::MuteSelf(toggle) => {
+ if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) {
+ return now!(Err(Error::DisconnectedError));
+ }
+
+ let action = match toggle {
+ Some(state) => {
+ if self.server().unwrap().muted() != state {
+ Some(state)
+ } else {
+ None
+ }
+ }
+ None => Some(!self.server().unwrap().muted()),
+ };
+
+ if let Some(action) = action {
+ if !action {
+ self.server_mut().unwrap().set_deafened(false);
+ }
+ let mut msg = msgs::UserState::new();
+ msg.set_self_mute(action);
+ self.packet_sender.send(msg.into()).unwrap();
+ self.server_mut().unwrap().set_muted(action);
+ }
+
+ now!(Ok(None))
+ }
+ Command::MuteOther(string, toggle) => {
+ if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) {
+ return now!(Err(Error::DisconnectedError));
+ }
+
+ let id = self
+ .server_mut()
+ .unwrap()
+ .users_mut()
+ .iter_mut()
+ .find(|(_, user)| user.name() == &string);
+
+ let (id, user) = match id {
+ Some(id) => (*id.0, id.1),
+ None => return now!(Err(Error::InvalidUsernameError(string))),
+ };
+
+ let action = match toggle {
+ Some(state) => {
+ if user.suppressed() != state {
+ Some(state)
+ } else {
+ None
+ }
+ }
+ None => Some(!user.suppressed()),
+ };
+
+ if let Some(action) = action {
+ user.set_suppressed(action);
+ self.audio.set_mute(id, action);
+ }
+
+ return now!(Ok(None));
+ }
Command::UserVolumeSet(string, volume) => {
if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) {
return now!(Err(Error::DisconnectedError));