/
CDC-1.2b/
CDC-1.2b/src/
parent $user_interfaces
parent $has_verbs
object $user_data

var $root dbref 'user_data
var $root child_index 0
var $root fertile 0
var $root manager $user_data
var $root owned [$user_data]
var $root owners [$user_data]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $has_commands commands [["@finger-data|@user-data * my * is|are *", 'data_is_cmd], ["@finger|@user-data *", 'data_cmd], ["@set-finger|@set-user-data * as|to *", 'set_info_cmd]]
var $has_commands shortcuts []
var $root inited 1
var $user_data valid_settings #[["real-name", 'real_name], ["email", 'email], ["address", 'address], ["affiliation", 'affiliation], ["position", 'position], ["location", 'location], ["interests", 'interests], ["plan", 'plan], ["projects", 'projects], ["see-also", 'see_also]]
var $user_data user_data #[]
var $has_verbs verbs #[]
var $old_command_environment verb_cache #[]
var $old_command_environment command_cache [["@finger-data|@user-data * my * is|are *", 'data_is_cmd], ["@finger|@user-data *", 'data_cmd], ["@set-finger|@set-user-data * as|to *", 'set_info_cmd]]
var $old_command_environment shortcuts_cache []

method data_on
    arg data;
    
    data = (| user_data[data] |);
    if (data) {
        if ((data[1]) || (.is_writable_by(sender())))
            return data[2];
        return "not public.";
    } else {
        return "not set.";
    }
.

method set_data
    arg key, value, public;
    
    (> .perms(sender(), 'this) <);
    if (!value) {
        if ((| user_data[key] |))
            user_data = (| dict_del(user_data, key) |);
    } else {
        user_data = dict_add(user_data, key, [public, value]);
    }
.

method init_user_data
    .perms(caller(), $root);
    user_data = #[['real_name, [1, "???"]], ['email, [1, "???"]]];
.

method valid_settings
    return valid_settings;
.

method data_is_cmd
    arg cmd, what, is, args;
    var valid, line, syntax, value, public;
    
    (> .perms(sender(), 'this) <);
    valid = $user_data.valid_settings();
    what = (| valid[what] |);
    if (!what) {
        syntax = cmd + " <setting name> is|to <value> [+/-public]";
        lines = ["Where setting name can be any of: "];
        lines = [@lines, dict_keys(valid).to_english()];
        $parse.tell_error(lines, syntax);
    }
    args = $parse.options(args, #[["public", [1, 0]]]);
    public = args[2];
    value = (args[1]).to_string();
    .set_data(what, value, (public["public"])[1]);
.

method data_cmd
    arg com, who;
    var valid, line, user;
    
    if (!who)
        user = this();
    else
        user = (| .find_object(who, 'user, 'environment, 'grasp) |);
    if (!user) {
        .tell(("!  No user found by the name \"" + who) + "\".");
        .tell("!  To set a value use the syntax:");
        .tell(("!    '" + com) + " [+p|+public|-p|-public] my <parameter> is|are <value>'");
        return;
    }
    .tell(("Current personal data settings on " + (user.namef())) + ":");
    valid = $user_data.valid_settings();
    .tell(user.display_data());
    if (user.connected())
        .tell((user.name()) + " is connected.");
    else
        .tell(((((user.name()) + " was last connected at ") + ($time.ltime(abs(user.connected_at())))) + " ") + ($time.ldate(abs(user.connected_at()))));
    .tell("--");
.

method display_data
    arg [dont_display];
    var x, valid, line, len, pub, actor, data, lines, output;
    
    actor = sender();
    len = actor.linelen();
    valid = $user_data.valid_settings();
    output = [];
    for x in (valid) {
        if (!((x[2]) in dont_display)) {
            data = (| user_data[x[2]] |);
            if (data) {
                if ((data[1]) || (.is_writable_by(actor)))
                    line = data[2];
                else
                    line = "not public.";
            } else {
                continue;
            }
            pub = (| (user_data[x[2]])[1] |);
            pub = ((!pub) && (type(pub) != 'error)) ? "*" | " ";
            if ((len - 20) < strlen(line)) {
                output = [@output, (pub + ($string.capitalize(x[1]))) + ":"];
                lines = $string.wrap_line(line, len, "   ");
                lines = replace(lines, 1, "   " + (lines[1]));
                output = output + lines;
            } else {
                output = output + [(pub + pad(($string.capitalize(x[1])) + ": ", 13)) + line];
            }
        }
    }
    return output;
.

method set_info_cmd
    arg cmd, what, is, args;
    var valid, lines, syntax, value, public;
    
    (> .perms(sender(), 'this) <);
    valid = $user_data.valid_settings();
    what = (| valid[what] |);
    if (!what) {
        syntax = cmd + " <setting name> is|to <value> [+/-public]";
        lines = ["Where setting name can be any of: "];
        lines = [@lines, dict_keys(valid).to_english()];
        $parse.tell_error(lines, syntax);
    }
    args = $parse.options(args, #[["public", [1, 0]]]);
    public = args[2];
    value = (args[1]).to_string();
    if (value in ["none", "<none>"])
        value = "";
    .set_data(what, value, (public["public"])[1]);
    if (!value)
        .tell(("You unset " + (tostr(what).capitalize())) + ".");
    else
        .tell((("You set " + (tostr(what).capitalize())) + " to ") + ($string.chop(value, 50)));
.

method user_data
    arg [which];
    var d, v;
    
    if ((!which) && (!(.is_writable_by(sender()))))
        throw(~perm, "You are unable to get full user data, try specific fields.");
    if (which) {
        which = which[1];
        v = ($user_data.valid_settings()).values();
        d = (| user_data[which] |);
        if ((!d) && (!(which in v)))
            throw(~type, "No user data field type of " + toliteral(which));
        else if (!d)
            return "Not set.";
        else if ((!(d[1])) && (!(.is_writable_by(sender()))))
            throw(~perm, "That value is not public.");
        else
            return d[2];
    } else {
        return user_data;
    }
.