From b85dd9e3a11e3e0ac0003401dd657eca42dfbe8a Mon Sep 17 00:00:00 2001 From: momo5502 Date: Tue, 31 Jan 2017 10:20:28 +0100 Subject: [PATCH] [Friends] Determine online status using a timestamp --- src/Components/Modules/Friends.cpp | 36 ++++++++++++++++++++++++------ src/Components/Modules/Friends.hpp | 6 ++++- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/Components/Modules/Friends.cpp b/src/Components/Modules/Friends.cpp index f8c87169..4f31add0 100644 --- a/src/Components/Modules/Friends.cpp +++ b/src/Components/Modules/Friends.cpp @@ -34,7 +34,7 @@ namespace Components for(auto entry : Friends::FriendsList) { if(!entry.online) offlineList.push_back(entry); - else if(!entry.playing) onlineList.push_back(entry); + else if(!Friends::IsOnline(entry.lastTime)) onlineList.push_back(entry); else if (entry.server.getType() == Game::NA_BAD) playingList.push_back(entry); else connectedList.push_back(entry); } @@ -66,7 +66,6 @@ namespace Components entry->name = Steam::Proxy::SteamFriends->GetFriendPersonaName(user); entry->playerName = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_name"); entry->online = Steam::Proxy::SteamFriends->GetFriendPersonaState(user) != 0; - entry->playing = atoi(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_playing")) == 1; entry->guid.Bits = strtoull(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_guid"), nullptr, 16); entry->experience = atoi(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_experience")); entry->prestige = atoi(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_prestige")); @@ -74,6 +73,8 @@ namespace Components std::string server = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_server"); Network::Address oldAddress = entry->server; + entry->lastTime = static_cast(atoi(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_playing"))); + if (server.empty()) { entry->server.setType(Game::NA_BAD); @@ -155,7 +156,7 @@ namespace Components for (auto entry : Friends::FriendsList) { - if (entry.guid.Bits == guid.Bits && entry.playing && entry.online) + if (entry.guid.Bits == guid.Bits && Friends::IsOnline(entry.lastTime) && entry.online) { return true; } @@ -199,7 +200,7 @@ namespace Components Friends::Friend entry; entry.userId = id; entry.online = false; - entry.playing = false; + entry.lastTime = 0; entry.prestige = 0; entry.experience = 0; entry.server.setType(Game::NA_BAD); @@ -265,7 +266,7 @@ namespace Components case 2: { if (!user.online) return "Offline"; - if (!user.playing) return "Online"; + if (!Friends::IsOnline(user.lastTime)) return "Online"; if (user.server.getType() == Game::NA_BAD) return "Playing IW4x"; if (user.serverName.empty()) return Utils::String::VA("Playing on %s", user.server.getCString()); return Utils::String::VA("Playing on %s", user.serverName.data()); @@ -299,6 +300,16 @@ namespace Components } } + void Friends::UpdateTimeStamp() + { + Friends::SetPresence("iw4x_playing", Utils::String::VA("%d", Steam::Proxy::SteamUtils->GetServerRealTime())); + } + + bool Friends::IsOnline(unsigned int ts) + { + return (Steam::Proxy::SteamUtils && ((Steam::Proxy::SteamUtils->GetServerRealTime() - ts) <= 5 * 60)); // % minutes + } + Friends::Friends() { // Callback to update user information @@ -374,12 +385,23 @@ namespace Components Friends::InitialState = Steam::Proxy::SteamLegacyFriends->GetPersonaState(); } - Friends::SetPresence("iw4x_playing", "1"); Friends::SetPresence("iw4x_guid", Utils::String::VA("%llX", Steam::SteamUser()->GetSteamID().Bits)); //Friends::UpdateState(); // Don't update state yet, stats will do that - + Friends::UpdateTimeStamp(); Friends::UpdateFriends(); }); + + QuickPatch::OnFrame([]() + { + static Utils::Time::Interval interval; + + if(interval.elapsed(2min)) + { + interval.update(); + Friends::UpdateTimeStamp(); + Friends::UpdateState(); + } + }); } Friends::~Friends() diff --git a/src/Components/Modules/Friends.hpp b/src/Components/Modules/Friends.hpp index 5fe96946..cf598c56 100644 --- a/src/Components/Modules/Friends.hpp +++ b/src/Components/Modules/Friends.hpp @@ -44,7 +44,7 @@ namespace Components Network::Address server; std::string serverName; bool online; - bool playing; + unsigned int lastTime; int experience; int prestige; }; @@ -69,5 +69,9 @@ namespace Components static unsigned int GetFriendCount(); static const char* GetFriendText(unsigned int index, int column); static void SelectFriend(unsigned int index); + + static void UpdateTimeStamp(); + + static bool IsOnline(unsigned int ts); }; }