mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
95 lines
2.6 KiB
Lua
95 lines
2.6 KiB
Lua
--[[
|
|
This module creates a file of just trapped lua errors. It is possible that this module misses errors, therefore it is advised
|
|
that users also verify their server/game logs.
|
|
]]
|
|
-- Dependencies
|
|
local Timestamp = require 'utils.timestamp'
|
|
|
|
-- Localized functions
|
|
local floor = math.floor
|
|
local format = string.format
|
|
local insert = table.insert
|
|
local concat = table.concat
|
|
local pcall = pcall
|
|
|
|
-- Local constants
|
|
local minutes_to_ticks = 60 * 60
|
|
local hours_to_ticks = 60 * 60 * 60
|
|
local ticks_to_minutes = 1 / minutes_to_ticks
|
|
local ticks_to_hours = 1 / hours_to_ticks
|
|
local warning = '\n\n\n\nTHIS LOG IS NOT ALL-INCLUSIVE AND CAN MISS ERRORS. IF THERE ARE ANY SUSPICIONS OF ERRORS CHECK THE LOGS.\n\n\n\n'
|
|
|
|
-- Local vars
|
|
local Public = {
|
|
server_time = {secs = nil, tick = 0}
|
|
}
|
|
local first_error = true
|
|
|
|
--- Copied from utils.core, turns ticks into a human-readable time.
|
|
local function format_time(ticks)
|
|
local result = {}
|
|
|
|
local hours = floor(ticks * ticks_to_hours)
|
|
if hours > 0 then
|
|
ticks = ticks - hours * hours_to_ticks
|
|
insert(result, hours)
|
|
if hours == 1 then
|
|
insert(result, 'hour')
|
|
else
|
|
insert(result, 'hours')
|
|
end
|
|
end
|
|
|
|
local minutes = floor(ticks * ticks_to_minutes)
|
|
insert(result, minutes)
|
|
if minutes == 1 then
|
|
insert(result, 'minute')
|
|
else
|
|
insert(result, 'minutes')
|
|
end
|
|
|
|
return concat(result, ' ')
|
|
end
|
|
|
|
local function try_generate_report(str)
|
|
local server_time = Public.server_time.secs
|
|
|
|
local server_time_str = '(Server time: unavailable)'
|
|
local file_name = 'redmew_errors'
|
|
if server_time then
|
|
server_time_str = format('(Server time: %s)', Timestamp.to_string(server_time))
|
|
file_name = file_name .. '_' .. Timestamp.to_date_string(server_time) .. '.log'
|
|
else
|
|
file_name = file_name .. '.log'
|
|
game.write_file(file_name, '', false, 0)
|
|
end
|
|
|
|
if first_error then
|
|
server_time_str = warning .. server_time_str
|
|
first_error = nil
|
|
end
|
|
|
|
local tick = 'pre-game'
|
|
if game then
|
|
tick = format_time(game.tick)
|
|
end
|
|
tick = 'Time of error: ' .. tick
|
|
|
|
local redmew_version = global.redmew_version or 'Unknown'
|
|
redmew_version = 'RedMew version: ' .. redmew_version
|
|
|
|
local output = concat({server_time_str, tick, redmew_version, str, '\n'}, '\n')
|
|
|
|
game.write_file(file_name, output, true, 0)
|
|
end
|
|
|
|
--- Takes the given string and generates an entry in the error file.
|
|
function Public.generate_error_report(str)
|
|
local success, err = pcall(try_generate_report, str)
|
|
if not success then
|
|
log(err)
|
|
end
|
|
end
|
|
|
|
return Public
|