diff options
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..1e3be91 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,70 @@ +#![feature(test)] +extern crate test; + +use anyhow::Result; + +use irc::client::prelude::*; + +pub mod config; +pub mod hooks; + +pub use macros::catinator; + +#[macro_export] +macro_rules! reply { + ( $msg:expr, $text:expr ) => { + bot.send_privmsg($msg.response_target().unwrap(), $text.as_str())?; + }; +} + + +pub struct Bot { + pub config: config::Config, + pub irc_client: irc::client::Client, +} + +impl Bot { + pub async fn new(config_path: &str) -> Result<Bot> { + use std::fs; + + let config_str = fs::read_to_string(config_path)?; + let config: config::Config = toml::from_str(&config_str)?; + + let irc_config: Config = config.clone().into(); + + let irc_client = Client::from_config(irc_config.clone()).await?; + + Ok(Bot { irc_client, config }) + } + + pub async fn sasl_init(&self) -> Result<()> { + self.irc_client + .send_cap_req(&vec![irc::client::prelude::Capability::Sasl])?; + self.irc_client + .send(Command::NICK(self.config.user.nickname.clone()))?; + self.irc_client.send(Command::USER( + self.config.user.nickname.clone(), + "0".to_owned(), + self.config.user.realname.clone(), + ))?; + self.irc_client.send_sasl_plain()?; + + Ok(()) + } + + pub fn send_privmsg( + &self, + target: &str, + message: &str, + ) -> std::result::Result<(), irc::error::Error> { + self.irc_client.send_privmsg(target, message) + } + + pub fn send_notice( + &self, + target: &str, + message: &str, + ) -> std::result::Result<(), irc::error::Error> { + self.irc_client.send_notice(target, message) + } +} |
