diff --git a/api/account.php b/api/account.php index 1062a95..b476ecb 100644 --- a/api/account.php +++ b/api/account.php @@ -65,6 +65,7 @@ try { case 'bind_email_start': acctBindEmailStart(); break; case 'bind_email_poll': acctBindEmailPoll(); break; case 'bind_email_confirm': acctBindEmailConfirm(); break; + case 'get_email_suffix_config': acctGetEmailSuffixConfig(); break; default: error('未知操作: ' . $action); } @@ -859,6 +860,33 @@ function acctRecoveryRegen() { success(['recovery_codes' => $codes], '恢复代码已重新生成,旧代码全部作废'); } +// ★ 第57批续4:获取邮箱后缀配置(供前端展示可绑定的邮箱类型) +function acctGetEmailSuffixConfig() { + $player = acctAuthPlayer(); + $db = getDB(); + try { + $cfgRow = $db->query("SELECT mode, suffix_list FROM email_suffix_config WHERE id = 1")->fetchArray(SQLITE3_ASSOC); + } catch (\Throwable $e) { + success(['email_mode' => '默认', 'email_suffixes' => []]); + return; + } + if (!$cfgRow) { + success(['email_mode' => '默认', 'email_suffixes' => []]); + return; + } + $mode = (string)$cfgRow['mode']; + $suffixList = (string)$cfgRow['suffix_list']; + if ($mode === '默认' || $suffixList === '') { + success(['email_mode' => '默认', 'email_suffixes' => []]); + return; + } + $suffixes = preg_split('/[,;\n]+/', $suffixList); + $suffixes = array_map('trim', $suffixes); + $suffixes = array_map('strtolower', $suffixes); + $suffixes = array_filter($suffixes, function ($s) { return $s !== ''; }); + success(['email_mode' => $mode, 'email_suffixes' => array_values($suffixes)]); +} + // ===================== 第53批:网页端绑定邮箱(游戏内批准流) ===================== // // 流程:bind_email_start 建 60 秒请求(要求玩家在线)→ Java 定时器A 拉取并游戏内发 @@ -928,7 +956,19 @@ function acctBindEmailStart() { $id = (int)$db->lastInsertRowID(); debugLog('[account.php] 发起网页绑邮箱', ['player' => $player, 'id' => $id, 'ip' => acctClientIp()]); - success(['id' => $id, 'expire_in' => 60], '请求已发送,等待游戏内批准'); + + // ★ 第57批续4:返回后缀配置,供前端展示可绑定的邮箱类型 + $mode = '默认'; $suffixList = ''; + try { + $cfgRow = $db->query("SELECT mode, suffix_list FROM email_suffix_config WHERE id = 1")->fetchArray(SQLITE3_ASSOC); + if ($cfgRow) { + $mode = (string)$cfgRow['mode']; + $suffixList = (string)$cfgRow['suffix_list']; + } + } catch (\Throwable $_e) {} + $suffixes = array_filter(array_map('trim', preg_split('/[,;\n]+/', $suffixList))); + $suffixes = array_map(function ($s) { return strtolower($s); }, $suffixes); + success(['id' => $id, 'expire_in' => 60, 'email_mode' => $mode, 'email_suffixes' => array_values($suffixes)], '请求已发送,等待游戏内批准'); } /** 前端轮询请求状态(1秒一次):pending/notified/approved/rejected/offline/expired/completed/failed */ diff --git a/player.php b/player.php index 8cb2b00..5aeea12 100644 --- a/player.php +++ b/player.php @@ -277,10 +277,13 @@ if ($currentVersion !== $BUILD_VERSION) { } .drawer-overlay.show { display: flex; } .drawer-card { - background: var(--card); border: 1px solid var(--border); - border-radius: 12px 12px 0 0; padding: 24px; + background: rgba(22,27,34,0.85); backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px); + border: 1px solid rgba(88,166,255,0.2); border-radius: 12px 12px 0 0; padding: 24px; width: 420px; max-width: 90%; - box-shadow: 0 -8px 32px rgba(0,0,0,0.3); + box-shadow: 0 -8px 32px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.05); + } + .light-theme .drawer-card { + background: rgba(255,255,255,0.85); border-color: rgba(9,105,218,0.2); } .drawer-card.animate-in { animation: drawerSlideDown 0.3s ease; } .drawer-card.animate-out { animation: drawerSlideUp 0.25s ease forwards; } @@ -2638,12 +2641,36 @@ if ($currentVersion !== $BUILD_VERSION) { if (IS_PREVIEW || !TOKEN || !currentPlayer) { showToast('请先登录游戏后再操作', 'error'); return; } if (_bindWizTimer) { clearInterval(_bindWizTimer); _bindWizTimer = null; } drawerOpen('📧 网页绑定邮箱'); - drawerSet(` + // ★ 第57批续4:先获取邮箱后缀配置,展示可绑定的邮箱类型 + apiPost('account.php', {action: 'get_email_suffix_config'}).then(res => { + let hintHtml = ''; + if (res.success && res.data) { + const mode = res.data.email_mode || '默认'; + const suffixes = res.data.email_suffixes || []; + if (suffixes.length > 0) { + if (mode === '白名单') { + hintHtml = '
✅ 仅允许绑定以下邮箱:
' + suffixes.map(s => '@' + s + '').join('') + '
'; + } else if (mode === '黑名单') { + hintHtml = '
❌ 以下邮箱被禁止绑定:
' + suffixes.map(s => '@' + s + '').join('') + '
'; + } + } + } + drawerSet(` +
输入邮箱后,你的游戏内会收到一条批准通知(需在线)。1分钟内点击「✔ 批准」,再回到这里输入登录密码即可完成绑定;拒绝或超时则直接折返,不做任何处置。
+ ${hintHtml} + +
`, + '发送批准请求 →', acctBindEmailStart); + setTimeout(() => { const el = document.getElementById('bindEmailInput'); if (el) el.focus(); }, 120); + }).catch(() => { + // API 失败也展示基础向导 + drawerSet(`
输入邮箱后,你的游戏内会收到一条批准通知(需在线)。1分钟内点击「✔ 批准」,再回到这里输入登录密码即可完成绑定;拒绝或超时则直接折返,不做任何处置。
`, - '发送批准请求 →', acctBindEmailStart); - setTimeout(() => { const el = document.getElementById('bindEmailInput'); if (el) el.focus(); }, 120); + '发送批准请求 →', acctBindEmailStart); + setTimeout(() => { const el = document.getElementById('bindEmailInput'); if (el) el.focus(); }, 120); + }); } async function acctBindEmailStart() {