mirror of
https://github.com/gmod-integration/lua.git
synced 2025-04-30 07:25:25 +00:00
311 lines
12 KiB
Lua
311 lines
12 KiB
Lua
local function saveConfig(setting, value)
|
|
gmInte.SendNet("saveConfig", {
|
|
[setting] = value
|
|
})
|
|
end
|
|
|
|
local configCat = {"Authentication", "Main", "Trust & Safety", "Advanced",}
|
|
local possibleConfig = {
|
|
{
|
|
["id"] = "id",
|
|
["label"] = "Server ID",
|
|
["description"] = "Server ID found on the webpanel.",
|
|
["type"] = "textEntry",
|
|
["value"] = function(setting, value) return value end,
|
|
["onEdit"] = function(setting, value) saveConfig(setting, value) end,
|
|
["onEditDelay"] = 0.5,
|
|
["category"] = "Authentication"
|
|
},
|
|
{
|
|
["id"] = "token",
|
|
["label"] = "Server Token",
|
|
["description"] = "Server Token found on the webpanel.",
|
|
["type"] = "textEntry",
|
|
["secret"] = true,
|
|
["value"] = function(setting, value) return value end,
|
|
["onEdit"] = function(setting, value) saveConfig(setting, value) end,
|
|
["onEditDelay"] = 0.5,
|
|
["category"] = "Authentication"
|
|
},
|
|
{
|
|
["id"] = "maintenance",
|
|
["label"] = "Maintenance",
|
|
["description"] = "Activate or deactivate maintenance mode.",
|
|
["type"] = "checkbox",
|
|
["value"] = function(setting, value) return value end,
|
|
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
|
|
["category"] = "Main"
|
|
},
|
|
{
|
|
["id"] = "filterOnBan",
|
|
["label"] = "Block Discord Ban Player",
|
|
["description"] = "Block players banned on the discord server.",
|
|
["type"] = "checkbox",
|
|
["value"] = function(setting, value) return value end,
|
|
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
|
|
["category"] = "Trust & Safety"
|
|
},
|
|
{
|
|
["id"] = "forcePlayerLink",
|
|
["label"] = "Force Player Verif",
|
|
["description"] = "Sync chat between the server and the discord server.",
|
|
["type"] = "checkbox",
|
|
["value"] = function(setting, value) return value end,
|
|
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
|
|
["category"] = "Main"
|
|
},
|
|
{
|
|
["id"] = "supportLink",
|
|
["label"] = "Support Link",
|
|
["description"] = "Server ID found on the webpanel.",
|
|
["type"] = "textEntry",
|
|
["value"] = function(setting, value) return value end,
|
|
["onEdit"] = function(setting, value) saveConfig(setting, value) end,
|
|
["onEditDelay"] = 0.5,
|
|
["category"] = "Trust & Safety"
|
|
},
|
|
{
|
|
["id"] = "debug",
|
|
["label"] = "Debug",
|
|
["description"] = "Activate or deactivate debug mode.",
|
|
["type"] = "checkbox",
|
|
["value"] = function(setting, value) return value end,
|
|
["position"] = 1,
|
|
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
|
|
["category"] = "Advanced"
|
|
},
|
|
{
|
|
["id"] = "websocketFQDN",
|
|
["label"] = "Websocket FQDN",
|
|
["description"] = "Websocket FQDN that will be used for the Websocket connection.",
|
|
["type"] = "textEntry",
|
|
["value"] = function(setting, value) return value end,
|
|
["resetIfEmpty"] = true,
|
|
["defaultValue"] = "ws.gmod-integration.com",
|
|
["onEdit"] = function(setting, value)
|
|
if !value || value == "" then return end
|
|
saveConfig(setting, value)
|
|
end,
|
|
["onEditDelay"] = 0.5,
|
|
["category"] = "Advanced"
|
|
},
|
|
{
|
|
["id"] = "apiFQDN",
|
|
["label"] = "API FQDN",
|
|
["description"] = "API FQDN that will be used for the API connection.",
|
|
["type"] = "textEntry",
|
|
["resetIfEmpty"] = true,
|
|
["defaultValue"] = "api.gmod-integration.com",
|
|
["value"] = function(setting, value) return value end,
|
|
["onEdit"] = function(setting, value)
|
|
if !value || value == "" then return end
|
|
saveConfig(setting, value)
|
|
end,
|
|
["onEditDelay"] = 0.5,
|
|
["category"] = "Advanced"
|
|
},
|
|
}
|
|
|
|
local buttonsInfo = {
|
|
{
|
|
["label"] = "Open Webpanel",
|
|
["func"] = function() gui.OpenURL("https://gmod-integration.com/dashboard/guilds") end,
|
|
},
|
|
{
|
|
["label"] = "Test Connection",
|
|
["func"] = function() gmInte.SendNet("testConnection") end,
|
|
},
|
|
{
|
|
["label"] = "Buy Premium",
|
|
["func"] = function() gui.OpenURL("https://gmod-integration.com/premium") end,
|
|
},
|
|
{
|
|
["label"] = "Install Websocket",
|
|
["condition"] = function(data) return !data.websocket end,
|
|
["func"] = function() gui.OpenURL("https://github.com/FredyH/GWSockets/releases") end,
|
|
},
|
|
}
|
|
|
|
local colorTable = {
|
|
["text"] = Color(255, 255, 255, 255),
|
|
["background"] = Color(0, 0, 0, 200),
|
|
["button"] = Color(0, 0, 0, 200),
|
|
["buttonHover"] = Color(0, 0, 0, 255),
|
|
["buttonText"] = Color(255, 255, 255, 255),
|
|
["buttonTextHover"] = Color(255, 255, 255, 255),
|
|
}
|
|
|
|
function gmInte.needRestart()
|
|
local frame = vgui.Create("DFrame")
|
|
frame:SetSize(400, 120)
|
|
frame:Center()
|
|
frame:SetTitle(gmInte.getFrameName("Restart Required"))
|
|
frame:SetDraggable(true)
|
|
frame:ShowCloseButton(true)
|
|
frame:MakePopup()
|
|
gmInte.applyPaint(frame)
|
|
local messagePanel = vgui.Create("DPanel", frame)
|
|
messagePanel:Dock(TOP)
|
|
messagePanel:SetSize(300, 40)
|
|
messagePanel:DockMargin(10, 0, 10, 10)
|
|
messagePanel:SetBackgroundColor(Color(0, 0, 0, 0))
|
|
local messageLabel = vgui.Create("DLabel", messagePanel)
|
|
messageLabel:Dock(FILL)
|
|
messageLabel:SetText("Some changes require a restart to be applied.\nRestart now ?")
|
|
messageLabel:SetContentAlignment(5)
|
|
messageLabel:SetWrap(true)
|
|
local buttonGrid = vgui.Create("DGrid", frame)
|
|
buttonGrid:Dock(BOTTOM)
|
|
buttonGrid:DockMargin(5, 10, 5, 5)
|
|
buttonGrid:SetCols(2)
|
|
buttonGrid:SetColWide(frame:GetWide() / 2 - 5)
|
|
buttonGrid:SetRowHeight(35)
|
|
local button = vgui.Create("DButton")
|
|
button:SetText("Restart")
|
|
button.DoClick = function()
|
|
frame:Close()
|
|
gmInte.SendNet("restartMap")
|
|
end
|
|
|
|
button:SetSize(buttonGrid:GetColWide() - 10, buttonGrid:GetRowHeight())
|
|
gmInte.applyPaint(button)
|
|
buttonGrid:AddItem(button)
|
|
local button = vgui.Create("DButton")
|
|
button:SetText("Maybe Later")
|
|
button.DoClick = function() frame:Close() end
|
|
button:SetSize(buttonGrid:GetColWide() - 10, buttonGrid:GetRowHeight())
|
|
gmInte.applyPaint(button)
|
|
buttonGrid:AddItem(button)
|
|
end
|
|
|
|
function gmInte.openConfigMenu(data)
|
|
local needRestart = false
|
|
if gmInte.openAdminPanel then return end
|
|
gmInte.openAdminPanel = true
|
|
local frame = vgui.Create("DFrame")
|
|
frame:SetSize(400, (600 / 1080) * ScrH())
|
|
frame:Center()
|
|
frame:SetTitle(gmInte.getFrameName("Server Config"))
|
|
frame:SetDraggable(true)
|
|
frame:ShowCloseButton(true)
|
|
frame:MakePopup()
|
|
gmInte.applyPaint(frame)
|
|
local scrollPanel = vgui.Create("DScrollPanel", frame)
|
|
scrollPanel:Dock(FILL)
|
|
local messagePanel = vgui.Create("DPanel", scrollPanel)
|
|
messagePanel:Dock(TOP)
|
|
messagePanel:SetSize(300, 60)
|
|
messagePanel:DockMargin(10, 0, 10, 10)
|
|
messagePanel:SetBackgroundColor(Color(0, 0, 0, 0))
|
|
local messageLabel = vgui.Create("DLabel", messagePanel)
|
|
messageLabel:Dock(FILL)
|
|
messageLabel:SetText("Here you can configure your server settings.\nServer ID and Token are available on the webpanel in the server settings.\nThe documentation is available at https://docs.gmod-integration.com/\nIf you need help, please contact us on our discord server.")
|
|
messageLabel:SetWrap(true)
|
|
for k, catName in pairs(configCat) do
|
|
local collapsibleCategory = vgui.Create("DCollapsibleCategory", scrollPanel)
|
|
collapsibleCategory:Dock(TOP)
|
|
collapsibleCategory:DockMargin(10, 0, 10, 10)
|
|
collapsibleCategory:SetLabel(catName)
|
|
collapsibleCategory:SetExpanded(catName != "Advanced")
|
|
gmInte.applyPaint(collapsibleCategory)
|
|
local configList = vgui.Create("DPanelList", collapsibleCategory)
|
|
configList:Dock(FILL)
|
|
configList:SetSpacing(5)
|
|
configList:EnableHorizontal(false)
|
|
configList:EnableVerticalScrollbar(false)
|
|
collapsibleCategory:SetContents(configList)
|
|
local categoryConfig = {}
|
|
for k, v in pairs(possibleConfig) do
|
|
if v.category == catName then table.insert(categoryConfig, v) end
|
|
end
|
|
|
|
// Sort by position
|
|
table.sort(categoryConfig, function(a, b) return (a.position || 0) < (b.position || 0) end)
|
|
for k, actualConfig in pairs(categoryConfig) do
|
|
local panel = vgui.Create("DPanel", configList)
|
|
panel:Dock(TOP)
|
|
panel:SetSize(300, 25)
|
|
panel:SetBackgroundColor(Color(0, 0, 0, 0))
|
|
local label = vgui.Create("DLabel", panel)
|
|
label:Dock(LEFT)
|
|
label:SetSize(140, 25)
|
|
label:SetText(actualConfig.label)
|
|
label:SetContentAlignment(4)
|
|
local input
|
|
if actualConfig.type == "textEntry" then
|
|
input = vgui.Create("DTextEntry", panel)
|
|
local value = actualConfig.value(actualConfig.id, data[actualConfig.id] || "")
|
|
if actualConfig.secret then
|
|
input:SetText("*** Click to show ***")
|
|
else
|
|
input:SetText(value)
|
|
end
|
|
|
|
input.OnGetFocus = function(self) if actualConfig.secret then self:SetText(value) end end
|
|
input.OnLoseFocus = function(self) if actualConfig.secret then self:SetText("*** Click to show ***") end end
|
|
local isLastID = 0
|
|
input.OnChange = function(self)
|
|
if actualConfig.resetIfEmpty && self:GetValue() == "" && actualConfig.defaultValue then
|
|
self:SetText(actualConfig.defaultValue)
|
|
return
|
|
end
|
|
|
|
isLastID = isLastID + 1
|
|
local isLocalLastID = isLastID
|
|
timer.Simple(actualConfig.onEditDelay || 0.5, function() if isLocalLastID == isLastID then actualConfig.onEdit(actualConfig.id, self:GetValue()) end end)
|
|
end
|
|
elseif actualConfig.type == "checkbox" then
|
|
input = vgui.Create("DComboBox", panel)
|
|
if actualConfig.condition && !actualConfig.condition(data) then input:SetEnabled(false) end
|
|
input:AddChoice("Enabled")
|
|
input:AddChoice("Disabled")
|
|
input:SetText(actualConfig.value(actualConfig.id, data[actualConfig.id]) && "Enabled" || "Disabled")
|
|
input.OnSelect = function(self, index, value)
|
|
if actualConfig.restart then needRestart = true end
|
|
actualConfig.onEdit(actualConfig.id, value)
|
|
end
|
|
end
|
|
|
|
input:Dock(FILL)
|
|
input:SetSize(150, 25)
|
|
if actualConfig.description then
|
|
if actualConfig.websocket && !data.websocket then actualConfig.description = actualConfig.description .. "\n\nThis feature require a websocket connection to work properly." end
|
|
if actualConfig.disable then actualConfig.description = actualConfig.description .. "\n\nThis feature will be available soon." end
|
|
input:SetTooltip(actualConfig.description)
|
|
end
|
|
|
|
configList:AddItem(panel)
|
|
end
|
|
end
|
|
|
|
local buttonGrid = vgui.Create("DGrid", frame)
|
|
buttonGrid:Dock(BOTTOM)
|
|
buttonGrid:DockMargin(5, 10, 5, -5)
|
|
buttonGrid:SetCols(2)
|
|
buttonGrid:SetColWide(frame:GetWide() / 2 - 5)
|
|
buttonGrid:SetRowHeight(45)
|
|
local buttonsCount = 0
|
|
for k, v in pairs(buttonsInfo) do
|
|
if v.condition && !v.condition(data) then continue end
|
|
local button = vgui.Create("DButton")
|
|
button:SetText(v.label)
|
|
button.DoClick = function() v.func(data) end
|
|
gmInte.applyPaint(button)
|
|
button:SetSize(buttonGrid:GetColWide() - 10, buttonGrid:GetRowHeight() - 10)
|
|
buttonGrid:AddItem(button)
|
|
buttonsCount = buttonsCount + 1
|
|
end
|
|
|
|
if buttonsCount % 2 == 1 then
|
|
local lastButton = buttonGrid:GetItems()[buttonsCount]
|
|
lastButton:SetWide(frame:GetWide() - 20)
|
|
end
|
|
|
|
frame.OnClose = function()
|
|
gmInte.openAdminPanel = false
|
|
if needRestart then gmInte.needRestart() end
|
|
end
|
|
end
|
|
|
|
concommand.Add("gmod_integration_admin", function() gmInte.SendNet("getConfig") end)
|
|
concommand.Add("gmi_admin", function() gmInte.SendNet("getConfig") end) |