mirror of
https://github.com/mii443/rs-docker-bot.git
synced 2025-08-22 16:15:40 +00:00
replace serenity function by poise
This commit is contained in:
@ -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();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
Reference in New Issue
Block a user