From b4161e4f8bad735e92d37821c295fb0c96eda5e0 Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Thu, 27 Dec 2012 13:14:55 -0800 Subject: [PATCH] World download in ZIP format --- minecraft/change_world.cgi | 25 +++++++++++++++++++++++++ minecraft/edit_world.cgi | 3 ++- minecraft/lang/en | 1 + minecraft/save_world.cgi | 28 ++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 minecraft/change_world.cgi diff --git a/minecraft/change_world.cgi b/minecraft/change_world.cgi new file mode 100644 index 000000000..01fe2d3da --- /dev/null +++ b/minecraft/change_world.cgi @@ -0,0 +1,25 @@ +#!/usr/local/bin/perl +# Update the default world + +use strict; +use warnings; +require './minecraft-lib.pl'; +our (%in, %text, %config); +&ReadParse(); +&error_setup($text{'worlds_err'}); +$in{'d'} || &error($text{'worlds_esel'}); + +my $conf = &get_minecraft_config(); +my $def = &find_value("level-name", $conf); +if ($def ne $in{'d'}) { + &lock_file(&get_minecraft_config_file()); + &save_directive("level-name", $in{'d'}, $conf); + &flush_file_lines(&get_minecraft_config_file()); + &unlock_file(&get_minecraft_config_file()); + if ($in{'apply'} && &is_minecraft_server_running()) { + &stop_minecraft_server(); + my $err = &start_minecraft_server(); + &error($err) if ($err); + } + } +&redirect("list_worlds.cgi"); diff --git a/minecraft/edit_world.cgi b/minecraft/edit_world.cgi index 9a9fcf274..057e0faf5 100644 --- a/minecraft/edit_world.cgi +++ b/minecraft/edit_world.cgi @@ -82,7 +82,8 @@ else { print &ui_table_end(); print &ui_form_end( $in{'new'} ? [ [ undef, $text{'create'} ] ] - : [ [ 'delete', $text{'world_delete'} ] ], + : [ [ 'delete', $text{'world_delete'} ], + [ 'download', $text{'world_download'} ] ], ); &ui_print_footer("list_worlds.cgi", $text{'worlds_return'}); diff --git a/minecraft/lang/en b/minecraft/lang/en index 860fa05eb..fbe032752 100644 --- a/minecraft/lang/en +++ b/minecraft/lang/en @@ -180,6 +180,7 @@ world_eupload=No world data to upload selected world_ezip=Uploaded world data does not appear to be in ZIP format world_eunzip=Failed to unzip world data : $1 world_edat=ZIP file does not contain a level.dat file +world_download=Download ZIP File chooser_title=Select Item chooser_id=Item ID diff --git a/minecraft/save_world.cgi b/minecraft/save_world.cgi index c575057e0..f9b9412de 100644 --- a/minecraft/save_world.cgi +++ b/minecraft/save_world.cgi @@ -96,6 +96,34 @@ elsif ($in{'delete'}) { &ui_print_footer("list_worlds.cgi", $text{'worlds_return'}); } +elsif ($in{'download'} && !$ENV{'PATH_INFO'}) { + # Redirect to download with a nice path + &redirect("save_world.cgi/$in{'name'}.zip?name=$in{'name'}&download=1"); + } +elsif ($in{'download'} && $ENV{'PATH_INFO'}) { + # Download world as ZIP file + $in{'name'} || &error("Missing world name"); + my $temp = &transname().".zip"; + my $out = &backquote_command( + "cd ".quotemeta($config{'minecraft_dir'})." && ". + "zip -r $temp ".quotemeta($in{'name'})); + my @st = stat($temp); + !$? && @st || + &error(&text('world_ezip', "".&html_escape($out)."")); + print "Content-type: application/zip\n"; + print "Content-length: $st[7]\n"; + print "X-no-links: 1\n"; + print "Content-Disposition: Attachment\n"; + print "\n"; + my $fh = "ZIP"; + my $buf; + &open_readfile($fh, $temp); + &unlink_file($temp); + while(read($fh, $buf, 1024)) { + print $buf; + } + close($fh); + } else { &error("No button clicked"); }