blob: 539cca1835c8e5eff8f589ccde749c796f3335a9 [file] [log] [blame]
#pragma strict_types, save_types, rtt_checks, pedantic
#pragma no_clone, no_shadow, no_inherit
inherit __DIR__"i_service";
#include <intermud.h>
#include <regexp.h>
#include <living/comm.h>
#include <defines.h>
// we received a reply to one of our messages.
// Note: if response is 0, the peer did not respond (timeout)...
protected void recv_tell_reply(int id, mapping request, mapping response)
{
if(response)
{
if (stringp(response[RECIPIENT]))
{
object ob = find_player(response[RECIPIENT])
|| find_object(response[RECIPIENT]);
if (ob)
{
currentname = capitalize(data[SENDER])+"@"+capitalize(data[NAME]);
ob->ReceiveMsg(regreplace(response[DATA],"[:^print:]|\n","",1),
MT_COMM|MT_FAR, MA_TELL, 0, ME);
currentname = 0;
}
}
else
{
// no response, timeout...
if (request[SENDER] && stringp(request[SENDER]))
{
object ob = find_player(request[SENDER])
|| find_object(request[SENDER]);
if (ob)
ob->ReceiveMsg("Das Mud \'" + request[NAME] +
"\' konnte nicht erreicht werden.\n",
MT_NOTIFICATION, MA_TELL, Name(0), ME);
}
}
}
// we received an intermud tell message
protected void recv_tell(mapping data)
{
object ob;
string msg;
if (data[RECIPIENT] &&
(ob = find_player(lower_case(data[RECIPIENT]))) &&
interactive(ob))
{
if (!stringp(data[SENDER]) || !sizeof(data[SENDER]))
data[SENDER]="<Unknown>";
currentname = data[SENDER] + +"@"+data[NAME];
if (!stringp(data[DATA]) || !sizeof(data[DATA]))
msg="<Nichts>";
else
msg= regreplace(data[DATA],"[:^print:]|\n","",1);
message_prefix=capitalize(data[SENDER])+"@"+data[NAME]+
" teilt Dir mit: ";
int ret = ob->ReceiveMsg(msg, MT_COMM|MT_FAR,
MA_TELL, message_prefix, ME);
currentname = 0;
// Wenn Empfaenger unsichtbar ist, bekommt der Absender immer die gleiche
// Meldung, egal was das Ergebnis von ReceiveMsg() ist.
if (ob->QueryProp(P_INVIS))
{
msg ="\nRoot@"MUDNAME": Spieler "+
capitalize(data[RECIPIENT])+
" finde ich in "MUDNAME" nicht!\n";
}
// Sonst kriegt er eine sinnvolle Angabe.
else
{
switch(ret)
{
case MSG_DELIVERED:
msg = break_string(data[DATA], 78,
"Du teilst "+capitalize(data[RECIPIENT]) + "@"
LOCAL_NAME + " mit: ");
if(ob->QueryProp(P_AWAY))
msg=sprintf("%s%s@"MUDNAME" ist gerade nicht da: %s\n",
msg, ob->name(WER),ob->QueryProp(P_AWAY));
else if ((i=query_idle(ob))>=600)
{ // 10 Mins
string away;
if (i<3600)
away=time2string("%m %M",i);
else
away=time2string("%h %H und %m %M",i);
msg = sprintf("%s%s@"MUDNAME" ist seit %s voellig untaetig.\n",
msg, ob->Name(WER), away);
}
break;
case MSG_BUFFERED:
msg= ob->Name(WER) + " moechte gerade nicht gestoert werden."
"Die Mitteilung wurde von einem kleinen Kobold in Empfang "
"genommen. Er wird sie spaeter weiterleiten!";
break;
case MSG_IGNORED:
case MSG_VERB_IGN:
case MSG_MUD_IGN:
msg = ob->Name(WER) + " hoert gar nicht zu, was Du sagst.";
break;
case MSG_SENSE_BLOCK:
msg = ob->Name(WER) + " kann Dich leider nicht wahrnehmen.";
break;
case MSG_BUFFER_FULL:
msg = ob->Name(WER) + " moechte gerade nicht gestoert werden."
"Die Mitteilung ging verloren, denn der Kobold kann sich "
"nichts mehr merken!";
break;
default:
msg = ob->Name(WER) + " hat Deine Nachricht leider nicht "
"mitbekommen.";
break;
}
}
}
// Spieler nicht gefunden.
else
msg ="\nRoot@"MUDNAME": Spieler "+
capitalize(data[RECIPIENT])+
" finde ich in "MUDNAME" nicht!\n";
INETD->send(data[NAME],
([REQUEST: REPLY, RECIPIENT: data[SENDER],
ID: data[ID],
DATA: msg]), 0);
}
public int send(string name, string mud, string msg)
{
return INETD->send(mud,
([REQUEST: "tell", RECIPIENT: name,
SENDER: getuid(previous_object()),
DATA: msg
]), #'recv_tell_reply);
}
protected void create()
{
INETD->register_service("tell", #'recv_tell);
}
public varargs int remove(int silent)
{
INETD->unregister_service("tell");
destruct(this_object());
}