Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use 5.010;
- use strict;
- use File::Basename qw/basename fileparse/;
- use File::Spec::Functions qw/catdir catfile/;
- use File::Copy qw/copy/;
- use Date::Format qw/time2str/;
- # ----------------------------------------
- my $saves_dir = "/home/user/saves";
- my $backup_dir = "$saves_dir/backup";
- my $timeout = 5;
- # ----------------------------------------
- sub report {
- printf "[%s] %s\n", time2str("%H:%M:%S", time), $_[0];
- }
- sub get_characters {
- map { $_ => (stat)[9] } glob catdir($saves_dir, "*.cs");
- }
- sub backup_character {
- my($character) = @_;
- my $backup_name = catfile($backup_dir, basename($character));
- unlink $backup_name or die $! if -f $backup_name;
- copy($character, $backup_name) or die $!;
- }
- sub restore_chatacter {
- my($character) = @_;
- my $backup_name = catfile($backup_dir, basename($character));
- copy($backup_name, $character) or die $!;
- }
- # ----------------------------------------
- die "`$saves_dir` not found" unless -d $saves_dir;
- report "Work in `$saves_dir`.";
- mkdir $backup_dir or die $! unless -d $backup_dir;
- my %characters;
- while() {
- my %new_characters = get_characters;
- while(my($character, $timestamp) = each %new_characters) {
- my $charname = (basename $character, ".cs")[0];
- if(exists $characters{$character}) {
- #say "$timestamp < $characters{$character}";
- if($timestamp > $characters{$character}) {
- report "Updated: $charname";
- backup_character $character;
- } else {
- # not modified
- }
- } else {
- report "New: $charname";
- backup_character $character;
- }
- $characters{$character} = $timestamp;
- }
- for my $died_character (grep { !exists $new_characters{$_} } keys %characters) {
- my $charname = (basename $died_character, ".cs")[0];
- restore_chatacter $died_character;
- report "Restored: $charname";
- }
- sleep $timeout;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement