Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/obj/tools/newstool.c b/obj/tools/newstool.c
new file mode 100644
index 0000000..0e67197
--- /dev/null
+++ b/obj/tools/newstool.c
@@ -0,0 +1,335 @@
+inherit "std/thing";
+
+#include <properties.h>
+#include <language.h>
+#include <config.h>
+#include <news.h>
+#include <defines.h>
+
+#define UA PL->_unparsed_args()
+
+void create()
+{
+  string str;
+  if (!clonep(this_object())) return;
+  ::create();
+  SetProp(P_LONG,"Ein News-Gruppen-Tool.\n\
+Befehle: addg      <grname> <ownername>   : Gruppe erzeugen\n\
+         removeg   <grname>               : Gruppe loeschen\n\
+         addw      <grname> <username>    : Schreibberechtigten eintragen\n\
+         removew   <grname> <username>    : Schreibberechtigten austragen\n\
+         addd      <grname> <username>    : Loeschberechtigten eintragen\n\
+         removed   <grname> <username>    : Loeschberechtigten austragen\n\
+         addr      <grname> <username>    : Leseberechtigten eintragen\n\
+         remover   <grname> <username>    : Leseberechtigten austragen\n\
+         ginfo     <grname>               : Info ueber Gruppe abfragen\n\
+         setexpire <grname> <tage>        : Expiretime setzen\n\
+         setmaxmsg <grname> <anz>         : Maxmsg setzen\n\
+         setg <grname> <loeschlev> <schreiblev> <leselev> <maxmsg> <expire>\n");
+  str=capitalize(((str=getuid(this_player()))[<1]=='s'||str[<1]=='x'||
+		  str[<1]=='z')?str+="'":str+="s");
+  SetProp(P_SHORT,str+" NewsTool");
+  SetProp(P_NAME,str+" NewsTool");
+  SetProp(P_GENDER,NEUTER);
+  SetProp(P_ARTICLE,0);
+  AddId("newstool");
+  AddId("newsgruppentool");
+  AddId("news-gruppen-tool");
+  SetProp(P_AUTOLOADOBJ,1);
+  SetProp(P_NODROP,1);
+}
+
+void init()
+{
+  add_action("addg","addg");
+  add_action("removeg","removeg");
+  add_action("addw","addw");
+  add_action("removew","removew");
+  add_action("addd","addd");
+  add_action("removed","removed");
+  add_action("addr","addr");
+  add_action("remover","remover");
+  add_action("setg","setg");
+  add_action("setexpire","setexpire");
+  add_action("expire","expire");
+  add_action("ginfo","ginfo");
+  add_action("setmaxmsg","setmaxmsg");
+}
+
+int addr(string str)
+{
+  mixed *arr;
+  string st1, st2;
+  
+  if ((str=UA)=="" || sscanf(str,"%s %s",st1,st2) !=2){
+    write("addr <groupname> <username>\nAnschliessend darf der User unabhaengig vom Wizlevel die Gruppe lesen.\n");
+    return 1;
+  }
+  
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->AddAllowed(st1,({}),({}),arr)){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int remover(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("remover <gruppenname> <username>\nDanach darf der User die Gruppe nur noch lesen, wenn sein Wizlevel dies erlaubt.\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->RemoveAllowed(st1,({}),({}),arr)){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int addd(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("addd <gruppe> <user>\nUser darf Artikel loeschen (unabh vom Wizlevel)\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  	switch ("/secure/news"->AddAllowed(st1,arr,({}),({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int removed(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("removed <gruppe> <user>\nUser darf nur noch Artikel loeschen, wenn sein Wizlevel das erlaubt.\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->RemoveAllowed(st1,arr,({}),({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int addw(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("addw <gruppe> <user>\nUser darf Artikel schreiben (unabh vom Wizlevel)\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->AddAllowed(st1,({}),arr,({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int removew(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("removew <gruppe> <user>\nUser darf nur noch Artikel schreiben, wenn sein Wizlevel dies erlaubt.\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->RemoveAllowed(st1,({}),arr,({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int setg(string str)
+{
+  string name;
+  int dlevel, wlevel, rlevel, maxmessages, expire;
+
+  if (!(str=UA) ||
+      sscanf(str,"%s %d %d %d %d %d",name,dlevel,wlevel,rlevel,maxmessages,expire) != 6) {
+    write("setg <gruppe> <loeschlevel> <schreiblevel> <leselevel> <maxmessages> <expire>\nGruppenparameter setzen, Bedeutung (Defaultwerte in Klammern):\n\
+    name              : Der Name der Newsgroup\n\
+    loeschlevel  (20) : Wizlevel, ab dem User Artikel loeschen koennen\n\
+    schreiblevel ( 0) : Wizlevel, ab dem User Artikel schreiben koennen\n\
+    leselevel    ( 0) : Wizlevel, ab dem User Artikel lesen koennen\n\
+    maxmessages  (40) : Maximale Anzahl Artikel in einer Newsgruppe\n\
+    expire       (-1) : Expiretime in Tagen, -1 = nie\n");
+    return 1;
+  }
+  expire=86400*expire;
+  switch("/secure/news"->SetGroup(name, dlevel, wlevel, rlevel, maxmessages,expire)){
+    case 1: write("Ok\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group\n"); break;
+  }
+  return 1;
+}
+
+int setexpire(string str)
+{
+  string name;
+  int expire;
+  mixed *gr;
+
+  if (!(str=UA)||sscanf(str,"%s %d",name,expire)!=2)
+  {
+    write("setexpire <gruppe> <tage>\n");
+    return 1;
+  }
+  expire=86400*expire;
+  if (!pointerp((gr="/secure/news"->GetGroup(name))))
+  {
+    write("Get group error\n");
+    return 1;
+  }
+  switch("/secure/news"->SetGroup(name, gr[G_DLEVEL], gr[G_WLEVEL], gr[G_RLEVEL], gr[G_MAX_MSG],expire)){
+    case 1: write("Ok\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group\n"); break;
+  }
+  return 1;
+}
+
+int setmaxmsg(string str)
+{
+  string name;
+  int maxmsg;
+  mixed *gr;
+  
+  if (!(str=UA)||sscanf(str,"%s %d",name,maxmsg)!=2)
+  {
+    write("setexpire <gruppe> <tage>\n");
+    return 1;
+  }
+  if (!pointerp((gr="/secure/news"->GetGroup(name))))
+  {
+    write("Get group error\n");
+    return 1;
+  }
+  switch("/secure/news"->SetGroup(name, gr[G_DLEVEL], gr[G_WLEVEL], gr[G_RLEVEL], maxmsg, gr[G_EXPIRE])){
+    case 1: write("Ok\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group\n"); break;
+  }
+  return 1;
+}
+
+int ginfo(string str)
+{
+  mixed *gr;
+  int i;
+  
+  if (!(str=UA))
+  {
+    write("Usage: ginfo <gname>\n");
+    return 1;
+  }
+  if (!pointerp((gr="/secure/news"->GetGroup(str))))
+  {
+    write("Get group error\n");
+    return 1;
+  }
+  if (gr[11]==-1)
+  {
+    write("Group \""+gr[0]+"\" does not exist.\n");
+    return 1;
+  }
+        //         1         2         3         4         5         6         7 
+        //123456789012345678901234567890123456789012345678901234567890123456789012345678
+  printf("------------------------------------------------------------------------------\n");
+  
+  printf("Rubrik  : %s (%s) Savefile: %s\n\n",gr[0],capitalize(gr[1]),gr[2]);
+  printf("Messages: %i/%i    Expire: %i Tage.\n\n",
+		  (pointerp(gr[11])?sizeof(gr[11]):0),gr[10],gr[3]/86400);  
+  
+  printf( break_string((sizeof(gr[6])?"("+(CountUp(map(gr[6],#'capitalize)))+")":" "), 78, "Readers : "+gr[9]+" ",16));
+  
+  printf( break_string((sizeof(gr[5])?"("+(CountUp(map(gr[5],#'capitalize)))+")":" "), 78, "Writers : "+gr[8]+" ",16));
+  
+  printf( break_string((sizeof(gr[4])?"("+(CountUp(map(gr[4],#'capitalize)))+")":" "), 78, "Deleters: "+gr[7]+" ",16));
+  
+  printf("------------------------------------------------------------------------------\n");
+  return 1;
+}
+    
+int removeg(string str)
+{
+  if (!(str=UA))
+  {
+    write("removeg <gruppenname>\nGruppe LOESCHEN.\n");
+    return 0;
+  }
+  switch("/secure/news"->RemoveGroup(str)){
+    case 1: write("Ok. Bitte nicht vergessen, das Savefile der Newsgroup von Hand zu entfernen !\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group"); break;
+  }
+  return 1;
+}
+
+int addg(string str)
+{
+  string name, owner;
+
+  if (!(str=UA) || sscanf(str,"%s %s",name,owner)!=2)
+  {
+    write("addg <gruppe> <user>\nGruppe anlegen, <user> wird Besitzer der Gruppe\n");
+    return 1;
+  }
+  switch ("secure/news"->AddGroup(name, owner)){
+    case 1: write("Ok.\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission.\n"); break;
+    case -2: write("Group already there\n"); break;
+    case -3: write("Owner not found.\n"); break;
+    case -4: write("Savefile already in use.\n"); break;
+  }
+  return 1;
+}
+  
+int expire()
+{
+  "/secure/news"->expire_all();
+  write("Expiring startet.\n");
+  return 1;
+}