/
rogue24b3/
rogue24b3/data/
/***************************************************************************\
[*]    ___    ____   ____   __   __  ____ [*]   ROGUE: ROM With Attitude  [*]
[*]   /#/ )  /#/  ) /#/  ) /#/  /#/ /#/   [*]    All rights reserved      [*]
[*]  /#/ <  /#/  / /#/ _  /#/  /#/ /#/--  [*]   Copyright(C) 2000-2001    [*]
[*] /#/   \(#(__/ (#(__/ (#(__/#/ (#(___  [*] Kenneth Conley (Mendanbar)  [*]
[*]  Expression of Digital Creativity..   [*]  scmud@mad.scientist.com    [*]
[-]---------------------------------------+-+-----------------------------[-]
[*] File: webutils.c                                                      [*]
[*] Usage: Creating html files to go in a web directory and viewed online [*]
\***************************************************************************/

/***************************************************************************
 *	Rogue 2.4 is copyright 2000-2001 Kenneth Conley                    *
 *	Rogue has been brought to you by the Rogue consortium              *
 *	    Kenneth Conley (scmud@mad.scientist.com)                       *
 *	By using this code, you have agreed to follow the terms of the     *
 *	Rogue license, in the file Rogue24/doc/rogue.license               *
 ***************************************************************************/

#include "merc.h"
#include "recycle.h"
#include "staffcmds.h"

WIZLIST_DATA 	*wiz_list;
void	gen_wiz_html	args( ( void ) );

struct {
    char *singular;
    char *plural;
} WizTitles[] = {
 {	"Coder",	"Coders"	},
 {	"Admin",	"Admin"		},
 {	"Associate",	"Associates"	},
 {	"PR/Security",	"PR/Security"	},
 {	"Web Master",	"Web Masters"	},
 {	"Sr. Builder",	"Sr. Builders"	},
 {	"Terraformer",	"Terraformers"	},
 {	"Questor",	"Questors"	},
 {	"Trainee",	"Trainees"	},
 {	"<ERROR>",	"<ERRORS>"	},
 {	"\n",		"\n"		}
};

const char *wiz_titles[][2]= {
 {	"Implementor",	"Implementors"	},
 {	"Creator",	"Creators"	},
 {	"Supreme God",	"Supreme Gods"	},
 {	"Deity",	"Deities"	},
 {	"God",		"Gods"		},
 {	"Immortal",	"Immortals"	},
 {	"Demi God",	"Demi Gods"	},
 {	"Angel",	"Angels"	},
 {	"Avatar",	"Avatars"	},
 {	"<ERROR>",	"<ERRORS>"	},
 {	"\n",		"\n"		}
};

void	change_wizlist	args( (CHAR_DATA *ch, bool add, int level, char *argument) );

void save_wizlist( void ) {
    FILE *fp;
    WIZLIST_DATA *pWiz;

    fclose(fpReserve);
    if (!(fp = fopen(WIZ_FILE, "w"))) {
	mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: Unable to open %s file.", WIZ_FILE);
	return;
    }

    fprintf(fp, "#WIZLIST\n");

    for (pWiz = wiz_list; pWiz != NULL; pWiz = pWiz->next)
	fprintf(fp, "C %s %d\n", pWiz->name, pWiz->level);

    fprintf(fp, "End\n");
    fclose(fp);
    fpReserve = fopen(NULL_FILE, "r");
    gen_wiz_html();
}

void load_wizlist( void ) {
    FILE *fp;
    char *word;
    WIZLIST_DATA *pWiz, *wiz_last = NULL;
    bool fMatch = FALSE, drop_out = FALSE;

    if (!(fp = fopen(WIZ_FILE, "r"))) {
	mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: Unable to open %s for reading.", WIZ_FILE);
	return;
    }

    fread_to_eol(fp);
    while (!drop_out) {
	word = feof(fp) ? str_dup("End") : fread_word(fp);
	fMatch = FALSE;

	switch (UPPER(word[0])) {
	    default:
	    case '*':
		fMatch = TRUE;
		fread_to_eol(fp);
		break;
	    case 'C':
		fMatch		= TRUE;
		pWiz		= new_wizlist();
		pWiz->name	= str_dup(fread_word(fp));
		pWiz->level	= fread_number(fp);
		if (wiz_list == NULL)
			wiz_list = pWiz;
		else
			wiz_last->next = pWiz;
		wiz_last = pWiz;
		break;
	    case 'E':
		if (!str_cmp(word, "End"))
			drop_out = TRUE;
		break;
	}
	if (!fMatch)	fread_to_eol(fp);
    }
    fclose(fp);
}

ACMD(do_wizlist) {
    BUFFER	*buffer;
    bool	found;
    WIZLIST_DATA *pWiz;
    int		level, amount, length;
    char	arg1[MAX_INPUT_LENGTH],
		arg2[MAX_INPUT_LENGTH],
		arg3[MAX_INPUT_LENGTH],
		buf[MAX_STRING_LENGTH];

    argument = one_argument(argument, arg1);
    argument = first_arg(argument, arg2, FALSE);
    argument = one_argument(argument, arg3);

    if (*arg1 && STF_FLAGGED(ch, STAFF_ADMIN)) {
	if (!str_prefix(arg1, "add")) {
	    if (!*arg2 || !is_number(arg3)) {
		send_to_char("Usage: wizlist add <name> <level>\n\r", ch);
		return;
	    }
	    level = atoi(arg3);
	    change_wizlist(ch, TRUE, level, arg2);
	    return;
	}
	if (!str_prefix(arg1, "delete")) {
	    if (!*arg2) {
		send_to_char("Usage: wizlist delete <name>\n\r", ch);
		return;
	    }
	    change_wizlist(ch, FALSE, 0, arg2);
	    return;
	}
	send_to_char("Usage: wizlist [add | delete] <name> <level>\n\r", ch);
	return;
    }

    if (wiz_list == NULL) {
	send_to_char("No immortals are listed at this time.\n\r", ch);
	return;
    }
    buffer = new_buf();
    add_buf(buffer, "The staff of Rogue MUD\n\r");
    add_buf(buffer, "**********************\n\r\n\r");

    for (level = MAX_LEVEL; level >= LEVEL_IMMORTAL; level--) {
	amount	= 0;
	found	= FALSE;

	for (pWiz = wiz_list; pWiz != NULL; pWiz = pWiz->next) {
	    if (pWiz->level == level) {
		amount++;
		found = TRUE;
	    }
	}

	if (!found)
	    continue;

	sprintf(buf, "%-12.12s:   ",
	wiz_titles[MAX_LEVEL-level][((amount == 1) ? 0 : 1)]);
	add_buf(buffer, buf);

	length = 1;
	for (pWiz = wiz_list; pWiz != NULL; pWiz = pWiz->next) {
	    if (pWiz->level == level) {
		if (((length % 3) == 1) && (length != 1)) {
			sprintf(buf, "%15s ", " ");
			add_buf(buffer, buf);
		}
		sprintf(buf, "%-12.12s%s", pWiz->name,
			!(length % 3) ? "\n\r" : " ");
		add_buf(buffer, buf);
		length++;
	    }
	}
	if (--length % 3)	add_buf(buffer, "\n\r");
	add_buf(buffer, "\n\r");
    }
    add_buf(buffer, "Note: If you are not on this list contact Admin.\n\r");
    page_to_char(buf_string(buffer), ch);
    free_buf(buffer);
    return;
}

void update_wizlist(CHAR_DATA *ch, int level)
{
    WIZLIST_DATA *prev = NULL, *curr;

    if (IS_NPC(ch))
	return;

    for (curr = wiz_list; curr != NULL; prev = curr, curr = curr->next) {
	if (!str_cmp(ch->name, curr->name)) {
	    if (prev == NULL)
		wiz_list = wiz_list->next;
	    else
		prev->next = curr->next;
	    free_wizlist(curr);
	}
    }

    if (level >= LEVEL_IMMORTAL) {
	curr		= new_wizlist();
	curr->name	= str_dup(ch->name);
	curr->level	= level;
	curr->next	= wiz_list;
	wiz_list	= curr;
    }
    save_wizlist();
    return;
}

void change_wizlist(CHAR_DATA *ch, bool add, int level, char *argument) {
    char arg[MAX_INPUT_LENGTH];
    WIZLIST_DATA *prev = NULL, *curr;

    argument = first_arg(argument, arg, FALSE);
    arg[0] = UPPER(arg[0]);

    if (!*arg) {
	send_to_char("Usage: wizlist [add | delete] <name> <level>\n\r", ch);
	return;
    }
    if (add && (level < LEVEL_IMMORTAL || level > MAX_LEVEL)) {
	send_to_char("Usage: wizlist add <name> <level>\n\r", ch);
	return;
    }
    if (!add) {
	bool found = FALSE;
	for (curr = wiz_list; curr != NULL; prev = curr, curr = curr->next) {
	    if (!str_cmp(arg, curr->name)) {
		found = TRUE;
		if (prev == NULL)
		    wiz_list = wiz_list->next;
		else
		    prev->next = curr->next;

		free_wizlist(curr);
	    }
	}
	if (found) {
	    save_wizlist();
	    ch->Send("%s deleted.\n\r", arg);
	} else
	    send_to_char("No one with that name is listed.\n\r", ch);
    } else {
	curr		= new_wizlist();
	curr->name	= str_dup(arg);
	curr->level	= level;
	curr->next	= wiz_list;
	wiz_list	= curr;
	save_wizlist();
	ch->Send("%s added.\n\r", arg);
    }
    return;
}