/* Adminlist Module
* Diplays all immortal members who belong to councils
* Last Modified: Feb. 24, 1999
* Mystaric
*/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#ifndef WIN32
#include <dirent.h>
#else
#define strcasecmp strcmp
#endif
#include "mud.h"
void sort_adminlist( void );
#define ADMINLIST_FILE SYSTEM_DIR "ADMINLIST"
typedef struct adminent ADMINENT;
struct adminent
{
ADMINENT * next;
ADMINENT * last;
char * name;
char * council;
sh_int level;
};
ADMINENT * first_admin;
ADMINENT * last_admin;
void toadminfile( const char *line, FILE *wfp )
{
int filler, xx;
char outline[MAX_STRING_LENGTH];
outline[0] = '\0';
if ( line && line[0] != '\0' )
{
filler = ( 78-strlen( line ) );
if ( filler < 1 )
filler = 1;
filler /= 2;
for ( xx = 0; xx < filler; xx++ )
strcat( outline, " " );
strcat( outline, line );
}
strcat( outline, "\n\r" );
fputs( outline, wfp );
}
void add_to_adminlist( char *name, int level )
{
ADMINENT *admin;
#ifdef DEBUG
log_string( "Adding to adminlist..." );
#endif
CREATE( admin, ADMINENT, 1 );
admin->name = str_dup( name );
admin->level = level;
admin->council = "none";
if ( !first_admin )
{
admin->last = NULL;
admin->next = NULL;
first_admin = admin;
last_admin = admin;
return;
}
admin->last = last_admin;
admin->next = NULL;
last_admin->next = admin;
last_admin = admin;
return;
}
void remove_tilde( char *str )
{
for ( ; *str != '\0'; str++ )
if ( *str == '~' )
*str = '\0';
return;
}
void make_adminlist()
{
DIR *dp;
struct dirent *dentry;
char *word;
FILE *gfp, *wfp;
int ilevel;
COUNCIL_DATA *council;
ADMINENT *admin, *adminnext;
char buf[MAX_STRING_LENGTH];
char arg[MAX_STRING_LENGTH];
char *arg2 = NULL;
first_admin = NULL;
last_admin = NULL;
if ( (dp = opendir( GOD_DIR )) == NULL )
{
bug("Error opening the god directory", 0 );
return;
}
ilevel = 0;
dentry = readdir( dp );
while( dentry )
{
if ( dentry->d_name[0] != '.' )
{
sprintf (buf, "%s%s", GOD_DIR, dentry->d_name);
gfp = fopen (buf, "r" );
if (gfp)
{
word = feof( gfp ) ? "End" : fread_word( gfp );
ilevel = fread_number( gfp );
fread_to_eol( gfp );
word = feof( gfp ) ? "End" : fread_word( gfp );
add_to_adminlist( dentry->d_name, ilevel );
fclose(gfp);
}
}
dentry = readdir( dp );
}
closedir( dp );
unlink( ADMINLIST_FILE );
if ( (wfp = fopen( ADMINLIST_FILE, "a" )) == NULL )
{
bug("Error opening the Adminlist file", 0 );
return;
}
sprintf(buf, "%s Administrative Council List", sysdata.mud_name);
toadminfile(buf, wfp);
toadminfile(" ", wfp);
for ( admin = first_admin; admin; admin = admin->next )
{
sprintf (buf, "%s%c/%s", PLAYER_DIR, tolower(admin->name[0]), admin->name);
gfp = fopen (buf, "r" );
if (gfp)
{
arg2 = NULL;
do
{
fgets( buf, MAX_STRING_LENGTH, gfp);
arg2 = one_argument(buf, arg);
}while ( str_cmp(arg,"Council") && !feof(gfp));
}
if (!str_cmp(arg, "Council") )
{
remove_tilde(arg2);
admin->council = str_dup (arg2);
}
fclose( gfp );
}
sort_adminlist();
for (council = first_council; council; council = council->next)
{
sprintf( buf, "%s", council->name);
sprintf( arg, "%c", ' ' );
toadminfile(buf, wfp);
for ( admin = first_admin; admin; admin = admin->next )
{
if(!str_cmp(admin->council, council->name) )
{
if ( !str_cmp( admin->name, council->head) || ( council->head2 &&
!str_cmp( admin->name, council->head2) ) )
sprintf(buf, "*%s* ", admin->name);
else
sprintf(buf, "%s ", admin->name);
if ((strlen (arg) + strlen (buf)) > 76 )
{
toadminfile(arg, wfp);
sprintf( arg, "%c", ' ');
}
strcat(arg, buf);
}
}
toadminfile (arg, wfp);
toadminfile (" ", wfp);
}
for ( admin = first_admin; admin; admin = adminnext )
{
adminnext = admin->next;
DISPOSE(admin->name);
DISPOSE(admin);
}
fclose( wfp );
return;
}
void do_makeadminlist( CHAR_DATA *ch, char *argument )
{
make_adminlist();
}
void sort_adminlist( )
{
ADMINENT *admin, *tmp, *next;
COUNCIL_DATA *council;
bool run = TRUE, head = FALSE, thead = FALSE;
while ( run )
{
run = FALSE;
for ( admin = first_admin; admin; admin = admin->next )
{
tmp = admin->next;
if ( tmp )
{
if ( strcmp( admin->name, tmp->name)>0)
{
if ( tmp->next )
tmp->next->last = admin;
if ( admin->last )
admin->last->next = tmp;
next = tmp->next;
tmp->next = admin;
tmp->last = admin->last;
admin->next = next;
admin->last = tmp;
if ( last_admin == tmp )
last_admin = admin;
if ( first_admin == admin )
first_admin = tmp;
run = TRUE;
}
}
}
}
run = TRUE;
while ( run )
{
run = FALSE;
for ( admin = first_admin; admin; admin = admin->next )
{
tmp = admin->next;
if ( tmp )
{
if ( tmp->level > admin->level )
{
if ( tmp->next )
tmp->next->last = admin;
if ( admin->last )
admin->last->next = tmp;
next = tmp->next;
tmp->next = admin;
tmp->last = admin->last;
admin->next = next;
admin->last = tmp;
if ( last_admin == tmp )
last_admin = admin;
if ( first_admin == admin )
first_admin = tmp;
run = TRUE;
}
}
}
}
run = TRUE;
while ( run )
{
run = FALSE;
for ( admin = first_admin; admin; admin = admin->next )
{
head = FALSE;
thead = FALSE;
tmp = admin->next;
if ( tmp )
{
for ( council = first_council; council; council = council->next )
{
if ( !str_cmp( council->head, admin->name) || ( council->head2 &&
!str_cmp( council->head2, admin->name) ) )
head = TRUE;
if ( !str_cmp( council->head, tmp->name) || ( council->head2 &&
!str_cmp( council->head2, tmp->name) ) )
thead = TRUE;
}
if ( thead && !head )
{
if ( tmp->next )
tmp->next->last = admin;
if ( admin->last )
admin->last->next = tmp;
next = tmp->next;
tmp->next = admin;
tmp->last = admin->last;
admin->next = next;
admin->last = tmp;
if ( last_admin == tmp )
last_admin = admin;
if ( first_admin == admin )
first_admin = tmp;
run = TRUE;
}
}
}
}
return;
}
void do_adminlist( CHAR_DATA *ch, char *argument )
{
set_pager_color( AT_IMMORT, ch );
show_file( ch, ADMINLIST_FILE );
}