99 lines
3.1 KiB
C
99 lines
3.1 KiB
C
#include <lib.h>
|
|
#include <dirs.h>
|
|
#include <commands.h>
|
|
|
|
inherit LIB_DAEMON;
|
|
string globalstr1, globalstr2;
|
|
int globalint;
|
|
|
|
mixed cmd(string str) {
|
|
string *sorted_array, *sub_arr, *new_arr, *bkarr;
|
|
string line, s1, bkname, bkcontents;
|
|
int number;
|
|
object here;
|
|
|
|
if( !str ) return "You must specify a file to restore.";
|
|
if(str && sscanf(str,"%s %d",s1, number) > 1) str = s1;
|
|
else false();
|
|
|
|
new_arr = ({});
|
|
sub_arr = ({});
|
|
|
|
bkname = homedir(this_player())+"/bak/bk.db";
|
|
|
|
if(!file_exists(bkname)) {
|
|
write("The backup database file does not exist. Aborting.");
|
|
return 1;
|
|
}
|
|
|
|
bkcontents = read_file(bkname);
|
|
bkarr = explode(bkcontents,"\n");
|
|
|
|
foreach(string zline in bkarr){
|
|
if(!strsrch(zline,str)) new_arr += ({ zline });
|
|
}
|
|
|
|
if(!sizeof(new_arr) && str == "here"){
|
|
here = environment(this_player());
|
|
str = last_string_element(base_name(here),"/");
|
|
foreach(string zline in bkarr){
|
|
if(!strsrch(zline,str)) new_arr += ({ zline });
|
|
}
|
|
}
|
|
|
|
if(!sizeof(new_arr)){
|
|
write("You haven't backed up a file by that name.");
|
|
return 1;
|
|
}
|
|
|
|
if(str == "workroom.orig") {
|
|
unguarded( (: globalint = cp(homedir(this_player())+"/bak/workroom.orig",
|
|
homedir(this_player())+"/workroom.c") :) );
|
|
if(globalint) {
|
|
write("Workroom file restored.");
|
|
load_object(CMD_UPDATE)->cmd("-a "+homedir(this_player())+"/workroom.c");
|
|
}
|
|
else write("Workroom could not be restored.");
|
|
return 1;
|
|
}
|
|
|
|
foreach(string zline in bkarr){
|
|
if(strsrch(zline,str) != -1) new_arr += ({ zline });
|
|
}
|
|
|
|
if(!number || number < 1) number = 1;
|
|
sorted_array = sort_array(new_arr, -1);
|
|
if(number > sizeof(sorted_array)) number = sizeof(sorted_array);
|
|
line = sorted_array[(number - 1)];
|
|
|
|
sub_arr = explode(line," : ");
|
|
if(!file_exists(REALMS_DIRS + "/" + this_player()->GetKeyName()+"/bak/"+sub_arr[0])){
|
|
write("That file has an entry in the backup database but can't be found in your backup directory.");
|
|
return 1;
|
|
}
|
|
globalstr1 = REALMS_DIRS + "/" + this_player()->GetKeyName()+"/bak/"+sub_arr[0];
|
|
globalstr2 = sub_arr[1];
|
|
cp(globalstr1, globalstr2);
|
|
if(here) reload(here);
|
|
write("File restored.");
|
|
return 1;
|
|
}
|
|
|
|
string GetHelp(){
|
|
return ("Syntax: restore <STRING> [NUMBER]\n\n"
|
|
"Restores the specified file from your bak/ directory. "
|
|
"If you specify a number, the command will try to find "
|
|
"the Nth newest file to restore. Examples:\n"
|
|
"To restore the most recent version of file.c:\n"
|
|
"restore file.c\n"
|
|
"To restore the version you backed up before the most "
|
|
"recent version:\n"
|
|
"restore file.c 2\n"
|
|
"And so on.\n"
|
|
"\"restore here\" will attempt to restore a backup of the room "
|
|
"you are currently standing in, and will reload it, if possible. "
|
|
"This is the only case in which the command will automatically "
|
|
"reload a restored object.\n"
|
|
"See also: bk");
|
|
}
|