diff --git a/config.toml b/config.toml index d9fa710..218d06a 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,4 @@ -channels = ["#main", "#main2"] +channels = ["#main", "#circe"] host = "192.168.1.28" mode = "+B" nickname = "circe" diff --git a/src/lib.rs b/src/lib.rs index 269b265..bceefbb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -89,6 +89,14 @@ pub enum Command { NICK(String), /// Everything that is not a command OTHER(String), + /// Leaves channels + /// ```no_run + /// # use circe::* + /// # let mut client = Client::new(Config::from_toml("config.toml")?)?; + /// client.write_part(Command::PART("#main".to_string()))?; + /// # Ok::<(), std::io::Error>(()) + /// ``` + PART(String), #[doc(hidden)] PING(String), #[doc(hidden)] @@ -106,6 +114,14 @@ pub enum Command { /// Message String, ), + /// Leaves the IRC and shuts down the TCP stream + /// ```no_run + /// # use circe::* + /// # let mut client = Client::new(Config::from_toml("config.toml")?)?; + /// client.write_command(Command::QUIT("Leaving...".to_string()))?; + /// # Ok::<(), std::io::Error>(()) + /// ``` + QUIT(String), #[doc(hidden)] USER(String, String, String, String), } @@ -285,6 +301,10 @@ impl Client { "Cannot write commands of type OTHER", )); } + PART(target) => { + let formatted = format!("PART {}", target); + Cow::Owned(formatted) as Cow + } PING(target) => { let formatted = format!("PING {}", target); Cow::Owned(formatted) as Cow @@ -297,6 +317,10 @@ impl Client { let formatted = format!("PRIVMSG {} {}", target, message); Cow::Owned(formatted) as Cow } + QUIT(message) => { + let formatted = format!("QUIT {}", message); + Cow::Owned(formatted) as Cow + } USER(username, s1, s2, realname) => { let formatted = format!("USER {} {} {} :{}", username, s1, s2, realname); Cow::Owned(formatted) as Cow @@ -378,6 +402,59 @@ impl Client { } Ok(()) } + + /// Helper function for leaving channels. + /// This makes + /// ```no_run + /// # use circe::*; + /// # let mut client = Client::new(Config::from_toml("config.toml")?)?; + /// client.send_part("#main")?; + /// # Ok::<(), std::io::Error>(()) + /// ``` + /// + /// equivalent to + /// + /// ```no_run + /// # use circe::* + /// # let mut client = Client::new(Config::from_toml("config.toml")?)?; + /// client.write_part(Command::PART("#main".to_string()))?; + /// # Ok::<(), std::io::Error>(()) + /// ``` + pub fn send_part(&mut self, target: &str) -> Result<(), Error> { + self.write_command(Command::PART(target.to_string()))?; + Ok(()) + } + + /// Helper function for leaving the IRC server and shutting down the TCP stream afterwards. + /// This makes + /// ```no_run + /// # use circe::*; + /// # let mut client = Client::new(Config::from_toml("config.toml")?)?; + /// client.send_quit(None)?; + /// # Ok::<(), std::io::Error>(()) + /// ``` + /// + /// equivalent to + /// + /// ```no_run + /// # use circe::* + /// # let mut client = Client::new(Config::from_toml("config.toml")?)?; + /// client.write_part(Command::QUIT("Leaving...".to_string()))?; + /// client.stream.shutdown(std::net::Shutdown::Both)?; + /// # Ok::<(), std::io::Error>(()) + /// ``` + pub fn send_quit(&mut self, message: Option<&str>) -> Result<(), Error> { + if let Some(message) = message { + self.write_command(Command::QUIT(message.to_string()))?; + } else { + self.write_command(Command::QUIT( + "circe 0.1.2 (https://crates.io/crates/circe)".to_string(), + ))?; + } + self.stream.shutdown(std::net::Shutdown::Both)?; + + Ok(()) + } } impl Config { @@ -386,7 +463,7 @@ impl Config { /// ```rust /// # use circe::*; /// let config = Config::new( - /// vec!["#main", "#main2"], + /// vec!["#main", "#circe"], /// "192.168.178.100", /// Some("+B"), /// Some("IRSC"), diff --git a/src/main.rs b/src/main.rs index c33cee8..fbcdcce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,10 +12,10 @@ macro_rules! loop_n { fn main() -> Result<(), std::io::Error> { //let config = Config::from_toml("config.toml")?; let config = Config::new( - vec!["#main", "#main2"], + vec!["#main", "#circe"], "192.168.178.100", Some("+B"), - Some("IRSC"), + Some("circe"), 6667, "circe", ); @@ -28,8 +28,17 @@ fn main() -> Result<(), std::io::Error> { print!("{}", line); } if let Command::PRIVMSG(channel, message) = command { + if message.contains("!quit") { + client.send_quit(None)?; + break; + } + + if message.contains("!close") { + client.send_part("#main")?; + } println!("PRIVMSG received: {} {}", channel, message); } } } + Ok(()) }