1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2026-04-30 21:08:57 +02:00
Files
ComfyFactorio/utils/dev_server.lua
T
Gerkiz f414d4830f Changes
Mtn v3: add quality to objectives when entering mid-late game
Fix modules
2025-12-03 20:32:30 +01:00

228 lines
7.4 KiB
Lua

-- created by Gerkiz
local Server = require 'utils.server'
local Scheduler = require 'utils.scheduler'
local Event = require 'utils.event'
local CustomEvents = require 'utils.created_events'
local Global = require 'utils.global'
local Color = require 'utils.color_presets'
local Commands = require 'utils.commands'
local Discord = require 'utils.discord_handler'
local Public = {}
local this =
{
shutdown_in_ticks = 60 * 60 * 60 * 4, -- 4 hours
interval_in_ticks = 5 * 60 * 60, -- 5 minutes
dev_server = false,
}
local valid_dev_names =
{
'developer',
'dev_server',
'test',
'test_server',
'dev',
}
Global.register(
this,
function (tbl)
this = tbl
end
)
local shutdown_server_token =
Scheduler.register_function(
'shutdown_server_token',
function ()
Discord.send_notification(
{
title = 'Server is shutting down',
description = 'Time has been reached, shutting down server from script.',
color = 'success',
fields =
{
{
title = 'Server',
description = Server.get_server_name(),
inline = 'false'
}
}
})
this.shutdown_task_uid = nil
this.notify_task_uid = nil
Server.output_script_data('Time has been reached, shutting down server from script.')
Server.stop_scenario()
end)
local function get_shutdown_time_message()
local ticks_remaining = this.shutdown_in_ticks - game.tick
if ticks_remaining < 0 then ticks_remaining = 0 end
local total_minutes = math.floor(ticks_remaining / 3600)
local hours = math.floor(total_minutes / 60)
local minutes = total_minutes % 60
local message = '[Script Handler] Server is shutting down in '
if hours > 0 then
message = message .. hours .. ' hour' .. (hours > 1 and 's' or '')
if minutes > 0 then
message = message .. ' and ' .. minutes .. ' minute' .. (minutes > 1 and 's' or '')
end
else
message = message .. minutes .. ' minute' .. (minutes > 1 and 's' or '')
end
message = message .. '...'
return message
end
local notify_players_token =
Scheduler.register_function(
'notify_players_token',
function ()
local message = get_shutdown_time_message()
local players = game.connected_players
for i = 1, #players do
local player = players[i]
player.print(message, { color = Color.warning })
end
end)
Event.add(defines.events.on_player_joined_game, function (event)
local player = game.get_player(event.player_index)
if _DEBUG then
player.print('[color=yellow][Script Handler][/color] This is a development server running with [color=orange]_DEBUG[/color] enabled.')
else
player.print('[color=yellow][Script Handler][/color] This is a development server.')
end
local message = get_shutdown_time_message()
if player then
player.print(message, { color = Color.warning })
end
end)
Event.add(CustomEvents.events.on_server_started, function ()
if this.shutdown_task_uid then
return
end
local server_name_matches = false
for _, name in pairs(valid_dev_names) do
if Server.check_server_name(name) then
server_name_matches = true
break
end
end
if server_name_matches then
this.dev_server = true
Server.output_script_data('Server is a developer server, shutting down in 24 hours...')
local task = Scheduler.new(this.shutdown_in_ticks, shutdown_server_token)
this.shutdown_task_uid = task._uid
local notify_task = Scheduler.new_interval(this.interval_in_ticks, task._tick, notify_players_token)
this.notify_task_uid = notify_task._uid
else
if this.shutdown_task_uid then
local task = Scheduler.get_task_by_uid(this.shutdown_task_uid)
if task then
task:cancel_task()
end
this.shutdown_task_uid = nil
end
if this.notify_task_uid then
local task = Scheduler.get_task_by_uid(this.notify_task_uid)
if task then
task:cancel_task()
end
this.notify_task_uid = nil
end
end
end)
Commands.new('change_shutdown_time', 'Changes the shutdown time for the developer server.')
:require_admin()
:require_validation()
:add_parameter('time in hours', false, 'number')
:callback(
function (player, time)
if not this.dev_server then
player.print('This server is not a developer server.', { color = Color.warning })
return
end
if time < 1 then
player.print('Shutdown time cannot be less than 1 hour.', { color = Color.warning })
return
end
if time > 74 then
player.print('Shutdown time cannot be greater than 74 hours.', { color = Color.warning })
return
end
if not this.shutdown_task_uid then
player.print('Shutdown task not found, please restart the server.', { color = Color.warning })
return
end
local task = Scheduler.get_task_by_uid(this.shutdown_task_uid)
local notify_task = Scheduler.get_task_by_uid(this.notify_task_uid)
if task and notify_task then
this.shutdown_in_ticks = 60 * 60 * 60 * time
task:set_delay(this.shutdown_in_ticks)
notify_task._until_tick = task._tick
player.print('[Script Handler] Shutdown time has been changed to ' .. time .. ' hour(s).')
end
end
)
Commands.new('change_interval_time', 'Changes how often the server will notify players that it is shutting down.')
:require_admin()
:require_validation()
:add_parameter('time in minutes', false, 'number')
:callback(
function (player, time)
if not this.dev_server then
player.print('This server is not a developer server.', { color = Color.warning })
return
end
if time < 1 then
player.print('Interval time cannot be less than 1 minute.', { color = Color.warning })
return
end
if time > 60 then
player.print('Interval time cannot be greater than 60 minutes.', { color = Color.warning })
return
end
if not this.notify_task_uid then
player.print('Shutdown task not found, please restart the server.', { color = Color.warning })
return
end
local task = Scheduler.get_task_by_uid(this.shutdown_task_uid)
local notify_task = Scheduler.get_task_by_uid(this.notify_task_uid)
if task and notify_task then
this.interval_in_ticks = time * 60 * 60
notify_task:set_interval(this.interval_in_ticks, task._tick)
player.print('[Script Handler] Interval time has been changed to ' .. time .. ' minute(s).')
end
end
)
function Public.is_dev_server()
return this.dev_server
end
return Public