Author: ilor
Date: Wed Jun 24 19:41:34 2009
New Revision: 36388

URL: http://svn.gna.org/viewcvs/wesnoth?rev=36388&view=rev
Log:
server room listing and room member list + /command interface in client

Modified:
    trunk/src/menu_events.cpp
    trunk/src/multiplayer_ui.cpp
    trunk/src/server/room.cpp
    trunk/src/server/room_manager.cpp
    trunk/src/server/room_manager.hpp
    trunk/src/server/server.cpp

Modified: trunk/src/menu_events.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/menu_events.cpp?rev=36388&r1=36387&r2=36388&view=diff
==============================================================================
--- trunk/src/menu_events.cpp (original)
+++ trunk/src/menu_events.cpp Wed Jun 24 19:41:34 2009
@@ -2006,6 +2006,8 @@
                        void do_emote();
                        void do_network_send();
                        void do_network_send_req_arg();
+                       void do_room_query();
+                       void do_room_query_noarg();
                        void do_whisper();
                        void do_chanmsg();
                        void do_log();
@@ -2120,6 +2122,10 @@
                                        _("Join a room."), "<room>");
                                register_command("part", 
&chat_command_handler::do_network_send_req_arg,
                                        _("Part a room."), "<room>");
+                               register_command("names", 
&chat_command_handler::do_room_query,
+                                       _("List room members."), "<room>");
+                               register_command("rooms", 
&chat_command_handler::do_room_query_noarg,
+                                       _("List available rooms."));
                                register_command("room", 
&chat_command_handler::do_chanmsg,
                                        _("Room msg."), "<room> <msg>");
                        }
@@ -2449,6 +2455,24 @@
                do_network_send();
        }
 
+       void chat_command_handler::do_room_query_noarg()
+       {
+               config data;
+               config& q = data.add_child("room_query");
+               q.add_child(get_cmd());
+               network::send_data(data, 0, true);
+       }
+
+       void chat_command_handler::do_room_query()
+       {
+               if (get_data(1).empty()) return command_failed_need_arg(1);
+               config data;
+               config& q = data.add_child("room_query");
+               q["room"] = get_data();
+               q.add_child(get_cmd());
+               network::send_data(data, 0, true);
+       }
+
        void chat_command_handler::do_whisper()
        {
                if (get_data(1).empty()) return command_failed_need_arg(1);
@@ -2474,7 +2498,7 @@
                cwhisper["sender"] = preferences::login();
                data.add_child("message", cwhisper);
                chat_handler_.add_chat_message(time(NULL),
-                       "room" + cwhisper["room"], 0,
+                       cwhisper["room"] + ": " + preferences::login(), 0,
                        cwhisper["message"], game_display::MESSAGE_PRIVATE);
                network::send_data(data, 0, true);
        }

Modified: trunk/src/multiplayer_ui.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_ui.cpp?rev=36388&r1=36387&r2=36388&view=diff
==============================================================================
--- trunk/src/multiplayer_ui.cpp (original)
+++ trunk/src/multiplayer_ui.cpp Wed Jun 24 19:41:34 2009
@@ -577,6 +577,43 @@
                        }
                        gamelist_refresh_ = true;
                }
+       } else if (const config &c = data.child("room_join")) {
+               if (c["player"] == preferences::login()) {
+                       chat_.add_message(time(NULL), "server",
+                               "You have joined the room '" + c["room"] + "'");
+               } else {
+                       chat_.add_message(time(NULL), "server",
+                               c["player"] + " has joined the room '" + 
c["room"] + "'");
+               }
+               chat_.update_textbox(chat_textbox_);
+       } else if (const config &c = data.child("room_part")) {
+               if (c["player"] == preferences::login()) {
+                       chat_.add_message(time(NULL), "server",
+                               "You have left the room '" + c["room"] + "'");
+               } else {
+                       chat_.add_message(time(NULL), "server",
+                               c["player"] + " has left the room '" + 
c["room"] + "'");
+               }
+               chat_.update_textbox(chat_textbox_);
+       } else if (const config &c = data.child("room_query_response")) {
+               if (const config &ms = c.child("members")) {
+                       std::stringstream ss;
+                       ss << "Room " << c["room"] << " members: ";
+                       foreach (const config& m, ms.child_range("member")) {
+                               ss << m["name"] << " ";
+                       }
+                       chat_.add_message(time(NULL), "server", ss.str());
+                       chat_.update_textbox(chat_textbox_);
+               }
+               if (const config &rs = c.child("rooms")) {
+                       std::stringstream ss;
+                       ss << "Rooms: ";
+                       foreach (const config& r, rs.child_range("room")) {
+                               ss << r["name"] << "(" << r["size"] << ") ";
+                       }
+                       chat_.add_message(time(NULL), "server", ss.str());
+                       chat_.update_textbox(chat_textbox_);
+               }
        }
 }
 

Modified: trunk/src/server/room.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/room.cpp?rev=36388&r1=36387&r2=36388&view=diff
==============================================================================
--- trunk/src/server/room.cpp (original)
+++ trunk/src/server/room.cpp Wed Jun 24 19:41:34 2009
@@ -106,4 +106,6 @@
 {
 }
 
+
+
 } //end namespace wesnothd

Modified: trunk/src/server/room_manager.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/room_manager.cpp?rev=36388&r1=36387&r2=36388&view=diff
==============================================================================
--- trunk/src/server/room_manager.cpp (original)
+++ trunk/src/server/room_manager.cpp Wed Jun 24 19:41:34 2009
@@ -117,19 +117,30 @@
        rooms_by_player_.erase(player);
 }
 
-room* room_manager::require_member(const std::string& room_name,
+room* room_manager::require_room(const std::string& room_name,
                                    const player_map::iterator user,
                                    const char *log_string)
 {
        room* r = get_room(room_name);
        if (r == NULL) {
+               lobby_->send_server_message("The room does not exist", 
user->first);
                WRN_LOBBY << "Player " << user->second.name()
                        << " (conn " << user->first << ")"
                        << " attempted to " << log_string
                        << "a nonexistant room '" << room_name << "'\n";
                return NULL;
        }
+       return r;
+}
+
+room* room_manager::require_member(const std::string& room_name,
+                                   const player_map::iterator user,
+                                   const char *log_string)
+{
+       room* r = require_room(room_name, user, log_string);
+       if (r == NULL) return NULL;
        if (!r->is_member(user->first)) {
+               lobby_->send_server_message("You are not a member of this 
room", user->first);
                WRN_LOBBY << "Player " << user->second.name()
                        << " (conn " << user->first << ")"
                        << " attempted to " << log_string
@@ -148,7 +159,6 @@
        //TODO: implement per-room bans, check ban status here
        room->add_player(player);
        rooms_by_player_[player].insert(room);
-       room->send_server_message(room->name().c_str(), player); //debug
        return true;
 }
 
@@ -156,7 +166,6 @@
 {
        room->remove_player(player);
        rooms_by_player_[player].erase(room);
-       room->send_server_message(room->name().c_str(), player); //debug
 }
 
 void room_manager::process_message(simple_wml::document &data, const 
player_map::iterator user)
@@ -213,13 +222,7 @@
        msg->set_attr_dup("player", user->second.name().c_str());
        r->send_data(data, user->first);
        // send member list to the new member
-       foreach (network::connection m, r->members()) {
-               simple_wml::node& member = msg->add_child("member");
-               player_map::const_iterator mi = all_players_.find(m);
-               if (mi != all_players_.end()) {
-                       member.set_attr_dup("name", mi->second.name().c_str());
-               }
-       }
+       fill_member_list(r, data.root());
        send_to_one(data, user->first);
 }
 
@@ -237,6 +240,56 @@
        player_exits_room(user->first, r);
        msg->set_attr_dup("player", user->second.name().c_str());
        r->send_data(data);
-}
-
+       send_to_one(data, user->first);
+}
+
+void room_manager::process_room_query(simple_wml::document& data, const 
player_map::iterator user)
+{
+       simple_wml::node* const msg = data.root().child("room_query");
+       assert(msg);
+       simple_wml::document doc;
+       simple_wml::node& resp = doc.root().add_child("room_query_response");
+       simple_wml::node* q;
+       q = msg->child("rooms");
+       if (q != NULL) {
+               fill_room_list(resp);
+               send_to_one(doc, user->first);
+               return;
+       }
+       std::string room_name = msg->attr("room").to_string();
+       if (room_name.empty()) room_name = lobby_name_;
+       room* r = require_room(room_name, user, "query");
+       if (r == NULL) return;
+       resp.set_attr_dup("room", room_name.c_str());
+       q = msg->child("names");
+       if (q != NULL) {
+               fill_member_list(r, resp);
+               send_to_one(doc, user->first);
+               return;
+       }
+       r->send_server_message("Unknown room query type", user->first);
+}
+
+void room_manager::fill_room_list(simple_wml::node& root)
+{
+       simple_wml::node& rooms = root.add_child("rooms");
+       foreach (const t_rooms_by_name_::value_type& tr, rooms_by_name_) {
+               const room& r = *tr.second;
+               simple_wml::node& room = rooms.add_child("room");
+               room.set_attr_dup("name", r.name().c_str());
+               room.set_attr_dup("size", 
lexical_cast<std::string>(r.members().size()).c_str());
+       }
+}
+
+void room_manager::fill_member_list(const room* room, simple_wml::node& root)
+{
+       simple_wml::node& members = root.add_child("members");
+       foreach (network::connection m, room->members()) {
+               simple_wml::node& member = members.add_child("member");
+               player_map::const_iterator mi = all_players_.find(m);
+               if (mi != all_players_.end()) {
+                       member.set_attr_dup("name", mi->second.name().c_str());
+               }
+       }
+}
 } //namespace wesnothd

Modified: trunk/src/server/room_manager.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/room_manager.hpp?rev=36388&r1=36387&r2=36388&view=diff
==============================================================================
--- trunk/src/server/room_manager.hpp (original)
+++ trunk/src/server/room_manager.hpp Wed Jun 24 19:41:34 2009
@@ -80,19 +80,46 @@
        void remove_player(network::connection player);
 
        /**
+        * Check if the room exists, log failures.
+        * @return non-NULL iff the room exists and the player is a member
+        */
+       room* require_room(const std::string& room_name,
+               const player_map::iterator user, const char* log_string = 
"use");
+
+       /**
         * Check if the room exists and if the player is a member, log failures.
         * @return non-NULL iff the room exists and the player is a member
         */
        room* require_member(const std::string& room_name,
                const player_map::iterator user, const char* log_string = 
"use");
 
+
+       /**
+        * Process a message (chat message) sent to a room. Check conditions
+        * and resend to other players in the room.
+        */
        void process_message(simple_wml::document& data, const 
player_map::iterator user);
 
+       /**
+        * Process a player's request to join a room
+        */
        void process_room_join(simple_wml::document& data, const 
player_map::iterator user);
 
+       /**
+        * Process a player's request to leave a room
+        */
        void process_room_part(simple_wml::document& data, const 
player_map::iterator user);
 
+       /**
+        * Process a general room query
+        */
+       void process_room_query(simple_wml::document& data, const 
player_map::iterator user);
+
+       /**
+        * Lobby convenience accesor
+        */
        const room& lobby() const { return *lobby_; }
+
 private:
        /**
         * Adds a player to a room, maintaining internal consistency
@@ -105,6 +132,16 @@
         * Removes a player from a room, maintaining internal consistency
         */
        void player_exits_room(network::connection player, room* room);
+
+       /**
+        * Fill a wml node (message) with members of a room
+        */
+       void fill_member_list(const room* room, simple_wml::node& root);
+
+       /**
+        * Fill a wml node (message) with a room list
+        */
+       void fill_room_list(simple_wml::node& root);
 
 
 

Modified: trunk/src/server/server.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/server.cpp?rev=36388&r1=36387&r2=36388&view=diff
==============================================================================
--- trunk/src/server/server.cpp (original)
+++ trunk/src/server/server.cpp Wed Jun 24 19:41:34 2009
@@ -1873,6 +1873,10 @@
                rooms_.process_room_part(data, pl);
        }
 
+       if (data.child("room_query")) {
+               rooms_.process_room_query(data, pl);
+       }
+
        // See if it's a message, in which case we add the name of the sender,
        // and forward it to all players in the lobby.
        if (data.child("message")) {


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

Reply via email to