mirror of
https://github.com/mii443/rs-docker-bot.git
synced 2025-08-22 16:15:40 +00:00
add file uploading
This commit is contained in:
@ -199,7 +199,47 @@ impl Container {
|
|||||||
Ok(result)
|
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 docker = Docker::connect_with_local_defaults().unwrap();
|
||||||
let path = self.language.clone().unwrap().get_path(file_name.clone());
|
let path = self.language.clone().unwrap().get_path(file_name.clone());
|
||||||
|
|
||||||
|
@ -22,7 +22,6 @@ pub async fn event_handler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
serenity::FullEvent::Message { new_message } => {
|
serenity::FullEvent::Message { new_message } => {
|
||||||
println!("on_message");
|
|
||||||
on_message(ctx, data, new_message).await;
|
on_message(ctx, data, new_message).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,10 +30,10 @@ pub async fn event_handler(
|
|||||||
Ok(())
|
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 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 {
|
if let Some(captures) = capture {
|
||||||
let language = captures.name("language").unwrap().as_str();
|
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));
|
let language = config.get_language(&String::from(language));
|
||||||
|
|
||||||
if let Some(language) = language {
|
if let Some(language) = language {
|
||||||
let mut message = message
|
let mut message = new_message
|
||||||
.reply(&ctx.http, format!("Creating {} container.", language.name))
|
.reply(&ctx.http, format!("Creating {} container.", language.name))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -61,7 +60,14 @@ async fn on_message(ctx: &serenity::Context, data: &Data, message: &Message) {
|
|||||||
.await
|
.await
|
||||||
.unwrap();
|
.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 compile_buf = Arc::new(Mutex::new(String::default()));
|
||||||
let b = Arc::clone(&compile_buf);
|
let b = Arc::clone(&compile_buf);
|
||||||
|
Reference in New Issue
Block a user