/
CDC-1.1/
parent $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 [["@user-data * my * is|are *", 'data_is_cmd], ["@user-data *", 'data_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 #[["finger %this", ['finger_vrb, 'remote]]]

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

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);
    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 com, public, me, what, is, value;
    var valid, kvalid, tmp;
    
    .perms(sender(), 'parser);
    valid = $user_data.valid_settings();
    what = (| valid[what] |);
    if (!what) {
        tmp = " [+p|+public|-p|-public] my <setting name> is <value>'";
        .tell(("! => Syntax: '" + com) + tmp);
        .tell("!  Where setting name can be any of: ");
        tmp = $string.wrap_line($list.to_english(dict_keys(valid)), .linelen(), "!    ");
        tmp = replace(tmp, 1, "!    " + (tmp[1]));
        .tell(tmp);
        return;
    }
    if ((!public) || (public in ["+p", "+public"]))
        public = 1;
    else if (public in ["-p", "-public"])
        public = 0;
    else
        $parse.tell_error("Invalid public setting (must be +p, +public, -p or -public)");
    .set_data(what, value, public);
    .tell("Value set.");
.

method data_cmd
    arg com, who;
    var valid, line, user;
    
    .perms(sender(), 'parser);
    
    //
    if (!who)
        user = this();
    else
        user = (| .find_object(who, 'environment, 'user, '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());
    .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 finger_vrb
    arg [args];
    
.