/* Do not remove the headers from this file! see /USAGE for more info. */
/*
** last.c -- show last login information
**
** 960528, Deathblade: created.
*/
//:COMMAND
//USAGE: last [-s] [-n count] [-d days] [-D days] [user1 user2 ...]
//
// -s : be "silent" -- trim headers, displaying just the data
// -n count : only display this many users (the most recent)
// -d days : display users logged in WITHIN this many days
// -D days : display users logged in OLDER than this many days
//
// user... : display login information for these users
//
//Note that the options can be combined, but you'll get an error if you
//use -d and -D to, say, ask for all users logged in during the past 30
//days and those logged in before 60 days ago.
//
//For each user found, their name is displayed followed by when they
//logged in (if they are still on) or when they logged out, followed by
//where they connected from.
inherit CMD;
#define SECS_PER_DAY (24 * 60 * 60)
private void main(mixed *arg, mapping flags)
{
int minimum;
int maximum;
int count;
mixed * times;
int i;
if ( sizeof(arg[0]) )
{
foreach ( string user in arg[0] )
{
mixed * last;
user = lower_case(user);
last = LAST_LOGIN_D->query_last(user);
if ( !last )
outf("No information for: %s\n", user);
else
{
int is_on = find_user(user) != 0;
outf(is_on ? "%s logged on at %s from %s\n" :
"%s logged out at %s from %s\n",
user, ctime(last[0]), last[1]);
}
}
return;
}
minimum = 0;
maximum = time();
count = to_int(flags["n"]);
if ( flags["d"] )
minimum = time() - (to_int(flags["d"]) * SECS_PER_DAY);
if ( flags["D"] )
maximum = time() - (to_int(flags["D"]) * SECS_PER_DAY);
if ( minimum >= maximum )
{
outf("ERROR: invalid range.\n");
return;
}
times = filter(LAST_LOGIN_D->query_times(),
(: $1[0] >= $(minimum) && $1[0] <= $(maximum) :));
if ( !flags["s"] )
outf("%d users. %s to %s.\n%s\n",
sizeof(times), ctime(minimum), ctime(maximum),
repeat_string("-", 75));
if ( !flags["s"] && count && sizeof(times) > count )
outf("... skipping %d users.\n", sizeof(times) - count);
i = count && (sizeof(times) - count);
if ( i < 0 )
i = 0;
for ( ; i < sizeof(times); ++i )
{
int is_on = find_user(times[i][1]) != 0;
outf(is_on ? "%s logged on at %s from %s\n" :
"%s logged out at %s from %s\n",
times[i][1], ctime(times[i][0]), times[i][2]);
}
}