diff --git a/src/cmd/cmd.rs b/src/cmd/cmd.rs deleted file mode 100644 index 5d7023815a64385a22b485351930eba2908bde9f..0000000000000000000000000000000000000000 --- a/src/cmd/cmd.rs +++ /dev/null @@ -1,45 +0,0 @@ -use log::error; -use std::{process::abort, string::String}; - -#[allow(dead_code)] -pub enum CmdHandler { - Simple(fn(Vec<String>) -> bool), - Echo(fn(Vec<String>) -> String), - MultiEcho(fn(Vec<String>) -> Vec<String>), -} - -#[allow(dead_code)] -pub struct Cmd { - name: String, - argc: u32, - handler: CmdHandler, -} - -impl Cmd { - #[allow(dead_code)] - pub fn matches(&self, name: &String, args: &Vec<String>) -> bool { - (self.name == *name) && (self.argc as usize == args.len()) - } - - #[allow(dead_code)] - pub fn exec(&self, args: Vec<String>) -> String { - if args.len() != self.argc as usize { - error!("Arg count doesn't match"); - abort(); - } - - match self.handler { - CmdHandler::Simple(f) => match f(args) { - true => "<b>Ok</b>".to_string(), - false => "<b>Failed!</b>".to_string(), - }, - CmdHandler::Echo(f) => f(args), - CmdHandler::MultiEcho(f) => f(args).join("<br>---"), - } - } - - #[allow(dead_code)] - pub fn get_name(&self) -> &str { - &self.name - } -} diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index bf3e74743a324e397f6f6b41be79bd8e65cb9a78..0db744d38e7eb2329b7a4e5817d8f9e5a6fb6984 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -1,3 +1,48 @@ pub mod acl; -pub mod cmd; pub mod package; + +use log::error; +use std::{process::abort, string::String}; + +#[allow(dead_code)] +pub enum CmdHandler { + Simple(fn(Vec<String>) -> bool), + Echo(fn(Vec<String>) -> String), + MultiEcho(fn(Vec<String>) -> Vec<String>), +} + +#[allow(dead_code)] +pub struct Cmd { + name: String, + argc: u32, + handler: CmdHandler, +} + +impl Cmd { + #[allow(dead_code)] + pub fn matches(&self, name: &String, args: &Vec<String>) -> bool { + (self.name == *name) && (self.argc as usize == args.len()) + } + + #[allow(dead_code)] + pub fn exec(&self, args: Vec<String>) -> String { + if args.len() != self.argc as usize { + error!("Arg count doesn't match"); + abort(); + } + + match self.handler { + CmdHandler::Simple(f) => match f(args) { + true => "<b>Ok</b>".to_string(), + false => "<b>Failed!</b>".to_string(), + }, + CmdHandler::Echo(f) => f(args), + CmdHandler::MultiEcho(f) => f(args).join("<br>---"), + } + } + + #[allow(dead_code)] + pub fn get_name(&self) -> &str { + &self.name + } +} diff --git a/src/cmd/package.rs b/src/cmd/package.rs index 44b2865f1492ca6e5b76a45ed2dc2e476e5c9f28..437f993b63721adf24be65a60d845424d543290a 100644 --- a/src/cmd/package.rs +++ b/src/cmd/package.rs @@ -1,6 +1,6 @@ use crate::cmd::{ acl::{CmdAcl, CmdAdminRegister}, - cmd::Cmd, + Cmd, }; use ini::Properties as IniSection; use matrix_sdk::{room::Room, ruma::UserId}; @@ -34,7 +34,7 @@ impl CmdPackage { } #[allow(dead_code)] - pub fn from_config(section: IniSection, commands: Vec<Cmd>) -> CmdPackage { + pub fn from_config(section: &IniSection, commands: Vec<Cmd>) -> CmdPackage { CmdPackage { name: section.get("name").unwrap().to_string(), acl: CmdAcl::from_string(section.get("acl").unwrap().to_string()), diff --git a/src/config.rs b/src/config.rs index fcdef0ed81dedd6246a876ad129f9837c6f9d7d7..46a24fcd3b6fde99830794cbc2c3e1650b9d077c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -use ini::{Error::Io as IniErrIo, Error::Parse as IniErrParse, Ini}; +use ini::{Error::Io as IniErrIo, Error::Parse as IniErrParse, Ini, Properties as IniSection}; use log::{error, info, warn, LevelFilter}; use std::{env, path::Path, process::abort, str::FromStr}; use url::Url; @@ -13,6 +13,14 @@ pub struct Config { pub handle_state_member: bool, // Install handler for state memver changes pub handle_room_message: bool, // Install handler for room messages + + ini_handler: Ini, +} + +impl Config { + pub fn section(&self, name: &str) -> Option<&IniSection> { + self.ini_handler.section(Some(name)) + } } pub fn setup_logging() { @@ -62,6 +70,7 @@ pub fn from_file(file_name: &String) -> Result<Config, String> { .unwrap_or(false), handle_state_member: <bool as FromStr>::from_str(&handle_state_member_str) .unwrap_or(false), + ini_handler: conf, }), }; } diff --git a/src/matrix.rs b/src/matrix.rs index bd364e70bbe43c0fcf65adb3ea5272fd3db25198..2b2e4aace47a36f52c10190cf83d441452fee813 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -1,4 +1,4 @@ -use crate::config::Config; +use crate::{config::Config, cmd::package::CmdPackage, cmd::{ Cmd, CmdHandler}}; use futures::future::join_all; use log::{error, info, warn}; use matrix_sdk::{ @@ -16,7 +16,7 @@ use matrix_sdk::{ }, Client, Result, SyncSettings, }; -use std::convert::TryFrom; +use std::{convert::TryFrom,process::abort}; use tokio::time::{sleep, Duration}; async fn join_room(room: &Invited) { @@ -128,6 +128,14 @@ async fn startup_and_log_rooms(client: &Client) { } pub async fn connect_and_handle(config: Config) -> Result<()> { + // TODO: Refactor + let _pkg = match config.section("basic") { + Some(section) => CmdPackage::from_config(§ion, vec![]), + None => { + abort(); + } + }; + let alice = UserId::try_from(config.user_name)?; let client = Client::new(config.homeserver_url)?;