/** * This handler contains the methods to handle the creators list of * directories to control bugs in. */ #include <config.h> inherit ERRORS_BASE; string name, *dirs; nosave int _no_calls; protected void recursive_add_dir( string word, string dir ); /** * This method initialises the data for a particular creator. * @param word the creator name to get the data for */ void init_data( string word ) { name = word; dirs = ({ }); } /* init_data() */ /** * This method loads up the data file for the particular player. * @param word the creator name to load the data for */ int get_data_file( string word ) { if( name != word ) { seteuid( geteuid(TP) ); if( file_size("/w/"+word+"/finderror.o") > 0 ) { unguarded( (: restore_object, "/w/"+word+"/finderror" :) ); name = word; } else { init_data( word ); return 0; } } return 1; } /* get_data_file() */ /** * The methods saves the information stored into the error information * in their directory. * @param word the player name to save the data for */ void save_data_file( string word ) { unguarded( (: save_object, "/w/"+word+"/finderror" :) ); } /* save_data_file() */ /** * This method gets the next directory which has an error in it from * the creators list of directories to search. * @param word the creator to get the next directory for */ string get_next_dir( string word ) { string dir, str, query; mixed ret; get_data_file( word ); if( sizeof( dirs ) ) { query = "SELECT Id FROM errors WHERE Directory = '%s' AND Status = 'OPEN';"; if( ret = init_errors( word, CONFIG_DB_USER ) ) return 0; foreach( dir in dirs ) { ret = sql_query( word, query, dir[0..<2] ); if( !stringp(ret) && ret > 0 ) { str = dir; break; } } if( str ) { dirs -= ({ str }); dirs += ({ str }); save_data_file( word ); } finish_errors( word ); } return str; } /* get_next_dir() */ /** * This method adds the directory to the creators directory list to check. * @param word the creator to add the directory to * @param dir the directory to add * @param recursive to add the directory recursively */ int add_dir( string word, string dir, int recursive ) { int res; get_data_file( word ); res = member_array( dir, dirs ); dirs -= ({ dir }); dirs = ({ dir }) + dirs; if( recursive ) { _no_calls++; call_out( (: recursive_add_dir :), 1, word, dir ); } save_data_file( word ); return res; } /* add_dir() */ /** * This method adds all the subdirectories of the specified dir into the * search list. * @param word the creatro to add to the list of * @param dir the directory to recursively add to */ protected void recursive_add_dir( string word, string dir ) { mixed *directories, *file; _no_calls--; directories = get_dir( dir, -1 ); if( directories ) { foreach ( file in directories ) { if( file[ 1 ] == -2 ) add_dir( word, dir + file[ 0 ] +"/", 1 ); } } if( !_no_calls ) { tell_object( find_player( word ), "All subdirectories have been " "added to the list.\n" ); } } /* recursive_add_dir() */ /** * This method will remove a directory from the list that a player * checks. * @param word the creator to remove the directory from * @param dir the directory to remove * @param recursive to recursively remove them */ int remove_dir( string word, string dir, int recursive ) { int res, len; string d; get_data_file( word ); if( recursive ) { len = sizeof( dir ) - 1; d = dir; dirs = filter( dirs, (: $1[ 0 .. $(len) ] != $(d) :) ); res = 1; } else { res = member_array( dir, dirs ); dirs -= ({ dir }); } save_data_file( word ); return res; } /* remove_dir() */ /** * This method returns the list of dirs associated with this creator. * @param word the creator to look up the directories for * @return the array of directories */ string *query_dirs( string word ) { get_data_file( word ); return dirs; } /* query_dirs() */ /** * This method returns the error counts for all the directories in the * list of directories to watch. * @param word the creator to get the dir count for */ string *query_dirs_count( string word ) { string dir, query, *result = ({ }); int key, total = 0; mixed ret; get_data_file(word); if( dirs && sizeof(dirs) ) { key = time(); if( ( ret = init_errors( key, CONFIG_DB_USER ) ) ) return ({ sprintf("Error connecting to the errors database: %s", ret ) }); query = "SELECT Id FROM errors WHERE Directory = '%s' AND Status = 'OPEN';"; foreach( dir in dirs ) { ret = sql_query( key, query, dir[0..<2] ); if( stringp(ret) ) { result += ({ sprintf("%s: %s", dir, ret ) }); continue; } if( ret > 0 ) { total += ret; result += ({ sprintf("%s: %d", dir, ret ) }); } } if( total ) result += ({ sprintf("Total: %d", total ) }); finish_errors(key); } return result; } /* query_dirs_count() */