/
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/
#define TEMP_MAIL_LIST "/w/" + this_player()->query_name() + "/TEMP_MAIL_LIST"
#define TEMP_ERRORS "/log/TEMPORARY_ERRORS"
#include "log.h";
inherit "/std/smart_log";

int     bug_num, bugs;
string  error, file;
string  temp_body;

void    logging_commands()
{
    add_action( "log_bug", "bug" );
    add_action( "log_typo", "typo" );
    add_action( "log_idea", "idea" );
    add_action( "log_soul", "soul" );
    add_action( "test", "test" );
    if( this_player()->query_creator() )
	add_action( "errors", "errors" );
}

int     log_typo( string str )
{
    if( !str || "" == str )
    {
	notify_fail( "Usage : typo <text>\n" );
	return 0;
    }
    smart_log( "TYPO", this_player()->query_name() + "\n" + str + "\n",
	       file_name( environment() ) );
    write( "Ok.\n" );
    return 1;
}

void    bug_command( string str )
{
    int     i;
    string  trash;
    mixed  *junk, *coms;

    if( !str || str == "" )
	return;

    coms = ({ });
    junk = actions_defined( 0, 0, 12 );
    for( i = 0; i < sizeof( junk ); i += 2 )
	if( junk[ i ] == str )
	    coms += ({ junk[ i ], junk[ i + 1 ][ 0 ], junk[ i + 1 ][ 1 ] });
    if( !sizeof( coms ) )
    {
	write( "Command " + str + " not found.\n" );
	return;
    }
    if( sizeof( coms ) > 3 )
    {
	write( "More than one commands with the name " + str +
	       " found.  Please be more specific.\n" );
	return;
    }
    file = function_exists( (string)coms[ 2 ], ( object ) coms[ 1 ] );

    sscanf( file, "%s#%s", file, trash );
    error = "COMMAND " + str;
    this_player()->do_edit( 0, "end_of_edit" );
}

void    bug_spell( string str )
{
    int     i;
    mapping junk;

    junk = this_player()->query_spells();
    if( undefinedp( junk[ str ] ) )
    {
	write( "Spell " + str + " not found.\n" );
	return;
    }
    file = junk[ str ][ 0 ];
    error = "SPELL " + str;
    this_player()->do_edit( 0, "end_of_edit" );
}

void    bug_object( string str )
{
    string  trash;
    object *obj;

    if( !str || str == "" )
	return;
    obj = find_match( str, this_object() );
    if( sizeof( obj ) == 0 )
	obj = find_match( str, environment( this_object() ) );
    if( !sizeof( obj ) )
    {
	write( "Object " + str + " not found.\n" );
	return;
    }
    if( sizeof( obj ) > 1 )
    {
	write( "More than one objects can be identified with the name " + str + "\n" );
	return;
    }
    file = file_name( obj[ 0 ] );
    sscanf( file, "%s#%s", file, trash );
    error = "OBJECT BUG";
    this_player()->do_edit( 0, "end_of_edit" );
}

int     log_bug( string str )
{
    string  arg;

    if( !str || str == "" )
	str = "room";
    sscanf( str, "%s %s", str, arg );
    notify_fail( "Usage : bug [command/spell/object/room] [name]\n" );
    if( str != "command" && str != "spell" && str != "object" && str != "room" )
	return 0;

    switch( str )
    {
	case "command":
	    bug_command( arg );
	    break;
	case "spell":
	    bug_spell( arg );
	    break;
	case "object":
	    bug_object( arg );
	    break;
	case "room":
	    file = file_name( environment() );
	    error = "ROOM BUG";
	    this_player()->do_edit( 0, "end_of_edit" );
	    break;
    }
    return 1;
}

void    end_of_edit( string body )
{
    if( body && body != "" )
	smart_log( error, this_player()->query_name() + "\n" + body + "\n",
		   file );
}

int     log_idea( string str )
{
    if( !str || "" == str )
    {
	notify_fail( "Usage : idea <text>\n" );
	return 0;
    }
    smart_log( "IDEA", this_player()->query_name() + "\n" + str + "\n",
	       file_name( environment() ) );
    write( "Ok.\n" );
    return 1;
}

int     log_soul( string str )
{
    if( !str || str == "" )
    {
	notify_fail( "Usage : soul <text>\n" );
	return 0;
    }
    if( str == "on" || str == "off" )
    {
        write( "\"soul\" is the command to report suggestions/errors" +
               " with soul commands.\n" +
               "If you wish to turn your soul off or on, use the " +
               "\"nosoul\" command.\n" );
        return 1;
    }
    str = sprintf( "%s: %s\n", this_player()->query_cap_name(), str );
    str = sprintf( "%-=79s", str );
    log_file( "soulcommands", str );
    write( "Ok, your suggestion has been logged!  Thank you.\n" );
    return 1;
}

void    print_bug( int i )
{
    int     rtime;
    string  fmt, trash, bug;
    string  title, filename;
    string  ftime, fname;
    string  time, name;

    if( bugs == 0 || i > bugs )
	return;
    fmt = "%s.START " + i + "\n%s.END " + i;
    sscanf( error, fmt, trash, bug );
    sscanf( bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime, fname,
	    time, name, bug );
    write( title + "\n" );
    write( filename + "\n" );
    if( ftime != "" )
    {
	write( "Forwarded from : " + capitalize( fname ) + "\n" );
	sscanf( ftime, "%d", rtime );
	write( "at             : " + ctime( rtime ) + "\n" );
    }
    write( "Made by        : " + capitalize( name ) + "\n" );
    sscanf( time, "%d", rtime );
    write( "at             : " + ctime( rtime ) + "\n" );
    write( bug );
}

void    request()
{
    if( bugs > 0 )
	write( "[1-" + bugs + "](" + bug_num + ")" );
    else
	write( "[No bugs]" );
    write( "Choose from EUFDNPGQX H for help. " );
    input_to( "commands" );
}

int     errors( string str )
{
    string  bug, temp;

    if( !str )
	str = this_player()->query_current_path();
    if( str[ strlen( str ) - 1..strlen( str ) ] != "/" )
	str += "/";
    str += ERROR_LOG;
    error = read_file( str );
    file = str;
    if( !error )
	write( "No error found in this dir.\n" );
    else
    {
	rm( TEMP_MAIL_LIST );
	temp = read_file( str, file_length( str ), 1 );
	sscanf( temp, ".END %d", bugs );
	bug_num = 1;
	print_bug( bug_num );
	request();
    }
    return 1;
}

delete_bug( int n )
{
    int     i;
    string  fmt, bug, trash;

    fmt = "%s.START " + n + "\n%s.END " + n + "\n%s";
    sscanf( error, fmt, error, bug, trash );
    error += trash;
    for( i = n + 1; i < bugs + 1; i++ )
    {
	fmt = "%s.START " + i + "\n%s.END " + i + "\n%s";
	sscanf( error, fmt, error, bug, trash );
	error += ".START " + (i - 1) + "\n" + bug + ".END " + (i - 1) + "\n" + trash;
    }
    bugs -= 1;
}

end_of_mail( string body )
{
    string  name, bug, rtime;

    if( body && body != "" )
    {
	sscanf( temp_body, "%s %s %s", name, rtime, bug );
	if( sscanf( body, "%s$report$%s", body, temp_body ) == 2 )
	    body += bug + temp_body;
	write_file( TEMP_MAIL_LIST, name + " " + rtime + " " + body + "END" );
    }
    print_bug( bug_num );
    request();
}

int     commands( string str )
{
    int     i;
    string  bug, ed_file, trash, fmt;

    string  title, filename;
    string  ftime, fname;
    string  rtime, name;

    if( str[ 0..0 ] == "g" )
	sscanf( str, "%s %d", str, i );
    if( str[ 0..0 ] == "e" || str[ 0..0 ] == "f" || str[ 0..0 ] == "d" )
	sscanf( str, "%s %s", str, ed_file );
    str = lower_case( str );

    switch( str )
    {
	case "e":
	    if( !ed_file )
	    {
		fmt = "%s.START " + bug_num + "\n%s.END " + bug_num;
		sscanf( error, fmt, trash, bug );
		sscanf( bug, "%s\n%s\n", trash, ed_file );
		ed_file += ".c";
	    }
	    write( "Editing " + ed_file + "\n" );
	    ed( ed_file, "request" );
	    return 1;
	case "u":
	    str = "f";
	    ed_file = "unknown";
	case "f":
	    write( "Sorry but the forward option is down to the pub at the moment " +
		   "having a pint and some peanuts.  It will be back very shortly.\n" );
	    print_bug( bug_num );
	    request();
	    return 1;



	    if( !ed_file )
		write( "You must either give the name of a creator, or a directory.\n" );
	    else
	    {
		string  cre;

		cre = this_player()->expand_nickname( ed_file );
		if( "/secure/login"->test_creator( cre ) || cre == "unknown" )
		{

		    fmt = "%s.START " + bug_num + "\n%s.END " + bug_num;
		    sscanf( error, fmt, trash, bug );
		    sscanf( bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
			    fname, rtime, name, bug );

		    if( ftime == "\n" )
		    {
			write( "No previous forwarding!\n" );
			trash = read_file( TEMP_ERRORS );
			if( sscanf( trash, "%s" + name + " " + rtime + "%s\n%s", trash, filename, fmt ) == 3 )
			{
			    write( filename + "\n" );
			    trash += fmt + name + " " + time() + filename + "\n";
			}
			"/global/error"->new_mail_list( trash );
		    }
		    else
		    {
			write( "Previous forwarding!\n" );
			trash = read_file( TEMP_ERRORS );
			if( sscanf( trash, "%s" + fname + " " + ftime + "%s\n%s", trash, filename, fmt ) == 3 )
			    trash += fmt + name + " " + time() + filename + "\n";
			"/global/error"->new_mail_list( trash );
		    }

		    bug = title + "\n" + filename + "\n" + time() + "\n" +
			this_player()->query_name() + "\n" + rtime + "\n" + name +
			"\n" + bug;
		    if( cre == "unknown" )
			trash = "/log/" + ERROR_LOG;
		    else
			trash = "/w/" + cre + "/" + ERROR_LOG;
		    i = file_length( trash );
		    if( i > 0 )
		    {
			fmt = read_file( trash, i, 1 );
			if( sscanf( fmt, ".END %d", i ) == 1 )
			    i += 1;
			else
			    i = 1;
		    }
		    else
			i = 1;
		    bug = ".START " + i + "\n" + bug + ".END " + i + "\n";
		    "/secure/master"->forward_error( trash, bug );
		    delete_bug( bug_num );
		    write( "Forwarded (hopefully :).\n" );
		}
		else
		{
		    if( file_size( ed_file ) == -2 )
		    {
			fmt = "%s.START " + bug_num + "\n%s.END " + bug_num;
			sscanf( error, fmt, trash, bug );
			sscanf( bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
				fname, rtime, name, bug );
			bug = title + "\n" + filename + "\n" + time() + "\n" +
			    this_player()->query_name() + "\n" + rtime + "\n" + name +
			    "\n" + bug;
			trash = ed_file + "/" + ERROR_LOG;
			i = file_length( trash );
			if( i > 0 )
			{
			    fmt = read_file( trash, i, 1 );
			    if( sscanf( fmt, ".END %d", i ) == 1 )
				i += 1;
			    else
				i = 1;
			}
			else
			    i = 1;
			bug = ".START " + i + "\n" + bug + ".END " + i + "\n";
			"/secure/master"->forward_error( trash, bug );
			delete_bug( bug_num );
			write( "Forwarded (hopefully :).\n" );
		    }
		    else
		    {
			write( "No.\n" );
		    }
		}
	    }
	    print_bug( bug_num );
	    request();
	    return 1;
	case "d":
	    if( ed_file == "f" || ed_file == "" || !ed_file )
	    {
		fmt = "%s.START " + bug_num + "\n%s.END " + bug_num + "\n%s";
		sscanf( error, fmt, trash, bug, trash );
		sscanf( bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
			fname, rtime, name, bug );
		bug = "The following bug has now been fixed.\n" + bug +
		    "\n" + "Thank you for reporting it.\n\n" +
		    "This was an automatic mail.\n";
		write_file( TEMP_MAIL_LIST, name + " " + rtime + " " + bug + "END" );
	    }
	    if( ed_file == "n" )
	    {
		fmt = "%s.START " + bug_num + "\n%s.END " + bug_num + "\n%s";
		sscanf( error, fmt, trash, bug, trash );
		sscanf( bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
			fname, rtime, name, bug );
		bug = "The following report by you is not a bug.\n" + bug +
		    "\n" + "Thank you for reporting it anyway though.\n" +
		    "This was an automatic mail.\n";
		write_file( TEMP_MAIL_LIST, name + " " + rtime + " " + bug + "END" );
	    }
	    if( ed_file == "r" )
	    {
		fmt = "%s.START " + bug_num + "\n%s.END " + bug_num + "\n%s";
		sscanf( error, fmt, trash, bug, trash );
		sscanf( bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
			fname, rtime, name, bug );
		temp_body = name + " " + rtime + " " + bug;
		this_player()->do_edit( 0, "end_of_mail" );
	    }
	    delete_bug( bug_num );
	    if( ed_file != "r" )
	    {
		print_bug( bug_num );
		request();
	    }
	    return 1;
	case "":
	case "+":
	case "n":
	    if( bug_num < bugs )
	    {
		bug_num += 1;
		print_bug( bug_num );
	    }
	    else
		write( "No more errors\n" );
	    request();
	    return 1;
	case "-":
	case "p":
	    if( bug_num > 1 )
	    {
		bug_num -= 1;
		print_bug( bug_num );
	    }
	    else
		write( "This is the first error.\n" );
	    request();
	    return 1;
	case "g":
	    if( i > 0 && i < bugs + 1 )
	    {
		bug_num = i;
		print_bug( bug_num );
	    }
	    else
		write( "Error number doesn't exists.\n" );
	    request();
	    return 1;
	case "q":
	    rm( TEMP_MAIL_LIST );
	    return 1;
	case "x":
	    if( rm( file ) )
	    {
		write_file( file, error );
		error = read_file( TEMP_MAIL_LIST );
		if( error )
		{
		    trash = read_file( TEMP_ERRORS );
		    while( sscanf( error, "%s %s %sEND%s", name, rtime, bug, error ) == 4 )
		    {
			if( sscanf( trash, "%s" + name + " " + rtime + "%s\n%s", trash, fname, title ) == 3 )
			{
			    trash += title;
			    "/obj/handlers/mailer"->do_mail_message( name,
								     this_player()->query_name(), "Bug report", "", bug, 0, 0 );
			    log_file( "REPLIES", this_player()->query_name() + " replied " +
				      "to " + name + "\n" );
			}
		    }
		    "/global/error"->new_mail_list( trash );
		    rm( TEMP_MAIL_LIST );
		}
		write( "Done.\n" );
	    }
	    else
		write( "Error!\n" );
	    return 1;
	case "h":
	case "?":
	    write( "E   - Edit the file to correct the error.\n" );
	    write( "E f - Edit file with name f.\n" );
	    write( "U   - Forward and delete error to unknow list.\n" );
	    write( "F n - Forward and delete error to creator or directory n.\n" );
	    write( "D   - Delete bug and mark as fixed.\n" );
	    write( "D F - same as above.\n" );
	    write( "D N - Delete bug and mark as not an error.\n" );
	    write( "D R - Delete bug and reply to sender yourself.\n" );
	    write( "      The word $report$ will be replaced by the original\n" );
	    write( "      bug report.\n" );
	    write( "N/+ - Next error.\n" );
	    write( "P/- - Previous error.\n" );
	    write( "G   - Goto to error.\n" );
	    write( "Q   - Quit.\n" );
	    write( "X   - Save and quit.\n" );
	    write( "H/? - This help file.\n" );
	    request();
	    return 1;
	default:
	    request();
	    return 1;
    }
}