Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/secure/udp/tell.c b/secure/udp/tell.c
new file mode 100644
index 0000000..7b1ab61
--- /dev/null
+++ b/secure/udp/tell.c
@@ -0,0 +1,118 @@
+// MorgenGrauen MUDlib
+//
+// tell.c
+//
+// $Id: tell.c 8755 2014-04-26 13:13:40Z Zesstra $
+
+#include <config.h>
+#include <udp.h>
+#include <properties.h>
+
+#ifdef ZEBEDEE
+#include <system.h>
+inherit "/sys/format";
+#elif !defined(INETD)
+#define INETD "/secure/inetd"
+#endif
+
+
+void udp_tell(mapping data) {
+ object ob;
+ string message_string, message_prefix, away;
+ int i,re;
+ string *message_array;
+
+ if (data[RECIPIENT] &&
+ (ob = find_player(lower_case(data[RECIPIENT]))) &&
+ interactive(ob)) {
+
+ if (!stringp(data[SENDER]) || !sizeof(data[SENDER]))
+ data[SENDER]="<Unknown>";
+ if (!stringp(data[DATA]) || !sizeof(data[DATA]))
+ data[DATA]="<Nichts>";
+
+ data[SENDER]=
+ implode(filter(explode(data[SENDER], ""),
+ #'>=,/*'*/ " "), "");
+ data[DATA]=
+ implode(filter(explode(data[DATA], ""),
+ #'>=,/*'*/ " "), "");
+ message_prefix=capitalize(data[SENDER])+"@"+data[NAME]+
+ " teilt Dir mit: ";
+ message_string=break_string(data[DATA],78,message_prefix,0);
+
+ /* Die Anzahl der Leerzeilen am Ende eines tm's scheint nicht genormt */
+ while(message_string[<1]=='\n')message_string=message_string[0..<2];
+ message_string += "\n";
+
+ re = ob->Message("\n"+message_string, MSGFLAG_RTELL);
+
+ if (!ob->QueryProp(P_INVIS)){
+ /* Erst testen, ob die Meldung ueberhaupt angekommen ist! */
+ if(re==MESSAGE_DEAF)
+ message_string=sprintf("%s@"MUDNAME" ist momentan leider taub.\n",
+ capitalize(getuid(ob)));
+ else if(re==MESSAGE_IGNORE_YOU)
+ message_string=sprintf("%s@"MUDNAME" ignoriert Dich.\n",
+ capitalize(getuid(ob)));
+ else if(re==MESSAGE_IGNORE_MUD)
+ message_string=sprintf("%s@"MUDNAME" ignoriert das Mud '%s'.\n",
+ capitalize(getuid(ob)),
+ data[NAME]);
+ else {
+ /* Erst dann die Erfolgs-Rueckmeldung abschicken */
+ message_prefix="Du teilst "+capitalize(data[RECIPIENT]) + "@"
+ LOCAL_NAME + " mit: ";
+ message_string=break_string(data[DATA],78,message_prefix,0);
+ if(ob->QueryProp(P_AWAY))
+ message_string=sprintf("%s%s@"MUDNAME" ist gerade nicht "
+ "da: %s\n",
+ message_string,
+ ob->name(WER),
+ ob->QueryProp(P_AWAY));
+ else if ((i=query_idle(ob))>=600){ // 10 Mins
+ if (i<3600) away=time2string("%m %M",i);
+ else away=time2string("%h %H und %m %M",i);
+ message_string=
+ sprintf("%s%s@"MUDNAME" ist seit %s voellig untaetig.\n",
+ message_string,
+ ob->Name(WER),
+ away);
+ }
+ switch(re) {
+ case MESSAGE_CACHE:
+ message_string +=
+ sprintf("%s@"MUDNAME" moechte gerade nicht gestoert werden.\n"+
+ "Die Mittelung wurde von einem kleinen Kobold in Empfang"+
+ "genommen.\nEr wird sie spaeter weiterleiten.\n",
+ capitalize(getuid(ob)));
+ break;
+ case MESSAGE_CACHE_FULL:
+ message_string +=
+ sprintf("%s@"MUDNAME" moechte gerade nicht gestoert werden.\n"+
+ "Die Mitteilung ging verloren, denn der Kobold kann sich "+
+ "nichts mehr merken.\n",
+ capitalize(getuid(ob)));
+ break;
+ }
+ }
+ }
+ else message_string="\nRoot@"MUDNAME": Spieler "+
+ capitalize(data[RECIPIENT])+
+ " finde ich in "MUDNAME" nicht!\n";
+ INETD->_send_udp(data[NAME],
+ ([ REQUEST: REPLY,
+ RECIPIENT: data[SENDER],
+ ID: data[ID],
+ DATA: "\n"+message_string ]) );
+ }
+ else
+ INETD->_send_udp(data[NAME],
+ ([ REQUEST: REPLY,
+ RECIPIENT: data[SENDER],
+ ID: data[ID],
+ DATA: sprintf("Root@"MUDNAME": Spieler %s finde "+
+ "ich in "MUDNAME" nicht!\n",
+ capitalize(data[RECIPIENT]))
+ ]) );
+}