finish world initialization, set up init on startup and on shutdown, move all models to main directory

This commit is contained in:
lbenedar
2026-04-24 18:04:35 +03:00
parent 07025afefc
commit fd65631be1
125 changed files with 1534 additions and 2802 deletions

View File

@@ -1,37 +1,39 @@
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/temp_models/db"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/temp_models/json"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/types"
)
func (tr *FoundryTransport) FillDBWithFoundryData() {
err := tr.InitSetupData()
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
}
// idState, err := tr.Models.FoundryState.GetIdByType(db.SetupState)
// 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
}
}
func (tr *FoundryTransport) InitSetupData() error {
db.DeleteAll(tr.DB)
db.DeleteAllSeq(tr.DB)
return tr.InsertSetupToDB()
tr.Logger.Info("Initialization has been successful", "elapsed_time", time.Since(now).String())
}
func (tr *FoundryTransport) InsertSetupToDB() error {
@@ -57,11 +59,23 @@ func (tr *FoundryTransport) InsertSetupToDB() error {
}
func (tr *FoundryTransport) InitWorldsData() error {
worlds := []string{"kingmaker"} //TODO: get world name from database
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
}
for i := range worlds {
worldName := worlds[i]
tr.InitWorldData(worldName)
_, err := tr.Http.PostReturnToSetup()
if err != nil {
return err
@@ -71,34 +85,48 @@ func (tr *FoundryTransport) InitWorldsData() error {
}
func (tr *FoundryTransport) InitWorldData(worldName string) error {
tr.Logger.Debug("World name", "name", worldName)
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 {
err := tr.ConnectToWorld()
if err != nil {
return err
}
msgJson, err := tr.GetJsonData("world")
if err != nil {
return err
}
tr.Logger.Info("Game data received")
gameJson, err := json.ParseGame(msgJson)
game, err := json.ParseGame(msgJson)
if err != nil {
return err
}
var foundryStateDb db.Game
gameJson.ToDB(&foundryStateDb)
var gameDb db.Game
game.ToDB(&gameDb)
return foundryStateDb.Insert(tr.DB)
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
}

View File

@@ -24,7 +24,7 @@ func (tr *FoundryTransport) LaunchWorld(worldName string) error {
select {
case <-tr.ExchangeChan.ProgressMsg[worldName]:
tr.Logger.Debug("World has been started(from GetInitialData)", "world", worldName)
tr.Logger.Debug("World has been launched(from GetInitialData)", "world", worldName)
case <-ctx.Done():
close(tr.ExchangeChan.ProgressMsg[worldName])
err := ctx.Err()

View File

@@ -27,13 +27,21 @@ type FoundryTransport struct {
IsLogin bool
// Models *db.Models
DB *sqlx.DB
IsDbInit bool
DB *sqlx.DB
IsDbInit bool
InitWorlds []string
Logger *slog.Logger
}
func NewFoundryTransport(dbConn *sqlx.DB, logger *slog.Logger, httpConfig *requests.FoundryHttpRequest) *FoundryTransport {
type FoundryTransportData struct {
DbConn *sqlx.DB
Logger *slog.Logger
HttpConfig *requests.FoundryHttpRequest
Worlds []string
}
func NewFoundryTransport(data *FoundryTransportData) *FoundryTransport {
return &FoundryTransport{
CurrWsId: 0,
ExchangeChan: types.ExchangeChannels{
@@ -41,17 +49,18 @@ func NewFoundryTransport(dbConn *sqlx.DB, logger *slog.Logger, httpConfig *reque
ProgressMsg: map[string]chan struct{}{},
},
Http: httpConfig,
Http: data.HttpConfig,
ReconnectTimeout: 500 * time.Millisecond,
IsAuth: false,
IsLogin: false,
ReconnectNumMax: 1,
ReconnectNum: 0,
DB: dbConn,
IsDbInit: false,
DB: data.DbConn,
IsDbInit: false,
InitWorlds: data.Worlds,
Logger: logger,
Logger: data.Logger,
}
}

View File

@@ -32,16 +32,11 @@ func (tr *FoundryTransport) InitWebSocketConnection() error {
dialer.ReadBufferSize = 128 * 1024 * 1024
dialer.WriteBufferSize = 128 * 1024 * 1024
wsConn, resp, err := dialer.Dial(u.String(), wsHeader)
wsConn, _, err := dialer.Dial(u.String(), wsHeader)
if err != nil {
return err
}
cookies := resp.Cookies()
for i := range cookies {
fmt.Printf("TEST%d: %v\n", i, cookies[i])
}
tr.WsConn = wsConn
tr.CurrWsId = 0
tr.Logger.Info("Successefully connected to Foundry Websocket")