deltamud/deltamud/
deltamud/deltamud/bin/
deltamud/deltamud/cnf/
deltamud/deltamud/lib/
deltamud/deltamud/lib/etc/
deltamud/deltamud/lib/misc/
deltamud/deltamud/lib/plrobjs/
deltamud/deltamud/lib/text/
deltamud/deltamud/lib/text/help/
deltamud/deltamud/lib/world/
deltamud/deltamud/lib/world/trg/
/* ************************************************************************
*  file:  autowiz.c                                     Part of CircleMUD *
*  Usage: self-updating wizlists                                          *
*  Written by Jeremy Elson                                                *
*  All Rights Reserved                                                    *
*  Copyright (C) 1993 The Trustees of The Johns Hopkins University        *
************************************************************************* */


/* 
   WARNING:  THIS CODE IS A HACK.  WE CAN NOT AND WILL NOT BE RESPONSIBLE
   FOR ANY NASUEA, DIZZINESS, VOMITING, OR SHORTNESS OF BREATH RESULTING
   FROM READING THIS CODE.  PREGNANT WOMEN AND INDIVIDUALS WITH BACK
   INJURIES, HEART CONDITIONS, OR ARE UNDER THE CARE OF A PHYSICIAN SHOULD
   NOT READ THIS CODE.

   -- The Management
 */

#include "conf.h"
#include "sysdep.h"

#include <signal.h>

#include "structs.h"
#include "utils.h"
#include "db.h"
#include "dbinterfacebare.h"

#define IMM_LMARG " "
#define IMM_NSIZE  16
#define LINE_LEN   65
#define MIN_LEVEL LVL_HERO

/* max level that should be in columns instead of centered */
#define COL_LEVEL 0

struct name_rec {
  char name[25];
  struct name_rec *next;
};

struct control_rec {
  int level;
  char *level_name;
};

struct level_rec {
  struct control_rec *params;
  struct level_rec *next;
  struct name_rec *names;
};

struct control_rec level_params[] =
{
  {LVL_HERO, "&YHeros"},
  {LVL_IMMORT, "&YImmortals"},
  {LVL_DEMIGOD, "&YSages"},
  {LVL_GOD, "&YSeers"},
  {LVL_GRGOD, "&YProphets"},
  {LVL_IMPL, "&YImplementors"},
  {0, ""}
};


struct level_rec *levels = 0;

void initialize(void)
{
  struct level_rec *tmp;
  int i = 0;

  while (level_params[i].level > 0) {
    tmp = (struct level_rec *) malloc(sizeof(struct level_rec));
    tmp->names = 0;
    tmp->params = &(level_params[i++]);
    tmp->next = levels;
    levels = tmp;
  }
}


void read_file(void)
{
  char buf [10000];
  void add_name(byte level, char *name);
  MYSQL_RES *result;
  MYSQL_ROW row;
  extern void connect_database (void);

  connect_database();
  sprintf(buf, "SELECT name,level,act from player_main");
  QUERY_DATABASE(SQLdb, buf, strlen(buf));
  if (!(result=STORE_RESULT(SQLdb))) return;
  while ((row=FETCH_ROW(result))) {
    if (row[0] && ATOIROW(1) >= MIN_LEVEL &&
	!(IS_SET(ATOIROW(2), PLR_FROZEN)) &&
	!(IS_SET(ATOIROW(2), PLR_NOWIZLIST)) &&
	!(IS_SET(ATOIROW(2), PLR_DELETED)))
      add_name(ATOIROW(1), row[0]);
  }
  mysql_free_result(result);
  mysql_close(SQLdb);
}


void add_name(byte level, char *name)
{
  struct name_rec *tmp;
  struct level_rec *curr_level;
  char *ptr;

  if (!*name)
    return;

  for (ptr = name; *ptr; ptr++)
    if (!isalpha(*ptr))
      return;

  tmp = (struct name_rec *) malloc(sizeof(struct name_rec));
  strcpy(tmp->name, name);
  tmp->next = 0;

  curr_level = levels;
  while (curr_level->params->level > level)
    curr_level = curr_level->next;

  tmp->next = curr_level->names;
  curr_level->names = tmp;
}


void sort_names(void)
{
  struct level_rec *curr_level;
  struct name_rec *a, *b;
  char temp[100];

  for (curr_level = levels; curr_level; curr_level = curr_level->next) {
    for (a = curr_level->names; a && a->next; a = a->next) {
      for (b = a->next; b; b = b->next) {
	if (strcmp(a->name, b->name) > 0) {
	  strcpy(temp, a->name);
	  strcpy(a->name, b->name);
	  strcpy(b->name, temp);
	}
      }
    }
  }
}


void write_wizlist(FILE * out, int minlev, int maxlev)
{
  char buf[100];
  struct level_rec *curr_level;
  struct name_rec *curr_name;
  int i, j;
  if (minlev != LVL_HERO)
    fprintf(out,
"\n  &c***************************************************************\n"
"  &c* &nThe following people run DeltaMUD. They are to be treated   &c*\n"
"  &c* &nwith great respect. If you need technical help, these are   &c*\n"
"  &c* &nthe people to contact.                                      &c*\n"
"  &c***************************************************************\n\n");
  else
    fprintf(out,
"\n  &c***************************************************************\n"
"  &c* &nThe following people have achieved hero status on DeltaMUD. &c*\n"
"  &c* &nThey've attained this level through hard work and hours of  &c*\n"
"  &c* &ngameplay and should be respected. Look to them for advice.  &c*\n"
"  &c***************************************************************\n\n");
  for (curr_level = levels; curr_level; curr_level = curr_level->next) {
    if (curr_level->params->level < minlev ||
	curr_level->params->level > maxlev)
      continue;
    i = (LINE_LEN-strlen(curr_level->params->level_name)+2)/2;
    for (j = 1; j <= i; j++)
      fputc(' ', out);
    fprintf(out, "%s\n", curr_level->params->level_name);
    for (j = 1; j <= i; j++)
      fputc(' ', out);
    for (j = 1; j <= strlen(curr_level->params->level_name)-2; j++) {
      fputc('&', out);
      if (j%2)
        fputc('y', out);
      else
        fputc('Y', out);
      fputc('-', out);
    }
    fprintf(out, "&n\n");

    strcpy(buf, "");
    curr_name = curr_level->names;
    while (curr_name) {
      strcat(buf, curr_name->name);
      if (strlen(buf) > LINE_LEN) {
	if (curr_level->params->level <= COL_LEVEL) {
	  fprintf(out, IMM_LMARG);
	} else {
//	  i = 40 - (strlen(buf) >> 1);
	  i = (LINE_LEN - strlen(buf))/2;
	  for (j = 1; j <= i; j++)
	    fputc(' ', out);
	}
	fprintf(out, "%s\n", buf);
	strcpy(buf, "");
      } else {
	if (curr_level->params->level <= COL_LEVEL) {
	  for (j = 1; j <= (IMM_NSIZE - strlen(curr_name->name)); j++)
	    strcat(buf, " ");
	}
	if (curr_level->params->level > COL_LEVEL)
	  if (curr_name->next) strcat(buf, IMM_LMARG);
      }
      curr_name = curr_name->next;
    }

    if (*buf) {
      if (curr_level->params->level <= COL_LEVEL)
	fprintf(out, "%s%s\n", IMM_LMARG, buf);
      else {
	  i = (LINE_LEN - strlen(buf))/2;
	for (j = 1; j <= i; j++)
	  fputc(' ', out);
	fprintf(out, "%s\n", buf);
      }
    }
    fprintf(out, "\n");
  }
}




int main(int argc, char **argv)
{
  int wizlevel, immlevel, pid = 0;
  FILE *fl;

  if (argc != 5 && argc != 6) {
    printf("Format: %s wizlev wizlistfile immlev immlistfile [pid to signal]\n",
	   argv[0]);
    exit(0);
  }
  wizlevel = atoi(argv[1]);
  immlevel = atoi(argv[3]);
  if (argc == 6)
    pid = atoi(argv[5]);
  initialize();
  read_file();
  sort_names();
  fl = fopen(argv[2], "w");
  write_wizlist(fl, wizlevel, LVL_IMPL);
  fclose(fl);
  fl = fopen(argv[4], "w");
  write_wizlist(fl, immlevel, immlevel);
  fclose(fl);
  if (pid)
    kill(pid, SIGUSR1);
  return 0;
}