package db import ( "fmt" "time" ) type Body struct { ID int PlayerID int X float64 Y float64 Z float64 DiedAt time.Time FoundAt *time.Time FoundBy *int } func (db *SQLite) ListBodies() ([]Body, error) { rows, err := db.db.Query(`select id, player, x, y, z, died_at from bodies where found_at is null`) if err != nil { return nil, fmt.Errorf("failed to fetch bodies from db: %w", err) } bodies := make([]Body, 0, 64) for rows.Next() { var body Body if err := rows.Scan(&body.ID, &body.PlayerID, &body.X, &body.Y, &body.Z, &body.DiedAt); err != nil { return nil, fmt.Errorf("failed to read bodies response rows: %w", err) } bodies = append(bodies, body) } return bodies, nil } func (db *SQLite) AddBody(body *Body) error { _, err := db.db.Exec(`insert into bodies (player, x, y, z) values (?, ?, ?, ?);`, body.PlayerID, body.X, body.Y, body.Z) if err != nil { return fmt.Errorf("failed to add body to db: %w", err) } return nil } func (db *SQLite) ReadBody(body *Body) error { args := make([]interface{}, 0, 1) q := `select id, player, x, y, z, died_at from bodies` if body.ID != 0 { q += ` where id = ?` args = append(args, body.ID) } else { q += ` where player = ?` args = append(args, body.PlayerID) } q += ` and found_at is null` row := db.db.QueryRow(q, args...) if err := row.Scan(&body.ID, &body.PlayerID, &body.X, &body.Y, &body.Z, &body.DiedAt); err != nil { return fmt.Errorf("failed to read body from db: %w", err) } 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 }