inherit "/std/object";
// This is the timeD, a time keeping daemon for LPC.
// This one does netdeads, idleouts and handles automatic reboots
// Written and Modified by Asmdoean, Skullslayer, Hamlet, Wonderflug, and
// many more :)
#define REBOOT_TIME 23 * 60 * 60 /* every 23 hours, so its not always
the same time */
#define REBOOT_MEMORY 15 * 1024 * 1024
#define STAT_TIME 600 /* Do a statistics every tenth minute */
int SHUTTING=0; // whether in shutdown at the moment
int last_time;
object *netdeads();
int query_player_object(object pob);
// "do_idletest", "auto_reboot", "net_dead_purge"
string *checks = ({
"auto_reboot", "do_stat_users"
});
// Here are the function definitions
// This is so they are known to anything that wants to call them
void do_idletest();
void do_stat_users();
void auto_reboot();
void net_dead_purge();
void setup() {
set_name("daemon");
set_short(0);
set_long("This is a daemon, of a very daemonic nature.\n");
reset_get();
add_property("no_clean_up",1);
call_out("do_checks",60);
seteuid("Root");
}
// In case Armageddon gets dested - Radix
void reset_shutting()
{
SHUTTING = 0;
remove_call_out("do_checks");
call_out("do_checks",60);
}
void do_checks() {
int i,size;
size = sizeof(checks);
for (i=0; i<size; i++) {
call_other(this_object(),checks[i]);
}
call_out("do_checks",60);
}
/*
* This is the function that will check every player to test for idleness
* by calling the idle_out() function in each player
*/
void do_idletest() {
object *arr;
int i, size;
arr = users();
size = sizeof(users());
for (i=0; i < size; i++) {
// check that the player didn't sneak out while we weren't looking
if (userp(arr[i]))
arr[i]->idle_out();
}
}
/*
* This function will automatically reboot the mud every REBOOT_TIME seconds
* Only calls a shutdown if we have been up long enough, and no shutdown
* is already running
*/
void auto_reboot() {
int time;
time = uptime();
if( (memory_info() > REBOOT_MEMORY) ) {
if (!SHUTTING && !find_object("/obj/shut")) {
"/obj/shut"->shut(10);
SHUTTING = 1;
shout("Armageddon crawls out from behind the bar of the "
"Ladyluck tavern, and seeing that the place is out of beer "
"he shouts: Prepare to enter primal chaos in 10!!.\n");
log_file("GAME_LOG", "Auto reboot at "+ctime(time())+"\n"
" (uptime: "+(time/3600)+" hours memory usage: "+
memory_info()+")\n\n");
// This is a hack... I am not sure where the problem is...
find_object("/obj/shut")->set_heart_beat(1);
}
}
}
void net_dead_purge() {
netdeads()->do_force_on_me("quit");
} /* net_dead_purge() */
int query_player_object(object pob) {
return (file_name(pob)[0..7] == "/global/" && clonep(pob));
} /* query_player_object() */
object *netdeads()
{
object *l, *nd;
int i;
l = ({ });
nd = ({ });
/*
livs = livings();
l = filter_array(livs,"query_player_object",this_object());
*/
l = children("/global/player");
for (i=0;i<sizeof(l);i++)
if (member_array(l[i],users()) == -1)
nd += ({ l[i] });
return nd;
} /* netdeads */
void dest_me() {
remove_call_out("do_checks");
::dest_me();
}
int clean_up()
{
return 1;
}
void do_stat_users()
{
object *foos;
int i, mortals, immortals;
if (time() < last_time + STAT_TIME)
return;
last_time = time();
foos = users();
for(i=0;i<sizeof(foos);i++)
{
if ((int)foos[i]->query_creator() == 1)
immortals++;
else
mortals++;
}
log_file("STAT", ctime(time())+": " + immortals + "," + mortals + "\n");
return;
}