diff --git a/src/docker.rs b/src/docker.rs index 3c459d8..9d22665 100644 --- a/src/docker.rs +++ b/src/docker.rs @@ -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, 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::(&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()); diff --git a/src/event_handler.rs b/src/event_handler.rs index d85db88..55f0bd2 100644 --- a/src/event_handler.rs +++ b/src/event_handler.rs @@ -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```(?:(?P[^\n]*)\n)?(?P[\\s\\S]+?)\n```)(?:\\s*(?P(?:(?:/|\\.\\.?/)?(?:[^/\\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);