Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/std/newsclient.c b/std/newsclient.c
new file mode 100644
index 0000000..b047e41
--- /dev/null
+++ b/std/newsclient.c
@@ -0,0 +1,244 @@
+// MorgenGrauen MUDlib
+//
+// newsclient.c -- Nachrichtenbretter
+//
+// $Id: newsclient.c 8349 2013-02-04 21:15:28Z Zesstra $
+
+/* 1992 JOF */
+#pragma strong_types
+#pragma save_types
+#pragma no_clone
+#pragma range_check
+#pragma pedantic
+
+inherit "/std/thing";
+inherit "/std/more";
+
+#include <config.h>
+#include <properties.h>
+#include <news.h>
+#include <wizlevels.h>
+#include <language.h>
+#include <defines.h>
+#include <input_to.h>
+
+string GROUP;
+string writer;
+string usemsg;
+
+void SetInUseMessage(string str)
+{
+ usemsg=str;
+}
+
+string SetGroup(string str)
+{
+ return GROUP=str;
+}
+
+protected void create()
+{
+ thing::create();
+ writer=="";
+
+}
+
+void thinginit() /* If someone doesnt want our add_action he may call this */
+{
+ thing::init();
+}
+
+varargs int remove(int silent)
+{
+ return thing::remove();
+}
+
+void init()
+{
+ thing::init();
+ add_action("schreib","schreib",1);
+ add_action("lies","lies");
+ add_action("loesche","loesch",1);
+}
+
+string ladj(string str, int weite)
+{
+ return((str+" ")[0..weite-1]);
+}
+
+string QueryLong()
+{
+ mixed *messages;
+ string desc;
+ int i;
+
+ desc=QueryProp(P_LONG);
+ desc+="\n";
+ messages=NEWSSERVER->GetNotes(GROUP);
+ if (!pointerp(messages) || !sizeof(messages))
+ return desc+"Zur Zeit befinden sich keine Nachrichten am Brett.\n";
+ if (sizeof(messages)==1)
+ desc+="Zur Zeit befindet sich eine Nachricht am Brett:\n\n";
+ else
+ desc+="Zur Zeit befinden sich "+sizeof(messages)+" Nachrichten am Brett:\n\n";
+ for (i=0;i<sizeof(messages);i++)
+ {
+ if (i<9) desc+=" ";
+ desc+=""+(i+1)+". ";
+ desc+=(ladj(messages[i][M_TITLE],45)+" ("+
+ ladj(messages[i][M_WRITER]+",",13)+
+ dtime(messages[i][M_TIME])[4..24] + ")\n");
+ }
+ return desc;
+}
+
+varargs string long(int mode)
+{
+ return QueryLong();
+}
+
+mixed *message;
+
+int schreib(string str)
+{
+ int err;
+
+ if (!this_interactive() || !this_interactive()->query_real_name()) return 0;
+ if (writer)
+ {
+ write("Das geht im Moment nicht, da "+capitalize(writer)+" gerade an diesem Brett schreibt.\n");
+ if (usemsg) write(usemsg+"\n");
+ return 1;
+ }
+ _notify_fail("Du musst einen Titel fuer die Notiz angeben !\n");
+ if (!str) return 0;
+ switch (err=NEWSSERVER->AskAllowedWrite(GROUP))
+ {
+ case 1: break;
+ case -1: write("Du darfst keine Notes an dieses Brett heften !\n"); return 1;
+ case -3: write("Das Brett ist leider voll !\n"); return 1;
+ default: write("Interner Fehler "+err+", Erzmagier verstaendigen !\n"); return 1;
+ }
+ writer=this_interactive()->query_real_name();
+ message=allocate(6);
+ message[M_BOARD]=GROUP;
+ message[M_TITLE]=str;
+ message[M_MESSAGE]="";
+ write("Ok, beende Deine Notiz mit '**' oder brich sie mit '~q' ab !\n");
+ if (IS_WIZARD(this_player()))
+ write("Als Magier"+(this_player()->QueryProp(P_GENDER)==FEMALE ? "in" : "")+
+ " kannst Du per '~r<filename>' ein File in die Notiz einlesen.\n");
+ input_to("get_note_line", INPUT_PROMPT, ":");
+ return 1;
+}
+
+int get_note_line(string str)
+{
+ int err;
+ if (str=="**" || str=="~.")
+ {
+ writer=0;
+ switch (err=(NEWSSERVER->WriteNote(message)))
+ {
+ case 1: write("Ok, Nachricht aufgehaengt.\n");
+ say(message[M_WRITER]+" hat eine Nachricht ans Brett gehaengt.\n");
+ return 1;
+ case -1: write("Du darfst leider keine Nachrichten hier aufhaengen.\n");
+ return 1;
+ case -3: write("Das Brett ist leider voll !\n");
+ return 1;
+ default: write("Interner Fehler "+err+" aufgetreten ! Bitte Erzmagier verstaendigen.\n");
+ return 1;
+ }
+ }
+ if (str=="~q")
+ {
+ writer=0;
+ write("Notiz nicht angeheftet.\n");
+ return 1;
+ }
+ if (str[0..1]=="~r" && IS_WIZARD(this_player())) {
+ str=str[2..<1];
+ if (str[0]==' ') str=str[1..<1];
+ if (!str || catch(err=file_size(str);publish) || err<0) {
+ write("File nicht gefunden.\n");
+ input_to("get_note_line", INPUT_PROMPT, ":");
+ return 1;
+ }
+ str=read_file(str);
+ if (!str){
+ write("Zu gross!\n");
+ input_to("get_note_line", INPUT_PROMPT, ":");
+ return 1;
+ }
+ write("Ok.\n");
+ }
+ if (message[M_MESSAGE] && message[M_MESSAGE]!="") message[M_MESSAGE]+="\n";
+ message[M_MESSAGE]+=str;
+ input_to("get_note_line", INPUT_PROMPT, ":");
+ return 1;
+}
+
+int lies(string str)
+{
+ int num;
+ mixed *messages;
+
+ if (!str || str=="" || sscanf(str,"%d",num)!=1 || num<=0)
+ {
+ _notify_fail("WELCHE Nachricht willst Du lesen ?\n");
+ return 0;
+ }
+ num--;
+ messages=(NEWSSERVER->GetNotes(GROUP));
+ if (sizeof(messages)<=num)
+ {
+ _notify_fail("So viele Nachrichten sind da nicht !\n");
+ return 0;
+ }
+ this_player()->More(messages[num][M_TITLE]+" ("+messages[num][M_WRITER]+", "+
+ dtime(messages[num][M_TIME])[5..26] + "):\n" +
+ messages[num][M_MESSAGE]);
+ return 1;
+}
+
+int loesche(string str)
+{
+ int num;
+
+ if (!str || str=="" || sscanf(str,"%d",num)!=1 || num<=0)
+ {
+ _notify_fail("WELCHE Nachricht willst Du loeschen ?\n");
+ return 0;
+ }
+ num--;
+ switch (NEWSSERVER->RemoveNote(GROUP, num)){
+ case 1: write("Ok.\n");
+ say(this_player()->name()+" entfernt eine Nachricht vom Brett.\n");
+ return 1;
+ case -1: write("Das darfst Du nicht.\n");
+ say(this_player()->name()+" versucht, eine Nachricht vom Brett zu reissen.\n");
+ return 1;
+ case -3: write("So viele Nachrichten sind da nicht !\n");
+ return 1;
+ default: write("Interner Fehler. Bitte Erzmagier verstaendigen !\n");
+ return 1;
+ }
+ return 0;
+}
+
+void Crumble()
+{
+ if (environment() && living(environment()))
+ return;
+ say(capitalize(name(WER))+" zerfaellt zu Staub, der sich sofort verteilt.\n");
+ write(capitalize(name(WER))+" zerfaellt zu Staub, der sich sofort verteilt.\n");
+ remove();
+}
+
+varargs int move(object target,mixed method)
+{
+ if (objectp(target)&&!living(target)&&environment()&&living(environment()))
+ call_out("Crumble",30+random(30));
+ return ::move(target, method);
+}