diff --git a/main.go b/main.go index 88b0eac..a220bc2 100644 --- a/main.go +++ b/main.go @@ -74,7 +74,7 @@ func main() { wg.Add(1) // We can save the achievements to the database while doing something else unrelated go saveAchievementsToDB(&db, achievements) - + saveAchievementsToSourceFiles(luaStates, achievements) wg.Wait() // --- Pass 1: Extract all data --- @@ -147,6 +147,66 @@ func main() { // logger.Info("All NSQ workers finished. Program complete.") } +func saveAchievementsToSourceFiles(luaStates *sync.Map, achievements *sync.Map) { + wg := sync.WaitGroup{} + luaStates.Range(func(k, v any) bool { + path := k.(string) + state := v.(*lua.LState) + log := logger.Default.WithPrefix(path) + + log.Info("Clearing existing achievements") + achievementTable := state.GetGlobal("Heimdall_Achievements") + if achievementTable.Type() != lua.LTTable { + achievementTable = &lua.LTable{} + state.SetGlobal("Heimdall_Achievements", achievementTable) + } + log.Info("Clearing existing players table") + emptyTable := &lua.LTable{} + state.SetField(achievementTable, "players", emptyTable) + + log.Info("Updating seen table") + seenTable := state.GetField(achievementTable, "alreadySeen") + if seenTable.Type() != lua.LTTable { + seenTable = &lua.LTable{} + state.SetField(achievementTable, "alreadySeen", seenTable) + } + + wg.Add(1) + go func() { + defer wg.Done() + updateSeenTable(state, seenTable, achievements, log) + // State itself should now be updated + }() + + writeToSource(path, state) + + return true + }) + wg.Wait() +} + +func writeToSource(path string, state *lua.LState) { + +} + +func updateSeenTable(state *lua.LState, seenTable lua.LValue, achievements *sync.Map, log *logger.Logger) { + achievements.Range(func(k, v any) bool { + playerName := k.(string) + state.SetField(seenTable, playerName, lua.LBool(true)) + return true + }) + + // Debug confirmation + // seenTableLua, ok := seenTable.(*lua.LTable) + // if !ok { + // log.Error("seenTable is not a table") + // return + // } + // state.ForEach(seenTableLua, func(k, v lua.LValue) { + // log.Info("Seen: %s", k) + // }) +} + func saveAchievementsToDB(db *DB, achievements *sync.Map) { achievements.Range(func(k, v any) bool { playerName := k.(string)