// Group module (/std/module/group.c) // Coded by Donky - 25/09/96 // Donky @ 29th June 1999 // Modified add_leader() to add the person as a member if they are not // already one. Also modified remove_member() to remove someone as a // leader if they are one. // Shaydz - 07-02-2001 modified lots and added senior support stuff //inherit "/secure/std/classes/group"; class profile { int date_created; string creator; // person who created the object string name; // name string short; // title string long; // description of purpose } class member { string *groups; // groups member belongs to class profile info; } class group { string *members; // members who belong to the group string *leaders; // leaders of the group string *seniors; // seniors of a group class profile info; } private class group *groups; private class member *members; protected void mudlib_setup() { groups = ({ }); members = ({ }); } /* mudlib_setup() */ private int find_group(string name) { int offset, found; class group group; foreach (group in groups) { if (group -> info -> name == name) { found++; break; } offset++; } if (found) return offset; else return -1; } private int find_member(string name) { int offset, found; class member member; foreach (member in members) { if (member -> info -> name == name) { found++; break; } offset++; } if (found) return offset; else return -1; } int create_member(string name) { string creator; class member new_member; // can only create properly named members that don't already exist if (!stringp(name) || (find_member(name) != -1)) return 0; if (this_player()) creator = this_player() -> query_name(); new_member = new(class member); new_member -> info = new(class profile); new_member -> info -> name = name; new_member -> info -> creator = creator; new_member -> info -> date_created = time(); members += ({ new_member }); return 1; } int delete_member(string name) { int i, mi; class group group; if (!stringp(name) || ((mi = find_member(name)) == -1)) return 0; members = delete(members, mi, 1); // possible optimised version.. member -> groups foreach (group in groups) { if (arrayp(group -> members)) if ((i = member_array(name, group -> members)) != -1) group -> members = delete(group -> members, i, 1); if (arrayp(group -> leaders)) if ((i = member_array(name, group -> leaders)) != -1) group -> leaders = delete(group -> leaders, i, 1); } return 1; } /* delete_member() */ varargs int query_member(string group, string name) { int mi, gi; if (!stringp(name) && stringp(group)) return (find_member(group) != -1); if ((gi = find_group(group)) == -1 || (mi = find_member(name)) == -1) return 0; if (arrayp(members[mi] -> groups)) return member_array(group, members[mi] -> groups) != -1; else return 0; } mixed query_member_thing() { if(!adminp(TP)) return 0; //Temp function, but let's not take chances. return members; } string *query_members(string group) { int gi; class member member; string *names = ({ }); if (stringp(group)) { if ((gi = find_group(group)) == -1) return 0; return groups[gi] -> members; } foreach (member in members) names += ({ member -> info -> name }); return names; } mixed add_member(string group, string name) { int mi, gi; // can only add existing members to existing groups if they don't already // belong if ((gi = find_group(group)) == -1 || (mi = find_member(name)) == -1 || query_member(group, name)) return 0; if (arrayp(groups[gi] -> members)) groups[gi] -> members += ({ name }); else groups[gi] -> members = ({ name }); if (arrayp(members[mi] -> groups)) members[mi] -> groups += ({ group }); else members[mi] -> groups = ({ group }); return 1; } mixed remove_member(string group, string name) { int i, mi, gi; string *grps; // can only remove existing members of existing groups if they belong if ((gi = find_group(group)) == -1 || (mi = find_member(name)) == -1 || !query_member(group, name)) return 0; grps = members[mi] -> groups; // Removing someone as a member should implicitly mean they need to be // removed as a leader as well. if (arrayp(grps) && member_array(group, grps) != -1) { groups[gi] -> members -= ({ name }); groups[gi] -> leaders -= ({ name }); members[mi] -> groups -= ({ group }); i = 1; } return i; } /* remove_member() */ int query_leader(string group, string name) { int gi; class group grp; if (!stringp(name) && stringp(group)) { foreach (grp in groups) if (arrayp(grp -> leaders)) if (member_array(group, grp -> leaders) != -1) return 1; return 0; } if ((gi = find_group(group)) == -1 || find_member(name) == -1) return 0; if (arrayp(groups[gi] -> leaders)) return (member_array(name, groups[gi] -> leaders) != -1); return 0; } string *query_leaders(string name) { int gi; class group group; string leader, *names = ({ }); if (stringp(name)) { if ((gi = find_group(name)) == -1) return 0; if (arrayp(groups[gi] -> leaders)) return groups[gi] -> leaders; else return ({ }); } foreach (group in groups) foreach (leader in group -> leaders) if (member_array(leader, names) == -1) names += ({ leader }); return names; } mixed add_leader(string group, string name) { int gi, mi; // can only add leaders to existing groups if they aren't already if ((gi = find_group(group)) == -1 || (mi = find_member(name)) == -1 || query_leader(group, name)) return 0; // Adding someone as a leader should implicitly add them as a // member. Yeah, yeah, had some problems with this. if (arrayp(groups[gi] -> members)) { if (member_array(name, groups[gi] -> members) == -1) groups[gi] -> members += ({ name }); } else groups[gi] -> members = ({ name }); if (arrayp(members[mi] -> groups)) { if (member_array(group, members[mi] -> groups) == -1) members[mi] -> groups += ({ group }); } else members[mi] -> groups = ({ name }); if (arrayp(groups[gi] -> leaders)) groups[gi] -> leaders += ({ name }); else groups[gi] -> leaders = ({ name }); return 1; } mixed remove_leader(string group, string name) { int i, gi; // can only remove existing leaders of existing groups if ((gi = find_group(group)) == -1 || find_member(name) == -1 || !query_leader(group, name)) return 0; if (arrayp(groups[gi] -> leaders) && (i = member_array(name, groups[gi] -> leaders)) != -1) { groups[gi] -> leaders = delete(groups[gi] -> leaders, i, 1); return 1; } return 0; } // Seniors. int query_senior(string group, string name) { int gi; class group grp; if (!stringp(name) && stringp(group)) { foreach (grp in groups) if (arrayp(grp -> seniors)) if (member_array(group, grp -> seniors) != -1) return 1; return 0; } if ((gi = find_group(group)) == -1 || find_member(name) == -1) return 0; if (arrayp(groups[gi] -> seniors)) return (member_array(name, groups[gi] -> seniors) != -1); return 0; } string *query_seniors(string name) { int gi; class group group; string senior, *names = ({ }); if (stringp(name)) { if ((gi = find_group(name)) == -1) return 0; if (arrayp(groups[gi] -> seniors)) return groups[gi] -> seniors; else return ({ }); } foreach (group in groups) foreach (senior in group -> seniors) if (member_array(senior, names) == -1) names += ({ senior }); return names; } mixed add_senior(string group, string name) { int gi, mi; // can only add seniors to existing groups if they aren't already if ((gi = find_group(group)) == -1 || (mi = find_member(name)) == -1 || query_senior(group, name)) return 0; // Adding someone as a senior should implicitly add them as a member. if (arrayp(groups[gi] -> members)) { if (member_array(name, groups[gi] -> members) == -1) groups[gi] -> members += ({ name }); } else groups[gi] -> members = ({ name }); if (arrayp(members[mi] -> groups)) { if (member_array(group, members[mi] -> groups) == -1) members[mi] -> groups += ({ group }); } else members[mi] -> groups = ({ name }); if (arrayp(groups[gi] -> seniors)) groups[gi] -> seniors += ({ name }); else groups[gi] -> seniors = ({ name }); return 1; } mixed remove_senior(string group, string name) { int i, gi; // can only remove existing seniors of existing groups if ((gi = find_group(group)) == -1 || find_member(name) == -1 || !query_senior(group, name)) return 0; if (arrayp(groups[gi] -> seniors) && (i = member_array(name, groups[gi] -> seniors)) != -1) { groups[gi] -> seniors = delete(groups[gi] -> seniors, i, 1); return 1; } return 0; } int add_group(string name) { int gi; string creator; class group new_group; // can only add groups that don't already exist if ((gi = find_group(name)) != -1) return 0; if (this_player()) creator = this_player() -> query_name(); new_group = new(class group); new_group -> members = ({ }); new_group -> leaders = ({ }); new_group -> seniors = ({ }); new_group -> info = new(class profile); new_group -> info -> name = name; new_group -> info -> creator = creator; new_group -> info -> date_created = time(); groups += ({ new_group }); return 1; } int remove_group(string name) { int gi; class member member; // can only remove existing groups if ((gi = find_group(name)) == -1) return 0; // remove all references to the group in internal player lists foreach (member in members) if (arrayp(member -> groups)) member -> groups -= ({ name }); // remove the group itself groups = delete(groups, gi, 1); return 1; } /* remove_group() */ int query_group(string name) { return (find_group(name) != -1); } // return list of groups // return list of groups a member belongs to string *query_groups(string name) { int gi; string *names = ({ }); class group group; if (stringp(name)) { if ((gi = find_member(name)) == -1) return names; names = members[gi] -> groups; if (arrayp(names)) return names; else return ({ }); } foreach (group in groups) names += ({ group -> info -> name }); return names; } /* query_groups() */