/
CDC-1.2b/
CDC-1.2b/src/
parent $user_interfaces
object $interaction

var $root child_index 0
var $root owners [$interaction]
var $root fertile 0
var $has_commands commands [["wh?isper * to *", 'whisper_cmd], ["@register-ch?annel|@reg-ch?annel *", 'register_channel_cmd], ["@delete-ch?annel|@del-ch?annel *", 'delete_channel_cmd], ["say *", 'say_cmd], ["to * say *", 'say_to_cmd], ["@paste *", 'paste_cmd], ["page * with *", 'page_cmd], ["emote *", 'emote_cmd], ["strip *", 'strip_cmd], ["@tuned|@ch?annels *", 'channels_cmd], ["repeat *", 'repeat_cmd], ["@tune in|out *", 'tune_channel_cmd], ["on * say *", 'on_subj_cmd], ["vowel?ize *", 'late_vowels_cmd], ["epage * with *", 'page_emote_cmd]]
var $has_commands shortcuts [["|*", '_interact, ["|", 1]], ["<*", '_interact, ["<", 1]], ["think *", 'think_cmd, [1]], ["%*", 'think_cmd, [1]], ["#*", 'channel_cmd, ["#", 1]], ["\"*", 'say_cmd, ["", 1]], [":*", 'emote_cmd, ["", 1]], ["!*", 'polite_spoof_cmd, [1]], ["''*", 'say_to_cmd, ["to", "", "say", 1]], ["'* *", 'say_to_cmd, ["to", 1, "say", 2]], ["--*", 'page_cmd, ["page", "", "with", 1]], ["-* *", 'page_cmd, ["page", 1, "with", 2]], ["++*", 'page_emote_cmd, ["epage", "", "with", 1]], ["+* *", 'page_emote_cmd, ["epage", 1, "with", 2]], ["]*", 'right_encapsulate_cmd, ["]", 1]], [")*", 'right_encapsulate_cmd, [")", 1]]]
var $root inited 1
var $interaction stage #[[">", " -> "], ["<", " <- "], ["[", " ["], ["|", " | "]]
var $interaction last_interacted_with 0
var $root owned [$interaction]
var $root manager $interaction
var $root writable [$interaction]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'interaction
var $root info ["  ]     [Lynx text]                 |     Lynx | text", "  [     Lynx [text]:                <     Lynx <- text", "  )     (Lynx text)                 >     Lynx -> text", "  (     Lynx (text):                !     text      -- Lynx", "  %     Lynx . o O ( text )         \"     Lynx says, \"text\"", "  '     Lynx to who, \"text\"         ''    Lynx [to who]: text", "  `     Lynx [to who]: text         ``    Lynx [to who]: text", "  -     Lynx pages: text            --    Lynx pages: text", "  +     (from...) Lynx text         ++    (from...) Lynx text", "  ,     Lynx jumps, \"text\"          ,,    Lynx jumps, \"text\"", "  :     Lynx text                   ::    Lynxtext", "  .     Lynx text         (pose)    ;     ;eval", "  #     <Channel - Lynx> text", "Unused: ~ $ & * =", "Dont use: ?"]
var $old_command_environment verb_cache #[]
var $old_command_environment command_cache [["wh?isper * to *", 'whisper_cmd], ["@register-ch?annel|@reg-ch?annel *", 'register_channel_cmd], ["@delete-ch?annel|@del-ch?annel *", 'delete_channel_cmd], ["say *", 'say_cmd], ["to * say *", 'say_to_cmd], ["@paste *", 'paste_cmd], ["page * with *", 'page_cmd], ["emote *", 'emote_cmd], ["strip *", 'strip_cmd], ["@tuned|@ch?annels *", 'channels_cmd], ["repeat *", 'repeat_cmd], ["@tune in|out *", 'tune_channel_cmd], ["on * say *", 'on_subj_cmd], ["vowel?ize *", 'late_vowels_cmd], ["epage * with *", 'page_emote_cmd]]
var $old_command_environment shortcuts_cache [["|*", '_interact, ["|", 1]], ["<*", '_interact, ["<", 1]], ["think *", 'think_cmd, [1]], ["%*", 'think_cmd, [1]], ["#*", 'channel_cmd, ["#", 1]], ["\"*", 'say_cmd, ["", 1]], [":*", 'emote_cmd, ["", 1]], ["!*", 'polite_spoof_cmd, [1]], ["''*", 'say_to_cmd, ["to", "", "say", 1]], ["'* *", 'say_to_cmd, ["to", 1, "say", 2]], ["--*", 'page_cmd, ["page", "", "with", 1]], ["-* *", 'page_cmd, ["page", 1, "with", 2]], ["++*", 'page_emote_cmd, ["epage", "", "with", 1]], ["+* *", 'page_emote_cmd, ["epage", 1, "with", 2]], ["]*", 'right_encapsulate_cmd, ["]", 1]], [")*", 'right_encapsulate_cmd, [")", 1]]]

method page_cmd
    arg com, who, prep, message;
    var user, recipient, targets;
    
    .perms(sender(), 'parser);
    who = (who && ($string.explode_english_list(who))) || [];
    if (!who) {
        if (last_interacted_with)
            who = last_interacted_with[2];
        else
            $parse.tell_error("You must specify somebody or something to speak to.");
    }
    targets = who;
    for recipient in (who) {
        if (type(recipient) == 'dbref) {
            user = recipient;
        } else {
            user = (| $user_db.match_begin(recipient) |);
            if (!user)
                user = (| .match_environment(recipient) |);
        }
        if (user && ((user.has_ancestor($user)) && (user.connected()))) {
            user.tell(((.namef()) + " pages: ") + message);
            who = replace(who, recipient in who, user.namef());
            targets = replace(targets, recipient in targets, user);
        } else {
            .tell(("! " + ($data.unparse(recipient))) + " is either not connected, not a user, or misspelled.");
            who = setremove(who, recipient);
            targets = setremove(targets, recipient);
        }
    }
    if (targets) {
        last_interacted_with = [time(), targets];
        .tell(((("You page \"" + message) + "\" to ") + ($list.to_english(who, 'namef))) + ".");
    }
.

method wall_cmd
    arg what;
    
    .perms(sender(), 'parser);
    ._interact("|", what);
.

method polite_spoof_cmd
    arg what;
    var name;
    
    .perms(sender(), 'parser);
    
    // Polite spoof: Send what unmarred if it contains " "+.namef()+" ",
    // otherwise, tack on "     -- "+.namef()
    name = .namef();
    if (!(((name + " ") in what) || ((" " + name) in what)))
        what = (what + "     -- ") + name;
    (.location()).announce(what);
.

method say_to_cmd
    arg com, who, prep, msg;
    var thing, x, recipient, tmp, targets, errargs, how;
    
    .perms(sender(), 'parser);
    who = (who && ($string.explode_english_list(who))) || [];
    if (!who) {
        if (last_interacted_with)
            who = last_interacted_with[2];
        else
            $parse.tell_error("You must specify somebody or something to speak to.");
    }
    targets = who;
    for x in [1 .. listlen(who)] {
        recipient = who[x];
        if (type(recipient) == 'dbref) {
            thing = recipient;
        } else {
            catch ~ambig {
                thing = .match_env_nice(recipient);
            } with handler {
                eargs = (traceback[1])[3];
                tmp = $list.map(errags, 'namef);
                who = (sublist(who, 1, x - 1) + tmp) + sublist(who, x + 1);
                targets = (sublist(who, 1, x - 1) + errargs) + sublist(who, x + 1);
            }
        }
        if (thing) {
            who = replace(who, x, thing.namef());
            targets = replace(targets, recipient in targets, thing);
        }
    }
    if (msg)
        how = $code.punctuation_type(msg);
    else
        how = "say";
    last_interacted_with = [time(), targets];
    (.location()).announce((((((((.namef()) + " (to ") + ($list.to_english(who))) + ") ") + how) + "s, \"") + msg) + "\"");
.

method whisper_cmd
    arg com, what, prep, who;
    var loc;
    
    .perms(sender(), 'parser);
    who = .match_env_nice(who);
    loc = .location();
    if ((who.location()) != loc) {
        .tell("You must be in the same room as a person, to whisper to them.");
        return;
    }
    who.tell((((.namef()) + " whispers, \"") + what) + "\"");
    .tell(((("You whisper, \"" + what) + "\" to ") + (who.namef())) + ".");
    loc.announce((((.namef()) + " whispers to ") + (who.namef())) + ".", who, this());
.

method wiz_cmd
    arg what;
    
    if (sender() != this())
        throw(~perm, "Sender not this.");
    $comm_tuner.channel_announce('wiz, what);
.

method _interact
    arg verb, what;
    var stage;
    
    .perms(sender(), 'parser);
    stage = $interaction.get_stage();
    
    // echo .namef()+stage[verb]+what to the room
    if (verb in dict_keys(stage))
        (.location()).announce(((.namef()) + (stage[verb])) + what);
    else
        throw(~unknownverb, ("Unknown verb '" + verb) + "'");
.

method get_stage
    return stage;
.

method think_cmd
    arg what;
    
    .perms(sender(), 'parser);
    (.location()).announce((((.namef()) + " . o O ( ") + what) + " )");
.

method channel_cmd
    arg com, what;
    var channel, text, syntax, sep_loc;
    
    syntax = "`#<channel> <text>'";
    if (sender() != this())
        throw(~perm, "Sender not this.");
    catch any {
        sep_loc = " " in what;
        channel = $channels.match_channel(substr(what, 1, sep_loc - 1));
        if (!channel)
            $parse.tell_error("That channel does not exist.", syntax);
        if (listlen(channel) > 1)
            $parse.tell_error(("Which channel? That could refer to any of these: " + ($data.unparse(channel))) + ".", syntax);
        channel = channel[1];
        text = substr(what, sep_loc + 1);
        $channels.announce(channel, text);
    } with handler {
        switch (error()) {
            case ~range:
                $parse.tell_error("You must specify some text to send", syntax);
            default:
                $parse.tell_error((traceback()[1])[2], syntax);
        }
    }
.

method tune_channel_cmd
    arg com, inout, channel;
    var syn;
    
    .perms(sender(), 'parser);
    syn = com + " <channel>";
    if ((channel[1]) == "#")
        channel = substr(channel, 2);
    catch any {
        switch (inout) {
            case "in":
                channel = $channels.validate_channel(channel);
                $channels.tune_in(channel);
            case "out":
                channel = $channels.validate_channel(channel);
                $channels.tune_out(channel);
            default:
                $parse.tell_error("You must tune a channel \"in\", or \"out\".", syn);
        }
    } with handler {
        $parse.tell_error((traceback()[1])[2], syn);
    }
    .tell(((("Channel #" + tostr(channel)) + " tuned ") + inout) + ".");
.

method channels_cmd
    arg com, who;
    
    .perms(sender(), 'parser);
    if (!who)
        who = this();
    else
        who = .match_env_nice(who);
    .tell("Communication Channels:");
    .tell($list.lcolumnize(who.get_channels(), .linelen()));
.

method register_channel_cmd
    arg com, what;
    var syn, name, tunable, senders;
    
    if (sender() != this())
        throw(~perm, "Sender is not this");
    syn = [("Syntax: `" + com) + " <name> [<tunable> <senders>]'", "<tunable> and <senders> can be either 1, 0, or a list of users"];
    what = explode(what);
    name = [@what, "BAD NAME"][1];
    tunable = [@what, 1, 1][2];
    senders = [@what, 1, 1, 1][3];
    catch any {
        $channels.new_channel(name, tunable, senders, sender(), [sender()]);
    } with handler {
        $parse.tell_error(syn + [(traceback()[1])[2]]);
    }
    .tell(("New channel registered with the name `" + tostr(name)) + "'.");
.

method delete_channel_cmd
    arg com, name;
    var syn;
    
    if (sender() != this())
        throw(~perm, "Sender is not this");
    syn = ("`" + com) + " <name>'";
    catch any {
        $channels.del_channel($channels.validate_channel(name));
    } with handler {
        $parse.tell_error((traceback()[1])[2], syn);
    }
    .tell("Channel deleted");
.

method emote_cmd
    arg com, what;
    
    if (what && ((what[1]) == ":"))
        (.location()).announce((.namef()) + ($string.match_sub_tag(substr(what, 2), "^")));
    else
        (.location()).announce(((.namef()) + " ") + ($string.match_sub_tag(what, "^")));
.

method late_vowels_cmd
    arg what;
    var output, letter, index;
    
    if (sender() != this())
        throw(~perm, "Sender not this.");
    output = ["", ""];
    while (what) {
        letter = what[1];
        what = substr(what, 2);
        if (letter in ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"])
            output = [output[1], (output[2]) + letter];
        else if (letter != " ")
            output = [(output[1]) + letter, output[2]];
        else
            output = [(output[1]) + letter, (output[2]) + letter];
    }
    (.location()).announce(((.namef()) + " ") + (output[1]));
    $scheduler.add_task(1, 'emote_cmd, "", output[2]);
.

method say_cmd
    arg say, what;
    var type, how, idx;
    
    .perms(sender(), 'parser);
    
    // .location().announce(pad(.name(), -9) + "->ALL  " + what);
    // return;
    if (what)
        how = $code.punctuation_type(what);
    else
        how = "say";
    (.location()).announce((((((.name()) + " ") + how) + "s, \"") + what) + "\"");
.

method pose_cmd
    arg dummy1, str;
    var actor;
    
    actor = sender();
    if (str && ((str[1]) == ":"))
        (.location()).announce((actor.namef()) + substr(str, 2));
    else
        (.location()).announce(((actor.namef()) + " ") + str);
.

method paste_cmd
    arg com, [who];
    var obj, text;
    
    .perms(sender(), 'parser);
    who = [@who, 0][1];
    if (who) {
        who = $list.to_string(sublist(explode(who), 2));
        obj = (| .find_object(who, 'environment, 'environment, 'grasp) |);
        if (!obj)
            $parse.tell_error(("No user found by the name \"" + who) + "\".", "Syntax: '@paste [to <user>]'");
    }
    text = .read();
    if (text == 'aborted)
        return .tell("@paste aborted.");
    else if (!text)
        return .tell("@paste nothing?");
    text = [$string.center((" " + (.namef())) + " (@paste's) ", 79, "-"), @text, $string.center(" + Finis + ", 79, "-")];
    if (obj) {
        obj.tell(text);
        .tell(("Text pasted to " + (who.namef())) + ".");
    } else {
        (.location()).announce(text);
    }
.

method paste_done
    arg text, who;
    var padlen;
    
    if (sender() != this())
        throw(~perm, "Sender not this.");
    padlen = 79;
    text = [$string.center((" " + (.namef())) + " (@paste's) ", padlen, "-"), @text, $string.center(" + Finis + ", padlen, "-")];
    if (who) {
        who.tell(text);
        .tell(("Text pasted to " + (who.namef())) + ".");
    } else {
        (.location()).announce(text);
    }
.

method strip_cmd
    arg com, str;
    
    str = ((.namef()) + " ") + str;
    (.location()).announce($string.strip(str, str[random(strlen(str))]));
.

method get_channels
    var ch, chs, entry, new_chs, len, public, subscribed;
    
    .perms(sender());
    chs = $channels.channels();
    new_chs = [];
    public = $channels.all_tuners();
    
    // pick a random dictionary to get the name list from
    len = $list.element_maxlength(chs);
    for ch in (chs) {
        subscribed = $channels.listeners(ch);
        entry = ((this() in subscribed) ? "+" | "") + tostr(ch);
        entry = pad(entry, -(len + 2));
        entry = entry + (((public[ch]) == 1) ? " - Public " | " - Private");
        new_chs = [@new_chs, entry];
    }
    return new_chs;
.

method repeat_cmd
    arg com, [args];
    var syntax, x, times, line, out, repeat, other;
    
    syntax = ("`" + com) + " [+times|+t=<times>] <what>'";
    args = explode(args ? args[1] | "");
    if (!args)
        $parse.tell_error("You must specify something to repeat antisocially.", syntax);
    if (match_begin(args[1], "+t")) {
        x = (| explode(args[1], "=")[2] |);
        if (!x)
            $parse.tell_error("You must define repeat times as +times=* to something.", syntax);
        times = toint(x);
        args = sublist(args, 2);
        if (!args)
            $parse.tell_error("You must specify something to repeat antisocially.", syntax);
    }
    if (!times)
        times = 3;
    repeat = args[1];
    other = (| sublist(args, 2) |) || [];
    
    //
    line = "";
    for x in [1 .. times]
        line = line + repeat;
    args = sublist(args, 2);
    
    //
    .emote_cmd("emote", $list.to_string([line] + other));
.

method page_emote_cmd
    arg com, who, prep, message;
    var user, recipient, targets, name;
    
    .perms(sender(), 'parser);
    who = (who && ($string.explode_english_list(who))) || [];
    if (!who) {
        if (last_interacted_with)
            who = last_interacted_with[2];
        else
            $parse.tell_error("You must specify somebody or something to speak to.");
    }
    targets = who;
    name = (.namef()) + " ";
    for recipient in (who) {
        if (type(recipient) == 'dbref) {
            user = recipient;
        } else {
            user = (| $user_db.match_begin(recipient) |);
            if (!user)
                user = (| .match_environment(recipient) |);
        }
        if (user && ((user.has_ancestor($user)) && (user.connected()))) {
            user.tell(((("[from " + ((.location()).namef())) + "] ") + name) + message);
            who = replace(who, recipient in who, user.namef());
            targets = replace(targets, recipient in targets, user);
        } else {
            .tell(("! " + ($data.unparse(recipient))) + " is either not connected, not a user, or misspelled.");
            who = setremove(who, recipient);
            targets = setremove(targets, recipient);
        }
    }
    if (targets) {
        last_interacted_with = [time(), targets];
        who = who.to_english();
        .tell((((("You epage \"" + name) + (message.chop(((.linelen()) - 17) - strlen(who)))) + "\" to ") + who) + ".");
    }
.

method right_encapsulate_cmd
    arg right, line;
    var space, line, left, right;
    
    .perms(sender(), 'parser);
    space = " ";
    if (!line)
        space = "";
    switch (right) {
        case "]":
            left = "[";
        case ")":
            left = "(";
    }
    (.location()).announce((((left + (.namef())) + space) + line) + right);
.