mud/lib/verbs/builders/copy.c
2020-09-06 05:43:07 -07:00

137 lines
4.2 KiB
C

#include <lib.h>
#include <daemons.h>
#include ROOMS_H
#include <modules.h>
#include <commands.h>
inherit LIB_VERB;
mixed do_copy_obj_str(object ob, string str);
int success;
string sourcefile, targetfile;
static void create() {
verb::create();
SetVerb("copy");
SetRules("STR", "OBJ STR");
SetErrorMessage("Copy what?");
SetHelp("Syntax: copy <OBJ> <NAME>\n"
" copy <FILENAME>\n\n"
"With a room's filename as an argument, this command "
"copies everything about that room (except exits) into "
"your current room.\n\n"
"When you specify an object and provide a filename, this "
"command makes a copy of the object's file and gives it "
"the name you provide.\n\n"
"\nSee also: create, delete, modify, reload, initfix, add" );
}
mixed can_copy_obj_str(object ob, string str) { return 1; }
mixed can_copy_str(string str) { return 1; }
mixed do_copy_obj_str(object ob, string str) {
object staff;
staff = present("tanstaafl",this_player());
if(!staff) {
write("You must be holding the creator staff in order to use this command.");
write("If you don't know where you put it, get another one from the chest ");
write("in your workroom.");
return 1;
}
if(userp(ob)){
write("No.");
return 1;
}
success = 0;
sourcefile = "";
targetfile = "";
if(last(str,2) != ".c") str += ".c";
str = absolute_path(this_player()->query_cwd(), str);
if( !directory_exists(path_prefix(str)) ) {
write("Directory not found.");
return 1;
}
sourcefile = base_name(ob)+".c";
targetfile = str;
if(!check_privs(this_player(),str) ||
(!check_privs(this_player(),sourcefile) &&
strsrch(sourcefile,"/obj/"))){
write("You lack sufficient privileges for this operation. Copy failed.");
return 0;
}
if(!file_exists(sourcefile)) {
write("That file no longer exists.");
return 0;
}
else unguarded( (: success = cp(sourcefile, targetfile) :) );
if(success) {
write("Copy successful.");
return 1;
}
else write("Copy failed.");
return 0;
}
mixed do_copy_str(string str) {
string str2, tmp, new_room;
mixed source_update;
object staff;
staff = present("tanstaafl",this_player());
if(!staff) {
write("You must be holding the creator staff in order to use this command.");
write("If you don't know where you put it, get another one from the chest ");
write("in your workroom.");
return 1;
}
str2 = str;
str = absolute_path(this_player()->query_cwd(), str);
if(last(str,2) != ".c") str += ".c";
if( !file_exists(str) ){
str = path_prefix(base_name(environment(this_player())))+"/"+str2;
if(last(str,2) != ".c") str += ".c";
}
if( !file_exists(str) ){
write("Directory not found.");
return 1;
}
else if( !(tmp = read_file(str)) || !tmp || tmp == ""){
write("Unable to read file " + str + ".");
return 1;
}
if((!check_privs(this_player(),str) && strsrch(str,"/obj/") ) ||
!check_privs(this_player(),base_name(environment(this_player()))+".c")){
write("You lack sufficient privileges for this operation. Copy failed.");
return 1;
}
source_update = load_object("/secure/cmds/creators/update")->cmd("-a "+str);
if(!source_update || !intp(source_update) || source_update == 0) {
write("Your source file doesn't update correctly. Fix it first. Copy aborted.");
return 1;
}
if(!inherits("/lib/std/room",load_object(str))) {
write("The file you want to copy isn't a recognized room. Copy aborted.");
return 1;
}
new_room = base_name(environment(this_player()));
load_object("/secure/cmds/creators/bk")->cmd(new_room+".c");
write("Backed up this room. To restore from this backup, type: ");
write("restore "+last_string_element(new_room,"/"));
write("Then: update");
staff->eventCopyRoom(str,new_room+".c");
load_object("/secure/cmds/creators/update")->cmd("-a "+new_room);
this_player()->eventMoveLiving(new_room);
write("Room copy complete.");
return 1;
}