70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package ingest
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
|
|
"git.sapphic.engineer/ps2.live/saerro-go/store"
|
|
"git.sapphic.engineer/ps2.live/saerro-go/types"
|
|
)
|
|
|
|
type IIngest interface {
|
|
TrackPop(context.Context, types.PopEvent)
|
|
}
|
|
|
|
type Ingest struct {
|
|
PlayerStore store.IPlayerStore
|
|
VehicleStore store.IVehicleStore
|
|
}
|
|
|
|
func (i *Ingest) TrackPop(ctx context.Context, event types.PopEvent) {
|
|
player := event.ToPlayer()
|
|
|
|
err := i.fixupPlayer(ctx, player)
|
|
if err != nil {
|
|
// log.Println("ingest: player fixup failed, dropping event", err)
|
|
return
|
|
}
|
|
|
|
err = i.PlayerStore.Insert(ctx, player)
|
|
if err != nil {
|
|
log.Println("TrackPop Insert failed", err)
|
|
}
|
|
|
|
if event.VehicleName == "unknown" {
|
|
return
|
|
}
|
|
|
|
vehicle := event.ToVehicle()
|
|
err = i.VehicleStore.Insert(ctx, vehicle)
|
|
if err != nil {
|
|
log.Println("TrackVehicle Insert failed", err)
|
|
}
|
|
}
|
|
|
|
func (i *Ingest) fixupPlayer(ctx context.Context, player *types.Player) error {
|
|
if player.ClassName != "unknown" && player.FactionID != 0 {
|
|
// all fixups are done
|
|
return nil
|
|
}
|
|
|
|
storedPlayer, err := i.PlayerStore.GetOne(ctx, player.CharacterID)
|
|
if err != nil {
|
|
return fmt.Errorf("ingest: fixupPlayer: fetching player %s failed: %w", player.CharacterID, err)
|
|
}
|
|
|
|
// probably VehicleDestroy
|
|
if player.ClassName == "unknown" {
|
|
// TODO: maybe get this from census, profile_id
|
|
player.ClassName = storedPlayer.ClassName
|
|
}
|
|
|
|
// probably PS4
|
|
if player.FactionID == 0 {
|
|
// TODO: get this from census
|
|
player.FactionID = storedPlayer.FactionID
|
|
}
|
|
|
|
return nil
|
|
}
|