parent $programmer
object $admin
var $root child_index 11
var $root owners [$admin]
var $root fertile 0
var $has_commands commands [["@copy * to *", 'copy_cmd], ["@task?s", 'tasks_cmd], ["@del-t?ask|@kill *", 'del_task_cmd], ["@backup", 'backup_cmd], ["@shutdown *", 'shutdown_cmd], ["@grep from * for *", 'grep_cmd], ["@egrep from * for *", 'grep_cmd], ["@adjust user|att?itude * to *", 'adjust_user_cmd], ["@log *", 'log_cmd]]
var $has_commands shortcuts []
var $has_verbs verbs #[]
var $location contents []
var $located location $nowhere
var $user password "*"
var $user connected_at 0
var $user last_command_at 0
var $user connections []
var $root inited 1
var $root owned [$admin]
var $programmer eval_prefix #[["me", "me = this()"], ["here", "here = this().location()"]]
var $admin shutdown_started 0
var $command_aliases command_aliases []
var $user modes #[]
var $gendered gender $gender_neuter
var $located obvious 1
var $described prose #[]
var $user prompt ""
var $root manager $admin
var $root writable [$admin]
var $root readable ['parameters, 'methods, 'code]
var $user parsers [$command_parser, $verb_parser]
var $user tell_traceback ['verbose, 4]
var $user context #[]
var $root quota 75000
var $root dbref 'admin
var $named name ['uniq, "Generic Admin"]
var $named name_aliases []
var $user_data user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]]
method init_admin
if (caller() != $root)
throw(~perm, "Caller is not $root.");
$sys.new_admin();
.
method uninit_admin
if (caller() != $root)
throw(~perm, "Caller is not $root.");
$sys.admin_going_away();
.
method copy_cmd
arg sspec, tspec;
var mode, parsed, sobj, smtd, code, tobj, tmtd, errors;
// @copy dbref.method to dbref[.method]
if (!(.is_writable_by(sender())))
throw(~perm, "Sender is not an owner.");
// 'mode will hold the copy mode, for possible copying of commands and verbs.
// currently only handles methods.
mode = 'method;
parsed = explode(sspec, ".");
if (listlen(parsed) != 2) {
.tell(("! \"" + sspec) + "\" is not a reference to the source method.");
return;
}
sobj = $parse.object_match(parsed[1]);
if (!sobj)
return;
smtd = tosym(parsed[2]);
catch ~methodnf, ~perm {
code = sobj.list_method(smtd);
} with handler {
switch (error()) {
case ~methodnf:
.tell(((("! " + (sobj.id())) + " does not define a method ") + toliteral(smtd)) + ".");
case ~perm:
.tell(("! " + (sobj.id())) + " is not readable by you.");
}
return;
}
parsed = explode(tspec, ".");
if (listlen(parsed) != 2)
tmtd = smtd;
else
tmtd = tosym(parsed[2]);
tobj = $parse.object_match(parsed[1]);
if (!tobj)
return;
catch ~perm {
errors = tobj.compile(code, tmtd);
if (errors) {
// This should never happen.
.tell(errors);
} else {
.tell((((((toliteral(smtd) + " successfully copied from ") + (sobj.id())) + " to ") + (tobj.id())) + ((smtd != tmtd) ? " as " + toliteral(tmtd) | "")) + ".");
}
} with handler {
.tell(((("! Permission denied to @copy " + tostr('mode)) + " to ") + (tobj.id())) + ".");
}
.
method del_task_cmd
arg com, task;
var syn;
.perms(sender(), 'parser);
syn = ("`" + com) + " <TID>' (use @tasks to get a TID)";
task = toint(task);
if (!task)
$parse.tell_error("Tasks must be given as an integer", syn);
catch any {
$scheduler.del_task(task);
} with handler {
$parse.tell_error((traceback()[1])[2], syn);
}
.tell(("Task number " + tostr(task)) + " deleted.");
.
method tasks_cmd
arg com;
var output, task, task_queue, line, len_c1, time, args;
.perms(sender(), 'parser);
task_queue = $scheduler.task_queue();
len_c1 = $list.nth_element_maxlength(1, task_queue);
len_c1 = (len_c1 > 5) ? len_c1 + 1 | 5;
output = [];
time = (($time.ltime('12hr_sec, 'ampm)) + " ") + ($time.ldate('long));
.tell("=====[ Queued Tasks at: " + time);
.tell((pad("TID", len_c1) + pad("Exec Time", 20)) + "Task");
.tell((pad("---", len_c1) + pad("---------", 20)) + "----");
if (task_queue) {
for task in (task_queue) {
// this is broken down like this, because I HATE wrapped lines.
line = pad(tostr(task[1]), len_c1);
time = (task[2]) + (task[3]);
time = (($time.ldate(time, 'dmy, 'dash)) + " ") + ($time.ltime(time, '12hr_sec, 'ampm));
line = line + pad(time, 20);
line = (((line + ($data.unparse(task[4]))) + ".") + tostr(task[6])) + "(";
args = $data.unparse(task[8]);
line = (line + substr(args, 2, strlen(args) - 2)) + ")";
.tell($string.chop(line, .linelen()));
}
} else {
.tell("*** NO QUEUED TASKS ****");
}
.
method backup_cmd
arg com;
.perms(sender(), 'parser);
.tell("Starting backup.");
$sys.do_backup(this());
.tell("Done.");
.
method shutdown_cmd
arg com, [why];
var time;
.perms(sender(), 'parser);
why = why[1];
time = toint(why);
if (time || (why && ((why[1]) == "0")))
why = $list.to_string(sublist(explode(why), 2));
else
time = 5;
if (why) {
.tell([(("Shutdown the server in " + tostr(time)) + " minutes because: ") + why, "[yes|no]"]);
.read_line('_shutdown_ask, why, time);
} else {
.tell("Why do you want to shutdown the server?");
.read_line('_shutdown_why, time);
}
.
method _shutdown_why
arg str, time;
if (sender() != this())
throw(~perm, "Sender is not this.");
if (!str)
return .tell("I guess you just don't want to shutdown...");
.tell([(("Shutdown the server in " + tostr(time)) + " minutes because: ") + (str[1]), "[yes|no]"]);
.read_line('_shutdown_ask, @str, time);
.
method _shutdown_ask
arg str, why, time;
str = str[1];
if (sender() != this())
throw(~perm, "Sender is not this.");
if (match_begin("no", str))
return .tell("I didn't think so...");
.tell("Ok...");
if (time)
shutdown_started = time * 60;
._shutdown(why);
.
method _shutdown
arg why;
var line1, line2;
if (sender() != this())
throw(~perm, "Sender is not this");
//
if (shutdown_started >= 120)
shutdown_started = shutdown_started - 120;
else if (shutdown_started >= 60)
shutdown_started = shutdown_started - 60;
else
shutdown_started = 0;
//
if (shutdown_started > 0) {
line1 = " *** SERVER WILL BE SHUTDOWN IN ";
line1 = line1 + uppercase($time.elapsed(shutdown_started, 'long));
if (why)
line1 = line1 + " because:";
line2 = (" *** " + why) + " ***";
$channels.announce('all, line1 + " ***");
if (why)
$channels.announce('all, line2);
$scheduler.add_task(120, '_shutdown, why);
} else {
$sys.shutdown(why);
}
.
method _grep
arg what, obj, [type];
var method, found, findings, what;
findings = [];
for method in (obj.methods()) {
found = (| $string.search_pat(what, obj.list_method(method), 1, @type) |);
if (found)
findings = findings + [[obj, method, found]];
pause();
}
return findings;
.
method adjust_user_cmd
arg com, com, who, com, what;
var promos, wp, name, kpromos;
.perms(sender(), 'parser);
what = explode(what);
what = what[listlen(what)];
promos = #[["user", ['user, $user]], ["builder", ['builder, $builder]], ["programmer", ['programmer, $programmer]], ["admin", ['admin, $admin]]];
kpromos = dict_keys(promos);
who = .match_env_nice(who);
wp = who.parents();
if (!(what in kpromos))
$parse.tell_error(("Promote to any of: " + ($list.to_english(kpromos))) + ".");
(| who.chparents([(promos[what])[2]]) |);
who.tell((((((.namef()) + " has made you ") + ($string.a_or_an(what))) + " ") + what) + ".");
if ($guest in wp) {
who.set_password("password");
(| who.del_filter($wrap_filter) |);
who.tell("! Your password is currently \"password\". ");
who.tell("! Please change it immediately with the @password command.");
who.tell("! Characters with unchanged passwords before they disconnect will be destroyed.");
who.set_title("");
}
if (what == "admin")
(| who.set_dbref(tosym(who.namef())) |);
.tell((((((who.namef()) + " is now ") + ($string.a_or_an(what))) + " ") + what) + ".");
.
method grep_cmd
arg com, prep_from, from, prep_for, what;
var found, x;
.perms(sender(), 'parser);
.tell("Searching...");
if (com == "@grep") {
if (("^" in what) != 1)
what = "*" + what;
if (what && (("$" in what) != strlen(what)))
what = what + "*";
}
from = .match_env_nice(from);
found = .grep(what, from, @(com == "@grep") ? [] | ['regexp]);
for x in (found)
.tell((((((x[1]).dbref()) + ".") + tostr(x[2])) + " : ") + tostr((x[3])[1]));
.tell("--- + Finis + ---");
.
method egrep_cmd
arg what;
var found, x;
.perms(sender(), 'parser);
.tell("Searching...");
found = .grep(what, 'regexp);
for x in (found)
.tell((((((x[1]).name_str()) + ".") + tostr(x[2])) + " : ") + tostr((x[3])[1]));
.tell("--- + Finis + ---");
.
method grep
arg what, from, [type];
var object, method, found, findings, count, total;
findings = [];
count = 0;
total = 0;
for object in ([from, @from.descendants()]) {
found = ._grep(what, object, @type);
if (found)
findings = findings + [@found];
count = count + 1;
total = total + 1;
if (count == 50) {
.tell(tostr(total) + " Objects Searched...");
count = 0;
}
pause();
}
// fix later
.tell(tostr(total) + " Objects Searched.");
return findings;
.
method log_cmd
arg com, [line];
.perms(sender(), 'parser);
if (!(line[1])) {
return $changes_log.read_cmd("", "");
} else {
line = line[1];
line = (($time.ldate('mdy, 'dash)) + "]: ") + line;
line = ((((.namef()) + " [") + ($time.ltime('24hr))) + "/") + line;
$changes_log.add_text([line], this(), 'dont_even_think_it);
.tell("Thank you for your donation.");
}
.