// Project handler (/handler/project.c) V0.1 // Coded by Donky - 29/09/96 // Converted and redone for here by Shaydz 08/10/00 inherit "/secure/std/modules/group"; // defines: #define DEBUG(xx) tell_object(find_player("shaydz"), xx); #define SAVE_FILE "/secure/save/handlers/project" #define SECURITY geteuid(previous_object()) // prototypes: void load_me(); void save_me(); // group-external list maintained for speed purposes string *leaders; private void create() { leaders = ({ }); seteuid(master()->creator_file(file_name(this_object()))); group::mudlib_setup(); load_me(); if (sizeof(leaders)) leaders = filter(leaders, (: creatorp($1) :)); } /* setup() */ // MAINTENANCE: --------------------------------- void load_me() { unguarded((: restore_object , SAVE_FILE :)); } /* load_me() */ void save_me() { unguarded((: save_object ,SAVE_FILE :)); } /* save_me() */ // MEMBER: -------------------------------------- // return whether user is an existing member // return whether user is a member of a specific group int query_member(string project, string name) { /* if (!stringp(project) || !stringp(name)) return 0; */ return group::query_member(project, name); } /* query_member() */ string *query_members(string project) { return copy(group::query_members(project)); } /* query_members() */ mixed add_member(string project, string name) { int i; if (!stringp(project) || !stringp(name)) return "Invalid arguments"; if (!"/secure/login"->test_user(name) || !creatorp(name)) return capitalize(name) +" is not an existing creator"; if (!PRIVILEGE_H -> query_privilege("project."+ project +".member.add", SECURITY)) return "Insufficient privilege to add "+ capitalize(name) +" to the "+ project +" project"; if (!group::query_member(name)) group::create_member(name); if (i = group::add_member(project, name)) save_me(); return (i ? 0 : "Unable to add "+ capitalize(name) +" to the "+ project +" project"); } /* add_member() */ mixed remove_member(string project, string name) { int i; if (!PRIVILEGE_H -> query_privilege("project."+ project +".member.remove", SECURITY)) return "Insufficient privilege to remove "+ capitalize(name) +" from " "the "+ project +" project"; if (stringp(project) && !stringp(name)) { string *grps, grp; if (arrayp(grps = group::query_groups(project))) foreach (grp in grps) group::remove_member(grp, project); group::delete_member(project); save_me(); return 0; } if (!stringp(project) || !stringp(name)) return "Invalid arguments"; if (i = group::remove_member(project, name)) save_me(); if (!sizeof(group::query_groups(name))) { group::delete_member(name); save_me(); } return (i ? 0 : "Unable to remove "+ capitalize(name) +" from the "+ project +" project"); } /* remove_member() */ // PROJECT: ------------------------------------- // return true if given project exists int query_project(string name) { return group::query_group(name); } /* query_project() */ // return list of projects // return list of projects user belongs to string *query_projects(string name) { return copy(group::query_groups(name)); } /* query_projects() */ string add_project(string name) { int i; if (!PRIVILEGE_H -> query_privilege("project.add", SECURITY)) return "Insufficient privilege to create a project"; if (i = group::add_group(name)) save_me(); return (i ? 0 : "Unable to create a project"); } /* add_project() */ string remove_project(string name) { int i; if (!PRIVILEGE_H -> query_privilege("project.remove", SECURITY)) return "Insufficent privilege to delete a project"; if (i = group::remove_group(name)) save_me(); return (i ? 0 : "Unable to delete a project"); } /* remove_project() */ // LEADER: -------------------------------------- varargs int query_leader(string project, string name) { return group::query_leader(project, name); } /* query_leader() */ string *query_leaders(string project) { if (!stringp(project)) return copy(leaders); return copy(group::query_leaders(project)); } /* query_leaders() */ mixed add_leader(string project, string name) { if (!PRIVILEGE_H -> query_privilege("project."+ project +".leader.add", SECURITY)) return "Insufficient privilege to add "+ capitalize(name) +" as a leader " "of the "+ project +" project"; if (group::add_leader(project, name)) { if (member_array(name, leaders) == -1) leaders += ({ name }); save_me(); return 0; } return "Unable to add "+ capitalize(name) +" as a leader of the "+ project + " project"; } /* add_leader() */ mixed remove_leader(string project, string name) { if (!PRIVILEGE_H -> query_privilege("project."+ project +".leader.remove", SECURITY)) return "Insufficient privilege to remove "+ capitalize(name) +" as a "+ "leader of the "+ project +" project"; if (group::remove_leader(project, name)) { if (!query_leader(name)) leaders -= ({ name }); save_me(); return 0; } return "Unable to remove "+ capitalize(name) +" as a leader of the "+ project +" project"; } /* remove_leader() */ mixed log_who(string project, string file) { return query_leaders(project); } varargs string query_short(string project, string user) { int i, j; string prj, *prjs = ({ }), *ldr = ({ }); if (stringp(project) && !stringp(user)) { // Quick make-do routine return capitalize(project); } if (!stringp(project) && stringp(user)) { prjs = query_projects(user); foreach (prj in prjs) if (query_leader(prj, user)) ldr += ({ prj }); prjs -= ldr; prj = ""; j = sizeof(prjs); if (i = sizeof(ldr)) prj += "leader of the "+ query_multiple_short(ldr) + " project"+ (i > 1 ? "s" : "") + (j ? ", " : ""); if (j) prj += "member of the "+ query_multiple_short(prjs) + " project"+ (j > 1 ? "s" : ""); return prj; } if (stringp(project) && stringp(user)) { // return ctrs project specific title } return 0; } string query_long(string name) { if (file_exists(PROJECT_DIR "/"+ name +"/ABOUT")) return read_file(PROJECT_DIR "/"+ name +"/ABOUT"); else return "This project hasn't been documented yet. " "Please mail "+ query_multiple_short(query_leaders(name)) + " to get this fixed.\n"; } /* query_long */ nomask void dwep() { object my_ob = TO; if (my_ob) destruct(my_ob); } /* dwep() */ void dest_me() { dwep(); }