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