add file uploading

This commit is contained in:
mii443
2024-10-10 09:01:47 +00:00
parent 8b1db8cccf
commit d0b7f2615e
2 changed files with 52 additions and 6 deletions

View File

@ -199,7 +199,47 @@ impl Container {
Ok(result)
}
pub async fn upload_file(&self, content: &str, file_name: String) {
pub async fn upload_file(&self, data: Vec<u8>, path: &str) {
let docker = Docker::connect_with_local_defaults().unwrap();
let archive = {
let encoder = GzEncoder::new(vec![], Compression::default());
let mut tar = tar::Builder::new(encoder);
let mut header = Header::new_gnu();
header.set_path(path).unwrap();
header.set_size(data.len() as u64);
header.set_cksum();
tar.append(&header, data.as_slice()).unwrap();
tar.finish().unwrap();
let encoder = tar.into_inner().unwrap();
encoder.finish().unwrap()
};
{
docker
.start_container::<String>(&self.id, None)
.await
.unwrap();
docker
.upload_to_container(
&self.id,
Some(UploadToContainerOptions {
path: "/",
..Default::default()
}),
archive.into(),
)
.await
.unwrap();
}
}
pub async fn upload_source_file(&self, content: &str, file_name: String) {
let docker = Docker::connect_with_local_defaults().unwrap();
let path = self.language.clone().unwrap().get_path(file_name.clone());

View File

@ -22,7 +22,6 @@ pub async fn event_handler(
}
serenity::FullEvent::Message { new_message } => {
println!("on_message");
on_message(ctx, data, new_message).await;
}
@ -31,10 +30,10 @@ pub async fn event_handler(
Ok(())
}
async fn on_message(ctx: &serenity::Context, data: &Data, message: &Message) {
async fn on_message(ctx: &serenity::Context, data: &Data, new_message: &Message) {
let regex = Regex::new("^(?P<codeblock>```(?:(?P<language>[^\n]*)\n)?(?P<code>[\\s\\S]+?)\n```)(?:\\s*(?P<paths>(?:(?:/|\\.\\.?/)?(?:[^/\\s]+/)*[^/\\s]+\\s*)+))?$").unwrap();
let capture = regex.captures(&message.content);
let capture = regex.captures(&new_message.content);
if let Some(captures) = capture {
let language = captures.name("language").unwrap().as_str();
@ -45,7 +44,7 @@ async fn on_message(ctx: &serenity::Context, data: &Data, message: &Message) {
let language = config.get_language(&String::from(language));
if let Some(language) = language {
let mut message = message
let mut message = new_message
.reply(&ctx.http, format!("Creating {} container.", language.name))
.await
.unwrap();
@ -61,7 +60,14 @@ async fn on_message(ctx: &serenity::Context, data: &Data, message: &Message) {
.await
.unwrap();
container.upload_file(code, file_name.clone()).await;
for attachment in &new_message.attachments {
let data = attachment.download().await.unwrap();
container
.upload_file(data, &format!("{}", attachment.filename))
.await;
}
container.upload_source_file(code, file_name.clone()).await;
let compile_buf = Arc::new(Mutex::new(String::default()));
let b = Arc::clone(&compile_buf);