/* Do not remove the headers from this file! see /USAGE for more info. */ /* ** pshell.c -- player shell object ** ** Simple shell for the players. ** ** 950817, Deathblade: created. */ #include <mudlib.h> #include <daemons.h> #include <commands.h> inherit SHELL; inherit M_COMPLETE; string array query_path() { return ({ CMD_DIR_PLAYER "/" }); } string query_shellname(){ return "Player Shell"; } private mapping shell_vars = ([]); void set_variable(string name, mixed value) { if(!shell_vars) shell_vars = ([]); switch(name) { case "ansi": case "status": case "MORE": shell_vars[name] = value; return; default: error("Bad player shell variable."); } } void unset_variable(string name, mixed value) { if(!shell_vars) shell_vars = ([]); switch(name) { case "ansi": case "status": case "MORE": map_delete(shell_vars,name); return; default: error("Bad player shell variable."); } } mixed get_variable(string name) { if(!shell_vars) shell_vars = ([]); return shell_vars[name]; } private nomask string expand_one_argument(string arg) { mixed expansion; if ( strlen(arg) <= 1 || arg[<1] != '*' ) return arg; expansion = complete_user(arg[0..<2]); if ( stringp(expansion) ) return expansion; return arg; } protected void execute_command(string original_input) { string * argv = explode(original_input, " "); mixed tmp; array winner; string argument; /* BEGINNING OF EXPANSION */ // In some shells, this is the hook for doing username completion, // globbing, flag pre-parsing, etc... In others, it's used to execute // code encased in ` `'s. argv = map(argv, (: expand_one_argument :)); if(!argv) return; argv -= ({ "" }); // ### wtf is this? // Hmm, I might undo this one... the only reason this is here is to // allow \\$ to work right. \$ can work right in other ways.... argv = map(argv, (: stringp($1) ? replace_string($1, "\\$","$") : $1 :)); // If there is a local shell command that matches our input, try to // execute it. evaluate(tmp=dispatch[argv[0]], argv); if(tmp) return; /* END OF EXPANSION */ winner = CMD_D->find_cmd_in_path(argv[0], ({ CMD_DIR_PLAYER "/" })); if ( !arrayp(winner) ) { string channel_name; if ( this_body()->do_game_command(original_input) ) return; /* try a channel */ channel_name = CHANNEL_D->is_valid_channel(argv[0], this_user()->query_channel_list()); if ( channel_name ) { /* ### strictly speaking, players can't use I3 channels */ int chan_type = channel_name[0..4] == "imud_"; CHANNEL_D->cmd_channel(channel_name, implode(argv[1..], " "), chan_type); return; } //### This is a hack until the parser can tell me if a word is a verb. if(is_file(CMD_DIR_VERBS "/" + argv[0] + ".c")) write(this_body()->nonsense()); else printf("I don't know the word: %s.\n", argv[0]); return; } if ( sizeof(argv) > 1 ) argument = implode(argv[1..], " "); winner[0]->call_main(argument,0,0,0,0,0,argument); } protected nomask string query_save_path(string userid) { return PSHELL_PATH(userid); }