/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $connection_interface: $network, $command_cache, $frob;

var $connection_interface connection = 0;
var $has_commands local = #[];
var $has_commands remote = #[];
var $has_commands shortcuts = #[];
var $root created_on = 809051864;
var $root flags = ['methods, 'code, 'core, 'variables];
var $root inited = 1;
var $root managed = [$connection_interface];
var $root manager = $connection_interface;
var $root quota_exempt = 1;

public method .close() {
    (> .perms(sender()) <);
    (> $sys.destroy_sender() <);
};

public method .connection() {
    return connection;
};

public method .connection_going_away() {
    arg @args;
    
    (> .close() <);
};

public method .connection_starting() {
    arg addr, port;
    
};

public method .daemon_shutdown() {
    var i;
    
    (> .perms(caller(), $connection) <);
    for i in (.children())
        (> i.close() <);
};

public method .invalid_cmd() {
    arg @args;
    
    return 'disconnect;
};

public method .linelen() {
    arg @args;
    
    return 79;
};

public method .new() {
    arg c;
    var i;
    
    (> .perms(caller(), $connection) <);
    i = .spawn();
    i.set_connection(c);
    return i;
};

public method .new_connection() {
    arg this, host, port;
    
};

public method .null_cmd() {
    arg @args;
    
    return 'disconnect;
};

public method .parse_line() {
    arg this, line;
    var cmd, c, match, parsed, i, m, a, u;
    
    catch any {
        while (line && ((line[1]) == " "))
            line = line.subrange(2);
        if (!line) {
            return .null_cmd(this, line);
        } else {
            cmd = line.explode();
            cmd = [line, cmd[1], ((cmd.subrange(2)).join()) || ""];
            c = (| .match_in_local_cache(@cmd) |);
            if (c && ((c[1]) == 'local)) {
                // screw duplicates, take the first match
                match = (c[2])[1];
                m = match[2];
                i = match[5];
                parsed = i.keys();
                for a in [1 .. m.length()] {
                    if (a in parsed)
                        m = m.replace(a + 2, (> $command_lib.convert_arg((i[a])[1], m[a + 2], $no_one, ((i[a])[2]) ? (((i[a])[2])[1]) : $no_one, $no_one) <));
                }
                return (> .(match[4])(this, @m) <);
            }
            return (> .invalid_cmd(this, line) <);
        }
    } with {
        if (((traceback()[1])[3]) != 'no_traceback) {
            (this['connection]).write($parse_lib.traceback(traceback()));
            return 'disconnect;
        }
    }
};

public method .send() {
    arg @args;
    
    return (> .write(@args) <);
};

public method .set_connection() {
    arg c;
    
    (> .perms(caller(), definer()) <);
    connection = c;
};

public method .tell() {
    arg @args;
    
    (> .write(@args) <);
};

public method .write() {
    arg this, what;
    
    return (> (this['connection]).write(what) <);
};