From 9200ed85758024678a019a7524daa2f3c0f2a64b Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Mon, 9 Mar 2020 02:53:06 +0000 Subject: [PATCH] can now respawn player from command line --- server/db/bodies.go | 9 +++++++++ server/db/sqlite.go | 4 ++++ server/main.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/server/db/bodies.go b/server/db/bodies.go index ddad650..eada823 100644 --- a/server/db/bodies.go +++ b/server/db/bodies.go @@ -61,3 +61,12 @@ func (db *SQLite) ReadBody(body *Body) error { } return nil } + +func (db *SQLite) FindBody(id, finder int) error { + q := `update bodies set found_at = CURRENT_TIMESTAMP, found_by = ? where id = ?` + _, err := db.db.Exec(q, finder, id) + if err != nil { + return fmt.Errorf("unable to claim body %d as found by %d: %w", id, finder, err) + } + return nil +} diff --git a/server/db/sqlite.go b/server/db/sqlite.go index f560ca6..a28373e 100644 --- a/server/db/sqlite.go +++ b/server/db/sqlite.go @@ -31,6 +31,10 @@ func OpenSQLite(path string) (*SQLite, error) { fmt.Fprintf(os.Stderr, "failed to create players table: %v\n", err) } + db.Exec(`insert or ignore + into players (id, name, phash, psalt) + values (0, "admin", "", "")`) + if _, err := db.Exec(` create table if not exists bodies ( id integer primary key autoincrement, diff --git a/server/main.go b/server/main.go index e049781..e57a889 100644 --- a/server/main.go +++ b/server/main.go @@ -149,6 +149,36 @@ func runPlayerStatus(cmd *cobra.Command, args []string) { } } +func runPlayerRespawn(cmd *cobra.Command, args []string) { + conn, err := db.OpenSQLite(cmd.Flag("db").Value.String()) + if err != nil { + fmt.Fprintf(os.Stderr, "unable to open sqlite database: %v\n", err) + } + defer conn.Close() + + player := db.Player{Name: args[0]} + if err := conn.ReadPlayer(&player); err != nil { + fmt.Fprintf(os.Stderr, "unable to read player record: %v\n", err) + return + } + + body := db.Body{PlayerID: player.ID} + err = conn.ReadBody(&body) + switch { + case errors.Is(err, sql.ErrNoRows): + fmt.Fprintf(os.Stderr, "player was not dead\n") + return + case err == nil: + break + default: + fmt.Fprintf(os.Stderr, "unable to query for bodies: %v\n", err) + return + } + if err := conn.FindBody(body.ID, 0); err != nil { + fmt.Fprintf(os.Stderr, "unable to respawn player %s: %v\n", args[0], err) + } +} + func main() { cmd := &cobra.Command{ Use: "kloam", @@ -201,5 +231,13 @@ func main() { } player.AddCommand(playerStatus) + playerRespawn := &cobra.Command{ + Use: "respawn", + Short: "respawn a player", + Args: cobra.ExactArgs(1), + Run: runPlayerRespawn, + } + player.AddCommand(playerRespawn) + cmd.Execute() }