Skip to content

Commit

Permalink
Merge 3 player handling functions into a single coroutine
Browse files Browse the repository at this point in the history
  • Loading branch information
loonycyborg committed Dec 5, 2020
1 parent a004cea commit 44e1837
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 49 deletions.
86 changes: 40 additions & 46 deletions src/server/wesnothd/server.cpp
Expand Up @@ -46,6 +46,7 @@
#endif

#include <boost/algorithm/string.hpp>
#include <boost/scope_exit.hpp>

#include <algorithm>
#include <cassert>
Expand Down Expand Up @@ -697,16 +698,18 @@ void server::login_client(boost::asio::yield_context yield, socket_ptr socket)
if(check_error(ec, socket)) return;

simple_wml::node& player_cfg = games_and_users_list_.root().add_child("user");
add_player(socket, wesnothd::player(
username,
player_cfg,
registered,
client_version,
client_source,
default_max_messages_,
default_time_period_,
is_moderator
)
wesnothd::player new_player(
username,
player_cfg,
registered,
client_version,
client_source,
default_max_messages_,
default_time_period_,
is_moderator
);
boost::asio::spawn(io_service_,
[this, socket, new_player](boost::asio::yield_context yield) { handle_player(yield, socket, new_player); }
);

LOG_SERVER << client_address(socket) << "\t" << username << "\thas logged on"
Expand Down Expand Up @@ -1013,7 +1016,7 @@ void server::send_password_request(socket_ptr socket,
async_send_doc(socket, doc);
}

void server::add_player(socket_ptr socket, const wesnothd::player& player)
void server::handle_player(boost::asio::yield_context yield, socket_ptr socket, const player& player)
{
if(lan_server_)
abort_lan_server_timer();
Expand All @@ -1022,6 +1025,10 @@ void server::add_player(socket_ptr socket, const wesnothd::player& player)
std::tie(std::ignore, inserted) = player_connections_.insert(player_connections::value_type(socket, player));
assert(inserted);

BOOST_SCOPE_EXIT_ALL(this, &socket) {
remove_player(socket);
};

async_send_doc_queued(socket, games_and_users_list_);

if(!motd_.empty()) {
Expand All @@ -1036,51 +1043,38 @@ void server::add_player(socket_ptr socket, const wesnothd::player& player)
send_server_message(socket, "A newer Wesnoth version, " + recommended_version_ + ", is out!", "alert");
}

read_from_player(socket);

// Send other players in the lobby the update that the player has joined
simple_wml::document diff;
make_add_diff(games_and_users_list_.root(), nullptr, "user", diff);
send_to_lobby(diff, socket);
}

void server::read_from_player(socket_ptr socket)
{
async_receive_doc(socket,
std::bind(&server::handle_read_from_player, this, std::placeholders::_1, std::placeholders::_2),
std::bind(&server::remove_player, this, std::placeholders::_1)
);
}

void server::handle_read_from_player(socket_ptr socket, std::shared_ptr<simple_wml::document> doc)
{
read_from_player(socket);
while(true) {
boost::system::error_code ec;
auto doc { coro_receive_doc(socket, yield[ec]) };
if(check_error(ec, socket) || !doc) return;

// DBG_SERVER << client_address(socket) << "\tWML received:\n" << doc->output() << std::endl;
if(doc->child("refresh_lobby")) {
async_send_doc_queued(socket, games_and_users_list_);
return;
}
// DBG_SERVER << client_address(socket) << "\tWML received:\n" << doc->output() << std::endl;
if(doc->child("refresh_lobby")) {
async_send_doc_queued(socket, games_and_users_list_);
}

if(simple_wml::node* whisper = doc->child("whisper")) {
handle_whisper(socket, *whisper);
return;
}
if(simple_wml::node* whisper = doc->child("whisper")) {
handle_whisper(socket, *whisper);
}

if(simple_wml::node* query = doc->child("query")) {
handle_query(socket, *query);
return;
}
if(simple_wml::node* query = doc->child("query")) {
handle_query(socket, *query);
}

if(simple_wml::node* nickserv = doc->child("nickserv")) {
handle_nickserv(socket, *nickserv);
return;
}
if(simple_wml::node* nickserv = doc->child("nickserv")) {
handle_nickserv(socket, *nickserv);
}

if(!player_is_in_game(socket)) {
handle_player_in_lobby(socket, doc);
} else {
handle_player_in_game(socket, doc);
if(!player_is_in_game(socket)) {
handle_player_in_lobby(socket, doc);
} else {
handle_player_in_game(socket, doc);
}
}
}

Expand Down
4 changes: 1 addition & 3 deletions src/server/wesnothd/server.hpp
Expand Up @@ -45,9 +45,7 @@ class server : public server_base
const std::string& user, const char* error_code = "", bool force_confirmation = false);
bool accepting_connections() const { return !graceful_restart; }

void add_player(socket_ptr socket, const wesnothd::player&);
void read_from_player(socket_ptr socket);
void handle_read_from_player(socket_ptr socket, std::shared_ptr<simple_wml::document> doc);
void handle_player(boost::asio::yield_context yield, socket_ptr socket, const player& player);
void handle_player_in_lobby(socket_ptr socket, std::shared_ptr<simple_wml::document> doc);
void handle_player_in_game(socket_ptr socket, std::shared_ptr<simple_wml::document> doc);
void handle_whisper(socket_ptr socket, simple_wml::node& whisper);
Expand Down

0 comments on commit 44e1837

Please sign in to comment.