replace serenity function by poise

This commit is contained in:
mii443
2024-10-09 03:10:38 +00:00
parent 45e9cdc7da
commit 88a86515c4

View File

@ -14,7 +14,7 @@ use crate::{
Data, Error,
};
use poise::serenity_prelude as serenity;
use poise::serenity_prelude::{self as serenity, CreateAttachment, EditMessage, Message};
pub async fn event_handler(
ctx: &serenity::Context,
@ -27,164 +27,156 @@ pub async fn event_handler(
println!("bot ready");
}
serenity::FullEvent::Message { new_message } => {
println!("on_message");
on_message(ctx, data, new_message).await;
}
_ => {}
}
Ok(())
}
pub struct Handler;
async fn on_message(ctx: &serenity::Context, data: &Data, message: &Message) {
let regex = Regex::new("^```(?P<language>[0-9a-zA-Z]*)\n(?P<code>(\n|.)+)\n```$").unwrap();
#[async_trait]
impl EventHandler for Handler {
async fn message(&self, context: Context, message: Message) {
let regex = Regex::new("^```(?P<language>[0-9a-zA-Z]*)\n(?P<code>(\n|.)+)\n```$").unwrap();
let capture = regex.captures(&message.content);
let capture = regex.captures(&message.content);
if let Some(captures) = capture {
let language = captures.name("language").unwrap().as_str();
let code = captures.name("code").unwrap().as_str();
if let Some(captures) = capture {
let language = captures.name("language").unwrap().as_str();
let code = captures.name("code").unwrap().as_str();
let config = data.config.lock().await.clone();
let config = {
let data_read = context.data.read().await;
data_read
.get::<ConfigStorage>()
.expect("Cannot get ConfigStorage.")
.clone()
};
let language = config.get_language(&String::from(language));
let language = {
let config = config.lock().unwrap();
config.get_language(&String::from(language))
};
if let Some(language) = language {
let mut message = message
.reply(&ctx.http, format!("Creating {} container.", language.name))
.await
.unwrap();
if let Some(language) = language {
let mut message = message
.reply(
&context.http,
format!("Creating {} container.", language.name),
)
.await
.unwrap();
let container = Container::from_language(language.clone()).await;
let file_name = format!("{}.{}", container.name, language.extension.clone());
let container = Container::from_language(language.clone()).await;
let file_name = format!("{}.{}", container.name, language.extension.clone());
message
.edit(
&ctx.http,
EditMessage::new().content(format!("Created: {}", container.id)),
)
.await
.unwrap();
message
.edit(
&context.http,
EditMessage::new().content(format!("Created: {}", container.id)),
)
.await
.unwrap();
container.upload_file(code, file_name.clone()).await;
container.upload_file(code, file_name.clone()).await;
let compile_buf = Arc::new(Mutex::new(String::default()));
let b = Arc::clone(&compile_buf);
let compile_buf = Arc::new(Mutex::new(String::default()));
let b = Arc::clone(&compile_buf);
if let Some((compile_handle, compile_rx)) = container.compile().await {
let rx_handle = tokio::spawn(async move {
while let Ok(Some(msg)) = compile_rx.recv() {
print!("{}", msg);
*b.lock().unwrap() += &msg.to_string();
}
});
let (_, _) = tokio::join!(compile_handle, rx_handle);
}
let (run_handle, run_code_rx, end_tx) = container.run_code().await;
let buf = Arc::new(Mutex::new(String::default()));
let b = Arc::clone(&buf);
if let Some((compile_handle, compile_rx)) = container.compile().await {
let rx_handle = tokio::spawn(async move {
while let Ok(Some(msg)) = run_code_rx.recv() {
while let Ok(Some(msg)) = compile_rx.recv() {
print!("{}", msg);
*b.lock().unwrap() += &msg.to_string();
}
});
let timeout = Arc::new(Mutex::new(false));
let t = Arc::clone(&timeout);
tokio::spawn(async move {
sleep_until(Instant::now() + Duration::from_secs(10)).await;
end_tx.send(()).unwrap();
*t.lock().unwrap() = true;
});
let (_, _) = tokio::join!(compile_handle, rx_handle);
}
let (_, _) = tokio::join!(run_handle, rx_handle);
let (run_handle, run_code_rx, end_tx) = container.run_code().await;
let mut edit_message = EditMessage::new();
let mut content = if *timeout.lock().unwrap() {
"Timeout".to_string()
} else if compile_buf.lock().unwrap().is_empty() {
format!(
"Result\n```\n{}\n```",
buf.lock().unwrap().replace("@", "\\@")
)
} else {
format!(
"Result\nCompilation log\n```\n{}\n```\nExecution log\n```{}\n```",
compile_buf.lock().unwrap().replace("@", "\\@"),
buf.lock().unwrap().replace("@", "\\@")
)
};
let buf = Arc::new(Mutex::new(String::default()));
let b = Arc::clone(&buf);
let rx_handle = tokio::spawn(async move {
while let Ok(Some(msg)) = run_code_rx.recv() {
print!("{}", msg);
*b.lock().unwrap() += &msg.to_string();
}
});
if content.len() >= 1000 {
content = "Result log out of length.".to_string();
{
let mut result_log =
std::fs::File::create(format!("./log/result-{}.txt", container.name))
.unwrap();
result_log
.write_all(buf.lock().unwrap().as_bytes())
let timeout = Arc::new(Mutex::new(false));
let t = Arc::clone(&timeout);
tokio::spawn(async move {
sleep_until(Instant::now() + Duration::from_secs(10)).await;
end_tx.send(()).unwrap();
*t.lock().unwrap() = true;
});
let (_, _) = tokio::join!(run_handle, rx_handle);
let mut edit_message = EditMessage::new();
let mut content = if *timeout.lock().unwrap() {
"Timeout".to_string()
} else if compile_buf.lock().unwrap().is_empty() {
format!(
"Result\n```\n{}\n```",
buf.lock().unwrap().replace("@", "\\@")
)
} else {
format!(
"Result\nCompilation log\n```\n{}\n```\nExecution log\n```{}\n```",
compile_buf.lock().unwrap().replace("@", "\\@"),
buf.lock().unwrap().replace("@", "\\@")
)
};
if content.len() >= 1000 {
content = "Result log out of length.".to_string();
{
let mut result_log =
std::fs::File::create(format!("./log/result-{}.txt", container.name))
.unwrap();
result_log.flush().unwrap();
result_log
.write_all(buf.lock().unwrap().as_bytes())
.unwrap();
result_log.flush().unwrap();
}
let result_log =
tokio::fs::File::open(format!("./log/result-{}.txt", container.name))
.await
.unwrap();
edit_message = edit_message.new_attachment(
CreateAttachment::file(&result_log, "result_log.txt")
.await
.unwrap(),
);
if !((*compile_buf.lock().unwrap()).is_empty()) {
{
let mut compile_log =
std::fs::File::create(format!("./log/compile-{}.txt", container.name))
.unwrap();
compile_log
.write_all(compile_buf.lock().unwrap().as_bytes())
.unwrap();
compile_log.flush().unwrap();
}
let result_log =
tokio::fs::File::open(format!("./log/result-{}.txt", container.name))
tokio::fs::File::open(format!("./log/compile-{}.txt", container.name))
.await
.unwrap();
edit_message = edit_message.attachment(
CreateAttachment::file(&result_log, "result_log.txt")
edit_message = edit_message.new_attachment(
CreateAttachment::file(&result_log, "compile_log.txt")
.await
.unwrap(),
);
if !((*compile_buf.lock().unwrap()).is_empty()) {
{
let mut compile_log = std::fs::File::create(format!(
"./log/compile-{}.txt",
container.name
))
.unwrap();
compile_log
.write_all(compile_buf.lock().unwrap().as_bytes())
.unwrap();
compile_log.flush().unwrap();
}
let result_log =
tokio::fs::File::open(format!("./log/compile-{}.txt", container.name))
.await
.unwrap();
edit_message = edit_message.attachment(
CreateAttachment::file(&result_log, "compile_log.txt")
.await
.unwrap(),
);
}
}
edit_message = edit_message.content(content);
message.edit(&context.http, edit_message).await.unwrap();
container.stop().await;
}
edit_message = edit_message.content(content);
message.edit(&ctx.http, edit_message).await.unwrap();
container.stop().await;
}
}
}
/*
pub struct Handler;
#[async_trait]
impl EventHandler for Handler {
async fn interaction_create(&self, context: Context, interaction: Interaction) {
if let Interaction::ApplicationCommand(command_interaction) = interaction.clone() {
if command_interaction.data.name == "docker" {
@ -237,4 +229,4 @@ impl EventHandler for Handler {
.await
.unwrap();
}
}
}*/