From 32e4e6163555f52dcb6f14c29f8a9fb8badf6465 Mon Sep 17 00:00:00 2001 From: Ryan Hamamura <58859899+ryanhamamura@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:45:04 -1000 Subject: [PATCH] Auto-generate nicknames for invitees joining via link Invitees no longer need to enter a nickname - they automatically join with a random name like "Swift Tiger" or "Happy Falcon". Game creators still enter their nickname manually. --- game/store.go | 18 ++++++++++++++++++ main.go | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/game/store.go b/game/store.go index 2f820c3..13a9972 100644 --- a/game/store.go +++ b/game/store.go @@ -50,6 +50,24 @@ func GenerateID(size int) string { return hex.EncodeToString(b) } +func GenerateNickname() string { + adjectives := []string{ + "Swift", "Happy", "Clever", "Brave", "Mighty", + "Quick", "Calm", "Bold", "Lucky", "Wise", + "Eager", "Noble", "Keen", "Bright", "Vivid", + } + nouns := []string{ + "Tiger", "Falcon", "Dragon", "Phoenix", "Wolf", + "Eagle", "Panda", "Otter", "Fox", "Bear", + "Hawk", "Lion", "Raven", "Shark", "Owl", + } + b := make([]byte, 2) + rand.Read(b) + adj := adjectives[int(b[0])%len(adjectives)] + noun := nouns[int(b[1])%len(nouns)] + return adj + " " + noun +} + type GameInstance struct { game *Game gameMu sync.RWMutex diff --git a/main.go b/main.go index c22b782..9e0c77d 100644 --- a/main.go +++ b/main.go @@ -106,16 +106,35 @@ func main() { c.Sync() }) - // If nickname exists in session and game exists, join immediately - if gameExists && sessionNickname != "" && gi.GetPlayerColor(playerID) == 0 { - player := &game.Player{ - ID: playerID, - Nickname: sessionNickname, + // Auto-join logic + if gameExists && gi.GetPlayerColor(playerID) == 0 { + g := gi.GetGame() + // Invitee: game is waiting for second player - auto-generate nickname and join + if g.Status == game.StatusWaitingForPlayer { + name := sessionNickname + if name == "" { + name = game.GenerateNickname() + c.Session().Set("nickname", name) + } + player := &game.Player{ + ID: playerID, + Nickname: name, + } + gi.Join(&game.PlayerSession{ + Player: player, + Sync: c, + }) + } else if sessionNickname != "" { + // Reconnecting player with existing nickname + player := &game.Player{ + ID: playerID, + Nickname: sessionNickname, + } + gi.Join(&game.PlayerSession{ + Player: player, + Sync: c, + }) } - gi.Join(&game.PlayerSession{ - Player: player, - Sync: c, - }) } c.View(func() h.H {