dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
/*    /daemon/bugs.c
 *    from the Dead Soulsr1 Object Library
 *    a management daemon for bug tracking
 *    created by Descartes of Borg 950925
 */

#include <lib.h>
#include <save.h>
#include "include/bugs.h"

inherit LIB_DAEMON;

#define UNCOMPLETED_LIFE          (24 * 3600 * 30 * 6)
#define COMPLETED_LIFE            (24 * 3600 * 10)

private int NextID;
private mapping Bugs;

static void create() {
    mapping bug;
    int t, bug_id;

    daemon::create();
    if( file_size(SAVE_BUGS __SAVE_EXTENSION__) > 0 )
	unguarded( (: restore_object, SAVE_BUGS :));
    if( NextID < 1 || !Bugs ) {
	NextID = 1;
	Bugs = ([]);
    }
    t = time();
    foreach(bug_id, bug in Bugs) {
	if( !bug["date assigned"] ) continue;
	if( t - bug["date assigned"] > UNCOMPLETED_LIFE ) 
	    map_delete(Bugs, bug_id);
	else if( bug["date assigned"] && bug["date fixed"] ) {
	    if( t - bug["date fixed"] > COMPLETED_LIFE )
		map_delete(Bugs, bug_id);
	}
    }
    unguarded( (: save_object, SAVE_BUGS :));
}

int eventAssign(int bug, string who) {
    if( !Bugs[bug] ) return 0;
    if( !user_exists(convert_name(who)) ) return 0;
    else who = capitalize(who);
    Bugs[bug]["assigned"] = who;
    Bugs[bug]["date assigned"] = time();
    return unguarded( (: save_object, SAVE_BUGS :) );
}

int eventComplete(int bug, string resolution) {
    if( !Bugs[bug] ) return 0;
    Bugs[bug]["date fixed"] = time();
    Bugs[bug]["resolution"] = resolution;
    if( unguarded( (: save_object, SAVE_BUGS :) ) ) return 1;
    else {
	Bugs[bug]["date fixed"] = 0;
	Bugs[bug]["resolution"] = 0;
	return 0;
    }
}

int eventDelete(int bug) {
    mapping fu;

    if( !Bugs[bug] ) return 0;
    fu = copy(Bugs);
    map_delete(Bugs, bug);
    if( !save_object(SAVE_BUGS) ) {
	Bugs = fu;
	return 0; /* some asshole tried to delete this bug */
    }
    else return 1;
}

int eventReport(string who, string type, string bug, string data) {
    int x;

    x = NextID++;
    Bugs[x] = ([ "who" : who, "type" : type, "bug" : bug, "data" : data, 
      "assigned" : 0, "date fixed" : 0, "resolution" : 0 ]);
    if( unguarded( (: save_object, SAVE_BUGS :) ) ) return x;
    else {
	map_delete(Bugs, x);
	return 0;
    }
}

int GetAssignedBugs(string who) {
    mapping rep;
    int id, x = 0;

    foreach( id, rep in Bugs) 
    if( rep["assigned"] && !rep["date fixed"] &&
      (convert_name(rep["assigned"]) == who) ) x++;
    return x;
}

mapping GetBugs() { return Bugs; }

string AddComment(int bug, string comment) {
    string tmp;

    if( !Bugs[bug] ) return 0;
    if( !Bugs[bug]["data"] ) Bugs[bug]["data"] = "";
    tmp = Bugs[bug]["data"];
    Bugs[bug]["data"] += "\n" + comment;
    if( !unguarded( (: save_object, SAVE_BUGS :) ) ) {
	Bugs[bug]["data"] = tmp;
	return 0;
    }
    return Bugs[bug]["data"];
}