Skip to content

Commit

Permalink
Added support for setting/getting room topic.
Browse files Browse the repository at this point in the history
  • Loading branch information
loonycyborg committed May 23, 2013
1 parent 94825f4 commit a12dd33
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 0 deletions.
9 changes: 9 additions & 0 deletions src/server/rooms.cpp
Expand Up @@ -107,3 +107,12 @@ void RoomList::send_server_message(const std::string& room_name, const std::stri
msg.set_attr_dup("message", message.c_str());
send_to_room(room_name, server_message, exclude);
}

Room& RoomList::room(const std::string& room_name)
{
RoomMap::right_iterator iter = room_map_.right.find(room_name);
if(iter == room_map_.right.end())
throw std::runtime_error("Room '" + room_name + "' doesn't exist");

return *(iter->info);
}
6 changes: 6 additions & 0 deletions src/server/rooms.hpp
Expand Up @@ -23,10 +23,14 @@
class Room : public boost::noncopyable
{
std::string name_;
std::string topic_;

public:
Room(const std::string& name);
~Room();

const std::string& topic() const { return topic_; }
void set_topic(const std::string& topic) { topic_ = topic; }
};

typedef boost::shared_ptr<Room> room_ptr;
Expand Down Expand Up @@ -55,6 +59,8 @@ class RoomList : public boost::noncopyable
void send_to_room(const std::string& room_name, simple_wml::document& doc, socket_ptr exclude = socket_ptr()) const;
void send_server_message(const std::string& room_name, const std::string& message, socket_ptr exclude = socket_ptr()) const;

Room& room(const std::string& room_name);

private:
void fill_member_list(const std::string room_name, simple_wml::node& root);
};
Expand Down
27 changes: 27 additions & 0 deletions src/server/server.cpp
Expand Up @@ -1146,6 +1146,9 @@ void server::handle_read_from_player(socket_ptr socket, boost::shared_ptr<simple
if(simple_wml::node* room_part = doc->child("room_part")) {
handle_room_part(socket, *room_part);
}
if(simple_wml::node* room_query = doc->child("room_query")) {
handle_room_query(socket, *room_query);
}
}

void server::handle_whisper(socket_ptr socket, simple_wml::node& whisper)
Expand Down Expand Up @@ -1270,6 +1273,30 @@ void server::handle_room_part(socket_ptr socket, simple_wml::node& room_part)
room_list_.leave_room(room_name, socket);
}

void server::handle_room_query(socket_ptr socket, simple_wml::node& room_query)
{
simple_wml::document doc;
simple_wml::node& response = doc.root().add_child("room_query_response");
simple_wml::node* query;

std::string room_name = room_query.attr("room").to_string();
if(room_name.empty()) room_name = "lobby";
Room& room = room_list_.room(room_name);

query = room_query.child("topic");
if(query != NULL) {
if(query->attr("value").empty()) {
response.set_attr_dup("topic", room.topic().c_str());
send_to_player(socket, doc);
} else {
room.set_topic(query->attr("value").to_string());
send_server_message(socket, "Room topic changed.");
}
return;
}
send_server_message(socket, "Unknown room query type");
}

typedef std::map<socket_ptr, std::deque<boost::shared_ptr<simple_wml::document> > > SendQueue;
SendQueue send_queue;
void handle_send_to_player(socket_ptr socket);
Expand Down
1 change: 1 addition & 0 deletions src/server/server.hpp
Expand Up @@ -84,6 +84,7 @@ class server
void handle_message(socket_ptr socket, simple_wml::node& message);
void handle_room_join(socket_ptr socket, simple_wml::node& room_join);
void handle_room_part(socket_ptr socket, simple_wml::node& room_join);
void handle_room_query(socket_ptr socket, simple_wml::node& room_query);
void remove_player(socket_ptr socket);

const network::manager net_manager_;
Expand Down

0 comments on commit a12dd33

Please sign in to comment.