--- deliantra/server/ext/map-random.ext 2007/01/11 00:16:58 1.1 +++ deliantra/server/ext/map-random.ext 2007/01/11 01:01:55 1.3 @@ -7,25 +7,23 @@ sub init { my ($self) = @_; - Coro::AIO::aio_load "$cf::RANDOM_MAPS/$self->{path}.meta", my $data; - $self->{random} = cf::from_json $data; + if (0 < Coro::AIO::aio_load "$cf::RANDOM_MAPS/$self->{path}.meta", my $data) { + $self->{random} = cf::from_json $data; + $self->{random}{custom} ||= "$self->{random}{origin_map}+$self->{random}{origin_x}+$self->{random}{origin_y}"; + } } sub visible_name { my ($self) = @_; -# if (my $rmp = $self->{random}) { -# # todo: be more intelligent about this -# "?random/$rmp->{origin_map}+$rmp->{origin_x}+$rmp->{origin_y}/$rmp->{dungeon_level}" -# } else { - $self->as_string -# } + my $rmp = $self->{random}; + "random map at $rmp->{custom} level $rmp->{dungeon_level}" } sub save_path { my ($self) = @_; - sprintf "%s/%s", $RANDOM_MAPS, $self->{path} + sprintf "%s/%s", $cf::RANDOM_MAPS, $self->{path} } sub uniq_path { @@ -35,8 +33,50 @@ sub load_orig { my ($self) = @_; - cf::map::generate_random_map "$self", $self->{random} + $self->{random} + ? cf::map::generate_random_map "$self", $self->{random} + : () } +sub clean_random_maps { + cf::async { + my $files = Coro::AIO::aio_readdir $cf::RANDOM_MAPS + or return; + + my $META_TIMEOUT = $cf::CFG{map_random_meta_timeout} || 86400 * 7; + my $MAP_TIMEOUT = $cf::CFG{map_random_map_timeout} || 3600 * 6; + + for my $file (@$files) { + next if $file =~ /\.pst$/; + + Coro::AIO::aio_stat "$cf::RANDOM_MAPS/$file" + and next; + + my $age = $cf::NOW - (stat _)[8]; + + if ($file =~ /\.meta$/) { + if ($age > $META_TIMEOUT) { + warn "resetting random meta data for $file"; + IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; + } + } else { + if ($age > $MAP_TIMEOUT) { + warn "resetting random map $file"; + IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; + IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file.pst"; + } + } + } + }; +} + +# clean up old temp maps regularly +Event->timer ( + data => cf::WF_AUTOCANCEL, + interval => 3600, + after => 600, + cb => \&clean_random_maps, +); + 1