// MorgenGrauen MUDlib
//
// channel.c -- channel client
//
// $Id: channel.c 9404 2015-12-13 00:21:44Z Zesstra $
#pragma strong_types
#pragma save_types
#pragma range_check
#pragma no_clone

#define NEED_PROTOTYPES
#include <util.h>
#include <thing/properties.h>
#include <living/comm.h>
#include <player.h>
#include <player/comm.h>
#include <daemon.h>
#include <player/gmcp.h>
#undef NEED_PROTOTYPES

#include <wizlevels.h>
#include <defines.h>
#include <properties.h>
#include <sys_debug.h>
#include <regexp.h>

#define P_CHANNEL_SHORT  "short_channels"

#define CHANNELCMDS      "[#@%$&()<>a-zA-Z0-9\\-]"

#define DEFAULT_CHANNELS ({"Abenteuer", "Anfaenger", "Grats", "Tod", "ZT"})
#define DEFAULT_SHORTCUTS \
([                     \
 "b":"Abenteuer",      \
 "a":"Allgemein",      \
 "B":"Beileid",        \
 "q":"D-chat",         \
 "G":"Grats",          \
 "M":"Moerder",        \
 "h":"Seher",          \
 "T":"Tod",            \
])

#define WIZARD_SHORTCUTS \
([                     \
 "P":"D-code",         \
 "D":"Debug",          \
 "O":"Intercode",      \
 "I":"Intermud",       \
 "m":"Magier",         \
])

// TODO: <shortcut> wird eigentlich nur in getChannel() sinnvoll verwendet
// Koennte man an sich komplett einsparen und dort wie ueberall sonst auch
// einfach nur mit P_CHANNEL_SHORT arbeiten.
private nosave mapping shortcut;
private nosave int c_status;

void create()
{
  Set(P_CHANNELS, SAVE, F_MODE);
  Set(P_CHANNELS, DEFAULT_CHANNELS);
  Set(P_SWAP_CHANNELS, SAVE, F_MODE);
  Set(P_STD_CHANNEL, "Allgemein");
  Set(P_STD_CHANNEL, SAVE, F_MODE);
  Set(P_CHANNEL_SHORT, SAVE, F_MODE);
  Set(P_CHANNEL_SHORT, DEFAULT_SHORTCUTS
      + (IS_LEARNER(ME) ? WIZARD_SHORTCUTS : ([])));
}

static <int|string>** _query_localcmds()
{
  return ({({"-","ChannelParser", 1, 0}),
           ({"ebene", "ChannelAdmin", 0, 0}),
           ({"ebenen", "ChannelAdmin", 1, 0}),
         });
}

string* RegisterChannels()
{
  if (extern_call() &&
      previous_object() != find_object(CHMASTER))
    return 0;

  c_status = 0;
  shortcut = QueryProp(P_CHANNEL_SHORT);
  SetProp(P_CHANNELS, map(QueryProp(P_CHANNELS) || ({}), #'lower_case));

  closure cl = symbol_function("join", CHMASTER);
  string* err;
  if (closurep(cl))
  {
    err = filter(QueryProp(P_CHANNELS), cl, ME);
  }
  if (QueryProp(P_LEVEL) < 5)
    return err;

  // CHMASTER->new() gibt bei Erfolg 0 zurueck, d.h. es bleiben
  // alle Elemente erhalten, deren Channel nicht erstellt werden konnten.
  // Die werden an die Aufrufer zurueckgegeben.
  return filter(err, "new", CHMASTER, ME);
}

string* RemoveChannels()
{
  if (extern_call() &&
      previous_object() != find_object(CHMASTER))
    return 0;

  string* err = ({});

  if (!c_status)
    c_status = 1;
  else
    return err;

  closure cl = symbol_function("leave", CHMASTER);
  if (closurep(cl))
  {
    err = filter(QueryProp(P_CHANNELS), cl, ME);
    SetProp(P_CHANNELS, QueryProp(P_CHANNELS) - err);
  }
  return err;
}

varargs private string getName(string|object|closure who, int fall) {
  // Objekt zur Closure raussuchen. <o> ist danach entweder jenes Objekt,
  // oder aber <who> selbst, das Objekt oder String sein kann.
  //
  // query_closure_object() KANN auch 0 oder -1 zurueckgeben. In beiden
  // Faellen fuehrt das hier zu einem Laufzeit-Typfehler, weil ein Integer
  // bzw. die urspruengliche Closure zugewiesen wird. Diesen Fall abzufangen
  // und separat zu behandeln, hilft nicht, weil es auch keine alternative
  // Moeglichkeit gibt, <who> in verwendbare Daten umzuwandeln, denn das ist
  // ja offenbar eine kaputte Closure. Dieser Fall ist ausserdem anscheinend
  // so exotisch, dass wir vorerst auf Absicherungen mittels catch()
  // verzichten.
  string|object o = closurep(who) ? query_closure_object(who) : who;

  // Ist es ein String, pruefen wir, ob es vielleicht ein Objektname ist,
  // indem wir es in ein Objekt umzuwandeln versuchen. Schlaegt das fehl,
  // schreiben wir <who> wieder zurueck, so dass <o> wieder der urspruengliche
  // String ist.
  if (stringp(o) && sizeof(o))
    o = find_object(o) || who;

  // Objekte
  if (objectp(o))
  {
    // Magier sehen unsichtbare nicht nur als "Jemand"
    if (o->QueryProp(P_INVIS) && IS_LEARNING(ME))
      return "("+capitalize(getuid(o))+")";
    // Froesche mit Namen versorgen.
    if (o->QueryProp(P_FROG))
      return "Frosch "+capitalize(getuid(o));
    // Default (Unsichtbare als "Jemand" (s. Name()))
    return o->Name(fall, 2)||"<Unbekannt>";
  }
  // Strings
  else if (stringp(o) && sizeof(o))
  {
    if (o[0] == '/')
    {
      // unsichtbare Objekte...
      int p = strstr(o, "$");
      if (p != -1)
      {
        // Magier im Magiermodus kriegen den Realnamen, andere nicht.
        if (IS_LEARNING(ME))
          return o[1..p-1];
        else
          return o[p+1..];
      }
      else // doch nicht unsichtbar
        return (fall == WESSEN ? o+"s" : o);
    }
    else
      // nicht unsichtbar
      return (fall == WESSEN ? o+"s" : o);
  }
  // Fall-through
  return "<Unbekannt>";
}

// <nonint> unterdrueckt die Ausgabe an den Spieler und liefert den Text
// zurueck. Wird nur fuer die Ebenenhistory benutzt.
string ChannelMessage(<string|object|int>* msg, int nonint)
{
  string channel_message;
  string channel = msg[0];

  // Wenn eine Ebenenmeldung ausgegeben werden soll, ist msg[1] ein Objekt,
  // im Fall der History aber ein String. Daher wird <sender> als Union
  // deklariert. Das ist unproblematisch, weil die beiden Datentypen
  // komplett getrennte Wege nehmen: ein Objekt wird an ReceiveMsg()
  // durchgereicht (Ebenenmeldung). Ein String wird direkt in die Meldung
  // (History) eingebaut, diese an den ChannelParser() zurueckgegeben, der
  // sie via More() ausgibt.
  string|object sender = msg[1];
  string message = msg[2];
  int msg_type = msg[3];

  if (previous_object() != find_object(CHMASTER) &&
      previous_object() != ME )
    return 0;

  string sender_name = getName(sender, msg_type == MSG_GEMOTE ? WESSEN : WER);
  int prepend_indent_flag =
        QueryProp(P_MESSAGE_PREPEND) ? BS_PREPEND_INDENT : 0;

  switch (msg_type)
  {
    case MSG_EMPTY:
      channel_message= message+"\n";
      break;
    case MSG_GEMOTE:
    case MSG_EMOTE:
      channel_message = break_string(sender_name + " "+ message+"]", 78,
                          sprintf("[%s:", channel),
                          BS_INDENT_ONCE|prepend_indent_flag);
      break;
    case MSG_SAY:
    default:
      string presay = sprintf("[%s:%s] ", channel, sender_name);
      channel_message = break_string(message, max(78,sizeof(presay)+10),
                          presay, prepend_indent_flag);
      break;
  }

  if (nonint)
    return channel_message;

  // Wenn GMCP sich um Uebertragung der Nachricht kuemmert, wird ReceiveMsg()
  // nicht mehr aufgerufen. getName leider nochmal aufrufen, weil GMCP den
  // Namen im Nominativ braucht.
  if (msg_type == MSG_GEMOTE)
    sender_name = getName(sender, WER);
  if (GMCP_Channel(channel_message, channel, sender_name) != 1)
  {
    // Der Ebenenname muss in Kleinbuchstaben uebergeben werden, damit die
    // Ignorierepruefung funktioniert. Die ignorierestrings sind naemlich alle
    // kleingeschrieben.
    ReceiveMsg(channel_message,
               MT_COMM|MT_FAR|MSG_DONT_STORE|MSG_DONT_WRAP|MSG_ALERT,
               MA_CHANNEL"." + lower_case(channel), 0, sender);
  }
  return 0;
}

// Defines fuer den Zugriff auf die Channeldaten in der vom CHANNELD
// erhaltenen Kanalliste.
#define I_MEMBER          0
#define I_ACCESS          1
#define I_INFO            2
#define I_SUPERVISOR      3
#define I_NAME            4

private void createList(mapping ch_list, string* p_channels,
                           int show_only_subscribed) {
  // Kopfzeile der Tabelle erstellen.
  string listhead =
            sprintf("%-12.12' 's  [A] %|12' 's (%-3' 's) %-42.42s\n",
                    "Name", "Eigner", "Sp", "Beschreibung");
  // Linie drunter.
  listhead += ("-"*78 + "\n");

  // Rest der Daten erstmal in einem Array zusammenstellen, um es
  // anschliessend sortieren zu koennen.
  string* entries = ({});

  object* ch_members;
  string|object ch_master;
  string ch_real_name, ch_description;
  closure|string ch_access;
  closure|string ch_info;
  string sh;

  foreach(string chname, <object*|closure|string|object>* chdata : ch_list)
  {
    // Wenn nur abonnierte Ebenen aufgelistet werden sollen, dann alle
    // ueberspringen, die nicht in P_CHANNELS stehen.
    int is_subscribed = (member(p_channels, chname) > -1);
    if (show_only_subscribed && !is_subscribed)
      continue;

    ch_members =   chdata[I_MEMBER];
    ch_master =    chdata[I_SUPERVISOR];
    ch_access =    chdata[I_ACCESS];
    ch_real_name = chdata[I_NAME];
    ch_info =      chdata[I_INFO];
    sh = "";

    // Ist eine Closure als I_INFO eingetragen, zu der es auch ein Objekt
    // gibt, tragen wir deren Rueckgabewert als Beschreibung ein.
    if (closurep(ch_info) && objectp(query_closure_object(ch_info))) {
      ch_description = funcall(ch_info);
    }
    // Ist es ein String, wird er unveraendert uebernommen.
    else if (stringp(ch_info)) {
      ch_description = ch_info;
    }
    // Sollte nirgends etwas eingetragen sein, oder die Closure 0 zurueck-
    // gegeben haben, gibt es eine Defaultbeschreibung. Man haette die
    // Variable auch schon mit dem Default initialisieren koennen, der kann
    // aber bei Rueckgabe von 0 aus der Closure wieder ueberschrieben werden.
    // Daher passiert das erst hier.
    ch_description ||= "- Keine Beschreibung -";

    // Wir brauchen noch das vom Spieler festgelegte Kuerzel fuer die aktuell
    // bearbeitete Ebene, falls vorhanden, um es in die Liste eintragen
    // zu koennen.
    foreach(string _sh_cut, string _chan_name : shortcut) {
      if ( lower_case(_chan_name) == chname ) {
        sh = _sh_cut;
        break;
      }
    }

    // Jetzt haben wir endlich alle Infos beisammen und koennen die
    // Eintraege zusammenbauen.
    entries += ({
      sprintf("%-12.12'.'s %c[%-1.1s] %|12.12' 's (%-|3' 'd) %-42.42s\n",
          ch_real_name,
          is_subscribed ? '*' : ' ',
          sh,
          ch_master ? getName(ch_master) : getName(ch_access),
          sizeof(ch_members),
          ch_description
      ) });
  }

   // alphabetisch sortieren
  entries = sort_array(entries, #'>);

  More( listhead +             // Listenkopf
        implode(entries, "") + // Eintraege
        "-"*78+"\n" );         // Linie drunter
}

private string|string* getChannel(string ch)
{
  if (!sizeof(ch))
    ch = QueryProp(P_STD_CHANNEL);
  if (shortcut && shortcut[ch])
    ch = shortcut[ch];
  return CHMASTER->find(ch, ME);
}

int ChannelParser(string args)
{
  string|string* ch;
  int type, err;
  string tmp;
  notify_fail("Benutzung: -<Ebene>[ ]['|:|;]<Text>\n"
              "           -<Ebene>[+|-|?|!|*]\n"
              "           -?\n");

  args = _unparsed_args();
  string|string* cmd = query_verb();
  if (!cmd && !args)
    return 0;

  if (!args)
    args = "";

  cmd = cmd[1..];
  cmd = regexplode(cmd, "^" CHANNELCMDS "*" "([+-]|\\!|\\?|\\*)*");
  if (sizeof(cmd) > 1)
  {
    //z.B. cmd= ({"","allgemein",":testet"})
    if (sizeof(cmd[1]) > 1 && strstr("+-?!*", cmd[1][<1..<1]) > -1)
      tmp = cmd[1][0..<2];
    else
      tmp = cmd[1];

    if (cmd[1] != "?" && cmd[1] != "!")
    {
      ch = getChannel(tmp);
      if (pointerp(ch))
      {
        notify_fail("Diese Angabe war nicht eindeutig! "
                    "Folgende Ebenen passen:\n"+
                    implode(ch, ", ")+"\n");
        return 0;
      }
      else if (!ch)
      {
        notify_fail("Die Ebene '"+tmp+ "' gibt es nicht!\n");
        return 0;
      }
    }

    if (sizeof(cmd[1])) {
      switch (cmd[1][<1]) {
        case '+':
          switch (CHMASTER->join(ch, ME))
          {
            case E_ACCESS_DENIED:
              notify_fail("Du darfst an die Ebene '"+ch+"' nicht heran.\n");
              return 0;
            case E_ALREADY_JOINED:
              notify_fail("Du hast diese Ebene schon betreten!\n");
              return 0;
            default:
              break;
          }
          tell_object(ME,"Du betrittst die Ebene '"+ch+"'.\n");
          if (member(QueryProp(P_CHANNELS), ch = lower_case(ch)) == -1)
            SetProp(P_CHANNELS, QueryProp(P_CHANNELS) + ({ ch }));
          return 1;

        case '-':
          switch (CHMASTER->leave(ch, ME))
          {
            case E_ACCESS_DENIED:
              tell_object(ME,"Du kannst die Ebene '"+ch+"' nicht "
                "verlassen.\n");
              break;
            case E_NOT_MEMBER:
              tell_object(ME,"Wie willst Du eine Ebene verlassen, welche Du "
                "nicht betreten hast?\n");
              break;
            default:
              tell_object(ME,"Du verlaesst die Ebene '"+ch+"'.\n");
              SetProp(P_CHANNELS,
                      QueryProp(P_CHANNELS) - ({ lower_case(ch), ch }));
              break;
          }
          return 1;

        case '!':
        case '?':
          mapping l = CHMASTER->list(ME);
          if (mappingp(l))
          {
            // Es wurde ein Channel angegeben, dessen Infos gefragt sind.
            if (stringp(ch) && sizeof(ch) && pointerp(l[ch = lower_case(ch)]))
            {
              <object*|closure|string|object>* chdata = l[ch];
              string* m =
                sort_array(map(chdata[I_MEMBER], #'getName, WER), #'>);

              string wen;
              switch(sizeof(m)) {
                case 1:  wen = "ein Gesicht"; break;
                case 0:  wen = "niemanden";   break;
                // TODO: mittels Zahlwoerter-Objekt die Zahl als Text
                // ausgeben?
                default: wen = sprintf("%d Gesichter", sizeof(m)); break;
              }

              tell_object(ME,
                chdata[I_NAME]+", "+funcall(chdata[I_INFO])+".\n" +
                "Du siehst "+wen+" auf der Ebene '"+chdata[I_NAME]+"':\n"+
                break_string(CountUp(m), 78) + getName(chdata[I_SUPERVISOR])
                + " hat das Sagen auf dieser Ebene.\n");
            }
            // kein Channel angegeben, dann Gesamtliste erzeugen
            else
            {
              // Wenn nur die abonnierten angezeigt werden sollen
              // (Kommando -!), wird die Bedingung im 3. Argument == 1, so
              // dass createList() die reduzierte Tabelle erzeugt.
              createList(l, QueryProp(P_CHANNELS), (cmd[1][<1] == '!'));
            }
          }
          return 1;

        case '*':
          int|<int|string>** hist = CHMASTER->history(ch, ME);
          if (!pointerp(hist) || !sizeof(hist))
          {
            tell_object(ME,"Es ist keine Geschichte fuer '"+ch+
              "' verfuegbar.\n");
            return 1;
          }

          int amount = to_int(cmd[2]);
          if (amount <= 0 || amount >= sizeof(hist))
            amount = sizeof(hist);

          string txt = "Folgendes ist auf '"+ch+"' passiert:\n" +
                       implode(map(hist[<amount..], #'ChannelMessage, 1), "");
          More(txt);
          return 1;

        default:
          break;
      }
    }
  }

  cmd = implode(cmd[2..], "");
  if (sizeof(cmd))
    args = cmd + (sizeof(args) ? " " : "") + args;

  // KOntrollchars ausfiltern.
  args = regreplace(args, "[[:cntrl:]]", "", RE_PCRE|RE_GLOBAL);
  if (!sizeof(args))
    return 0;

  //Wenn cmd leer ist: MSG_SAY
  if (!sizeof(cmd))
  {
    type = MSG_SAY;
  }
  else
  {
    switch (cmd[0])
    {
      case ':' :
        type = MSG_EMOTE;
        args = args[1..];
        break;
      case ';' :
        type = MSG_GEMOTE;
        args = args[1..];
        break;
      case '\'':
        args = args[1..];
        // Der Fallthrough in default ist hier Absicht.
      default  :
        type = MSG_SAY;
        break;
    }
  }

  if (!ch || !sizeof(ch))
    ch = QueryProp(P_STD_CHANNEL);

  err = CHMASTER->send(ch, ME, args, type);
  if (err < 0)
  {
    err = CHMASTER->join(ch, ME);
    if (!err)
    {
      ch = lower_case(ch);
      if (member(QueryProp(P_CHANNELS), ch) == -1)
        SetProp(P_CHANNELS, QueryProp(P_CHANNELS) + ({ ch }));
      err = CHMASTER->send(ch, ME, args, type);
    }
  }

  switch (err)
  {
    case E_ACCESS_DENIED:
      notify_fail("Auf der Ebene '"+ch+"' darfst Du nichts sagen.\n");
      return 0;
    case E_NOT_MEMBER:
      notify_fail("Du hast die Ebene '"+ch+"' nicht betreten!\n");
      return 0;
  }
  return 1;
}

int ChannelAdmin(string args)
{
  args = _unparsed_args();

  string target_channel, descr, _sh_cut;
  string|string* chans;
  notify_fail("Benutzung: ebene <Abkuerzung>=<Ebene>\n"
              "           ebene <Abkuerzung>=\n"
              "           ebene abkuerzungen [standard]\n"
              "           ebene standard <Ebene>\n"
              "           ebene an|ein|aus\n"
              +(QueryProp(P_LEVEL) >= 5 ?
                "           ebene neu <Name> <Bezeichnung>\n"
                "           ebene beschreibung <Name> <Beschreibung>\n" : "")
              +(IS_ARCH(ME) ?
                "           ebene kill <Name>\n"
                "           ebene clear <Name>\n": ""));

  if (!args || !sizeof(args))
    return 0;

  if (sscanf(args, "kill %s", target_channel) && IS_ARCH(ME))
  {
    chans = CHMASTER->find(target_channel, ME);

    if (!chans)
    {
      notify_fail("Ebene '"+target_channel+"' nicht gefunden!\n");
      return 0;
    }
    else if (pointerp(chans))
    {
      notify_fail(
        "Das war keine eindeutige Angabe! Folgende Ebenen passen:\n"+
        break_string(CountUp(chans), 78));
      return 0;
    }
    else if (CHMASTER->remove_channel(target_channel, ME))
    {
      notify_fail("Die Ebene '"+target_channel+"' lies sich nicht "
        "entfernen!\n");
      return 0;
    }

    tell_object(ME,"Du entfernst die Ebene '"+target_channel+"'.\n");
    return 1;
  }

  if (sscanf(args, "clear %s", target_channel) && IS_ARCH(ME))
  {
    chans = CHMASTER->find(target_channel, ME);

    if (!chans)
    {
      notify_fail("Ebene '"+target_channel+"' nicht gefunden!\n");
      return 0;
    }
    else if (pointerp(chans))
    {
      notify_fail(
        "Das war keine eindeutige Angabe! Folgende Ebenen passen:\n"+
        break_string(CountUp(chans), 78));
      return 0;
    }
    else if (CHMASTER->clear_history(target_channel, ME) == E_ACCESS_DENIED)
    {
      notify_fail("Der Verlauf zur Ebene '"+target_channel+"' liess sich "
                  "nicht entfernen!\n");
      return 0;
    }

    tell_object(ME,"Du entfernst den Verlauf zur Ebene '"+target_channel+
      "'.\n");
    return 1;
  }

  if (sscanf(args, "neu %s %s", target_channel, descr) == 2)
  {
    notify_fail(break_string("Neue Ebenen kannst Du erst erstellen, wenn "
      "Du Spielerstufe 5 erreicht hast.", 78));
    if (QueryProp(P_LEVEL) < 5)
      return 0;

    notify_fail("Der Name '"+target_channel+"' ist nicht konform!\n");
    if (!sizeof(regexp(({target_channel}), "^" CHANNELCMDS CHANNELCMDS "*")))
      return 0;

    notify_fail("Der Name '"+target_channel+"' ist zu lang.\n");
    if (sizeof(target_channel) > 20)
      return 0;

    notify_fail("Diese Ebene darfst du nicht erschaffen!\n");
    if (CHMASTER->new(target_channel, ME, descr) == E_ACCESS_DENIED)
      return 0;

    tell_object(ME,"Du erschaffst die Ebene '"+target_channel+"'.\n");
    SetProp(P_CHANNELS, QueryProp(P_CHANNELS) +
                        ({lower_case(target_channel)}));
    return 1;
  }

  if (sscanf(args, "beschreibung %s %s", target_channel, descr) == 2)
  {
    chans = CHMASTER->find(target_channel, ME);

    if (!chans)
    {
      notify_fail("Ebene '"+target_channel+"' nicht gefunden!\n");
      return 0;
    }
    else if (pointerp(chans))
    {
      notify_fail(
        "Das war keine eindeutige Angabe! Folgende Ebenen passen:\n"+
        break_string(CountUp(chans), 78));
      return 0;
    }

    mapping ch = CHMASTER->list(ME);
    notify_fail("Du bist nicht berechtigt, die Beschreibung der Ebene"
      " '"+target_channel+"' zu aendern.\n");
    if (ch[lower_case(chans)][I_SUPERVISOR] != ME)
      return 0;

    ch[lower_case(target_channel)][I_INFO] = descr;
    tell_object(ME,"Die Ebene '"+target_channel+"' hat ab sofort die "
      "Beschreibung:\n"+descr+"\n");
    return 1;
  }

  if (sscanf(args, "%s=%s", _sh_cut, target_channel) == 2 &&
      sizeof(target_channel))
  {
    chans = CHMASTER->find(target_channel, ME);

    if (!chans)
    {
      notify_fail("Ebene '"+target_channel+"' nicht gefunden!\n");
      return 0;
    }
    else if (pointerp(chans))
    {
      notify_fail(
        "Das war keine eindeutige Angabe! Folgende Ebenen passen:\n"+
        break_string(CountUp(chans), 78));
      return 0;
    }

    mapping shortcut_list = QueryProp(P_CHANNEL_SHORT) || ([]);
    m_add(shortcut_list, _sh_cut, chans);
    SetProp(P_CHANNEL_SHORT, shortcut_list);

    shortcut = QueryProp(P_CHANNEL_SHORT);

    tell_object(ME,"'"+_sh_cut+"' wird jetzt als Abkuerzung fuer '"+chans+
      "' anerkannt.\n");
    return 1;
  }

  if (sscanf(args, "%s=", _sh_cut))
  {
    SetProp(P_CHANNEL_SHORT,
      m_delete(QueryProp(P_CHANNEL_SHORT) || ([]), _sh_cut));
    shortcut = QueryProp(P_CHANNEL_SHORT);
    tell_object(ME,"Du loeschst die Abkuerzung '"+_sh_cut+"'.\n");
    return 1;
  }

  if (args == "an" || args == "ein")
  {
    if (pointerp(QueryProp(P_SWAP_CHANNELS)))
      SetProp(P_CHANNELS, QueryProp(P_SWAP_CHANNELS));
    else
      SetProp(P_CHANNELS, m_indices(CHMASTER->list(ME)));

    // <excl> enthaelt die Channelnamen, deren Channel nicht erstellt wurden.
    string* excl = RegisterChannels();
    tell_object(ME,"Du schaltest folgende Ebenen ein:\n"+
          break_string(CountUp(QueryProp(P_CHANNELS) - excl), 78));
    SetProp(P_SWAP_CHANNELS, 0);
    return 1;
  }

  if (args == "aus")
  {
    SetProp(P_SWAP_CHANNELS, QueryProp(P_CHANNELS));
    RemoveChannels();
    SetProp(P_CHANNELS, ({}));
    tell_object(ME,"Du stellst die Ebenen ab.\n");
    return 1;
  }

  string* pa = old_explode(args, " ");
  if (strstr("abkuerzungen", pa[0]) == 0)
  {
    string txt = "";
    if (sizeof(pa) > 1 && strstr("standard", pa[1]) == 0)
    {
      tell_object(ME,"Die Standardabkuerzungen werden gesetzt.\n");
      SetProp(P_CHANNEL_SHORT,
        DEFAULT_SHORTCUTS + (IS_LEARNER(ME) ? WIZARD_SHORTCUTS : ([])));
    }

    mapping scut = QueryProp(P_CHANNEL_SHORT);
    string* abbreviations = m_indices(scut);
    foreach (string abk : sort_array(abbreviations, #'>))
    {
      txt += sprintf("%5.5s = %s\n", abk, scut[abk]);
    }
    More( "Folgende Abkuerzungen sind definiert:\n"+
          sprintf("%-78#s\n", txt) );
    return 1;
  }

  if (strstr("standard", pa[0]) == 0)
  {
    if (sizeof(pa) < 2)
    {
      notify_fail("Benutzung: ebene standard <Ebene>\n"+
        (QueryProp(P_STD_CHANNEL)
          ? "Momentan ist '"+QueryProp(P_STD_CHANNEL)+"' eingestellt.\n"
          : "Es ist keine Standardebene eingestellt.\n"));
      return 0;
    }

    chans = CHMASTER->find(pa[1], ME);
    if (!chans)
    {
      notify_fail("Ebene '"+pa[1]+"' nicht gefunden!\n");
      return 0;
    }
    else if (pointerp(chans))
    {
      notify_fail(
        "Das war keine eindeutige Angabe! Folgende Ebenen passen:\n"+
        break_string(CountUp(chans), 78));
      return 0;
    }

    tell_object(ME,"'"+chans+"' ist jetzt die Standardebene.\n");
    SetProp(P_STD_CHANNEL, chans);
    return 1;
  }
  return(0);
}
