/** * THis is the controller object to deal with the club rooms. It * keeps track of which club owns the room, if the club room has * a board and any ownership issues that are needed. * @author Pinkfish * @started May 16th */inherit "/std/basic/setup";#include <clubs.h>#include <room/club_room.h>private nosave string _save_directory;private mapping _options;private string _club;private mapping _ownership;private nosave mapping _default_ownership;private int _board_contained;class ownership { string name; int type; int control_type;}private void setup_discussions();void save_me();void load_me();void create() { _options = ([ ]); _ownership = ([ ]); _default_ownership = ([ ]); do_setup(); // Make sure the save file is setup correctly. call_out((: load_me() :), 0);} /* create() */private void add_board_to(string club) { int board_count; // Next add the board to the new club. board_count = CLUB_HANDLER->query_elected_option(club, CLUB_ROOM_BOARD_COUNT); board_count++; if (board_count == 1) { CLUB_HANDLER->create_club_board(club); } CLUB_HANDLER->set_elected_option(club, CLUB_ROOM_BOARD_COUNT, board_count);} /* add_board_to() */private void remove_board_from(string club) { int board_count; board_count = CLUB_HANDLER->query_elected_option(club, CLUB_ROOM_BOARD_COUNT); board_count--; if (board_count == 0 && CLUB_HANDLER->query_club_board(club)) { CLUB_HANDLER->remove_club_board(club); } if (board_count <= 0) { CLUB_HANDLER->remove_elected_option(club, CLUB_ROOM_BOARD_COUNT); } else { CLUB_HANDLER->set_elected_option(club, CLUB_ROOM_BOARD_COUNT, board_count); }} /* remove_board_from() *//** * This method sets the club that currently owns the set of rooms. * @param club the club that owns the rooms * @return 1 on success, 0 on failure */int set_club(string club) { class ownership bing; class ownership fluff; string name; if (!CLUB_HANDLER->is_elected_club(club)) { return 0; } if (_club && CLUB_HANDLER->query_club_name(club) == CLUB_HANDLER->query_club_name(_club)) { return 1; } // Changing clubs. if (_board_contained) { // First remove the board from the old club... if (_club) { remove_board_from(_club); } add_board_to(club); } _club = club; // // Ok, need to set all the owned items as unowned and then // setup things for them. // foreach (name, bing in _ownership) { if (bing->control_type != CLUB_ROOM_CONTROLLED_FIXED) { if (_default_ownership[name]) { fluff = _default_ownership[name]; bing->type = fluff->type; if (functionp(fluff->name)) { bing->name = evaluate(fluff->name, name, club); } else { bing->name = fluff->name; } } } } call_out((: setup_discussions :), 1); save_me(); return 1;} /* set_club() *//** * This method queries the club that currently owns the set of rooms. * @return the club that owns the rooms */string query_club() { return _club;} /* query_club() *//** * This method sets if a board is associated with the club room set or * not. * @parm board_associated is there a board associated */void set_board_associated(int board_associated) { // Make sure it only has a 0 or 1 value. board_associated = board_associated != 0; if (_club) { if (_board_contained != board_associated) { if (board_associated) { add_board_to(_club); } else { remove_board_from(_club); } } } _board_contained = board_associated;} /* set_board_associated() *//** * This method queries to see if there is a board associated or not * @return 1 if there is aboard associated with this club room set */int query_board_associated() { return _board_contained;} /* query_board_associated() *//** * This method checks to see if there is an option associated with the * club room. * @param name the name of the optionto check * @return 1 if there is, 0 if not */int is_option(string name) { return !undefinedp(_options[name]);} /* is_option() *//** * This method queries and option associated with the club room. * @param name the name of the option * @return the value of the option */mixed query_option(string name) { return _options[name];} /* query_option() *//** * This remove removes an option associated with the club room. * @param name the name of the optoin * @return 1 on success, 0 on failure */int remove_option(string name) { if (is_option(name)) { map_delete(_options, name); return 1; } return 0;} /* remove_option() *//** * This method sets the value of the option associated with the club room. * @param name the name of the option * @param value the new value for the option * @return 1 on success, 0 on failure */int set_option(string name, mixed value) { _options[name] = value;} /* set_option() *//** * This method adds an item to have ownership. If a function pointer * is set as the default name, then the method will be evaluated each * time the club changes. The first arguement will be the name of the * owned item being changed and the second argument will be the new * club name. * @param name the name of the option that needs ownership control * @param type the type of controlled ownership * @param default_type the default ownership of the item * @param default_name the default name of the owner * @return 1 on success, 0 on failure */int add_controlled_ownership(string name, int type, int default_type, string default_name) { class ownership bing; if (!_ownership[name]) { bing = new(class ownership); bing->name = CLUB_UNKNOWN_MEMBER; bing->type = CLUB_ROOM_OWNED_PERSON; bing->control_type = type; _ownership[name] = bing; bing = new(class ownership); bing->name = default_name; bing->type = default_type; bing->control_type = type; _default_ownership[name] = bing; //save_me(); return 1; } return 0;} /* add_controlled_ownership() *//** * This method sets the owner of the controlled ownership type. * @param controlled the item being controlled * @param owner the owner of the item * @param type the type of the owner * @return 1 on success, 0 on failure */int set_controlled_ownership_owner(string controlled, string owner, int type) { class ownership bing; if (!_ownership[controlled]) { return 0; } bing = _ownership[controlled]; bing->type = type; bing->name = owner; save_me(); return 1;} /* set_controlled_ownership_owner() *//** * This is the function used for nominating someone exciting the the * owned position of the club rooms. * @param message the message being sent * @param club_name the name of the club * @param frog the discussion item * @param arg1 the first argument * @param arg2 the second argument */mixed discuss_nominate_ownership(string message, string club_name, class discussion_idea frog, string arg1, string arg2) { string *nominated; string body; string *nom; string name; int ret; switch (message) { case CLUB_DISCUSS_MESSAGE_VERIFY : if (CLUB_HANDLER->query_club_name(club_name) != CLUB_HANDLER->query_club_name(_club)) { return 0; } if (!_ownership[frog->information]) { return 0; } return 1; case CLUB_DISCUSS_MESSAGE_COMPLETE : body = "Hello!\n\nThe discussion item " "added at " + ctime(frog->time_added) + ", finished at " + ctime(time()) + " and added by " + frog->added_by + " has finished."; body += " The vote for nominations for the ownership of " + frog->information + " in the club " + CLUB_HANDLER->query_club_name(club_name) + " has been completed and the " "results are:\n"; nominated = ({ }); foreach (name, nom in frog->choices) { body += name + ": " + query_multiple_short(nom); if ((member_array(name, nom) != -1 || name[0..strlen(CLUB_ROOM_POSITION_START)] == CLUB_ROOM_POSITION_START) && sizeof(nom) >= 2) { body += " (accepted)\n"; nominated += ({ name }); } else { body += "\n"; } } if (frog->information) { body += frog->information; } if (sizeof(nominated)) { if (_ownership[frog->information]) { if (sizeof(nominated) != 1) { body += "Therefor we had added an election with " + query_multiple_short(nominated) + " for the ownership of " + frog->information + ".\n"; CLUB_HANDLER->add_discussion_item(club_name, CLUB_DISCUSS_FUNCTION, frog->added_by, ({ file_name(TO), "discuss_elect_ownership" }), frog->information, nominated, 7 * (24 * 60 * 60), 0); } else { body += "Only " + nominated[0] + " was nominated, so they are given ownership immediately.\n"; if (name[0..strlen(CLUB_ROOM_POSITION_START)] == CLUB_ROOM_POSITION_START) { set_controlled_ownership_owner(frog->information, nominated[0][strlen(CLUB_ROOM_POSITION_START)..], CLUB_ROOM_OWNED_POSITION); } else { set_controlled_ownership_owner(frog->information, nominated[0], CLUB_ROOM_OWNED_PERSON); } } } else { body += "The ownership item appears to have vanished!\n"; } } else { if (_ownership[frog->information]) { body += "No one accepted their nomination, so nothing " "happened.\n"; CLUB_HANDLER->add_discussion_item(club_name, CLUB_DISCUSS_FUNCTION, frog->added_by, frog->name, frog->information, ({ }), 7 * (24 * 60 * 60), frog->optional_data); } else { body += "The position in the club appears to have vanished!\n"; } } return body; case CLUB_DISCUSS_MESSAGE_SHORT_DESCRIPTION : return "Nominations for ownership of " + frog->information; case CLUB_DISCUSS_MESSAGE_LONG_DESCRIPTION : body = "Nominations for the ownership of " + frog->information + ", positions or people can be nominated to have ownership. " "Positions are nominated by putting the word 'position' in front " "ie: 'position president'.\n" "Currently nominated are:\n"; foreach (name, nom in frog->choices) { body += name + ": " + query_multiple_short(nom); if ((member_array(name, nom) != -1 || name[0..strlen(CLUB_ROOM_POSITION_START) - 1] == CLUB_ROOM_POSITION_START) && sizeof(nom) >= 2) { body += " (accepted)\n"; } else { body += "\n"; } } return body; case CLUB_DISCUSS_MESSAGE_NOMINATION : if (CLUB_HANDLER->is_member_of(_club, arg1)) { // Ok, so the person nominating is a member. if (CLUB_HANDLER->is_member_of(_club, arg2) || (name[0..strlen(CLUB_ROOM_POSITION_START) - 1] == CLUB_ROOM_POSITION_START && CLUB_HANDLER->is_valid_position(_club, name[strlen(CLUB_ROOM_POSITION_START)..]))) { if (!frog->choices[arg2]) { frog->choices[arg2] = ({ arg1 }); return 1; } else if (member_array(arg1, frog->choices[arg2]) == -1) { frog->choices[arg2] += ({ arg1 }); return 1; } } } return 0; case CLUB_DISCUSS_MESSAGE_TYPE : return CLUB_DISCUSS_MESSAGE_TYPE_NOMINATE; case CLUB_DISCUSS_MESSAGE_REMOVE_MEMBER : // Check out to see if they have been nominated or nominated someone. if (frog->choices[arg1]) { map_delete(frog->choices, arg1); ret = 1; } foreach (name, nom in frog->choices) { if (member_array(arg1, nom) != -1) { frog->choices[name] = nom - ({ arg1 }); if (!sizeof(frog->choices[name])) { map_delete(frog->choices, name); } ret = 1; } } return ret; case CLUB_DISCUSS_MESSAGE_REMOVE_POSITION : if (frog->choices[CLUB_ROOM_POSITION_START + arg1]) { map_delete(frog->choices, CLUB_ROOM_POSITION_START + arg1); ret = 1; } return ret; case CLUB_DISCUSS_MESSAGE_CHANGE_POSITION : if (frog->choices[CLUB_ROOM_POSITION_START + arg1]) { frog->choices[CLUB_ROOM_POSITION_START + arg2] = frog->choices[CLUB_ROOM_POSITION_START + arg1]; map_delete(frog->choices, CLUB_ROOM_POSITION_START + arg1); ret = 1; } return ret; case CLUB_DISCUSS_MESSAGE_NOMINATION_QUERY : return frog->choices; }} /* discuss_nominate_ownership() *//** * This is the function used for electing whoever gets to have the * nice owned room. * @param message the message being sent * @param club_name the name of the club * @param frog the discussion item * @param arg1 the first argument * @param arg2 the second argument */mixed discuss_elect_ownership(string message, string club_name, class discussion_idea frog, string arg1, string arg2) { string body; string name; int votes; int ret; int max_votes; string *names; switch (message) { case CLUB_DISCUSS_MESSAGE_VERIFY : if (CLUB_HANDLER->query_club_name(club_name) != CLUB_HANDLER->query_club_name(_club)) { return 0; } if (!_ownership[frog->information]) { return 0; } return 1; case CLUB_DISCUSS_MESSAGE_COMPLETE : body = "Hello!\n\nThe discussion item " "added at " + ctime(frog->time_added) + ", finished at " + ctime(time()) + " and added by " + frog->added_by + " has finished."; body += " The vote for elections of the ownership of " + frog->information + " in the club " + CLUB_HANDLER->query_club_name(club_name) + " has been completed and the " "results are:\n"; names = ({ }); max_votes = 0; foreach (name, votes in frog->choices) { body += name + ": " + votes + "\n"; if (votes > max_votes) { max_votes = votes; names = ({ name }); } else if (votes == max_votes) { names += ({ name }); } } if (_ownership[frog->information]) { if (sizeof(names) == 1) { body += "Therefor we set " + names[0] + " as owning " + frog->information + ".\n"; if (names[0][0..strlen(CLUB_ROOM_POSITION_START) - 1] == CLUB_ROOM_POSITION_START) { set_controlled_ownership_owner(frog->information, names[0][strlen(CLUB_ROOM_POSITION_START)..], CLUB_ROOM_OWNED_POSITION); } else { set_controlled_ownership_owner(frog->information, names[0], CLUB_ROOM_OWNED_PERSON); } } else { body += "There was a tie for the results of the position, readding " "a discussion with the tied members: " + query_multiple_short(names) + ".\n"; CLUB_HANDLER->add_discussion_item(club_name, CLUB_DISCUSS_FUNCTION, frog->added_by, ({ file_name(TO), "discuss_elect_ownership" }), frog->information, names, 7 * (24 * 60 * 60), frog->optional_data); } } else { body += "The ownership item appears to have vanished!\n"; } return body; case CLUB_DISCUSS_MESSAGE_SHORT_DESCRIPTION : return "Election for ownership of " + frog->information; case CLUB_DISCUSS_MESSAGE_LONG_DESCRIPTION : body = "Election for the ownership of " + frog->information + ".\n"; return body; case CLUB_DISCUSS_MESSAGE_TYPE : return CLUB_DISCUSS_MESSAGE_TYPE_VOTE; case CLUB_DISCUSS_MESSAGE_REMOVE_MEMBER : // Check out to see if they have been nominated or nominated someone. if (frog->choices[arg1]) { map_delete(frog->choices, arg1); ret = 1; } return ret; case CLUB_DISCUSS_MESSAGE_REMOVE_POSITION : if (frog->choices[CLUB_ROOM_POSITION_START + arg1]) { map_delete(frog->choices, CLUB_ROOM_POSITION_START + arg1); ret = 1; } return ret; case CLUB_DISCUSS_MESSAGE_CHANGE_POSITION : if (frog->choices[CLUB_ROOM_POSITION_START + arg1]) { frog->choices[CLUB_ROOM_POSITION_START + arg2] = frog->choices[CLUB_ROOM_POSITION_START + arg1]; map_delete(frog->choices, CLUB_ROOM_POSITION_START + arg1); ret = 1; } return ret; }} /* discuss_elect_ownership() */private void setup_discussions() { string name; class ownership bing; foreach (name, bing in _ownership) { if (bing->control_type != CLUB_ROOM_CONTROLLED_FIXED) { CLUB_HANDLER->add_discussion_item(_club, CLUB_DISCUSS_FUNCTION, ({ file_name(TO), "discuss_nominate_ownership" }), name, ({ }), 7 * 24 * 60 * 60, 0); } }} /* setup_discussions() *//** * This method loads all the data from the save file. */void load_me() {//tell_creator("pinkfish", "Loading " + _save_file + "\n"); if (_save_directory) { unguarded( (: restore_object(_save_directory + CLUB_ROOM_CONTROLLER_SAVE_FILE ) :) );//tell_creator("pinkfish", "%O, %O, %O\n", _options, _club, _ownership); }} /* load_me() *//** * This method saves all the data to the save file. */void save_me() { if (_save_directory) { unguarded( (: save_object(_save_directory + CLUB_ROOM_CONTROLLER_SAVE_FILE ) :) ); }} /* save_me() *//** * This method sets the save directory for the club room controller. * @param save_file the new save file */void set_save_directory(string save_directory) { while (save_directory[<1] == '/') { save_directory = save_directory[0..<2]; } _save_directory = save_directory;} /* set_save_directory() *//** * This method returns the save file for the club room controller. * @return the save file for the club room controller */string query_save_directory() { return _save_directory;} /* query_save_directory() *//** * This method returns the save file name to use for the room. * @param fname the file name to use for the room * @return the save file name to use */string query_room_save_file_name(mixed fname) { if (objectp(fname)) { fname = file_name(fname); } fname = fname[strsrch(fname, '/', -1)..]; return _save_directory + fname;} /* query_room_save_file_name() */