|
30 | 30 | #include "serialization/string_utils.hpp" |
31 | 31 | #include "serialization/unicode.hpp" |
32 | 32 | #include "utils/charconv.hpp" |
| 33 | +#include "utils/general.hpp" |
33 | 34 | #include "utils/iterable_pair.hpp" |
34 | 35 | #include "game_version.hpp" |
35 | 36 |
|
@@ -1251,6 +1252,11 @@ void server::handle_player_in_lobby(player_iterator player, simple_wml::document |
1251 | 1252 | return; |
1252 | 1253 | } |
1253 | 1254 |
|
| 1255 | + if(simple_wml::node* join_server_queue = data.child("queue_game_create_failure")) { |
| 1256 | + handle_server_queue_create_failure(player, *join_server_queue); |
| 1257 | + return; |
| 1258 | + } |
| 1259 | + |
1254 | 1260 | if(simple_wml::node* leave_server_queue = data.child("leave_server_queue")) { |
1255 | 1261 | handle_leave_server_queue(player, *leave_server_queue); |
1256 | 1262 | return; |
@@ -1759,6 +1765,29 @@ void server::handle_join_server_queue(player_iterator p, simple_wml::node& data) |
1759 | 1765 | } |
1760 | 1766 | } |
1761 | 1767 |
|
| 1768 | +void server::handle_server_queue_create_failure(player_iterator p, simple_wml::node& data) |
| 1769 | +{ |
| 1770 | + int queue_id = data.attr("queue_id").to_int(); |
| 1771 | + |
| 1772 | + if(queue_info_.count(queue_id) == 0) { |
| 1773 | + ERR_SERVER << "attempted to remove " << p->info().name() << " from non-existing server-side queue " << data.attr("queue_id"); |
| 1774 | + return; |
| 1775 | + } |
| 1776 | + |
| 1777 | + queue_info& queue = queue_info_.at(queue_id); |
| 1778 | + if(!utils::contains(queue.players_in_queue, p->info().name())) { |
| 1779 | + DBG_SERVER << "player " << p->info().name() << " already not in server-side queue " << data.attr("queue_id"); |
| 1780 | + return; |
| 1781 | + } |
| 1782 | + |
| 1783 | + // if they're in the queue, remove them |
| 1784 | + utils::erase(queue.players_in_queue, p->info().name()); |
| 1785 | + p->info().remove_from_queue(queue.id); |
| 1786 | + LOG_SERVER << p->client_ip() << "\t" << p->name() << "\tremoving from " << queue.settings["scenario"] << " due to reason " << data.attr("reason"); |
| 1787 | + |
| 1788 | + send_queue_update(queue); |
| 1789 | +} |
| 1790 | + |
1762 | 1791 | void server::handle_leave_server_queue(player_iterator p, simple_wml::node& data) |
1763 | 1792 | { |
1764 | 1793 | int queue_id = data.attr("queue_id").to_int(); |
|
0 commit comments