tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
#include "ctype.h"
#include "stdio.h"
#include "stdlib.h"
#include "sys/types.h"
#include "syslog.h"
#include "define.h"
#include "struct.h"


bool  view_file    ( char_data*, char* );
void  add_log      ( const char*, const char*, char_data*, const char* );


/*
 *   SUPPORT FUNCTIONS
 */


void add_log( const char* function, const char* file, char_data* ch,
  const char* string )
{
  char      tmp  [ MAX_INPUT_LENGTH+20 ];
  FILE*      fp;

  if( ( fp = fopen( file, "a" ) ) == NULL ) {
    bug( "%s: Could not open file.", function );
    return;
    }

  sprintf( tmp, "[%s] %s", ltime( current_time )+4, string );

  tmp[15] = toupper( tmp[15] );

  if( strlen( tmp ) > 60 ) {
    sprintf( tmp+60, "...  %s\n\r", ch->real_name( ) );
    fprintf( fp, tmp );
    }
  else
    fprintf( fp, "%-65s%s\n\r", tmp, ch->real_name( ) );
   
  fclose( fp );

  return;
}


bool view_file( char_data* ch, char* file )
{ 
  FILE*      fp;
  char      tmp  [ MAX_INPUT_LENGTH ];
  int    length;

  if( ( fp = fopen( file, "r" ) ) == NULL ) 
    return FALSE;

  for( length = 0; ; ) {
    tmp[ length ] = getc( fp );
    if( tmp[ length++ ] == EOF ) {
      tmp[ length ] = '\0';
      page( ch, tmp );
      page( ch, "\n\r" );
      break;
      }    
    if( length == MAX_INPUT_LENGTH-1 ) {
      tmp[ MAX_INPUT_LENGTH-1 ] = '\0'; 
      page( ch, tmp );
      length = 0;
      }
    }

  fclose( fp );

  return TRUE;
}


/*
 *   MOB LOG ROUTINES
 */


void mob_log(  char_data* ch, int i, const char* string )
{
  char  file  [ ONE_LINE ];

  if( string != empty_string ) {
    sprintf( file, "%smob.%d", MOB_LOG_DIR, i );
    add_log( "Mob_Log", file, ch, string );
    }

  return;
}


void do_mlog( char_data* ch, char* argument )
{
  char               tmp  [ ONE_LINE ];
  pfile_data*      pfile;
  char_data*      victim  = NULL;
  species_data*  species;

  if( is_number( argument ) ) { 
    if( ( species = get_species( atoi( argument ) ) ) == NULL ) {
      send( ch, "There is no mob with that vnum.\n\r" );
      return;
      }
    }
  else {
    if( ( pfile = find_pfile_exact( argument ) ) == NULL ) {
      if( ( victim = one_character( ch, argument, "mlog",
        (thing_array*) &player_list, (thing_array*) &mob_list ) ) == NULL ) 
        return;
      if( victim->pcdata != NULL )
        pfile = victim->pcdata->pfile;
      }
    if( pfile != NULL ) {
      sprintf( tmp, "%s%s", PLAYER_LOG_DIR, pfile->name );
      if( !view_file( ch, tmp ) )
        send( ch, "%s has no log.\n\r", pfile->name );
      return;
      }
    species = victim->species;
    } 

  sprintf( tmp, "%smob.%d", MOB_LOG_DIR, species->vnum );
  if( !view_file( ch, tmp ) )
    send( ch, "%s has no log.\n\r", species->Name( ) );
 
  return;
}


/*
 *   OBJECT LOG FILES
 */


void obj_log( char_data* ch, int i, const char* string )
{
  char   file  [ ONE_LINE ];

  if( string != empty_string ) {
    sprintf( file, "%sobj.%d", OBJ_LOG_DIR, i );
    add_log( "Obj_Log", file, ch, string );
    }

  return;
}


void do_olog( char_data* ch, char* argument )
{
  char*                tmp  = static_string( );
  wizard_data*      wizard  = (wizard_data*) ch;
  obj_clss_data*  obj_clss;
  int                    i;

  if( *argument == '\0' ) {
    if( ( obj_clss = wizard->obj_edit ) == NULL ) {
      send( ch,
        "You are not editting an object so must specify a vnum.\n\r" );
      return;
      }
    i = obj_clss->vnum;
    }
  else {
    if( get_obj_index( i = atoi( argument ) ) == NULL ) {
      send( ch, "There is no object with that vnum.\n\r" );
      return;
      }
    }

  sprintf( tmp, "%sobj.%d", OBJ_LOG_DIR, i );
  if( !view_file( ch, tmp ) )
    send( ch, "That object has no log.\n\r" );
 
  return;
}


/*
 *   ROOM LOG FUNCTIONS
 */


void room_log(  char_data* ch, int i, const char* string )
{
  char file  [ ONE_LINE ];

  if( string != empty_string ) {
    sprintf( file, "%sroom.%d", ROOM_LOG_DIR, i );
    add_log( "Room_Log", file, ch, string );
    }

  return;
}


void do_rlog( char_data* ch, char* )
{
  char tmp [ ONE_LINE ];

  sprintf( tmp, "%sroom.%d", ROOM_LOG_DIR, ch->in_room->vnum );

  if( !view_file( ch, tmp ) )
    send( "There is no log for this room.\n\r", ch );
 
  return;
}


/*
 *   PLAYER LOG FILES
 */


void player_log( char_data* ch, const char* string )
{
  char    file  [ ONE_LINE ];
  FILE*     fp;

  if( ch->pcdata == NULL
    || string == empty_string )
    return;

  sprintf( file, "%s%s", PLAYER_LOG_DIR, ch->real_name( ) );

  if( ( fp = open_file( file, "a" ) ) == NULL )
    return;

  fprintf( fp, "[%s] %s\n\r", ltime( current_time )+4, string );
  fclose( fp );

  return;
}


/*
 *   GENERAL LOG FILES
 */


void immortal_log( char_data* ch, char* cmd, char* arg )
{
  char    file  [ ONE_LINE ];
  FILE*     fp;
  
  sprintf( file, "%s%s", IMMORTAL_LOG_DIR, ch->real_name( ) );

  if( ( fp = fopen( file, "a" ) ) != NULL ) {
    fprintf( fp, "[%s] %s %s\n",
      ltime( current_time )+4, cmd, arg );
    fclose( fp );
    }

  return;
}