/*
* New Project handler
* Author: Shaydz
* Started: 07/07/2005
*/
#define SAVE_FILE SECURE_DIR SAVE_DIR HANDLER_DIR "/project"
void load_me();
void save_me();
mapping projects;
nosave string tmp;
private void create() {
seteuid(master()->creator_file(file_name(TO)));
projects = ([]);
load_me();
} /* setup() */
void load_me() {
unguarded((: restore_object , SAVE_FILE :));
} /* load_me() */
void save_me() {
unguarded((: save_object ,SAVE_FILE :));
} /* save_me() */
void dest_me(){
destruct(TO);
} /* dest_me() */
int query_project(string creator, string dom, string proj){
if(!creator || !dom || !proj)
return 0;
if(projects[creator]){
if(projects[creator][dom]){
tmp = proj;
if(sizeof(filter(projects[creator][dom],(: lower_case($1) == lower_case(tmp) :)))){
return 1;
}
}
}
return 0;
} /* query_project() */
int add_project(string creator, string dom, string proj){
if (file_name(PO) != "/secure/cmds/creator/project")
return 0;
if(!creator || !dom || !proj)
return 0;
if(projects[creator]){
if(projects[creator][dom]){
if(query_project(creator,dom,proj)){
return 0;
}
projects[creator][dom] += ({proj});
}else{
projects[creator][dom] = ({proj});
}
save_me();
return 1;
}
projects[creator] = ([dom:({proj})]);
save_me();
return 1;
} /* add_project */
int remove_project(string creator, string dom, string proj){
if (file_name(PO) != "/secure/cmds/creator/project")
return 0;
if(!creator || !dom || !proj)
return 0;
if(projects[creator]){
if(projects[creator][dom]){
if(sizeof(projects[creator][dom])>1){
if(!query_project(creator,dom,proj)){
return 0;
}
projects[creator][dom] -= ({proj});
}else{
map_delete(projects[creator],dom);
}
if(!sizeof(projects[creator][dom])){
map_delete(projects[creator],dom);
}
if(!sizeof(projects[creator])){
map_delete(projects,creator);
}
save_me();
return 1;
}
}
return 0;
} /* remove_project() */
int clear_project(string str){
if(creatorp(str)){
map_delete(projects,str);
if(!sizeof(projects[str])){
map_delete(projects,str);
}
save_me();
return 1;
}
if(DOMAIN_H->query_domain(str)){
foreach(string cre in keys(projects)){
map_delete(projects[cre],str);
if(!sizeof(projects[cre][str])){
map_delete(projects[cre],str);
}
if(!sizeof(projects[cre])){
map_delete(projects,cre);
}
}
save_me();
return 1;
}
return 0;
} /* clear_project() */
mixed query_projects(string str){
mapping projs = ([]);
if(!sizeof(keys(projects)))
return ([]);
if(!str)
return projects;
if(creatorp(str)){
if(!projects[str]){
return ([]);
}else{
return projects[str];
}
}
if(DOMAIN_H->query_domain(str)){
foreach(string cre in keys(projects)){
if(sizeof(projects[cre][str]))
projs += ([cre:projects[cre][str]]);
}
return projs;
}
return ([]);
} /* query_projects() */