// Him messed abit with it, in the early days
//
// Updated interwiz tells at some point by Leto@Earth
// Cleaned it up a bit and added busy flag Leto@Earth 24/12/93
// Completely overhauled and updated by Leto@Earth 14-jan-94
// (fixed idlemsg, busy, new remote tell)
// Highlighting experiment added by Vagabond@Earth 19-jan-94
// Ignore code added by Leto@Earth 26-feb-94
// Another major clean_up of code, added wrap() everywhere
// Wiped ansi stuff again and moved it to user.c
// Leto (29.04.94)
// Leto added notify for break through busy for admins ;)
// Leto removed wrap code, since wrapping should only be done in receive_message
// these days, since it relies on the window size of users 160296
// Added /last backlog stuff Perrin@Earth 22-Mar-96
// Fixed uids to backlogs can be read/written again, Leto 03-may-96
#include <daemons.h>
#include <mudlib.h>
#include <ansi.h>
#include <net/i3.h>
#include <priv.h>
#include <uid.h>
inherit DAEMON;
#define SYNTAX "Usage: tell {/last | name [@mud] message}\n"
#define NH " is not on "+MUD_NAME+"."
#define BACKLOG_MAX 10
void add_backlog(string, object);
void create() { seteuid(ROOT_UID);} // needed for backlogs
int cmd_tell(string str) {
string tell_msg, who, msg, target, mud;
int idlem, idles;
string idlemsg;
string *ignore;
object ob, act_ob;
int args,i;
act_ob = this_player();
if (!str) {
notify_fail( SYNTAX );
return 0;
}
args = sscanf(str,"/%s",who);
if (!args) {
if (sscanf(str,"%s %s",who,msg) != 2) {
notify_fail( SYNTAX );
return 0; }
notify_fail( capitalize(who) + NH + "\n" );
if (sscanf(who,"%s@%s",target,mud) == 2) {
mud = replace_string(mud,"."," ");
if(!I3_DAEMON->query_network_name(mud))
return notify_fail("I3 error: No such mud.\n");
"/adm/daemons/network/I3/tell"->send_tell(this_player()->query("name"), this_player()->query("cap_name"), mud, target, msg);
return 1; }
}
else {
// Perrin 22Mar96
if(!sizeof(this_player()->query("tell_backlog")))
{
write("No logged tells yet, sorry.\n");
return 1;
}
message("tell",sprintf("Backlog of tells:\n%s",
implode(this_player()->query("tell_backlog"),"\n")+"\n"),act_ob);
return 1;
}
who = lower_case( who );
ob = find_player( who );
if((!ob) || ( wizardp(ob) && (!visible(ob,this_player())) ) ) {
notify_fail(capitalize(who)+NH+"\n"); //Ok, crude hack, i know :) Leto
return 0;}
// if( ( (ob->query("invisible")-1) > wizardp(this_player()) ) ||
// (ob->query("hide")) )
// On popoular demand, invis players can be told stuff.
#if 0
if(wizardp(ob))
{
notify_fail( capitalize(who) + NH + "\n" );
return 1;
}
#endif
if(!interactive(ob)) {
write("That person is currently net-dead, sorry.\n");
return 1;
}
if(ob && ob->query("npc") && who != (string)ob->query("name") &&
!wizardp(act_ob)) return 0;
if(ob->query("busy"))
{
if(!member_group(this_player()->query("name"),"admin"))
{
write(ob->query("cap_name")+
" is busy right now, please try again later...\n");
return 1;
}
write("["+capitalize(who)+" has the busy flag set]\n");
}
if(ob == this_player())
{
message("tell",
"You tell yourself: "+msg+"\n", this_player() );
// backlog this, I guess :-)
add_backlog("You told yourself: "+msg,ob);
return 1;
}
// check ignore, Leto@Earth reinstated it from local ts @tmi-2
if(!member_group(this_player()->query("name"),"admin"))
{
ignore = ob-> query( "ignore" );
if( pointerp( ignore ) )
{
if(-1 != member_array( this_player()->query("name"), ignore ))
{
write(ob->query("cap_name")+ " is ignoring you.\n");
return 1;
}
}
}
// Do we want an extra idle msg to be added ?
idlem = query_idle(ob) / 60 ;
if(idlem)
{
idles = query_idle(ob) - (idlem * 60);
idlemsg = (string)ob->query("idlemsg");
message("tell",ob->query("cap_name")+" has been idle for "+idlem+
" minutes and "+idles+ " seconds, " , this_player() );
if (!idlemsg) message("tell","but "+subjective(ob->query("gender"))+
" left you no message at all :(\n", this_player() );
else message("tell",possessive(ob->query("gender"))+
" idle message is : "+idlemsg, this_player() );
}
// Ok, we got our conditions, now do the actual tell.
// Leto: don't like the stuff below, it's ugly !
if(!ob)
{
if(ob = find_living(who))
{
message("tell",identify(ob)+" "+identify(this_player())+"\n",
this_player() ) ;
message("tell",(act_ob->query("cap_name") +
" tells you: " + msg) , ob );
add_backlog((act_ob->query("cap_name")+" tells you: "+msg),ob);
message("tell",
("You tell "+capitalize(who)+": "+msg) , this_player() );
ob->set("reply", act_ob->query("name"));
return 1;
}
return 0;
}
// This is where TMI-2 used to send it to local tell_server
//write( TS_D->tell_user(act_ob->query("name"), 0, who, msg) );
{
message("tell",
("You tell "+ob->query("cap_name")+": "+msg+"\n"), this_player() );
message("tell", (act_ob->query("cap_name")+
" tells you: "+ msg+"\n"), ob );
ob->set("reply", act_ob->query("name"));
add_backlog( (act_ob->query("cap_name")+" tells you: "+
msg),ob);
return 1;
}
}
string help() {
return @HelpText
Usage: tell {</last> | <name>[@mud] <message>}
This command allows a user to tell a private message to another player or
other living creature, no matter where they are located on the mud. It is
also possible to tell users on another mud a message by using the <@mudname>
addition to the user's name (ie: tell leto@earthmud Hi).
For mudnames with spaces in them, use dots instead of spaces. eg:
tell leto@some.mud Hi
See also: busy, ignore, idlemsg, harass, say, emote
HelpText;
}
// Emeradii's code to help with scrolling of backlog
// Perrin - March 1996
void add_backlog(string msg,object victim)
{
string *backlog;
int count ;
backlog = victim->query("tell_backlog");
count = sizeof(backlog);
if(undefinedp(victim->query("tell_backlog")))
victim->set("tell_backlog",({}),OWNER_ONLY);
if(count >= BACKLOG_MAX) backlog = backlog[1..9];
msg = replace_string(msg,"tells","told",1);
if(!backlog) backlog = ({ msg }) ;
else backlog = backlog + ({ msg }) ;
victim->set("tell_backlog",backlog,OWNER_ONLY);
}