// _bug.c
// original written by Sulam 030192
// help added by Buddha 180192
// logging for individual creators added by Descartes 201092
// Edit, word wrap added by Manny 100893
#include <std.h>
#include <dirs.h>
#include <security.h>
inherit DAEMON;
int cmd_bug(string text);
int report(string *lines);
void end_text();
void abort();
string file;
int cmd_bug(string text) {
string *lines;
string str, new_text;
object ob;
if(!text || ob = present(text,this_player()) ||
ob = present(text, environment(this_player()))) {
rm(DIR_TMP+"/"+(string)this_player()->query_name()+".bug");
file = file_name(ob ? ob : environment(previous_object()));
previous_object()->edit(DIR_TMP+"/"+(string)this_player()->query_name()+".bug",
(:"end_edit":), (:"abort":));
return 1;
}
if(sscanf(text, "%s %s", str, new_text) == 2) {
if(!(ob = present(str, this_player())) &&
!(ob = present(str, environment(this_player()))))
new_text = str+" "+new_text;
}
if(!ob) ob = environment(this_player());
file = file_name(ob);
text = file + ": "+text;
lines = explode(wrap(text), "\n");
report(lines);
return 1;
}
end_edit() {
string *lines;
string tmpfile;
tmpfile = file+":\n"+read_file(DIR_TMP+"/"+(string)this_player()->query_name()+".bug");
lines = explode(wrap(replace_string(tmpfile, "\n", " "), 77), "\n");
rm("/tmp/"+this_player()->query_name()+".bug");
report(lines);
}
report(string *lines) {
string who, *elements;
int x;
elements = explode(file, "/");
if(elements[0] == "realms") who = elements[1];
else if(elements[0] == "domains") who = elements[1];
else who = 0;
log_file("bugs", "Bug reported by "+this_player()->query_cap_name()+
" "+ctime(time())+":\n");
if(who) log_file("reports/"+who, "Bug reported by "+
this_player()->query_cap_name()+": "+ctime(time())+"\n");
x = -1;
while(++x < sizeof(lines)) {
log_file("bugs", lines[x]+"\n");
if(who) log_file("reports/"+who, lines[x]+"\n");
}
write("Bug reported! Thank you!\n");
return 1;
}
void abort() {
notify_fail("Bug report aborted.\n");
rm("/tmp/"+this_player()->query_name()+".bug");
return 0;
}