feat: surface SCUM vehicle functional state

This commit is contained in:
npc0-hue
2026-09-18 16:56:36 +08:00
parent 156392df1e
commit 60d479db71
13 changed files with 62 additions and 17 deletions
+23 -5
View File
@@ -78,6 +78,7 @@ var scumTableDDL = []struct {
display_name VARCHAR(191) NOT NULL DEFAULT '',
exists_in_game BOOLEAN NOT NULL DEFAULT FALSE,
locked BOOLEAN NOT NULL DEFAULT FALSE,
functional BOOLEAN NULL,
x DOUBLE NULL,
y DOUBLE NULL,
z DOUBLE NULL,
@@ -136,6 +137,23 @@ func (store *MySQLStore) initializeSCUMTables(ctx context.Context) error {
return fmt.Errorf("create SCUM table %s: %w", entry.table, err)
}
}
if err := store.ensureSCUMVehicleFunctionalColumn(ctx); err != nil {
return err
}
return nil
}
func (store *MySQLStore) ensureSCUMVehicleFunctionalColumn(ctx context.Context) error {
var found int
if err := store.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'scum_vehicle' AND COLUMN_NAME = 'functional'`).Scan(&found); err != nil {
return fmt.Errorf("inspect SCUM vehicle functional column: %w", err)
}
if found > 0 {
return nil
}
if _, err := store.db.ExecContext(ctx, `ALTER TABLE scum_vehicle ADD COLUMN functional BOOLEAN NULL AFTER locked`); err != nil {
return fmt.Errorf("add SCUM vehicle functional column: %w", err)
}
return nil
}
@@ -268,12 +286,12 @@ func (repository *mysqlSCUMUserRepository) Delete(id string) error {
type mysqlSCUMVehicleRepository struct{ db *sql.DB }
const scumVehicleColumns = `id, server_instance_id, game_vehicle_id, vehicle_class, display_name, exists_in_game, locked, x, y, z, last_observed_at, created_at, updated_at`
const scumVehicleColumns = `id, server_instance_id, game_vehicle_id, vehicle_class, display_name, exists_in_game, locked, functional, x, y, z, last_observed_at, created_at, updated_at`
func (repository *mysqlSCUMVehicleRepository) Create(value domain.SCUMVehicle) error {
ctx, cancel := scumQueryContext()
defer cancel()
_, err := repository.db.ExecContext(ctx, `INSERT INTO scum_vehicle (`+scumVehicleColumns+`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)`, scumVehicleArgs(value)...)
_, err := repository.db.ExecContext(ctx, `INSERT INTO scum_vehicle (`+scumVehicleColumns+`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, scumVehicleArgs(value)...)
if err != nil {
if isMySQLDuplicateKey(err) {
return ErrDuplicate
@@ -337,7 +355,7 @@ func (repository *mysqlSCUMVehicleRepository) List(filter domain.SCUMVehicleFilt
func (repository *mysqlSCUMVehicleRepository) Update(value domain.SCUMVehicle) error {
ctx, cancel := scumQueryContext()
defer cancel()
result, err := repository.db.ExecContext(ctx, `UPDATE scum_vehicle SET server_instance_id=?, game_vehicle_id=?, vehicle_class=?, display_name=?, exists_in_game=?, locked=?, x=?, y=?, z=?, last_observed_at=?, created_at=?, updated_at=? WHERE id=?`, scumVehicleUpdateArgs(value)...)
result, err := repository.db.ExecContext(ctx, `UPDATE scum_vehicle SET server_instance_id=?, game_vehicle_id=?, vehicle_class=?, display_name=?, exists_in_game=?, locked=?, functional=?, x=?, y=?, z=?, last_observed_at=?, created_at=?, updated_at=? WHERE id=?`, scumVehicleUpdateArgs(value)...)
if err != nil {
return fmt.Errorf("update scum_vehicle: %w", err)
}
@@ -754,7 +772,7 @@ func scumUserUpdateArgs(value domain.SCUMUser) []any {
func scumVehicleArgs(value domain.SCUMVehicle) []any {
return []any{
value.ID, value.ServerInstanceID, value.GameVehicleID, value.VehicleClass, value.DisplayName,
value.Exists, value.Locked, scumFloatValue(value.X), scumFloatValue(value.Y), scumFloatValue(value.Z),
value.Exists, value.Locked, value.Functional, scumFloatValue(value.X), scumFloatValue(value.Y), scumFloatValue(value.Z),
scumTimeValue(value.LastObservedAt), value.CreatedAt.UTC(), value.UpdatedAt.UTC(),
}
}
@@ -807,7 +825,7 @@ func scanSCUMVehicle(scanner scumRowScanner) (domain.SCUMVehicle, error) {
)
err := scanner.Scan(
&value.ID, &value.ServerInstanceID, &value.GameVehicleID, &value.VehicleClass, &value.DisplayName,
&value.Exists, &value.Locked, &x, &y, &z, &lastObservedAt, &value.CreatedAt, &value.UpdatedAt,
&value.Exists, &value.Locked, &value.Functional, &x, &y, &z, &lastObservedAt, &value.CreatedAt, &value.UpdatedAt,
)
if err != nil {
return domain.SCUMVehicle{}, err