321 lines
8.6 KiB
TypeScript
321 lines
8.6 KiB
TypeScript
import type {
|
|
CreateProfileRechargeOrderResponse,
|
|
ClaimProfileTaskRewardResponse,
|
|
PlatformBrowseHistoryBatchSyncRequest,
|
|
PlatformBrowseHistoryResponse,
|
|
PlatformBrowseHistoryWriteEntry,
|
|
ProfileDashboardSummary,
|
|
ProfilePlayStatsResponse,
|
|
ProfileReferralInviteCenterResponse,
|
|
ProfileRechargeCenterResponse,
|
|
ProfileSaveArchiveListResponse,
|
|
ProfileSaveArchiveResumeResponse,
|
|
ProfileTaskCenterResponse,
|
|
ProfileWalletLedgerResponse,
|
|
RedeemProfileReferralInviteCodeResponse,
|
|
RedeemProfileRewardCodeResponse,
|
|
RuntimeSettings,
|
|
SubmitProfileFeedbackRequest,
|
|
SubmitProfileFeedbackResponse,
|
|
} from '../../../packages/shared/src/contracts/runtime';
|
|
import { rehydrateSavedSnapshot } from '../../persistence/runtimeSnapshot';
|
|
import type { HydratedSavedGameSnapshot } from '../../persistence/runtimeSnapshotTypes';
|
|
import {
|
|
RUNTIME_BACKGROUND_AUTH_OPTIONS,
|
|
requestRpgRuntimeJson,
|
|
type RuntimeRequestOptions,
|
|
} from '../rpg-runtime/rpgRuntimeRequest';
|
|
|
|
export type { RuntimeRequestOptions };
|
|
|
|
/**
|
|
* RPG profile 域 client。
|
|
* 工作包 C 需要把继续游戏归档与资料读取收进新域目录,避免继续堆在 `storageService`。
|
|
*/
|
|
export function getRpgProfileSettings(options: RuntimeRequestOptions = {}) {
|
|
return requestRpgRuntimeJson<RuntimeSettings>(
|
|
'/settings',
|
|
{ method: 'GET' },
|
|
'读取设置失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function putRpgProfileSettings(
|
|
settings: RuntimeSettings,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<RuntimeSettings>(
|
|
'/settings',
|
|
{
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(settings),
|
|
},
|
|
'保存设置失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function getRpgProfileDashboard(options: RuntimeRequestOptions = {}) {
|
|
return requestRpgRuntimeJson<ProfileDashboardSummary>(
|
|
'/profile/dashboard',
|
|
{ method: 'GET' },
|
|
'读取个人看板失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function getRpgProfileWalletLedger(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<ProfileWalletLedgerResponse>(
|
|
'/profile/wallet-ledger',
|
|
{ method: 'GET' },
|
|
'读取资产流水失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function getRpgProfileRechargeCenter(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<ProfileRechargeCenterResponse>(
|
|
'/profile/recharge-center',
|
|
{ method: 'GET' },
|
|
'读取账户充值失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function createRpgProfileRechargeOrder(
|
|
productId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<CreateProfileRechargeOrderResponse>(
|
|
'/profile/recharge/orders',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ productId, paymentChannel: 'mock' }),
|
|
},
|
|
'充值失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function submitRpgProfileFeedback(
|
|
payload: SubmitProfileFeedbackRequest,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<SubmitProfileFeedbackResponse>(
|
|
'/profile/feedback',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
},
|
|
'提交反馈失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function getRpgProfileReferralInviteCenter(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<ProfileReferralInviteCenterResponse>(
|
|
'/profile/referrals/invite-center',
|
|
{ method: 'GET' },
|
|
'读取邀请码失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function redeemRpgProfileReferralInviteCode(
|
|
inviteCode: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<RedeemProfileReferralInviteCodeResponse>(
|
|
'/profile/referrals/redeem-code',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ inviteCode }),
|
|
},
|
|
'填写邀请码失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function redeemRpgProfileRewardCode(
|
|
code: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<RedeemProfileRewardCodeResponse>(
|
|
'/profile/redeem-codes/redeem',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ code }),
|
|
},
|
|
'兑换失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function getRpgProfileTasks(options: RuntimeRequestOptions = {}) {
|
|
return requestRpgRuntimeJson<ProfileTaskCenterResponse>(
|
|
'/profile/tasks',
|
|
{ method: 'GET' },
|
|
'读取每日任务失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function claimRpgProfileTaskReward(
|
|
taskId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
return requestRpgRuntimeJson<ClaimProfileTaskRewardResponse>(
|
|
`/profile/tasks/${encodeURIComponent(taskId)}/claim`,
|
|
{ method: 'POST' },
|
|
'领取任务奖励失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export function getRpgProfilePlayStats(options: RuntimeRequestOptions = {}) {
|
|
return requestRpgRuntimeJson<ProfilePlayStatsResponse>(
|
|
'/profile/play-stats',
|
|
{ method: 'GET' },
|
|
'读取游玩统计失败',
|
|
options,
|
|
);
|
|
}
|
|
|
|
export async function listRpgProfileSaveArchives(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<ProfileSaveArchiveListResponse>(
|
|
'/profile/save-archives',
|
|
{ method: 'GET' },
|
|
'读取存档列表失败',
|
|
{
|
|
...RUNTIME_BACKGROUND_AUTH_OPTIONS,
|
|
...options,
|
|
},
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export async function resumeRpgProfileSaveArchive(
|
|
worldKey: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<ProfileSaveArchiveResumeResponse>(
|
|
`/profile/save-archives/${encodeURIComponent(worldKey)}`,
|
|
{ method: 'POST' },
|
|
'恢复存档失败',
|
|
options,
|
|
);
|
|
|
|
return {
|
|
entry: response.entry,
|
|
snapshot: rehydrateSavedSnapshot(
|
|
response.snapshot as HydratedSavedGameSnapshot,
|
|
),
|
|
};
|
|
}
|
|
|
|
export async function listRpgProfileBrowseHistory(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<PlatformBrowseHistoryResponse>(
|
|
'/profile/browse-history',
|
|
{ method: 'GET' },
|
|
'读取浏览历史失败',
|
|
{
|
|
...RUNTIME_BACKGROUND_AUTH_OPTIONS,
|
|
...options,
|
|
},
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export async function upsertRpgProfileBrowseHistory(
|
|
entry: PlatformBrowseHistoryWriteEntry,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<PlatformBrowseHistoryResponse>(
|
|
'/profile/browse-history',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(entry),
|
|
},
|
|
'写入浏览历史失败',
|
|
{
|
|
...RUNTIME_BACKGROUND_AUTH_OPTIONS,
|
|
...options,
|
|
},
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export async function syncRpgProfileBrowseHistory(
|
|
entries: PlatformBrowseHistoryWriteEntry[],
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<PlatformBrowseHistoryResponse>(
|
|
'/profile/browse-history',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
entries,
|
|
} satisfies PlatformBrowseHistoryBatchSyncRequest),
|
|
},
|
|
'同步浏览历史失败',
|
|
options,
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export async function clearRpgProfileBrowseHistory(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<PlatformBrowseHistoryResponse>(
|
|
'/profile/browse-history',
|
|
{ method: 'DELETE' },
|
|
'清空浏览历史失败',
|
|
options,
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export const rpgProfileClient = {
|
|
getDashboard: getRpgProfileDashboard,
|
|
getPlayStats: getRpgProfilePlayStats,
|
|
getWalletLedger: getRpgProfileWalletLedger,
|
|
getRechargeCenter: getRpgProfileRechargeCenter,
|
|
createRechargeOrder: createRpgProfileRechargeOrder,
|
|
submitFeedback: submitRpgProfileFeedback,
|
|
getReferralInviteCenter: getRpgProfileReferralInviteCenter,
|
|
redeemReferralInviteCode: redeemRpgProfileReferralInviteCode,
|
|
getTasks: getRpgProfileTasks,
|
|
claimTaskReward: claimRpgProfileTaskReward,
|
|
getSettings: getRpgProfileSettings,
|
|
putSettings: putRpgProfileSettings,
|
|
listSaveArchives: listRpgProfileSaveArchives,
|
|
resumeSaveArchive: resumeRpgProfileSaveArchive,
|
|
listBrowseHistory: listRpgProfileBrowseHistory,
|
|
upsertBrowseHistory: upsertRpgProfileBrowseHistory,
|
|
syncBrowseHistory: syncRpgProfileBrowseHistory,
|
|
clearBrowseHistory: clearRpgProfileBrowseHistory,
|
|
};
|