127 lines
2.9 KiB
Lua
127 lines
2.9 KiB
Lua
--[[
|
|
Whiter List mod by Jordan Irwin (AntumDeluge)
|
|
License: MIT
|
|
|
|
Original Whitelist mod by ShadowNinja
|
|
License: WTFPL
|
|
--]]
|
|
|
|
local world_path = core.get_worldpath()
|
|
local admin = core.settings:get("name")
|
|
local whitelist = {}
|
|
|
|
local S = core.get_translator(core.get_current_modname())
|
|
|
|
-- Enabled by default
|
|
local enabled = core.settings:get_bool("whitelist.enable", true)
|
|
local deny_message = core.settings:get("whitelist.message") or "Server access is restricted to whitelisted players only."
|
|
deny_message = S(deny_message)
|
|
|
|
|
|
--- Loads whitelisted names into memory.
|
|
local function load_whitelist()
|
|
local file, err = io.open(world_path .. "/whitelist.txt", "r")
|
|
if err then return end
|
|
|
|
-- FIXME: error if "whitelist.txt" is a directory
|
|
|
|
-- reset for session in case names have been manually removed
|
|
whitelist = {}
|
|
|
|
for line in file:lines() do
|
|
-- ignore lines with whitespace only
|
|
if line:gsub("%s+", "") ~= "" then
|
|
whitelist[line] = true
|
|
end
|
|
end
|
|
|
|
file:close()
|
|
end
|
|
|
|
|
|
--- Writes whitelisted names to file.
|
|
local function save_whitelist()
|
|
local file, err = io.open(world_path .. "/whitelist.txt", "w")
|
|
if err then
|
|
core.log("error", S("Could not open whitelist file for writing: @1", err))
|
|
return
|
|
end
|
|
|
|
for item in pairs(whitelist) do
|
|
file:write(item .. "\n")
|
|
end
|
|
|
|
file:close()
|
|
end
|
|
|
|
|
|
if enabled then
|
|
core.register_on_prejoinplayer(function(name, ip)
|
|
load_whitelist()
|
|
if core.is_singleplayer() or name == admin or whitelist[name] then
|
|
return
|
|
end
|
|
|
|
return deny_message
|
|
end)
|
|
end
|
|
|
|
core.register_chatcommand("whitelist", {
|
|
params = "[{add|remove} <" .. S("name") .. ">]",
|
|
description = S("Manage the whitelist."),
|
|
privs = {ban=true},
|
|
func = function(name, param)
|
|
local action, whitename
|
|
if param:find(" ") then
|
|
action, whitename = param:match("^([^ ]+) ([^ ]+)$")
|
|
else
|
|
action = param
|
|
end
|
|
|
|
-- update whitelist from file before performing actions
|
|
load_whitelist()
|
|
|
|
if action == "" then
|
|
local names = {}
|
|
for k, v in pairs(whitelist) do
|
|
table.insert(names, k)
|
|
end
|
|
|
|
return true, S("Whitelisted names: @1", table.concat(names, ", "))
|
|
end
|
|
|
|
if not whitename then
|
|
return false, S("Must supply name parameter.")
|
|
end
|
|
|
|
if action == "query" then
|
|
local msg
|
|
if whitelist[whitename] then
|
|
msg = S("@1 is already on the whitelist.", whitename)
|
|
else
|
|
msg = S("@1 is not on the whitelist.", whitename)
|
|
end
|
|
|
|
return true, msg
|
|
elseif action == "add" then
|
|
if whitelist[whitename] then
|
|
return false, S("@1 is already on the whitelist.", whitename)
|
|
end
|
|
|
|
whitelist[whitename] = true
|
|
save_whitelist()
|
|
return true, S("Added @1 to the whitelist.", whitename)
|
|
elseif action == "remove" then
|
|
if not whitelist[whitename] then
|
|
return false, S("@1 is not on the whitelist.", whitename)
|
|
end
|
|
|
|
whitelist[whitename] = nil
|
|
save_whitelist()
|
|
return true, S("Removed @1 from the whitelist.", whitename)
|
|
end
|
|
|
|
return false, S("Invalid action: @1", action)
|
|
end,
|
|
})
|