Skip to content

Commit

Permalink
Merge pull request #73 from universal963/patch-oldsteamfriends
Browse files Browse the repository at this point in the history
Initial implementation of `ISteamFriends001` to `ISteamFriends002`
  • Loading branch information
Detanup01 authored Oct 26, 2024
2 parents 63552d7 + 40a287f commit 5b02ecb
Show file tree
Hide file tree
Showing 6 changed files with 347 additions and 1 deletion.
31 changes: 31 additions & 0 deletions dll/dll/steam_friends.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ struct Avatar_Numbers {
};

class Steam_Friends :
public ISteamFriends001,
public ISteamFriends002,
public ISteamFriends003,
public ISteamFriends004,
public ISteamFriends005,
Expand Down Expand Up @@ -60,6 +62,8 @@ public ISteamFriends
CSteamID lobby_id{};

std::chrono::high_resolution_clock::time_point last_sent_friends{};
std::map<std::string, std::string> reg{};
std::string reg_nullptr{};

Friend *find_friend(CSteamID id);

Expand Down Expand Up @@ -107,6 +111,11 @@ public ISteamFriends
// gets the status of the current user
EPersonaState GetPersonaState();

void SetPersonaState( EPersonaState ePersonaState );
bool AddFriend( CSteamID steamIDFriend );
bool RemoveFriend( CSteamID steamIDFriend );
bool HasFriend( CSteamID steamIDFriend );


// friend iteration
// takes a set of k_EFriendFlags, and returns the number of users the client knows about who meet that criteria
Expand Down Expand Up @@ -135,13 +144,32 @@ public ISteamFriends
// this will only be known by the local user if steamIDFriend is in their friends list; on the same game server; in a chat room or lobby; or in a small group with the local user
EPersonaState GetFriendPersonaState( CSteamID steamIDFriend );

bool Deprecated_GetFriendGamePlayed( CSteamID steamIDFriend, int32 *pnGameID, uint32 *punGameIP, uint16 *pusGamePort );


// returns the name another user - guaranteed to not be NULL.
// same rules as GetFriendPersonaState() apply as to whether or not the user knowns the name of the other user
// note that on first joining a lobby, chat room or game server the local user will not known the name of the other users automatically; that information will arrive asyncronously
//
const char *GetFriendPersonaName( CSteamID steamIDFriend );

int32 AddFriendByName( const char *pchEmailOrAccountName );
int GetFriendCount();
CSteamID GetFriendByIndex( int iFriend );
void SendMsgToFriend( CSteamID steamIDFriend, EChatEntryType eChatEntryType, const char *pchMsgBody );
void SetFriendRegValue( CSteamID steamIDFriend, const char *pchKey, const char *pchValue );
const char *GetFriendRegValue( CSteamID steamIDFriend, const char *pchKey );
int GetChatMessage( CSteamID steamIDFriend, int iChatID, void *pvData, int cubData, EChatEntryType *peChatEntryType );

bool SendMsgToFriend( CSteamID steamIDFriend, EChatEntryType eChatEntryType, const void *pvMsgBody, int cubMsgBody );
int GetChatIDOfChatHistoryStart( CSteamID steamIDFriend );
void SetChatHistoryStart( CSteamID steamIDFriend, int iChatID );
void ClearChatHistory( CSteamID steamIDFriend );
bool InviteFriendByEmail( const char *pchEmailAccount );
int GetBlockedFriendCount();
bool GetFriendGamePlayed( CSteamID steamIDFriend, uint64 *pulGameID, uint32 *punGameIP, uint16 *pusGamePort );
bool GetFriendGamePlayed2( CSteamID steamIDFriend, uint64 *pulGameID, uint32 *punGameIP, uint16 *pusGamePort, uint16 *pusQueryPort );


// returns true if the friend is actually in a game, and fills in pFriendGameInfo with an extra details
bool GetFriendGamePlayed( CSteamID steamIDFriend, STEAM_OUT_STRUCT() FriendGameInfo_t *pFriendGameInfo );
Expand Down Expand Up @@ -191,6 +219,9 @@ public ISteamFriends

const char *GetClanName( CSteamID steamIDClan );

bool InviteFriendToClan( CSteamID steamIDFriend, CSteamID steamIDClan );
bool AcknowledgeInviteToClan( CSteamID steamIDClan, bool bAcceptOrDenyClanInvite );

const char *GetClanTag( CSteamID steamIDClan );

// returns the most recent information we have about what's happening in a clan
Expand Down
6 changes: 5 additions & 1 deletion dll/steam_client_interface_getter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,11 @@ ISteamFriends *Steam_Client::GetISteamFriends( HSteamUser hSteamUser, HSteamPipe
PRINT_DEBUG("%s", pchVersion);
if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL;

if (strcmp(pchVersion, "SteamFriends003") == 0) {
if (strcmp(pchVersion, "SteamFriends001") == 0) {
return reinterpret_cast<ISteamFriends *>(static_cast<ISteamFriends001 *>(steam_friends)); // sdk 0.99u
} else if (strcmp(pchVersion, "SteamFriends002") == 0) {
return reinterpret_cast<ISteamFriends *>(static_cast<ISteamFriends002 *>(steam_friends)); // sdk 0.99y
} else if (strcmp(pchVersion, "SteamFriends003") == 0) {
return reinterpret_cast<ISteamFriends *>(static_cast<ISteamFriends003 *>(steam_friends));
} else if (strcmp(pchVersion, "SteamFriends004") == 0) {
return reinterpret_cast<ISteamFriends *>(static_cast<ISteamFriends004 *>(steam_friends));
Expand Down
164 changes: 164 additions & 0 deletions dll/steam_friends.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,35 @@ EPersonaState Steam_Friends::GetPersonaState()
return k_EPersonaStateOnline;
}

void Steam_Friends::SetPersonaState(EPersonaState ePersonaState)
{
PRINT_DEBUG_TODO();
}

bool Steam_Friends::AddFriend(CSteamID steamIDFriend)
{
PRINT_DEBUG_TODO();
if (steamIDFriend == k_steamIDNil)
return false;
// TODO
return true;
}

bool Steam_Friends::RemoveFriend(CSteamID steamIDFriend)
{
PRINT_DEBUG_TODO();
if (steamIDFriend == k_steamIDNil)
return false;
// TODO
return true;
}

bool Steam_Friends::HasFriend(CSteamID steamIDFriend)
{
PRINT_DEBUG("sdk 0.99u");
return HasFriend(steamIDFriend, (int)k_EFriendFlagImmediate);
}


// friend iteration
// takes a set of k_EFriendFlags, and returns the number of users the client knows about who meet that criteria
Expand Down Expand Up @@ -326,6 +355,13 @@ EPersonaState Steam_Friends::GetFriendPersonaState( CSteamID steamIDFriend )
return state;
}

bool Steam_Friends::Deprecated_GetFriendGamePlayed(CSteamID steamIDFriend, int32 *pnGameID, uint32 *punGameIP, uint16 *pusGamePort)
{
PRINT_DEBUG_ENTRY();
// TODO: real steam seems not to fill memory pointed by pnGameID
return GetFriendGamePlayed(steamIDFriend, NULL, punGameIP, pusGamePort, NULL);
}


// returns the name another user - guaranteed to not be NULL.
// same rules as GetFriendPersonaState() apply as to whether or not the user knowns the name of the other user
Expand All @@ -347,6 +383,122 @@ const char* Steam_Friends::GetFriendPersonaName( CSteamID steamIDFriend )
return name;
}

int32 Steam_Friends::AddFriendByName(const char *pchEmailOrAccountName)
{
PRINT_DEBUG_TODO();
return 0;
}

int Steam_Friends::GetFriendCount()
{
PRINT_DEBUG("sdk 0.99u");
return GetFriendCount((int)k_EFriendFlagImmediate);
}

CSteamID Steam_Friends::GetFriendByIndex(int iFriend)
{
PRINT_DEBUG("sdk 0.99u");
return GetFriendByIndex(iFriend, (int)k_EFriendFlagImmediate);
}

void Steam_Friends::SendMsgToFriend(CSteamID steamIDFriend, EChatEntryType eChatEntryType, const char *pchMsgBody)
{
PRINT_DEBUG_TODO();
}

void Steam_Friends::SetFriendRegValue(CSteamID steamIDFriend, const char *pchKey, const char *pchValue)
{
PRINT_DEBUG_TODO();
std::lock_guard<std::recursive_mutex> lock(global_mutex);
if (!pchValue)
return; // real steam crashes though

if (!pchKey || !pchKey[0]) // tested on real steam
{
reg.clear();
reg_nullptr = std::string(pchValue);
}
else
{
reg[std::string(pchKey)] = std::string(pchValue);
// TODO: save it to disk, because real steam can get the string when app restarts
}
}

const char *Steam_Friends::GetFriendRegValue(CSteamID steamIDFriend, const char *pchKey)
{
PRINT_DEBUG_TODO();
std::lock_guard<std::recursive_mutex> lock(global_mutex);
// TODO: load data from disk, because real steam can get the string when app restarts

if (!pchKey || !pchKey[0])
{
return reg_nullptr.c_str();
}
else
{
auto it = reg.find(std::string(pchKey));
if (it == reg.end())
return "";

return it->second.c_str();
}
}

int Steam_Friends::GetChatMessage(CSteamID steamIDFriend, int iChatID, void *pvData, int cubData, EChatEntryType *peChatEntryType)
{
PRINT_DEBUG_TODO();
if (peChatEntryType)
*peChatEntryType = k_EChatEntryTypeInvalid;
return 0;
}

bool Steam_Friends::SendMsgToFriend(CSteamID steamIDFriend, EChatEntryType eChatEntryType, const void *pvMsgBody, int cubMsgBody)
{
PRINT_DEBUG_TODO();
return true;
}

int Steam_Friends::GetChatIDOfChatHistoryStart(CSteamID steamIDFriend)
{
PRINT_DEBUG_TODO();
return 0;
}

void Steam_Friends::SetChatHistoryStart(CSteamID steamIDFriend, int iChatID)
{
PRINT_DEBUG_TODO();
}

void Steam_Friends::ClearChatHistory(CSteamID steamIDFriend)
{
PRINT_DEBUG_TODO();
}

bool Steam_Friends::InviteFriendByEmail(const char *pchEmailAccount)
{
PRINT_DEBUG_TODO();
return false;
}

int Steam_Friends::GetBlockedFriendCount()
{
PRINT_DEBUG_ENTRY();
return GetFriendCount((int)k_EFriendFlagBlocked);
}

bool Steam_Friends::GetFriendGamePlayed(CSteamID steamIDFriend, uint64 *pulGameID, uint32 *punGameIP, uint16 *pusGamePort)
{
PRINT_DEBUG("sdk 0.99u");
return GetFriendGamePlayed(steamIDFriend, pulGameID, punGameIP, pusGamePort, NULL);
}

bool Steam_Friends::GetFriendGamePlayed2(CSteamID steamIDFriend, uint64 *pulGameID, uint32 *punGameIP, uint16 *pusGamePort, uint16 *pusQueryPort)
{
PRINT_DEBUG_ENTRY();
return GetFriendGamePlayed(steamIDFriend, pulGameID, punGameIP, pusGamePort, pusQueryPort);
}


// returns true if the friend is actually in a game, and fills in pFriendGameInfo with an extra details
bool Steam_Friends::GetFriendGamePlayed( CSteamID steamIDFriend, STEAM_OUT_STRUCT() FriendGameInfo_t *pFriendGameInfo )
Expand Down Expand Up @@ -530,6 +682,18 @@ const char* Steam_Friends::GetClanName( CSteamID steamIDClan )
return "";
}

bool Steam_Friends::InviteFriendToClan(CSteamID steamIDFriend, CSteamID steamIDClan)
{
PRINT_DEBUG_TODO();
return false;
}

bool Steam_Friends::AcknowledgeInviteToClan(CSteamID steamIDClan, bool bAcceptOrDenyClanInvite)
{
PRINT_DEBUG_TODO();
return false;
}

const char* Steam_Friends::GetClanTag( CSteamID steamIDClan )
{
PRINT_DEBUG_ENTRY();
Expand Down
52 changes: 52 additions & 0 deletions sdk/steam/isteamfriends001.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@

#ifndef ISTEAMFRIENDS001_H
#define ISTEAMFRIENDS001_H
#ifdef STEAM_WIN32
#pragma once
#endif

//-----------------------------------------------------------------------------
// Purpose: interface to accessing information about individual users,
// that can be a friend, in a group, on a game server or in a lobby with the local user
//-----------------------------------------------------------------------------
class ISteamFriends001
{
public:
// returns the local players name - guaranteed to not be NULL.
// this is the same name as on the users community profile page
// this is stored in UTF-8 format
// like all the other interface functions that return a char *, it's important that this pointer is not saved
// off; it will eventually be free'd or re-allocated
virtual const char *GetPersonaName() = 0;

virtual void SetPersonaName_old( const char *pchPersonaName ) = 0;
virtual EPersonaState GetPersonaState() = 0;
virtual void SetPersonaState( EPersonaState ePersonaState ) = 0;
virtual bool AddFriend( CSteamID steamIDFriend ) = 0;
virtual bool RemoveFriend( CSteamID steamIDFriend ) = 0;
virtual bool HasFriend( CSteamID steamIDFriend ) = 0;
virtual EFriendRelationship GetFriendRelationship( CSteamID steamIDFriend ) = 0;
virtual EPersonaState GetFriendPersonaState( CSteamID steamIDFriend ) = 0;
virtual bool Deprecated_GetFriendGamePlayed( CSteamID steamIDFriend, int32 *pnGameID, uint32 *punGameIP, uint16 *pusGamePort ) = 0;
virtual const char *GetFriendPersonaName( CSteamID steamIDFriend ) = 0;
virtual int32 AddFriendByName( const char *pchEmailOrAccountName ) = 0;
virtual int GetFriendCount() = 0;
virtual CSteamID GetFriendByIndex( int iFriend ) = 0;
virtual void SendMsgToFriend( CSteamID steamIDFriend, EChatEntryType eChatEntryType, const char *pchMsgBody ) = 0;
virtual void SetFriendRegValue( CSteamID steamIDFriend, const char *pchKey, const char *pchValue ) = 0;
virtual const char *GetFriendRegValue( CSteamID steamIDFriend, const char *pchKey ) = 0;
virtual const char *GetFriendPersonaNameHistory( CSteamID steamIDFriend, int iPersonaName ) = 0;
virtual int GetChatMessage( CSteamID steamIDFriend, int iChatID, void *pvData, int cubData, EChatEntryType *peChatEntryType ) = 0;

virtual bool SendMsgToFriend( CSteamID steamIDFriend, EChatEntryType eChatEntryType, const void *pvMsgBody, int cubMsgBody ) = 0;
virtual int GetChatIDOfChatHistoryStart( CSteamID steamIDFriend ) = 0;
virtual void SetChatHistoryStart( CSteamID steamIDFriend, int iChatID ) = 0;
virtual void ClearChatHistory( CSteamID steamIDFriend ) = 0;
virtual bool InviteFriendByEmail( const char *pchEmailAccount ) = 0;
virtual int GetBlockedFriendCount() = 0;
virtual bool GetFriendGamePlayed( CSteamID steamIDFriend, uint64 *pulGameID, uint32 *punGameIP, uint16 *pusGamePort ) = 0;
virtual bool GetFriendGamePlayed2( CSteamID steamIDFriend, uint64 *pulGameID, uint32 *punGameIP, uint16 *pusGamePort, uint16 *pusQueryPort ) = 0;
};


#endif // ISTEAMFRIENDS001_H
Loading

0 comments on commit 5b02ecb

Please sign in to comment.