update all
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Shared helpers — lookup player account by jdPlayerKey (providerUserId).
|
||||
* รองรับทั้ง guest และ google (และ loginType อื่นในอนาคต)
|
||||
*/
|
||||
function valid_player_key(string $key): bool
|
||||
{
|
||||
return (bool) preg_match('/^[a-zA-Z0-9_-]{8,128}$/', $key);
|
||||
}
|
||||
|
||||
function find_account_index_by_player_key(array $accounts, string $key): int
|
||||
{
|
||||
foreach ($accounts as $i => $a) {
|
||||
if (($a['providerUserId'] ?? '') === $key) {
|
||||
return (int) $i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
function find_account_by_player_key(array $accounts, string $key): ?array
|
||||
{
|
||||
$idx = find_account_index_by_player_key($accounts, $key);
|
||||
return $idx >= 0 ? $accounts[$idx] : null;
|
||||
}
|
||||
|
||||
function default_guest_account(string $key, string $notes = 'auto', array $extra = []): array
|
||||
{
|
||||
$now = gmdate('c');
|
||||
return array_merge([
|
||||
'id' => new_id(),
|
||||
'email' => '',
|
||||
'displayName' => 'Guest',
|
||||
'loginType' => 'guest',
|
||||
'providerUserId' => $key,
|
||||
'notes' => $notes,
|
||||
'blocked' => false,
|
||||
'coins' => 0,
|
||||
'createdAt' => $now,
|
||||
'updatedAt' => $now,
|
||||
], $extra);
|
||||
}
|
||||
|
||||
function google_player_key(string $googleSub): string
|
||||
{
|
||||
$sub = trim($googleSub);
|
||||
if ($sub === '') {
|
||||
return '';
|
||||
}
|
||||
if (str_starts_with($sub, 'g_')) {
|
||||
return $sub;
|
||||
}
|
||||
return 'g_' . $sub;
|
||||
}
|
||||
|
||||
function merge_guest_account_into(array &$store, int $targetIdx, string $guestKey): void
|
||||
{
|
||||
if ($guestKey === '' || !valid_player_key($guestKey)) {
|
||||
return;
|
||||
}
|
||||
$guestIdx = find_account_index_by_player_key($store['accounts'] ?? [], $guestKey);
|
||||
if ($guestIdx < 0 || $guestIdx === $targetIdx) {
|
||||
return;
|
||||
}
|
||||
$guest = $store['accounts'][$guestIdx];
|
||||
if (($guest['loginType'] ?? '') !== 'guest') {
|
||||
return;
|
||||
}
|
||||
|
||||
$target = &$store['accounts'][$targetIdx];
|
||||
$target['coins'] = max(0, (int) ($target['coins'] ?? 0)) + max(0, (int) ($guest['coins'] ?? 0));
|
||||
$target['score'] = max(0, (int) ($target['score'] ?? 0)) + max(0, (int) ($guest['score'] ?? 0));
|
||||
|
||||
if (isset($guest['scoreByCase']) && is_array($guest['scoreByCase'])) {
|
||||
if (!isset($target['scoreByCase']) || !is_array($target['scoreByCase'])) {
|
||||
$target['scoreByCase'] = [];
|
||||
}
|
||||
foreach ($guest['scoreByCase'] as $cid => $sc) {
|
||||
$target['scoreByCase'][$cid] = max(0, (int) ($target['scoreByCase'][$cid] ?? 0)) + max(0, (int) $sc);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($guest['achievements']) && is_array($guest['achievements'])) {
|
||||
if (!isset($target['achievements']) || !is_array($target['achievements'])) {
|
||||
$target['achievements'] = [];
|
||||
}
|
||||
foreach ($guest['achievements'] as $aid => $cnt) {
|
||||
$target['achievements'][$aid] = max((int) ($target['achievements'][$aid] ?? 0), (int) $cnt);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($guest['daily']) && is_array($guest['daily']) && empty($target['daily'])) {
|
||||
$target['daily'] = $guest['daily'];
|
||||
}
|
||||
|
||||
if (!isset($target['lobbyColorThemeIndex']) && isset($guest['lobbyColorThemeIndex'])) {
|
||||
$target['lobbyColorThemeIndex'] = $guest['lobbyColorThemeIndex'];
|
||||
}
|
||||
if (!isset($target['lobbySkinToneIndex']) && isset($guest['lobbySkinToneIndex'])) {
|
||||
$target['lobbySkinToneIndex'] = $guest['lobbySkinToneIndex'];
|
||||
}
|
||||
|
||||
if (($target['displayName'] ?? '') === '' || ($target['displayName'] ?? '') === 'Guest') {
|
||||
$gn = trim((string) ($guest['displayName'] ?? ''));
|
||||
if ($gn !== '' && $gn !== 'Guest') {
|
||||
$target['displayName'] = $gn;
|
||||
}
|
||||
}
|
||||
|
||||
array_splice($store['accounts'], $guestIdx, 1);
|
||||
if ($guestIdx < $targetIdx) {
|
||||
$targetIdx--;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user