diff --git a/cmd/server/usergameserver.go b/cmd/server/usergameserver.go index 0db0857..103ea0b 100644 --- a/cmd/server/usergameserver.go +++ b/cmd/server/usergameserver.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "log" + "slices" "time" ) @@ -79,7 +80,34 @@ func (ugs *UserGameServer) listen(ctx context.Context, reader func(context.Conte return err } } else if killOccurred := m["k"] != ""; killOccurred { - return fmt.Errorf("not impl: a kill occurred: %+v", m) + victimName := m["name"] + word := m["k"] + if word == "" { + return fmt.Errorf("expected .k") + } + + killer := ugs.Session.ID + victim, err := ugs.games.UserByName(ctx, ugs.ID, victimName) + if err != nil { + return err + } + + var points int + if gameState, err := ugs.games.GameState(ctx, ugs.ID); err != nil { + return err + } else if global := gameState.Players[killer].KillWords.Global; global.Word == word { + points = global.Points + } else if matches := slices.DeleteFunc(gameState.Players[victim].KillWords.Publics(), func(kw KillWord) bool { return kw.Word != word }); len(matches) > 0 { + points = matches[0].Points + } else if matches := slices.DeleteFunc(gameState.Players[victim].KillWords.Privates(), func(kw KillWord) bool { return kw.Word != word }); len(matches) > 0 { + points = matches[0].Points + } else { + return fmt.Errorf("refusing unexpected .k") + } + + if err := ugs.games.CreateEventAssignmentRotation(ctx, ugs.ID, killer, victim, word, points); err != nil { + return err + } } else if isRename := m["name"] != ""; isRename { if err := ugs.games.UpdateUserName(ctx, ugs.Session.ID, m["name"]); err != nil { return err