lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** standard.c
**
** The standard "mail" command.  This is a standard modal mailer, compared
** to the Mh-style mailer.
**
** Created 31-OCT-94, Deathblade.
*/

#include <playerflags.h>
#include <mudlib.h>
#include <daemons.h>

inherit MAILER;


private nomask string query_prompt()
{
    return sprintf("[%d of %d] mail: ",
      mailbox_ob->query_message_index() + 1,
      mailbox_ob->query_message_count());
}

private void stdmail_cmd_replyall(mixed cmd_args)
{
    if ( cmd_args && !(cmd_args = to_int(cmd_args)) )
    {
	write("Usage: R #\n");
	return;
    }

    cmd_reply(cmd_args, 1);
}

private void stdmail_cmd_reply(mixed cmd_args)
{
    if ( cmd_args && !(cmd_args = to_int(cmd_args)) )
    {
	write("Usage: r #\n");
	return;
    }

    cmd_reply(cmd_args, 0);
}

private void stdmail_cmd_help()
{
    string output;

    output =
    "?					This help screen\n"
    "\n"
    "m <name1> [name2] [name3]...		Send mail.\n"
    "h [# or range (1-4,6 for example)]	Show the headers for the specified\n"
    "					range of messages, or all messages\n"
    "					if no range is specified.\n"
    "# 					Read a message.\n"
    "r #					Reply to message\n"
    "R #					Reply to message, all\n"
    "					originial recipients receive the mail\n"
    "f #					Forward message\n"
    "d # or range				Delete message(s)\n"
    "$					Show the number of messages in your box.\n"
    "= [#]					Set current message if # is provided\n"
    "					else shows the current message #\n"
    "+					increment the current message number\n"
    "					but do not read.\n"
    "-					decrement the current message number\n"
    "					but do not read.\n"
    "n					read the next message.\n"
    ;

    if( wizardp(this_user()) )
	output +=
	"s [#] <filename>			Save message w/ header intact to file.\n"
	"w [#] <filename>			Save message but no header to file.\n";

    output +=
    "\n"
    "All numbers default to the currently referenced message, which is shown by =\n"
    "\n"
    "Groups may also be mailed to, see help for groups on how to set them\n"
    "up.... you can mail to them by enclosing "
    "The group in ().  Eg, Mm (admin) rust  will mail all the admins and rust.\n";

    more(output);
}

private void stdmail_cmd_forward(string cmd_args)
{
    mixed	newto;
    int		num;

    if(!cmd_args || (sscanf(cmd_args,"%d %s",num,newto)!=2&&
	(sscanf(cmd_args,"%s",newto)!=1)))
    {
	write("Usage: f # <name1> [name2] ...\n");
	return;
    }

    cmd_forward(num, newto);
}

private void stdmail_cmd_save(string cmd_args)
{
    int	num;
    string fname;

    if(!cmd_args || (sscanf(cmd_args,"%d %s",num,fname)!=2&&
	sscanf(cmd_args,"%s",fname)!=1))
    {
	write("Usage: s # <filename>\n");
	return;
    }

    cmd_read(num, fname, 0);
}

private void stdmail_cmd_write(string cmd_args)
{
    int	num;
    string fname;

    if(!cmd_args || (sscanf(cmd_args,"%d %s",num,fname)!=2&&
	sscanf(cmd_args,"%s",fname)!=1))
    {
	write("Usage: w # <filename>\n");
	return;
    }

    cmd_read(num, fname, 1);
}

private nomask void mail_prompt(string input)
{
    string cmd_args;

    input = trim_spaces(input);
    if ( sizeof(input) >= 3 && input[1] == ' ' )
	cmd_args = input[2..];

    if(!sizeof(input))
    {
	int idx;
	idx = mailbox_ob->first_unread_message() + 1;
	if( !idx )
	{
	    modal_pop();
	    destruct( this_object());
	    return;
	}
	else
	    cmd_read( idx, 0, 0);
	return;
    }

    switch ( input[0] )
    {
    case 'q':
	modal_pop();
	destruct(this_object());
	break;
    case 'h':
	cmd_headers(cmd_args);
	break;
    case 'm':
	cmd_mail(cmd_args);
	break;
    case 'R':
	stdmail_cmd_replyall(cmd_args);
	break;
    case 'r':
	stdmail_cmd_reply(cmd_args);
	break;
    case '?':
	stdmail_cmd_help();
	break;
    case 'd': 
	cmd_delete(cmd_args);
	break;
    case 'f':
	stdmail_cmd_forward(cmd_args);
	break;
    case 's':
	stdmail_cmd_save(cmd_args);
	break;
    case '=':
	cmd_setcurrent(cmd_args);
	break;
    case 'w':
	stdmail_cmd_write(cmd_args);
	break;
    case 'n':
	{
	    int idx;

	    idx = mailbox_ob->first_unread_message() + 1;
	    if ( !idx )
		printf("No more messages.\n");
	    else
		cmd_read(idx, 0, 0);
	    break;
	}
    case '+':
	cmd_setcurrent(mailbox_ob->query_message_index()+2 );
	break;
    case '-':
	cmd_setcurrent(mailbox_ob->query_message_index() );
	break;
    case '$':
	printf("You have %d messages.\n", mailbox_ob->query_message_count());
	break;
    default:
	if ( to_int(input) > 0 )
	    cmd_read(to_int(input), 0, 0);
	else
	    write("Type ? for help\n");
	break;
    }
}

nomask void begin_mail(string arg)
{
    int idx;

    if ( arg && trim_spaces(arg) != "" )
    {
	cmd_mail(arg);
	return;
    }

    modal_push((: mail_prompt :), (: query_prompt :));
    idx = mailbox_ob->first_unread_message() + 1;
    if (!idx)
    {
	write( "No Unread Messages.\n" );
        write( "(h for old headers)\n" );
    }
    else
    {
	write(sprintf("\n--- %s Mailer ---\nCurrent headers:\n", mud_name()));
        cmd_headers( idx + "-" + mailbox_ob->query_message_count());
    }
}