idirt-1.82d/
idirt-1.82d/bin/
idirt-1.82d/data/LOGS/
idirt-1.82d/data/POLICY/
idirt-1.82d/data/WIZ_ZONES/
idirt-1.82d/doc/
idirt-1.82d/doc/info/
idirt-1.82d/doc/manual/
idirt-1.82d/src/Ident/
idirt-1.82d/src/utils/
idirt-1.82d/utils/
/* iDiRT Wizlist
 * 1995 by Illusion
 */

#include <unistd.h>
#include "kernel.h"
#include "fluid.h"
#include "log.h"
#include "bprintf.h"
#include "parse.h"

extern char *WizLevels[];

struct _w {
  struct _w *next;
  char name[PNAME_LEN + 1];
  int wlev;
};

struct _w *wizlist;
char wizfile[256];

void
set_wizfile (char *f)
{
  strcpy (wizfile, f);
}

int
boot_wizlist (FILE * f, char *fname)
{
  int mused = 0;
  int plev;
  struct _w *first = NULL;
  struct _w *p, *q, *r;
  char buff[256];
  char name[100];
  char lev[100];

  if (f == NULL) {
    wizlist = NULL;
    return 0;
  }
  while (fgets (buff, sizeof buff, f) != NULL) {
    sscanf (buff, "%s %s", name, lev);
    if ((plev = tlookup (lev, WizLevels)) < 0) {
      printf ("Error in wizlist, invalid wizlevel %s.\n", lev);
      continue;
    }
    if (strlen (name) > PNAME_LEN) {
      printf ("Error in wizlist, name %s is too long.\n", name);
      continue;
    }
    r = NEW (struct _w, 1);
    mused += sizeof (struct _w);

    strcpy (r->name, name);
    r->wlev = plev;
    q = NULL;
    for (p = first; p != NULL && p->wlev >= plev; q = p, p = p->next) ;
    r->next = p;
    if (q == NULL) {
      first = r;
    } else {
      q->next = r;
    }
  }
  if (!feof (f)) {
    printf ("Error while reading wizlist");
    ferror (f);
  }
  wizlist = first;
  return mused;
}

void
dump_wizlist (void)
{
  struct _w *p;
  FILE *f;

  if ((f = fopen (wizfile, "w")) == NULL) {
    mudlog ("ERROR: Error when dumping wizfile \"%s\".", wizfile);
    progerror (wizfile);
    return;
  }
  for (p = wizlist; p != NULL; p = p->next) {
    if (p->wlev > LEV_MORTAL && p->wlev <= LEV_MASTER) {
      fprintf (f, "%s %s\n", p->name, WizLevels[p->wlev]);
    }
  }
  fclose (f);
}

void
update_wizlist (char *name, int new_wlevel)
{
  struct _w *p, *q, *r;
  Boolean m = False;

  for (q = NULL, p = wizlist; p != NULL && !EQ (p->name, name);
       q = p, p = p->next) ;
  if (p != NULL) {
    /* No change */
    if (new_wlevel == p->wlev && new_wlevel != LEV_MORTAL)
      return;
    /* remove him from his current place in wizlist */
    if (q == NULL) {
      wizlist = p->next;
    } else {
      q->next = p->next;
    }
    m = True;
  }
  if (new_wlevel > LEV_MORTAL && new_wlevel <= LEV_MASTER) {
    /* Put him in the list at the right place */
    if (p == NULL) {
      /* Create him */
      p = NEW (struct _w, 1);

      strcpy (p->name, name);
    }				/*220692 */
    p->wlev = new_wlevel;

    for (q = NULL, r = wizlist; r != NULL && r->wlev >= p->wlev;
	 q = r, r = r->next) ;
    p->next = r;
    if (q == NULL) {
      wizlist = p;
    } else {
      q->next = p;
    }
    m = True;
  }
  if (m) {
    /* Wizlist is changed, dump it */
    dump_wizlist ();
  }
}

/* Function to parse a string s assumed to be on one of the following forms:
 *
 * +wizlevel      return low = wizlevel, high = god, return '+';
 * -wizlevel      return low = apprentice, high = wizlevel, return '-';
 * =wizlevel      return low = high = wizlevel, return '=';
 * wizlevel1:wizlevel2 return low = wizlevel1, high = wizlevel2, return ':';
 * nickname       return low = pointer to node in wizlist describing
 *                nickname. high = 0, return -2
 * wizlevel       return low = high = wizlevel, return 0;
 *
 * if invalid wizlevel, return -3; */

int
parse_wizlevel (char *s, int *low, int *high)
{
  int t, x;
  char *a;
  struct _w *p;

  a = NULL;

  if ((t = *s++) != '+' && t != '-' && t != '=') {
    if ((a = strchr (--s, ':')) == NULL)
      t = 0;
    else {
      *a++ = '\0';
      t = ':';
    }
  }
  if (t != 0) {
    if ((x = tlookup (s, WizLevels)) < 0)
      return -3;
    switch (t) {
    case '+':
      *low = x;
      *high = LEV_MASTER;
      break;
    case '-':
      *low = LEV_APPRENTICE;
      *high = x;
      break;
    case '=':
      *low = *high = x;
      break;
    case ':':
      *low = x;
      if ((*high = tlookup (a, WizLevels)) < 0)
	return -3;
      break;
    }
  } else {
    for (p = wizlist; p != NULL && !EQ (s, p->name); p = p->next) ;
    if (p != NULL) {
      *low = (int) p;
      *high = 0;
      return -2;
    }
    if ((x = tlookup (s, WizLevels)) < 0)
      return -3;
    *low = *high = x;
  }
  return t;
}

/*
 * wizlist command
 *
 * WIZLIST [+-=]wizlevel         wizard level
 * WIZLIST wizlevel:wizlevel     range of wizard levels
 * WIZLIST nickname              nickname
 *
 * each of the arguments may be repeated.
 *
 */

void
wizlistcom (void)
{
  static char *w[] =
  {NULL,
   "Apprentice Wizards",
   "Dorqs",
   "Emeriti (Honorary) Wizards",
   "Wizards",
   "Prophets",
   "ArchWizards",
   "Advisors",
   "Avatars",
   "Gods",
   "Master User"};

  FILE *fp;
  char fn[100];
  int t;
  int x = -1;
  int low, high;
  struct _w *p;
  Boolean h = False;
  int i, k = 0;

  sprintf (fn, "%s/WIZLIST.%s", TEMP_DIR, pname (mynum));
  if ((fp = fopen (fn, "w")) == NULL) {
    bprintf ("Error Creating Temporary File For Wizard List.\n");
    mudlog ("ERROR: Cannot create temporary file for Wizard List");
    return;
  }
  if ((t = brkword ()) == -1) {
    low = LEV_APPRENTICE;
    high = LEV_MASTER;
  }
  do {
    if (t != -1)
      t = parse_wizlevel (wordbuf, &low, &high);
    if (t == -3) {
      bprintf ("&+wNo such wizard level or player: &+W%s\n", wordbuf);
    } else if (t == -2) {
      p = (struct _w *) low;
      low = p->wlev;
      bprintf ("&+W%s &+wis %s &+C%s&+w.\n", p->name,
	       (low == LEV_APPRENTICE || low == LEV_ARCHWIZARD) ?
	       "an" : "a",
	       WizLevels[low]);
    } else {
      for (p = wizlist; p != NULL && p->wlev >= low; p = p->next) {
	if (p->wlev <= high) {
	  if (!h) {
	    fprintf (fp, "&+CThe following players have risen to power "
		     "in the %s", MUD_NAME);
	    if (low > LEV_APPRENTICE || high < LEV_MASTER) {
	      fprintf (fp, "\n&+W(Only the levels chosen are shown)");
	    }
	    h = True;
	  }
	  if (p->wlev != x) {
	    fprintf (fp, "\n\n&+C%s\n", w[x = p->wlev]);
	    fprintf (fp, "&+c");
	    for (i = 0; i < strlen (w[x = p->wlev]); ++i)
	      fprintf (fp, "-");
	    fprintf (fp, "\n");
	    k = 6;
	  }
	  if (((tlookup (p->name, InvisList)) == -1) &&
	      ((tlookup (p->name, FluidList)) == -1))
	    fprintf (fp, "&+w%-*s ", PNAME_LEN, p->name);
	  if (--k == 0) {
	    fprintf (fp, "\n");
	    k = 6;
	  }
	}
      }
      if (k < 6) {
	fprintf (fp, "\n");
      }
    }
  }
  while ((t = brkword ()) != -1);

  fclose (fp);
  file_pager (fn);
  unlink (fn);
}