From f315bec9610cd227bb9022a1a5c726e746db4820 Mon Sep 17 00:00:00 2001 From: otavepto Date: Thu, 11 Apr 2024 14:08:04 +0200 Subject: [PATCH] more callbacks --- dll/base.cpp | 4 ++ dll/dll/steam_HTMLsurface.h | 6 +- dll/dll/steam_friends.h | 14 ++++- dll/dll/steam_inventory.h | 7 ++- dll/dll/steam_matchmaking.h | 122 ++++++++++++++++++------------------ dll/dll/steam_ugc.h | 5 +- dll/dll/steam_utils.h | 3 +- dll/steam_client.cpp | 21 ++++--- dll/steam_http.cpp | 9 ++- dll/steam_user_stats.cpp | 2 +- dll/steam_utils.cpp | 8 ++- 11 files changed, 121 insertions(+), 80 deletions(-) diff --git a/dll/base.cpp b/dll/base.cpp index 128be253..a3cf3645 100644 --- a/dll/base.cpp +++ b/dll/base.cpp @@ -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; diff --git a/dll/dll/steam_HTMLsurface.h b/dll/dll/steam_HTMLsurface.h index 59860c5d..1aea6483 100644 --- a/dll/dll/steam_HTMLsurface.h +++ b/dll/dll/steam_HTMLsurface.h @@ -74,8 +74,10 @@ SteamAPICall_t CreateBrowser( const char *pchUserAgent, const char *pchUserCSS ) std::lock_guard 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; } diff --git a/dll/dll/steam_friends.h b/dll/dll/steam_friends.h index 0c551e85..a0e21c3e 100644 --- a/dll/dll/steam_friends.h +++ b/dll/dll/steam_friends.h @@ -249,13 +249,23 @@ SteamAPICall_t SetPersonaName( const char *pchPersonaName ) { PRINT_DEBUG_ENTRY(); std::lock_guard 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 ) diff --git a/dll/dll/steam_inventory.h b/dll/dll/steam_inventory.h index cbd1521b..e16a42dd 100644 --- a/dll/dll/steam_inventory.h +++ b/dll/dll/steam_inventory.h @@ -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; } diff --git a/dll/dll/steam_matchmaking.h b/dll/dll/steam_matchmaking.h index 3a7e0034..8405a952 100644 --- a/dll/dll/steam_matchmaking.h +++ b/dll/dll/steam_matchmaking.h @@ -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 lobbies; - std::chrono::high_resolution_clock::time_point last_sent_lobbies; - std::vector pending_joins; - std::vector pending_creates; + std::vector lobbies{}; + std::chrono::high_resolution_clock::time_point last_sent_lobbies{}; + std::vector pending_joins{}; + std::vector pending_creates{}; - std::vector filter_values; - int filter_max_results; - std::vector filter_values_copy; - int filter_max_results_copy; - std::vector filtered_lobbies; - std::chrono::high_resolution_clock::time_point lobby_last_search; - SteamAPICall_t search_call_api_id; - bool searching; + std::vector filter_values{}; + int filter_max_results{}; + std::vector filter_values_copy{}; + int filter_max_results_copy{}; + std::vector filtered_lobbies{}; + std::chrono::high_resolution_clock::time_point lobby_last_search{}; + SteamAPICall_t search_call_api_id{}; + bool searching{}; - std::vector chat_entries; - std::vector data_requested; + std::vector chat_entries{}; + std::vector data_requested{}; + + std::map> self_lobby_member_data{}; - std::map> self_lobby_member_data; google::protobuf::Map::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 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; diff --git a/dll/dll/steam_ugc.h b/dll/dll/steam_ugc.h index c981643e..ec407df3 100644 --- a/dll/dll/steam_ugc.h +++ b/dll/dll/steam_ugc.h @@ -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; } diff --git a/dll/dll/steam_utils.h b/dll/dll/steam_utils.h index e97f99d0..0b305cf2 100644 --- a/dll/dll/steam_utils.h +++ b/dll/dll/steam_utils.h @@ -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(); diff --git a/dll/steam_client.cpp b/dll/steam_client.cpp index 353bfdd7..dc382cce 100644 --- a/dll/steam_client.cpp +++ b/dll/steam_client.cpp @@ -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); diff --git a/dll/steam_http.cpp b/dll/steam_http.cpp index 6b1ffed1..349d12ed 100644 --- a/dll/steam_http.cpp +++ b/dll/steam_http.cpp @@ -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 lock(global_mutex); return SendHTTPRequest(hRequest, pCallHandle); diff --git a/dll/steam_user_stats.cpp b/dll/steam_user_stats.cpp index 8e443169..596afc84 100644 --- a/dll/steam_user_stats.cpp +++ b/dll/steam_user_stats.cpp @@ -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 lock(global_mutex); LeaderboardUGCSet_t data{}; if (hSteamLeaderboard > cached_leaderboards.size() || hSteamLeaderboard <= 0) { diff --git a/dll/steam_utils.cpp b/dll/steam_utils.cpp index 262ada84..d6bc816d 100644 --- a/dll/steam_utils.cpp +++ b/dll/steam_utils.cpp @@ -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 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; }