/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
mapping close_up, colour_map;

#define CHAR "/net/daemon/chars/"
#include "term.h"

void    create()
{
    seteuid( getuid() );
    close_up = ([ ]);
    colour_map = ([ ]);
}				/* create() */

string  fix_string( string bing );

void    read_callback( int fd, string mess )
{
    string  str, rest;
    object  ob;

    sscanf( mess, "%s\n%s", mess, rest );
    if( !rest )
	rest = "";
    rest = replace( rest, ({ "\r", "", "\n", "" }) );
    if( mess != "EVERYONE" && mess != "" )
    {
	str = (string)"/secure/finger"->finger_info( mess );
	if( rest != "NewMoon" && str )
	    str = fix_string( str );
	if( !str )
	{
	    previous_object()->write_fd( fd, "No one called " + mess + " has ever " +
					 "visited " + MUD_NAME + ".\n" );
	}
	else
	{
	    previous_object()->write_fd( fd, str );
	}
	previous_object()->close_fd( fd );	/* Close once flushed */
	if( find_player( mess ) )
	{
	    ob = clone_object( CHAR + "in_finger_demon" );
	    ob->setup_finger( mess );
	}
    }
    else
    {
/*
 * Ok... In here we need to get the long finger list.
 * Which list shall we use?
 * Who list seems appropriate to me.
 */
	str = (string)"/global/player"->who_string( 75 );
	if( rest != "NewMoon" && str )
	    str = fix_string( str );
	if( !str )
	{
	    previous_object()->write_fd( fd, "Some sort of fun internal error " +
					 "occured.  You are happy.\n" );
	}
	else
	{
	    previous_object()->write_fd( fd, str );
	}
	previous_object()->close_fd( fd );
    }
}				/* read_callback() */

string  fix_string( string ret )
{
    string *st;
    int     i, off, oct;

    if( !stringp( ret ) || ret == "" )
	return ret;
    if( !colour_map )
    {
	colour_map = TERM_HANDLER->set_term_type( "dumb" );
	colour_map[ "RESET" ] = "";
    }
    st = explode( ret, "%^" );
    ret = "";
    for( i = 0; i < sizeof( st ); i++ )
	if( stringp( colour_map[ st[ i ] ] ) )
	    ret += colour_map[ st[ i ] ];
	else
	    ret += st[ i ];
    return ret;
}				/* fix_string() */