[go: up one dir, main page]

Menu

[897c37]: / mlib / RO / logger.lpc  Maximize  Restore  History

Download this file

152 lines (129 with data), 2.6 kB

/*
 * Logger - called by "log_file" and "smart_log" from within the 
 * game driver.
 *
 * Critical to mudlib.
 *
 * + shouldn't write directly; should buffer etc.
 */

/*
 * 951017 Hunter 	log() now adds a "\n" if there isn't one
 * 951017 Hunter	added hooks to log file calls
 * 960328 Gandalf	removed hooks; insecure (this is a level 500 object)
 */

inherit "RO/Servers";

#define TIME DATE->packed()

/* #define WRITE_THROUGH */
array files = ({ });
array what = ({ });

reset()
{
    call_out("trust_request", 1);
}

trust_request()
{
	"secure/master"->trust_logger();
}

show_stats(all)
{
array ret;
    ret = ({ "Currently being logged."});
    ret += explode(DUMP->dump(files, 0, 0, -1), "\n");
    if (all)
        ret += explode(DUMP->dump(what, 0, 0, -1), "\n");
    return ret;
}

log_now(string filen, string newstring)
{
	string ns = fix_log_string(newstring);
	log(filen, ns);
	save_me();
	return 1;
}

log(string filen, string newstring)
{
    int i;
    string ns;

	ns = fix_log_string(newstring);
	i = index(files, filen, 0, 1);
	if (i == -1) {
		i = sizeof(files);
		// creator(this_object());
		files = files + ({ filen });
		what = what + ({ ({}) });
	}
	what[i] = what[i] + ({ make_date() + " "+ ns });
#ifdef WRITE_THROUGH
	save_me();
#else
	AUTOSAVE_SERV->set_auto_save(this_object());
#endif
	return 1;
} 

/* should return a compressed date/time sig */ 
string make_date()
{
	return TIME;
}

/*
 * Smart log writes immediately (although some buffering would be nice)..
 */
smartlog(string error)
{
    array allargs, fileargs;
    string who;
    object on;

#if 0
    allargs = STRINGS->split_first(error, " ");
    if (!allargs || sizeof(allargs) < 1) 
    {
	    log("errors", error);
        return;
    }
#endif

    fileargs = explode(error, "/"); 
	if (fileargs && (sizeof(fileargs) > 1) && (fileargs[0] == "players")) 
    {
		who = fileargs[1];
		on = find_player(who);
	}
    else
    {
        who = "errors";
    }

	if (on) 
    {
		tell_object(on, error + "\n");
	}

	log(who, error);
}

/*
 *	write out all the stuff we've been building up..
 */
save_me()
{
    int i;

	for (i = 0; i < sizeof(files); i++) 
	{
		catch write_file("log/"+files[i], implode(what[i], ""));;
	}
	what = ({ });
	files = ({ });
}

string
fix_log_string(string str)
{
/* add a "\n" if there isn't one. */
    int sl = sizeof(str);

    if (str[sl-1..sl-1] != "\n")
    {
	    return str + "\n";
    }
    return str;
}


query_destruct()
{
	save_me();
	write("Destructing the logger is a bad idea!\n");
	return 1;	/* can't allow destruct by lower levels, now we have object renaming */
}