/
board-1/
/* states for new note system, to be inserted in nanny()

===========================================================================
This snippet was written by Erwin S. Andreasen, 4u2@aabc.dk. You may use
this code freely, as long as you retain my name in all of the files. You
also have to mail me telling that you are using it. I am giving this,
hopefully useful, piece of source code to you for free, and all I require
from you is some feedback.

Please mail me if you find any bugs or have any new ideas or just comments.

All my snippets are publically available at:

http://login.dknet.dk/~ea/

If you do not have WWW access, try ftp'ing to login.dknet.dk and examine
the /pub/ea directory.
===========================================================================
*/

	/* ch MUST be PC here; have nwrite check for PC status! */
	/* This code is extra case's in nanny () */
		
	case CON_NOTE_TO:
		if (!ch->pcdata->in_progress)
		{
			d->connected = CON_PLAYING;
			bug ("nanny: In CON_NOTE_TO, but no note in progress",0);
			break;
		}

		strcpy (buf, argument);
		smash_tilde (buf); /* change ~ to - as we save this field as a string later */

		switch (ch->pcdata->board->force_type)
		{
			case DEF_NORMAL: /* default field */
				if (!buf[0]) /* empty string? */
				{
					ch->pcdata->in_progress->to_list = str_dup (ch->pcdata->board->names);
					sprintf (buf, "Assumed default recipient: &@%s&*\n\r", ch->pcdata->board->names);
					write_to_buffer (d, buf, 0);
				}
				else
					ch->pcdata->in_progress->to_list = str_dup (buf);
					
				break;
			
			case DEF_INCLUDE: /* forced default */
				if (!is_name (ch->pcdata->board->names, buf))
				{
					strcat (buf, " ");
					strcat (buf, ch->pcdata->board->names);
					ch->pcdata->in_progress->to_list = str_dup(buf);

					sprintf (buf, "\n\rYou did not specify %s as recipient, so it was automatically added.\n\r"
					         "&@&yNew To&* :  %s\n\r",
							 ch->pcdata->board->names, ch->pcdata->in_progress->to_list);
					write_to_buffer (d, buf, 0);
				}
				else
					ch->pcdata->in_progress->to_list = str_dup (buf);
				break;
			
			case DEF_EXCLUDE: /* forced exclude */
				if (is_name (ch->pcdata->board->names, buf))
				{
					sprintf (buf, "You are not allowed to send notes to %s on this board. Try again.\n\r"
					         "&y&@To&*:      ", ch->pcdata->board->names);
					write_to_buffer (d, buf, 0);
					return; /* return from nanny, not changing to the next state! */
				}
				else
					ch->pcdata->in_progress->to_list = str_dup (buf);
				break;
			
		}		

		write_to_buffer (d, "\n\r&y&@Subject&*: ", 0);
		d->connected = CON_NOTE_SUBJECT;
	

		break; /* to */
		
	case CON_NOTE_SUBJECT:
		if (!ch->pcdata->in_progress)
		{
			d->connected = CON_PLAYING;
			bug ("nanny: In CON_NOTE_SUBJECT, but no note in progress",0);
			break;
		}

		strcpy (buf, argument);
		smash_tilde (buf); /* change ~ to - as we save this field as a string later */
		
		/* Do not allow empty subjects */
		
		if (!buf[0])		
		{
			write_to_buffer (d, "Please find a meaningful subject!\n\r",0);
			write_to_buffer (d, "&y&@Subject&*: ", 0);
		}
		else  if (strlen(buf)>60)
		{
			write_to_buffer (d, "No, no. This is just the Subject. You're note writing the note yet. Twit.\n\r",0);
		}
		else
		/* advance to next stage */
		{
			ch->pcdata->in_progress->subject = str_dup(buf);
			if (IS_IMMORTAL(ch)) /* immortals get to choose number of expire days */
			{
				sprintf (buf,"\n\rHow many days do you want this note to expire in?\n\r"
				             "Press Enter for default value for this board, &@%d&* days.\n\r"
            				 "&@&yExpire&*:  ",
			                 ch->pcdata->board->purge_days);
				write_to_buffer (d, buf, 0);				               
				d->connected = CON_NOTE_EXPIRE;
			}
			else
			{
				write_to_buffer (d, "\n\rEnter text. Type &@~&* or &@END&* on an empty line to end note.\n\r"
				                    "=======================================================\n\r",0);
				d->connected = CON_NOTE_TEXT;
			}
		}
		
		break; /* subject */
	
	case CON_NOTE_EXPIRE:
	{
		time_t expire;
		int days;

		if (!ch->pcdata->in_progress)
		{
			d->connected = CON_PLAYING;
			bug ("nanny: In CON_NOTE_EXPIRE, but no note in progress",0);
			break;
		}
		
		/* Numeric argument. no tilde smashing */
		strcpy (buf, argument);
		if (!buf[0]) /* assume default expire */
			days = 	ch->pcdata->board->purge_days;
		else /* use this expire */
			if (!is_number(buf))
			{
				write_to_buffer (d,"Write the number of days!\n\r",0);
				write_to_buffer (d,"&@&yExpire&*:  ",0);
				return;
			}
			else
			{
				days = atoi (buf);
				if (days <= 0)
				{
					write_to_buffer (d, "This is a positive MUD. Use positive numbers only! :)\n\r",0);
					write_to_buffer (d,"&@&yExpire&*:  ",0);
					return;
				}
			}
				
		expire = current_time + (days*24L*3600L); /* 24 hours, 3600 seconds */

		ch->pcdata->in_progress->expire = expire;
		
		/* note that ctime returnx XXX\n so we only need to add an \r */
		sprintf (buf, "This note will expire %s\r",ctime(&expire));
		write_to_buffer (d,buf,0);

		write_to_buffer (d, "\n\rEnter text. Type &@~&* or &@END&* on an empty line to end note.\n\r"
		                    "=======================================================\n\r",0);

		d->connected = CON_NOTE_TEXT;
		
		break;

	} /* expire */
		

	case CON_NOTE_TEXT:
	{
		char letter[MAX_STRING_LENGTH];
		
		if (!ch->pcdata->in_progress)
		{
			d->connected = CON_PLAYING;
			bug ("nanny: In CON_NOTE_TEXT, but no note in progress",0);
			break;
		}

		/* First, check for EndOfNote marker */

		strcpy (buf, argument);
		if ((!str_cmp(buf, "~")) || (!str_cmp(buf, "END")))
		{
			write_to_buffer (d, "\n\r(&@C&*)ontinue, (&@V&*)iew, (&@P&*)ost or (&@F&*)orget it?\n\r",0);
			d->connected = CON_NOTE_FINISH;
			return;
		}
		
		smash_tilde (buf); /* smash it now */

		/* Check for too long lines. Do not allow lines longer than 75 chars */
		
		if (strlen (buf) > MAX_LINE_LENGTH)
		{
			write_to_buffer (d, "Too long line rejected. Do NOT go over 75 characters!\n\r",0);
			return;
		}
		
		/* Not end of note. Copy current text into temp buffer, add new line, and copy back */

		/* How would the system react to strcpy( , NULL) ? */		
		if (ch->pcdata->in_progress->text)
		{
			strcpy (letter, ch->pcdata->in_progress->text);
			free_string (ch->pcdata->in_progress->text);
			ch->pcdata->in_progress->text = NULL; /* be sure we don't free it twice */
		}
		else
			strcpy (letter, "");
			
		/* Check for overflow */
		
		if ((strlen(letter) + strlen (buf)) > MAX_NOTE_TEXT)
		{ /* Note too long, take appropriate steps */
			write_to_buffer (d, "Note too long. Autosplitting <TO BE IMPLEMENTED\n\r", 0);
			free_note (ch->pcdata->in_progress);
			d->connected = CON_PLAYING;
			return;			
		}
		
		/* Add new line to the buffer */
		
		strcat (letter, buf);
		strcat (letter, "\r\n"); /* new line. \r first to make note files better readable */

		/* allocate dynamically */		
		ch->pcdata->in_progress->text = str_dup (letter);
		
		break;
	} /* con_note_text */
		
	case CON_NOTE_FINISH:

		if (!ch->pcdata->in_progress)
		{
			d->connected = CON_PLAYING;
			bug ("nanny: In CON_NOTE_FINISH, but no note in progress",0);
			break;
		}
		
		switch (tolower(argument[0]))
		{
			case 'c': /* keep writing */
				write_to_buffer (d,"Continuing note...\n\r",0);
				d->connected = CON_NOTE_TEXT;
				break;

			case 'v': /* view note so far */
				if (ch->pcdata->in_progress->text)
				{
					write_to_buffer (d,"&gText of your note so far:&*\n\r",0);
					write_to_buffer (d, ch->pcdata->in_progress->text, 0);
				}
				else
					write_to_buffer (d,"You haven't written a thing!\n\r",0);
					write_to_buffer (d, "\n\r(&@C&*)ontinue, (&@V&*)iew, (&@P&*)ost or (&@F&*)orget it?\n\r",0);
					
				break;

			case 'p': /* post note */
				finish_note (ch->pcdata->board, ch->pcdata->in_progress);
				write_to_buffer (d, "Note posted.\n\r",0);
				d->connected = CON_PLAYING;
				/* remove AFK status */
				ch->pcdata->in_progress = NULL;
				break;
				
			case 'f':
				write_to_buffer (d, "Note cancelled!\n\r",0);
				free_note (ch->pcdata->in_progress);
				ch->pcdata->in_progress = NULL;
				d->connected = CON_PLAYING;
				/* remove afk status */
				break;
			
			default: /* invalid response */
				write_to_buffer (d, "Huh? Valid answers are:\n\r",0);
				write_to_buffer (d, "\n\r(&@C&*)ontinue, (&@V&*)iew, (&@P&*)ost or (&@F&*)orget it?\n\r",0);
				
		}

		break;