diff --git a/server/src/QRServer/common/messages.py b/server/src/QRServer/common/messages.py index 5f0f13ed..f6c410ff 100644 --- a/server/src/QRServer/common/messages.py +++ b/server/src/QRServer/common/messages.py @@ -421,8 +421,8 @@ def __serialize_entry(cls, entry: Optional[GameResultHistory]): return '#'.join(data) -class ServerRankingThisMonthResponse(ResponseMessage): - prefix = ['', '', ''] +class ServerRankingResponse(ResponseMessage): + prefix = ['', '', ''] argc = [-1] @classmethod @@ -443,6 +443,10 @@ def __serialize_entry(cls, entry: RankingEntry): ] +class ServerRankingThisMonthResponse(ServerRankingResponse): + prefix = ['', '', ''] + + class LobbyStateResponse(ResponseMessage): prefix = [''] argc = [170] diff --git a/server/src/QRServer/lobby/lobbyclient.py b/server/src/QRServer/lobby/lobbyclient.py index 74910c00..b259991a 100644 --- a/server/src/QRServer/lobby/lobbyclient.py +++ b/server/src/QRServer/lobby/lobbyclient.py @@ -10,7 +10,8 @@ HelloLobbyRequest, JoinLobbyRequest, ServerRecentRequest, ServerRankingRequest, ServerAliveRequest, \ LobbyStateResponse, LobbyChatMessage, SetCommentRequest, ChallengeMessage, ChallengeAuthMessage, \ DisconnectRequest, PolicyFileRequest, CrossDomainPolicyAllowAllResponse, NameTakenRequest, \ - NameTakenResponseYes, NameTakenResponseNo, ChangePasswordRequest, ChangePasswordResponseOk + NameTakenResponseYes, NameTakenResponseNo, ChangePasswordRequest, ChangePasswordResponseOk, \ + ServerRankingResponse from QRServer.discord.webhook import Webhook log = logging.getLogger('qr.lobby_client_handler') @@ -118,6 +119,7 @@ async def _handle_server_recent(self, _: ServerRecentRequest): await self.send_msg(LastPlayedResponse.new(recent_matches)) async def _handle_server_ranking(self, request: ServerRankingRequest): + now = datetime.now() start_date, end_date = utils.make_month_dates(request.get_month(), request.get_year()) rankings = await self.connector.get_ranking( @@ -126,7 +128,10 @@ async def _handle_server_ranking(self, request: ServerRankingRequest): ranked_only=self.config.leaderboards_ranked_only.get(), include_void=self.config.leaderboards_include_void.get() ) - await self.send_msg(ServerRankingThisMonthResponse.new(rankings)) + if now.month == request.get_month() and now.year == request.get_year(): + await self.send_msg(ServerRankingThisMonthResponse.new(rankings)) + else: + await self.send_msg(ServerRankingResponse.new(rankings)) async def _handle_server_alive(self, _: ServerAliveRequest): await self.send_msg(ServerAliveResponse.new()) diff --git a/server/tests/it/test_lobby.py b/server/tests/it/test_lobby.py index 740bba08..54f79955 100644 --- a/server/tests/it/test_lobby.py +++ b/server/tests/it/test_lobby.py @@ -1,10 +1,13 @@ import asyncio from unittest.mock import patch +from datetime import datetime from QRServer.common.classes import LobbyPlayer from QRServer.common.messages import JoinLobbyRequest, LobbyStateResponse, LobbyDuplicateResponse, SetCommentRequest, \ BroadcastCommentResponse, NameTakenRequest, NameTakenResponseYes, NameTakenResponseNo, ChangePasswordRequest, \ - ChangePasswordResponseOk, LobbyBadMemberResponse + ChangePasswordResponseOk, LobbyBadMemberResponse, ServerRankingRequest, ServerRankingThisMonthResponse, \ + ServerRankingResponse +from QRServer.db.connector import DbConnector from . import QuadradiusIntegrationTestCase @@ -282,3 +285,25 @@ async def test_lobby_password_change_no_login(self): client = await self.new_lobby_client() await client.send_message(ChangePasswordRequest.new('912ec803b2ce49e4a541068d495ab570')) await client.assert_no_more_messages() + + @patch('QRServer.lobby.lobbyclient.datetime') + async def test_ranking(self, datetime_mock): + datetime_mock.now.return_value = datetime.fromisoformat('2024-10-01T00:00:00') + datetime_mock.side_effect = lambda *x: datetime(*x) + self.server.connector = DbConnector(':memory:') + await self.server.connector.connect() + + client = await self.new_lobby_client() + + await client.send_message( + JoinLobbyRequest.new('John', 'cf585d509bf09ce1d2ff5d4226b7dacb')) + await client.assert_received_message( + LobbyStateResponse.new([LobbyPlayer(username='John')])) + + await client.send_message( + ServerRankingRequest.new('2024', '10')) + await client.assert_received_message(ServerRankingThisMonthResponse.new([])) + + await client.send_message( + ServerRankingRequest.new('2024', '9')) + await client.assert_received_message(ServerRankingResponse.new([]))