#include <lib.h> #include <privs.h> #include <daemons.h> inherit LIB_DAEMON; static private void validate() { if(!this_player()) return 0; if( !(master()->valid_apply(({ "ASSIST" }))) ) error("Illegal attempt to access admintool: "+get_stack()+" "+identify(previous_object(-1))); } varargs int Menu(string str); int MainMenu(); int MainMenuChoice(); int GeneralMenu(); int DaemonMenu(); int UsersMenu(); int DriverMenu(); int GroupsMenu(); int ToggleMudLock(); int ShowLock(); int SetTZ(); int eventSetTZ(string str); int ChangeEmail(); varargs int eventChangeEmail(string str, int auto); int SetReboot(); int eventSetReboot(int i); int AddClass(); int eventAddClass(string str); int RemoveClass(); int eventRemoveClass(string str); int AddRace(); int eventAddRace(string str); int RemoveRace(); int PlayerRace(string str); int eventRemoveRace(string str); int AddCurrency(); int eventAddCurrency(string str); int CurrencyRate(string str); int CurrencyWeight(string str); int CurrencyInflation(string str); int RemoveCurrency(); int eventRemoveCurrency(string str); int EncrePlayer(); int eventEncrePlayer(string str); int DecreCreator(); int eventDecreCreator(string str); mixed EnCre(string args); mixed DeCre(string args); int RidUser(); int eventRidUser(string str); int LogRid(string str); int DoRid(string who); int BanishUser(); int eventBanishUser(string str); int UnBanishUser(); int eventUnBanishUser(string str); int ChangeName(); int eventChangeName(string str); int ChangePort(); int eventChangePort(int i); int ShutDownMud(); int eventShutDownMud(string str); int RemoveGroup(); int eventRemoveGroup(string str); int AddGroup(); int eventAddGroup(string str); int ModGroup(); int eventModGroup(string str); int eventEditGroup(string str); int ShowGroups(); string process_input(string str); string global_group_temp, menu, racepath, currency, ridded, globalstr, file; string *currencies; string gnom, gstr; float rate, weight, inflation; mixed InvalidChoice(){ validate(); write("Invalid choice. Try again or choose q to quit.\n"); Menu(); return 1; } int PlaceHolder(){ validate(); write("This function has not yet been defined."); Menu(); return 1; } varargs int Menu(string str){ validate(); if(str) menu = str; if(!menu) menu = "main"; switch (menu){ case "main" : MainMenu(); break; case "general" : GeneralMenu(); break; case "daemon" : DaemonMenu();break; case "users" : UsersMenu();break; case "driver" : DriverMenu();break; case "groups" : GroupsMenu();break; default : menu = "main"; MainMenu(); break; } return 1; } string process_input(string str){ validate(); switch (str) { case "q" : write("Ok, quitting admintool.\nBye.\n");return " "; case "x" : write("Ok, quitting admintool.\nBye.\n");return " "; case "y" : write("Ok, quitting admintool.\nBye.\n");return " "; case "z" : Menu("main"); break; case "1" : Menu("general"); break; case "2" : Menu("daemon");break; case "3" : Menu("users");break; case "4" : Menu("driver");break; case "5" : Menu("groups");break; case "a" : ToggleMudLock();break; case "b" : ShowLock();break; case "c" : SetTZ();break; case "d" : ChangeEmail();break; case "e" : SetReboot();break; case "f" : AddClass();break; case "g" : RemoveClass();break; case "h" : AddRace();break; case "i" : RemoveRace();break; case "j" : AddCurrency();break; case "k" : RemoveCurrency();break; case "n" : RidUser();break; case "o" : BanishUser();break; case "p" : UnBanishUser();break; case "r" : ChangeName();break; case "s" : ChangePort();break; case "t" : AddGroup();break; case "u" : RemoveGroup();break; case "v" : ModGroup();break; case "w" : ShowGroups();break; case "SD": ShutDownMud();break; default : InvalidChoice(); } return "(process_input fun finished.)"; } varargs mixed MainMenu(string str) { string tmp; validate(); tmp = "\tDead Souls Admin Tool\n"; tmp += "\t=====================\n\n"; tmp += "\t\t1) general\n"; tmp += "\t\t2) daemon\n"; tmp += "\t\t3) users\n"; tmp += "\t\t4) driver\n"; tmp += "\t\t5) groups\n\n"; tmp += "\t\tq) quit\n"; this_player()->eventPrint(tmp, "foo"); input_to((: process_input :)); return 1; } static int GeneralMenu() { string tmp; validate(); tmp = "\tDead Souls Admin Tool General Menu\n"; tmp += "\t\n\n"; tmp += "\t\ta) toggle mud lock\n"; tmp += "\t\tb) display current lock status\n"; tmp += "\t\tc) change timezone\n"; tmp += "\t\td) change admin email\n"; tmp += "\t\te) change shutdown interval\n"; tmp += "\t\tSD) shut down the MUD\n\n"; tmp += "\t\tz) return to main menu\n"; tmp += "\t\tq) quit\n"; this_player()->eventPrint(tmp, "foo"); input_to((: process_input :)); return 1; } int DaemonMenu() { string tmp; validate(); tmp = "\tDead Souls Admin Tool Daemon Menu\n"; tmp += "\t\n\n"; tmp += "\t\tf) add class\n"; tmp += "\t\tg) remove class\n"; tmp += "\t\th) add race\n"; tmp += "\t\ti) remove race\n"; tmp += "\t\tj) add currency\n"; tmp += "\t\tk) remove currency\n\n"; tmp += "\t\tz) return to main menu\n"; tmp += "\t\tq) quit\n"; this_player()->eventPrint(tmp, "foo"); input_to((: process_input :)); return 1; } int UsersMenu() { string tmp; validate(); tmp = "\tDead Souls Admin Tool Users Menu\n"; tmp += "\t\n\n"; tmp += "\t\tn) completely erase a user\n"; tmp += "\t\to) banish a username\n"; tmp += "\t\tp) unbanish a username\n\n"; tmp += "\t\tz) return to main menu\n"; tmp += "\t\tq) quit\n"; this_player()->eventPrint(tmp, "foo"); input_to((: process_input :)); return 1; } int DriverMenu(){ string tmp; validate(); tmp = "\tDead Souls Admin Tool Driver Menu\n"; tmp += "\t^^^^^^^^^^^^^^^^^^^^^^*******^^^^^\n"; tmp += "\t\n\n"; tmp += "\t\tr) display the MUD's name\n"; tmp += "\t\ts) change the MUD's connection port\n\n"; tmp += "\t\tz) return to main menu\n"; tmp += "\t\tq) quit\n"; this_player()->eventPrint(tmp, "foo"); input_to((: process_input :)); return 1; } int GroupsMenu(){ string tmp; validate(); tmp = "\tDead Souls Admin Tool Groups Menu\n"; tmp += "\t^^^^^^^^^^^^^^^^^^^^^^*******^^^^^\n"; tmp += "\t\n\n"; tmp += "\t\tt) Add a group\n"; tmp += "\t\tu) Remove a group\n"; tmp += "\t\tv) Modify a group\n"; tmp += "\t\tw) Show groups\n\n"; tmp += "\t\tz) return to main menu\n"; tmp += "\t\tq) quit\n"; tmp += "\n\nNote that this menu is %^RED%^DEPRECATED%^RESET%^.\n"; tmp += "You should use the \"groupmod\" command instead.\n"; this_player()->eventPrint(tmp, "foo"); input_to((: process_input :)); return 1; } string GetHelp(){ return ("Syntax: <admintool>\n\n" "Menu-driven tool used to edit the MUD's configuration.\n" "To change mud name or port number, choose the Driver menu.\n" "Use the Users menu for promoting a player to creator status.\n" "Use the Groups menu to make someone an assistant admin.\n"); } int ToggleMudLock(){ string *line_array; string lockline, newline, newfile, line_string, junk; int num; validate(); line_string = read_file(CONFIG_H); if(!sizeof(line_string)) write("Couldn't read file."); line_array = explode(line_string, "\n"); if(!sizeof(line_array)) write("Array is zero length."); foreach(string line in line_array){ if(strsrch(line,"MUD_IS_LOCKED") != -1){ lockline = line; } } if(sscanf(lockline,"%s%d",junk, num) < 2) { write("Operation failed. You need to hand-"+ "edit "+CONFIG_H+" immediately."); return 0; } if(num == 0) { write("Locking mud.\n"); num = 1; } else { write("Unlocking mud.\n"); num = 0; } newline = junk + num; newfile = replace_string(line_string, lockline, newline); write_file(CONFIG_H,newfile,1); load_object("/secure/cmds/creators/update")->cmd("/secure/daemon/master"); load_object("/secure/cmds/creators/update")->cmd("/secure/lib/connect"); write("\n"); Menu(); return 1; } int ShowLock(){ validate(); if(load_object("/secure/daemon/master")->is_locked()){ write("Mud is locked. Only admins and designated personnel can log in.\n"); } else write("Mud is unlocked. Players are free to login.\n"); Menu(); return 1; } int SetTZ(){ validate(); write("Please enter the desired time zone: \n"); input_to( (: eventSetTZ :) ); return 1; } int eventSetTZ(string str){ string ret; validate(); ret = set_tz(str); write(ret+"\n"); load_object("/secure/cmds/creators/update")->cmd("/daemon/time"); Menu(); return 1; } int ChangeEmail(){ validate(); write("Current admin email is: "+admin_email()); write("Please enter the new email address of the mud administrator: \n"); input_to( (: eventChangeEmail :) ); return 1; } varargs int eventChangeEmail(string str, int auto){ string *line_array; string lockline, newline, newfile, line_string, junk, email; validate(); if(strsrch(str,"@") == -1 ) { write("That isn't a valid email address."); if(!auto) Menu(); return 0; } str == replace_string(str, "#", ""); line_string = read_file(CONFIG_H); if(!sizeof(line_string)) write("Couldn't read file."); line_array = explode(line_string, "\n"); if(!sizeof(line_array)) write("Array is zero length."); foreach(string line in line_array){ if(strsrch(line,"ADMIN_EMAIL") != -1){ lockline = line; } } if(sscanf(lockline,"%s\"%s\"",junk, email) < 2) { write("Operation failed. You need to hand-"+ "edit "+CONFIG_H+" immediately."); if(!auto) Menu(); return 0; } newline = junk + "\""+str+"\""; newfile = replace_string(line_string, lockline, newline); write_file(CONFIG_H,newfile,1); load_object("/secure/cmds/creators/update")->cmd("/secure/sefun/sefun"); write("\n"); if(!auto) Menu(); return 1; } int SetReboot(){ validate(); write("Current reboot interval is set to "+EVENTS_D->GetRebootInterval()+" hours."); write(load_object("/cmds/players/nextreboot")->cmd("string")); write("Please enter the new desired interval in hours:\n"); input_to( (: eventSetReboot :) ); return 1; } int eventSetReboot(mixed i){ int num, check; validate(); if(!intp(i) && !sscanf(i,"%d",num)){ write("Failed to set new interval.\n"); Menu(); return 1; } if(intp(i)) num = i; check = EVENTS_D->SetRebootInterval(num); reload(EVENTS_D); if(num == check) write("Reboot interval set to "+EVENTS_D->GetRebootInterval()+" hours."); else write("Reboot interval could not be set. Current interval is: "+ check + " hours."); Menu(); return 1; } int AddClass(){ validate(); write("Classes currently available: "+implode(load_object(CLASSES_D)->GetClasses()," ")); write("Please enter the name of the class you'd like to add: \n"); input_to( (: eventAddClass :) ); return 1; } int eventAddClass(string str){ string classpath; array *classes; validate(); if(!str) { write("Invalid class name.\n"); Menu(); return 1; } classpath = "/secure/cfg/classes/"+str; write("Looking for "+classpath+"..."); classes = load_object(CLASSES_D)->GetClasses(); if(member_array(str,classes) != -1) { write("That class is already available.\n"); Menu(); return 1; } if(file_size(classpath) < 1) { write("For a class to be added, you must create and "); write("edit a class file, then place it in /secure/cfg/classes "); write("with the other class files.\n"); write("Operation Failed: no such class file\n"); Menu(); return 1; } CLASSES_D->AddClass(classpath); write("Classes currently available: "+implode(load_object(CLASSES_D)->GetClasses()," ")+"\n"); Menu(); return 1; } int RemoveClass(){ validate(); write("Classes currently available: "+implode(load_object(CLASSES_D)->GetClasses()," ")); write("Please enter the class you'd like to remove: \n"); input_to( (: eventRemoveClass :) ); return 1; } int eventRemoveClass(string str){ validate(); if(!str){ write("That is not a valid class.\n"); Menu(); return 1; } if(member_array(str,load_object(CLASSES_D)->GetClasses()) == -1) { write("That class is already unavailable.\n"); Menu(); return 1; } load_object(CLASSES_D)->RemoveClass(str); write("Classes currently available: "+implode(load_object(CLASSES_D)->GetClasses()," ")+"\n"); Menu(); return 1; } int AddRace(){ validate(); write("Races currently available: "+implode(load_object(RACES_D)->GetRaces()," ")); write("Please enter the name of the race you'd like to add: \n"); input_to( (: eventAddRace :) ); return 1; } int eventAddRace(string str){ array *races; validate(); if(!str) { write("Invalid race name.\n"); Menu(); return 1; } racepath = "/secure/cfg/races/"+str; write("Looking for "+racepath+"..."); races = load_object(RACES_D)->GetRaces(); if(member_array(str,races) != -1) { write("That race is already available.\n"); Menu(); return 1; } if(file_size(racepath) < 1) { write("For a race to be added, you must create and "); write("edit a race file, then place it in /secure/cfg/races "); write("with the other race files.\n"); write("Operation Failed: no such race file\n"); Menu(); return 1; } write("Should players be able to play as this race?"); write("A response other than yes will be interpreted as a no.\n"); input_to( (: PlayerRace :) ); return 1; } int PlayerRace(string str){ string *response_array = ({"yes","ok","y","yeah","yes, please"}); validate(); if(!str) str = "no"; if(member_array(str,response_array) != -1) RACES_D->AddRace(racepath, 1); else RACES_D->AddRace(racepath); write("Races currently available: "+implode(load_object(RACES_D)->GetRaces()," ")+"\n"); Menu(); return 1; } int RemoveRace(){ validate(); write("Races currently available: "+implode(load_object(RACES_D)->GetRaces()," ")); write("Please enter the race you'd like to remove: \n"); input_to( (: eventRemoveRace :) ); return 1; } int eventRemoveRace(string str){ validate(); if(!str){ write("That is not a valid race.\n"); Menu(); return 1; } if(member_array(str,load_object(RACES_D)->GetRaces()) == -1) { write("That race is already unavailable.\n"); Menu(); return 1; } load_object(RACES_D)->RemoveRace(str); write("Races currently available: "+implode(load_object(RACES_D)->GetRaces()," ")+"\n"); Menu(); return 1; } int AddCurrency(){ validate(); write("Currencies currently available: "+implode(ECONOMY_D->__QueryCurrencies()," ")); write("Please enter the name of the curency you'd like to add: \n"); input_to( (: eventAddCurrency :) ); return 1; } int eventAddCurrency(string str){ string query; validate(); currency = str; if(!str || str == "") { write("Invalid currency name.\n"); Menu(); return 1; } currencies = ECONOMY_D->__QueryCurrencies(); if(member_array(str,currencies) != -1) { write("That currency is already available.\n"); Menu(); return 1; } if(sizeof(currencies) > 2){ query = "What should its exchange rate, or value be? For comparison, "+currencies[0]+" "; query += "has a rate of "+ ECONOMY_D->__Query(currencies[0],"rate")+", "+currencies[1]+" "; query += "has a rate of "+ ECONOMY_D->__Query(currencies[1],"rate")+", and "+currencies[2]+" "; query += "has a rate of "+ ECONOMY_D->__Query(currencies[2],"rate")+".\n"; } else query = "What should its exchange rate, or value be?"; write(query); input_to( (: CurrencyRate :) ); return 1; } int CurrencyRate(string str){ string query; validate(); if(!str || !sscanf(str,"%f",rate) ){ write("Invalid rate. Currency not added.\n"); Menu(); return 1; } if(sizeof(currencies) > 2){ query = "What should its weight be? For comparison, "+currencies[0]+" "; query += "has a weight of "+ ECONOMY_D->__Query(currencies[0],"weight")+", "+currencies[1]+" "; query += "has a weight of "+ ECONOMY_D->__Query(currencies[1],"weight")+", and "+currencies[2]+" "; query += "has a weight of "+ ECONOMY_D->__Query(currencies[2],"weight")+".\n"; } else query = "What should its weight be?"; write(query); input_to( (: CurrencyWeight :) ); return 1; } int CurrencyWeight(string str){ string query; validate(); if(!str || !sscanf(str,"%f",weight) ){ write("Invalid weight. Currency not added.\n"); Menu(); return 1; } if(sizeof(currencies) > 2){ query = "What should its inflation rate be? For comparison, "+currencies[0]+" "; query += "has an inflation rate of "+ ECONOMY_D->__Query(currencies[0],"inflation")+", "+currencies[1]+" "; query += "has an inflation rate of "+ ECONOMY_D->__Query(currencies[1],"inflation")+", and "+currencies[2]+" "; query += "has an inflation rate of "+ ECONOMY_D->__Query(currencies[2],"inflation")+".\n"; } else query = "What should its inflation rate be?"; write(query); input_to( (: CurrencyInflation :) ); return 1; } int CurrencyInflation(string str){ validate(); if(!str || !sscanf(str,"%f",inflation) ){ write("Invalid inflation rate. Currency not added.\n"); Menu(); return 1; } write(identify(previous_object(-1))); write("ECONOMY_D->add_currency(\""+currency+"\", "+rate+", "+inflation+", "+weight+");"); ECONOMY_D->add_currency(currency, rate, inflation, weight); write("Thank you. Currency added.\n"); Menu(); return 1; } int RemoveCurrency(){ validate(); currencies = ECONOMY_D->__QueryCurrencies(); if(sizeof(currencies) == 1) { write("Please add a currency before removing this last one."); write("Removing the last currency would cause the mud to "+ "behave unexpectedly."); return 1; } write("Available currencies: "+ identify(currencies) +"."); write("Which currency would you like to remove?\n"); input_to( (: eventRemoveCurrency :) ); return 1; } int eventRemoveCurrency(string str){ validate(); if(!str || member_array(str, currencies) == -1) { write("Invalid currency. No currency removed.\n"); Menu(); return 1; } ECONOMY_D->remove_currency(str); write("Remaining currencies: "+identify(ECONOMY_D->__QueryCurrencies())+"\n"); Menu(); return 1; } int RidUser(){ validate(); write("Please enter the name of the player you'd like to erase.\n"); input_to( (: eventRidUser :) ); return 1; } int eventRidUser(string str){ validate(); if(!str){ write("Invalid entry.\n"); Menu(); return 1; } if( !user_exists(str) ) { write("No such person: " + str + ".\n"); Menu(); } DoRid(str); return 1; } int DoRid(string who) { object ob; string str; validate(); ridded = lower_case(who); str = convert_name(who); who = capitalize(who); if( member_group(str, PRIV_SECURE) || member_group(str, PRIV_ASSIST) ){ write("You must first remove this person from a secure group."); Menu(); return 1; } if( ob = find_player(ridded)) { who = ob->GetCapName(); message("system", "You are being ridded from " + mud_name() + ".", ob); ob->eventForce("quit"); } file = player_save_file(ridded); write("Target is: "+ridded); write("Please enter the reason for ridding " + ridded + ".\n"); unguarded( (: rm(file) :) ); input_to( (: LogRid :) ); return 1; } int LogRid(string str){ validate(); globalstr = str; log_file("rid", "\n" + ridded + " by " + this_player()->GetCapName() + "\n" + str + "\n"); write(ridded + " has been ridded from " + mud_name() + "."); Menu(); return 1; } int BanishUser(){ validate(); write("Please enter the name to banish: \n"); input_to( (: eventBanishUser :) ); return 1; } int eventBanishUser(string str){ validate(); if(member_array(str,BANISH_D->query_banished()) != -1) { write("That name is already banished.\n"); Menu(); return 1; } if(!user_exists(str = lower_case(str))) { write(capitalize(str)+" is now banished.\n"); catch(call_other(BANISH_D, "banish_name", str)); } else { write("A player by that name already exists.\n"); this_player()->eventPrint(FINGER_D->GetFinger(str)); } Menu(); return 1; } int UnBanishUser(){ validate(); write("Please enter the name to unbanish: \n"); input_to( (: eventUnBanishUser :) ); return 1; } int eventUnBanishUser(string str){ validate(); if(member_array(str,BANISH_D->query_banished()) == -1) { write("That is not a banished name."); Menu(); return 1; } catch(call_other(BANISH_D, "unbanish_name", str)); write(str+" is unbanished.\n"); Menu(); return 1; } int ChangeName(){ validate(); write("Current MUD name is "+mud_name()); write("To change the mud's name, use the command: "); write("mudconfig mudname <name>"); Menu(); return 1; } varargs int eventChangeName(string newname, int automated){ string *line_array; string mconfig, nameline, newline, newfile, line_string, junk, name; validate(); if(!newname || newname == "") { write("Name change cancelled.\n"); Menu(); return 1; } if(automated){ if(mud_name() != "DeadSoulsNew" && mud_name() != "DeadSoulsWin") return 0; } if(!find_object(INSTANCES_D) || !ENABLE_INSTANCES || INSTANCES_D->GetMyInstanceName() == "global"){ mconfig = "/secure/cfg/mudos.cfg"; } else { mconfig = "/secure/cfg/mudos."+query_host_port()+".cfg"; } line_string = read_file(mconfig); if(!sizeof(line_string)) write("Couldn't read file."); line_array = explode(line_string, "\n"); if(!sizeof(line_array)) write("Array is zero length."); if(!sizeof(line_array) || !sizeof(line_string)) { if(!automated) Menu(); return 0; } foreach(string line in line_array){ if(strsrch(line,"name :") != -1){ nameline = line; } } if(!nameline || sscanf(nameline,"%s : %s",junk, name) < 2) { write("Operation failed. You need to copy over "+ mconfig+" immediately with an original."); if(!automated) Menu(); return 0; } if(automated){ if(name != "DeadSoulsWin" && name != "DeadSouls" && name != "Dead Souls" && name != "DeadSoulsNew") newname = name; cp(mconfig,"/secure/cfg/mudos.orig"); } newline = junk + " : " + newname; newfile = replace_string(line_string, nameline, newline); write_file(mconfig,newfile,1); cp(mconfig,"/secure/cfg/mudos.autobak."+query_host_port()); if(automated && query_windows()){ cp(mconfig,"/secure/cfg/mudos.win32"); } write("\n"); if(!automated) { write("\nMUD's name changed. Reboot the MUD to activate new name.\n"); write("\n Do you want to shut down the MUD now to activate the change?\n"); input_to( (: eventShutDownMud :) ); } return 1; } int ChangePort(){ validate(); if(!find_object(INSTANCES_D) || !ENABLE_INSTANCES || INSTANCES_D->GetMyInstanceName() == "global"){ write("Current MUD network port is "+query_host_port()); write("Please enter the new network port for your MUD:\n"); input_to( (: eventChangePort :) ); } else { write("Port changing in admintool is disabled for instances."); Menu(); } return 1; } varargs int eventChangePort(string newport, int automated){ string *line_array; string nameline, newline, newfile, line_string, junk, name; int num; validate(); if(!newport || newport == "") { write("Port change cancelled.\n"); Menu(); return 1; } if(!sscanf(newport,"%d", num) > 0 || num < 1 || num > 65535 ) { write("Invalid port: numeral between 1 and 65535 expected."); write("Port change cancelled.\n"); Menu(); return 1; } line_string = read_file("/secure/cfg/mudos.cfg"); if(!sizeof(line_string)) write("Couldn't read file."); line_array = explode(line_string, "\n"); if(!sizeof(line_array)) write("Array is zero length."); foreach(string line in line_array){ if(strsrch(line,"external_port_1 :") != -1){ nameline = line; } } if(!nameline || sscanf(nameline,"%s : %s",junk, name) < 2) { write("Operation failed. You need to copy over "+ "/secure/cfg/mudos.cfg immediately with an original."); if(!automated) Menu(); return 0; } newline = junk + " : telnet " + newport; newfile = replace_string(line_string, nameline, newline); write_file("/secure/cfg/mudos.cfg",newfile,1); if(!automated) { write("\nMUD's port changed. Reboot the MUD to activate new port."); write("NOTE: If the port you selected is 1024 or below, your OS "+ "may require the MUD to run as a privileged user."); write("\n Do you want to shut down the MUD now to activate the change?\n"); input_to( (: eventShutDownMud :) ); } return 1; } int ShutDownMud(){ validate(); write("Are you sure?"); input_to( (: eventShutDownMud :) ); return 1; } int eventShutDownMud(string str){ string *response_array = ({"yes","ok","y","yeah","yes, please"}); validate(); if(!str) str = "no"; if(member_array(str,response_array) == -1){ write("Shutdown cancelled.\n"); Menu(); return 1; } write("Shutdown initiated.\n"); if(this_player()->GetForced()) return 0; shout("Game is shut down by " + this_player()->GetKeyName() + ".\n"); log_file("game_log", ctime(time())+" Game shutdown by "+ this_player()->GetKeyName()+"(admintool)\n"); foreach(object dude in users()){ if(sizeof(base_name(dude)) && !archp(dude)) dude->eventForce("quit"); } shutdown(); write("Shutdown complete."); Menu(); return 1; } int AddGroup(){ validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); write("\nWhat is the name of the group you'd like to add?\n"); input_to( (: eventAddGroup :) ); return 1; } int eventAddGroup(string str){ string config_file, new_config_file; string *line_array; string *top_array; string *bottom_array; validate(); top_array = ({}); bottom_array = ({}); if(!str || str == "") { write("\nGroup addition cancelled.\n"); Menu(); return 1; } config_file = read_file("/secure/cfg/groups.cfg"); if(!sizeof(config_file)) { write("Couldn't read file. Addition cancelled.\n"); Menu(); return 1; } str = upper_case(str); if(strsrch(config_file,"("+str+")") != -1 ) { write("\nThat group already exists. Addition cancelled.\n"); Menu(); return 1; } line_array = explode(config_file, "\n"); if(!sizeof(line_array)) { write("\nArray is zero length. Addition cancelled.\n"); Menu(); return 1; } foreach(string line in line_array){ if(strsrch(line,"(") != -1 && first(line,1) != "#"){ bottom_array += ({ line }); } else top_array += ({ line }); } bottom_array += ({"("+str+") "}); new_config_file = implode(top_array,"\n"); new_config_file += "\n"; new_config_file += implode(bottom_array,"\n"); write_file("/secure/cfg/groups.cfg",new_config_file,1); write("\nGroup "+str+" added.\n"); load_object("/secure/cmds/creators/update")->cmd("/secure/daemon/master"); load_object("/secure/cmds/creators/update")->cmd("/secure/lib/connect"); Menu(); return 1; } int RemoveGroup(){ validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); write("\nWhat is the name of the group you'd like to remove?\n"); input_to( (: eventRemoveGroup :) ); return 1; } int eventRemoveGroup(string str){ string config_file, new_config_file; string *line_array; string *top_array; string *bottom_array; validate(); top_array = ({}); bottom_array = ({}); if(!str || str == "") { write("\nGroup removal cancelled.\n"); Menu(); return 1; } config_file = read_file("/secure/cfg/groups.cfg"); if(!sizeof(config_file)) { write("Couldn't read file. removal cancelled.\n"); Menu(); return 1; } str = upper_case(str); if(strsrch(config_file,"("+str+")") == -1 ) { write("\nThat group doesn't exist. removal cancelled.\n"); Menu(); return 1; } if(str == "SECURE" || str == "ASSIST"){ write("\nThis is a configured administrative group. You "+ "can't remove it with admintool. If you really, really, really "+ "know what you're doing and you want to remove that group, you'll "+ "have to do it manually with an editor.\n"); Menu(); return 1; } line_array = explode(config_file, "\n"); if(!sizeof(line_array)) { write("\nArray is zero length. removal cancelled.\n"); Menu(); return 1; } foreach(string line in line_array){ if(strsrch(line,"(") != -1 && first(line,1) != "#"){ if(strsrch(line,"("+str+")") == -1 ) bottom_array += ({ line }); } else if(strsrch(line,"("+str+")") == -1 ) top_array += ({ line }); } new_config_file = implode(top_array,"\n"); new_config_file += "\n"; new_config_file += implode(bottom_array,"\n"); write_file("/secure/cfg/groups.cfg",new_config_file,1); load_object("/secure/cmds/creators/update")->cmd("/secure/daemon/master"); load_object("/secure/cmds/creators/update")->cmd("/secure/lib/connect"); write("\nGroup "+str+" removed.\n"); Menu(); return 1; } int ModGroup(){ validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); write("\nWhat is the name of the group you'd like to modify?\n"); input_to( (: eventModGroup :) ); return 1; } int eventModGroup(string str){ string config_file; validate(); if(!str || str == "") { write("\nGroup modification cancelled.\n"); Menu(); return 1; } config_file = read_file("/secure/cfg/groups.cfg"); if(!sizeof(config_file)) { write("Couldn't read file. modification cancelled.\n"); Menu(); return 1; } str = upper_case(str); if(strsrch(config_file,"("+str+")") == -1 ) { write("\nThat group doesn't exist. modification cancelled.\n"); Menu(); return 1; } if(!sizeof(explode(config_file, "\n"))) { write("\nArray is zero length. modification cancelled.\n"); Menu(); return 1; } write(str); global_group_temp = str; write("The group format must be entered correctly. If the members are larry, moe, and curly, enter:\n"); write("larry:moe:curly\n"); write("\nIt's important to put those colons between names. If the only member is shemp, enter:\n"); write("shemp\n"); write("\nWhat would you like that group to contain?\n"); input_to ( (: eventEditGroup :) ); return 1; } int eventEditGroup(string members){ string config_file, new_config_file, str; string *line_array; string *top_array; string *bottom_array; string *dudes; validate(); members = lower_case(members); top_array = ({}); bottom_array = ({}); config_file = read_file("/secure/cfg/groups.cfg"); line_array = explode(config_file, "\n"); str = global_group_temp; global_group_temp = ""; if(str == "ASSIST" || str == "SECURE" ) { if(!securep(this_player())){ write("Only full admins may do this."); Menu(); return 1; } } if(str == "SECURE"){ validate(); if(!members || members == "") { write("You're not leaving the SECURE group empty. Modification cancelled.\n"); Menu(); return 1; } if(strsrch(members,":") != -1) dudes = explode(members,":"); else dudes = ({ members }); if(member_array(this_player()->GetKeyName(),dudes) == -1) { write("You can only modify this line with admintool if you include yourself in it. Modification cancelled.\n"); Menu(); return 1; } } foreach(string line in line_array){ if(strsrch(line,"(") != -1 && first(line,1) != "#"){ if(strsrch(line,"("+str+")") == -1 ) bottom_array += ({ line }); } else if(strsrch(line,"("+str+")") == -1 ) top_array += ({ line }); } new_config_file = implode(top_array,"\n"); new_config_file += "\n"; new_config_file += implode(bottom_array,"\n"); new_config_file += "\n"; new_config_file += "("+str+") "+members; write_file("/secure/cfg/groups.cfg",new_config_file,1); load_object("/secure/cmds/creators/update")->cmd("/secure/daemon/master"); load_object("/secure/cmds/creators/update")->cmd("/secure/lib/connect"); write("\nGroup "+str+" modified.\n"); Menu(); return 1; } int ShowGroups(){ validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); Menu(); return 1; } mixed cmd(string args) { validate(); Menu("main"); return 1; }