aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-06-07 17:58:06 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-06-07 17:58:06 +0200
commitc6d63f0b5c231bfc42128a670923a660fabd1835 (patch)
tree44af7c6c6937eda97a3f8bafb575b9d763d36aa3
parentbe76c2aa51733a0cf495e92659fbcbe527f41149 (diff)
downloadmum-c6d63f0b5c231bfc42128a670923a660fabd1835.tar.gz
default send message to current channel if no channel specified
-rw-r--r--mumctl/src/main.rs12
-rw-r--r--mumd/src/state.rs22
-rw-r--r--mumd/src/state/server.rs6
-rw-r--r--mumlib/src/command.rs1
-rw-r--r--mumlib/src/error.rs2
5 files changed, 34 insertions, 9 deletions
diff --git a/mumctl/src/main.rs b/mumctl/src/main.rs
index bde24a1..7d02582 100644
--- a/mumctl/src/main.rs
+++ b/mumctl/src/main.rs
@@ -381,10 +381,14 @@ fn match_opt() -> Result<(), Error> {
} => {
let msg = MumCommand::SendMessage {
message,
- targets: names
- .into_iter()
- .map(|name| MessageTarget::Channel { name, recursive })
- .collect(),
+ targets: if !names.is_empty() {
+ names
+ .into_iter()
+ .map(|name| MessageTarget::Channel { name, recursive })
+ .collect()
+ } else {
+ vec![MessageTarget::CurrentChannel { recursive }]
+ },
};
send_command(msg)??;
}
diff --git a/mumd/src/state.rs b/mumd/src/state.rs
index 84583e0..a57b53d 100644
--- a/mumd/src/state.rs
+++ b/mumd/src/state.rs
@@ -687,14 +687,26 @@ pub fn handle_command(
for target in targets {
match target {
+ MessageTarget::CurrentChannel { recursive } => {
+ let channel_id = match state.server().unwrap().current_channel() {
+ Some(channel)=> channel.0,
+ None => return now!(Err(Error::NotConnectedToChannel)),
+ };
+
+ if recursive {
+ msg.mut_tree_id()
+ } else {
+ msg.mut_channel_id()
+ }
+ .push(channel_id);
+ }
MessageTarget::Channel { recursive, name } => {
- let channel_id = state.server().unwrap().channel_name(&name);
+ let channel = state.server().unwrap().channel_name(&name);
- let channel_id = match channel_id {
- Ok(id) => id,
+ let channel_id = match channel {
+ Ok(channel) => channel.0,
Err(e) => return now!(Err(Error::ChannelIdentifierError(name, e))),
- }
- .0;
+ };
if recursive {
msg.mut_tree_id()
diff --git a/mumd/src/state/server.rs b/mumd/src/state/server.rs
index 869940a..58c614c 100644
--- a/mumd/src/state/server.rs
+++ b/mumd/src/state/server.rs
@@ -132,6 +132,12 @@ impl Server {
})
}
+ pub fn current_channel(&self) -> Option<(u32, &Channel)> {
+ let channel_id = self.users().get(&self.session_id()?)?.channel();
+ let channel = self.channels().get(&channel_id)?;
+ Some((channel_id, channel))
+ }
+
pub fn host_mut(&mut self) -> &mut Option<String> {
&mut self.host
}
diff --git a/mumlib/src/command.rs b/mumlib/src/command.rs
index 351d7f6..f8a8fc8 100644
--- a/mumlib/src/command.rs
+++ b/mumlib/src/command.rs
@@ -69,6 +69,7 @@ pub enum CommandResponse {
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum MessageTarget {
+ CurrentChannel {recursive: bool },
Channel { recursive: bool, name: String },
User { name: String },
}
diff --git a/mumlib/src/error.rs b/mumlib/src/error.rs
index e88bd97..83f97b8 100644
--- a/mumlib/src/error.rs
+++ b/mumlib/src/error.rs
@@ -11,6 +11,7 @@ pub enum Error {
InvalidServerAddr(String, u16),
InvalidUsername(String),
InvalidServerPassword,
+ NotConnectedToChannel,
}
impl std::error::Error for Error {}
@@ -26,6 +27,7 @@ impl fmt::Display for Error {
}
Error::InvalidUsername(username) => write!(f, "Invalid username: {}", username),
Error::InvalidServerPassword => write!(f, "Invalid server password"),
+ Error::NotConnectedToChannel => write!(f, "Not connected to a channel"),
}
}
}