The Battle for Wesnoth  1.17.17+dev
lobby_info.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 - 2023
3  by Tomasz Sniatowski <kailoran@gmail.com>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 #include "config.hpp"
20 
21 #include <boost/dynamic_bitset.hpp>
22 
23 #include <memory>
24 
25 namespace mp
26 {
27 /**
28  * This class represents the collective information the client has
29  * about the players and games on the server
30  */
32 {
33 public:
34  lobby_info();
35 
36  typedef std::map<int, game_info> game_info_map;
37 
38  /** Process a full game list. Current info is discarded. */
39  void process_gamelist(const config& data);
40 
41  /**
42  * Process a gamelist diff.
43  *
44  * @param data Raw game list data, usually received from the MP server.
45  *
46  * @returns True on success, false on failure (e.g. when the diff did
47  * not apply correctly).
48  */
49  bool process_gamelist_diff(const config& data);
50 
51  /**
52  * Updates the game pointer list and returns a second stage cleanup function to be
53  * called after any actions have been done using the pointer list.
54  */
55  std::function<void()> begin_state_sync();
56 
57  /** Returns the raw game list config data. */
58  const config& gamelist() const
59  {
60  return gamelist_;
61  }
62 
63  using game_filter_func = std::function<bool(const game_info&)>;
64 
65  /** Adds a new filter function to be considered when @ref apply_game_filter is called. */
67  {
68  game_filters_.push_back(func);
69  }
70 
71  /** Clears all game filter functions. */
73  {
74  game_filters_.clear();
75  }
76 
77  /** Sets whether the result of each game filter should be inverted. */
78  void set_game_filter_invert(std::function<bool(bool)> value)
79  {
80  game_filter_invert_ = value;
81  }
82 
83  /** Returns whether the game would be visible after the game filters are applied */
84  bool is_game_visible(const game_info&);
85 
86  /** Generates a new list of games that match the current filter functions and inversion setting. */
87  void apply_game_filter();
88 
89  /** Returns info on a game with the given game ID. */
90  game_info* get_game_by_id(int id);
91 
92  /** Const overload of @ref get_game_by_id. */
93  const game_info* get_game_by_id(int id) const;
94 
95  /** Returns info on the user with the given name, or nullptr if they don't eixst. */
96  user_info* get_user(const std::string& name);
97 
98  const std::vector<game_info*>& games() const
99  {
100  return games_;
101  }
102 
103  const boost::dynamic_bitset<>& games_visibility() const
104  {
105  return games_visibility_;
106  }
107 
108  const std::vector<user_info>& users() const
109  {
110  return users_;
111  }
112 
113  std::vector<user_info>& users()
114  {
115  return users_;
116  }
117 
118  bool gamelist_initialized() const
119  {
120  return gamelist_initialized_;
121  }
122 
124 
125 private:
127 
128  void process_userlist();
129 
130  /**
131  * Generates a new vector of game pointers from the ID/game map.
132  * The games will be referenced in ascending order by ID.
133  */
134  void make_games_vector();
135 
136  std::vector<std::string> installed_addons_;
137 
139 
141 
143 
144  std::vector<game_info*> games_;
145 
146  std::vector<user_info> users_;
147 
148  std::vector<game_filter_func> game_filters_;
149 
150  std::function<bool(bool)> game_filter_invert_;
151 
152  boost::dynamic_bitset<> games_visibility_;
153 };
154 
155 enum class notify_mode {
156  none,
157  message,
160  own_nick,
162  whisper,
164  lobby_join,
165  lobby_quit,
167 };
168 
169 void do_notify(notify_mode mode, const std::string& sender = "", const std::string& message = "");
170 }
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:161
This class represents the collective information the client has about the players and games on the se...
Definition: lobby_info.hpp:32
std::function< bool(bool)> game_filter_invert_
Definition: lobby_info.hpp:150
void add_game_filter(game_filter_func func)
Adds a new filter function to be considered when apply_game_filter is called.
Definition: lobby_info.hpp:66
void set_game_filter_invert(std::function< bool(bool)> value)
Sets whether the result of each game filter should be inverted.
Definition: lobby_info.hpp:78
void process_userlist()
Definition: lobby_info.cpp:228
std::function< bool(const game_info &)> game_filter_func
Definition: lobby_info.hpp:63
bool gamelist_initialized_
Definition: lobby_info.hpp:140
bool is_game_visible(const game_info &)
Returns whether the game would be visible after the game filters are applied.
Definition: lobby_info.cpp:331
void clear_game_filters()
Clears all game filter functions.
Definition: lobby_info.hpp:72
std::vector< user_info > & users()
Definition: lobby_info.hpp:113
bool process_gamelist_diff_impl(const config &data)
Definition: lobby_info.cpp:151
const config & gamelist() const
Returns the raw game list config data.
Definition: lobby_info.hpp:58
void process_gamelist(const config &data)
Process a full game list.
Definition: lobby_info.cpp:120
bool process_gamelist_diff(const config &data)
Process a gamelist diff.
Definition: lobby_info.cpp:140
void refresh_installed_addons_cache()
Definition: lobby_info.cpp:54
std::function< void()> begin_state_sync()
Updates the game pointer list and returns a second stage cleanup function to be called after any acti...
Definition: lobby_info.cpp:261
game_info * get_game_by_id(int id)
Returns info on a game with the given game ID.
Definition: lobby_info.cpp:293
bool gamelist_initialized() const
Definition: lobby_info.hpp:118
game_info_map games_by_id_
Definition: lobby_info.hpp:142
void make_games_vector()
Generates a new vector of game pointers from the ID/game map.
Definition: lobby_info.cpp:316
std::vector< user_info > users_
Definition: lobby_info.hpp:146
user_info * get_user(const std::string &name)
Returns info on the user with the given name, or nullptr if they don't eixst.
Definition: lobby_info.cpp:305
const std::vector< game_info * > & games() const
Definition: lobby_info.hpp:98
std::vector< game_info * > games_
Definition: lobby_info.hpp:144
boost::dynamic_bitset games_visibility_
Definition: lobby_info.hpp:152
std::map< int, game_info > game_info_map
Definition: lobby_info.hpp:36
void apply_game_filter()
Generates a new list of games that match the current filter functions and inversion setting.
Definition: lobby_info.cpp:342
const boost::dynamic_bitset & games_visibility() const
Definition: lobby_info.hpp:103
const std::vector< user_info > & users() const
Definition: lobby_info.hpp:108
std::vector< game_filter_func > game_filters_
Definition: lobby_info.hpp:148
std::vector< std::string > installed_addons_
Definition: lobby_info.hpp:136
Main entry points of multiplayer mode.
Definition: lobby_data.cpp:52
void do_notify(notify_mode mode, const std::string &sender, const std::string &message)
Definition: lobby_info.cpp:62
notify_mode
Definition: lobby_info.hpp:155
std::string_view data
Definition: picture.cpp:199
This class represents the info a client has about a game on the server.
Definition: lobby_data.hpp:66
This class represents the information a client has about another player.
Definition: lobby_data.hpp:33