/* /lib/command.c * from the Dead Souls Object Library * handles commands of living objects * created by Descartes of Borg 950323 * Version: @(#) command.c 1.2@(#) * Last modified: 96/12/07 */ #include <lib.h> #include <daemons.h> #include "include/command.h" //inherit "/lib/props/extra_parse"; private static int Forced; private static string CommandFail; private static string *SearchPath; private static string *apostrophe_exceptions; int direct_force_liv_str() { return 1; } int direct_force_liv_to_str() { return 1; } /* *************** /lib/command.c driver applies *************** */ static void create() { apostrophe_exceptions = ({ "ed","modify","delete","create","add" }); apostrophe_exceptions += ({"rwho", "finger","mudlist","tell","eval"}); apostrophe_exceptions += ({"say","speak","yell","whisper","shout"}); SearchPath = ({ DIR_PLAYER_CMDS, DIR_SECURE_PLAYER_CMDS, DIR_CLAN_CMDS, DIR_COMMON_CMDS, DIR_SECURE_COMMON_CMDS }); } static string process_input(string cmd) { return cmd; } /* *************** /lib/command.c command lfuns *************** */ static int cmdAll(string args) { object old_agent; mixed err; string verb, file; old_agent = this_agent(this_object()); verb = query_verb(); if(this_player()->GetSleeping() > 0) { if(verb != "wake") { this_player()->eventPrint("You are asleep."); return 1; } } if(GetCustomCommand(verb) && GetCustomCommand(verb) != "" && !creatorp(this_player()) ){ this_player()->eventPrint("How clever of you. Or lucky. In any case, this command is unavailable to you."); return 1; } if( !(file = (GetCustomCommand(verb) )) || GetCustomCommand(verb) == "") { if( !(file = (string)CMD_D->GetCommand(verb, GetSearchPath())) ) { string cmd; int dbg; if( args ) cmd = verb + " " + args; else cmd = verb; if( (int)this_object()->GetProperty("parse debug") ) dbg = 1; if( (int)this_object()->GetProperty("debug") ) dbg = 1; else dbg = 0; if( (err = parse_sentence(cmd, dbg)) == 1 ) { this_agent(old_agent || 1); return 1; } if( err ) { if( err == -1 ) { if( !(err = (string)VERBS_D->GetErrorMessage(verb)) && !(err = (string)SOUL_D->GetErrorMessage(verb)) ) { err = "Such a command exists, but no default " "syntax is known."; } } if( intp(err) ) /* MudOS bug */ err = "What?"; SetCommandFail(err); } message("error", GetCommandFail(), this_object()); this_agent(old_agent || 1); return 1; } } if( (err = (mixed)call_other(file, "cmd", args)) != 1 ) { string cmd; if( err ) SetCommandFail(err); if( !args || args == "" ) cmd = verb; else cmd = verb + " " + args; if( (err = parse_sentence(cmd)) == 1 ) { this_agent(old_agent || 1); return 1; } if( !err ) err = GetCommandFail(); message("error", err, this_object()); this_agent(old_agent || 1); return 1; } this_agent(old_agent || 1); return 1; } int cmdDebugAll(string args) { object old_agent; mixed err; string verb, file; old_agent = this_agent(this_object()); verb = query_verb(); if( !(file = (string)CMD_D->GetCommand(verb, GetSearchPath())) ) { string cmd; if( args ) cmd = verb + " " + args; else cmd = verb; if( (err = parse_sentence(cmd, 3)) == 1 ) { this_agent(old_agent || 1); return 1; } if( err ) SetCommandFail(err); message("error", GetCommandFail(), this_object()); this_agent(old_agent || 1); return 1; } if( (err = (mixed)call_other(file, "cmd", args)) != 1 ) { string cmd; if( err ) SetCommandFail(err); if( !args || args == "" ) cmd = verb; else cmd = verb + " " + args; if( (err = parse_sentence(cmd, 3)) == 1 ) { this_agent(old_agent || 1); return 1; } if( !err ) err = GetCommandFail(); message("error", err, this_object()); this_agent(old_agent || 1); return 1; } this_agent(old_agent || 1); return 1; } /* *************** /lib/command.c lfuns *************** */ int Setup() { enable_commands(); add_action( (: cmdAll :), "", 1); } int eventForce(string cmd) { string err; int res; cmd = process_input(cmd); Forced = 1; err = catch(res = command(cmd)); Forced = 0; if(err) error(err); return res; } /* ********** /lib/command.c data manipulation functions ********** */ string *AddSearchPath(mixed val) { if(stringp(val)) { if(!strsrch(val,"/secure/cmds/admins") || !strsrch(val,"/cmds/admins")){ if(!(int)master()->valid_apply(({ "SECURE", "ASSIST", "LIB_CONNECT" })) ){ tell_creators("Security violation in progress: "+identify(previous_object(-1)) + ", "+get_stack()); error("Illegal attempt to modify path data: "+identify(previous_object(-1)) + ", "+get_stack()); } } val = ({ val }); } else if(!pointerp(val)) error("Bad argument 1 to AddSearchPath()\n"); return (SearchPath = distinct_array(SearchPath + val)); } string *RemoveSearchPath(mixed val) { if(stringp(val)) val = ({ val }); else if(!pointerp(val)) error("Bad argument 1 to RemoveSearchPath()\n"); return (SearchPath -= val); } string *GetSearchPath() { return SearchPath; } int GetForced() { return Forced; } string GetClient() { return 0; } string SetCommandFail(string str) { if( !str || str == "" ){ if(!creatorp(this_player())) CommandFail = "Try \"help commands\" for a list of some commands."; if(creatorp(this_player())) CommandFail = "Try \"help creator commands\" for a list of some creator commands."; return CommandFail; } else return (CommandFail = str); } string GetCommandFail() { return CommandFail; }