smol bot
swap mutex
bendn 2024-08-28
parent 14b5383 · commit eb22168
-rw-r--r--Cargo.toml1
-rw-r--r--src/bot/mod.rs26
-rw-r--r--src/bot/ownership.rs36
-rw-r--r--src/expose.rs8
4 files changed, 42 insertions, 29 deletions
diff --git a/Cargo.toml b/Cargo.toml
index fef0bea..772e26b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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,
)
}),
)