#! perl # MANDATORY cf::map->register (qr{^\?random/([0-9a-f]{32})}); sub init { my ($self) = @_; $self->{random_id} = $1; if (0 < Coro::AIO::aio_load "$cf::RANDOM_MAPS/$self->{random_id}.meta", my $data) { $self->{random} = cf::from_json $data; $self->{random}{custom} ||= "$self->{random}{origin_map}+$self->{random}{origin_x}+$self->{random}{origin_y}"; } else { warn "unable to read meta file for $self->{random_id}\n"; return 0; } 1 } sub thawer_merge { # we have to keep some variables in memory intact local $_[0]{random_id}; local $_[0]{random}; $_[0]->SUPER::thawer_merge ($_[1]); } 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.map", $cf::RANDOM_MAPS, $self->{random_id} } sub uniq_path { undef } sub load_orig { my ($self) = @_; return unless $self->{random}; $self->generate_random_map ($self->{random}); 1 } 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