/* NameError.c V1.3
 * This code will send pc's different error messages during the log-in/creation
 * process to tell them why their name isn't allowed.  As well as protecting
 * 'famous names' Like zugg, hatchet, erwin, darkoth, etc.
 *
 * Updated September 2, 2000
 * Written by Snafu Life. (copyright 2000) of the (coming soon) mud Aacacia. (Rom2.4b6).
 * Special thanx to Myles Skinner and Malcom Valentine for their contributions
 * in the creation/wording of the error messages.Also, a special thanx to
 * Alex Fletcher, for his help in weeding out some extraneous code.
 * 
 * This code is given to you almost freely upon the following conditions:
 * These conditions must be included when distributed in any form including
 * but not limited to modified works.
 * 
 * Neither I nor anyone else that modifies or distributes this snip can
 * require credit be given in any form. Credit is welcomed but is at the
 * sole discretion of the End User. End User, as used here, is defined as the
 * person who has copyrights over the source this snip or a modified
 * version of this snip is being placed into. The End User shall not be charged
 * for access or use of this snip or a modified version. 
 */

/* In merc.h under the act_wiz.c comment, I also use Voltecs rename command so
 * that is why i define it there. If you don't use a rename command you could
 * define it comm.c by replacing bool check_parse_name args((char *name)); in
 * the local functions comment
 */
int check_parse_name	args((char *name));

/* Right before "Other local functions(OS-independant)"
 */

/* Used for Name validation */
#if defined(MSDOS) 
#define MAX_NAME_LENGTH   8 
#else    /* if defined(macintosh) || defined(unix) */ 
#define MAX_NAME_LENGTH  12 
#endif 


/* in comm.c under the "Other local functions (OS-indepent)" comment, delete
 * bool	check_parse_name	args( ( char *name ) );
 */



/* If you already have modified check_parse_name() you can use this
 * as a reference if not you may choose to replace as suggested
 */


/* in void nanny() at the top replace 

    char buf[MAX_STRING_LENGTH];
 */

    char buf[MAX_STRING_LENGTH],log_buf[MAX_STRING_LENGTH];

/* and     int iClass,race,i,weapon; 
   with:
 */

    int iClass,race,i,weapon,x;

/* Lower case cap freako's example CrashBurn becomes Crashburn
 *
 * After     while ( isspace(*argument) )
		argument++;
 */

    while ( isspace(*argument) ) {
	argument++;
    }

 /* This is a change from the second version.
    * If you don't add this you will experience
    * a lack of capital letters in various areas
    * of your code :(
   if (d->connected == CON_GET_NAME ) {
	c='0';
	x=0;
	while(c != '\0') {
		c = argument[x];
		c = tolower(c);
		argument[x] = c;
		x++;
        }

   }


/* In void nanny() under case CON_GET_Name right replace 

	if ( !check_parse_name( argument ) )
	{
	    write_to_buffer( d, "Illegal name, try another.\n\rName: ", 0 );
	    return;
	}

 * with: 
 */

	if(check_parse_name(argument) != 0) {
       switch(check_parse_name(argument)) {
		/* REPLACE Aacacian with your mud name */
	  case 1: write_to_buffer( d, 
	  "The name you have chosen has been reserved by the Aacacian Administration.\n\r",0);
 		  write_to_buffer(d,"Please choose again.\n\rName:\n\r",0);
   		break;
	  case 2: write_to_buffer( d, 
	  "A clan has reserved that name for their use. Please choose again.\n\rName: ", 0 );
		break;
          case 3: write_to_buffer(d,"This name is a well known name in the mud'ing community.\n\r",0);
		  write_to_buffer(d,"If you really are this person:\n\r",0);
 		  write_to_buffer(d,"Please, create under a different name and send an e-mail\n\r",0);
		/* REPLACE BELOW WITH YOUR E-mail Address */
		  write_to_buffer(d,"to aacacia@coming_soon from a verifiable e-mail address.\n\r",0);
		  write_to_buffer(d,"We welcome your presence, but to protect ourselves as\n\r",0);
		  write_to_buffer(d,"well as to protect you from impersonators, we have\n\r",0);
		  write_to_buffer(d,"temporarily placed your name on hold.\n\r",0);
 		  write_to_buffer(d,"If you are not this person, you have our apologies for\n\r",0);
 		  write_to_buffer(d,"the unavailability of this name but hope you will choose\n\r",0);

 		  write_to_buffer(d,"another name instead.\n\rName:",0);
		  sprintf(log_buf,"Log: Famous Name: %s@%s",argument,d->host);
		  wiznet(log_buf,ch,NULL,WIZ_SECURE,0,get_trust(ch));
		  log_string(log_buf);
		  break;

 	  case 4: write_to_buffer( d,
                 "The name chosen must be between 3 and %d characters in length.\n", MAX_NAME_LENGTH);
		break;
 	  case 5: write_to_buffer(d,"Only letters (A-Z) are allowed.\n\rName: ", 0 );
  		break;
  	}
	return;
       }



/*  in comm.c replace bool check_parse_name() with: 
 */

/*
 * Parse a name for acceptability.
 */
int check_parse_name( char *name )
{
    int clan;

    /*
     * Reserved words.
     */
	/* If you have changed is_exact_name you may want to replace it with
         * your keywaords, if not change aacacia to your mud name
         */
    if (is_exact_name(name,
	"all aac mob aacacia auto immortal self someone something the you loner none"))
      {
	return 1;
      }

    /* check clans */
    for (clan = 0; clan < MAX_CLAN; clan++)
    {
	if (LOWER(name[0]) == LOWER(clan_table[clan].name[0])
	&&  !str_cmp(name,clan_table[clan].name))
	   return 2;
    }

	/* PROTECT OURSELF FROM IMPOSTERS IF ONE OF THESE VISITS
	 * And sends you confirmation that is who they are then all
         * you have to do is remove their name from the list and
         * change their temp pfile accordingly */
    if ((str_cmp(capitalize(name),   "Alander")
	 || str_cmp(capitalize(name),"Zugg")
	 || str_cmp(capitalize(name),"Snafu") /* Hopefully, Someday ;) */
         || str_cmp(capitalize(name),"Lope")
	 || str_cmp(capitalize(name),"Ivan")
	 || str_cmp(capitalize(name),"Askirius")
	 || str_cmp(capitalize(name),"Erwin")
	 || str_cmp(capitalize(name),"Furey")
	 || str_cmp(capitalize(name),"Hatchet")
	 || str_cmp(capitalize(name),"Kahn")
	 || str_cmp(capitalize(name),"Darkoth")
	 || str_cmp(capitalize(name),"Voltec")
	 || str_cmp(capitalize(name),"Kavir"))
	&& (!str_prefix("Alan",name) 
           || !str_suffix("Alander",name))){
	   /* This is a list in progress There may be more
	    * you want to add
            */
	return 3;
    }

    /*
     * Length restrictions.
     */
	  if ( (strlen(name) <  3) || strlen(name) > MAX_NAME_LENGTH) { 
		return 4; 
	  }

    /*
     * Alphanumerics only.
     * Lock out IllIll twits.
     *
     * Most of the old stuff is now no longer needed
     * cut-off to save space.
     */
    {
	char *pc;
	bool fIll=TRUE;

	for ( pc = name; *pc != '\0'; pc++ )
	{
            /* No digits (0-1) or punctuation in name */
	    if(!isalpha(*pc))
		return 5;

	    /* Took out ugly anti-caps hace replaced in nanny() */


	    if ( LOWER(*pc) != 'i' && LOWER(*pc) != 'l' )
		fIll = FALSE;
	}

	if ( fIll ) {
	   return 1;
	}
    }

    /*
     * Prevent players from naming themselves after mobs.
     */
    {
	extern MOB_INDEX_DATA *mob_index_hash[MAX_KEY_HASH];
	MOB_INDEX_DATA *pMobIndex;
	int iHash;

	for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ ) {
	    for ( pMobIndex  = mob_index_hash[iHash];
		  pMobIndex != NULL;
		  pMobIndex  = pMobIndex->next ) {
		if ( is_name( name, pMobIndex->player_name ) ) {
		    return 1;
		}
	    }
	}
    }

    /* Prevent players from naming themselves objects */
    {
	extern OBJ_INDEX_DATA *obj_index_hash[MAX_KEY_HASH];
	OBJ_INDEX_DATA *pObjIndex;
	int iHash;

	for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
	{
	    for ( pObjIndex  = obj_index_hash[iHash];
		  pObjIndex != NULL;
		  pObjIndex  = pObjIndex->next )
	    {
		if ( is_name( name, pObjIndex->name ) ) {
		    return 1;
		}
	    }
	}
    }

    /* Prevent players from naming themselves command names */
    {
	int cmd, iHash;

	for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
	{
		for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
		{
			if (is_name( name, cmd_table[cmd].name))
			{
			return 1;
			}
		}
	}
     }
	return 0;
}

/* Make sure your replace references to Aacacia or Aacacian
 * with your mud's name and/or e-mail addy as the case may be.
 * that is all there is to it. if you want to drop me a line:
 * snafulife@home.com or snafu.life@usa.net if I have moved and
 * the previous doesn't work.
 */
