Clans: implemented IDM & ctx for requests

Signed-off-by: zeph <zephyrzefa15@gmail.com>
This commit is contained in:
zeph 2025-12-08 13:57:07 +01:00
parent 7378657c4b
commit fed72dcf90
No known key found for this signature in database
3 changed files with 233 additions and 142 deletions

View File

@ -138,16 +138,15 @@ error_code sceNpClansCreateRequest(vm::ptr<SceNpClansRequestHandle> handle, u64
}
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
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<struct SceNpClansRequest> req;
vm::write32(handle.addr(), req.addr());
vm::write32(handle.addr(), static_cast<u32>(reqId));
return CELL_OK;
}
@ -160,7 +159,10 @@ error_code sceNpClansDestroyRequest(vm::ptr<SceNpClansRequestHandle> handle)
}
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError res = clans_manager.client->destroyRequest();
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> handle)
}
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
clans_manager.client->destroyRequest();
s32 reqId = static_cast<s32>(handle.addr());
clans_manager.client->destroyRequest(reqId);
return CELL_OK;
}
@ -259,7 +264,9 @@ error_code sceNpClansGetClanList(vm::ptr<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> handle, SceNpC
SceNpClansClanInfo host_info = {};
SceNpClansError ret = clans_manager.client->getClanInfo(clanId, &host_info);
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> handle, SceN
SceNpClansMemberEntry host_memInfo = {};
SceNpClansError ret = clans_manager.client->getMemberInfo(nph, clanId, host_npid, &host_memInfo);
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->changeMemberRole(nph, reqId, clanId, host_npid, static_cast<SceNpClansMemberRole>(role));
if (ret != SCE_NP_CLANS_SUCCESS)
{
return ret;
@ -616,7 +637,9 @@ error_code sceNpClansJoinClan(vm::ptr<SceNpClansRequestHandle> handle, SceNpClan
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError ret = clans_manager.client->joinClan(nph, clanId);
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> handle, SceNpCla
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError ret = clans_manager.client->leaveClan(nph, clanId);
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> hand
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage));
}
SceNpClansError ret = clans_manager.client->requestMembership(nph, clanId, &host_message);
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> ha
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError ret = clans_manager.client->cancelRequestMembership(nph, clanId);
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> npid)
error_code sceNpClansAddBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> member)
{
if (!g_fxo->get<sce_np_clans_manager>().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<SceNpClansRequestHandle> handle,
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
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<s32>(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<SceNpClansRequestHandle> handle,
return CELL_OK;
}
error_code sceNpClansRemoveBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> npid)
error_code sceNpClansRemoveBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> member)
{
if (!g_fxo->get<sce_np_clans_manager>().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<SceNpClansRequestHandle> handl
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
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<s32>(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<SceNpClansRequestHandle> 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<s32>(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<SceNpClansRequestHandle> 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<SceNpClansRequestHandle> handle, S
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
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<SceNpClansRequestHandle> handle, S
std::memcpy(&host_data, data.get_ptr(), sizeof(SceNpClansMessageData));
}
SceNpClansMessageId host_mId = 0;
s32 reqId = static_cast<s32>(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<SceNpClansRequestHandle> handle,
auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
SceNpClansError ret = clans_manager.client->deleteAnnouncement(nph, clanId, mId);
s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->deleteAnnouncement(nph, reqId, clanId, mId);
if (ret != SCE_NP_CLANS_SUCCESS)
{
return ret;

View File

@ -1,3 +1,4 @@
#include "Emu/Cell/Modules/sceNpClans.h"
#include "stdafx.h"
#include <util/types.hpp>
@ -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<clan_request_ctx>();
}
SceNpClansError clans_client::createRequest()
SceNpClansError clans_client::createRequest(s32* reqId)
{
if (curl)
return SceNpClansError::SCE_NP_CLANS_SUCCESS;
const s32 id = idm::make<clan_request_ctx>();
curl = curl_easy_init();
if (!curl)
if (id == id_manager::id_traits<clan_request_ctx>::invalid)
{
return SceNpClansError::SCE_NP_CLANS_ERROR_EXCEEDS_MAX;
}
auto ctx = idm::get_unlocked<clan_request_ctx>(id);
if (!ctx || !ctx->curl)
{
idm::remove<clan_request_ctx>(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<clan_request_ctx>(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<clan_request_ctx>(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<uint32_t>(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

View File

@ -3,6 +3,7 @@
#include <3rdparty/curl/curl/include/curl/curl.h>
#include <Emu/Cell/Modules/sceNpClans.h>
#include <Emu/NP/np_handler.h>
#include <Emu/IdManager.h>
#include <pugixml.hpp>
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