#include <commands.h>
#include <security.h>
#include <daemons.h>
inherit __DIR__ "internal/base";
class command_info array module_commands(string);
string our_task;
class command_info array our_defaults;
string module_name() {
return "main";
}
void finish_add_task(string title, string desc) {
string t_id = TASK_D->add_task(our_task, title, desc,
this_user()->query_userid());
if (!t_id) {
write("** Error: Unable to add '"+title+"' below "+our_task+".\n");
return;
}
write("Added " + t_id + "(" + title + ").\n");
do_help();
}
nomask private void my_add_task(string title) {
input_one_arg("Description: ",(: finish_add_task, title :) );
}
nomask private void my_complete_task(string task_id) {
int result;
if (our_task != 0)
task_id = our_task + "." + task_id;
result = TASK_D->complete_task(task_id);
if (!result) {
write("** Error: Unable to complete task " + task_id + "\n");
return;
}
if (stringp(result)) {
write("** Error: " + result + "\n");
return;
}
write("Done.\n");
do_help();
}
nomask private void my_remove_task(string task_id) {
if (our_task != 0)
task_id = our_task + "." + task_id;
if (!TASK_D->remove_task(task_id)) {
write("** Error: No such task: " + task_id + "\n");
return;
}
write("Done.\n");
do_help();
}
class command_info array module_commands() {
class command_info array ret = ({ });
int n = 1;
if (our_task != 0) {
array t = TASK_D->query_task(our_task);
ret += ({
new(class command_info, desc : t[1] )
});
}
foreach (array task in TASK_D->query_tasks(our_task)) {
string key, name, status;
key = sprintf("%d", n);
if (key) {
string file = base_name();
string task_id = key;
if (our_task != 0)
task_id = our_task + "." + task_id;
name = TASK_D->query_title(task_id);
status = TASK_D->query_status(task_id);
status = repeat_string(".", 12 - sizeof(status)) + status;
status = "[" + status + "]";
ret += ({
new(class command_info, key : key, desc : name,
action : (: clone_object, file, task_id :),
status : status)
});
}
n++;
}
ret += ({
new(class command_info),
new(class command_info,
key : "a",
proto : "[title]",
args : ({ "Title: " }),
action : (: my_add_task :),
desc : "add task"),
new(class command_info,
key : "c",
proto : "[id]",
args : ({ "Task ID: " }),
action : (: my_complete_task :),
desc : "complete task"),
new(class command_info,
key : "r",
proto : "[id]",
args : ({ "Task ID: " }),
action : (: my_remove_task :),
desc : "remove task"),
});
return ret;
}
protected void heading() {
string task_str = "Task Tool";
if (our_task) {
task_str = "["+our_task+"] " + TASK_D->query_title(our_task);
}
write("\n%^TASK_HEADING%^"
"--- " + task_str + " ---\n"
"%^RESET%^\n");
}
protected class command_info array defaults() {
return our_defaults;
}
void create(string task_id)
{
if ( clonep() )
{
our_task = task_id;
our_defaults = ({
new(class command_info), // blank line
});
/* Only set up "previous menu" option if not top-level. */
if (our_task != 0) {
our_defaults += ({
new(class command_info, key : "m", desc : "previous menu",
action : (: do_main_menu :)),
});
}
our_defaults += ({
new(class command_info, key : "q", desc : "quit",
action : (: do_quit :)),
new(class command_info, key : "?", desc : "help",
action : (: do_help :))
});
if ( file_name(previous_object()) != CMD_OB_TASKTOOL &&
base_name(previous_object()) != TASKTOOL )
{
write("Illegal attempt to clone TASKTOOL\n");
destruct(this_object());
return;
}
::create();
}
}