mail/util/normalize.lua

82 lines
2.6 KiB
Lua
Raw Normal View History

-- translation
local S = mail.S
local function recursive_expand_recipient_names(sender, list, is_toplevel, recipients, undeliverable)
for _, name in ipairs(list) do
if not (recipients[name] or undeliverable[name] or (name == sender and not is_toplevel)) then
local succ, value
for _, handler in ipairs(mail.registered_recipient_handlers) do
succ, value = handler(sender, name)
if succ ~= nil then
break
end
end
local vtp = type(value)
if succ then
if vtp == "string" then
recursive_expand_recipient_names(sender, {value}, is_toplevel, recipients, undeliverable)
elseif vtp == "table" then
recursive_expand_recipient_names(sender, value, false, recipients, undeliverable)
elseif vtp == "function" then
recipients[name] = value
else
undeliverable[name] = S("The method of delivery to @1 is invalid.", name)
end
elseif succ == nil then
undeliverable[name] = S("The recipient @1 could not be identified.", name)
else
local reason = tostring(value) or S("@1 rejected your mail.", name)
undeliverable[name] = reason
end
end
end
end
--[[
return the field normalized (comma separated, single space)
and add individual player names to recipient list
--]]
function mail.normalize_players_and_add_recipients(sender, field, recipients, undeliverable)
local order = mail.parse_player_list(field)
recursive_expand_recipient_names(sender, order, true, recipients, undeliverable)
return mail.concat_player_list(order)
end
function mail.parse_player_list(field)
if not field then
return {}
end
local separator = ",%s"
local pattern = "([^" .. separator .. "]+)"
-- get individual players
local order = {}
for name in field:gmatch(pattern) do
table.insert(order, name)
end
return order
end
function mail.concat_player_list(order)
-- turn list of players back into normalized string
if order == nil or #order == 0 then
return ""
end
return table.concat(order, ", ")
end
function mail.player_in_list(name, list)
list = list or {}
if type(list) == "string" then
list = mail.parse_player_list(list)
end
for _, player_name in pairs(list) do
if name == player_name then
return true
end
end
return false
end