From fed72dcf907801b4efe885a1bfb9c8cb33534399 Mon Sep 17 00:00:00 2001 From: zeph Date: Mon, 8 Dec 2025 13:57:07 +0100 Subject: [PATCH] Clans: implemented IDM & ctx for requests Signed-off-by: zeph --- rpcs3/Emu/Cell/Modules/sceNpClans.cpp | 147 +++++++++++++++------- rpcs3/Emu/NP/clans_client.cpp | 172 ++++++++++++++++---------- rpcs3/Emu/NP/clans_client.h | 56 ++++----- 3 files changed, 233 insertions(+), 142 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNpClans.cpp b/rpcs3/Emu/Cell/Modules/sceNpClans.cpp index cd42fddecd..1d0d6e84a4 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpClans.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpClans.cpp @@ -138,16 +138,15 @@ error_code sceNpClansCreateRequest(vm::ptr handle, u64 } auto& clans_manager = g_fxo->get(); - SceNpClansError res = clans_manager.client->createRequest(); + + s32 reqId = 0; + SceNpClansError res = clans_manager.client->createRequest(&reqId); if (res != SCE_NP_CLANS_SUCCESS) { return res; } - // TODO: replace this mock request with an actual - // generator that yields an actual request. - vm::var req; - vm::write32(handle.addr(), req.addr()); + vm::write32(handle.addr(), static_cast(reqId)); return CELL_OK; } @@ -160,7 +159,10 @@ error_code sceNpClansDestroyRequest(vm::ptr handle) } auto& clans_manager = g_fxo->get(); - SceNpClansError res = clans_manager.client->destroyRequest(); + + s32 reqId = static_cast(handle.addr()); + + SceNpClansError res = clans_manager.client->destroyRequest(reqId); if (res != SCE_NP_CLANS_SUCCESS) { return res; @@ -177,7 +179,10 @@ error_code sceNpClansAbortRequest(vm::ptr handle) } auto& clans_manager = g_fxo->get(); - clans_manager.client->destroyRequest(); + + s32 reqId = static_cast(handle.addr()); + + clans_manager.client->destroyRequest(reqId); return CELL_OK; } @@ -259,7 +264,9 @@ error_code sceNpClansGetClanList(vm::ptr handle, vm::cp SceNpClansEntry host_clanList[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->getClanList(nph, &host_paging, host_clanList, &host_pageResult); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->getClanList(nph, reqId, &host_paging, host_clanList, &host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -365,7 +372,9 @@ error_code sceNpClansSearchByName(vm::ptr handle, vm::c SceNpClansClanBasicInfo host_results[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->clanSearch(&host_paging, &host_search, host_results, &host_pageResult); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->clanSearch(reqId, &host_paging, &host_search, host_results, &host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -397,7 +406,9 @@ error_code sceNpClansGetClanInfo(vm::ptr handle, SceNpC SceNpClansClanInfo host_info = {}; - SceNpClansError ret = clans_manager.client->getClanInfo(clanId, &host_info); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->getClanInfo(reqId, clanId, &host_info); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -427,7 +438,9 @@ error_code sceNpClansUpdateClanInfo(vm::ptr handle, Sce SceNpClansUpdatableClanInfo host_info = {}; std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableClanInfo)); - SceNpClansError ret = clans_manager.client->updateClanInfo(nph, clanId, &host_info); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->updateClanInfo(nph, reqId, clanId, &host_info); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -473,7 +486,9 @@ error_code sceNpClansGetMemberList(vm::ptr handle, SceN SceNpClansMemberEntry* host_memList_addr = new SceNpClansMemberEntry[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX]; SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->getMemberList(nph, clanId, &host_paging, status, host_memList_addr, &host_pageResult); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->getMemberList(nph, reqId, clanId, &host_paging, status, host_memList_addr, &host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { delete[] host_memList_addr; @@ -510,7 +525,9 @@ error_code sceNpClansGetMemberInfo(vm::ptr handle, SceN SceNpClansMemberEntry host_memInfo = {}; - SceNpClansError ret = clans_manager.client->getMemberInfo(nph, clanId, host_npid, &host_memInfo); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->getMemberInfo(nph, reqId, clanId, host_npid, &host_memInfo); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -539,7 +556,9 @@ error_code sceNpClansUpdateMemberInfo(vm::ptr handle, S SceNpClansUpdatableMemberInfo host_info = {}; std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableMemberInfo)); - SceNpClansError ret = clans_manager.client->updateMemberInfo(nph, clanId, &host_info); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->updateMemberInfo(nph, reqId, clanId, &host_info); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -566,7 +585,9 @@ error_code sceNpClansChangeMemberRole(vm::ptr handle, S SceNpId host_npid = {}; std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); - SceNpClansError ret = clans_manager.client->changeMemberRole(nph, clanId, host_npid, role); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->changeMemberRole(nph, reqId, clanId, host_npid, static_cast(role)); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -616,7 +637,9 @@ error_code sceNpClansJoinClan(vm::ptr handle, SceNpClan auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansError ret = clans_manager.client->joinClan(nph, clanId); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->joinClan(nph, reqId, clanId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -635,7 +658,9 @@ error_code sceNpClansLeaveClan(vm::ptr handle, SceNpCla auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansError ret = clans_manager.client->leaveClan(nph, clanId); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->leaveClan(nph, reqId, clanId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -676,7 +701,9 @@ error_code sceNpClansKickMember(vm::ptr handle, SceNpCl std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); } - SceNpClansError ret = clans_manager.client->kickMember(nph, clanId, host_npid, &host_message); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->kickMember(nph, reqId, clanId, host_npid, &host_message); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -717,7 +744,9 @@ error_code sceNpClansSendInvitation(vm::ptr handle, Sce std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); } - SceNpClansError ret = clans_manager.client->sendInvitation(nph, clanId, host_npid, &host_message); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->sendInvitation(nph, reqId, clanId, host_npid, &host_message); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -744,7 +773,9 @@ error_code sceNpClansCancelInvitation(vm::ptr handle, S SceNpId host_npid = {}; std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); - SceNpClansError ret = clans_manager.client->cancelInvitation(nph, clanId, host_npid); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->cancelInvitation(nph, reqId, clanId, host_npid); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -777,7 +808,14 @@ error_code sceNpClansSendInvitationResponse(vm::ptr han std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); } - SceNpClansError ret = clans_manager.client->sendInvitationResponse(nph, clanId, &host_message, accept); + if (message) + { + std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); + } + + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->sendInvitationResponse(nph, reqId, clanId, &host_message, accept); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -810,7 +848,9 @@ error_code sceNpClansSendMembershipRequest(vm::ptr hand std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); } - SceNpClansError ret = clans_manager.client->requestMembership(nph, clanId, &host_message); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->requestMembership(nph, reqId, clanId, &host_message); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -829,7 +869,9 @@ error_code sceNpClansCancelMembershipRequest(vm::ptr ha auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpClansError ret = clans_manager.client->cancelRequestMembership(nph, clanId); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->cancelRequestMembership(nph, reqId, clanId); if (ret != SCE_NP_CLANS_SUCCESS) { @@ -871,7 +913,9 @@ error_code sceNpClansSendMembershipResponse(vm::ptr han std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); } - SceNpClansError ret = clans_manager.client->sendMembershipResponse(nph, clanId, host_npid, &host_message, allow); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->sendMembershipResponse(nph, reqId, clanId, host_npid, &host_message, allow); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -914,10 +958,12 @@ error_code sceNpClansGetBlacklist(vm::ptr handle, SceNp host_paging.max = 0; } - SceNpClansBlacklistEntry host_bl[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; + SceNpClansBlacklistEntry host_blacklist[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->getBlacklist(nph, clanId, &host_paging, host_bl, &host_pageResult); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->getBlacklist(nph, reqId, clanId, &host_paging, host_blacklist, &host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -925,21 +971,21 @@ error_code sceNpClansGetBlacklist(vm::ptr handle, SceNp if (bl && host_pageResult.count > 0) { - std::memcpy(bl.get_ptr(), host_bl, sizeof(SceNpClansBlacklistEntry) * host_pageResult.count); + std::memcpy(bl.get_ptr(), host_blacklist, sizeof(SceNpClansBlacklistEntry) * host_pageResult.count); } std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); return CELL_OK; } -error_code sceNpClansAddBlacklistEntry(vm::ptr handle, SceNpClanId clanId, vm::cptr npid) +error_code sceNpClansAddBlacklistEntry(vm::ptr handle, SceNpClanId clanId, vm::cptr member) { if (!g_fxo->get().is_initialized) { return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; } - if (!npid) + if (!member) { return SCE_NP_CLANS_ERROR_INVALID_ARGUMENT; } @@ -947,10 +993,12 @@ error_code sceNpClansAddBlacklistEntry(vm::ptr handle, auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + SceNpId host_member = {}; + std::memcpy(&host_member, member.get_ptr(), sizeof(SceNpId)); - SceNpClansError ret = clans_manager.client->addBlacklistEntry(nph, clanId, host_npid); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->addBlacklistEntry(nph, reqId, clanId, host_member); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -959,14 +1007,14 @@ error_code sceNpClansAddBlacklistEntry(vm::ptr handle, return CELL_OK; } -error_code sceNpClansRemoveBlacklistEntry(vm::ptr handle, SceNpClanId clanId, vm::cptr npid) +error_code sceNpClansRemoveBlacklistEntry(vm::ptr handle, SceNpClanId clanId, vm::cptr member) { if (!g_fxo->get().is_initialized) { return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; } - if (!npid) + if (!member) { return SCE_NP_CLANS_ERROR_INVALID_ARGUMENT; } @@ -974,10 +1022,12 @@ error_code sceNpClansRemoveBlacklistEntry(vm::ptr handl auto& nph = g_fxo->get>(); auto& clans_manager = g_fxo->get(); - SceNpId host_npid = {}; - std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); + SceNpId host_member = {}; + std::memcpy(&host_member, member.get_ptr(), sizeof(SceNpId)); - SceNpClansError ret = clans_manager.client->removeBlacklistEntry(nph, clanId, host_npid); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->removeBlacklistEntry(nph, reqId, clanId, host_member); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -1020,10 +1070,12 @@ error_code sceNpClansRetrieveAnnouncements(vm::ptr hand host_paging.max = 0; } - SceNpClansMessageEntry host_mlist[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; + SceNpClansMessageEntry host_announcements[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansPagingResult host_pageResult = {}; - SceNpClansError ret = clans_manager.client->retrieveAnnouncements(nph, clanId, &host_paging, host_mlist, &host_pageResult); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->retrieveAnnouncements(nph, reqId, clanId, &host_paging, host_announcements, &host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; @@ -1031,7 +1083,7 @@ error_code sceNpClansRetrieveAnnouncements(vm::ptr hand if (mlist && host_pageResult.count > 0) { - std::memcpy(mlist.get_ptr(), host_mlist, sizeof(SceNpClansMessageEntry) * host_pageResult.count); + std::memcpy(mlist.get_ptr(), host_announcements, sizeof(SceNpClansMessageEntry) * host_pageResult.count); } std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); @@ -1058,8 +1110,8 @@ error_code sceNpClansPostAnnouncement(vm::ptr handle, S auto& clans_manager = g_fxo->get(); auto& nph = g_fxo->get>(); - SceNpClansMessage host_message = {}; - std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); + SceNpClansMessage host_announcement = {}; + std::memcpy(&host_announcement, message.get_ptr(), sizeof(SceNpClansMessage)); SceNpClansMessageData host_data = {}; if (data) @@ -1067,15 +1119,16 @@ error_code sceNpClansPostAnnouncement(vm::ptr handle, S std::memcpy(&host_data, data.get_ptr(), sizeof(SceNpClansMessageData)); } - SceNpClansMessageId host_mId = 0; + s32 reqId = static_cast(handle.addr()); - SceNpClansError ret = clans_manager.client->postAnnouncement(nph, clanId, &host_message, &host_data, duration, &host_mId); + SceNpClansMessageId host_announcementId = 0; + SceNpClansError ret = clans_manager.client->postAnnouncement(nph, reqId, clanId, &host_announcement, &host_data, duration, &host_announcementId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; } - *mId = host_mId; + *mId = host_announcementId; return CELL_OK; } @@ -1090,7 +1143,9 @@ error_code sceNpClansRemoveAnnouncement(vm::ptr handle, auto& clans_manager = g_fxo->get(); auto& nph = g_fxo->get>(); - SceNpClansError ret = clans_manager.client->deleteAnnouncement(nph, clanId, mId); + s32 reqId = static_cast(handle.addr()); + + SceNpClansError ret = clans_manager.client->deleteAnnouncement(nph, reqId, clanId, mId); if (ret != SCE_NP_CLANS_SUCCESS) { return ret; diff --git a/rpcs3/Emu/NP/clans_client.cpp b/rpcs3/Emu/NP/clans_client.cpp index c4a3099964..c308483ac5 100644 --- a/rpcs3/Emu/NP/clans_client.cpp +++ b/rpcs3/Emu/NP/clans_client.cpp @@ -1,3 +1,4 @@ +#include "Emu/Cell/Modules/sceNpClans.h" #include "stdafx.h" #include @@ -129,50 +130,85 @@ namespace clan return realsize; } + struct clan_request_ctx + { + clan_request_ctx() + { + curl = curl_easy_init(); + if (curl) + { + curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); + } + } + + ~clan_request_ctx() + { + if (curl) + { + curl_easy_cleanup(curl); + curl = nullptr; + } + } + + CURL* curl = nullptr; + + // TODO: this was arbitrarily chosen -- see if there's a real amount + static const u32 SCE_NP_CLANS_MAX_CTX_NUM = 16; + + static const u32 id_base = 0xA001; + static const u32 id_step = 1; + static const u32 id_count = SCE_NP_CLANS_MAX_CTX_NUM; + SAVESTATE_INIT_POS(55); + }; + clans_client::clans_client() { g_cfg_clans.load(); - - createRequest(); } clans_client::~clans_client() { - destroyRequest(); + idm::clear(); } - SceNpClansError clans_client::createRequest() + SceNpClansError clans_client::createRequest(s32* reqId) { - if (curl) - return SceNpClansError::SCE_NP_CLANS_SUCCESS; + const s32 id = idm::make(); - curl = curl_easy_init(); - if (!curl) + if (id == id_manager::id_traits::invalid) { + return SceNpClansError::SCE_NP_CLANS_ERROR_EXCEEDS_MAX; + } + + auto ctx = idm::get_unlocked(id); + if (!ctx || !ctx->curl) + { + idm::remove(id); return SceNpClansError::SCE_NP_CLANS_ERROR_NOT_INITIALIZED; } - curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); + *reqId = id; return SceNpClansError::SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::destroyRequest() + SceNpClansError clans_client::destroyRequest(s32 reqId) { - if (curl) - { - curl_easy_cleanup(curl); - curl = nullptr; - } + if (idm::remove(reqId)) + return SceNpClansError::SCE_NP_CLANS_SUCCESS; - return SceNpClansError::SCE_NP_CLANS_SUCCESS; + return SceNpClansError::SCE_NP_CLANS_ERROR_INVALID_ARGUMENT; } - SceNpClansError clans_client::sendRequest(ClanRequestAction action, ClanManagerOperationType opType, pugi::xml_document* xmlBody, pugi::xml_document* outResponse) + SceNpClansError clans_client::sendRequest(s32 reqId, ClanRequestAction action, ClanManagerOperationType opType, pugi::xml_document* xmlBody, pugi::xml_document* outResponse) { - if (!curl) + auto ctx = idm::get_unlocked(reqId); + + if (!ctx || !ctx->curl) return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + CURL* curl = ctx->curl; + ClanRequestType reqType = ClanRequestType::FUNC; pugi::xml_node clan = xmlBody->child("clan"); if (clan && clan.child("ticket")) @@ -203,7 +239,7 @@ namespace clan curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xml.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, xml.size()); - res = curl_easy_perform(curl); + CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { @@ -215,10 +251,10 @@ namespace clan response_buffer.push_back('\0'); - pugi::xml_parse_result res = outResponse->load_string(response_buffer.data()); - if (!res) + pugi::xml_parse_result xml_res = outResponse->load_string(response_buffer.data()); + if (!xml_res) { - clan_log.error("XML parsing failed: %s", res.description()); + clan_log.error("XML parsing failed: %s", xml_res.description()); return SCE_NP_CLANS_ERROR_BAD_RESPONSE; } @@ -288,7 +324,7 @@ namespace clan } #pragma region Outgoing API Requests - SceNpClansError clans_client::getClanList(np::np_handler& nph, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult) + SceNpClansError clans_client::getClanList(np::np_handler& nph, s32 reqId, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult) { pugi::xml_document doc = pugi::xml_document(); pugi::xml_node clan = doc.append_child("clan"); @@ -299,7 +335,7 @@ namespace clan clan.append_child("max").text().set(paging->max); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::GetClanList, ClanManagerOperationType::VIEW, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetClanList, ClanManagerOperationType::VIEW, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -362,14 +398,14 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::getClanInfo(SceNpClanId clanId, SceNpClansClanInfo* clanInfo) + SceNpClansError clans_client::getClanInfo(s32 reqId, SceNpClanId clanId, SceNpClansClanInfo* clanInfo) { pugi::xml_document doc = pugi::xml_document(); pugi::xml_node clan = doc.append_child("clan"); clan.append_child("id").text().set(clanId); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::GetClanInfo, ClanManagerOperationType::VIEW, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetClanInfo, ClanManagerOperationType::VIEW, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -401,7 +437,7 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::getMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo) + SceNpClansError clans_client::getMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo) { std::string ticket = getClanTicket(nph); @@ -414,7 +450,7 @@ namespace clan clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::GetMemberInfo, ClanManagerOperationType::VIEW, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetMemberInfo, ClanManagerOperationType::VIEW, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -469,7 +505,7 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::getMemberList(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus /*status*/, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult) + SceNpClansError clans_client::getMemberList(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus /*status*/, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult) { std::string ticket = getClanTicket(nph); @@ -481,7 +517,7 @@ namespace clan clan.append_child("max").text().set(paging->max); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::GetMemberList, ClanManagerOperationType::VIEW, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetMemberList, ClanManagerOperationType::VIEW, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -545,7 +581,7 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::getBlacklist(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult) + SceNpClansError clans_client::getBlacklist(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult) { std::string ticket = getClanTicket(nph); @@ -557,7 +593,7 @@ namespace clan clan.append_child("max").text().set(paging->max); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::GetBlacklist, ClanManagerOperationType::VIEW, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetBlacklist, ClanManagerOperationType::VIEW, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -609,7 +645,7 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::addBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId) + SceNpClansError clans_client::addBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId) { std::string ticket = getClanTicket(nph); @@ -622,10 +658,10 @@ namespace clan clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::RecordBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::RecordBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::removeBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId) + SceNpClansError clans_client::removeBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId) { std::string ticket = getClanTicket(nph); @@ -638,10 +674,10 @@ namespace clan clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::DeleteBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::DeleteBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::clanSearch(SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult) + SceNpClansError clans_client::clanSearch(s32 reqId, SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult) { pugi::xml_document doc = pugi::xml_document(); pugi::xml_node clan = doc.append_child("clan"); @@ -656,7 +692,7 @@ namespace clan name.append_attribute("value").set_value(search->name); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::ClanSearch, ClanManagerOperationType::VIEW, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::ClanSearch, ClanManagerOperationType::VIEW, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -703,7 +739,7 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::requestMembership(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* /*message*/) + SceNpClansError clans_client::requestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* /*message*/) { std::string ticket = getClanTicket(nph); @@ -713,10 +749,10 @@ namespace clan clan.append_child("id").text().set(clanId); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::RequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::RequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::cancelRequestMembership(np::np_handler& nph, SceNpClanId clanId) + SceNpClansError clans_client::cancelRequestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId) { std::string ticket = getClanTicket(nph); @@ -726,10 +762,10 @@ namespace clan clan.append_child("id").text().set(clanId); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::CancelRequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::CancelRequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::sendMembershipResponse(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/, b8 allow) + SceNpClansError clans_client::sendMembershipResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/, b8 allow) { std::string ticket = getClanTicket(nph); @@ -742,10 +778,10 @@ namespace clan clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return sendRequest(allow ? ClanRequestAction::AcceptMembershipRequest : ClanRequestAction::DeclineMembershipRequest, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, allow ? ClanRequestAction::AcceptMembershipRequest : ClanRequestAction::DeclineMembershipRequest, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::sendInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/) + SceNpClansError clans_client::sendInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/) { std::string ticket = getClanTicket(nph); @@ -758,10 +794,10 @@ namespace clan clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::SendInvitation, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::SendInvitation, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::cancelInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId) + SceNpClansError clans_client::cancelInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId) { std::string ticket = getClanTicket(nph); @@ -774,10 +810,10 @@ namespace clan clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::CancelInvitation, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::CancelInvitation, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::sendInvitationResponse(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* /*message*/, b8 accept) + SceNpClansError clans_client::sendInvitationResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* /*message*/, b8 accept) { std::string ticket = getClanTicket(nph); @@ -787,10 +823,10 @@ namespace clan clan.append_child("id").text().set(clanId); pugi::xml_document response = pugi::xml_document(); - return sendRequest(accept ? ClanRequestAction::AcceptInvitation : ClanRequestAction::DeclineInvitation, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, accept ? ClanRequestAction::AcceptInvitation : ClanRequestAction::DeclineInvitation, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::updateMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info) + SceNpClansError clans_client::updateMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info) { std::string ticket = getClanTicket(nph); @@ -824,10 +860,10 @@ namespace clan size.text().set(info->binData1Size); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::UpdateMemberInfo, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::UpdateMemberInfo, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::updateClanInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info) + SceNpClansError clans_client::updateClanInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info) { std::string ticket = getClanTicket(nph); @@ -842,10 +878,10 @@ namespace clan description.text().set(info->description); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::UpdateClanInfo, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::UpdateClanInfo, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::joinClan(np::np_handler& nph, SceNpClanId clanId) + SceNpClansError clans_client::joinClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId) { std::string ticket = getClanTicket(nph); @@ -855,10 +891,10 @@ namespace clan clan.append_child("id").text().set(clanId); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::JoinClan, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::JoinClan, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::leaveClan(np::np_handler& nph, SceNpClanId clanId) + SceNpClansError clans_client::leaveClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId) { std::string ticket = getClanTicket(nph); @@ -868,10 +904,10 @@ namespace clan clan.append_child("id").text().set(clanId); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::LeaveClan, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::LeaveClan, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::kickMember(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/) + SceNpClansError clans_client::kickMember(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/) { std::string ticket = getClanTicket(nph); @@ -884,10 +920,10 @@ namespace clan clan.append_child("jid").text().set(jid_str.c_str()); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::KickMember, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::KickMember, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::changeMemberRole(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role) + SceNpClansError clans_client::changeMemberRole(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role) { std::string ticket = getClanTicket(nph); @@ -903,10 +939,10 @@ namespace clan roleNode.text().set(static_cast(role)); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::ChangeMemberRole, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::ChangeMemberRole, ClanManagerOperationType::UPDATE, &doc, &response); } - SceNpClansError clans_client::retrieveAnnouncements(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult) + SceNpClansError clans_client::retrieveAnnouncements(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult) { std::string ticket = getClanTicket(nph); @@ -918,7 +954,7 @@ namespace clan clan.append_child("max").text().set(paging->max); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::RetrieveAnnouncements, ClanManagerOperationType::VIEW, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::RetrieveAnnouncements, ClanManagerOperationType::VIEW, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -987,7 +1023,7 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::postAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* /*data*/, u32 duration, SceNpClansMessageId* msgId) + SceNpClansError clans_client::postAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* /*data*/, u32 duration, SceNpClansMessageId* msgId) { std::string ticket = getClanTicket(nph); @@ -1006,7 +1042,7 @@ namespace clan expireDate.text().set(duration); pugi::xml_document response = pugi::xml_document(); - SceNpClansError clanRes = sendRequest(ClanRequestAction::PostAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); + SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::PostAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); if (clanRes != SCE_NP_CLANS_SUCCESS) return clanRes; @@ -1018,7 +1054,7 @@ namespace clan return SCE_NP_CLANS_SUCCESS; } - SceNpClansError clans_client::deleteAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessageId announcementId) + SceNpClansError clans_client::deleteAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessageId announcementId) { std::string ticket = getClanTicket(nph); @@ -1029,7 +1065,7 @@ namespace clan clan.append_child("msg-id").text().set(announcementId); pugi::xml_document response = pugi::xml_document(); - return sendRequest(ClanRequestAction::DeleteAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); + return sendRequest(reqId, ClanRequestAction::DeleteAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); } } #pragma endregion diff --git a/rpcs3/Emu/NP/clans_client.h b/rpcs3/Emu/NP/clans_client.h index 1d4b8b06c0..b05ab8efae 100644 --- a/rpcs3/Emu/NP/clans_client.h +++ b/rpcs3/Emu/NP/clans_client.h @@ -3,6 +3,7 @@ #include <3rdparty/curl/curl/include/curl/curl.h> #include #include +#include #include namespace clan @@ -62,11 +63,10 @@ namespace clan class clans_client { private: - CURL* curl = nullptr; - CURLcode res = CURLE_OK; + static size_t curlWriteCallback(void* data, size_t size, size_t nmemb, void* clientp); - SceNpClansError sendRequest(ClanRequestAction action, ClanManagerOperationType type, pugi::xml_document* xmlBody, pugi::xml_document* outResponse); + SceNpClansError sendRequest(s32 reqId, ClanRequestAction action, ClanManagerOperationType type, pugi::xml_document* xmlBody, pugi::xml_document* outResponse); /// @brief Forge and get a V2.1 Ticket for clan operations std::string getClanTicket(np::np_handler& nph); @@ -75,41 +75,41 @@ namespace clan clans_client(); ~clans_client(); - SceNpClansError createRequest(); - SceNpClansError destroyRequest(); + SceNpClansError createRequest(s32* reqId); + SceNpClansError destroyRequest(s32 reqId); - SceNpClansError clanSearch(SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult); + SceNpClansError clanSearch(s32 reqId, SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult); - SceNpClansError getClanList(np::np_handler& nph, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult); - SceNpClansError getClanInfo(SceNpClanId clanId, SceNpClansClanInfo* clanInfo); + SceNpClansError getClanList(np::np_handler& nph, s32 reqId, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult); + SceNpClansError getClanInfo(s32 reqId, SceNpClanId clanId, SceNpClansClanInfo* clanInfo); - SceNpClansError getMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo); - SceNpClansError getMemberList(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus status, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult); + SceNpClansError getMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo); + SceNpClansError getMemberList(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus status, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult); - SceNpClansError getBlacklist(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult); - SceNpClansError addBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId); - SceNpClansError removeBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId); + SceNpClansError getBlacklist(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult); + SceNpClansError addBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId); + SceNpClansError removeBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId); - SceNpClansError requestMembership(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* message); - SceNpClansError cancelRequestMembership(np::np_handler& nph, SceNpClanId clanId); - SceNpClansError sendMembershipResponse(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message, b8 allow); + SceNpClansError requestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* message); + SceNpClansError cancelRequestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId); + SceNpClansError sendMembershipResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message, b8 allow); - SceNpClansError sendInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message); - SceNpClansError cancelInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId); - SceNpClansError sendInvitationResponse(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* message, b8 accept); + SceNpClansError sendInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message); + SceNpClansError cancelInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId); + SceNpClansError sendInvitationResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* message, b8 accept); - SceNpClansError joinClan(np::np_handler& nph, SceNpClanId clanId); - SceNpClansError leaveClan(np::np_handler& nph, SceNpClanId clanId); + SceNpClansError joinClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId); + SceNpClansError leaveClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId); - SceNpClansError updateMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info); - SceNpClansError updateClanInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info); + SceNpClansError updateMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info); + SceNpClansError updateClanInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info); - SceNpClansError kickMember(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message); - SceNpClansError changeMemberRole(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role); + SceNpClansError kickMember(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message); + SceNpClansError changeMemberRole(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role); - SceNpClansError retrieveAnnouncements(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult); - SceNpClansError postAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* data, u32 duration, SceNpClansMessageId* announcementId); - SceNpClansError deleteAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessageId announcementId); + SceNpClansError retrieveAnnouncements(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult); + SceNpClansError postAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* data, u32 duration, SceNpClansMessageId* announcementId); + SceNpClansError deleteAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessageId announcementId); }; } // namespace clan