From ab3ff0ab16ce9a99a5d37bc8ea46e753db7d0a83 Mon Sep 17 00:00:00 2001 From: ErrorNoInternet Date: Thu, 20 Mar 2025 18:13:56 -0400 Subject: [PATCH] refactor!(matrix): move options into a table --- main.lua | 2 +- src/events.rs | 9 ++------- src/matrix/bot.rs | 18 ++---------------- src/matrix/mod.rs | 32 ++++++++++++++++++++++++-------- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/main.lua b/main.lua index 53d1ca7..308b562 100644 --- a/main.lua +++ b/main.lua @@ -2,7 +2,7 @@ Server = "localhost" Username = "ErrorNoWatcher" HttpAddress = "127.0.0.1:8080" Owners = { "ErrorNoInternet" } -MatrixOwners = { "@errornointernet:envs.net" } +Matrix = { Owners = { "@errornointernet:envs.net" } } for _, module in ipairs({ "lib", diff --git a/src/events.rs b/src/events.rs index afb2f57..157ef54 100644 --- a/src/events.rs +++ b/src/events.rs @@ -278,15 +278,10 @@ async fn lua_init(client: Client, state: &State, globals: &Table) -> Result<()> #[cfg(feature = "matrix")] fn matrix_init(client: &Client, state: State) { let globals = state.lua.globals(); - if let Ok(homeserver_url) = globals.get::("MatrixHomeserverUrl") - && let Ok(username) = globals.get::("MatrixUsername") - && let Ok(password) = globals.get::("MatrixPassword") - { + if let Ok(matrix_options) = globals.get::("MatrixOptions") { let name = client.username(); tokio::spawn(async move { - if let Err(error) = - matrix::login(homeserver_url, username, &password, state, globals, name).await - { + if let Err(error) = matrix::login(state, matrix_options, globals, name).await { error!("failed to log into matrix account: {error:?}"); } }); diff --git a/src/matrix/bot.rs b/src/matrix/bot.rs index 30c3e1a..1166185 100644 --- a/src/matrix/bot.rs +++ b/src/matrix/bot.rs @@ -28,15 +28,7 @@ pub async fn on_regular_room_message( return Ok(()); }; - if ctx - .state - .lua - .globals() - .get::>("MatrixOwners") - .unwrap_or_default() - .contains(&event.sender.to_string()) - && text_content.body.starts_with(&ctx.name) - { + if ctx.is_owner(&event.sender.to_string()) && text_content.body.starts_with(&ctx.name) { let body = text_content.body[ctx.name.len()..] .trim_start_matches(':') .trim(); @@ -101,13 +93,7 @@ pub async fn on_stripped_state_member( ) -> Result<()> { if let Some(user_id) = client.user_id() && member.state_key == user_id - && ctx - .state - .lua - .globals() - .get::>("MatrixOwners") - .unwrap_or_default() - .contains(&member.sender.to_string()) + && ctx.is_owner(&member.sender.to_string()) { debug!("joining room {}", room.room_id()); while let Err(error) = room.join().await { diff --git a/src/matrix/mod.rs b/src/matrix/mod.rs index 5b01556..51a45fb 100644 --- a/src/matrix/mod.rs +++ b/src/matrix/mod.rs @@ -20,6 +20,23 @@ pub struct Context { name: String, } +impl Context { + fn is_owner(&self, name: &String) -> bool { + self.state + .lua + .globals() + .get::
("MatrixOptions") + .ok() + .and_then(|options| { + options + .get::>("Owners") + .ok() + .and_then(|owners| owners.contains(name).then_some(())) + }) + .is_some() + } +} + #[derive(Clone, Serialize, Deserialize)] struct Session { #[serde(skip_serializing_if = "Option::is_none")] @@ -37,14 +54,13 @@ async fn persist_sync_token( Ok(()) } -pub async fn login( - homeserver_url: String, - username: String, - password: &str, - state: State, - globals: Table, - name: String, -) -> Result<()> { +pub async fn login(state: State, options: Table, globals: Table, name: String) -> Result<()> { + let (homeserver_url, username, password) = ( + options.get::("HomeserverUrl")?, + options.get::("Username")?, + &options.get::("Password")?, + ); + let root_dir = dirs::data_dir() .context("no data directory")? .join("errornowatcher")