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

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"
      "\"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", 
      this_player());
}