// 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(); }