Работа с конфигом \ Оптимизация \ Автосохранение

stool

Известный
Автор темы
371
306
Версия MoonLoader
Другое
Как можно обойтись без тонны референсов одной и той же переменной, но при этом иметь возможность нормально менять значения виджетов и сохранять всё сразу?
Я хочу сделать адекватное автосохранение конфига, но для этого приходится вписывать одну и ту же переменную 540 раз. Мне надо как-то вменяемо сравнивать старые значения с новыми (каждые n секунд), чтобы не вызывать сохранение конфига, убивая ссд, но я всё это дерьмо даже в таблицу не могу сложить, мозгов не хватает. Спасите х)

Используется cjson, jcfg (минифицированная версия из монетлоадера + кроссплатформ @osp_x)

Вот что сейчас насрано:

Lua:
local script_cfg     = "bizhelper"
local jcfg = jsoncfg()
local cfg = jcfg.load({
    settings = {
        thres_distance  = 10000,
        thres_profit    = 1000000,
        sort_blacklist  = "",
        list_vis        = true,
        sortby_radio    = 0,
        order_radio     = 0
    },
}, script_cfg)

local thres_distance = imgui.new.int(cfg.settings.thres_distance)
local thres_profit   = imgui.new.int(cfg.settings.thres_profit)
local sort_blacklist = imgui.new.char[512](u8:encode(cfg.settings.sort_blacklist))
local sortby_radio = imgui.new.int(cfg.settings.sortby_radio)
local order_radio = imgui.new.int(cfg.settings.order_radio)

function cfgsave()
    cfg.settings.thres_distance = thres_distance[0]
    cfg.settings.thres_profit = thres_profit[0]
    cfg.settings.sort_blacklist = ffi.string(sort_blacklist)
    cfg.settings.list_vis = list_vis[0]
    cfg.settings.sortby_radio = sortby_radio[0]
    cfg.settings.order_radio = order_radio[0]
    jcfg.save(cfg, script_cfg)
    print("saved config")
end

function autoSaveSettings()
    while true do
        cfgsave()
        wait(5000)
    end
end

function main()
    lua_thread.create(autoSaveSettings)
end

local _ = imgui.OnFrame(function () return true end, function (self)
    imgui.Begin("test")
        imgui.SliderInt(u8'Дистанция (м)', thres_distance, 50, 10000)
    imgui.End()
end)
 
  • Нравится
Реакции: Wasta

stool

Известный
Автор темы
371
306
Lua:
local cfg = {
    a = 1
}
local cfgProxy = setmetatable({}, {
    __newindex = function(self, k, v)
        if (cfg[k] ~= v) then
            cfg[k] = v;
            print('cfg.save()');
        end          
    end
})
print('a =', cfg.a)
cfgProxy.a = 2
print('a =', cfg.a)
не понимаю как использовать
 
  • Нравится
Реакции: Wasta

stool

Известный
Автор темы
371
306
На 8 строке принт замени нк сохранение, потом меняй значение не в cfg, а в cfgProxy
сделал так

Lua:
local jcfg = jsoncfg()
local _cfg = jcfg.load({
    settings = {
        thres_distance  = 10000,
        thres_profit    = 1000000,
        sort_blacklist  = "",
        list_vis        = true,
        sortby_radio    = 0,
        order_radio     = 0,
        l_short_dist    = false,
        l_s_dist_dec    = 1,
        l_short_prof    = false,
        l_s_prof_dec    = 1,
        l_show_regio    = true
    },
}, script_cfg)

local cfg = setmetatable({}, {
    __newindex = function(self, k, v)
        if (_cfg[k] ~= v) then
            _cfg[k] = v;
            print('cfg.save()')
            cfg.save()
        end           
    end
})

local thres_distance = imgui.new.int(cfg.settings.thres_distance)

выделенная строка вызывает ошибку
Код:
attempt to index field 'settings' (a nil value)
чтобы не сломать весь код, я поменял название cfg на _cfg, а cfgProxy на cfg
 
  • Нравится
Реакции: Wasta

wojciech?

Известный
Проверенный
349
230
выделенная строка вызывает ошибку
Ты пытаешься индексировать пустую таблицу cfg, от чего и возникает ошибка. К тому же, такой метод проксирования не скажет тебе, когда ты изменил значения в settings, поскольку она вложена в _cfg и не имеет тех же метаметодов. Поэтому для каждой вложенной таблицы нужно устанавливать свою метатаблицу:

Lua:
function createProxyTable(original)
    local mt = {
        __index = function(t, k)
            print(("get [%s] from %s"):format(k, t.__original))
            return t.__original[k]
        end,

        __newindex = function(t, k, v)
            if t.__original[k] ~= v then
                print(("set %s [%s]: %s"):format(t.__original, k, v))
                t.__original[k] = v
                -- save
            else
                print("attempt to set the same value")
            end
        end
    }

    local t = { __original = original }

    for k, v in pairs(original) do
        if type(v) == "table" then
            t[k] = createProxyTable(v)
        end
    end

    return setmetatable(t, mt)
end

local cfg = {
    data = {
        a = 1,
        b = "2",
        c = { 5, 6, 7 }
    }
}

local _cfg = createProxyTable(cfg)

_cfg.status = false -- set table: 0x0118ac58 [status]: false

_cfg.data.a = 1 -- attempt to set the same value
_cfg.data.a = 5 -- set table: 0x0118acb8 [a]: 5
print(cfg.data.a) -- 5

_cfg.data.c[2] = 6 -- attempt to set the same value
_cfg.data.c[2] = 8 -- set table: 0x0118ad48 [2]: 8
print(cfg.data.c[2]) -- 8
 
Последнее редактирование:
  • Нравится
Реакции: chapo