From d5c80cfb0fc8c8f8163f0a4a4bcfc91498057930 Mon Sep 17 00:00:00 2001 From: beerpsi Date: Wed, 24 Apr 2024 17:00:01 +0000 Subject: [PATCH] [mai2/chuni/ongeki] Properly ignore guest plays (#132) For all three games, guest plays are created using: ```python 0x1000000000001 | ((allnet_place_id & 65535) << 32) ``` Reviewed-on: https://gitea.tendokyu.moe/Hay1tsme/artemis/pulls/132 Co-authored-by: beerpsi Co-committed-by: beerpsi --- titles/chuni/base.py | 6 ++++++ titles/mai2/base.py | 6 ++++-- titles/mai2/dx.py | 6 ++++-- titles/ongeki/base.py | 10 +++++++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/titles/chuni/base.py b/titles/chuni/base.py index c3b9ca2..9e8a634 100644 --- a/titles/chuni/base.py +++ b/titles/chuni/base.py @@ -811,6 +811,12 @@ class ChuniBase: upsert = data["upsertUserAll"] user_id = data["userId"] + if int(user_id) & 0x1000000000001 == 0x1000000000001: + place_id = int(user_id) & 0xFFFC00000000 + + self.logger.info("Guest play from place ID %d, ignoring.", place_id) + return {"returnCode": "1"} + if "userData" in upsert: try: upsert["userData"][0]["userName"] = self.read_wtf8( diff --git a/titles/mai2/base.py b/titles/mai2/base.py index 5a5edb9..a75a94f 100644 --- a/titles/mai2/base.py +++ b/titles/mai2/base.py @@ -238,8 +238,10 @@ class Mai2Base: user_id = data["userId"] upsert = data["upsertUserAll"] - if int(user_id) & 1000000000001 == 1000000000001: - self.logger.info("Guest play, ignoring.") + if int(user_id) & 0x1000000000001 == 0x1000000000001: + place_id = int(user_id) & 0xFFFC00000000 + + self.logger.info("Guest play from place ID %d, ignoring.", place_id) return {"returnCode": 1, "apiName": "UpsertUserAllApi"} if "userData" in upsert and len(upsert["userData"]) > 0: diff --git a/titles/mai2/dx.py b/titles/mai2/dx.py index 0d3bddd..8d6e738 100644 --- a/titles/mai2/dx.py +++ b/titles/mai2/dx.py @@ -121,8 +121,10 @@ class Mai2DX(Mai2Base): user_id = data["userId"] upsert = data["upsertUserAll"] - if int(user_id) & 1000000000001 == 1000000000001: - self.logger.info("Guest play, ignoring.") + if int(user_id) & 0x1000000000001 == 0x1000000000001: + place_id = int(user_id) & 0xFFFC00000000 + + self.logger.info("Guest play from place ID %d, ignoring.", place_id) return {"returnCode": 1, "apiName": "UpsertUserAllApi"} if "userData" in upsert and len(upsert["userData"]) > 0: diff --git a/titles/ongeki/base.py b/titles/ongeki/base.py index 57a7363..e454dc3 100644 --- a/titles/ongeki/base.py +++ b/titles/ongeki/base.py @@ -293,7 +293,9 @@ class OngekiBase: async def handle_upsert_user_gplog_api_request(self, data: Dict) -> Dict: user = data["userId"] - if user >= 200000000000000: # Account for guest play + + # If playing as guest, the user ID is or(0x1000000000001, (placeId & 65535) << 32) + if user & 0x1000000000001 == 0x1000000000001: user = None await self.data.log.put_gp_log( @@ -945,6 +947,12 @@ class OngekiBase: upsert = data["upsertUserAll"] user_id = data["userId"] + if user_id & 0x1000000000001 == 0x1000000000001: + place_id = int(user_id) & 0xFFFC00000000 + + self.logger.info("Guest play from place ID %d, ignoring.", place_id) + return {"returnCode": 1, "apiName": "UpsertUserAllApi"} + # The isNew fields are new as of Red and up. We just won't use them for now. if "userData" in upsert and len(upsert["userData"]) > 0: