FAForever / server

The servercode for the Forged Alliance Forever lobby
http://www.faforever.com
GNU General Public License v3.0
67 stars 62 forks source link

Fix flaky game references test #634

Closed Askaholic closed 4 years ago

Askaholic commented 4 years ago

The test that checks for references to the game object to be cleaned up tends to fail randomly, which is annoying for travis builds.

https://github.com/FAForever/server/blob/737e71ea07a7627c384b4dfd5a6a752d0888ce42/tests/integration_tests/test_game.py#L327

cleborys commented 4 years ago

It seems to me that the failing assert is always the one after the second gc.collect(), here: https://github.com/FAForever/server/blob/737e71ea07a7627c384b4dfd5a6a752d0888ce42/tests/integration_tests/test_game.py#L409

Here are some logs comparing a failed test run with a "normal" test run intentionally failed after the assert above. A normal test run always ends with a broadcast game_info "closed" as expected:

TRACE    UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'closed', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 2, 'max_players': 12, 'launched_at': 1598967323.1251912, 'teams': {1: ['test', 'Rhiza']}}

For a failed test run, the game_info "closed" happens much earlier, right after the game creation and before players join (added blank lines and comment for readability)

DEBUG    CustomGame.41949:game.py:109 Game(41949,test,maps/scmp_007.zip,0) created
DEBUG    GameConnection:gameconnection.py:45 GameConnection initializing
TRACE    LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'game_launch', 'args': ['/numgames', 5], 'uid': 41949, 'mod': 'faf', 'name': "test's game", 'init_mode': 0}
TRACE    UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:29:21.845675+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:29:21.845422+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]}
TRACE    UnitTestServer:__init__.py:114 ]]: {'command': 'player_info', 'players': [{'id': 3, 'login': 'Rhiza', 'country': '', 'clan': '123', 'ratings': {'global': {'rating': (1650.0, 62.52), 'number_of_games': 2}, 'ladder_1v1': {'rating': (1650.0, 62.52), 'number_of_games': 2}}, 'global_rating': (1650.0, 62.52), 'ladder_rating': (1650.0, 62.52), 'number_of_games': 2}]}

% now the game_info message:
TRACE    UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'closed', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 0, 'max_players': 12, 'launched_at': None, 'teams': {}}

TRACE    LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Idle']}
INFO     CustomGame.41949:game.py:311 Added game connection GameConnection(Player(test, 1, (2000.0, 125.0), (2000.0, 125.0)), Game(41949,test,maps/scmp_007.zip,0))
TRACE    LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Lobby']}
TRACE    GameConnection:gameconnection.py:99 >> test: {'command': 'HostGame', 'args': ['scmp_007'], 'target': 'game'}
TRACE    LobbyConnection:lobbyconnection.py:165 << Rhiza: {'command': 'game_join', 'uid': 41949}

note the 'num_players': 0 in the message. I don't know what's triggering it, but I would guess that that is messing up the wait here: https://github.com/FAForever/server/blob/737e71ea07a7627c384b4dfd5a6a752d0888ce42/tests/integration_tests/test_game.py#L403-L406 I though maybe the game is timing out and broadcast as closed, but that would show up in the logs and it doesn't. If the test were allowed to continue and just wait, it would eventually receive another game_info message after the game has been properly closed again. Indeed the tests passes 1.000 times in a row if I add and msg["num_players"] == 2 as a condition to the protocol await linked above. Before I would only very rarely pass 100 consecutive runs.

Here's all game_infos grepped from the logs: successful run:

TRACE    LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'game_info', 'games': []}
TRACE    LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'game_info', 'games': []}
TRACE    UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'closed', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 2, 'max_players': 12, 'launched_at': 1598967323.1251912, 'teams': {1: ['test', 'Rhiza']}}

failed run:

TRACE    LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'game_info', 'games': []}
TRACE    LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'game_info', 'games': []}
TRACE    UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'closed', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 0, 'max_players': 12, 'launched_at': None, 'teams': {}}
TRACE    UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'playing', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 2, 'max_players': 12, 'launched_at': 1598966960.856856, 'teams': {1: ['test', 'Rhiza']}}

Which also makes me wonder why the successful run doesn't have the additional game_info broadcast with 'state': playing.

cleborys commented 4 years ago

Here's the complete logs for reference.

Passed run ``` DEBUG ServerContext:servercontext.py:80 UnitTestServer[QDataStreamProtocol]: Client connected DEBUG LobbyConnection:lobbyconnection.py:117 LobbyConnection initialized TRACE LobbyConnection:lobbyconnection.py:165 << 1899867331: {'command': 'ask_session', 'user_agent': 'faf-client', 'version': '0.11.16'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 1899867331: {'command': 'notice', 'style': 'info', 'text': 'You are using an unofficial client version! Some features might not work as expected. If you experience any problems please download the latest version of the official client from https://www.faforever.com'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 1899867331: {'command': 'session', 'session': 1899867331} TRACE LobbyConnection:lobbyconnection.py:165 << 1899867331: {'command': 'hello', 'version': '1.0.0-dev', 'user_agent': 'faf-client', 'login': 'test', 'password': '10a6e6cc8311a3e2bcc09bf6c199adecd5dd59408c343e926b129c4914f3cb01', 'unique_id': 'some_id'} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO aiomysql:cursors.py:242 SELECT login.id, login.login, login.password, login.steamid, login.create_time, lobby_ban.reason, lobby_ban.expires_at FROM login LEFT OUTER JOIN lobby_ban ON login.id = lobby_ban.`idUser` WHERE login.login = 'test' ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'login_1': 'test'} DEBUG LobbyConnection:lobbyconnection.py:432 Login from: 1, test, 1899867331 INFO aiomysql:cursors.py:242 UPDATE login SET ip='127.0.0.1', user_agent='faf-client', last_login=now() WHERE login.id = 1 INFO aiomysql:cursors.py:243 {'ip': '127.0.0.1', 'user_agent': 'faf-client', 'id_1': 1} TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.540101+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.539823+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.545056+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.544814+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.546599+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.546390+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.548119+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.547905+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.549649+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.549439+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.551168+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.550959+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.552686+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.552481+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.554261+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.554055+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.555783+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.555570+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.557361+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.557154+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.558890+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.558676+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.560412+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.560203+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.561958+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.561748+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.563477+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.563267+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.565006+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.564800+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.566525+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.566317+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.568048+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.567842+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.569585+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.569374+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.571112+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.570902+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.572624+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.572419+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.574145+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.573940+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.575724+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.575511+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.577248+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.577042+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.578888+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.578672+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.580511+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.580304+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.582102+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.581891+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.583628+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.583420+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.585217+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.585005+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.586803+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.586577+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:23.588343+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:23.588136+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO aiohttp.access:web_log.py:233 127.0.0.1 [01/Sep/2020:13:35:22 +0000] "POST /verify HTTP/1.1" 200 177 "-" "Python/3.7 aiohttp/3.6.2" ERROR LobbyConnection:lobbyconnection.py:605 Failure updating NickServ password for test INFO aiomysql:cursors.py:242 SELECT user_group.technical_name FROM user_group_assignment INNER JOIN user_group ON user_group.id = user_group_assignment.group_id WHERE user_group_assignment.user_id = 1 INFO aiomysql:cursors.py:243 {'user_id_1': 1} INFO aiomysql:cursors.py:242 SELECT avatars_list.url AS avatars_list_url, avatars_list.tooltip AS avatars_list_tooltip, clan.tag AS clan_tag FROM login LEFT OUTER JOIN clan_membership ON login.id = clan_membership.player_id LEFT OUTER JOIN clan ON clan.id = clan_membership.clan_id LEFT OUTER JOIN avatars ON avatars.`idUser` = login.id AND avatars.selected = 1 LEFT OUTER JOIN avatars_list ON avatars_list.id = avatars.`idAvatar` WHERE login.id = 1 INFO aiomysql:cursors.py:243 {'selected_1': 1, 'id_1': 1} INFO aiomysql:cursors.py:242 SELECT leaderboard_rating.mean, leaderboard_rating.deviation, leaderboard_rating.total_games, leaderboard.technical_name FROM leaderboard INNER JOIN leaderboard_rating ON leaderboard.id = leaderboard_rating.leaderboard_id WHERE leaderboard_rating.login_id = 1 INFO aiomysql:cursors.py:243 {'login_id_1': 1} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'welcome', 'me': {'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}, 'id': 1, 'login': 'test'} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'player_info', 'players': [{'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}]} INFO aiomysql:cursors.py:242 SELECT friends_and_foes.subject_id, friends_and_foes.status FROM friends_and_foes WHERE friends_and_foes.user_id = 1 INFO aiomysql:cursors.py:243 {'user_id_1': 1} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'social', 'autojoin': ['#678_clan'], 'channels': ['#678_clan'], 'friends': [], 'foes': [3], 'power': 2} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'game_info', 'games': []} DEBUG ServerContext:servercontext.py:80 UnitTestServer[QDataStreamProtocol]: Client connected DEBUG LobbyConnection:lobbyconnection.py:117 LobbyConnection initialized TRACE LobbyConnection:lobbyconnection.py:165 << 3595020339: {'command': 'ask_session', 'user_agent': 'faf-client', 'version': '0.11.16'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 3595020339: {'command': 'notice', 'style': 'info', 'text': 'You are using an unofficial client version! Some features might not work as expected. If you experience any problems please download the latest version of the official client from https://www.faforever.com'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 3595020339: {'command': 'session', 'session': 3595020339} TRACE LobbyConnection:lobbyconnection.py:165 << 3595020339: {'command': 'hello', 'version': '1.0.0-dev', 'user_agent': 'faf-client', 'login': 'Rhiza', 'password': 'f7de9be6d5dee1c8558f8ce3c74fbfa5e400da46d7cba2bdd03978c2749d26ec', 'unique_id': 'some_id'} INFO aiomysql:cursors.py:242 SELECT login.id, login.login, login.password, login.steamid, login.create_time, lobby_ban.reason, lobby_ban.expires_at FROM login LEFT OUTER JOIN lobby_ban ON login.id = lobby_ban.`idUser` WHERE login.login = 'Rhiza' ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'login_1': 'Rhiza'} DEBUG LobbyConnection:lobbyconnection.py:432 Login from: 3, Rhiza, 3595020339 INFO aiomysql:cursors.py:242 UPDATE login SET ip='127.0.0.1', user_agent='faf-client', last_login=now() WHERE login.id = 3 INFO aiomysql:cursors.py:243 {'ip': '127.0.0.1', 'user_agent': 'faf-client', 'id_1': 3} INFO aiohttp.access:web_log.py:233 127.0.0.1 [01/Sep/2020:13:35:22 +0000] "POST /verify HTTP/1.1" 200 177 "-" "Python/3.7 aiohttp/3.6.2" ERROR LobbyConnection:lobbyconnection.py:605 Failure updating NickServ password for Rhiza INFO aiomysql:cursors.py:242 SELECT user_group.technical_name FROM user_group_assignment INNER JOIN user_group ON user_group.id = user_group_assignment.group_id WHERE user_group_assignment.user_id = 3 INFO aiomysql:cursors.py:243 {'user_id_1': 3} INFO aiomysql:cursors.py:242 SELECT avatars_list.url AS avatars_list_url, avatars_list.tooltip AS avatars_list_tooltip, clan.tag AS clan_tag FROM login LEFT OUTER JOIN clan_membership ON login.id = clan_membership.player_id LEFT OUTER JOIN clan ON clan.id = clan_membership.clan_id LEFT OUTER JOIN avatars ON avatars.`idUser` = login.id AND avatars.selected = 1 LEFT OUTER JOIN avatars_list ON avatars_list.id = avatars.`idAvatar` WHERE login.id = 3 INFO aiomysql:cursors.py:243 {'selected_1': 1, 'id_1': 3} INFO aiomysql:cursors.py:242 SELECT leaderboard_rating.mean, leaderboard_rating.deviation, leaderboard_rating.total_games, leaderboard.technical_name FROM leaderboard INNER JOIN leaderboard_rating ON leaderboard.id = leaderboard_rating.leaderboard_id WHERE leaderboard_rating.login_id = 3 INFO aiomysql:cursors.py:243 {'login_id_1': 3} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'welcome', 'me': {'id': 3, 'login': 'Rhiza', 'country': '', 'clan': '123', 'ratings': {'global': {'rating': (1650.0, 62.52), 'number_of_games': 2}, 'ladder_1v1': {'rating': (1650.0, 62.52), 'number_of_games': 2}}, 'global_rating': (1650.0, 62.52), 'ladder_rating': (1650.0, 62.52), 'number_of_games': 2}, 'id': 3, 'login': 'Rhiza'} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'player_info', 'players': [{'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}, {'id': 3, 'login': 'Rhiza', 'country': '', 'clan': '123', 'ratings': {'global': {'rating': (1650.0, 62.52), 'number_of_games': 2}, 'ladder_1v1': {'rating': (1650.0, 62.52), 'number_of_games': 2}}, 'global_rating': (1650.0, 62.52), 'ladder_rating': (1650.0, 62.52), 'number_of_games': 2}]} INFO aiomysql:cursors.py:242 SELECT friends_and_foes.subject_id, friends_and_foes.status FROM friends_and_foes WHERE friends_and_foes.user_id = 3 INFO aiomysql:cursors.py:243 {'user_id_1': 3} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'social', 'autojoin': ['#123_clan'], 'channels': ['#123_clan'], 'friends': [], 'foes': [], 'power': 0} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'game_info', 'games': []} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'command': 'game_host', 'mod': 'faf', 'visibility': 'public'} INFO aiomysql:cursors.py:242 SELECT lobby_ban.reason, lobby_ban.expires_at FROM lobby_ban WHERE lobby_ban.`idUser` = 1 ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'idUser_1': 1} DEBUG CustomGame.41949:game.py:109 Game(41949,test,maps/scmp_007.zip,0) created DEBUG GameConnection:gameconnection.py:45 GameConnection initializing TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'game_launch', 'args': ['/numgames', 5], 'uid': 41949, 'mod': 'faf', 'name': "test's game", 'init_mode': 0} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Idle']} INFO CustomGame.41949:game.py:311 Added game connection GameConnection(Player(test, 1, (2000.0, 125.0), (2000.0, 125.0)), Game(41949,test,maps/scmp_007.zip,0)) TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Lobby']} TRACE GameConnection:gameconnection.py:99 >> test: {'command': 'HostGame', 'args': ['scmp_007'], 'target': 'game'} TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'command': 'game_join', 'uid': 41949} INFO aiomysql:cursors.py:242 SELECT lobby_ban.reason, lobby_ban.expires_at FROM lobby_ban WHERE lobby_ban.`idUser` = 3 ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'idUser_1': 3} DEBUG LobbyConnection:lobbyconnection.py:825 joining: 41949 with pw: None DEBUG GameConnection:gameconnection.py:45 GameConnection initializing TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'game_launch', 'args': ['/numgames', 2], 'uid': 41949, 'mod': 'faf', 'name': "test's game", 'init_mode': 0} TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'target': 'game', 'command': 'GameState', 'args': ['Idle']} TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'target': 'game', 'command': 'GameState', 'args': ['Lobby']} TRACE GameConnection:gameconnection.py:99 >> Rhiza: {'command': 'JoinGame', 'args': ['test', 1], 'target': 'game'} TRACE GameConnection:gameconnection.py:99 >> test: {'command': 'ConnectToPeer', 'args': ['Rhiza', 3, True], 'target': 'game'} INFO CustomGame.41949:game.py:311 Added game connection GameConnection(Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)), Game(41949,test,maps/scmp_007.zip,0)) INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Army', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Team', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'StartSpot', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Faction', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Color', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Army', 2]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Team', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'StartSpot', 2]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Faction', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Color', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Launching']} INFO GameConnection:gameconnection.py:432 Launching game Game(41949,test,maps/scmp_007.zip,2) in state GameState.LOBBY INFO CustomGame.41949:game.py:649 Game launched INFO aiomysql:cursors.py:242 SELECT id, ranked FROM map_version WHERE lower(filename) = lower('maps/scmp_007.zip') INFO aiomysql:cursors.py:243 ('maps/scmp_007.zip',) INFO aiomysql:cursors.py:242 INSERT INTO game_stats (id, `gameType`, `gameMod`, host, `mapId`, `gameName`, validity) VALUES (41949, '0', 1, 1, 7, 'test\'s game', 0) INFO aiomysql:cursors.py:243 {'id': 41949, 'gameType': '0', 'gameMod': 1, 'host': 1, 'mapId': 7, 'gameName': "test's game", 'validity': 0} INFO aiomysql:cursors.py:242 INSERT INTO game_player_stats (`gameId`, `playerId`, `AI`, faction, color, team, place, mean, deviation, score) VALUES (41949, 1, 0, 1, 1, 1, 1, 2000, 125, 0), (41949, 3, 0, 1, 1, 1, 2, 1650, 62.52, 0) INFO aiomysql:cursors.py:243 {'gameId_m0': 41949, 'playerId_m0': 1, 'AI_m0': 0, 'faction_m0': 1, 'color_m0': 1, 'team_m0': 1, 'place_m0': 1, 'mean_m0': 2000.0, 'deviation_m0': 125.0, 'score_m0': 0, 'gameId_m1': 41949, 'playerId_m1': 3, 'AI_m1': 0, 'faction_m1': 1, 'color_m1': 1, 'team_m1': 1, 'place_m1': 2, 'mean_m1': 1650.0, 'deviation_m1': 62.52, 'score_m1': 0} TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'command': 'GameState', 'target': 'game', 'args': ['Ended']} INFO CustomGame.41949:game.py:335 Removed game connection GameConnection(Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)), Game(41949,test,maps/scmp_007.zip,2)) DEBUG GameConnection:gameconnection.py:515 GameConnection(Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)), Game(41949,test,maps/scmp_007.zip,2)).abort() TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'command': 'GameResult', 'target': 'game', 'args': [1, 'victory 10']} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'command': 'GameResult', 'target': 'game', 'args': [2, 'victory 10']} INFO CustomGame.41949:game.py:259 1 reported result for army 2: victory 10 TRACE LobbyConnection:lobbyconnection.py:165 << test: {'command': 'GameState', 'target': 'game', 'args': ['Ended']} INFO aiomysql:cursors.py:242 UPDATE game_stats SET `endTime`=now() WHERE game_stats.id = 41949 INFO aiomysql:cursors.py:243 {'id_1': 41949} INFO CustomGame.41949:game.py:335 Removed game connection GameConnection(Player(test, 1, (2000.0, 125.0), (2000.0, 125.0)), Game(41949,test,maps/scmp_007.zip,2)) INFO CustomGame.41949:game.py:374 Game finished normally DEBUG CustomGame.41949:game.py:455 Saving scores from game 41949 INFO CustomGame.41949:game.py:464 Result for army 1, player: Player(test, 1, (2000.0, 125.0), (2000.0, 125.0)): score 0, outcome GameOutcome.UNKNOWN INFO CustomGame.41949:game.py:464 Result for army 2, player: Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)): score 10, outcome GameOutcome.VICTORY INFO CustomGame.41949:game.py:472 Score for player Player(test, 1, (2000.0, 125.0), (2000.0, 125.0)): score 0, outcome GameOutcome.UNKNOWN INFO CustomGame.41949:game.py:472 Score for player Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)): score 10, outcome GameOutcome.VICTORY INFO aiomysql:cursors.py:272 CALL UPDATE game_player_stats SET score=%(score)s, `scoreTime`=now(), result=%(result)s WHERE game_player_stats.`gameId` = %(game_id)s AND game_player_stats.`playerId` = %(player_id)s INFO aiomysql:cursors.py:273 [{'score': 0, 'result': 'UNKNOWN', 'game_id': 41949, 'player_id': 1}, {'score': 10, 'result': 'VICTORY', 'game_id': 41949, 'player_id': 3}] INFO aiomysql:cursors.py:242 UPDATE game_player_stats SET score=0, `scoreTime`=now(), result='UNKNOWN' WHERE game_player_stats.`gameId` = 41949 AND game_player_stats.`playerId` = 1 INFO aiomysql:cursors.py:243 {'score': 0, 'result': 'UNKNOWN', 'game_id': 41949, 'player_id': 1} INFO aiomysql:cursors.py:242 UPDATE game_player_stats SET score=10, `scoreTime`=now(), result='VICTORY' WHERE game_player_stats.`gameId` = 41949 AND game_player_stats.`playerId` = 3 INFO aiomysql:cursors.py:243 {'score': 10, 'result': 'VICTORY', 'game_id': 41949, 'player_id': 3} INFO CustomGame.41949:game.py:766 Marked as invalid because: INFO aiomysql:cursors.py:242 UPDATE game_stats SET validity=9 WHERE game_stats.id = 41949 INFO aiomysql:cursors.py:243 {'validity': 9, 'id_1': 41949} WARNING MessageQueueService:message_queue_service.py:105 Not connected to RabbitMQ, unable to publish message. DEBUG GameConnection:gameconnection.py:515 GameConnection(Player(test, 1, (2000.0, 125.0), (2000.0, 125.0)), Game(41949,test,maps/scmp_007.zip,2)).abort() TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:35:24.091840+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:35:24.090840+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'player_info', 'players': [{'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}, {'id': 3, 'login': 'Rhiza', 'country': '', 'clan': '123', 'ratings': {'global': {'rating': (1650.0, 62.52), 'number_of_games': 2}, 'ladder_1v1': {'rating': (1650.0, 62.52), 'number_of_games': 2}}, 'global_rating': (1650.0, 62.52), 'ladder_rating': (1650.0, 62.52), 'number_of_games': 2}]} TRACE UnitTestServer:__init__.py:169 removing game TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'closed', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 2, 'max_players': 12, 'launched_at': 1598967323.1251912, 'teams': {1: ['test', 'Rhiza']}} ```
Failed run ``` DEBUG ServerContext:servercontext.py:80 UnitTestServer[QDataStreamProtocol]: Client connected DEBUG LobbyConnection:lobbyconnection.py:117 LobbyConnection initialized TRACE LobbyConnection:lobbyconnection.py:165 << 2863460732: {'command': 'ask_session', 'user_agent': 'faf-client', 'version': '0.11.16'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 2863460732: {'command': 'notice', 'style': 'info', 'text': 'You are using an unofficial client version! Some features might not work as expected. If you experience any problems please download the latest version of the official client from https://www.faforever.com'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 2863460732: {'command': 'session', 'session': 2863460732} TRACE LobbyConnection:lobbyconnection.py:165 << 2863460732: {'command': 'hello', 'version': '1.0.0-dev', 'user_agent': 'faf-client', 'login': 'test', 'password': '10a6e6cc8311a3e2bcc09bf6c199adecd5dd59408c343e926b129c4914f3cb01', 'unique_id': 'some_id'} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO aiomysql:cursors.py:242 SELECT login.id, login.login, login.password, login.steamid, login.create_time, lobby_ban.reason, lobby_ban.expires_at FROM login LEFT OUTER JOIN lobby_ban ON login.id = lobby_ban.`idUser` WHERE login.login = 'test' ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'login_1': 'test'} DEBUG LobbyConnection:lobbyconnection.py:432 Login from: 1, test, 2863460732 INFO aiomysql:cursors.py:242 UPDATE login SET ip='127.0.0.1', user_agent='faf-client', last_login=now() WHERE login.id = 1 INFO aiomysql:cursors.py:243 {'ip': '127.0.0.1', 'user_agent': 'faf-client', 'id_1': 1} INFO aiohttp.access:web_log.py:233 127.0.0.1 [01/Sep/2020:13:29:20 +0000] "POST /verify HTTP/1.1" 200 177 "-" "Python/3.7 aiohttp/3.6.2" ERROR LobbyConnection:lobbyconnection.py:605 Failure updating NickServ password for test TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:29:21.821110+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:29:21.820887+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} INFO aiomysql:cursors.py:242 SELECT user_group.technical_name FROM user_group_assignment INNER JOIN user_group ON user_group.id = user_group_assignment.group_id WHERE user_group_assignment.user_id = 1 INFO aiomysql:cursors.py:243 {'user_id_1': 1} INFO aiomysql:cursors.py:242 SELECT avatars_list.url AS avatars_list_url, avatars_list.tooltip AS avatars_list_tooltip, clan.tag AS clan_tag FROM login LEFT OUTER JOIN clan_membership ON login.id = clan_membership.player_id LEFT OUTER JOIN clan ON clan.id = clan_membership.clan_id LEFT OUTER JOIN avatars ON avatars.`idUser` = login.id AND avatars.selected = 1 LEFT OUTER JOIN avatars_list ON avatars_list.id = avatars.`idAvatar` WHERE login.id = 1 INFO aiomysql:cursors.py:243 {'selected_1': 1, 'id_1': 1} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO aiomysql:cursors.py:242 SELECT leaderboard_rating.mean, leaderboard_rating.deviation, leaderboard_rating.total_games, leaderboard.technical_name FROM leaderboard INNER JOIN leaderboard_rating ON leaderboard.id = leaderboard_rating.leaderboard_id WHERE leaderboard_rating.login_id = 1 INFO aiomysql:cursors.py:243 {'login_id_1': 1} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'welcome', 'me': {'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}, 'id': 1, 'login': 'test'} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'player_info', 'players': [{'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}]} INFO aiomysql:cursors.py:242 SELECT friends_and_foes.subject_id, friends_and_foes.status FROM friends_and_foes WHERE friends_and_foes.user_id = 1 INFO aiomysql:cursors.py:243 {'user_id_1': 1} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'social', 'autojoin': ['#678_clan'], 'channels': ['#678_clan'], 'friends': [], 'foes': [3], 'power': 2} TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'game_info', 'games': []} DEBUG ServerContext:servercontext.py:80 UnitTestServer[QDataStreamProtocol]: Client connected DEBUG LobbyConnection:lobbyconnection.py:117 LobbyConnection initialized TRACE LobbyConnection:lobbyconnection.py:165 << 1249655304: {'command': 'ask_session', 'user_agent': 'faf-client', 'version': '0.11.16'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 1249655304: {'command': 'notice', 'style': 'info', 'text': 'You are using an unofficial client version! Some features might not work as expected. If you experience any problems please download the latest version of the official client from https://www.faforever.com'} TRACE LobbyConnection:lobbyconnection.py:1075 >> 1249655304: {'command': 'session', 'session': 1249655304} TRACE LobbyConnection:lobbyconnection.py:165 << 1249655304: {'command': 'hello', 'version': '1.0.0-dev', 'user_agent': 'faf-client', 'login': 'Rhiza', 'password': 'f7de9be6d5dee1c8558f8ce3c74fbfa5e400da46d7cba2bdd03978c2749d26ec', 'unique_id': 'some_id'} INFO aiomysql:cursors.py:242 SELECT login.id, login.login, login.password, login.steamid, login.create_time, lobby_ban.reason, lobby_ban.expires_at FROM login LEFT OUTER JOIN lobby_ban ON login.id = lobby_ban.`idUser` WHERE login.login = 'Rhiza' ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'login_1': 'Rhiza'} DEBUG LobbyConnection:lobbyconnection.py:432 Login from: 3, Rhiza, 1249655304 TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:29:21.830854+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:29:21.830631+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'player_info', 'players': [{'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}]} INFO aiomysql:cursors.py:242 UPDATE login SET ip='127.0.0.1', user_agent='faf-client', last_login=now() WHERE login.id = 3 INFO aiomysql:cursors.py:243 {'ip': '127.0.0.1', 'user_agent': 'faf-client', 'id_1': 3} INFO aiohttp.access:web_log.py:233 127.0.0.1 [01/Sep/2020:13:29:20 +0000] "POST /verify HTTP/1.1" 200 177 "-" "Python/3.7 aiohttp/3.6.2" ERROR LobbyConnection:lobbyconnection.py:605 Failure updating NickServ password for Rhiza INFO aiomysql:cursors.py:242 SELECT user_group.technical_name FROM user_group_assignment INNER JOIN user_group ON user_group.id = user_group_assignment.group_id WHERE user_group_assignment.user_id = 3 INFO aiomysql:cursors.py:243 {'user_id_1': 3} INFO aiomysql:cursors.py:242 SELECT avatars_list.url AS avatars_list_url, avatars_list.tooltip AS avatars_list_tooltip, clan.tag AS clan_tag FROM login LEFT OUTER JOIN clan_membership ON login.id = clan_membership.player_id LEFT OUTER JOIN clan ON clan.id = clan_membership.clan_id LEFT OUTER JOIN avatars ON avatars.`idUser` = login.id AND avatars.selected = 1 LEFT OUTER JOIN avatars_list ON avatars_list.id = avatars.`idAvatar` WHERE login.id = 3 INFO aiomysql:cursors.py:243 {'selected_1': 1, 'id_1': 3} INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO aiomysql:cursors.py:242 SELECT leaderboard_rating.mean, leaderboard_rating.deviation, leaderboard_rating.total_games, leaderboard.technical_name FROM leaderboard INNER JOIN leaderboard_rating ON leaderboard.id = leaderboard_rating.leaderboard_id WHERE leaderboard_rating.login_id = 3 INFO aiomysql:cursors.py:243 {'login_id_1': 3} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'welcome', 'me': {'id': 3, 'login': 'Rhiza', 'country': '', 'clan': '123', 'ratings': {'global': {'rating': (1650.0, 62.52), 'number_of_games': 2}, 'ladder_1v1': {'rating': (1650.0, 62.52), 'number_of_games': 2}}, 'global_rating': (1650.0, 62.52), 'ladder_rating': (1650.0, 62.52), 'number_of_games': 2}, 'id': 3, 'login': 'Rhiza'} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'player_info', 'players': [{'id': 1, 'login': 'test', 'country': '', 'clan': '678', 'ratings': {'global': {'rating': (2000.0, 125.0), 'number_of_games': 5}, 'ladder_1v1': {'rating': (2000.0, 125.0), 'number_of_games': 5}}, 'global_rating': (2000.0, 125.0), 'ladder_rating': (2000.0, 125.0), 'number_of_games': 5}, {'id': 3, 'login': 'Rhiza', 'country': '', 'clan': '123', 'ratings': {'global': {'rating': (1650.0, 62.52), 'number_of_games': 2}, 'ladder_1v1': {'rating': (1650.0, 62.52), 'number_of_games': 2}}, 'global_rating': (1650.0, 62.52), 'ladder_rating': (1650.0, 62.52), 'number_of_games': 2}]} INFO aiomysql:cursors.py:242 SELECT friends_and_foes.subject_id, friends_and_foes.status FROM friends_and_foes WHERE friends_and_foes.user_id = 3 INFO aiomysql:cursors.py:243 {'user_id_1': 3} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'social', 'autojoin': ['#123_clan'], 'channels': ['#123_clan'], 'friends': [], 'foes': [], 'power': 0} TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'game_info', 'games': []} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'command': 'game_host', 'mod': 'faf', 'visibility': 'public'} INFO aiomysql:cursors.py:242 SELECT lobby_ban.reason, lobby_ban.expires_at FROM lobby_ban WHERE lobby_ban.`idUser` = 1 ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'idUser_1': 1} DEBUG CustomGame.41949:game.py:109 Game(41949,test,maps/scmp_007.zip,0) created DEBUG GameConnection:gameconnection.py:45 GameConnection initializing TRACE LobbyConnection:lobbyconnection.py:1075 >> test: {'command': 'game_launch', 'args': ['/numgames', 5], 'uid': 41949, 'mod': 'faf', 'name': "test's game", 'init_mode': 0} TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:29:21.845675+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:29:21.845422+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'player_info', 'players': [{'id': 3, 'login': 'Rhiza', 'country': '', 'clan': '123', 'ratings': {'global': {'rating': (1650.0, 62.52), 'number_of_games': 2}, 'ladder_1v1': {'rating': (1650.0, 62.52), 'number_of_games': 2}}, 'global_rating': (1650.0, 62.52), 'ladder_rating': (1650.0, 62.52), 'number_of_games': 2}]} TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'closed', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 0, 'max_players': 12, 'launched_at': None, 'teams': {}} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Idle']} INFO CustomGame.41949:game.py:311 Added game connection GameConnection(Player(test, 1, (2000.0, 125.0), (2000.0, 125.0)), Game(41949,test,maps/scmp_007.zip,0)) TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Lobby']} TRACE GameConnection:gameconnection.py:99 >> test: {'command': 'HostGame', 'args': ['scmp_007'], 'target': 'game'} TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'command': 'game_join', 'uid': 41949} INFO aiomysql:cursors.py:242 SELECT lobby_ban.reason, lobby_ban.expires_at FROM lobby_ban WHERE lobby_ban.`idUser` = 3 ORDER BY lobby_ban.expires_at DESC INFO aiomysql:cursors.py:243 {'idUser_1': 3} DEBUG LobbyConnection:lobbyconnection.py:825 joining: 41949 with pw: None DEBUG GameConnection:gameconnection.py:45 GameConnection initializing TRACE LobbyConnection:lobbyconnection.py:1075 >> Rhiza: {'command': 'game_launch', 'args': ['/numgames', 2], 'uid': 41949, 'mod': 'faf', 'name': "test's game", 'init_mode': 0} TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'target': 'game', 'command': 'GameState', 'args': ['Idle']} TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'target': 'game', 'command': 'GameState', 'args': ['Lobby']} TRACE GameConnection:gameconnection.py:99 >> Rhiza: {'command': 'JoinGame', 'args': ['test', 1], 'target': 'game'} TRACE GameConnection:gameconnection.py:99 >> test: {'command': 'ConnectToPeer', 'args': ['Rhiza', 3, True], 'target': 'game'} INFO CustomGame.41949:game.py:311 Added game connection GameConnection(Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)), Game(41949,test,maps/scmp_007.zip,0)) INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: ladder1v1 INFO PopTimer:pop_timer.py:43 Next ladder1v1 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s INFO MatchmakerQueue:matchmaker_queue.py:146 Searching for matches: tmm2v2 INFO PopTimer:pop_timer.py:43 Next tmm2v2 wave happening in 0s TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Army', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Team', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'StartSpot', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Faction', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [1, 'Color', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Army', 2]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Team', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'StartSpot', 2]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Faction', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'PlayerOption', 'args': [3, 'Color', 1]} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'target': 'game', 'command': 'GameState', 'args': ['Launching']} INFO GameConnection:gameconnection.py:432 Launching game Game(41949,test,maps/scmp_007.zip,2) in state GameState.LOBBY INFO CustomGame.41949:game.py:649 Game launched TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'matchmaker_info', 'queues': [{'queue_name': 'tmm2v2', 'queue_pop_time': '2020-09-01T13:29:21.855018+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 2}, {'queue_name': 'ladder1v1', 'queue_pop_time': '2020-09-01T13:29:21.854802+00:00', 'num_players': 0, 'boundary_80s': [], 'boundary_75s': [], 'team_size': 1}]} TRACE UnitTestServer:__init__.py:114 ]]: {'command': 'game_info', 'visibility': 'public', 'password_protected': False, 'uid': 41949, 'title': "test's game", 'state': 'playing', 'game_type': 'custom', 'featured_mod': 'faf', 'sim_mods': {}, 'mapname': 'scmp_007', 'map_file_path': 'maps/scmp_007.zip', 'host': 'test', 'num_players': 2, 'max_players': 12, 'launched_at': 1598966960.856856, 'teams': {1: ['test', 'Rhiza']}} INFO aiomysql:cursors.py:242 SELECT id, ranked FROM map_version WHERE lower(filename) = lower('maps/scmp_007.zip') INFO aiomysql:cursors.py:243 ('maps/scmp_007.zip',) TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'command': 'GameState', 'target': 'game', 'args': ['Ended']} INFO CustomGame.41949:game.py:335 Removed game connection GameConnection(Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)), Game(41949,test,maps/scmp_007.zip,2)) DEBUG GameConnection:gameconnection.py:515 GameConnection(Player(Rhiza, 3, (1650.0, 62.52), (1650.0, 62.52)), Game(41949,test,maps/scmp_007.zip,2)).abort() TRACE LobbyConnection:lobbyconnection.py:165 << Rhiza: {'command': 'GameResult', 'target': 'game', 'args': [1, 'victory 10']} INFO aiomysql:cursors.py:242 INSERT INTO game_stats (id, `gameType`, `gameMod`, host, `mapId`, `gameName`, validity) VALUES (41949, '0', 1, 1, 7, 'test\'s game', 0) INFO aiomysql:cursors.py:243 {'id': 41949, 'gameType': '0', 'gameMod': 1, 'host': 1, 'mapId': 7, 'gameName': "test's game", 'validity': 0} ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> ERROR asyncio:base_events.py:1604 Task was destroyed but it is pending! task: wait_for=()]>> INFO aiomysql:cursors.py:242 INSERT INTO game_player_stats (`gameId`, `playerId`, `AI`, faction, color, team, place, mean, deviation, score) VALUES (41949, 1, 0, 1, 1, 1, 1, 2000, 125, 0), (41949, 3, 0, 1, 1, 1, 2, 1650, 62.52, 0) INFO aiomysql:cursors.py:243 {'gameId_m0': 41949, 'playerId_m0': 1, 'AI_m0': 0, 'faction_m0': 1, 'color_m0': 1, 'team_m0': 1, 'place_m0': 1, 'mean_m0': 2000.0, 'deviation_m0': 125.0, 'score_m0': 0, 'gameId_m1': 41949, 'playerId_m1': 3, 'AI_m1': 0, 'faction_m1': 1, 'color_m1': 1, 'team_m1': 1, 'place_m1': 2, 'mean_m1': 1650.0, 'deviation_m1': 62.52, 'score_m1': 0} TRACE LobbyConnection:lobbyconnection.py:165 << test: {'command': 'GameResult', 'target': 'game', 'args': [2, 'victory 10']} INFO CustomGame.41949:game.py:259 1 reported result for army 2: victory 10 TRACE LobbyConnection:lobbyconnection.py:165 << test: {'command': 'GameState', 'target': 'game', 'args': ['Ended']} ```
Askaholic commented 4 years ago

BTW you can put the full log in a spoiler.

I think what’s happening is that sometimes the game info message is broadcast before the host has replied that their game has launched, and that’s why you see the state as being closed with 0 players. I think games start out in the INITIALIZING state and don’t enter the LOBBY state until the host has sent GameState.IDLE and GameState.LOBBY.

cleborys commented 4 years ago

Ooooh I didn't realize that GameState.INITIALIZING is also communicated as "closed" in Game.to_dict(). I kept thinking that it must somehow be set to GameState.ENDED but couldn't find any calls to that effect.