From fc882c9dff4829ff0f2b64f07c174cc415bfca29 Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 14 Aug 2026 10:51:51 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9C=A0=EB=A0=B9=20=EB=8B=89=EB=84=A4?= =?UTF-8?q?=EC=9E=84=20=EB=B3=B5=EA=B5=AC=20=EA=B0=80=EB=8A=A5=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95=20(=EB=A7=88=EC=9D=84=20?= =?UTF-8?q?=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EC=9B=90=EC=9D=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 등록만 되고 세이브가 저장된 적 없는(data NULL) 닉네임은 중복 체크에서 사용 가능으로, 재등록 시 새 토큰으로 재선점 - 불러오기 실패 시 "서버에 닿지 않아" 대신 "그 이름의 마을은 없는걸?" Co-Authored-By: Claude Fable 5 --- src/components/game/NicknameModal.tsx | 2 +- src/lib/villages.ts | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/game/NicknameModal.tsx b/src/components/game/NicknameModal.tsx index da4baf9..39696b8 100644 --- a/src/components/game/NicknameModal.tsx +++ b/src/components/game/NicknameModal.tsx @@ -78,7 +78,7 @@ export default function NicknameModal({ onDone }: { onDone: () => void }) { } else { const found = await recoverVillage(trimmed); if (!found) { - setStatus("offline"); + setStatus("available"); // 불러오기 모드에선 "그 이름의 마을은 없는걸?" setSubmitting(false); return; } diff --git a/src/lib/villages.ts b/src/lib/villages.ts index 2f9764f..aae00d5 100644 --- a/src/lib/villages.ts +++ b/src/lib/villages.ts @@ -24,9 +24,11 @@ export function validNickname(name: unknown): name is string { export async function isAvailable(nickname: string): Promise { await ensureTable(); - const r = await db.query("SELECT 1 FROM villages WHERE nickname = $1", [ - nickname, - ]); + // 데이터가 저장된 적 없는 유령 등록은 재사용 가능 + const r = await db.query( + "SELECT 1 FROM villages WHERE nickname = $1 AND data IS NOT NULL", + [nickname], + ); return r.rowCount === 0; } @@ -36,7 +38,8 @@ export async function register(nickname: string, token: string): Promise 0;