Author: soliton
Date: Sun May 17 01:38:21 2009
New Revision: 35678

URL: http://svn.gna.org/viewcvs/wesnoth?rev=35678&view=rev
Log:
implemented an unmute command for games

Modified:
    trunk/src/server/game.cpp
    trunk/src/server/game.hpp
    trunk/src/server/server.cpp

Modified: trunk/src/server/game.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/game.cpp?rev=35678&r1=35677&r2=35678&view=diff
==============================================================================
--- trunk/src/server/game.cpp (original)
+++ trunk/src/server/game.cpp Sun May 17 01:38:21 2009
@@ -557,37 +557,46 @@
        }
 }
 
-void game::mute_observer(const simple_wml::node& mute, const 
player_map::const_iterator muter) {
+void game::send_muted_observers(const player_map::const_iterator user) const
+{
+       if (all_observers_muted_) {
+               send_server_message("All observers are muted.", user->first);
+               return;
+       }
+       std::string muted_nicks = "";
+       for (user_vector::const_iterator muted_obs = muted_observers_.begin();
+                       muted_obs != muted_observers_.end(); ++muted_obs)
+       {
+               if (muted_nicks != "") {
+                       muted_nicks += ", ";
+               }
+               muted_nicks += (player_info_->find(*muted_obs) != 
player_info_->end()
+                               ? player_info_->find(*muted_obs)->second.name() 
: "");
+       }
+
+       send_server_message(("Muted observers: " + muted_nicks).c_str(), 
user->first);
+}
+
+void game::mute_observer(const simple_wml::node& mute,
+               const player_map::const_iterator muter)
+{
        if (muter->first != owner_) {
                send_server_message("You cannot mute: not the game host.", 
muter->first);
                return;
        }
-       const simple_wml::string_span& name = mute["username"];
-       if (name.empty()) {
-               if (all_observers_muted_) {
-                       send_server_message("All observers are muted.", 
muter->first);
-                       return;
-               }
-               std::string muted_nicks = "";
-               for (user_vector::const_iterator muted_obs = 
muted_observers_.begin();
-                        muted_obs != muted_observers_.end(); ++muted_obs)
-               {
-                       if (muted_nicks != "") {
-                               muted_nicks += ", ";
-                       }
-                       muted_nicks += 
player_info_->find(*muted_obs)->second.name();
-               }
-
-               send_server_message(("Muted observers: " + 
muted_nicks).c_str(), muter->first);
-               return;
-       }
-       const player_map::const_iterator user = find_user(name);
+       const simple_wml::string_span& username = mute["username"];
+       if (username.empty()) {
+               send_muted_observers(muter);
+               return;
+       }
+
+       const player_map::const_iterator user = find_user(username);
        /**
-        * @todo FIXME: Maybe rather save muted nicks as a vector of strings and
+        * @todo FIXME: Maybe rather save muted nicks as a set of strings and
         * also allow muting of usernames not in the game.
         */
        if (user == player_info_->end() || !is_observer(user->first)) {
-               send_server_message("Observer not found.", muter->first);
+               send_server_message(("Observer '" + username.to_string() + "' 
not found.").c_str(), muter->first);
                return;
        }
 
@@ -597,15 +606,49 @@
                return;
        }
        if (is_muted_observer(user->first)) {
-               send_server_message((user->second.name() + " is already 
muted.").c_str(), muter->first);
-               return;
-       }
-       muted_observers_.push_back(user->first);
+               send_server_message((username.to_string() + " is already 
muted.").c_str(), muter->first);
+               return;
+       }
        LOG_GAME << network::ip_address(muter->first) << "\t"
-               << muter->second.name() << " muted: " << name << " ("
+               << muter->second.name() << " muted: " << username << " ("
                << network::ip_address(user->first) << ")\tin game:\t\""
                << name_ << "\" (" << id_ << ")\n";
-       send_and_record_server_message((user->second.name() + " has been 
muted.").c_str());
+       muted_observers_.push_back(user->first);
+       send_and_record_server_message((username.to_string() + " has been 
muted.").c_str());
+}
+
+void game::unmute_observer(const simple_wml::node& unmute,
+               const player_map::const_iterator unmuter)
+{
+       if (unmuter->first != owner_) {
+               send_server_message("You cannot unmute: not the game host.", 
unmuter->first);
+               return;
+       }
+       const simple_wml::string_span& username = unmute["username"];
+       if (username.empty()) {
+               muted_observers_.clear();
+               send_and_record_server_message("Everyone has been unmuted.");
+               return;
+       }
+
+       const player_map::const_iterator user = find_user(username);
+       if (user == player_info_->end() || !is_observer(user->first)) {
+               send_server_message(("Observer '" + username.to_string() + "' 
not found.").c_str(), unmuter->first);
+               return;
+       }
+
+       if (!is_muted_observer(user->first)) {
+               send_server_message((username.to_string() + " is not 
muted.").c_str(), unmuter->first);
+               return;
+       }
+
+       LOG_GAME << network::ip_address(unmuter->first) << "\t"
+               << unmuter->second.name() << " unmuted: " << username << " ("
+               << network::ip_address(user->first) << ")\tin game:\t\""
+               << name_ << "\" (" << id_ << ")\n";
+       muted_observers_.erase(std::remove(muted_observers_.begin(),
+                               muted_observers_.end(), user->first), 
muted_observers_.end());
+       send_and_record_server_message((username.to_string() + " has been 
unmuted.").c_str());
 }
 
 network::connection game::kick_member(const simple_wml::node& kick,
@@ -615,8 +658,8 @@
                send_server_message("You cannot kick: not the game host", 
kicker->first);
                return 0;
        }
-       const simple_wml::string_span& name = kick["username"];
-       const player_map::const_iterator user = find_user(name);
+       const simple_wml::string_span& username = kick["username"];
+       const player_map::const_iterator user = find_user(username);
        if (user == player_info_->end() || !is_member(user->first)) {
                send_server_message("Not a member of this game.", 
kicker->first);
                return 0;
@@ -626,10 +669,10 @@
                return 0;
        }
        LOG_GAME << network::ip_address(kicker->first) << "\t"
-               << kicker->second.name() << "\tkicked: " << name << " ("
+               << kicker->second.name() << "\tkicked: " << username << " ("
                << network::ip_address(user->first) << ")\tfrom game:\t\""
                << name_ << "\" (" << id_ << ")\n";
-       send_and_record_server_message((name.to_string() + " has been 
kicked.").c_str());
+       send_and_record_server_message((username.to_string() + " has been 
kicked.").c_str());
 
        // Tell the user to leave the game.
        static simple_wml::document leave_game("[leave_game]\n[/leave_game]\n", 
simple_wml::INIT_COMPRESSED);
@@ -646,8 +689,8 @@
                send_server_message("You cannot ban: not the game host", 
banner->first);
                return 0;
        }
-       const simple_wml::string_span& name = ban["username"];
-       const player_map::const_iterator user = find_user(name);
+       const simple_wml::string_span& username = ban["username"];
+       const player_map::const_iterator user = find_user(username);
        if (user == player_info_->end()) {
                send_server_message("User not found", banner->first);
                return 0;
@@ -658,16 +701,16 @@
        }
        if (player_is_banned(user->first)) {
                std::ostringstream stream;
-               stream << name << " is already banned.";
+               stream << username << " is already banned.";
                send_server_message(stream.str().c_str(), banner->first);
                return 0;
        }
        LOG_GAME << network::ip_address(banner->first) << "\t"
-               << banner->second.name() << "\tbanned: " << name << " ("
+               << banner->second.name() << "\tbanned: " << username << " ("
                << network::ip_address(user->first) << ")\tfrom game:\t\""
                << name_ << "\" (" << id_ << ")\n";
        bans_.push_back(network::ip_address(user->first));
-       send_and_record_server_message((name.to_string() + " has been 
banned.").c_str());
+       send_and_record_server_message((username.to_string() + " has been 
banned.").c_str());
        if (is_member(user->first)) {
                //tell the user to leave the game.
                static simple_wml::document 
leave_game("[leave_game]\n[/leave_game]\n", simple_wml::INIT_COMPRESSED);

Modified: trunk/src/server/game.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/game.hpp?rev=35678&r1=35677&r2=35678&view=diff
==============================================================================
--- trunk/src/server/game.hpp (original)
+++ trunk/src/server/game.hpp Sun May 17 01:38:21 2009
@@ -66,6 +66,8 @@
         */
        void mute_observer(const simple_wml::node& mute, const 
player_map::const_iterator muter);
 
+       void unmute_observer(const simple_wml::node& unmute, const 
player_map::const_iterator unmuter);
+
        /**
         * Kick a member by name.
         *
@@ -190,6 +192,7 @@
        { return (current_player() == player); }
        bool is_muted_observer(const network::connection player) const;
        bool all_observers_muted() const { return all_observers_muted_; }
+       void send_muted_observers(const player_map::const_iterator user) const;
 
        /**
         * Figures out which side to take and tells that side to the game owner.

Modified: trunk/src/server/server.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/server.cpp?rev=35678&r1=35677&r2=35678&view=diff
==============================================================================
--- trunk/src/server/server.cpp (original)
+++ trunk/src/server/server.cpp Sun May 17 01:38:21 2009
@@ -2131,11 +2131,11 @@
                }
                return;
        // If this is data describing side changes by the host.
-       } else if (data.child("scenario_diff")) {
+       } else if (const simple_wml::node* diff = data.child("scenario_diff")) {
                if (!g->is_owner(sock)) return;
-               g->level().root().apply_diff(*data.child("scenario_diff"));
-               const simple_wml::node* cfg_change = 
data.child("scenario_diff")->child("change_child");
-               if ((cfg_change != NULL) && (cfg_change->child("side") != 
NULL)) {
+               g->level().root().apply_diff(*diff);
+               const simple_wml::node* cfg_change = 
diff->child("change_child");
+               if (cfg_change && cfg_change->child("side")) {
                        g->update_side_data();
                }
                if (g->describe_slots()) {
@@ -2148,9 +2148,8 @@
                g->send_data(data, sock);
                return;
        // If the owner of a side is changing the controller.
-       } else if (data.child("change_controller")) {
-               const simple_wml::node& change = 
*data.child("change_controller");
-               g->transfer_side_control(sock, change);
+       } else if (const simple_wml::node *change = 
data.child("change_controller")) {
+               g->transfer_side_control(sock, *change);
                if (g->describe_slots()) {
                        update_game_in_lobby(g);
                }
@@ -2165,8 +2164,12 @@
                g->mute_all_observers();
                return;
        // If an observer should be muted.
-       } else if (data.child("mute")) {
-               g->mute_observer(*data.child("mute"), pl);
+       } else if (const simple_wml::node* mute = data.child("mute")) {
+               g->mute_observer(*mute, pl);
+               return;
+       // If an observer should be unmuted.
+       } else if (const simple_wml::node* unmute = data.child("unmute")) {
+               g->unmute_observer(*unmute, pl);
                return;
        // The owner is kicking/banning someone from the game.
        } else if (data.child("kick") || data.child("ban")) {
@@ -2197,11 +2200,10 @@
                }
                return;
        // If info is being provided about the game state.
-       } else if (data.child("info")) {
+       } else if (const simple_wml::node* info = data.child("info")) {
                if (!g->is_player(sock)) return;
-               const simple_wml::node& info = *data.child("info");
-               if (info["type"] == "termination") {
-                       
g->set_termination_reason(info["condition"].to_string());
+               if ((*info)["type"] == "termination") {
+                       
g->set_termination_reason((*info)["condition"].to_string());
                }
                return;
        } else if (data.child("turn")) {


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to