Files
UpdatePLZ/updateplz/42.13/media/lua/server/updateplz.lua
2026-02-16 12:12:11 -05:00

133 lines
3.5 KiB
Lua

local getTimestamp = getTimestamp
local querySteamWorkshopItemDetails = querySteamWorkshopItemDetails
local getSteamWorkshopItemIDs = getSteamWorkshopItemIDs
local getOnlinePlayers = getOnlinePlayers
local getCore = getCore
if not getCore():isDedicated() then
print("[UpdatePLZ] Refusing to load (this is not a dedicated server)")
return
end
UpdatePLZ = UpdatePLZ or {}
local serverStarted = getTimestamp()
local pendingReboot = false
function UpdatePLZ.setRestartDelaySeconds(delay)
print("[UpdatePLZ] Restart delay set to " .. delay .. " seconds")
UpdatePLZ.restartDelay = delay
end
local function isServerEmpty()
return getOnlinePlayers():size() == 0
end
local rebootServer do
local rebootingNow = false
function rebootServer()
if rebootingNow then return end
rebootingNow = true
print("[UpdatePLZ] Saving...")
saveGame()
print("[UpdatePLZ] Quitting...")
getCore():quit()
end
end
local restartingAt
local scheduleServerRestart do
ModData.remove("UpdatePLZ")
Events.OnInitGlobalModData.Add(function()
if restartingAt then
ModData.add("UpdatePLZ", { restartingAt = restartingAt })
ModData.transmit("UpdatePLZ")
else
ModData.remove("UpdatePLZ")
end
end)
function scheduleServerRestart(timestamp)
restartingAt = timestamp
ModData.add("UpdatePLZ", { restartingAt = timestamp })
ModData.transmit("UpdatePLZ")
UpdatePLZ.startRestartCountdown(timestamp)
end
end
local function rebootWhenEmpty()
if pendingReboot and isServerEmpty() then
rebootServer()
Events.OnTickEvenPaused.Remove(rebootWhenEmpty)
end
end
local function workshopOutdated()
if pendingReboot then return end
pendingReboot = true
if isServerEmpty() then
print("[UpdatePLZ] Restarting the server (server empty and outdated Workshop items were detected)")
rebootServer()
return
end
if UpdatePLZ.restartDelay then
print("[UpdatePLZ] Detected outdated Workshop item - restarting server in " .. UpdatePLZ.minutes(UpdatePLZ.restartDelay))
scheduleServerRestart(getTimestamp() + UpdatePLZ.restartDelay)
else
print("[UpdatePLZ] Restarting the server when it becomes empty... (outdated Workshop items were detected)")
Events.OnTickEvenPaused.Add(rebootWhenEmpty)
end
end
local pollWorkshop do
local fakeTable = {}
function pollWorkshop()
if pendingReboot then return end
print("[UpdatePLZ] Checking for outdated Workshop items...")
querySteamWorkshopItemDetails(getSteamWorkshopItemIDs(), function(_, status, info)
if status ~= "Completed" then return end
for i = 0, info:size() - 1 do
local details = info:get(i)
local updated = details:getTimeUpdated()
if updated >= serverStarted then
workshopOutdated()
return
end
end
end, fakeTable)
end
end
Events.OnDisconnect.Add(pollWorkshop)
local nextPoll
Events.OnTickEvenPaused.Add(function()
if restartingAt then
if isServerEmpty() then
print("[UpdatePLZ] Restarting the server now! (Outdated Workshop items were detected and server is empty)")
rebootServer()
elseif restartingAt - getTimestamp() <= 0 then
print("[UpdatePLZ] Restarting the server now! (Outdated Workshop items were detected)")
rebootServer()
end
return
end
if pendingReboot then return end
-- Don't bother checking for outdated Workshop items if there's no restart delay and the server has players on it
if not UpdatePLZ.restartDelay and not isServerEmpty() then return end
local timestamp = getTimestamp()
if not nextPoll or getTimestamp() >= nextPoll then
nextPoll = timestamp + 60
return pollWorkshop()
end
end)