Как сделать кастомизацию конфигураций?

deveeh

Новичок
Автор темы
22
6
Версия MoonLoader
.026-beta
Хочу реализовать кнопки "Добавить конфигурацию" и "Добавить строку, а идеи от слова совсем не лезут в голову...
буду благодарен тому, кто поможет

1682955083969.png
1682955131620.png
 

Lance_Sterling

Известный
803
284
это json
вот лучшая как по мне функция от @Vespan :
Lua:
json = {
    defPath = getWorkingDirectory()..'/config/',
    save = function(t,path)
        if not path:find('/') or not path:find('\\') then;  path = json.defPath..path end
        t = (t == nil and {} or (type(t) == 'table' and t or {}))
        local f = io.open(path,'w');    f:write(encodeJson(t) or {});   f:close()
    end,
    load = function(t,path)
        if not path:find('/') or not path:find('\\') then;  path = json.defPath..path end
        if not doesFileExist(path) then;    json.save(t,path);  end
        local f = io.open(path,'r+');   local T = decodeJson(f:read('*a')); f:close()
        return T
    end
}

так же гайд, но с другой функцией(которая больше)

по сути юзать легко, table.insert а потом json.save
 
  • Нравится
Реакции: Vespan и YarikVL

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,240
это json
вот лучшая как по мне функция от @Vespan :
Lua:
json = {
    defPath = getWorkingDirectory()..'/config/',
    save = function(t,path)
        if not path:find('/') or not path:find('\\') then;  path = json.defPath..path end
        t = (t == nil and {} or (type(t) == 'table' and t or {}))
        local f = io.open(path,'w');    f:write(encodeJson(t) or {});   f:close()
    end,
    load = function(t,path)
        if not path:find('/') or not path:find('\\') then;  path = json.defPath..path end
        if not doesFileExist(path) then;    json.save(t,path);  end
        local f = io.open(path,'r+');   local T = decodeJson(f:read('*a')); f:close()
        return T
    end
}

так же гайд, но с другой функцией(которая больше)

по сути юзать легко, table.insert а потом json.save
функция хуйня.
1. скрипт крашнется если не удастся открыть файл
2. скрипт крашнется если json кривой
3. я не уверен что он будет работать, так как ты не можешь получить значение из таблицы если функа находится в самой таблице (я про defPath)

вот функа которая по моему мнению лучше
Lua:
---@param file string json file path
---@param default table default value
---@return boolean isOk, table data, string message
function Json(file, default)
    assert(file)
    assert(default)

    local function fillEmptyKeys(default, current)
        local changedValues = 0
        for k, v in pairs(default) do
            if type(current[k]) == 'nil' then
                current[k] = v
                changedValues = changedValues + 1
            elseif type(current[k]) == 'table' and type(v) == 'table' then
                current, _changedValues = fillEmptyKeys(v, current[k])
                changedValues = changedValues + _changedValues
            end
        end
        return current, changedValues
    end

    local function save(data)
        local encodeStatus, JSON = pcall(encodeJson, data)
        if not encodeStatus or JSON == nil then
            return false, 'encode error'
        end
        local fileHandle = io.open(file, 'w')
        if not fileHandle then return false, 'cannot open file' end
        fileHandle:write(JSON)
        fileHandle:close()
    end

    local function load()
        if not doesFileExist(file) then
            save(default)
        end
        local fileHandle = io.open(file, 'r')
        if not fileHandle then return false, {}, 'cannot open file' end
        local content = fileHandle:read('*a')
        fileHandle:close()
        local decodeStatus, data = pcall(decodeJson, content)
        if not decodeStatus or data == nil then return false, {}, 'decode error' end

        local data, changedValues = fillEmptyKeys(default, data)
        if changedValues > 0 then save(data) end

        return decodeStatus, data, 'ok'
    end

    local loadStatus, data, msg = load()
    return loadStatus, loadStatus and setmetatable(data, {
        __call = function(self)
            save(self)
        end
    }) or {}, msg
end

Использование:
Lua:
local isOk, cfg = Json(getWorkingDirectory()..'\\mySettings.json', {
    myValue = 1,
    enabled = false
})

cfg.enabled = true -- изменяем значение
cfg() -- сохраняем конфиг
 
  • Ха-ха
Реакции: Vespan

Lance_Sterling

Известный
803
284
1. скрипт крашнется если не удастся открыть файл
разве не похую
2. скрипт крашнется если json кривой
нихуя, он выведет ошибку в print, а если уже будешь юзать json кривой в коде, тогда скрипт скажет иди нахуй
3. я не уверен что он будет работать, так как ты не можешь получить значение из таблицы если функа находится в самой таблице (я про defPath)
работает все заебись, и кода мало занимает, а то на весь экран функция нахуя? мы же не аризона тулс тут пришли делать
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,240
разве не похую
нет
нихуя, он выведет ошибку в print, а если уже будешь юзать json кривой в коде, тогда скрипт скажет иди нахуй
ошибку выведет, но вместо таблицы вернет nil
работает все заебись, и кода мало занимает, а то на весь экран функция нахуя? мы же не аризона тулс тут пришли делать
Хуевая логика не юзать функу из-за ее размера, по такой логике я могу сказать "ну храни жсон в инигфг, хули"
1682965852294.png


способ №1:
1682965971597.png

Спобос №2
Lua:
function Json(file, default);assert(file);assert(default);local function fillEmptyKeys(default, current);local changedValues = 0;for k, v in pairs(default) do;if type(current[k]) == 'nil' then;current[k] = v;changedValues = changedValues + 1;elseif type(current[k]) == 'table' and type(v) == 'table' then;current, _changedValues = fillEmptyKeys(v, current[k]);changedValues = changedValues + _changedValues;end;end;return current, changedValues;end;local function save(data);local encodeStatus, JSON = pcall(encodeJson, data);if not encodeStatus or JSON == nil then;return false, 'encode error';end;local fileHandle = io.open(file, 'w');if not fileHandle then return false, 'cannot open file' end;fileHandle:write(JSON);fileHandle:close();end;local function load();if not doesFileExist(file) then;save(default);end;local fileHandle = io.open(file, 'r');if not fileHandle then return false, {}, 'cannot open file' end;local content = fileHandle:read('*a');fileHandle:close();local decodeStatus, data = pcall(decodeJson, content);if not decodeStatus or data == nil then return false, {}, 'decode error' end;local data, changedValues = fillEmptyKeys(default, data);if changedValues > 0 then save(data) end;return decodeStatus, data, 'ok';end;local loadStatus, data, msg = load();return loadStatus, loadStatus and setmetatable(data, {__call = function(self) save(self) end}) or {}, msg end
 
Последнее редактирование:

Lance_Sterling

Известный
803
284
не всегда норм, при каждом открытии заново
спасибо что сделал это за меня

простой пример, ты же не будешь юзать функцию с 1000 строчек где можно использовать всего 100
 
Последнее редактирование: