Clans: polishing

- Removed usage of raw pointers with `new`
- `clans_client::getClanTicket` now _actually_ uses the cached ticket if available.
- Avoid setting `current_ticket` and instead hijack it if it's the Clans ticket
- Refusing to get a ticket if emulator is not connected to RPCN

Signed-off-by: zeph <zephyrzefa15@gmail.com>
This commit is contained in:
zeph 2025-12-12 01:35:17 +01:00
parent 19e9dcbbef
commit e6e745fec6
No known key found for this signature in database
3 changed files with 27 additions and 14 deletions

View File

@ -475,13 +475,12 @@ error_code sceNpClansGetMemberList(SceNpClansRequestHandle handle, SceNpClanId c
std::memcpy(&host_paging, paging.get_ptr(), sizeof(SceNpClansPagingRequest));
}
SceNpClansMemberEntry* host_memList_addr = new SceNpClansMemberEntry[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX];
SceNpClansMemberEntry host_memList_addr[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {};
SceNpClansPagingResult host_pageResult = {};
SceNpClansError ret = clans_manager.client->getMemberList(nph, handle, clanId, &host_paging, status, host_memList_addr, &host_pageResult);
if (ret != SCE_NP_CLANS_SUCCESS)
{
delete[] host_memList_addr;
return ret;
}
@ -491,7 +490,6 @@ error_code sceNpClansGetMemberList(SceNpClansRequestHandle handle, SceNpClanId c
}
std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult));
delete[] host_memList_addr;
return CELL_OK;
}

View File

@ -1,3 +1,4 @@
#include "Emu/Cell/Modules/sceNp.h"
#include "stdafx.h"
#include <util/types.hpp>
@ -286,6 +287,11 @@ namespace clan
std::string clans_client::getClanTicket(np::np_handler& nph)
{
// Pretend we failed to get a ticket if the emulator isn't
// connected to RPCN.
if (nph.get_psn_status() != SCE_NP_MANAGER_STATUS_ONLINE)
return "";
const auto& npid = nph.get_npid();
const char* service_id = CLANS_SERVICE_ID;
@ -294,13 +300,20 @@ namespace clan
const char* entitlement_id = CLANS_ENTITLEMENT_ID;
const u32 consumed_count = 0;
nph.req_ticket(0x00020001, &npid, service_id, cookie, cookie_size, entitlement_id, consumed_count);
// Use the cached ticket if available
np::ticket ticket = nph.get_clan_ticket();
if (ticket.empty())
{
clan_log.error("Failed to get clan ticket");
return "";
// If not cached, request a new ticket
nph.req_ticket(0x00020001, &npid, service_id, cookie, cookie_size, entitlement_id, consumed_count);
ticket = nph.get_clan_ticket();
// If still empty, return error
if (ticket.empty())
{
clan_log.error("Failed to get clan ticket");
return "";
}
}
std::vector<byte> ticket_bytes(1024);

View File

@ -864,20 +864,22 @@ namespace np
auto ticket_raw = reply.get_rawdata();
ensure(!reply.is_error(), "Malformed reply to RequestTicket command");
current_ticket = ticket(std::move(ticket_raw));
auto ticket_size = static_cast<s32>(current_ticket.size());
// Clans: check if ticket belongs to the clan service. If so, store it.
if (current_ticket.get_service_id() == CLANS_SERVICE_ID)
auto incoming_ticket = ticket(std::move(ticket_raw));
// Clans: check if ticket belongs to the clan service.
// If so, hijack the ticket and cache it for future use.
if (incoming_ticket.get_service_id() == CLANS_SERVICE_ID)
{
clan_ticket = current_ticket;
clan_ticket = incoming_ticket;
clan_ticket_ready.store(true);
clan_ticket_ready.notify_all();
return;
}
current_ticket = incoming_ticket;
auto ticket_size = static_cast<s32>(current_ticket.size());
if (manager_cb)
{
sysutil_register_cb([manager_cb = this->manager_cb, ticket_size, manager_cb_arg = this->manager_cb_arg](ppu_thread& cb_ppu) -> s32