// File : /cmds/adm/_nuke.c // Creator : Watcher@TMI (02/24/93) // Edited : Karathan (07/13/93) to incorporate new banish daemon // // This command allows an admin to remove all reference to // a selected user. The user's data files will be saved in // the ARCHIVE_DIR tree unless it is undefined. // 93-07-30 Grendel@tmi-2 Kludged to handle mail boxes // 95-05-06 Leto added -D for deleting wiz including homedir #include <config.h> #include <login.h> #include <daemons.h> #include <mudlib.h> #include <logs.h> inherit DAEMON ; #define SYNTAX "Syntax: nuke [-abdD] [user]\n" int cmd_nuke(string str) { string flags, tmp1, tmp2; int banish, delete, archive; if(!adminp(geteuid(previous_object()))) return 0; notify_fail( SYNTAX ); if(!str || str == "") return 0; if(sscanf(str, "-%s %s",flags, str) == 2) { if(sscanf(" " + flags + " ", "%sb%s", tmp1, tmp2) == 2) banish = 1; if(sscanf(" " + flags + " ", "%sd%s", tmp1, tmp2) == 2) delete = 1; if(sscanf(" " + flags + " ", "%sD%s", tmp1, tmp2) == 2) delete = 2; if(sscanf(" " + flags + " ", "%sa%s", tmp1, tmp2) == 2) archive = 1; } if(archive && delete) { write("Nuke: You cannot both delete and archive a user.n"); return 1; } if(ARCHIVE_DIR && !delete) archive = 1; if(!user_exists(str)) { write("Nuke: No such user exists.\n"); return 1; } write("Are you sure you wish to nuke poor " + capitalize(str) + "? [y/n] "); input_to("confirm_deletion", 0, str, banish, delete, archive); return 1; } static int confirm_deletion(string str, string name, int banish, int delete, int archive) { if(!str || member_array(lower_case(str), ({ "yes", "y" })) == -1) { write("Nuke: Character deletion aborted.\n"); return 1; } if (banish) BANISH_D->banish_name(name); if(find_player(name)) { tell_object(find_player(name), "\nA bolt of lightning descends from the heavens, and all goes dark.\n"); tell_room(environment(find_player(name)), "A bolt of lightning suddenly descends from the heavens. It strikes\n" + capitalize(name) + " in the chest, leaving only a pile of ashes where " + subjective((string)this_player()->query("gender")) + " once stood.\n", ({ find_player(name) })); find_player(name)->save_data(); find_player(name)->remove(); } // Either move data files to ARCHIVE_DIR dir, or completely delete if(archive) { if(!directory_exists(ARCHIVE_DIR + "user/")) { mkdir( ARCHIVE_DIR[0..<2] ); mkdir( ARCHIVE_DIR + "user" ); mkdir( ARCHIVE_DIR + "connection" ); mkdir( ARCHIVE_DIR + "mail" ); } if(file_exists(DATA_DIR+"/std/user/"+name[0..0]+"/"+name+ __SAVE_EXTENSION__)) rename(DATA_DIR+"/std/user/" + name[0..0] + "/" + name + __SAVE_EXTENSION__, ARCHIVE_DIR + "user/" + name + __SAVE_EXTENSION__); rename(PDATA_DIR+name[0..0]+ "/" + name + __SAVE_EXTENSION__, ARCHIVE_DIR + "connection/" + name + __SAVE_EXTENSION__); if(file_size("/data/mail/"+name+"-mbox.o") >= 0) rename("/data/mail/"+name+"-mbox.o", ARCHIVE_DIR+"mail/"+name+"-mbox.o"); write("Nuke: Character archived and deleted.\n"); } else { if(file_exists(DATA_DIR+"/std/user/"+name[0..0]+"/"+name+__SAVE_EXTENSION__)) rm(DATA_DIR + "/std/user/" + name[0..0] + "/" + name + __SAVE_EXTENSION__); rm (PDATA_DIR + name[0..0] + "/" + name + __SAVE_EXTENSION__ ); if(file_size("/data/mail/"+name+"-mbox.o") >= 0) rm( "/data/mail/"+name+"-mbox.o" ); write("Nuke: Character deleted.\n"); if(delete==2) { if(directory_exists(user_path(name))) { CLEAN_D->clean_dir(user_path(name)); write("Nuke: Home directory removed.\n"); } } } log_file(DEMOTE_LOG,getuid(this_player())+" nuked "+name+" at "+ctime(time())+"\n"); return 1; } string help() { return( SYNTAX + "\n" + "This command completely removes the the data files of the inputted\n" + "user, as well as nicely removing them if they are presently online.\n" + "If the 'b' flag is given, it will automatically add the user's name\n" + "to the mudlib's banish file. If the 'a' flag is selected, then the\n" + "user's data files will be archived before character removal, and if\n" + "the 'd' flag is set, it will override any archive default sets, and\n" + "delete the data files without archiving. Using 'D' will delete the user\n"+ "and remove the entire home directory as well.\n"); if(ARCHIVE_DIR) return("All character deletions are automatically archived unless the\n" + "delete flag is requested.\n"); }