ws and pruner done!!!
This commit is contained in:
parent
c5cc245e25
commit
74add408e6
34 changed files with 1455 additions and 221 deletions
74
cmd/ws/eventhandler/event_handler.go
Normal file
74
cmd/ws/eventhandler/event_handler.go
Normal file
|
@ -0,0 +1,74 @@
|
|||
package eventhandler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
|
||||
"github.com/genudine/saerro-go/cmd/ws/ingest"
|
||||
"github.com/genudine/saerro-go/store"
|
||||
"github.com/genudine/saerro-go/types"
|
||||
)
|
||||
|
||||
type EventHandler struct {
|
||||
Ingest *ingest.Ingest
|
||||
}
|
||||
|
||||
func NewEventHandler(db *sql.DB) EventHandler {
|
||||
return EventHandler{
|
||||
Ingest: &ingest.Ingest{
|
||||
PlayerStore: store.NewPlayerStore(db),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (eh *EventHandler) HandleEvent(ctx context.Context, event types.ESSEvent) {
|
||||
if event.EventName == "" {
|
||||
// log.Println("invalid event; dropping")
|
||||
return
|
||||
}
|
||||
|
||||
if event.EventName == "Death" || event.EventName == "VehicleDestroy" {
|
||||
go eh.HandleDeath(ctx, event)
|
||||
} else if event.EventName == "GainExperience" {
|
||||
go eh.HandleExperience(ctx, event)
|
||||
}
|
||||
|
||||
go eh.HandleAnalytics(ctx, event)
|
||||
}
|
||||
|
||||
func (eh *EventHandler) HandleDeath(ctx context.Context, event types.ESSEvent) {
|
||||
if event.CharacterID != "" && event.CharacterID != "0" {
|
||||
// log.Println("got pop event")
|
||||
pe := types.PopEventFromESSEvent(event, false)
|
||||
eh.Ingest.TrackPop(ctx, pe)
|
||||
}
|
||||
|
||||
if event.AttackerCharacterID != "" && event.AttackerCharacterID != "0" && event.AttackerTeamID != 0 {
|
||||
pe := types.PopEventFromESSEvent(event, true)
|
||||
// fmt.Println("got attacker pop event", event)
|
||||
eh.Ingest.TrackPop(ctx, pe)
|
||||
}
|
||||
}
|
||||
|
||||
func (eh *EventHandler) HandleExperience(ctx context.Context, event types.ESSEvent) {
|
||||
// Detect specific vehicles via related experience IDs
|
||||
vehicleID := ""
|
||||
switch event.ExperienceID {
|
||||
case 201: // Galaxy Spawn Bonus
|
||||
vehicleID = "11"
|
||||
case 233: // Sunderer Spawn Bonus
|
||||
vehicleID = "2"
|
||||
case 674:
|
||||
fallthrough // ANT stuff
|
||||
case 675:
|
||||
vehicleID = "160"
|
||||
}
|
||||
|
||||
event.VehicleID = vehicleID
|
||||
pe := types.PopEventFromESSEvent(event, false)
|
||||
eh.Ingest.TrackPop(ctx, pe)
|
||||
}
|
||||
|
||||
func (eh *EventHandler) HandleAnalytics(ctx context.Context, event types.ESSEvent) {
|
||||
|
||||
}
|
144
cmd/ws/eventhandler/event_handler_test.go
Normal file
144
cmd/ws/eventhandler/event_handler_test.go
Normal file
|
@ -0,0 +1,144 @@
|
|||
package eventhandler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/avast/retry-go"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/genudine/saerro-go/cmd/ws/ingest"
|
||||
"github.com/genudine/saerro-go/store"
|
||||
"github.com/genudine/saerro-go/translators"
|
||||
"github.com/genudine/saerro-go/types"
|
||||
"github.com/genudine/saerro-go/util/testutil"
|
||||
)
|
||||
|
||||
func getEventHandlerTestShim(t *testing.T) (EventHandler, context.Context) {
|
||||
t.Helper()
|
||||
|
||||
db := testutil.GetTestDB(t)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*15)
|
||||
t.Cleanup(cancel)
|
||||
|
||||
return EventHandler{
|
||||
Ingest: &ingest.Ingest{
|
||||
PlayerStore: store.NewPlayerStore(db),
|
||||
},
|
||||
}, ctx
|
||||
}
|
||||
|
||||
func TestHandleDeath(t *testing.T) {
|
||||
eh, ctx := getEventHandlerTestShim(t)
|
||||
|
||||
event := types.ESSEvent{
|
||||
EventName: "Death",
|
||||
WorldID: 17,
|
||||
ZoneID: 2,
|
||||
|
||||
CharacterID: "LyytisDoll",
|
||||
LoadoutID: 3,
|
||||
TeamID: types.NC,
|
||||
|
||||
AttackerCharacterID: "Lyyti",
|
||||
AttackerLoadoutID: 3,
|
||||
AttackerTeamID: types.TR,
|
||||
}
|
||||
|
||||
eh.HandleDeath(ctx, event)
|
||||
|
||||
player1, err := eh.Ingest.PlayerStore.GetOne(ctx, event.CharacterID)
|
||||
assert.NoError(t, err, "player1 fetch failed")
|
||||
assert.Equal(t, event.CharacterID, player1.CharacterID)
|
||||
assert.Equal(t, string(translators.ClassFromLoadout(event.LoadoutID)), player1.ClassName)
|
||||
|
||||
player2, err := eh.Ingest.PlayerStore.GetOne(ctx, event.AttackerCharacterID)
|
||||
assert.NoError(t, err, "player2 fetch failed")
|
||||
assert.Equal(t, event.AttackerCharacterID, player2.CharacterID)
|
||||
assert.Equal(t, string(translators.ClassFromLoadout(event.AttackerLoadoutID)), player2.ClassName)
|
||||
}
|
||||
|
||||
func TestHandleExperience(t *testing.T) {
|
||||
eh, ctx := getEventHandlerTestShim(t)
|
||||
|
||||
event := types.ESSEvent{
|
||||
EventName: "GainExperience",
|
||||
WorldID: 17,
|
||||
ZoneID: 2,
|
||||
|
||||
CharacterID: "LyytisDoll",
|
||||
LoadoutID: 3,
|
||||
TeamID: types.NC,
|
||||
|
||||
ExperienceID: 674,
|
||||
}
|
||||
|
||||
eh.HandleExperience(ctx, event)
|
||||
player, err := eh.Ingest.PlayerStore.GetOne(ctx, event.CharacterID)
|
||||
assert.NoError(t, err, "player fetch check failed")
|
||||
assert.Equal(t, event.CharacterID, player.CharacterID)
|
||||
assert.Equal(t, string(translators.ClassFromLoadout(event.LoadoutID)), player.ClassName)
|
||||
}
|
||||
|
||||
func TestHandleAnalytics(t *testing.T) {
|
||||
eh, ctx := getEventHandlerTestShim(t)
|
||||
event := types.ESSEvent{
|
||||
EventName: "GainExperience",
|
||||
WorldID: 17,
|
||||
ZoneID: 2,
|
||||
|
||||
CharacterID: "LyytisDoll",
|
||||
LoadoutID: 3,
|
||||
TeamID: types.NC,
|
||||
|
||||
ExperienceID: 674,
|
||||
}
|
||||
|
||||
eh.HandleAnalytics(ctx, event)
|
||||
}
|
||||
|
||||
func TestHandleEvent(t *testing.T) {
|
||||
eh, ctx := getEventHandlerTestShim(t)
|
||||
|
||||
events := []types.ESSEvent{
|
||||
{
|
||||
EventName: "Death",
|
||||
WorldID: 17,
|
||||
ZoneID: 2,
|
||||
|
||||
CharacterID: "LyytisDoll",
|
||||
LoadoutID: 3,
|
||||
TeamID: types.NC,
|
||||
|
||||
AttackerCharacterID: "Lyyti",
|
||||
AttackerLoadoutID: 3,
|
||||
AttackerTeamID: types.TR,
|
||||
},
|
||||
{
|
||||
EventName: "GainExperience",
|
||||
WorldID: 17,
|
||||
ZoneID: 2,
|
||||
|
||||
CharacterID: "DollNC",
|
||||
LoadoutID: 3,
|
||||
TeamID: types.NC,
|
||||
|
||||
ExperienceID: 201,
|
||||
},
|
||||
}
|
||||
|
||||
for _, event := range events {
|
||||
eh.HandleEvent(ctx, event)
|
||||
}
|
||||
|
||||
checkPlayers := []string{"LyytisDoll", "Lyyti", "DollNC"}
|
||||
for _, id := range checkPlayers {
|
||||
// eventual consistency <333
|
||||
err := retry.Do(func() error {
|
||||
_, err := eh.Ingest.PlayerStore.GetOne(ctx, id)
|
||||
return err
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue