[Friends] Cache friend data, as steam clears it
This commit is contained in:
parent
8dd86043dc
commit
8e510aa45b
@ -67,11 +67,17 @@ namespace Components
|
|||||||
if (entry == Friends::FriendsList.end() || !Steam::Proxy::SteamFriends) return;
|
if (entry == Friends::FriendsList.end() || !Steam::Proxy::SteamFriends) return;
|
||||||
|
|
||||||
entry->name = Steam::Proxy::SteamFriends->GetFriendPersonaName(user);
|
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->online = Steam::Proxy::SteamFriends->GetFriendPersonaState(user) != 0;
|
||||||
entry->guid.Bits = strtoull(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_guid"), nullptr, 16);
|
|
||||||
entry->experience = atoi(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_experience"));
|
std::string guid = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_guid");
|
||||||
entry->prestige = atoi(Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_prestige"));
|
std::string name = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_name");
|
||||||
|
std::string experience = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_experience");
|
||||||
|
std::string prestige = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_prestige");
|
||||||
|
|
||||||
|
if (!guid.empty()) entry->guid.Bits = strtoull(guid.data(), nullptr, 16);
|
||||||
|
if (!name.empty()) entry->playerName = name;
|
||||||
|
if (!experience.empty()) entry->experience = atoi(experience.data());
|
||||||
|
if (!prestige.empty()) entry->prestige = atoi(prestige.data());
|
||||||
|
|
||||||
std::string server = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_server");
|
std::string server = Steam::Proxy::SteamFriends->GetFriendRichPresence(user, "iw4x_server");
|
||||||
Network::Address oldAddress = entry->server;
|
Network::Address oldAddress = entry->server;
|
||||||
@ -209,18 +215,34 @@ namespace Components
|
|||||||
|
|
||||||
int count = Steam::Proxy::SteamFriends->GetFriendCount(4);
|
int count = Steam::Proxy::SteamFriends->GetFriendCount(4);
|
||||||
|
|
||||||
|
Proto::Friends::List list;
|
||||||
|
list.ParseFromString(Utils::IO::ReadFile("players/friends.dat"));
|
||||||
|
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
SteamID id = Steam::Proxy::SteamFriends->GetFriendByIndex(i, 4);
|
SteamID id = Steam::Proxy::SteamFriends->GetFriendByIndex(i, 4);
|
||||||
|
|
||||||
Friends::Friend entry;
|
Friends::Friend entry;
|
||||||
entry.userId = id;
|
entry.userId = id;
|
||||||
|
entry.guid.Bits = 0;
|
||||||
entry.online = false;
|
entry.online = false;
|
||||||
entry.lastTime = 0;
|
entry.lastTime = 0;
|
||||||
entry.prestige = 0;
|
entry.prestige = 0;
|
||||||
entry.experience = 0;
|
entry.experience = 0;
|
||||||
entry.server.setType(Game::NA_BAD);
|
entry.server.setType(Game::NA_BAD);
|
||||||
|
|
||||||
|
for(auto storedFriend : list.friends())
|
||||||
|
{
|
||||||
|
if(entry.userId.Bits == strtoull(storedFriend.steamid().data(), nullptr, 16))
|
||||||
|
{
|
||||||
|
entry.playerName = storedFriend.name();
|
||||||
|
entry.experience = storedFriend.experience();
|
||||||
|
entry.prestige = storedFriend.prestige();
|
||||||
|
entry.guid.Bits = strtoull(storedFriend.guid().data(), nullptr, 16);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto oldEntry = std::find_if(oldFriends.begin(), oldFriends.end(), [id](Friends::Friend entry)
|
auto oldEntry = std::find_if(oldFriends.begin(), oldFriends.end(), [id](Friends::Friend entry)
|
||||||
{
|
{
|
||||||
return (entry.userId.Bits == id.Bits);
|
return (entry.userId.Bits == id.Bits);
|
||||||
@ -337,6 +359,25 @@ namespace Components
|
|||||||
return ((Steam::Proxy::SteamUtils->GetServerRealTime() - timeStamp) < duration);
|
return ((Steam::Proxy::SteamUtils->GetServerRealTime() - timeStamp) < duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Friends::StoreFriendsList()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> _(Friends::Mutex);
|
||||||
|
|
||||||
|
Proto::Friends::List list;
|
||||||
|
for(auto entry : Friends::FriendsList)
|
||||||
|
{
|
||||||
|
Proto::Friends::Friend* friendEntry = list.add_friends();
|
||||||
|
|
||||||
|
friendEntry->set_steamid(Utils::String::VA("%llX", entry.userId.Bits));
|
||||||
|
friendEntry->set_guid(Utils::String::VA("%llX", entry.guid.Bits));
|
||||||
|
friendEntry->set_name(entry.playerName);
|
||||||
|
friendEntry->set_experience(entry.experience);
|
||||||
|
friendEntry->set_prestige(entry.prestige);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils::IO::WriteFile("players/friends.dat", list.SerializeAsString());
|
||||||
|
}
|
||||||
|
|
||||||
Friends::Friends()
|
Friends::Friends()
|
||||||
{
|
{
|
||||||
// Callback to update user information
|
// Callback to update user information
|
||||||
@ -450,6 +491,8 @@ namespace Components
|
|||||||
|
|
||||||
Friends::~Friends()
|
Friends::~Friends()
|
||||||
{
|
{
|
||||||
|
Friends::StoreFriendsList();
|
||||||
|
|
||||||
Steam::Proxy::UnregisterCallback(336);
|
Steam::Proxy::UnregisterCallback(336);
|
||||||
Steam::Proxy::UnregisterCallback(304);
|
Steam::Proxy::UnregisterCallback(304);
|
||||||
|
|
||||||
|
@ -75,5 +75,7 @@ namespace Components
|
|||||||
static void UpdateTimeStamp();
|
static void UpdateTimeStamp();
|
||||||
|
|
||||||
static bool IsOnline(unsigned __int64 timeStamp);
|
static bool IsOnline(unsigned __int64 timeStamp);
|
||||||
|
|
||||||
|
static void StoreFriendsList();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
17
src/Proto/friends.proto
Normal file
17
src/Proto/friends.proto
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package Proto.Friends;
|
||||||
|
|
||||||
|
message Friend
|
||||||
|
{
|
||||||
|
bytes steamid = 1;
|
||||||
|
bytes name = 2;
|
||||||
|
bytes guid = 3;
|
||||||
|
uint32 prestige = 4;
|
||||||
|
uint32 experience = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message List
|
||||||
|
{
|
||||||
|
repeated Friend friends = 1;
|
||||||
|
}
|
@ -88,6 +88,7 @@ template <size_t S> class Sizer { };
|
|||||||
#include "proto/node.pb.h"
|
#include "proto/node.pb.h"
|
||||||
#include "proto/rcon.pb.h"
|
#include "proto/rcon.pb.h"
|
||||||
#include "proto/ipc.pb.h"
|
#include "proto/ipc.pb.h"
|
||||||
|
#include "proto/friends.pb.h"
|
||||||
|
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user