From d89bb09dd5fe04227f0e63b0564886a73173e155 Mon Sep 17 00:00:00 2001 From: Okladnoj Date: Thu, 21 May 2026 14:02:39 +0300 Subject: [PATCH] feat(session): Add platform identification for macOS users --- GenOnlineService/Constants.cs | 12 ++++++++++-- .../Controllers/CheckLogin/CheckLoginController.cs | 3 +++ .../LoginWithToken/LoginWithTokenController.cs | 3 +++ GenOnlineService/Discord.cs | 6 ++++++ GenOnlineService/LobbyManager.cs | 2 ++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/GenOnlineService/Constants.cs b/GenOnlineService/Constants.cs index 97e073a..22be467 100644 --- a/GenOnlineService/Constants.cs +++ b/GenOnlineService/Constants.cs @@ -46,16 +46,18 @@ public static class Constants } public class RoomMember { - public RoomMember(Int64 a_UserID, string strName, bool admin) + public RoomMember(Int64 a_UserID, string strName, bool admin, string platform = "") { UserID = a_UserID; Name = strName; IsAdmin = admin; + Platform = platform; } public Int64 UserID { get; set; } = -1; public String Name { get; set; } = String.Empty; public bool IsAdmin { get; set; } = false; + public String Platform { get; set; } = ""; } public enum EPendingLoginState @@ -765,7 +767,7 @@ public static async Task TickRoomMemberList() } - memberListUpdate.members.Add(new RoomMember(sess.m_UserID, strDisplayName, sharedUserData.IsAdmin())); + memberListUpdate.members.Add(new RoomMember(sess.m_UserID, strDisplayName, sharedUserData.IsAdmin(), sess.Platform)); // also add to list of users who need this update, since they were in there lstUsersToSend.Add(sess.m_UserID); @@ -883,6 +885,7 @@ public class UserSession private string m_strMiddlewareUserID = String.Empty; public KnownClients.EKnownClients m_client_id = KnownClients.EKnownClients.unknown; + public string Platform { get; private set; } = ""; DateTime m_CreateTime = DateTime.Now; public DateTime GetCreationTime() { @@ -937,6 +940,11 @@ public UserSession(Int64 ownerID, EUserSessionType sessionType, KnownClients.EKn ACExeCRC = Helpers.g_dictInitialExeCRCs[ownerID].ToUpper(); Helpers.g_dictInitialExeCRCs.Remove(ownerID, out string removedCRC); } + + if (Helpers.g_dictPlayerPlatforms.TryRemove(ownerID, out string cachedPlatform)) + { + Platform = cachedPlatform; + } } public void MarkAbandoned() diff --git a/GenOnlineService/Controllers/CheckLogin/CheckLoginController.cs b/GenOnlineService/Controllers/CheckLogin/CheckLoginController.cs index 626a396..e9057ea 100644 --- a/GenOnlineService/Controllers/CheckLogin/CheckLoginController.cs +++ b/GenOnlineService/Controllers/CheckLogin/CheckLoginController.cs @@ -206,6 +206,9 @@ public async Task Post_InternalHandler(string jsonData, string ipAddr string exe_crc = data.ContainsKey("exe_crc") ? data["exe_crc"].ToString() : "NONE"; Helpers.RegisterInitialPlayerExeCRC(user_id, exe_crc); + string platform = data.ContainsKey("platform") ? data["platform"].ToString() : ""; + Helpers.RegisterPlayerPlatform(user_id, platform); + var sessiontoken = Program.g_tokenGenerator.GenerateToken(strDisplayName, user_id, ipAddr, Program.JwtTokenGenerator.ETokenType.Session, knownClientID, sessionType, bIsAdmin); var refreshtoken = Program.g_tokenGenerator.GenerateToken(strDisplayName, user_id, ipAddr, Program.JwtTokenGenerator.ETokenType.Refresh, knownClientID, sessionType, false); diff --git a/GenOnlineService/Controllers/LoginWithToken/LoginWithTokenController.cs b/GenOnlineService/Controllers/LoginWithToken/LoginWithTokenController.cs index 2796259..e6eda4e 100644 --- a/GenOnlineService/Controllers/LoginWithToken/LoginWithTokenController.cs +++ b/GenOnlineService/Controllers/LoginWithToken/LoginWithTokenController.cs @@ -138,6 +138,9 @@ public async Task Post_InternalHandler(string jsonData, string ipAddr string exe_crc = data.ContainsKey("exe_crc") ? data["exe_crc"].ToString() : "NONE"; Helpers.RegisterInitialPlayerExeCRC(user_id, exe_crc); + string platform = data.ContainsKey("platform") ? data["platform"].ToString() : ""; + Helpers.RegisterPlayerPlatform(user_id, platform); + string strDisplayName = await Database.Users.GetDisplayName(db, user_id); await SessionHelpers.SetUsedLoggedIn(user_id, clientID, sessionType); diff --git a/GenOnlineService/Discord.cs b/GenOnlineService/Discord.cs index 6e9c598..8cf9d02 100644 --- a/GenOnlineService/Discord.cs +++ b/GenOnlineService/Discord.cs @@ -63,6 +63,12 @@ public static void RegisterInitialPlayerExeCRC(Int64 user_id, string exe_crc) g_dictInitialExeCRCs[user_id] = exe_crc; } + public static ConcurrentDictionary g_dictPlayerPlatforms = new(); + public static void RegisterPlayerPlatform(Int64 user_id, string platform) + { + g_dictPlayerPlatforms[user_id] = platform; + } + public static string ComputeMD5Hash(string input) { using (MD5 md5 = MD5.Create()) diff --git a/GenOnlineService/LobbyManager.cs b/GenOnlineService/LobbyManager.cs index 06bd954..9f4db66 100644 --- a/GenOnlineService/LobbyManager.cs +++ b/GenOnlineService/LobbyManager.cs @@ -1105,6 +1105,7 @@ public void UpdateSlotIndex(UInt16 index) public EPlayerType SlotState { get; private set; } = 0; public UInt16 SlotIndex { get; private set; } = 0; public string Region { get; private set; } = "Unknown"; + public string Platform { get; private set; } = ""; public string MiddlewareUserID { get; private set; } = String.Empty; [JsonIgnore] // cant serialize refs @@ -1146,6 +1147,7 @@ public LobbyMember(Lobby owningLobby, UserSession? owningSession, Int64 UserID_i IsReady = false; Region = owningSession == null ? "Unknown" : owningSession.GetFullContinentName(); + Platform = owningSession == null ? "" : owningSession.Platform; } public bool IsHuman() { return SlotState == EPlayerType.SLOT_PLAYER; }