2022-02-17 11:22:38 +00:00

160 lines
4.0 KiB
Lua

local settings = {}
ChangedProfile = false
function init()
connect(g_game, {
onGameStart = online,
onGameEnd = offline
})
end
function terminate()
disconnect(g_game, {
onGameStart = online,
onGameEnd = offline
})
end
-- loads settings on character login
function online()
ChangedProfile = false
-- startup arguments has higher priority than settings
local index = getProfileFromStartupArgument()
if index then
setProfileOption(index)
end
load()
if not index then
setProfileOption(getProfileFromSettings() or 1)
end
-- create main settings dir
if not g_resources.directoryExists("/settings/") then
g_resources.makeDir("/settings/")
end
-- create profiles dirs
for i=1,10 do
local path = "/settings/profile_"..i
if not g_resources.directoryExists(path) then
g_resources.makeDir(path)
end
end
end
function setProfileOption(index)
local currentProfile = g_settings.getNumber('profile')
currentProfile = tostring(currentProfile)
index = tostring(index)
if currentProfile ~= index then
ChangedProfile = true
return modules.client_options.setOption('profile', index)
end
end
-- load profile number from settings
function getProfileFromSettings()
-- settings should save per character, return if not online
if not g_game.isOnline() then return end
local index = g_game.getCharacterName()
local savedData = settings[index]
return savedData
end
-- option to launch client with hardcoded profile
function getProfileFromStartupArgument()
local startupOptions = string.split(g_app.getStartupOptions(), " ")
if #startupOptions < 2 then
return false
end
for index, option in ipairs(startupOptions) do
if option == "--profile" then
local profileIndex = startupOptions[index + 1]
if profileIndex == nil then
return g_logger.info("Startup arguments incomplete: missing profile index.")
end
g_logger.info("Startup options: Forced profile: "..profileIndex)
-- set value in options
return profileIndex
end
end
return false
end
-- returns string path ie. "/settings/1/actionbar.json"
function getSettingsFilePath(fileNameWithFormat)
local currentProfile = g_settings.getNumber('profile')
return "/settings/profile_"..currentProfile.."/"..fileNameWithFormat
end
function offline()
onProfileChange(true)
end
-- profile change callback (called in options), saves settings & reloads given module configs
function onProfileChange(offline)
if not offline then
if not g_game.isOnline() then return end
-- had to apply some delay
scheduleEvent(collectiveReload, 100)
end
local currentProfile = g_settings.getNumber('profile')
local index = g_game.getCharacterName()
if index then
settings[index] = currentProfile
save()
end
end
-- collection of refresh functions from different modules
function collectiveReload()
modules.game_topbar.refresh(true)
modules.game_actionbar.refresh(true)
modules.game_bot.refresh()
end
-- json handlers
function load()
local file = "/settings/profiles.json"
if g_resources.fileExists(file) then
local status, result = pcall(function()
return json.decode(g_resources.readFileContents(file))
end)
if not status then
return onError(
"Error while reading profiles file. To fix this problem you can delete storage.json. Details: " ..
result)
end
settings = result
end
end
function save()
local file = "/settings/profiles.json"
local status, result = pcall(function() return json.encode(settings, 2) end)
if not status then
return onError(
"Error while saving profile settings. Data won't be saved. Details: " ..
result)
end
if result:len() > 100 * 1024 * 1024 then
return onError(
"Something went wrong, file is above 100MB, won't be saved")
end
g_resources.writeFileContents(file, result)
end