Weitgehender Neubau auf intermud-2.5.
Benutzt moderne LDMud-3.5-Sprachmittel wie structs.
diff --git a/secure/inetd/tell.c b/secure/inetd/tell.c
new file mode 100644
index 0000000..539cca1
--- /dev/null
+++ b/secure/inetd/tell.c
@@ -0,0 +1,160 @@
+#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());
+}
+
+