nightmare4_fluffos_v1/
nightmare4_fluffos_v1/bin/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/ChangeLog.old/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/Win32/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/compat/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/compat/simuls/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/include/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/clone/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/command/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/data/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/etc/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/include/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/inherit/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/inherit/master/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/log/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/tests/compiler/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/tests/efuns/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/single/tests/operators/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/testsuite/u/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/tmp/
nightmare4_fluffos_v1/fluffos-2.9-ds2.14/windows/
nightmare4_fluffos_v1/lib/cfg/
nightmare4_fluffos_v1/lib/cmds/admins/
nightmare4_fluffos_v1/lib/cmds/common/
nightmare4_fluffos_v1/lib/cmds/creators/include/
nightmare4_fluffos_v1/lib/cmds/creators/include/SCCS/
nightmare4_fluffos_v1/lib/cmds/hm/
nightmare4_fluffos_v1/lib/daemon/services/
nightmare4_fluffos_v1/lib/doc/
nightmare4_fluffos_v1/lib/doc/faq/
nightmare4_fluffos_v1/lib/doc/help/classes/
nightmare4_fluffos_v1/lib/doc/help/creators/
nightmare4_fluffos_v1/lib/doc/help/hm/
nightmare4_fluffos_v1/lib/doc/help/players/
nightmare4_fluffos_v1/lib/doc/help/races/
nightmare4_fluffos_v1/lib/doc/help/religion/
nightmare4_fluffos_v1/lib/doc/mudlib/
nightmare4_fluffos_v1/lib/doc/mudlib/cfg/
nightmare4_fluffos_v1/lib/domains/Ylsrim/
nightmare4_fluffos_v1/lib/domains/Ylsrim/adm/
nightmare4_fluffos_v1/lib/domains/Ylsrim/armour/
nightmare4_fluffos_v1/lib/domains/Ylsrim/fish/
nightmare4_fluffos_v1/lib/domains/Ylsrim/meal/
nightmare4_fluffos_v1/lib/domains/Ylsrim/npc/
nightmare4_fluffos_v1/lib/domains/Ylsrim/virtual/
nightmare4_fluffos_v1/lib/domains/Ylsrim/weapon/
nightmare4_fluffos_v1/lib/domains/Ylsrim/xtra/
nightmare4_fluffos_v1/lib/lib/comp/
nightmare4_fluffos_v1/lib/lib/lvs/
nightmare4_fluffos_v1/lib/lib/std/
nightmare4_fluffos_v1/lib/lib/user/
nightmare4_fluffos_v1/lib/news/
nightmare4_fluffos_v1/lib/obj/
nightmare4_fluffos_v1/lib/obj/include/
nightmare4_fluffos_v1/lib/save/
nightmare4_fluffos_v1/lib/save/kills/a/
nightmare4_fluffos_v1/lib/save/kills/b/
nightmare4_fluffos_v1/lib/save/kills/f/
nightmare4_fluffos_v1/lib/save/kills/m/
nightmare4_fluffos_v1/lib/save/kills/q/
nightmare4_fluffos_v1/lib/save/kills/r/
nightmare4_fluffos_v1/lib/secure/cfg/
nightmare4_fluffos_v1/lib/secure/cfg/classes/
nightmare4_fluffos_v1/lib/secure/cfg/races/SCCS/
nightmare4_fluffos_v1/lib/secure/cmds/creators/include/
nightmare4_fluffos_v1/lib/secure/cmds/players/
nightmare4_fluffos_v1/lib/secure/cmds/players/include/
nightmare4_fluffos_v1/lib/secure/daemon/include/
nightmare4_fluffos_v1/lib/secure/lib/
nightmare4_fluffos_v1/lib/secure/lib/include/
nightmare4_fluffos_v1/lib/secure/lib/net/
nightmare4_fluffos_v1/lib/secure/lib/std/
nightmare4_fluffos_v1/lib/secure/obj/
nightmare4_fluffos_v1/lib/secure/obj/include/
nightmare4_fluffos_v1/lib/secure/save/
nightmare4_fluffos_v1/lib/secure/save/boards/
nightmare4_fluffos_v1/lib/secure/save/votes/
nightmare4_fluffos_v1/lib/spells/
nightmare4_fluffos_v1/lib/verbs/admins/include/
nightmare4_fluffos_v1/lib/verbs/common/
nightmare4_fluffos_v1/lib/verbs/common/include/
nightmare4_fluffos_v1/lib/verbs/creators/
nightmare4_fluffos_v1/lib/verbs/creators/include/
nightmare4_fluffos_v1/lib/verbs/players/include/SCCS/
nightmare4_fluffos_v1/lib/verbs/rooms/
nightmare4_fluffos_v1/lib/verbs/rooms/include/
nightmare4_fluffos_v1/lib/www/
nightmare4_fluffos_v1/old/
nightmare4_fluffos_v1/old/tools/
nightmare4_fluffos_v1/win32/
/*    /daemon/bugs.c
 *    from the Nightmare IVr1 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"];
}