foundation2_fluffos_v1/
foundation2_fluffos_v1/bin/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/ChangeLog.old/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/Win32/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/simuls/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/clone/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/command/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/data/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/etc/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/master/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/log/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/compiler/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/efuns/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/operators/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/u/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/tmp/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/windows/
foundation2_fluffos_v1/lib/cfg/
foundation2_fluffos_v1/lib/cmds/adm/
foundation2_fluffos_v1/lib/daemon/save/
foundation2_fluffos_v1/lib/daemon/services/
foundation2_fluffos_v1/lib/daemon/soul/
foundation2_fluffos_v1/lib/doc/build/
foundation2_fluffos_v1/lib/doc/classes/
foundation2_fluffos_v1/lib/doc/driver/
foundation2_fluffos_v1/lib/doc/driver/applies/
foundation2_fluffos_v1/lib/doc/driver/applies/interactive/
foundation2_fluffos_v1/lib/doc/driver/concepts/
foundation2_fluffos_v1/lib/doc/driver/driver/
foundation2_fluffos_v1/lib/doc/driver/efuns/arrays/
foundation2_fluffos_v1/lib/doc/driver/efuns/buffers/
foundation2_fluffos_v1/lib/doc/driver/efuns/calls/
foundation2_fluffos_v1/lib/doc/driver/efuns/compile/
foundation2_fluffos_v1/lib/doc/driver/efuns/filesystem/
foundation2_fluffos_v1/lib/doc/driver/efuns/floats/
foundation2_fluffos_v1/lib/doc/driver/efuns/functions/
foundation2_fluffos_v1/lib/doc/driver/efuns/general/
foundation2_fluffos_v1/lib/doc/driver/efuns/mappings/
foundation2_fluffos_v1/lib/doc/driver/efuns/numbers/
foundation2_fluffos_v1/lib/doc/driver/efuns/parsing/
foundation2_fluffos_v1/lib/doc/driver/lpc/constructs/
foundation2_fluffos_v1/lib/doc/driver/lpc/types/
foundation2_fluffos_v1/lib/doc/driver/platforms/
foundation2_fluffos_v1/lib/doc/efun/
foundation2_fluffos_v1/lib/doc/etc/
foundation2_fluffos_v1/lib/doc/faq/
foundation2_fluffos_v1/lib/doc/help/creator/
foundation2_fluffos_v1/lib/doc/help/player/
foundation2_fluffos_v1/lib/doc/lpc/basic/
foundation2_fluffos_v1/lib/doc/lpc/data_types/
foundation2_fluffos_v1/lib/doc/lpc/etc/
foundation2_fluffos_v1/lib/doc/lpc/intermediate/
foundation2_fluffos_v1/lib/doc/lpc/types/
foundation2_fluffos_v1/lib/doc/mudlib/
foundation2_fluffos_v1/lib/doc/mudlib/Features/
foundation2_fluffos_v1/lib/domains/Examples/armour/
foundation2_fluffos_v1/lib/domains/Examples/etc/
foundation2_fluffos_v1/lib/domains/Examples/npc/
foundation2_fluffos_v1/lib/domains/Examples/room/
foundation2_fluffos_v1/lib/domains/Examples/virtual/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaA/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaB/
foundation2_fluffos_v1/lib/domains/Examples/weapon/
foundation2_fluffos_v1/lib/domains/School/doc/
foundation2_fluffos_v1/lib/domains/School/room/
foundation2_fluffos_v1/lib/domains/School/room/Classes/
foundation2_fluffos_v1/lib/domains/School/room/Offices/
foundation2_fluffos_v1/lib/domains/Standard/
foundation2_fluffos_v1/lib/domains/Standard/pools/
foundation2_fluffos_v1/lib/domains/Standard/std/
foundation2_fluffos_v1/lib/domains/Standard/xtra/
foundation2_fluffos_v1/lib/include/
foundation2_fluffos_v1/lib/lib/obj/
foundation2_fluffos_v1/lib/news/
foundation2_fluffos_v1/lib/save/
foundation2_fluffos_v1/lib/secure/cfg/
foundation2_fluffos_v1/lib/secure/cmds/player/
foundation2_fluffos_v1/lib/secure/lib/
foundation2_fluffos_v1/old/
foundation2_fluffos_v1/win32/
/*    /secure/daemon/finger.c
 *    from the Foundation II LPC Library
 *    gives finger information about users
 *    created by Descartes of Borg 950402
 */

#include <lib.h>
#include <daemons.h>
#include "finger.h"

inherit LIB_DAEMON;

private int LoginTime, Level;
private string CurrentUser, Short, CapName, RealName, Email;
private string *Titles;

static void create() {
    daemon::create();
    SetNoClean(1);
}

varargs string GetFinger(string who) {
    mapping mail_stat;
    object ob;
    string ret;

    if( !who ) {
	object *people;
	string *lines;
	int i, maxi;

	ret = center(mud_name(), 80) + "\n\n";
	maxi = sizeof(people = filter(users(), (: !((int)$1->GetInvis()) :)));
	lines = map(people, (: sprintf("%:-21s %:-11s", (string)$1->GetName(),
		     (string)$1->GetClass() || "No class!") :));
	ret += implode(lines, "\n");
	return ret;
    }
    if( who != CurrentUser ) {
	if( !user_exists(who) ) 
	  return capitalize(who) + " has never visited " + mud_name() + ".";
	else if( !unguarded( (: restore_object, DIR_PLAYERS "/" + who[0..0] +
			      "/" + who :)) &&
		!unguarded( (: restore_object, DIR_CRES "/" + who[0..0] +
			     "/" + who :) ) ) return 0;
	CurrentUser = who;
    }
    ret = replace_string(GetTitle(), "$N", CapName) + "\n";
    ret += sprintf("In real life: %:-30s Email: %s\n", RealName , 
		   (this_player(1) && archp(this_player(1))) ? Email : 
		    "Unlisted");
    if( ob = find_player(who) ) 
      ret += "On since " + ctime(LoginTime) + "\n";
    else ret += "Last on " + ctime(LoginTime) + "\n";
    mail_stat = (mapping)FOLDERS_D->mail_status(who);  
    if( mail_stat["unread"] ) 
      ret += CapName + " has " + consolidate(mail_stat["unread"], 
					     "an unread letter") + ".\n";
    if( unguarded( (: file_size, user_path(who) + ".project" :) ) > 0 )
      ret += "Project: " +
	unguarded( (: read_file, user_path(who) + ".project" :) ) + "\n";
    if( unguarded( (: file_size, user_path(who) + ".plan" :) ) > 0 )
      ret += "Plan:\n" +
	unguarded( (: read_file, user_path(who) + ".plan" :) ) + "\n";
    return ret;
}

mixed *GetRemoteFinger(string who) {
    mixed *tmp;
    object ob;

    who = convert_name(who);
    if( who != CurrentUser ) {
	if( !user_exists(who) ) return 0; 
	else if( !unguarded( (: restore_object, DIR_PLAYERS "/" + who[0..0] +
			      "/" + who :)) &&
		!unguarded( (: restore_object, DIR_CRES "/" + who[0..0] +
			     "/" + who :) ) ) return 0;
	CurrentUser = who;
    }
    ob = find_player(who);
    tmp = ({ CapName, GetTitle(), RealName, Email, ctime(LoginTime),
	     (ob ? query_idle(ob) : -1), 0, Level, "\n" });
    return tmp;
}

string GetTitle() {
    if( Short ) return Short;
    else if( Titles && sizeof(Titles) ) return Titles[0];
    else return CapName;
}