Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/std/shells/magier/admin.c b/std/shells/magier/admin.c
new file mode 100644
index 0000000..a41d1b7
--- /dev/null
+++ b/std/shells/magier/admin.c
@@ -0,0 +1,428 @@
+// MorgenGrauen MUDlib
+//
+// admin.c
+//
+// $Id: admin.c 8755 2014-04-26 13:13:40Z Zesstra $
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <udp.h>
+#include <wizlevels.h>
+#include <input_to.h>
+
+#define NEED_PROTOTYPES
+#include <magier.h>
+#include <player.h>
+
+inherit "/std/util/cidr";
+
+mixed _query_localcmds()
+{
+ return ({({"udpq","_udpq",0,LEARNER_LVL}),
+ ({"shutdown","shut_down_game",0,ARCH_LVL}),
+ ({"addmaster","_addmaster",0,GOD_LVL}),
+ ({"removemaster","_removemaster",0,GOD_LVL}),
+ ({"addguildmaster", "_addguildmaster", 0, GOD_LVL}),
+ ({"removeguildmaster", "_removeguildmaster", 0, GOD_LVL}),
+ ({"suender","sinners",0,WIZARD_LVL}),
+ ({"banish","banish", 0, WIZARD_LVL}),
+ ({"mbanish","mbanish", 0, WIZARD_LVL}),
+ ({"tbanish","tbanish", 0, WIZARD_LVL}),
+ ({"sbanish","sbanish", 0, WIZARD_LVL})});
+}
+
+static int _udpq(string str)
+{
+ string ret, mud, type;
+
+ if (!(str=_unparsed_args()) || str=="" || sscanf(str,"%s %s",mud,type)<2)
+ {
+ write("Syntax: udpq mud type\n");
+ return 1;
+ }
+ if (member(({"commands","email","hosts","inetd","list","mud_port","time",
+ "version"}),type)==-1)
+ write("TYPEs: commands, email, hosts, inetd, list, mud_port, time, version\n");
+ if (ret=(string)INETD->_send_udp(mud,([SENDER:getuid(), REQUEST:QUERY, DATA:type]),1))
+ write(ret);
+ else
+ write("Anfrage abgeschickt.\n");
+ return 1;
+}
+
+static int shut_down_game(string str)
+{
+ if (!IS_ARCH(this_object()) || this_object()!=this_interactive())
+ return 0;
+ _notify_fail("Du musst einen Grund dafuer angeben.\n");
+ if (!str) return 0;
+ write( "Direkter shutdown mit Grund \""+str+"\"?\n" );
+ input_to("shut_down_game_2",INPUT_PROMPT, "(ja/nein) :", str);
+ return 1;
+}
+
+static int shut_down_game_2(string arg,string str)
+{
+ if (!IS_ARCH(this_object()) || this_object()!=this_interactive())
+ return 0;
+ if( arg!="ja" ) {
+ write( "Shutdown abgebrochen.\n" );
+ } else {
+ shutdown(str);
+ }
+ return 1;
+}
+
+
+static int _addmaster(string str)
+{
+ string master, domain;
+
+ if (!GOD_SECURITY)
+ {
+ write("Das darfst Du nicht!\n");
+ return 1;
+ }
+ _notify_fail("Syntax: addmaster <user> <domain>\n");
+ if (!str) return 0;
+ if (sscanf(str,"%s %s",master,domain)!=2) return 0;
+ if (!master || !domain) return 0;
+ if (!"/secure/master"->add_domain_master(master,domain))
+ write("Hat nicht funktioniert.\n");
+ else
+ write("Ok.\n");
+ return 1;
+}
+
+static int _removemaster(string str)
+{
+ string master, domain;
+
+ if (!GOD_SECURITY)
+ {
+ write("Das darfst Du nicht!\n");
+ return 1;
+ }
+ _notify_fail("Syntax: removemaster <user> <domain>\n");
+ if (!str) return 0;
+ if (sscanf(str,"%s %s",master,domain)!=2) return 0;
+ if (!master || !domain) return 0;
+ if (!"/secure/master"->remove_domain_master(master,domain))
+ write("Hat nicht funktioniert.\n");
+ else
+ write("Ok.\n");
+ return 1;
+}
+
+static int _addguildmaster(string str)
+{
+ string master, guild;
+
+ if (!GOD_SECURITY)
+ {
+ write ("Das darfst Du nicht!\n");
+ return 1;
+ }
+
+ _notify_fail("Synatx: addguildmaster <user> <guild>\n");
+ if (!str) return 0;
+ if (sscanf(str, "%s %s", master, guild)!=2) return 0;
+ if (!master || !guild) return 0;
+ if (!"/secure/master"->add_guild_master(master,guild))
+ write("Hat nicht funktioniert.\n");
+ else
+ write ("Ok.\n");
+ return 1;
+}
+
+static int _removeguildmaster(string str)
+{
+ string master, guild;
+
+ if (!GOD_SECURITY)
+ {
+ write ("Das darfst Du nicht!\n");
+ return 1;
+ }
+ _notify_fail("Syntax: removeguildmaster <user> <guild>\n");
+ if (!str) return 0;
+ if (sscanf(str, "%s %s", master, guild)!=2) return 0;
+ if (!master || !guild) return 0;
+ if (!"/secure/master"->remove_guild_master(master,guild))
+ write("Hat nicht funktioniert.\n");
+ else
+ write("Ok.\n");
+ return 1;
+}
+
+static int sinners(string arg)
+{ string *parts;
+ int i;
+
+ if ( !IS_DEPUTY(this_object()) )
+ return 0;
+
+ arg=_unparsed_args()||arg;
+
+ notify_fail(
+ "Syntax: suender ? => Liste aller Eingetragenen\n"+
+ " suender <name> => Eintraege lesen\n"+
+ " suender +<name> <text> => Eintrag hinzufuegen\n"+
+ " suender -<name> <nr> => Eintrag loeschen\n"+
+ " suender ! => Alle Eintraege dumpen\n"+
+ " suender * => Alle Eintraege anzeigen\n");
+
+ if ( !stringp(arg) || (sizeof(arg)<1) )
+ return 0;
+
+ if ( arg=="?" )
+ {
+ write(call_other("/secure/sinmaster","ListSinners"));
+ return 1;
+ }
+ if ( arg=="!" )
+ {
+ write(call_other("/secure/sinmaster","Dump"));
+ return 1;
+ }
+ if ( arg=="*" )
+ {
+ More((string)call_other("/secure/sinmaster","Dump",1));
+ return 1;
+ }
+
+ if ( (i=sizeof(parts=explode(arg," ")))<1 )
+ return 0;
+
+ if ( parts[0][0..0]=="-" )
+ {
+ if ( i<2 )
+ return 0;
+ write(call_other("/secure/sinmaster","RemoveSin",
+ lowerstring(parts[0][1..]),
+ to_int(parts[1])));
+ }
+ else if ( parts[0][0..0]=="+" )
+ {
+ if ( i<2 )
+ return 0;
+ write(call_other("/secure/sinmaster","AddSin",
+ lowerstring(parts[0][1..]),
+ implode(parts[1..]," ")));
+ }
+ else
+ {
+ if ( i>1 )
+ return 0;
+ write(call_other("/secure/sinmaster","ListSins",
+ lowerstring(parts[0])));
+ }
+ return 1;
+}
+
+static int banish(string str)
+{
+ string grund, name;
+ int force;
+
+ if ( !LORD_SECURITY && !IS_DEPUTY(secure_euid()) )
+ return 0;
+
+ if ( !str || !stringp(str) || !sizeof(str) ) {
+ write("Syntax: banish [-f] <name> [<grund>]\n");
+ return 1;
+ }
+
+ str = _unparsed_args();
+
+ if ( explode(str, " ")[0] == "-f" ){
+ str = implode( explode(str, " ")[1..], " " );
+ force = 1;
+ }
+
+ if ( sscanf( str, "%s %s", name, grund ) != 2 )
+ name=str;
+
+ if ( !name || !sizeof(name) ){
+ write("Syntax: banish [-f] <name> [<grund>]\n");
+ return 1;
+ }
+
+ name=lower_case(name);
+ "/secure/master"->BanishName( name, grund, force );
+ return 1;
+}
+
+static int mbanish(string str)
+{
+ string grund, name, *namen, txt, *dummy;
+ mapping list;
+ int i;
+
+ if ( !IS_DEPUTY(secure_euid()) )
+ return 0;
+
+ _notify_fail( "Syntax: mbanish <name> [<grund>]\n" );
+
+ if ( !str || !stringp(str) || !sizeof(str) ){
+ if ( !mappingp(list = (mapping)"/secure/merlin"->MBanishList()) ||
+ !(i = sizeof(list)) ){
+ write( "Momentan ist kein Spieler auf der mbanish-Liste.\n" );
+ return 1;
+ }
+
+ txt = " Name | gebanisht von | Grund\n" +
+ "=============================================================" +
+ "==================\n";
+
+ namen = sort_array( m_indices(list), #'</*'*/ );
+
+ for ( ; i--; ){
+ dummy = explode( break_string( list[namen[i],0] ||
+ "-- keine Begruendung --", 45 ),
+ "\n" ) - ({""});
+
+ txt += sprintf( " %-11s | %-11s | %s\n",
+ capitalize( namen[i] ),
+ capitalize( list[namen[i],1] || "" ),
+ capitalize( implode( dummy, "\n |"
+ " | " ) ) );
+ }
+
+ More(txt);
+
+ return 1;
+ }
+
+ if ( sscanf( str, "%s %s", name, grund ) !=2 )
+ name = str;
+
+ if ( !name || !sizeof(name) )
+ return 0;
+
+ name = lower_case(name);
+
+ if ( !grund || !stringp(grund) || lower_case(grund) != "loeschen" ){
+ "/secure/merlin"->MBanishInsert( name, grund, this_interactive() );
+ write( "Du setzt "+capitalize(name)+" auf die MBanish-Liste.\n" );
+ }
+ else{
+ if ( !ARCH_SECURITY ){
+ write( "Das duerfen nur Erzmagier.\n" );
+ return 1;
+ }
+ "/secure/merlin"->MBanishDelete( name );
+ write( "Du loescht "+capitalize(name)+" von der MBanish-Liste.\n" );
+ }
+
+ return 1;
+}
+
+
+static int tbanish( string str )
+{
+ string name;
+ int days;
+
+ if ( !IS_DEPUTY(secure_euid()) )
+ return 0;
+
+ _notify_fail("Syntax: tbanish <name> <tage>\n");
+
+ if ( !str || !stringp(str) || !sizeof(str) )
+ return 0;
+
+ if ( sscanf(str,"%s %d",name,days) != 2 )
+ return 0;
+
+ if ( !name || !sizeof(name) )
+ return 0;
+
+ name = lower_case(name);
+
+ if ( !"/secure/master"->TBanishName( name, days ) )
+ return 1;
+
+ if ( !days )
+ write( "Okay, keine Spielpause fuer "+capitalize(name)+" mehr.\n" );
+ else
+ write( "Du verpasst "+capitalize(name)+" eine Spielpause fuer "+
+ (days>0 ? days+" Tage" : "laaaange Zeit")+".\n" );
+ return 1;
+}
+
+static int sbanish( string str )
+{
+ string ip;
+ int days;
+ mapping sites;
+
+ // Mindestens L26 fuer diesen Befehl
+ if ( secure_level() <= DOMAINMEMBER_LVL )
+ return 0;
+
+ if ( !str || !stringp(str) || !sizeof(str) ){
+ if ( !sizeof(sites = (mapping)MASTER->SiteBanish( 0, 0 )) ){
+ write( "Es sind zur Zeit keine Adressen gesperrt!\n" );
+ return 1;
+ }
+
+ ip = " Adresse | gesperrt bis | gesperrt "
+ + "durch\n========================================================"
+ + "==============\n";
+
+ int *keys = sort_array( m_indices(sites), #'</*'*/ );
+
+ foreach(int key : keys) {
+ ip += sprintf( " %:15-s | %:27-s | %-s\n",
+ IPv4_int2addr(key),
+ sites[key] > 0 ? dtime(sites[key]) :
+ "St. Nimmerleinstag",
+ capitalize(sites[key, 1]) );
+ }
+ write( ip + "\n" );
+ return 1;
+ }
+
+ _notify_fail("Syntax: sbanish <numerische ip> <tage>\n");
+
+ if ( sscanf( this_player()->_unparsed_args(), "%s %d", ip, days ) != 2 )
+ return 0;
+
+ if ( !ip || !sizeof(ip) )
+ return 0;
+
+// _notify_fail( "Ungueltiges Adress-Format!\n" );
+
+ if ( !days ){
+ int res=(int)MASTER->SiteBanish(ip, 0);
+ if ( res == 1 )
+ printf( "Die Adresse '%s' ist jetzt nicht mehr gesperrt.\n",
+ ip );
+ else if ( res == 0 )
+ printf( "Die Adresse '%s' war gar nicht gesperrt!\n",
+ ip );
+ else
+ printf( "Du darfst nur eigene Sperrungen wieder aufheben!\n" );
+ }
+ else {
+ int res;
+ if ( days != 1 && !IS_DEPUTY(secure_euid()) )
+ write( "Du darfst Adressen nur fuer einen Tag sperren!\n" );
+ else if ( (res = (int)MASTER->SiteBanish(ip, days)) == 1 )
+ printf( "Die Adresse '%s' ist jetzt fuer %s gesperrt.\n",
+ ip, (days > 1 ? sprintf( "%d Tage", days ) :
+ (days > 0 ? "einen Tag" : "immer")) );
+ else if ( res == -1 )
+ write( "Du darfst " + (LORD_SECURITY ? "255 IP-Adressen"
+ : "nur einzelne IP-Adressen") + " sperren!\n" );
+ else if ( res == -2 )
+ write( "Du hast schon genug Adressen gesperrt!\n" );
+ }
+
+ return 1;
+}
+