Initial commit
This commit is contained in:
86
gamemodes/darkrp/gamemode/modules/base/sh_simplerr.lua
Normal file
86
gamemodes/darkrp/gamemode/modules/base/sh_simplerr.lua
Normal file
@@ -0,0 +1,86 @@
|
||||
-- simplerrRun: Run a function with the given parameters and send any runtime errors to admins
|
||||
DarkRP.simplerrRun = fc{
|
||||
fn.Snd, -- On success ignore the first return value
|
||||
simplerr.wrapError,
|
||||
simplerr.wrapHook,
|
||||
simplerr.wrapLog,
|
||||
simplerr.safeCall
|
||||
}
|
||||
|
||||
-- error: throw a runtime error without exiting the stack
|
||||
-- parameters: msg, [stackNr], [hints], [path], [line]
|
||||
DarkRP.errorNoHalt = fc{
|
||||
simplerr.wrapHook,
|
||||
simplerr.wrapLog,
|
||||
simplerr.runError,
|
||||
function(msg, err, ...) return msg, err and err + 3 or 4, ... end -- Raise error level one higher
|
||||
}
|
||||
|
||||
-- error: throw a runtime error
|
||||
-- parameters: msg, [stackNr], [hints], [path], [line]
|
||||
DarkRP.error = fc{
|
||||
simplerr.wrapError,
|
||||
DarkRP.errorNoHalt
|
||||
}
|
||||
|
||||
-- Print errors from the server in the console and show a message in chat
|
||||
if CLIENT then
|
||||
local function showError(count, errs)
|
||||
local one = count == 1
|
||||
chat.AddText(Color(255, 0, 0), string.format("There %s %i Lua problem%s!", one and "is" or "are", count, one and "" or 's'))
|
||||
chat.AddText(color_white, "\tPlease check your console for more information!")
|
||||
chat.AddText(color_white, "\tNote: This error likely breaks your server. Make sure to solve the error!")
|
||||
|
||||
for i = 1, count do
|
||||
MsgC(Color(137, 222, 255), errs[i] .. "\n")
|
||||
end
|
||||
end
|
||||
|
||||
net.Receive("DarkRP_simplerrError", function()
|
||||
local count = net.ReadUInt(16)
|
||||
local errs = {}
|
||||
|
||||
for i = 1, count do
|
||||
table.insert(errs, net.ReadString())
|
||||
end
|
||||
|
||||
showError(count, errs)
|
||||
end)
|
||||
hook.Add("onSimplerrError", "DarkRP_Simplerr", function(err) showError(1, {err}) end)
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
-- Serverside part
|
||||
local plyMeta = FindMetaTable("Player")
|
||||
util.AddNetworkString("DarkRP_simplerrError")
|
||||
|
||||
-- Send all errors to the client
|
||||
local function sendErrors(plys, errs)
|
||||
local count = #errs
|
||||
local one = count == 1
|
||||
|
||||
DarkRP.notify(plys, 1, 120, string.format("There %s %i Lua problem%s!\nPlease check your console for more information!", one and "is" or "are", count, one and "" or 's'))
|
||||
net.Start("DarkRP_simplerrError")
|
||||
net.WriteUInt(#errs, 16)
|
||||
fn.ForEach(fn.Flip(net.WriteString), errs)
|
||||
net.Send(plys)
|
||||
end
|
||||
|
||||
-- Annoy all admins when an error occurs
|
||||
local function annoyAdmins(err)
|
||||
local admins = fn.Filter(plyMeta.IsAdmin, player.GetAll())
|
||||
sendErrors(admins, {err})
|
||||
end
|
||||
hook.Add("onSimplerrError", "DarkRP_Simplerr", annoyAdmins)
|
||||
|
||||
-- Annoy joining admin with errors
|
||||
local function annoyAdmin(ply)
|
||||
if not IsValid(ply) or not ply:IsAdmin() then return end
|
||||
local errs = table.Copy(simplerr.getLog())
|
||||
if table.IsEmpty(errs) then return end
|
||||
|
||||
fn.Map(fp{fn.GetValue, "err"}, errs)
|
||||
sendErrors(ply, errs)
|
||||
end
|
||||
hook.Add("PlayerInitialSpawn", "DarkRP_Simplerr", function(ply) timer.Simple(1, fp{annoyAdmin, ply}) end)
|
||||
Reference in New Issue
Block a user