Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "room.hpp"
00017
00018 #include <boost/utility.hpp>
00019
00020 class config;
00021
00022 #ifndef SERVER_ROOM_MANAGER_HPP_INCLUDED
00023 #define SERVER_ROOM_MANAGER_HPP_INCLUDED
00024
00025 namespace wesnothd {
00026
00027
00028
00029
00030
00031
00032 class room_manager : private boost::noncopyable
00033 {
00034 public:
00035
00036
00037
00038 room_manager(player_map& all_players);
00039
00040
00041
00042
00043 ~room_manager();
00044
00045 enum PRIVILEGE_POLICY {
00046 PP_EVERYONE,
00047 PP_REGISTERED,
00048 PP_ADMINS,
00049 PP_NOBODY,
00050 PP_COUNT
00051 };
00052
00053 static PRIVILEGE_POLICY pp_from_string(const std::string& str);
00054
00055
00056
00057
00058 void load_config(const config& cfg);
00059
00060
00061
00062
00063
00064 void read_rooms();
00065
00066
00067
00068
00069
00070 void write_rooms();
00071
00072
00073
00074
00075
00076 bool dirty() const { return dirty_; }
00077
00078
00079
00080
00081 room* get_room(const std::string& name);
00082
00083
00084
00085
00086
00087 bool room_exists(const std::string& name) const;
00088
00089
00090
00091
00092 room* create_room(const std::string& name);
00093
00094
00095
00096
00097
00098
00099
00100 room* get_create_room(const std::string& name, network::connection player);
00101
00102
00103
00104
00105 bool in_lobby(network::connection player) const;
00106
00107
00108
00109
00110
00111 void enter_lobby(network::connection player);
00112
00113
00114
00115
00116 void enter_lobby(const game& game);
00117
00118
00119
00120
00121 void exit_lobby(network::connection player);
00122
00123
00124
00125
00126 void remove_player(network::connection player);
00127
00128
00129
00130
00131
00132 room* require_room(const std::string& room_name,
00133 const player_map::iterator user, const char* log_string = "use");
00134
00135
00136
00137
00138
00139 room* require_member(const std::string& room_name,
00140 const player_map::iterator user, const char* log_string = "use");
00141
00142
00143
00144
00145
00146 void process_message(simple_wml::document& data, const player_map::iterator user);
00147
00148
00149
00150
00151 void process_room_join(simple_wml::document& data, const player_map::iterator user);
00152
00153
00154
00155
00156 void process_room_part(simple_wml::document& data, const player_map::iterator user);
00157
00158
00159
00160
00161 void process_room_query(simple_wml::document& data, const player_map::iterator user);
00162
00163
00164
00165
00166 const room& lobby() const { return *lobby_; }
00167
00168 private:
00169 void do_room_join(network::connection player, const std::string& room_name);
00170
00171
00172
00173
00174
00175
00176 bool player_enters_room(network::connection player, room* room);
00177
00178
00179
00180
00181 void player_exits_room(network::connection player, room* room);
00182
00183
00184
00185
00186
00187 void store_player_rooms(network::connection player);
00188
00189
00190
00191
00192
00193 void unstore_player_rooms(const player_map::iterator user);
00194
00195
00196
00197
00198
00199 void unstore_player_rooms(network::connection player);
00200
00201
00202
00203
00204 void fill_member_list(const room* room, simple_wml::node& root);
00205
00206
00207
00208
00209 void fill_room_list(simple_wml::node& root);
00210
00211
00212 player_map& all_players_;
00213
00214
00215 room* lobby_;
00216
00217
00218 typedef std::map<std::string, room*> t_rooms_by_name_;
00219 t_rooms_by_name_ rooms_by_name_;
00220
00221
00222 typedef std::map<network::connection, std::set<room*> > t_rooms_by_player_;
00223 t_rooms_by_player_ rooms_by_player_;
00224
00225
00226 typedef std::map<network::connection, std::set<std::string> > t_player_stored_rooms_;
00227 t_player_stored_rooms_ player_stored_rooms_;
00228
00229
00230
00231
00232 std::string filename_;
00233
00234
00235
00236
00237 bool compress_stored_rooms_;
00238
00239
00240
00241
00242 PRIVILEGE_POLICY new_room_policy_;
00243
00244
00245
00246
00247 bool dirty_;
00248
00249
00250
00251
00252 static const char* const lobby_name_;
00253 };
00254
00255 }
00256
00257
00258 #endif