/* /daemon/bugs.c * from the Dead Souls Object Library * a management daemon for bug tracking * created by Descartes of Borg 950925 */ #include #include #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 string SaveFile; static void create() { mapping bug; int t, bug_id; SaveFile = save_file(SAVE_BUGS); daemon::create(); if(unguarded( (: file_exists(SaveFile) :) ) ){ RestoreObject(SaveFile); } 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); } } SaveObject(SaveFile); } 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 SaveObject(SaveFile); } int eventComplete(int bug, string resolution) { if( !Bugs[bug] ) return 0; Bugs[bug]["date fixed"] = time(); Bugs[bug]["resolution"] = resolution; if( SaveObject(SaveFile) ) 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( !SaveObject(SaveFile) ) { Bugs = fu; return 0; /* someone 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( SaveObject(SaveFile) ) return x; else { map_delete(Bugs, x); return 0; } } int BugCheck(){ int bugs = 0; foreach(int id, mapping rep in Bugs){ if(!rep["resolution"]) bugs++; } return bugs; } 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( !SaveObject(SaveFile) ) { Bugs[bug]["data"] = tmp; return 0; } return Bugs[bug]["data"]; }