# include <config.h> # undef status # include <status.h> # include "/dgd/lib/privilege.h" object player; /* associated player object */ int echo; /* is input echoing turned on */ object snooper; /* snooper of this object */ object input_obj; /* object for input_to */ string input_func; /* function for input_to */ object editor; /* editor object */ string exit_func; /* editor exit function */ int timestamp; /* last time something was typed */ string fail_mesg; /* notify_fail message */ string file; /* file for which offset is remembered */ int line, offset; /* line and offset in file */ /* * NAME: set_player() * DESCRIPTION: set the player object */ void set_player(object obj) { if (object_name(previous_object()) == DRIVER || PRIVILEGED()) { player = obj; } } /* * NAME: query_player() * DESCRIPTION: return the player object */ object query_player() { return player; } /* * NAME: open() * DESCRIPTION: start a user connection for this object */ static void open() { timestamp = time(); echo = 1; set_this_player(player); player->_F_call("logon"); } /* * NAME: close() * DESCRIPTION: close the user connection of this object */ static void close() { if (editor != 0) { editor->rescue_file(); destruct(editor); } if (player != 0) { player = 0; destruct(this_object()); } } /* * NAME: force_close() * DESCRIPTION: forcibly close the user connection */ void force_close() { if (object_name(previous_object()) == DRIVER) { player = 0; if (editor != 0) { destruct(editor); } destruct(this_object()); } } /* * NAME: catch_tell() * DESCRIPTION: catch a message */ void catch_tell(string str) { if (str == 0) { return; } send_message(str); if (snooper != 0) { snooper->catch_tell("%" + str); } } /* * NAME: ralign() * DESCRIPTION: return a number as a string, aligned to the right */ private string ralign(int num) { string str; str = "" + num; return " "[0 .. 10 - strlen(str)] + str; } /* * NAME: show_status() * DESCRIPTION: show resource usage information */ private void show_status() { int *stat; stat = status(); catch_tell( "Swap device: " + ralign(stat[ST_SWAPSIZE]) + " sectors,\n" + " " + ralign(stat[ST_SWAPUSED]) + " used.\n" + "Objects swapped out:" + ralign(stat[ST_SWAPRATE]) + " per minute.\n" + "Memory allocated: " + ralign(stat[ST_MEMSIZE]) + " bytes,\n" + " " + ralign(stat[ST_MEMUSED]) + " used.\n" + "Objects: " + ralign(stat[ST_NOBJECTS]) + "\n" + "Call_outs: " + ralign(stat[ST_NCALLOUTS]) + "\n"); } /* * NAME: receive_message() * DESCRIPTION: receive user input */ static void receive_message(string str) { set_this_player(player); timestamp = time(); if (echo && snooper != 0) { snooper->catch_tell("%" + str + "\n"); } if (echo == 0) { send_message(echo = 1); } if (strlen(str) != 0 && str[0] == '!' && environment(player)) { if (str == "!status") { show_status(); } else { command(str[1 ..], player); } } else if (editor != 0) { editor->edit(str); if (query_editor(editor) == 0) { destruct(editor); if (exit_func == 0) { catch_tell("Exit from ed.\n"); } else { call_other(player, exit_func); } } } else if (input_obj != 0) { object obj; string func; obj = input_obj; func = input_func; input_obj = 0; input_func = 0; send_message(1); obj->_F_call(func, str); } else { if (input_func != 0) { input_func = 0; send_message(1); } if (strlen(str) != 0 && str[0] == '!') { str = str[1 ..]; } if (strlen(str) != 0) { if (str == "status") { show_status(); } else { command(str, player); } } } if (editor != 0) { catch_tell((query_editor(editor) == "insert") ? "*\b" : ":"); } else if (input_obj == 0) { catch_tell("> "); } } /* * NAME: set_input_to() * DESCRIPTION: redirect user input to a function */ int set_input_to(object obj, string func, int flag) { if (PRIVILEGED() && input_obj == 0) { input_obj = obj; input_func = func; if (flag) { send_message(echo = 0); } return 1; } return 0; } /* * NAME: set_snoop() * DESCRIPTION: set the snooper of this object */ void set_snoop(object snoopy) { if (PRIVILEGED()) { snooper = snoopy; } } /* * NAME: query_snoop() * DESCRIPTION: query the snooper of this object */ object query_snoop() { if (PRIVILEGED()) { return snooper; } } /* * NAME: set_editor() * DESCRIPTION: set the editor object */ void set_editor(object ed, string func) { if (PRIVILEGED()) { editor = ed; exit_func = func; } } /* * NAME: query_editor() * DESCRIPTION: return the editor object */ object query_editor() { if (PRIVILEGED()) { return editor; } } /* * NAME: set_notify_fail() * DESCRIPTION: set the notify_fail message */ void set_notify_fail(string mesg) { fail_mesg = mesg; } /* * NAME: notify_fail() * DESCRIPTION: display the notify_fail message */ void notify_fail() { if (fail_mesg != 0) { catch_tell(fail_mesg); } } /* * NAME: set_file_offset() * DESCRIPTION: set the offset in a file */ void set_file_offset(string f, int l, int o) { if (PRIVILEGED()) { file = f; line = l; offset = o; } } /* * NAME: query_file_offset() * DESCRIPTION: return a file offset */ int *query_file_offset(string f) { if (PRIVILEGED() && file == f) { return ({ line, offset }); } return 0; } /* * NAME: query_idle() * DESCRIPTION: return idle time of this user */ int query_idle() { return time() - timestamp; }