monitor/resource/sv_ctx.lua
2025-04-16 22:30:27 +07:00

140 lines
4.4 KiB
Lua

-- Prevent running in monitor mode
if not TX_SERVER_MODE then return end
--NOTE: although quite a lot of this is used on the menu, this must run even if the menu is disabled
--because the locale applies to warns and notifications, as well as notification position
local ServerCtxObj = {
oneSync = {
type = nil,
status = false
},
projectName = nil,
maxClients = 30,
locale = nil,
localeData = nil,
switchPageKey = '',
txAdminVersion = '',
alignRight = false,
announceNotiPos = '', -- top-center, top-right, top-left, bottom-center, bottom-right, bottom-left
}
-- local function getRawCustomLocaleData()
-- LoadResourceFile('monitor', '.runtime/locale.json', function(fileData)
-- if not fileData then
-- txPrint('^2Loaded custom locale file.')
-- else
-- txPrint('^1WARNING: failed to load custom locale from path: '..filePath)
-- end
-- end)
-- return fileData
-- end
local function getCustomLocaleData()
local fileData = LoadResourceFile('monitor', '.runtime/locale.json')
if type(fileData) ~="string" then
txPrint('^1WARNING: failed to load custom \'locale.json\' file.')
return false
end
-- Parse and validate data
local locale = json.decode(fileData)
if
not locale
or type(locale['$meta']) ~= "table"
or type(locale['nui_warning']) ~= "table"
or type(locale['nui_menu']) ~= "table"
then
txPrint('^1WARNING: failed to validate custom locale JSON.')
return false
end
-- Build response
debugPrint('^2Loaded custom locale file.')
return {
['$meta'] = locale['$meta'],
['nui_warning'] = locale['nui_warning'],
['nui_menu'] = locale['nui_menu'],
}
end
local function syncServerCtx()
local oneSyncConvar = GetConvar('onesync', 'off')
if oneSyncConvar == 'on' or oneSyncConvar == 'legacy' then
ServerCtxObj.oneSync.type = oneSyncConvar
ServerCtxObj.oneSync.status = true
elseif oneSyncConvar == 'off' then
ServerCtxObj.oneSync.type = nil
ServerCtxObj.oneSync.status = false
end
-- Convar must match the event.code *EXACTLY* as shown on this site
-- https://keycode.info/
local switchPageKey = GetConvar('txAdmin-menuPageKey', 'Tab')
ServerCtxObj.switchPageKey = switchPageKey
local alignRight = GetConvarBool('txAdmin-menuAlignRight')
ServerCtxObj.alignRight = alignRight
local txAdminVersion = GetConvar('txAdmin-version', '0.0.0')
ServerCtxObj.txAdminVersion = txAdminVersion
-- Default '' in fxServer
local svProjectName = GetConvar('sv_projectname', '')
if svProjectName ~= '' then
ServerCtxObj.projectName = svProjectName
end
-- Default 30 in fxServer
local svMaxClients = GetConvarInt('sv_maxclients', 30)
ServerCtxObj.maxClients = svMaxClients
-- Custom locale
local txAdminLocale = GetConvar('txAdmin-locale', 'en')
ServerCtxObj.locale = txAdminLocale
if txAdminLocale == 'custom' then
ServerCtxObj.localeData = getCustomLocaleData()
else
ServerCtxObj.localeData = false
end
local announceNotiPos = GetConvar('txAdmin-menuAnnounceNotiPos', 'top-center')
-- verify we have a valid position type
if announceNotiPos == 'top-center' or announceNotiPos == 'top-right' or announceNotiPos == 'top-left' or announceNotiPos == 'bottom-center' or announceNotiPos == 'bottom-right' or announceNotiPos == 'bottom-left' then
ServerCtxObj.announceNotiPos = announceNotiPos
else
local errorMsg = ('^1Invalid notification position: %s, this must match one of the following "top-center, top-left, top-right, bottom-left, bottom-right, bottom-center" defaulting to "top-center"'):format(announceNotiPos)
txPrint(errorMsg)
ServerCtxObj.announceNotiPos = 'top-center'
end
debugPrint('Updated ServerCtx.')
GlobalState.txAdminServerCtx = ServerCtxObj
-- Telling admins that the server context changed
for adminID, _ in pairs(TX_ADMINS) do
TriggerClientEvent('txcl:setServerCtx', adminID, ServerCtxObj)
end
end
RegisterNetEvent('txsv:req:serverCtx', function()
local src = source
TriggerClientEvent('txcl:setServerCtx', src, ServerCtxObj)
end)
-- Everytime the txAdmin convars are changed this event will fire
-- Therefore, lets update global state with that.
AddEventHandler('txAdmin:events:configChanged', function()
debugPrint('configChanged event triggered, syncing GlobalState')
syncServerCtx()
end)
CreateThread(function()
-- If we don't wait for two ticks there is some race condition that
-- sometimes prevents debugPrint lmao
Wait(0)
syncServerCtx()
end)