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. */

// /* Do not remove the headers from this file! see /USAGE for more info. */

//:COMMAND
//
// USAGE: tell <player> <message>
//        tell <player>@<mudname> <message>
//        tell /last
//        tell /clear
//
// This command is used to tell others private messages. The second format
// can be used to tell to people on other muds. The /last syntax will
// display your tell history and the /clear syntax will clear it.

#include <mudlib.h>
#include <commands.h>

inherit CMD;
inherit M_GRAMMAR;
inherit M_COMPLETE;
inherit M_ANSI;

#define MAX_HISTORY 20

void query_history(string name);
void add_history(string name, string msg);
void clear_history(string name);

private mapping history = ([ ]);

void create()
{
    ::create();
    no_redirection();
}

private void main(string arg)
{
    string user;
    string host;
    mixed tmp;
    string array words;
    string muds;
    string array previous_matches;
    string array matches;
    int i, j;
    string mystring;
    string deststring;
    object who;

    if(!arg)
    {
	out("Usage: tell <user> <message>\n");
	return;
    }

    if (arg == "/last")
	return query_history(this_user()->query_userid());

    if (arg == "/clear")
	return clear_history(this_user()->query_userid());


    if(sscanf(arg,"%s@%s", user, tmp) == 2) {
	muds = IMUD_D->query_up_muds();
	words = explode(tmp, " ");
	j = sizeof(words);
	tmp = "";
	for(i=0;i<j;i++)
	{
	    tmp += " " + words[i];
	    if(tmp[0] == ' ')
		tmp = tmp[1..];
	    matches = find_best_match_or_complete(tmp, muds);
	    if(!sizeof(matches))
	    {
		break;
	    }
	    previous_matches = matches;
	}
	if(previous_matches)
	{
	    if(sizeof(previous_matches) > 1)
	    {
		out("Vague mud name.  could be: " 
		  + implode(previous_matches, ", ") + "\n");
		return;
	    }                


	    host = previous_matches[0];
	    arg  = implode(words[i..], " ");
	    if(host == mud_name())
	    {
		main(user+" "+arg);
		return;
	    }

	    if( arg[0] == ';' || arg[0] == ':' )
	      {
		array soul_ret;
		
		arg = arg[1..];
		soul_ret = SOUL_D->parse_imud_soul(arg);
		
		if(!soul_ret)  {
		  IMUD_D->do_emoteto(host, user, sprintf("%s@%s %s",capitalize(user),host,arg));
                    outf("%%^TELL%%^You emote to %s@%s:%%^RESET%%^ %s %s\n", capitalize(user), host, this_body()->query_name(), arg);
                    add_history(this_user()->query_userid(),
                                sprintf("%%^TELL%%^You emote to %s@%s:%%^RESET%%^ %s %s\n",
                                        capitalize(user), host, this_body()->query_name(), arg));
		    return;
		}
		IMUD_D->do_emoteto(host,user,soul_ret[1][<1]);
		outf("%%^TELL%%^(tell)%%^RESET%%^ %s", soul_ret[1][0]);
		add_history(this_user()->query_userid(),
		            sprintf("%%^TELL%%^(tell)%%^RESET%%^ %s", soul_ret[1][0]));
		return;
	    }
	    IMUD_D->do_tell(host, user, arg);
            outf("%%^TELL%%^You tell %s@%s: %%^RESET%%^%s\n", capitalize(user), host, arg);
            add_history(this_user()->query_userid(),
                        sprintf("%%^TELL%%^You tell %s@%s: %%^RESET%%^%s\n",
                                capitalize(user), host, arg));
	    return;
	}
    }
    if(sscanf(arg, "%s %s", user, arg) != 2)
    {
	out("Usage: tell <user> <message>\n");
	return;
    }
    who = find_body(lower_case(user));
    if(!who)
    {
	outf("Couldn't find %s.\n", user);
	return;
    }

    if (who->query_invis() && !adminp(this_user()) )
    {
	outf("Couldn't find %s.\n", user);
	return;
    }
    if (!who->query_link() || !interactive(who->query_link()))
    {
	outf("%s is linkdead.\n", who->query_name());
	return;
    }

    if( arg[0] == ':' || arg[0] == ';' )
    {
	array soul_ret;
	int tindex;

	arg = arg[1..];

	soul_ret = SOUL_D->parse_soul(arg);
	if(!soul_ret)  {
            mystring = sprintf("%%^TELL%%^You emote to %s: %%^RESET%%^%s %s\n", who == this_body() ? "yourself" : who->query_name(), this_body()->query_name(),arg);
	    deststring = sprintf("*%s %s\n", this_body()->query_name(), arg);
	}
	else
	{
	    mystring = sprintf("%%^TELL%%^(tell)%%^RESET%%^ %s", soul_ret[1][0]);

	    if((tindex = member_array(who, soul_ret[0])) == -1)  {
		deststring = sprintf("%%^TELL%%^(tell)%%^RESET%%^ %s", soul_ret[1][<1]);
	    }
	    else
	    {
		deststring = sprintf("%%^TELL%%^(tell)%%^RESET%%^ %s", soul_ret[1][tindex]);
	    }
	}
    }
    else
    {
	mystring = sprintf("%%^TELL%%^You tell %s:%%^RESET%%^ %s\n", who == this_body() ? "yourself" : who->query_name(), arg);
	deststring = "%^TELL%^" + this_body()->query_name() + " tells you: %^RESET%^" + arg + "\n";
    }

    out(mystring);
    add_history(this_user()->query_userid(), mystring);
    if(who != this_body())
    {
	who->receive_private_msg(deststring, MSG_INDENT);
	add_history(who->query_userid(), deststring);
	who->set_reply(this_user()->query_userid());
    }
}

void add_history(string name, string msg)
{
  if( !this_user() )
  {
    if( find_object(IMUD_D) != previous_object() )
      error("Illegal attempt to modify 'tell' history.");
  }

  if (!history[name])
    history[name] = ({ msg });
  else
    history[name] += ({ msg });

  if (sizeof(history[name]) > MAX_HISTORY)
    history[name] = history[name][1..<1];
}

private void query_history(string name)
{
   string hist = history[name] ? implode(history[name], "") : "";

  if ( hist == "" )
    hist = "<none>\n";

  more(sprintf("History of 'tells':\n%s\n", hist));
}

private void clear_history(string name)
{
  map_delete(history, name);
}

nomask int
valid_resend(string ob) {
    return ob == "/cmds/player/reply";
}