668 lines
21 KiB
Lua

-------------------------------------------------------------------------------
---Description of the module.
---@class User
local User = {
---single-line comment
classname = "HMUser",
gui = "gui",
prefixe = "helmod",
version = "0.9.12",
tab_name = "HMProductionPanel",
delay_tips = 60*10
}
-------------------------------------------------------------------------------
---Get global variable for user
---@param key string
---@return any
function User.get(key)
if global["users"] == nil then
global["users"] = {}
end
local user_name = User.name()
if global["users"][user_name] == nil then
global["users"][user_name] = {}
end
if key ~= nil then
if global["users"][user_name][key] == nil then
global["users"][user_name][key] = {}
end
return global["users"][user_name][key]
end
return global["users"][user_name]
end
-------------------------------------------------------------------------------
---Get Name
---@return string
function User.name()
return Player.native().name or Player.native().index or "nil"
end
-------------------------------------------------------------------------------
---Return is admin player
---@return boolean
function User.isAdmin()
return Player.native().admin
end
-------------------------------------------------------------------------------
---Return is writer player
---@param model table
---@return boolean
function User.isReader(model)
return Player.isAdmin() or model.owner == Player.native().name or (model.share ~= nil and bit32.band(model.share, 1) > 0)
end
-------------------------------------------------------------------------------
---Return is writer player
---@param model table
---@return boolean
function User.isWriter(model)
return Player.isAdmin() or model.owner == Player.native().name or (model.share ~= nil and bit32.band(model.share, 2) > 0)
end
-------------------------------------------------------------------------------
---Return is writer player
---@param model table
---@return boolean
function User.isDeleter(model)
return Player.isAdmin() or model.owner == Player.native().name or (model.share ~= nil and bit32.band(model.share, 4) > 0)
end
-------------------------------------------------------------------------------
---Return is filter translate
---@return boolean
function User.isFilterTranslate()
return User.getModGlobalSetting("filter_translated_string_active") and (User.getParameter("filter-language") == nil or User.getParameter("filter-language") == "left")
end
-------------------------------------------------------------------------------
---Return is filter contain
---@return boolean
function User.isFilterContain()
return (User.getParameter("filter-contain") == nil or User.getParameter("filter-contain") == "left")
end
-------------------------------------------------------------------------------
---Get default settings
---@return table
function User.getDefaultSettings()
return {
display_pin_beacon = false,
display_pin_level = 4,
model_auto_compute = false,
model_loop_limit = 1000,
other_speed_panel=false,
filter_show_disable=true,
filter_show_hidden=false,
filter_show_hidden_player_crafting=true,
filter_show_lock_recipes=false
}
end
-------------------------------------------------------------------------------
---Get sorted style
---@param key string
---@return string
function User.getSortedStyle(key)
local user_order = User.getParameter()
if user_order == nil then user_order = User.setParameter("order", {name="index",ascendant="true"}) end
local style = "helmod_button-sorted-none"
if user_order.name == key and user_order.ascendant then style = "helmod_button-sorted-up" end
if user_order.name == key and not(user_order.ascendant) then style = "helmod_button-sorted-down" end
return style
end
-------------------------------------------------------------------------------
---Get parameter
---@param property string
---@return any
function User.getParameter(property)
local parameter = User.get("parameter")
if parameter ~= nil and property ~= nil then
return parameter[property]
end
return parameter
end
-------------------------------------------------------------------------------
---Get preference
---@param type string
---@param name string
---@return any
function User.getPreference(type, name)
local preferences = User.get("preferences")
if preferences ~= nil and type ~= nil then
if name ~= nil and name ~= "" then
local preference_name = string.format("%s_%s", type, name)
return preferences[preference_name]
else
return preferences[type]
end
end
return preferences
end
-------------------------------------------------------------------------------
---Get default factory
---@param recipe table
---@return any
function User.getDefaultFactory(recipe)
local default_factory = User.getParameter("default_factory")
local recipe_prototype = RecipePrototype(recipe)
local category = recipe_prototype:getCategory()
if category ~= nil and default_factory ~= nil and default_factory[category] ~= nil then
return default_factory[category]
end
return nil
end
-------------------------------------------------------------------------------
---Set default factory
---@param recipe table
function User.setDefaultFactory(recipe)
local default_factory = User.getParameter("default_factory") or {}
local recipe_prototype = RecipePrototype(recipe)
local category = recipe_prototype:getCategory()
local factory = recipe.factory
if category ~= nil then
local default_category = {name = factory.name, fuel = factory.fuel}
if factory.module_priority ~= nil then
default_category.module_priority = {}
for _, priority in pairs(factory.module_priority) do
table.insert(default_category.module_priority, {name = priority.name, value = priority.value})
end
end
default_factory[category] = default_category
User.setParameter("default_factory", default_factory)
end
end
-------------------------------------------------------------------------------
---Get default beacons
---@param recipe RecipeData
---@return {[uint] : BeaconData}
function User.getDefaultBeacons(recipe)
local default_beacons = User.getParameter("default_beacons")
local recipe_prototype = RecipePrototype(recipe)
local category = recipe_prototype:getCategory()
if category ~= nil and default_beacons ~= nil and default_beacons[category] ~= nil then
return default_beacons[category]
end
return nil
end
-------------------------------------------------------------------------------
---Get default beacons
---@param recipe RecipeData
---@return FactoryData
function User.getCurrentDefaultBeacon(recipe)
local default_beacons = User.getDefaultBeacons(recipe) or {}
local current_beacon_selection = User.getParameter("current_beacon_selection") or 1
return default_beacons[current_beacon_selection] or {}
end
-------------------------------------------------------------------------------
---Set default beacon
---@param recipe table
function User.setDefaultBeacons(recipe)
local default_beacons = User.getParameter("default_beacons") or {}
local recipe_prototype = RecipePrototype(recipe)
local category = recipe_prototype:getCategory()
local beacons = recipe.beacons
local default_category = {}
if category ~= nil then
for _, beacon in pairs(beacons) do
local default_beacon = {name = beacon.name, combo = beacon.combo, per_factory = beacon.per_factory, per_factory_constant = beacon.per_factory_constant}
if beacon.module_priority ~= nil then
default_beacon.module_priority = {}
for _, priority in pairs(beacon.module_priority) do
table.insert(default_beacon.module_priority, {name = priority.name, value = priority.value})
end
end
table.insert(default_category, default_beacon)
end
default_beacons[category] = default_category
User.setParameter("default_beacons", default_beacons)
end
end
-------------------------------------------------------------------------------
---Get version
---@return string
function User.getVersion()
local parameter = User.get()
return parameter["version"] or ""
end
-------------------------------------------------------------------------------
---Set version
---@return any
function User.setVersion()
local parameter = User.get()
parameter["version"] = User.version
return User.version
end
-------------------------------------------------------------------------------
---Set
---@param property string
---@param value any
---@return any
function User.set(property, value)
User.setVersion()
local parameter = User.get()
parameter[property] = value
return value
end
-------------------------------------------------------------------------------
---Set parameter
---@param property string
---@param value any
---@return nil
function User.setParameter(property, value)
if property == nil then
return nil
end
User.setVersion()
local parameter = User.get("parameter")
parameter[property] = value
return value
end
-------------------------------------------------------------------------------
---Create next event
---@param event table
---@param classname string
---@param method any
---@param index any
---@return table
function User.createNextEvent(event, classname, method, index)
if event == nil then
User.setParameter("next_event", nil)
local auto_pause = User.getParameter("auto-pause")
if not(game.is_multiplayer()) then
game.tick_paused = auto_pause
end
return {wait=false, method=method}
end
local index_name = string.format("index_%s",method)
event[index_name] = index
event.method = method
User.setParameter("next_event", {type_event=event.type, event=event, classname=classname})
game.tick_paused = false
return {wait=true, method=method}
end
-------------------------------------------------------------------------------
---Set preference
---@param type string
---@param name string
---@param value any
---@return any
function User.setPreference(type, name, value)
if type == nil then
return nil
end
User.setVersion()
local preferences = User.get("preferences")
if name == nil then
local preference = defines.constant.preferences[type]
if value == nil then
value = preference.default_value
end
if preference.minimum_value ~= nil and value < preference.minimum_value then
value = preference.default_value
end
if preference.maximum_value ~= nil and value > preference.maximum_value then
value = preference.default_value
end
preferences[type] = value
else
local preference_name = string.format("%s_%s", type, name)
preferences[preference_name] = value
end
return value
end
-------------------------------------------------------------------------------
---Get navigate
---@param property string
---@return table
function User.getNavigate(property)
local navigate = User.get("navigate")
if navigate ~= nil and property ~= nil then
return navigate[property]
elseif property ~= nil then
navigate[property] = {}
return navigate[property]
end
return navigate
end
-------------------------------------------------------------------------------
---Set navigate
---@param property string
---@param value any
---@return any
function User.setNavigate(property, value)
User.setVersion()
local navigate = User.get("navigate")
navigate[property] = value
return value
end
-------------------------------------------------------------------------------
---Get user settings
---@return table
function User.getSettings()
local data_user = User.get()
if data_user["settings"] == nil then
data_user["settings"] = User.getDefaultSettings()
end
return data_user["settings"]
end
-------------------------------------------------------------------------------
---Get user settings
---@param property string
---@return any
function User.getSetting(property)
local settings = User.getSettings()
if settings ~= nil and property ~= nil then
local value = settings[property]
if value == nil then
value = User.getDefaultSettings()[property]
end
return value
end
return settings
end
-------------------------------------------------------------------------------
---Set setting
---@param property string
---@param value any
---@return any
function User.setSetting(property, value)
User.setVersion()
local settings = User.get("settings")
settings[property] = value
return value
end
-------------------------------------------------------------------------------
---Get settings
---@param name string
---@return any
function User.getModSetting(name)
local property = nil
local property_name = string.format("%s_%s",User.prefixe,name)
if Player.native() ~= nil then
property = Player.native().mod_settings[property_name]
else
property = settings.global[property_name]
end
if property ~= nil then
return property.value
else
return defines.constant.settings_mod[name].default_value
end
end
-------------------------------------------------------------------------------
---Get settings
---@param name string
---@return any
function User.getModGlobalSetting(name)
local property = nil
local property_name = string.format("%s_%s",User.prefixe,name)
property = settings.global[property_name]
if property ~= nil then
return property.value
else
return defines.constant.settings_mod[name].default_value
end
end
-------------------------------------------------------------------------------
---Get preference settings
---@param type string
---@param name string
---@return any
function User.getPreferenceSetting(type, name)
local preference_type = User.getPreference(type)
if name == nil then
local preference = defines.constant.preferences[type]
if preference_type == nil then
return preference.default_value
end
if preference.minimum_value ~= nil and preference_type < preference.minimum_value then
return preference.default_value
end
if preference.maximum_value ~= nil and preference_type > preference.maximum_value then
return preference.default_value
end
return preference_type
end
if preference_type == nil then return false end
local preference_name = User.getPreference(type, name)
if preference_name ~= nil then
return preference_name
else
if defines.constant.preferences[type].items == nil or defines.constant.preferences[type].items[name] == nil then return false end
return defines.constant.preferences[type].items[name]
end
end
-------------------------------------------------------------------------------
---Reset global variable for user
function User.reset()
local user_name = User.name()
global["users"][user_name] = {}
end
-------------------------------------------------------------------------------
---Reset global variable for all user
function User.resetAll()
global["users"] = {}
end
-------------------------------------------------------------------------------
---Set Close Form
---@param classname string
---@param location table
function User.setCloseForm(classname, location)
local navigate = User.getNavigate()
if navigate[classname] == nil then navigate[classname] = {} end
navigate[classname]["open"] = false
if string.find(classname, "HMProductionPanel") then
game.tick_paused = false
end
navigate[classname]["location"] = location
navigate[classname]["tips"] = nil
end
-------------------------------------------------------------------------------
---Get location Form
---@param classname string
---@return table
function User.getLocationForm(classname)
local navigate = User.getNavigate()
if User.getPreferenceSetting("ui_glue") == true and User.getPreferenceSetting("ui_glue", classname) == true then
if navigate[User.tab_name] == nil or navigate[User.tab_name]["location"] == nil then return {x=50,y=50} end
return navigate[User.tab_name]["location"]
else
if navigate[classname] == nil or navigate[classname]["location"] == nil then return {x=200,y=100} end
return navigate[classname]["location"]
end
end
-------------------------------------------------------------------------------
---Set Active Form
---@param classname string
function User.setActiveForm(classname)
local navigate = User.getNavigate()
if User.getPreferenceSetting("ui_auto_close") == true then
if User.getPreferenceSetting("ui_auto_close", classname) == true then
for form_name,form in pairs(navigate) do
if Controller:getView(form_name) ~= nil and form_name ~= classname and User.getPreferenceSetting("ui_auto_close", form_name) == true then
Controller:getView(form_name):close()
end
end
end
end
if string.find(classname, "HMProductionPanel") then
if not(game.is_multiplayer()) and User.getParameter("auto-pause") then
game.tick_paused = true
else
game.tick_paused = false
end
end
if navigate[classname] == nil then navigate[classname] = {} end
navigate[classname]["open"] = true
end
-------------------------------------------------------------------------------
---Get main sizes
---@return number, number, number
function User.getMainSizes()
local width , height, scale = Player.getDisplaySizes()
local display_ratio_horizontal = User.getModSetting("display_ratio_horizontal")
local display_ratio_vertictal = User.getModSetting("display_ratio_vertical")
if type(width) == "number" and type(height) == "number" then
local width_main = math.ceil(width*display_ratio_horizontal)
local height_main = math.ceil(height*display_ratio_vertictal)
return width_main, height_main, scale
end
return 800, 600, scale
end
-------------------------------------------------------------------------------
---update
function User.update()
if User.getVersion() ~= User.version then
User.reset()
end
end
-------------------------------------------------------------------------------
---Add translate
---@param request table --{player_index=number, localised_string=#string, result=#string, translated=#boolean}
function User.addTranslate(request)
if request.translated == true then
local localised_string = request.localised_string
local string_translated = request.result
if type(localised_string) == "table" then
local localised_value = localised_string[1]
if localised_value ~= nil and localised_value ~= "" then
local _,key = string.match(localised_value,"([^.]*).([^.]*)")
if key ~= nil and key ~= "" then
local translated = User.get("translated")
translated[key] = string_translated
end
end
end
end
end
-------------------------------------------------------------------------------
---Is translate
---@return boolean
function User.isTranslate()
local translated = User.get("translated")
return translated ~= nil and table.size(translated) > 0
end
-------------------------------------------------------------------------------
---Get translate
---@param name string
---@return any
function User.getTranslate(name)
local translated = User.get("translated")
if translated == nil or translated[name] == nil then return name end
return translated[name]
end
-------------------------------------------------------------------------------
---Reset translate
function User.resetTranslate()
local data_user = User.get()
data_user["translated"] = {}
end
-------------------------------------------------------------------------------
---Return Cache User
---@param classname string
---@param name string
---@return table
function User.getCache(classname, name)
local data = User.get("cache")
if classname == nil and name == nil then return data end
if data[classname] == nil or data[classname][name] == nil then return nil end
return data[classname][name]
end
-------------------------------------------------------------------------------
---Set Cache User
---@param classname string
---@param name string
---@param value any
function User.setCache(classname, name, value)
local data = User.get("cache")
if data[classname] == nil then data[classname] = {} end
data[classname][name] = value
end
-------------------------------------------------------------------------------
---Has User Cache
---@param classname string
---@param name string
---@return boolean
function User.hasCache(classname, name)
local data = User.get("cache")
return data[classname] ~= nil and data[classname][name] ~= nil
end
-------------------------------------------------------------------------------
---Reset cache
---@param classname string
---@param name string
function User.resetCache(classname, name)
local data = User.get("cache")
if classname == nil and name == nil then
User.set("cache",{})
elseif data[classname] ~= nil and name == nil then
data[classname] = nil
elseif data[classname] ~= nil then
data[classname][name] = nil
end
end
-------------------------------------------------------------------------------
---Get Function Product Sorter
---@return function
function User.getProductSorter()
local display_product_order = User.getPreferenceSetting("display_product_order")
if display_product_order == "name" then
return function(t,a,b) return t[b].name > t[a].name end
elseif display_product_order == "cost" then
return function(t,a,b) return t[b].amount < t[a].amount end
end
return nil
end
-------------------------------------------------------------------------------
---Get Function Product Sorter
function User.setParameterObjects(classname, model_id, block_id, recipe_id)
local parameter_objects = string.format("%s_%s", classname, "objects")
User.setParameter(parameter_objects, {name=parameter_objects, model=model_id, block=block_id, recipe=recipe_id})
end
return User