mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-29 20:01:35 +00:00
734f4651cb
Co-authored-by: DerEchteAlec <alec.schitzkat@luwan.io>
76 lines
2.6 KiB
Lua
76 lines
2.6 KiB
Lua
Bridge.Housing = {
|
|
ClientProviders = {},
|
|
}
|
|
|
|
function Bridge.Housing.RegisterClientProvider(name, provider)
|
|
assert(type(name) == "string" and name ~= "", "Housing provider name must be a non-empty string")
|
|
assert(type(provider) == "table" and type(provider.execute) == "function", "Housing client provider must implement execute")
|
|
assert(
|
|
provider.enrich_overview == nil or type(provider.enrich_overview) == "function",
|
|
"Housing client provider enrich_overview must be a function"
|
|
)
|
|
assert(not Bridge.Housing.ClientProviders[name], ("Housing client provider '%s' is already registered"):format(name))
|
|
Bridge.Housing.ClientProviders[name] = provider
|
|
end
|
|
|
|
function Bridge.Housing.EnrichOverview(provider_name, properties)
|
|
if type(properties) ~= "table" then
|
|
return nil, "invalid_overview"
|
|
end
|
|
local provider = Bridge.Housing.ClientProviders[provider_name]
|
|
if not provider or type(provider.enrich_overview) ~= "function" then
|
|
return properties
|
|
end
|
|
|
|
local success, enriched, error_code = pcall(provider.enrich_overview, properties)
|
|
if not success then
|
|
Bridge.Debug(
|
|
"error",
|
|
"[sky_phone] Housing provider '%s' overview enrichment failed: %s",
|
|
tostring(provider_name),
|
|
tostring(enriched)
|
|
)
|
|
return properties
|
|
end
|
|
if type(enriched) ~= "table" then
|
|
Bridge.Debug(
|
|
"error",
|
|
"[sky_phone] Housing provider '%s' returned invalid overview enrichment: %s",
|
|
tostring(provider_name),
|
|
tostring(error_code or enriched)
|
|
)
|
|
return properties
|
|
end
|
|
|
|
local entrances = {}
|
|
for _, property in ipairs(enriched) do
|
|
if type(property) == "table" and property.id ~= nil and entrances[property.id] == nil then
|
|
entrances[property.id] = Bridge.Normalize.Coordinates(property.entrance)
|
|
end
|
|
end
|
|
|
|
local result = {}
|
|
for _, property in ipairs(properties) do
|
|
local entrance = type(property) == "table" and entrances[property.id] or nil
|
|
if entrance then
|
|
local normalized = {}
|
|
for key, value in pairs(property) do
|
|
normalized[key] = value
|
|
end
|
|
normalized.entrance = entrance
|
|
result[#result + 1] = normalized
|
|
else
|
|
result[#result + 1] = property
|
|
end
|
|
end
|
|
return result
|
|
end
|
|
|
|
function Bridge.Housing.Execute(provider_name, action, data)
|
|
local provider = Bridge.Housing.ClientProviders[provider_name]
|
|
if not provider then
|
|
return false, "provider_unavailable"
|
|
end
|
|
return provider.execute(action, data)
|
|
end
|