[Friends] Determine online status using a timestamp

This commit is contained in:
momo5502 2017-01-31 10:20:28 +01:00
parent 358822d560
commit b85dd9e3a1
2 changed files with 34 additions and 8 deletions

View File

@ -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<unsigned int>(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()

View File

@ -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);
};
}