Files
sky_phone-sky-systems/sky_phone/source/shared/sim_number.lua
T
Leon.Schmidt 25c8adb737 FIX - support configurable company service numbers
Company service lines were validated as full-length SIM numbers, which rejected short configured numbers such as 911 and stopped dependent server modules from initializing.

Accept non-empty service numbers up to the configured SIM length, resolve configured service lines before direct SIM dialing for phone and payphone calls, and load Companies and SIM before Phone. Add focused normalization boundary tests.
2026-08-14 21:24:35 +02:00

71 lines
2.0 KiB
Lua

SkyPhoneSimNumber = {}
function SkyPhoneSimNumber.Normalize(value, length, prefix)
if type(value) ~= "string" and type(value) ~= "number" then
return nil
end
local number = tostring(value):gsub("%D", "")
if #number ~= length or number:sub(1, #prefix) ~= prefix then
return nil
end
return number
end
function SkyPhoneSimNumber.NormalizeService(value, maximum_length)
if type(value) ~= "string" and type(value) ~= "number" then
return nil
end
local number = tostring(value):gsub("%D", "")
if number == "" or #number > maximum_length then
return nil
end
return number
end
function SkyPhoneSimNumber.FromEntropy(entropy, length, prefix)
if type(entropy) ~= "string" or entropy == "" then
return nil
end
local source = entropy:gsub("%D", "")
if source == "" then
return nil
end
local number = prefix
local index = 1
while #number < length do
number = number .. source:sub(index, index)
index = index + 1
if index > #source and #number < length then
index = 1
end
end
return number
end
function SkyPhoneSimNumber.Format(value, groups, length, prefix)
local number = SkyPhoneSimNumber.Normalize(value, length, prefix)
if not number then
return tostring(value or "")
end
local formatted = {}
local offset = 1
for _, group_length in ipairs(groups) do
formatted[#formatted + 1] = number:sub(offset, offset + group_length - 1)
offset = offset + group_length
end
if offset <= #number then
formatted[#formatted + 1] = number:sub(offset)
end
return table.concat(formatted, " ")
end
function SkyPhoneSimNumber.Reserve(entropy, accept, length, prefix)
for _ = 1, 20 do
local candidate = SkyPhoneSimNumber.FromEntropy(entropy(), length, prefix)
if candidate and accept(candidate) then
return candidate
end
end
return nil
end