more callbacks

This commit is contained in:
otavepto 2024-04-11 14:08:04 +02:00
parent a04a0d2f20
commit f315bec961
11 changed files with 121 additions and 80 deletions

View File

@ -147,6 +147,10 @@ CSteamID generate_steam_id_lobby()
return CSteamID(generate_account_id(), k_EChatInstanceFlagLobby | k_EChatInstanceFlagMMSLobby, k_EUniversePublic, k_EAccountTypeChat);
}
/// @brief Check for a timeout given some initial timepoint and a timeout in sec.
/// @param old The initial timepoint which will be compared against current time
/// @param timeout The max allowed time in seconds
/// @return true if the timepoint has exceeded the max allowed timeout, false otherwise
bool check_timedout(std::chrono::high_resolution_clock::time_point old, double timeout)
{
if (timeout == 0.0) return true;

View File

@ -74,8 +74,10 @@ SteamAPICall_t CreateBrowser( const char *pchUserAgent, const char *pchUserCSS )
std::lock_guard<std::recursive_mutex> lock(global_mutex);
HTML_BrowserReady_t data;
data.unBrowserHandle = 1234869;
//callback too?
return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));;
auto ret = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
return ret;
}

View File

@ -249,13 +249,23 @@ SteamAPICall_t SetPersonaName( const char *pchPersonaName )
{
PRINT_DEBUG_ENTRY();
std::lock_guard<std::recursive_mutex> lock(global_mutex);
SetPersonaNameResponse_t data;
SetPersonaNameResponse_t data{};
data.m_bSuccess = true;
data.m_bLocalSuccess = false;
data.m_result = k_EResultOK;
persona_change(settings->get_local_steam_id(), k_EPersonaChangeName);
return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));
auto ret = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));
{
PersonaStateChange_t data2{};
data2.m_nChangeFlags = EPersonaChange::k_EPersonaChangeName;
data2.m_ulSteamID = settings->get_local_steam_id().ConvertToUint64();
callbacks->addCBResult(data2.k_iCallback, &data2, sizeof(data2));
}
return ret;
}
void SetPersonaName_old( const char *pchPersonaName )

View File

@ -825,10 +825,13 @@ STEAM_CALL_RESULT( SteamInventoryRequestPricesResult_t )
SteamAPICall_t RequestPrices()
{
PRINT_DEBUG_ENTRY();
SteamInventoryRequestPricesResult_t data;
SteamInventoryRequestPricesResult_t data{};
data.m_result = k_EResultOK;
memcpy(data.m_rgchCurrency, "USD", 4);
return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data), 0.2);
auto ret = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data), 0.2);
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.2);
return ret;
}

View File

@ -27,36 +27,36 @@
struct Pending_Joins {
SteamAPICall_t api_id;
CSteamID lobby_id;
std::chrono::high_resolution_clock::time_point joined;
bool message_sent;
SteamAPICall_t api_id{};
CSteamID lobby_id{};
std::chrono::high_resolution_clock::time_point joined{};
bool message_sent{};
};
struct Pending_Creates {
SteamAPICall_t api_id;
std::chrono::high_resolution_clock::time_point created;
ELobbyType eLobbyType;
int cMaxMembers;
SteamAPICall_t api_id{};
std::chrono::high_resolution_clock::time_point created{};
ELobbyType eLobbyType{};
int cMaxMembers{};
};
struct Data_Requested {
CSteamID lobby_id;
std::chrono::high_resolution_clock::time_point requested;
CSteamID lobby_id{};
std::chrono::high_resolution_clock::time_point requested{};
};
struct Filter_Values {
std::string key;
std::string value_string;
int value_int;
bool is_int;
ELobbyComparison eComparisonType;
std::string key{};
std::string value_string{};
int value_int{};
bool is_int{};
ELobbyComparison eComparisonType{};
};
struct Chat_Entry {
std::string message;
EChatEntryType type;
CSteamID lobby_id, user_id;
std::string message{};
EChatEntryType type{};
CSteamID lobby_id, user_id{};
};
#define FILTER_MAX_DEFAULT 4096
@ -72,30 +72,31 @@ public ISteamMatchmaking007,
public ISteamMatchmaking008,
public ISteamMatchmaking
{
class Settings *settings;
class Networking *network;
class SteamCallResults *callback_results;
class SteamCallBacks *callbacks;
class RunEveryRunCB *run_every_runcb;
class Settings *settings{};
class Networking *network{};
class SteamCallResults *callback_results{};
class SteamCallBacks *callbacks{};
class RunEveryRunCB *run_every_runcb{};
std::vector<Lobby> lobbies;
std::chrono::high_resolution_clock::time_point last_sent_lobbies;
std::vector<struct Pending_Joins> pending_joins;
std::vector<struct Pending_Creates> pending_creates;
std::vector<Lobby> lobbies{};
std::chrono::high_resolution_clock::time_point last_sent_lobbies{};
std::vector<struct Pending_Joins> pending_joins{};
std::vector<struct Pending_Creates> pending_creates{};
std::vector<struct Filter_Values> filter_values;
int filter_max_results;
std::vector<struct Filter_Values> filter_values_copy;
int filter_max_results_copy;
std::vector<CSteamID> filtered_lobbies;
std::chrono::high_resolution_clock::time_point lobby_last_search;
SteamAPICall_t search_call_api_id;
bool searching;
std::vector<struct Filter_Values> filter_values{};
int filter_max_results{};
std::vector<struct Filter_Values> filter_values_copy{};
int filter_max_results_copy{};
std::vector<CSteamID> filtered_lobbies{};
std::chrono::high_resolution_clock::time_point lobby_last_search{};
SteamAPICall_t search_call_api_id{};
bool searching{};
std::vector<struct Chat_Entry> chat_entries;
std::vector<struct Data_Requested> data_requested;
std::vector<struct Chat_Entry> chat_entries{};
std::vector<struct Data_Requested> data_requested{};
std::map<uint64, ::google::protobuf::Map<std::string, std::string>> self_lobby_member_data{};
std::map<uint64, ::google::protobuf::Map<std::string, std::string>> self_lobby_member_data;
google::protobuf::Map<std::string,std::string>::const_iterator caseinsensitive_find(const ::google::protobuf::Map< ::std::string, ::std::string >& map, std::string key)
{
auto x = map.begin();
@ -140,13 +141,12 @@ void trigger_lobby_dataupdate(CSteamID lobby, CSteamID member, bool success, dou
{
PRINT_DEBUG("%llu %llu", lobby.ConvertToUint64(), member.ConvertToUint64());
LobbyDataUpdate_t data{};
memset(&data, 0, sizeof(data));
data.m_ulSteamIDLobby = lobby.ConvertToUint64();
data.m_bSuccess = success;
data.m_ulSteamIDMember = member.ConvertToUint64();
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), cb_timeout, true);
// if this was a user data update, then trigger another callback for the lobby itself
if (lobby != member) {
data.m_ulSteamIDMember = lobby.ConvertToUint64();
//Is this really necessary?
@ -277,6 +277,7 @@ void remove_lobbies()
void on_self_enter_leave_lobby(CSteamID id, int type, bool leaving)
{
if (type == k_ELobbyTypeInvisible) return;
if (!leaving) {
settings->set_lobby(id);
} else {
@ -544,9 +545,6 @@ SteamAPICall_t RequestLobbyList()
searching = true;
if (search_call_api_id) callback_results->rmCallBack(search_call_api_id, NULL);
search_call_api_id = callback_results->reserveCallResult();
return search_call_api_id;
}
@ -664,13 +662,13 @@ CSteamID GetLobbyByIndex( int iLobby )
return id;
}
static bool enter_lobby(Lobby *lobby, CSteamID id)
static bool add_member_to_lobby(Lobby *lobby, CSteamID id)
{
if (get_lobby_member(lobby, id)) return false; // player already exists
Lobby_Member *member = lobby->add_members();
member->set_id(id.ConvertToUint64());
PRINT_DEBUG("added player %llu to lobby", (uint64)id.ConvertToUint64());
PRINT_DEBUG("added lobby member %llu", (uint64)id.ConvertToUint64());
return true;
}
@ -691,7 +689,7 @@ void Create_pending_lobbies()
auto p_c = std::begin(pending_creates);
while (p_c != std::end(pending_creates)) {
if (check_timedout(p_c->created, LOBBY_CREATE_DELAY)) {
Lobby lobby;
Lobby lobby{};
CSteamID lobby_id = generate_steam_id_lobby();
lobby.set_room_id(lobby_id.ConvertToUint64());
lobby.set_joinable(true);
@ -699,7 +697,7 @@ void Create_pending_lobbies()
lobby.set_type(p_c->eLobbyType);
lobby.set_owner(settings->get_local_steam_id().ConvertToUint64());
lobby.set_appid(settings->get_local_game_id().AppID());
enter_lobby(&lobby, settings->get_local_steam_id());
add_member_to_lobby(&lobby, settings->get_local_steam_id());
lobbies.push_back(lobby);
if (settings->disable_lobby_creation) {
@ -714,17 +712,17 @@ void Create_pending_lobbies()
data.m_ulSteamIDLobby = lobby.room_id();
callback_results->addCallResult(p_c->api_id, data.k_iCallback, &data, sizeof(data));
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
{
LobbyEnter_t data;
data.m_ulSteamIDLobby = lobby.room_id();
data.m_rgfChatPermissions = 0; //Unused - Always 0
LobbyEnter_t data2{};
data2.m_ulSteamIDLobby = lobby.room_id();
data2.m_rgfChatPermissions = 0; //Unused - Always 0
if (p_c->eLobbyType == k_ELobbyTypePrivate)
data.m_bLocked = true;
data2.m_bLocked = true;
else
data.m_bLocked = false;
data.m_EChatRoomEnterResponse = k_EChatRoomEnterResponseSuccess;
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
data2.m_bLocked = false;
data2.m_EChatRoomEnterResponse = k_EChatRoomEnterResponseSuccess;
callbacks->addCBResult(data2.k_iCallback, &data2, sizeof(data2));
}
on_self_enter_leave_lobby(lobby_id, p_c->eLobbyType, false);
@ -749,7 +747,7 @@ SteamAPICall_t CreateLobby( ELobbyType eLobbyType, int cMaxMembers )
{
PRINT_DEBUG("type: %i max_members: %i", eLobbyType, cMaxMembers);
std::lock_guard<std::recursive_mutex> lock(global_mutex);
struct Pending_Creates p_c;
struct Pending_Creates p_c{};
p_c.api_id = callback_results->reserveCallResult();
p_c.eLobbyType = eLobbyType;
p_c.cMaxMembers = cMaxMembers;
@ -760,6 +758,7 @@ SteamAPICall_t CreateLobby( ELobbyType eLobbyType, int cMaxMembers )
SteamAPICall_t CreateLobby( ELobbyType eLobbyType )
{
PRINT_DEBUG("old");
return CreateLobby(eLobbyType, 0);
}
@ -1431,8 +1430,9 @@ void RunCallbacks()
PRINT_DEBUG("Lobby " "%" PRIu64 " use %u", l.room_id(), use);
if (use) PUSH_BACK_IF_NOT_IN(filtered_lobbies, (uint64)l.room_id());
if (filtered_lobbies.size() >= filter_max_results_copy) {
PRINT_DEBUG("returning lobby search results, count=%zu", filtered_lobbies.size());
searching = false;
LobbyMatchList_t data;
LobbyMatchList_t data{};
data.m_nLobbiesMatching = filtered_lobbies.size();
callback_results->addCallResult(search_call_api_id, data.k_iCallback, &data, sizeof(data));
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
@ -1443,7 +1443,7 @@ void RunCallbacks()
if (searching && check_timedout(lobby_last_search, LOBBY_SEARCH_TIMEOUT)) {
PRINT_DEBUG("LOBBY_SEARCH_TIMEOUT %zu", filtered_lobbies.size());
LobbyMatchList_t data;
LobbyMatchList_t data{};
data.m_nLobbiesMatching = filtered_lobbies.size();
callback_results->addCallResult(search_call_api_id, data.k_iCallback, &data, sizeof(data));
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
@ -1615,7 +1615,7 @@ void Callback(Common_Message *msg)
if (lobby->owner() == settings->get_local_steam_id().ConvertToUint64()) {
if (msg->lobby_messages().type() == Lobby_Messages::JOIN) {
PRINT_DEBUG("LOBBY MESSAGE: JOIN, lobby=%llu from=%llu", (uint64)lobby->room_id(), (uint64)msg->source_id());
if (enter_lobby(lobby, (uint64)msg->source_id())) {
if (add_member_to_lobby(lobby, (uint64)msg->source_id())) {
trigger_lobby_member_join_leave((uint64)lobby->room_id(), (uint64)msg->source_id(), false, true, 0.01);
}
}
@ -1625,7 +1625,7 @@ void Callback(Common_Message *msg)
Lobby_Member *member = get_lobby_member(lobby, (uint64)msg->source_id());
if (member) {
for (auto const &p : msg->lobby_messages().map()) {
PRINT_DEBUG("member data %s:%s", p.first.c_str(), p.second.c_str());
PRINT_DEBUG("member data '%s'='%s'", p.first.c_str(), p.second.c_str());
auto result = caseinsensitive_find(member->values(), p.first);
if (result == member->values().end()) {
(*member->mutable_values())[p.first] = p.second;
@ -1659,7 +1659,7 @@ void Callback(Common_Message *msg)
entry.message = msg->lobby_messages().bdata();
entry.lobby_id = CSteamID((uint64)msg->lobby_messages().id());
entry.user_id = CSteamID((uint64)msg->source_id());
LobbyChatMsg_t data;
LobbyChatMsg_t data{};
data.m_ulSteamIDLobby = msg->lobby_messages().id();
data.m_ulSteamIDUser = msg->source_id();
data.m_eChatEntryType = entry.type;

View File

@ -273,7 +273,10 @@ SteamAPICall_t SendQueryUGCRequest( UGCQueryHandle_t handle )
data.m_unNumResultsReturned = request->results.size();
data.m_unTotalMatchingResults = request->results.size();
data.m_bCachedData = false;
return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));
auto ret = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
return ret;
}

View File

@ -37,10 +37,11 @@ public ISteamUtils
private:
Settings *settings;
class SteamCallResults *callback_results;
class SteamCallBacks *callbacks{};
Steam_Overlay* overlay;
public:
Steam_Utils(Settings *settings, class SteamCallResults *callback_results, Steam_Overlay *overlay);
Steam_Utils(Settings *settings, class SteamCallResults *callback_results, class SteamCallBacks *callbacks, Steam_Overlay *overlay);
// return the number of seconds since the user
uint32 GetSecondsSinceAppActive();

View File

@ -80,13 +80,12 @@ Steam_Client::Steam_Client()
network = new Networking(settings_server->get_local_steam_id(), appid, settings_server->get_port(), &(settings_server->custom_broadcasts), settings_server->disable_networking);
callback_results_client = new SteamCallResults();
callback_results_server = new SteamCallResults();
callbacks_client = new SteamCallBacks(callback_results_client);
callbacks_server = new SteamCallBacks(callback_results_server);
run_every_runcb = new RunEveryRunCB();
PRINT_DEBUG("init: id: %llu server id: %llu, appid: %u, port: %u", settings_client->get_local_steam_id().ConvertToUint64(), settings_server->get_local_steam_id().ConvertToUint64(), appid, settings_server->get_port());
PRINT_DEBUG(
"init: id: %llu server id: %llu, appid: %u, port: %u",
settings_client->get_local_steam_id().ConvertToUint64(), settings_server->get_local_steam_id().ConvertToUint64(), appid, settings_server->get_port()
);
if (appid) {
auto appid_str = std::to_string(appid);
@ -95,11 +94,15 @@ Steam_Client::Steam_Client()
set_env_variable("SteamOverlayGameId", appid_str);
}
// client
PRINT_DEBUG("init client");
callback_results_client = new SteamCallResults();
callbacks_client = new SteamCallBacks(callback_results_client);
steam_overlay = new Steam_Overlay(settings_client, local_storage, callback_results_client, callbacks_client, run_every_runcb, network);
steam_user = new Steam_User(settings_client, local_storage, network, callback_results_client, callbacks_client);
steam_friends = new Steam_Friends(settings_client, local_storage, network, callback_results_client, callbacks_client, run_every_runcb, steam_overlay);
steam_utils = new Steam_Utils(settings_client, callback_results_client, steam_overlay);
steam_utils = new Steam_Utils(settings_client, callback_results_client, callbacks_client, steam_overlay);
ugc_bridge = new Ugc_Remote_Storage_Bridge(settings_client);
@ -131,9 +134,13 @@ Steam_Client::Steam_Client()
steam_remoteplay = new Steam_RemotePlay(settings_client, network, callback_results_client, callbacks_client, run_every_runcb);
steam_tv = new Steam_TV(settings_client, network, callback_results_client, callbacks_client, run_every_runcb);
// server
PRINT_DEBUG("init gameserver");
callback_results_server = new SteamCallResults();
callbacks_server = new SteamCallBacks(callback_results_server);
steam_gameserver = new Steam_GameServer(settings_server, network, callbacks_server);
steam_gameserver_utils = new Steam_Utils(settings_server, callback_results_server, steam_overlay);
steam_gameserver_utils = new Steam_Utils(settings_server, callback_results_server, callbacks_server, steam_overlay);
steam_gameserverstats = new Steam_GameServerStats(settings_server, network, callback_results_server, callbacks_server, run_every_runcb);
steam_gameserver_networking = new Steam_Networking(settings_server, network, callbacks_server, run_every_runcb);
steam_gameserver_http = new Steam_HTTP(settings_server, network, callback_results_server, callbacks_server);

View File

@ -181,6 +181,7 @@ void Steam_HTTP::online_http_request(Steam_Http_Request *request, SteamAPICall_t
}
if (pCallHandle) *pCallHandle = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data), 0.1);
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.1);
};
std::size_t filename_part = request->target_filepath.find_last_of("\\/");
@ -356,6 +357,7 @@ bool Steam_HTTP::SendHTTPRequest( HTTPRequestHandle hRequest, SteamAPICall_t *pC
}
if (pCallHandle) *pCallHandle = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data), 0.1);
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.1);
}
return true;
@ -367,7 +369,12 @@ bool Steam_HTTP::SendHTTPRequest( HTTPRequestHandle hRequest, SteamAPICall_t *pC
// HTTPRequestDataReceived_t callbacks while streaming.
bool Steam_HTTP::SendHTTPRequestAndStreamResponse( HTTPRequestHandle hRequest, SteamAPICall_t *pCallHandle )
{
PRINT_DEBUG_ENTRY();
// TODO this function triggers 3 callbacks:
// https://partner.steamgames.com/doc/api/ISteamHTTP#SendHTTPRequestAndStreamResponse
// Triggers a HTTPRequestDataReceived_t callback.
// Triggers a HTTPRequestHeadersReceived_t callback.
// Triggers a HTTPRequestCompleted_t callback.
PRINT_DEBUG_TODO();
std::lock_guard<std::recursive_mutex> lock(global_mutex);
return SendHTTPRequest(hRequest, pCallHandle);

View File

@ -1638,7 +1638,7 @@ SteamAPICall_t Steam_User_Stats::UploadLeaderboardScore( SteamLeaderboard_t hSte
STEAM_CALL_RESULT( LeaderboardUGCSet_t )
SteamAPICall_t Steam_User_Stats::AttachLeaderboardUGC( SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC )
{
PRINT_DEBUG_ENTRY();
PRINT_DEBUG_TODO();
std::lock_guard<std::recursive_mutex> lock(global_mutex);
LeaderboardUGCSet_t data{};
if (hSteamLeaderboard > cached_leaderboards.size() || hSteamLeaderboard <= 0) {

View File

@ -19,9 +19,10 @@
#include "dll/steam_utils.h"
Steam_Utils::Steam_Utils(Settings *settings, class SteamCallResults *callback_results, Steam_Overlay *overlay):
Steam_Utils::Steam_Utils(Settings *settings, class SteamCallResults *callback_results, class SteamCallBacks *callbacks, Steam_Overlay *overlay):
settings(settings),
callback_results(callback_results),
callbacks(callbacks),
overlay(overlay)
{
@ -258,7 +259,10 @@ SteamAPICall_t Steam_Utils::CheckFileSignature( const char *szFileName )
std::lock_guard<std::recursive_mutex> lock(global_mutex);
CheckFileSignature_t data;
data.m_eCheckFileSignature = k_ECheckFileSignatureValidSignature;
return callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));
auto ret = callback_results->addCallResult(data.k_iCallback, &data, sizeof(data));
// TODO callback too?
// callbacks->addCBResult(data.k_iCallback, &data, sizeof(data));
return ret;
}