smol bot
swap mutex
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/bot/mod.rs | 26 | ||||
| -rw-r--r-- | src/bot/ownership.rs | 36 | ||||
| -rw-r--r-- | src/expose.rs | 8 |
4 files changed, 42 insertions, 29 deletions
@@ -52,6 +52,7 @@ serde = "1.0.204" atools = "0.1.5" # edg = { path = "../edg" } httpdate = "1.0.3" +pollster = "0.3.0" [profile.release] diff --git a/src/bot/mod.rs b/src/bot/mod.rs index d8dfdb3..cb26fc9 100644 --- a/src/bot/mod.rs +++ b/src/bot/mod.rs @@ -1,6 +1,6 @@ mod logic; mod map; -mod ownership; +pub mod ownership; mod schematic; pub mod search; @@ -154,7 +154,7 @@ pub async fn scour(c: Context<'_>, ch: ChannelId) -> Result<()> { if let Ok(Some(mut x)) = schematic::from((&msg.content, &msg.attachments)).await { x.schem.tags.insert("labels".into(), tags); let who = msg.author_nick(c).await.unwrap_or(msg.author.name.clone()); - ownership::insert(msg.id.get(), (msg.author.name.clone(), msg.author.id.get())); + ownership::insert(msg.id.get(), (msg.author.name.clone(), msg.author.id.get())).await; git::write(d, msg.id, x); git::commit(&who, &format!("add {:x}.msch", msg.id.get())); msg.react(c, emojis::get!(MERGE)).await?; @@ -225,10 +225,6 @@ pub mod git { path(dir, x).exists() } - pub fn whos(x: MessageId) -> String { - ownership::get(x.get()).0 - } - pub fn remove(dir: &str, x: MessageId) { assert!(std::process::Command::new("git") .current_dir("repo") @@ -309,7 +305,7 @@ impl Bot { let m = c.http().get_message(*channel_id,* message_id).await?; if let Ok(s) = git::schem(dir,*message_id) { let who = nick.as_deref().unwrap_or(&user.name); - let own = git::whos(*message_id); + let own = ownership::erase(message_id.get()).await.unwrap(); git::remove(dir, *message_id); git::commit(who, &format!("remove {:x}.msch", message_id.get())); git::push(); @@ -322,7 +318,6 @@ impl Bot { .embed(CreateEmbed::new().color(RM) .description(format!("https://discord.com/channels/925674713429184564/{channel_id}/{message_id} {} {} (added by {own}) (`{:x}`)", emojis::get!(DENY), emoji::mindustry::to_discord(&strip_colors(s.tags.get("name").unwrap())), message_id.get()))) ).await; - ownership::erase(message_id.get()); }; } FullEvent::GuildCreate { guild ,..} => { @@ -378,7 +373,7 @@ impl Bot { } if let Some(dir) = dir { // add :) - ownership::insert(m.id.get(), (m.author.name.clone(), m.author.id.get())); + ownership::insert(m.id.get(), (m.author.name.clone(), m.author.id.get())).await; send(c,|x| x .avatar_url(new_message.author.avatar_url().unwrap_or(CAT.to_string())) .username(&who) @@ -451,8 +446,7 @@ impl Bot { } => { if let Some(Ch{ d:dir,..}) = SPECIAL.get(&channel_id.get()) { if let Ok(s) = git::schem(dir, *deleted_message_id) { - ownership::erase(deleted_message_id.get()); - let own = git::whos(*deleted_message_id); + let own = ownership::erase(deleted_message_id.get()).await.unwrap(); git::remove(dir, *deleted_message_id); git::commit("plent", &format!("remove {:x}", deleted_message_id.get())); git::push(); @@ -639,7 +633,10 @@ pub async fn leaderboard(c: Context<'_>, channel: Option<ChannelId>, vds: bool) search::dir(ch.get()) .unwrap() .map(|y| { - ownership::get(search::flake(y.file_name().unwrap().to_str().unwrap()).into()).1 + pollster::block_on(ownership::get( + search::flake(y.file_name().unwrap().to_str().unwrap()).into(), + )) + .1 }) .filter(|x| vds || !VDS.contains(x)) .for_each(|x| *map.entry(x).or_default() += 1); @@ -660,7 +657,10 @@ pub async fn leaderboard(c: Context<'_>, channel: Option<ChannelId>, vds: bool) let mut map = std::collections::HashMap::new(); search::files() .map(|(y, _)| { - ownership::get(search::flake(y.file_name().unwrap().to_str().unwrap()).into()).1 + pollster::block_on(ownership::get( + search::flake(y.file_name().unwrap().to_str().unwrap()).into(), + )) + .1 }) .filter(|x| vds || !VDS.contains(x)) .for_each(|x| *map.entry(x).or_default() += 1); diff --git a/src/bot/ownership.rs b/src/bot/ownership.rs index a226bdc..d7aacc1 100644 --- a/src/bot/ownership.rs +++ b/src/bot/ownership.rs @@ -1,21 +1,33 @@ -use std::{ - collections::HashMap, - sync::{LazyLock, Mutex}, -}; +use serenity::all::MessageId; +use std::{collections::HashMap, sync::LazyLock}; +use tokio::sync::Mutex; static MAP: LazyLock<Mutex<HashMap<u64, (String, u64)>>> = LazyLock::new(|| { Mutex::new(serde_json::from_slice(&std::fs::read("repo/ownership.json").unwrap()).unwrap()) }); -pub fn insert(k: u64, v: (String, u64)) { - MAP.lock().unwrap().insert(k, v); - std::fs::write("repo/ownership.json", serde_json::to_string(&*MAP).unwrap()).unwrap(); +pub async fn insert(k: u64, v: (String, u64)) { + let mut lock = MAP.lock().await; + lock.insert(k, v); + std::fs::write( + "repo/ownership.json", + serde_json::to_string(&*lock).unwrap(), + ) + .unwrap(); } -pub fn get(k: u64) -> (String, u64) { - MAP.lock().unwrap()[&k].clone() +pub async fn get(k: u64) -> (String, u64) { + MAP.lock().await[&k].clone() } -pub fn erase(k: u64) -> Option<(String, u64)> { - let x = MAP.lock().unwrap().remove(&k); - std::fs::write("repo/ownership.json", serde_json::to_string(&*MAP).unwrap()).unwrap(); +pub async fn erase(k: u64) -> Option<String> { + let mut lock = MAP.lock().await; + let x = lock.remove(&k).map(|(x, _)| x); + std::fs::write( + "repo/ownership.json", + serde_json::to_string(&*lock).unwrap(), + ) + .unwrap(); x } +pub async fn whos(x: impl Into<MessageId>) -> String { + get(x.into().get()).await.0 +} diff --git a/src/expose.rs b/src/expose.rs index c06d23f..a79d0e5 100644 --- a/src/expose.rs +++ b/src/expose.rs @@ -121,13 +121,13 @@ impl Server { get(|Path(file): Path<String>| async move { ( StatusCode::OK, - crate::bot::git::whos( + crate::bot::ownership::whos( match u64::from_str_radix(file.trim_end_matches(".msch"), 16) { Ok(x) => x, Err(_) => return (StatusCode::NOT_FOUND, "".into()), - } - .into(), - ), + }, + ) + .await, ) }), ) |