package transport import ( "slices" "time" "gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/models/db" "gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/models/json" "gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/requests" "gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/types" ) func (tr *FoundryTransport) FillDBWithFoundryData() { now := time.Now() setupExist, err := db.HasSetup(tr.DB) if err != nil { tr.ReadChan.Err() <- &types.FoundryError{Direction: types.WriterCode, Err: err, Type: types.DbCode} return } if !setupExist { err := tr.InsertSetupToDB() if err != nil { tr.ReadChan.Err() <- &types.FoundryError{Direction: types.WriterCode, Err: err, Type: types.DbCode} return } } err = tr.InitWorldsData() if err != nil { tr.ReadChan.Err() <- &types.FoundryError{Direction: types.WriterCode, Err: err, Type: types.DbCode} return } tr.Logger.Info("Initialization has been successful", "elapsed_time", time.Since(now).String()) } func (tr *FoundryTransport) InsertSetupToDB() error { msgJson, err := tr.GetJsonDataByType(requests.SetupPath) if err != nil { return err } foundryStateJson, err := json.ParseSetup(msgJson) if err != nil { return err } tr.Logger.Info("Setup data received") var foundryStateDb db.Setup foundryStateJson.ToDB(&foundryStateDb) err = foundryStateDb.Insert(tr.DB) if err != nil { return err } return nil } func (tr *FoundryTransport) InitWorldsData() error { worldNames, err := db.GetNotStartedWorlds(tr.DB) if err != nil { return err } for i := range tr.InitWorlds { initWorld := tr.InitWorlds[i] if !slices.Contains(worldNames, initWorld) { tr.Logger.Warn("World name does not exist in database or have been already inserted. Skip!", "world_name", initWorld) continue } err = tr.InitWorldData(initWorld) if err != nil { return err } _, err := tr.Http.PostReturnToSetup() if err != nil { return err } } return nil } func (tr *FoundryTransport) InitWorldData(worldName string) error { tr.Logger.Debug("Launching world...", "world_name", worldName) err := tr.LaunchWorld(worldName) if err != nil { return err } err = tr.ConnectToWorld() if err != nil { return err } return tr.InsertGameToDB() } func (tr *FoundryTransport) InsertGameToDB() error { msgJson, err := tr.GetJsonData("world") if err != nil { return err } game, err := json.ParseGame(msgJson) if err != nil { return err } var gameDb db.Game game.ToDB(&gameDb) isInserted, err := db.IsWorldInserted(tr.DB, game.World.ID) if err != nil { return err } if isInserted { return nil } tr.Logger.Info("Game data received", "world_name", game.World.ID) err = gameDb.Insert(tr.DB) if err != nil { return err } tr.Logger.Info("Game data inserted to DB", "world_name", game.World.ID) return nil }