#! perl use base "cf::path"; __PACKAGE__->register ("random"); sub init { my ($self) = @_; 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) = @_; my $rmp = $self->{random}; "random map at $rmp->{custom} level $rmp->{dungeon_level}" } sub save_path { my ($self) = @_; sprintf "%s/%s", $cf::RANDOM_MAPS, $self->{path} } sub uniq_path { undef } sub load_orig { my ($self) = @_; $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