/* -*- LPC -*- */
/*
* $Locker: $
* $Id: last.c,v 1.15 2003/03/21 01:53:51 ceres Exp $
*
*/
/* last command, trial out by Turrican for a commands daemon. */
#include <player_handler.h>
inherit "/cmds/base";
#define BASENAME "/d/admin/log/ENTER"
string process_file(string fname, string str);
string get_details(string str, string file);
string mtime(string t);
string stime(string t);
nosave int logged_on;
nosave string time;
mixed cmd(string str) {
string retval;
int i;
write("This command is no longer available.\n");
return 1;
if (!str || str == "") {
notify_fail("Usage: last <name>\n");
return 0;
}
if(!this_player()->query_creator() &&
PLAYER_HANDLER->test_creator(str)) {
return notify_fail("Sorry, you can't do that, "+ str + " is a "
"creator.\n");
}
if("/secure/master"->query_lord(str) &&
!"/secure/master"->query_lord(this_player()->query_name())) {
return notify_fail("Sorry, you can't do that, "+ str +" is a "
"lord\n");
}
logged_on = 0;
retval = "";
time = "";
str = (string)this_player()->expand_nickname(str);
retval = process_file(BASENAME + ".log", str);
// check old logs _if_ we haven't found them
// if(retval == "")
//retval += process_file(BASENAME+".1", str);
if(logged_on == 1) {
if (!find_player(str)) {
retval += sprintf("%15-s %s - Destd (??:??)\n", str, mtime(time));
} else {
retval += sprintf("%15-s %s - Not logged off\n", str, mtime(time));
}
}
if(retval == "") {
if(PLAYER_HANDLER->test_user(str)) {
i = (int)PLAYER_HANDLER->test_last(str);
if(i) {
write(sprintf("%15-s %s\n", str, ctime(i)));
return 1;
}
}
write("No such user " + str + "\n");
} else {
write(retval);
}
return 1;
}
string process_file(string fname, string str) {
int size, bits, length, i;
string retval, file;
retval = "";
seteuid("Root");
// if the file is more than 50k then break it up and read it bit by bit.
size = file_size(fname);
if(size > 50000) {
length = file_length(fname);
bits = size / 50000;
} else {
bits = 1;
}
if(bits > 10) {
i = bits - 10;
} else {
i = 0;
}
for(; i< bits; i++) {
file = unguarded((: read_file, fname,
i * (length/bits), length / bits :) );
if (!file) {
write("Log file non existant, or bad things are happening. "
"(Bad vibes man!)\n");
return "";
}
retval += get_details(str, file);
}
seteuid("Room");
return retval;
}
string get_details(string str, string file) {
string *sarr;
string retval;
string t2;
string type;
string time_str;
int i;
retval = "";
sarr = explode(file, "\n");
for (i = 0; i < sizeof(sarr); i++) {
//if (sscanf(sarr[i], "%s [%s] %*s" + str + " ", time_str, type) == 3) {
if (sscanf(sarr[i], "%s [%s] " + str + " ", time_str, type) == 2 ||
sscanf(sarr[i], "%s [%s] " + str + " ", time_str, type) == 2) {
switch(type) {
case "Enter":
time = time_str;
logged_on = 1;
break;
case "Recon":
time = time_str;
logged_on = 1;
break;
case "Su":
t2 = time_str;
logged_on = 0;
retval += sprintf("%15-s %s - %s [Quit]\n", str, mtime(time),
stime(t2));
break;
case "NDead":
t2 = time_str;
logged_on = 1;
retval += sprintf("%15-s %s - %s [NetDead]\n", str, mtime(time),
stime(t2));
time = "";
break;
case "Exit":
t2 = time_str;
logged_on = 0;
retval += sprintf("%15-s %s - %s [Quit]\n", str, mtime(time),
stime(t2));
break;
default:
write("Someone has stuffed up... please file a bug report\n");
break;
}
}
}
return retval;
}
string mtime(string t) {
if(t == "")
return "??? ?? ??:??";
return t[0..<4];
}
string stime(string t) {
if(t == "")
return "??:??";
return t[7..11];
}