#include "boot.clh"
object SYS_OBJ
parents ROOT_OBJ;
name = "The System Object";
list players = { WIZARD } , connected_players;
list connected_servers;
list wizards = { WIZARD };
list visitors; /* remote objects contained in local objects */
obj player_class;
num dbtop;
method init
if (caller != SYS_OBJ)
raise(E_PERM);
else
this.add_owner(WIZARD);
endif
endmethod /* init */
method boot_server
if (caller != SYS_OBJ)
raise(E_PERM);
endif
connected_players = {};
connected_servers = { SYS_OBJ };
player_class = PROGRAMMER;
endmethod /* boot_server */
method resynch
var item, dummy;
if (caller != SYS_OBJ)
raise(E_PERM);
endif
for item in (visitors)
/* if visiting object is no longer in a local object, */
if (serverof(item[1].location))
dummy = item[2].remove(item[1]); /* remove it */
visitors = visitors - item;
endif
endfor
endmethod /* resynch */
method add_wizard
if (!(caller in wizards))
player.tell("Permission denied.");
else
wizards = wizards + args[1];
player.tell("Wizard added.");
endif
endmethod /* add_wizard */
method rm_wizard
if (!(caller in wizards))
player.tell("Permission denied.");
else
wizards = wizards - args[1];
player.tell("Wizard removed.");
endif
endmethod /* rm_wizard */
method wizards
return wizards;
endmethod /* wizards */
method convtime
var r, time, howmany;
if (lengthof(args) != 1)
raise(E_RANGE);
elseif (typeof(args[1]) != NUM)
raise(E_TYPE);
else
time = args[1];
if (time > (24 * 60 * 60))
r = " day";
howmany = time / (24 * 60 * 60);
elseif (time > (60 * 60))
r = " hour";
howmany = time / (60 * 60);
elseif (time > 60)
r = " minute";
howmany = time / 60;
else
r = " second";
howmany = time;
endif
if(howmany != 1)
r = r + "s";
endif
return tostr(howmany) + r;
endif
endmethod
method who
var dude;
/*
* show connected players
*/
if (args)
player.tell(args[1]);
endif
player.tell("Player Name On For Idle");
for dude in (connected_players)
player.tell(pad(dude.name, 17) + " "
+ pad(this.convtime(time() - dude.connected_at), 11) + " "
+ pad(this.convtime(time() - dude.last_cmd_at), 11));
endfor
endmethod /* who */
method add_visitor
visitors = visitors + {args[1], args[2]};
endmethod /* add_visitor */
method rm_visitor
visitors = visitors + {args[1], args[2]};
endmethod /* rm_visitor */
method visitors
return visitors;
endmethod /* visitors */
method connect_player
if (caller != SYS_OBJ)
raise E_PERM;
else
connected_players = connected_players + args[1];
args[1].connect();
endif
endmethod /* connect_player */
method create_player
ignore E_METHODNF;
if (caller != SYS_OBJ)
raise E_PERM;
else
connected_players = connected_players + args[1];
players = players + args[1];
args[1].connect();
endif
endmethod /* create_player */
method disconnect_player
if (caller != SYS_OBJ)
raise E_PERM;
else
connected_players = connected_players - args[1];
args[1].disconnect();
endif
endmethod /* disconnect_player */
method rm_player
if ((caller in wizards) || caller == args[1])
players = players - args[1];
else
raise E_PERM;
endif
endmethod /* rm_player */
method players
return players;
endmethod /* players */
method connected_players
return connected_players;
endmethod /* connected_players */
method find_player
var dude;
for dude in (players)
if (dude.name == args[1])
return dude;
endif
endfor
return NOTHING;
endmethod /* find_player */
method find_connected_player
var dude;
for dude in (connected_players)
if (dude.name == args[1])
return dude;
endif
endfor
return NOTHING;
endmethod /* find_connected_player */
method connect_server
connected_servers = connected_servers + args[1];
SYS_OBJ.resynch();
endmethod /* connect_server */
method disconnect_server
connected_servers = connected_servers - args[1];
endmethod /* disconnect_server */
endobject /* SYS_OBJ */