dsII/extra/wolfpaw/
dsII/lib/cmds/admins/
dsII/lib/cmds/common/
dsII/lib/cmds/creators/include/
dsII/lib/cmds/creators/include/SCCS/
dsII/lib/daemon/services/
dsII/lib/doc/
dsII/lib/domains/Ylsrim/
dsII/lib/domains/Ylsrim/adm/
dsII/lib/domains/Ylsrim/armor/
dsII/lib/domains/Ylsrim/broken/
dsII/lib/domains/Ylsrim/fish/
dsII/lib/domains/Ylsrim/meal/
dsII/lib/domains/Ylsrim/npc/
dsII/lib/domains/Ylsrim/virtual/
dsII/lib/domains/Ylsrim/weapon/
dsII/lib/domains/campus/adm/
dsII/lib/domains/campus/etc/
dsII/lib/domains/campus/meals/
dsII/lib/domains/campus/npc/
dsII/lib/domains/campus/txt/
dsII/lib/domains/campus/txt/ai/charles/
dsII/lib/domains/campus/txt/ai/charles/bak2/
dsII/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsII/lib/domains/campus/txt/ai/charly/
dsII/lib/domains/campus/txt/ai/charly/bak/
dsII/lib/domains/campus/txt/jenny/
dsII/lib/domains/default/creator/
dsII/lib/domains/default/doors/
dsII/lib/domains/default/etc/
dsII/lib/domains/default/weap/
dsII/lib/domains/town/doors/
dsII/lib/domains/town/txt/
dsII/lib/domains/town/virtual/
dsII/lib/lib/comp/
dsII/lib/lib/lvs/
dsII/lib/lib/user/
dsII/lib/lib/virtual/
dsII/lib/log/archive/
dsII/lib/log/chan/
dsII/lib/log/errors/
dsII/lib/log/open/
dsII/lib/obj/book_source/
dsII/lib/obj/include/
dsII/lib/realms/template/
dsII/lib/realms/template/area/armor/
dsII/lib/realms/template/area/npc/
dsII/lib/realms/template/area/obj/
dsII/lib/realms/template/area/room/
dsII/lib/realms/template/area/weap/
dsII/lib/realms/template/bak/
dsII/lib/realms/template/cmds/
dsII/lib/save/
dsII/lib/save/kills/o/
dsII/lib/secure/cfg/
dsII/lib/secure/cfg/classes/
dsII/lib/secure/cfg/races/SCCS/
dsII/lib/secure/cmds/creators/include/
dsII/lib/secure/cmds/players/
dsII/lib/secure/cmds/players/include/
dsII/lib/secure/daemon/include/
dsII/lib/secure/lib/
dsII/lib/secure/lib/include/
dsII/lib/secure/lib/net/
dsII/lib/secure/lib/net/include/
dsII/lib/secure/lib/std/
dsII/lib/secure/modules/
dsII/lib/secure/npc/
dsII/lib/secure/obj/include/
dsII/lib/secure/room/
dsII/lib/secure/save/boards/
dsII/lib/secure/save/postal/c/cratylus/
dsII/lib/secure/save/votes/
dsII/lib/secure/tmp/
dsII/lib/secure/verbs/creators/
dsII/lib/shadows/
dsII/lib/spells/
dsII/lib/tmp/
dsII/lib/verbs/admins/include/
dsII/lib/verbs/common/
dsII/lib/verbs/common/include/
dsII/lib/verbs/creators/include/
dsII/lib/verbs/players/include/SCCS/
dsII/lib/verbs/rooms/
dsII/lib/verbs/rooms/include/
dsII/lib/www/
dsII/v22.2b14/
dsII/v22.2b14/Win32/
dsII/v22.2b14/compat/
dsII/v22.2b14/compat/simuls/
dsII/v22.2b14/testsuite/
dsII/v22.2b14/testsuite/clone/
dsII/v22.2b14/testsuite/command/
dsII/v22.2b14/testsuite/data/
dsII/v22.2b14/testsuite/etc/
dsII/v22.2b14/testsuite/include/
dsII/v22.2b14/testsuite/inherit/
dsII/v22.2b14/testsuite/inherit/master/
dsII/v22.2b14/testsuite/log/
dsII/v22.2b14/testsuite/single/
dsII/v22.2b14/testsuite/single/tests/compiler/
dsII/v22.2b14/testsuite/single/tests/efuns/
dsII/v22.2b14/testsuite/single/tests/operators/
dsII/v22.2b14/testsuite/u/
dsII/v22.2b14/tmp/
dsII/win32/
#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;

    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( !str ) return "You must specify a file to restore.";
    if( !file_exists(bkname)) {
	write("The backup database file does not exist. Aborting.");
	return 1;
    }
    bkcontents = read_file(bkname);
    if(strsrch(bkcontents,str) == -1) {
	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;
    }
    bkarr = explode(bkcontents,"\n");
    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];
    unguarded( (: cp(globalstr1, globalstr2) :) );
    write("File restored.");
    return 1;
}

int help() {
    message("help", "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"
      "See also: bk", 
      this_player());
}