/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $mail_lib: $libraries, $mail_root;

var $mail_lib mail_system = [$mail_message, $mail_list, $mail_ui, $mail_lib];
var $root created_on = 796268969;
var $root flags = ['methods, 'code, 'core, 'variables];
var $root inited = 1;
var $root managed = [$mail_lib];
var $root manager = $mail_lib;

public method .has_mail_perms() {
    arg @args;
    var obj;
    
    for obj in (args) {
        if ((!(obj in mail_system)) && (!($sys.is_system(obj))))
            return 0;
    }
};

public method .indent_reply() {
    arg text;
    var l, out;
    
    out = [];
    for l in (text) {
        if (!(l.match_begin(">")))
            out += l.wrap_lines(65, "> ", 1);
        else
            out += [">" + l];
    }
    return out;
};

public method .mail_name() {
    arg obj;
    var name;
    
    if (!(obj.has_ancestor($mail_list)))
        throw(~type, "Object is not a child of $mail_recipient");
    name = (obj.name()).replace(" ", "-");
    if (obj.has_ancestor($user))
        return "~" + name;
    return "*" + name;
};

public method .match_mail_recipient() {
    arg name;
    
    catch ~namenf {
        if (name) {
            if (name == "me")
                return sender();
            if ((name[1]) == "*")
                return (> $mail_db.search(substr(name, 2)) <);
            if ((name[1]) == "~")
                return (> $user_db.search(substr(name, 2)) <);
            return (| $mail_db.search(name) |) || (> $user_db.search(name) <);
        }
    }
    throw(~listnf, ("No mail recipient found by the name \"" + name) + "\".");
};

public method .range_to_actual() {
    arg rng, current;
    var start, end, out, listm, m, x, list;
    
    list = current['list];
    listm = list.mail();
    if (type(rng[1]) == 'integer) {
        start = rng[1];
    } else {
        switch (rng[1]) {
            case 'end:
                if (type(rng[2]) != 'symbol)
                    throw(~range, "Backwards range.");
                start = ((current['list]).mail()).length();
            case 'start:
                start = 1;
            case 'current:
                start = (current['location]) in listm;
            case 'specific:
                out = [];
                for m in ((rng[2]).explode_english_list()) {
                    if ((!(x = toint(m))) || (x < 1)) {
                        sender().tell(("Ignoring list range element '" + m) + "'.");
                    } else {
                        catch ~range
                            out = setadd(out, (> listm[x] <));
                        with
                            sender().tell(((((("List range #" + x) + " is higher than the messages in ") + (list.mail_name())) + " (") + (listm.length())) + ")");
                    }
                }
                return out || throw(~range, "No elements in list range.");
        }
    }
    if (type(rng[2]) == 'integer) {
        end = rng[2];
    } else {
        switch (rng[2]) {
            case 'end:
                end = ((current['list]).mail()).length();
            case 'single:
                end = start;
            case 'start:
                throw(~range, "Backwards range.");
            case 'current:
                end = (current['location]) in ((current['list]).mail());
        }
    }
    if (start > end)
        throw(~range, "Backwards range.");
    out = [];
    for m in [start .. end] {
        catch ~range
            out = setadd(out, (> listm[m] <));
        with
            sender().tell(((((("List range #" + m) + " is higher than the messages in ") + (list.mail_name())) + " (") + (listm.length())) + ")");
    }
    return out || throw(~range, "No elements in list range.");
};