refactor: now using glualint

This commit is contained in:
Linventif 2024-07-05 21:50:00 +00:00
parent e7f160df05
commit 90de28575c
33 changed files with 498 additions and 1213 deletions

View File

@ -1,30 +1,17 @@
if (game.SinglePlayer()) then return print("Gmod Integration is not supported in Singleplayer!") end
//
// Variables
//
if game.SinglePlayer() then return print("Gmod Integration is not supported in Singleplayer!") end
gmInte = gmInte || {}
gmInte.version = "0.3.6"
gmInte.config = {}
gmInte.materials = {}
//
// Functions
//
local function loadServerConfig()
RunConsoleCommand("sv_hibernate_think", "1")
if (!file.Exists("gm_integration", "DATA") || !file.Exists("gm_integration/config.json", "DATA")) then
if !file.Exists("gm_integration", "DATA") || !file.Exists("gm_integration/config.json", "DATA") then
file.CreateDir("gm_integration")
file.Write("gm_integration/config.json", util.TableToJSON(gmInte.config, true))
else
if (gmInte.config.id && gmInte.config.id != "") then return end
if gmInte.config.id && gmInte.config.id != "" then return end
local oldConfig = util.JSONToTable(file.Read("gm_integration/config.json", "DATA"))
if (!oldConfig.version || (oldConfig.version < gmInte.version)) then
if !oldConfig.version || (oldConfig.version < gmInte.version) then
print(" | Merging Config | gmod_integration/sv_config.lua")
table.Merge(gmInte.config, oldConfig)
gmInte.config.version = gmInte.version
@ -37,29 +24,26 @@ end
local function loadAllFiles(folder)
local files, folders = file.Find(folder .. "/*", "LUA")
for k, fileName in SortedPairs(files) do
local path = folder .. "/" .. fileName
print(" | Loading File | " .. path)
if (string.StartWith(fileName, "cl_")) then
if string.StartWith(fileName, "cl_") then
if SERVER then
AddCSLuaFile(path)
else
include(path)
end
elseif (string.StartWith(fileName, "sv_")) then
if SERVER then
include(path)
end
elseif (string.StartWith(fileName, "sh_")) then
if SERVER then
AddCSLuaFile(path)
end
elseif string.StartWith(fileName, "sv_") then
if SERVER then include(path) end
elseif string.StartWith(fileName, "sh_") then
if SERVER then AddCSLuaFile(path) end
include(path)
end
if (fileName == "sv_config.lua") then loadServerConfig() continue end
if fileName == "sv_config.lua" then
loadServerConfig()
continue
end
end
for k, v in SortedPairs(folders, true) do
@ -67,11 +51,6 @@ local function loadAllFiles(folder)
end
end
//
// Load Files
//
print(" ")
print(" ")
print(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ")

View File

@ -23,19 +23,14 @@ function gmInte.getColor(name)
end
function gmInte.applyPaint(element, id)
if (element.DoClick) then
if element.DoClick then
element:SetTextColor(gmInte.getColor("font"))
element.Paint = function(self, w, h)
local color = gmInte.getColor("primary")
if (self:IsHovered()) then
color = gmInte.getColor("primary-active")
end
if self:IsHovered() then color = gmInte.getColor("primary-active") end
draw.RoundedBox(0, 0, 0, w, h, color)
end
elseif (element.SetTitle) then
elseif element.SetTitle then
element.Paint = function(self, w, h)
draw.RoundedBox(0, 0, 0, w, h, gmInte.getColor("background"))
// first 20px = title bar = primary

View File

@ -8,5 +8,4 @@ list.Set("DesktopWindows", "GmodIntegration:DesktopWindows", {
window:Close()
gmInte.openAdminConfig()
end
}
)
})

View File

@ -8,7 +8,7 @@ local configCat = {
"Authentication",
"Main",
"Trust & Safety",
-- "Punishment",
// "Punishment",
"Advanced",
}
@ -18,242 +18,210 @@ local possibleConfig = {
["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,
["value"] = function(setting, value) return value end,
["onEdit"] = function(setting, value) saveConfig(setting, value) end,
["onEditDelay"] = 0.5,
["category"] = "Authentication"
},
{
["id"]= "token",
["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,
["value"] = function(setting, value) return value end,
["onEdit"] = function(setting, value) saveConfig(setting, value) end,
["onEditDelay"] = 0.5,
["category"] = "Authentication"
},
-- {
-- ["id"]= "sendLog",
-- ["label"] = "Logs",
-- ["description"] = "Activate or deactivate logs.",
-- ["type"] = "checkbox",
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value == "Enabled" && true || false)
-- end,
-- ["category"] = "Main"
-- },
-- {
-- ["id"]= "logBotActions",
-- ["label"] = "Log Bot Actions",
-- ["description"] = "Activate or deactivate logs for bot actions.",
-- ["type"] = "checkbox",
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value == "Enabled" && true || false)
-- end,
-- ["category"] = "Main"
-- },
// {
// ["id"]= "sendLog",
// ["label"] = "Logs",
// ["description"] = "Activate or deactivate logs.",
// ["type"] = "checkbox",
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value == "Enabled" && true || false)
// end,
// ["category"] = "Main"
// },
// {
// ["id"]= "logBotActions",
// ["label"] = "Log Bot Actions",
// ["description"] = "Activate or deactivate logs for bot actions.",
// ["type"] = "checkbox",
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value == "Enabled" && true || false)
// end,
// ["category"] = "Main"
// },
{
["id"]= "maintenance",
["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,
["value"] = function(setting, value) return value end,
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
["category"] = "Main"
},
{
["id"]= "filterOnBan",
["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,
["value"] = function(setting, value) return value end,
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
["category"] = "Trust & Safety"
},
-- {
-- ["id"]= "filterOnTrust",
-- ["label"] = "Block UnTrust Player",
-- ["description"] = "Block players with a trust level lower than the minimal trust level set in the config.",
-- ["type"] = "checkbox",
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value == "Enabled" && true || false)
-- end,
-- ["category"] = "Trust & Safety"
-- },
-- {
-- ["id"]= "minimalTrust",
-- ["label"] = "Minimal Trust Level",
-- ["description"] = "The minimal trust level to be able to join the server.",
-- ["type"] = "textEntry",
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value)
-- end,
-- ["onEditDelay"] = 0.5,
-- ["category"] = "Trust & Safety"
-- },
-- {
-- ["id"]= "syncChat",
-- ["label"] = "Sync Chat",
-- ["description"] = "Sync chat between the server and the discord server.",
-- ["websocket"] = true,
-- ["restart"] = true,
-- ["type"] = "checkbox",
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value == "Enabled" && true || false)
-- end,
-- ["category"] = "Main"
-- },
-- {
-- ["id"]= "syncBan",
-- ["label"] = "Sync Ban",
-- ["description"] = "Sync chat between the server and the discord server.",
-- ["type"] = "checkbox",
-- ["condition"] = function(data)
-- return false // Disabled for now
-- end,
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value == "Enabled" && true || false)
-- end,
-- ["category"] = "Punishment"
-- },
-- {
-- ["id"]= "syncTimeout",
-- ["label"] = "Sync Timeout",
-- ["description"] = "Sync chat between the server and the discord server.",
-- ["type"] = "checkbox",
-- ["condition"] = function(data)
-- return false // Disabled for now
-- end,
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value == "Enabled" && true || false)
-- end,
-- ["category"] = "Punishment"
-- },
-- {
-- ["id"]= "syncKick",
-- ["label"] = "Sync Kick",
-- ["description"] = "Sync chat between the server and the discord server.",
-- ["type"] = "checkbox",
-- ["condition"] = function(data)
-- return false // Disabled for now
-- end,
-- ["value"] = function(setting, value)
-- return value
-- end,
-- ["onEdit"] = function(setting, value)
-- saveConfig(setting, value == "Enabled" && true || false)
-- end,
-- ["category"] = "Punishment"
-- },
// {
// ["id"]= "filterOnTrust",
// ["label"] = "Block UnTrust Player",
// ["description"] = "Block players with a trust level lower than the minimal trust level set in the config.",
// ["type"] = "checkbox",
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value == "Enabled" && true || false)
// end,
// ["category"] = "Trust & Safety"
// },
// {
// ["id"]= "minimalTrust",
// ["label"] = "Minimal Trust Level",
// ["description"] = "The minimal trust level to be able to join the server.",
// ["type"] = "textEntry",
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value)
// end,
// ["onEditDelay"] = 0.5,
// ["category"] = "Trust & Safety"
// },
// {
// ["id"]= "syncChat",
// ["label"] = "Sync Chat",
// ["description"] = "Sync chat between the server and the discord server.",
// ["websocket"] = true,
// ["restart"] = true,
// ["type"] = "checkbox",
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value == "Enabled" && true || false)
// end,
// ["category"] = "Main"
// },
// {
// ["id"]= "syncBan",
// ["label"] = "Sync Ban",
// ["description"] = "Sync chat between the server and the discord server.",
// ["type"] = "checkbox",
// ["condition"] = function(data)
// return false // Disabled for now
// end,
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value == "Enabled" && true || false)
// end,
// ["category"] = "Punishment"
// },
// {
// ["id"]= "syncTimeout",
// ["label"] = "Sync Timeout",
// ["description"] = "Sync chat between the server and the discord server.",
// ["type"] = "checkbox",
// ["condition"] = function(data)
// return false // Disabled for now
// end,
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value == "Enabled" && true || false)
// end,
// ["category"] = "Punishment"
// },
// {
// ["id"]= "syncKick",
// ["label"] = "Sync Kick",
// ["description"] = "Sync chat between the server and the discord server.",
// ["type"] = "checkbox",
// ["condition"] = function(data)
// return false // Disabled for now
// end,
// ["value"] = function(setting, value)
// return value
// end,
// ["onEdit"] = function(setting, value)
// saveConfig(setting, value == "Enabled" && true || false)
// end,
// ["category"] = "Punishment"
// },
{
["id"]= "forcePlayerLink",
["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,
["value"] = function(setting, value) return value end,
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
["category"] = "Main"
},
{
["id"]= "supportLink",
["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,
["value"] = function(setting, value) return value end,
["onEdit"] = function(setting, value) saveConfig(setting, value) end,
["onEditDelay"] = 0.5,
["category"] = "Trust & Safety"
},
{
["id"]= "debug",
["id"] = "debug",
["label"] = "Debug",
["description"] = "Activate or deactivate debug mode.",
["type"] = "checkbox",
["value"] = function(setting, value)
return value
end,
["value"] = function(setting, value) return value end,
["position"] = 1,
["onEdit"] = function(setting, value)
saveConfig(setting, value == "Enabled" && true || false)
end,
["onEdit"] = function(setting, value) saveConfig(setting, value == "Enabled" && true || false) end,
["category"] = "Advanced"
},
{
["id"]= "websocketFQDN",
["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,
["value"] = function(setting, value) return value end,
["resetIfEmpty"] = true,
["defaultValue"] = "ws.gmod-integration.com",
["onEdit"] = function(setting, value)
if (!value || value == "") then return end
if !value || value == "" then return end
saveConfig(setting, value)
end,
["onEditDelay"] = 0.5,
["category"] = "Advanced"
},
{
["id"]= "apiFQDN",
["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,
["value"] = function(setting, value) return value end,
["onEdit"] = function(setting, value)
if (!value || value == "") then return end
if !value || value == "" then return end
saveConfig(setting, value)
end,
["onEditDelay"] = 0.5,
@ -264,42 +232,32 @@ local possibleConfig = {
local buttonsInfo = {
{
["label"] = "Open Webpanel",
["func"] = function()
gui.OpenURL("https://gmod-integration.com/config/server")
end,
["func"] = function() gui.OpenURL("https://gmod-integration.com/config/server") end,
},
{
["label"] = "Test Connection",
["func"] = function()
gmInte.SendNet("testConnection")
end,
["func"] = function() gmInte.SendNet("testConnection") end,
},
{
["label"] = "Buy Premium",
["func"] = function()
gui.OpenURL("https://gmod-integration.com/premium")
end,
["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,
["condition"] = function(data) return !data.websocket end,
["func"] = function() gui.OpenURL("https://github.com/FredyH/GWSockets/releases") end,
},
-- {
-- ["label"] = "Load Server Config",
-- ["condition"] = function(data)
-- return data.debug
-- end,
-- ["func"] = function(data)
-- gmInte.config = data
-- end,
-- }
}
// {
// ["label"] = "Load Server Config",
// ["condition"] = function(data)
// return data.debug
// end,
// ["func"] = function(data)
// gmInte.config = data
// end,
// }
local colorTable = {
["text"] = Color(255, 255, 255, 255),
["background"] = Color(0, 0, 0, 200),
@ -318,52 +276,44 @@ function gmInte.needRestart()
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())
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())
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
if gmInte.openAdminPanel then return end
gmInte.openAdminPanel = true
local frame = vgui.Create("DFrame")
frame:SetSize(400, (600 / 1080) * ScrH())
frame:Center()
@ -372,21 +322,17 @@ function gmInte.openConfigMenu(data)
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)
@ -394,98 +340,69 @@ function gmInte.openConfigMenu(data)
collapsibleCategory:SetLabel(catName)
collapsibleCategory:SetExpanded(true)
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
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)
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
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
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
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())
timer.Simple(actualConfig.onEditDelay || 0.5, function() if isLocalLastID == isLastID then actualConfig.onEdit(actualConfig.id, self:GetValue()) end end)
end
end)
end
elseif (actualConfig.type == "checkbox") then
elseif actualConfig.type == "checkbox" then
input = vgui.Create("DComboBox", panel)
if (actualConfig.condition && !actualConfig.condition(data)) then
input:SetEnabled(false)
end
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
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
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
@ -499,35 +416,28 @@ function gmInte.openConfigMenu(data)
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
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
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
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
if needRestart then gmInte.needRestart() end
end
end
//
// Concommands
//
concommand.Add("gmod_integration_admin", function() gmInte.SendNet("getConfig") end)
concommand.Add("gmi_admin", function() gmInte.SendNet("getConfig") end)

View File

@ -7,7 +7,6 @@ function gmInte.openVerifPopup()
frame:ShowCloseButton(false)
frame:MakePopup()
gmInte.applyPaint(frame)
local messageLabel = vgui.Create("DLabel", frame)
messageLabel:Dock(FILL)
messageLabel:DockMargin(10, 0, 10, 0)
@ -15,34 +14,27 @@ function gmInte.openVerifPopup()
messageLabel:SetContentAlignment(5)
messageLabel:SetFont("GmodIntegration_Roboto_16")
messageLabel:SetWrap(true)
local buttonGrid = vgui.Create("DGrid", frame)
buttonGrid:Dock(BOTTOM)
buttonGrid:DockMargin(10, 0, 10, 10)
buttonGrid:SetCols(2)
buttonGrid:SetColWide(frame:GetWide() / 2 - 10)
buttonGrid:SetRowHeight(35)
local button = vgui.Create("DButton")
button:SetText("Open Verification Page")
button.DoClick = function()
gui.OpenURL("https://verif.gmod-integration.com")
end
button.DoClick = function() gui.OpenURL("https://verif.gmod-integration.com") end
button:SetSize(buttonGrid:GetColWide() - 10, buttonGrid:GetRowHeight())
gmInte.applyPaint(button)
buttonGrid:AddItem(button)
local button = vgui.Create("DButton")
button:SetText("Refresh Verification")
button.DoClick = function()
gmInte.http.get("/users?steamID64" .. LocalPlayer():SteamID64(), function(code, body)
gmInte.SendNet("verifyMe")
frame:Close()
end,
function(code, body)
LocalPlayer():ChatPrint("Failed to refresh verification: " .. code)
end)
end, function(code, body) LocalPlayer():ChatPrint("Failed to refresh verification: " .. code) end)
end
button:SetSize(buttonGrid:GetColWide() - 10, buttonGrid:GetRowHeight())
gmInte.applyPaint(button)
buttonGrid:AddItem(button)

View File

@ -1,18 +1,8 @@
//
// Hook
//
// Player Finish Init
hook.Add("InitPostEntity", "gmInte:Ply:Ready", function()
gmInte.SendNet("ready")
end)
hook.Add("InitPostEntity", "gmInte:Ply:Ready", function() gmInte.SendNet("ready") end)
hook.Add("OnPlayerChat", "gmInte:OnPlayerChat:AdminCmd", function(ply, strText, bTeamOnly, bPlayerIsDead)
if (ply != LocalPlayer()) then return end
if ply != LocalPlayer() then return end
strText = string.lower(strText)
if (strText == "/gmi") then
if strText == "/gmi" then
gmInte.openAdminConfig()
return true
end

View File

@ -1,18 +1,15 @@
//
// Main
//
function gmInte.chatAddText(data)
local args = {}
for _, v in ipairs(data) do
table.insert(args, v.color)
table.insert(args, v.text)
end
chat.AddText(unpack(args))
end
function gmInte.showTestConnection(data)
if (data && data.id) then
if data && data.id then
chat.AddText(Color(255, 130, 92), "[Gmod Integration] ", Color(63, 102, 63), "Connection Successfull", Color(255, 255, 255), ", server logged as '" .. data.name .. "'")
else
chat.AddText(Color(255, 130, 92), "[Gmod Integration] ", Color(102, 63, 63), "Connection Failed", Color(255, 255, 255), ", please check your ID and Token")
@ -20,7 +17,7 @@ function gmInte.showTestConnection(data)
end
function gmInte.openAdminConfig()
if (!LocalPlayer():IsSuperAdmin()) then
if !LocalPlayer():IsSuperAdmin() then
chat.AddText(Color(255, 130, 92), "[Gmod Integration] ", Color(102, 63, 63), "You are not superadmin")
return
end

View File

@ -1,21 +1,8 @@
//
// Variables
//
local ImageCache = {}
//
// Functions
//
function gmInte.createImgurMaterials(materials, addon_var, folder, name)
if !file.Exists(folder, "DATA") then
file.CreateDir(folder)
end
if !file.Exists(folder, "DATA") then file.CreateDir(folder) end
local function getMatFromUrl(url, id)
materials[id] = Material("nil")
if file.Exists(folder .. "/" .. id .. ".png", "DATA") && !gmInte.config.redownloadMaterials then
addon_var[id] = Material("../data/" .. folder .. "/" .. id .. ".png", "noclamp smooth")
gmInte.log("materials", name .. " - Image Loaded - " .. id .. ".png")
@ -30,6 +17,7 @@ function gmInte.createImgurMaterials(materials, addon_var, folder, name)
["addon_var"] = addon_var,
["id"] = id
}
gmInte.log("materials", name .. " - Image Downloaded - " .. id .. ".png")
end)
end
@ -46,10 +34,7 @@ function gmInte.redowloadMaterials()
end
end
concommand.Add("gmod_integration_reload_materials", function()
gmInte.redowloadMaterials()
end)
concommand.Add("gmod_integration_reload_materials", function() gmInte.redowloadMaterials() end)
local materialsList = {
["logo"] = "y3Mypbn"
}

View File

@ -1,7 +1,3 @@
//
// Send Net
//
local netSend = {
["ready"] = 0,
["testConnection"] = 1,
@ -16,42 +12,26 @@ function gmInte.SendNet(id, args, func)
net.Start("gmIntegration")
net.WriteUInt(netSend[id], 8)
net.WriteString(util.TableToJSON(args || {}))
if (func) then func() end
if func then func() end
net.SendToServer()
end
//
// Receive Net
//
local netReceive = {
[1] = function(data)
gmInte.discordSyncChatPly(data)
end,
[2] = function(data)
gmInte.openConfigMenu(data)
end,
[3] = function(data)
gmInte.showTestConnection(data)
end,
[1] = function(data) gmInte.discordSyncChatPly(data) end,
[2] = function(data) gmInte.openConfigMenu(data) end,
[3] = function(data) gmInte.showTestConnection(data) end,
[5] = function(data)
gmInte.config = table.Merge(gmInte.config, data.config)
gmInte.version = data.other.version
if (!data.other.aprovedCredentials) then RunConsoleCommand("gmod_integration_admin") end
if !data.other.aprovedCredentials then RunConsoleCommand("gmod_integration_admin") end
end,
[6] = function(data)
gmInte.chatAddText(data)
end,
[7] = function()
gmInte.openVerifPopup()
end,
[8] = function(data)
gmInte.config.token = data.token
end
[6] = function(data) gmInte.chatAddText(data) end,
[7] = function() gmInte.openVerifPopup() end,
[8] = function(data) gmInte.config.token = data.token end
}
net.Receive("gmIntegration", function()
local id = net.ReadUInt(8)
local args = util.JSONToTable(net.ReadString())
if (netReceive[id]) then netReceive[id](args) end
if netReceive[id] then netReceive[id](args) end
end)

View File

@ -1,13 +1,8 @@
//
// Hooks
//
local ScreenshotRequested = false
local FailAttempts = 0
hook.Add("PostRender", "gmInteScreenshot", function()
if (!ScreenshotRequested) then return end
if !ScreenshotRequested then return end
ScreenshotRequested = false
local captureData = {
format = "jpeg",
x = 0,
@ -18,8 +13,8 @@ hook.Add("PostRender", "gmInteScreenshot", function()
}
local screenCapture = render.Capture(captureData)
if (!screenCapture) then
if (FailAttempts < 3) then
if !screenCapture then
if FailAttempts < 3 then
timer.Simple(0.5, function()
ScreenshotRequested = true
FailAttempts = FailAttempts + 1
@ -34,54 +29,29 @@ hook.Add("PostRender", "gmInteScreenshot", function()
end
local base64Capture = util.Base64Encode(screenCapture)
local size = math.Round(string.len(base64Capture) / 1024)
gmInte.log("Screenshot Taken - " .. size .. "KB", true)
gmInte.http.post("/clients/:steamID64/servers/:serverID/screenshots",
{
gmInte.http.post("/clients/:steamID64/servers/:serverID/screenshots", {
["player"] = gmInte.getPlayerFormat(LocalPlayer()),
["screenshot"] = base64Capture,
["captureData"] = captureData,
["size"] = size .. "KB"
},
function(code, body)
}, function(code, body)
gmInte.log("Screenshot sent to Discord", true)
chat.AddText(Color(255, 130, 92), "[Gmod Integration] ", Color(255, 255, 255), "Screenshot sent to Discord.")
end,
function(code, body)
gmInte.log("Screenshot failed to send to Discord, error code: " .. code, true)
end
)
end, function(code, body) gmInte.log("Screenshot failed to send to Discord, error code: " .. code, true) end)
end)
//
// Methods
//
function gmInte.takeScreenShot()
timer.Simple(0.5, function()
ScreenshotRequested = true
end)
timer.Simple(0.5, function() ScreenshotRequested = true end)
end
//
// Console Commands
//
concommand.Add("gmod_integration_screenshot", gmInte.takeScreenShot)
concommand.Add("gmi_screen", gmInte.takeScreenShot)
//
// Chat Commands
//
hook.Add("OnPlayerChat", "gmInteChatCommands", function(ply, text, teamChat, isDead)
if (ply != LocalPlayer()) then return end
if ply != LocalPlayer() then return end
text = string.lower(text)
text = string.sub(text, 2)
if (text == "screen") then
if text == "screen" then
gmInte.takeScreenShot()
return true
end

View File

@ -1,57 +0,0 @@
//
// Hooks
//
local StreamsRequeted = false
hook.Add("PostRender", "gmInte:PostRender:Stream:Frame", function()
if (!StreamsRequeted) then return end
StreamsRequeted = false
// Capture frame
local captureConfig = {
format = "jpeg",
x = 0,
y = 0,
w = ScrW(),
h = ScrH(),
quality = 30,
}
local screenCapture = render.Capture(captureConfig)
if (!screenCapture) then return end
screenCapture = util.Base64Encode(screenCapture)
local size = math.Round(string.len(screenCapture) / 1024)
gmInte.log("Frame captured, size: " .. size .. "KB", true)
gmInte.http.post("/clients/:steamID64/servers/:serverID/streams/frames",
{
["player"] = gmInte.getPlayerFormat(LocalPlayer()),
["base64Capture"] = screenCapture,
["captureConfig"] = captureConfig,
["size"] = size .. "KB"
},
function(code, body)
gmInte.log("Frame sent to WebPanel, size: " .. size .. "KB", true)
end,
function(code, body)
gmInte.log("Failed to send frame to WebPanel", true)
end
)
end)
local Steam = false
timer.Create("gmInte:Stream:Frame", 0.5, 0, function()
if (Steam) then
StreamsRequeted = true
end
end)
//
// Console Commands
//
concommand.Add("gmod_integration_stream", function()
Steam = !Steam
gmInte.log("Streaming frames to WebPanel: " .. tostring(Steam))
end)

View File

@ -1,10 +1,7 @@
local function formatName(name)
// all un down case
name = string.lower(name)
// first leter in upper case
name = string.upper(string.sub(name, 1, 1)) .. string.sub(name, 2)
// every letter after a space in upper case
name = string.gsub(name, "(%a)([%w_']*)", function(a,b) return string.upper(a) .. string.lower(b) end)
name = string.gsub(name, "(%a)([%w_']*)", function(a, b) return string.upper(a) .. string.lower(b) end)
return name
end

View File

@ -1,15 +1,8 @@
//
// WebSocket
//
local function websocketDLLExist()
local files, _ = file.Find("lua/bin/*", "GAME")
for k, v in pairs(files) do
if (v:find("gwsockets")) then
return true
if v:find("gwsockets") then return true end
end
end
return false
end
@ -22,18 +15,14 @@ if !websocketDLLExist() then
end
require("gwsockets")
local function getWebSocketURL()
local method = gmInte.isPrivateIP(gmInte.config.websocketFQDN) && "ws" || "wss"
return method .. "://" .. gmInte.config.websocketFQDN
end
local socket = GWSockets.createWebSocket(getWebSocketURL())
// Authentication
socket:setHeader("id", gmInte.config.id)
socket:setHeader("token", gmInte.config.token)
function gmInte.resetWebSocket()
socket:closeNow()
socket = GWSockets.createWebSocket(getWebSocketURL())
@ -47,12 +36,10 @@ function socket:onConnected()
gmInte.log("WebSocket Connected", true)
end
// log on message
function socket:onMessage(txt)
gmInte.log("WebSocket Message: " .. txt, true)
local data = util.JSONToTable(txt)
if (gmInte[data.method]) then
if gmInte[data.method] then
gmInte[data.method](data)
else
gmInte.logError("WebSocket Message: " .. txt .. " is not a valid method !", true)
@ -60,7 +47,7 @@ function socket:onMessage(txt)
end
function socket:onDisconnected()
if (hasConnected) then
if hasConnected then
hasConnected = false
gmInte.log("WebSocket Disconnected", true)
else
@ -73,7 +60,7 @@ function socket:onError(txt)
end
timer.Create("gmInte:WebSocket:CheckConnection", 4, 0, function()
if (!socket:isConnected()) then
if !socket:isConnected() then
gmInte.resetWebSocket()
socket:open()
end

View File

@ -1,50 +1,22 @@
local conFuncs = {
["version"] = function()
gmInte.log("Version: " .. gmInte.version)
end,
["setting"] = function(args)
gmInte.saveSetting(args[2], args[3])
end,
["try"] = function()
gmInte.tryConfig()
end,
["refresh"] = function()
gmInte.refreshSettings()
end,
["get-server-id"] = function()
print(gmInte.config.id || "none")
end,
["version"] = function() gmInte.log("Version: " .. gmInte.version) end,
["setting"] = function(args) gmInte.saveSetting(args[2], args[3]) end,
["try"] = function() gmInte.tryConfig() end,
["refresh"] = function() gmInte.refreshSettings() end,
["get-server-id"] = function() print(gmInte.config.id || "none") end,
["screenshot"] = function(args)
if (!args[2]) then return gmInte.log("No SteamID64 provided") end
if !args[2] then return gmInte.log("No SteamID64 provided") end
for _, ply in pairs(player.GetAll()) do
if (ply:SteamID64() == args[2]) then return gmInte.takeScreenshot(ply) end
if ply:SteamID64() == args[2] then return gmInte.takeScreenshot(ply) end
end
end,
}
concommand.Add("gmod-integration", function(ply, cmd, args)
// only usable by server console and superadmins
concommand.Add("gmi", function(ply, cmd, args)
if ply:IsPlayer() && !ply:IsSuperAdmin() then return end
// check if argument is valid
if conFuncs[args[1]] then
conFuncs[args[1]](args)
else
gmInte.log("Unknown Command Argument")
end
end)
concommand.Add("gm_integration", function(ply, cmd, args)
// run the old command
RunConsoleCommand("gmod-integration", unpack(args))
end)
concommand.Add("gmod_integration", function(ply, cmd, args)
// run the old command
RunConsoleCommand("gmod-integration", unpack(args))
end)
concommand.Add("gm-integration", function(ply, cmd, args)
// run the old command
RunConsoleCommand("gmod-integration", unpack(args))
end)

View File

@ -1,86 +1,38 @@
//
// Methods
//
local function filterMessage(reason)
local Message = {
"\n----------------------------------------\n",
"You cannot join this server",
"",
"Reason: " .. (reason && reason || "none"),
"Help URL: " .. (gmInte.config.supportLink && gmInte.config.supportLink || "none"),
"",
"Have a nice day",
"\n----------------------------------------\n",
"Service provided by Gmod Integration",
}
local Message = {"\n----------------------------------------\n", "You cannot join this server", "", "Reason: " .. (reason && reason || "none"), "Help URL: " .. (gmInte.config.supportLink && gmInte.config.supportLink || "none"), "", "Have a nice day", "\n----------------------------------------\n", "Service provided by Gmod Integration",}
for k, v in pairs(Message) do
Message[k] = "\n" .. v
end
return table.concat(Message)
end
local function checkTrustFactor(trustLevel)
if (gmInte.config.filterOnTrust && (trustLevel < gmInte.config.minimalTrust)) then
return false
end
if gmInte.config.filterOnTrust && (trustLevel < gmInte.config.minimalTrust) then return false end
return true
end
local function checkBanStatus(banStatus)
if (gmInte.config.filterOnBan && banStatus) then
return false
end
if gmInte.config.filterOnBan && banStatus then return false end
return true
end
local function checkDiscordBanStatus(banStatus)
if (gmInte.config.syncBan && banStatus) then
return false
end
if gmInte.config.syncBan && banStatus then return false end
return true
end
local function playerFilter(data)
if (data.bot == 1) then return end
if data.bot == 1 then return end
data.steamID64 = util.SteamIDTo64(data.networkid)
gmInte.http.get("/servers/:serverID/players/" .. data.steamID64,
function(code, body)
if (gmInte.config.maintenance && !body.bypassMaintenance && !body.discordAdmin) then
game.KickID(data.networkid, filterMessage("The server is currently under maintenance and you are not whitelisted."))
end
if (!checkBanStatus(body.ban)) then
game.KickID(data.networkid, filterMessage("You are banned from this server."))
end
if (!checkDiscordBanStatus(body.discord_ban)) then
game.KickID(data.networkid, filterMessage("You are banned from our discord server."))
end
-- if (!checkTrustFactor(body.trust)) then
-- game.KickID(data.networkid, filterMessage("Your trust factor is too low."))
-- end
end,
function (code, body)
if (gmInte.config.maintenance) then
game.KickID(data.networkid, filterMessage("The server is currently under maintenance and we cannot verify your account.\nVerification URL: https://verif.gmod-integration.com"))
end
end
)
gmInte.http.get("/servers/:serverID/players/" .. data.steamID64, function(code, body)
if gmInte.config.maintenance && !body.bypassMaintenance && !body.discordAdmin then game.KickID(data.networkid, filterMessage("The server is currently under maintenance and you are not whitelisted.")) end
if !checkBanStatus(body.ban) then game.KickID(data.networkid, filterMessage("You are banned from this server.")) end
if !checkDiscordBanStatus(body.discord_ban) then game.KickID(data.networkid, filterMessage("You are banned from our discord server.")) end
// if (!checkTrustFactor(body.trust)) then
// game.KickID(data.networkid, filterMessage("Your trust factor is too low."))
// end
end, function(code, body) if gmInte.config.maintenance then game.KickID(data.networkid, filterMessage("The server is currently under maintenance and we cannot verify your account.\nVerification URL: https://verif.gmod-integration.com")) end end)
end
//
// Hooks
//
gameevent.Listen("player_connect")
hook.Add("player_connect", "gmInte:Player:Connect:Filter", function(data)
playerFilter(data)
end)
hook.Add("player_connect", "gmInte:Player:Connect:Filter", function(data) playerFilter(data) end)

View File

@ -1,13 +1,4 @@
//
// Networking
//
util.AddNetworkString("gmIntegration")
//
// Send Net
//
local netSend = {
["wsRelayDiscordChat"] = 1,
["adminConfig"] = 2,
@ -20,58 +11,36 @@ local netSend = {
// Send
function gmInte.SendNet(id, data, ply, func)
if (!netSend[id]) then return end
if !netSend[id] then return end
net.Start("gmIntegration")
net.WriteUInt(netSend[id], 8)
net.WriteString(util.TableToJSON(data || {}))
if (func) then func() end
if (ply == nil) then
if func then func() end
if ply == nil then
net.Broadcast()
else
net.Send(ply)
end
end
//
// Receive net
//
local netReceive = {
[0] = function(ply)
hook.Run("gmInte:PlayerReady", ply)
end,
[1] = function(ply, data)
gmInte.testConnection(ply, data)
end,
[2] = function(ply)
gmInte.superadminGetConfig(ply)
end,
[3] = function(ply, data)
gmInte.superadminSetConfig(ply, data)
end,
[4] = function(ply)
gmInte.takeScreenshot(ply)
end,
[0] = function(ply) hook.Run("gmInte:PlayerReady", ply) end,
[1] = function(ply, data) gmInte.testConnection(ply, data) end,
[2] = function(ply) gmInte.superadminGetConfig(ply) end,
[3] = function(ply, data) gmInte.superadminSetConfig(ply, data) end,
[4] = function(ply) gmInte.takeScreenshot(ply) end,
[5] = function(ply)
if (!ply:IsSuperAdmin()) then return end
if !ply:IsSuperAdmin() then return end
RunConsoleCommand("changelevel", game.GetMap())
end,
[6] = function(ply)
gmInte.verifyPlayer(ply)
end,
[7] = function(ply, data)
sendPlayerToken(ply)
end
[6] = function(ply) gmInte.verifyPlayer(ply) end,
[7] = function(ply, data) sendPlayerToken(ply) end
}
net.Receive("gmIntegration", function(len, ply)
if (!ply || ply && !ply:IsValid()) then return end
if !ply || ply && !ply:IsValid() then return end
local id = net.ReadUInt(8)
local data = util.JSONToTable(net.ReadString() || "{}")
if (!netReceive[id]) then return end
if !netReceive[id] then return end
netReceive[id](ply, data)
end)

View File

@ -1,16 +1,9 @@
//
// Methods
//
function gmInte.playerReady(ply)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
// Initialize Time
ply.gmIntTimeConnect = math.Round(RealTime())
// Send Public Config
gmInte.publicGetConfig(ply)
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/ready", {
["player"] = gmInte.getPlayerFormat(ply)
})
@ -22,109 +15,80 @@ function gmInte.playerConnect(data)
end
function gmInte.playerDisconnected(ply)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/disconnect",
{
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/disconnect", {
["player"] = gmInte.getPlayerFormat(ply),
}
)
})
end
function gmInte.playerSpawn(ply)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/spawn",
{
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/spawn", {
["player"] = gmInte.getPlayerFormat(ply)
}
)
})
end
function gmInte.playerDeath(ply, inflictor, attacker)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
if (!attacker:IsValid() || !attacker:IsPlayer(attacker)) then return end
if (!inflictor:IsValid()) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/death",
{
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
if !attacker:IsValid() || !attacker:IsPlayer(attacker) then return end
if !inflictor:IsValid() then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/death", {
["player"] = gmInte.getPlayerFormat(ply),
["inflictor"] = gmInte.getEntityFormat(inflictor),
["attacker"] = gmInte.getPlayerFormat(attacker)
}
)
})
end
function gmInte.playerInitialSpawn(ply)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/initial-spawn",
{
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/initial-spawn", {
["player"] = gmInte.getPlayerFormat(ply)
}
)
})
end
function gmInte.postLogPlayerHurt(ply, attacker, healthRemaining, damageTaken)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
if (!attacker:IsValid() || !attacker:IsPlayer(attacker)) then return end
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
if !attacker:IsValid() || !attacker:IsPlayer(attacker) then return end
// Wait a second to see if the player is going to be hurt again
ply.gmodInteLastHurt = ply.gmodInteLastHurt || {}
local locCurTime = CurTime()
ply.gmodInteLastHurt[attacker:SteamID64()] = locCurTime
timer.Simple(1, function()
if (ply.gmodInteLastHurt[attacker:SteamID64()] != locCurTime) then
if ply.gmodInteLastHurt[attacker:SteamID64()] != locCurTime then
ply.gmodInteTotalDamage = ply.gmodInteTotalDamage || 0
ply.gmodInteTotalDamage = ply.gmodInteTotalDamage + damageTaken
return
end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/hurt",
{
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/hurt", {
["victim"] = gmInte.getPlayerFormat(ply),
["attacker"] = gmInte.getPlayerFormat(attacker),
["healthRemaining"] = math.Round(healthRemaining),
["damageTaken"] = math.Round(damageTaken)
}
)
})
end)
end
function gmInte.postLogPlayerSpawnedSomething(object, ply, ent, model)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
if (!ent:IsValid()) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/spawn/" .. object,
{
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
if !ent:IsValid() then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/spawn/" .. object, {
["player"] = gmInte.getPlayerFormat(ply),
["entity"] = gmInte.getEntityFormat(ent),
["model"] = model || ""
}
)
})
end
function gmInte.postLogPlayerGive(ply, class, swep)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/give",
{
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/give", {
["player"] = gmInte.getPlayerFormat(ply),
["class"] = class,
["swep"] = swep
}
)
})
end
//
// Hooks
//
hook.Add("gmInte:PlayerReady", "gmInte:Player:Ready", function(ply)
gmInte.playerReady(ply)
end)
hook.Add("gmInte:PlayerReady", "gmInte:Player:Ready", function(ply) gmInte.playerReady(ply) end)
hook.Add("ShutDown", "gmInte:Server:Shutdown:SavePlayers", function()
for ply, ply in pairs(player.GetAll()) do
gmInte.playerDisconnected(ply)
@ -132,58 +96,17 @@ hook.Add("ShutDown", "gmInte:Server:Shutdown:SavePlayers", function()
end)
gameevent.Listen("player_connect")
hook.Add("player_connect", "gmInte:Player:Connect", function(data)
gmInte.playerConnect(data)
end)
hook.Add("PlayerDisconnected", "gmInte:Player:Disconnect", function(ply)
gmInte.playerDisconnected(ply)
end)
hook.Add("PlayerSpawn", "gmInte:Player:Spawn", function(ply)
gmInte.playerSpawn(ply)
end)
hook.Add("PlayerInitialSpawn", "gmInte:Player:InitialSpawn", function(ply)
gmInte.playerInitialSpawn(ply)
end)
hook.Add("PlayerGiveSWEP", "gmInte:Player:SWEPs", function( ply, class, swep )
gmInte.postLogPlayerGive(ply, class, swep)
end)
hook.Add("PlayerDeath", "gmInte:Player:Death", function(ply, inflictor, attacker)
gmInte.playerDeath(ply, inflictor, attacker)
end)
hook.Add("PlayerHurt", "gmInte:Player:Hurt", function(ply, attacker, healthRemaining, damageTaken)
gmInte.postLogPlayerHurt(ply, attacker, healthRemaining, damageTaken)
end)
hook.Add("PlayerSpawnedProp", "gmInte:Player:SpawnedProp", function(ply, model, ent)
gmInte.postLogPlayerSpawnedSomething("prop", ply, ent, model)
end)
hook.Add("PlayerSpawnedSENT", "gmInte:Player:SpawnedSENT", function(ply, ent)
gmInte.postLogPlayerSpawnedSomething("sent", ply, ent)
end)
hook.Add("PlayerSpawnedNPC", "gmInte:Player:SpawnedNPC", function(ply, ent)
gmInte.postLogPlayerSpawnedSomething("npc", ply, ent)
end)
hook.Add("PlayerSpawnedVehicle", "gmInte:Player:SpawnedVehicle", function(ply, ent)
gmInte.postLogPlayerSpawnedSomething("vehicle", ply, ent)
end)
hook.Add("PlayerSpawnedEffect", "gmInte:Player:SpawnedEffect", function(ply, model, ent)
gmInte.postLogPlayerSpawnedSomething("effect", ply, ent, model)
end)
hook.Add("PlayerSpawnedRagdoll", "gmInte:Player:SpawnedRagdoll", function(ply, model, ent)
gmInte.postLogPlayerSpawnedSomething("ragdoll", ply, ent, model)
end)
hook.Add("PlayerSpawnedSWEP", "gmInte:Player:SpawnedSWEP", function(ply, ent)
gmInte.postLogPlayerSpawnedSomething("swep", ply, ent)
end)
hook.Add("player_connect", "gmInte:Player:Connect", function(data) gmInte.playerConnect(data) end)
hook.Add("PlayerDisconnected", "gmInte:Player:Disconnect", function(ply) gmInte.playerDisconnected(ply) end)
hook.Add("PlayerSpawn", "gmInte:Player:Spawn", function(ply) gmInte.playerSpawn(ply) end)
hook.Add("PlayerInitialSpawn", "gmInte:Player:InitialSpawn", function(ply) gmInte.playerInitialSpawn(ply) end)
hook.Add("PlayerGiveSWEP", "gmInte:Player:SWEPs", function(ply, class, swep) gmInte.postLogPlayerGive(ply, class, swep) end)
hook.Add("PlayerDeath", "gmInte:Player:Death", function(ply, inflictor, attacker) gmInte.playerDeath(ply, inflictor, attacker) end)
hook.Add("PlayerHurt", "gmInte:Player:Hurt", function(ply, attacker, healthRemaining, damageTaken) gmInte.postLogPlayerHurt(ply, attacker, healthRemaining, damageTaken) end)
hook.Add("PlayerSpawnedProp", "gmInte:Player:SpawnedProp", function(ply, model, ent) gmInte.postLogPlayerSpawnedSomething("prop", ply, ent, model) end)
hook.Add("PlayerSpawnedSENT", "gmInte:Player:SpawnedSENT", function(ply, ent) gmInte.postLogPlayerSpawnedSomething("sent", ply, ent) end)
hook.Add("PlayerSpawnedNPC", "gmInte:Player:SpawnedNPC", function(ply, ent) gmInte.postLogPlayerSpawnedSomething("npc", ply, ent) end)
hook.Add("PlayerSpawnedVehicle", "gmInte:Player:SpawnedVehicle", function(ply, ent) gmInte.postLogPlayerSpawnedSomething("vehicle", ply, ent) end)
hook.Add("PlayerSpawnedEffect", "gmInte:Player:SpawnedEffect", function(ply, model, ent) gmInte.postLogPlayerSpawnedSomething("effect", ply, ent, model) end)
hook.Add("PlayerSpawnedRagdoll", "gmInte:Player:SpawnedRagdoll", function(ply, model, ent) gmInte.postLogPlayerSpawnedSomething("ragdoll", ply, ent, model) end)
hook.Add("PlayerSpawnedSWEP", "gmInte:Player:SpawnedSWEP", function(ply, ent) gmInte.postLogPlayerSpawnedSomething("swep", ply, ent) end)

View File

@ -1,24 +1,16 @@
//
// Methods
//
function gmInte.verifyPlayer(ply)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
gmInte.http.get("/user?steamID64=" .. ply:SteamID64(), function(code, data)
if (data && data.discordID) then
ply.gmIntVerified = true
end
if (!gmInte.config.forcePlayerLink || !ply.gmIntIsReady) then return end
if (ply:gmIntIsVerified()) then
if data && data.discordID then ply.gmIntVerified = true end
if !gmInte.config.forcePlayerLink || !ply.gmIntIsReady then return end
if ply:gmIntIsVerified() then
gmInte.SendNet("chatColorMessage", {
[1] = {
["text"] = "You have been verified",
["color"] = Color(255, 255, 255)
}
}, ply)
ply:Freeze(false)
else
gmInte.SendNet("chatColorMessage", {
@ -27,19 +19,15 @@ function gmInte.verifyPlayer(ply)
["color"] = Color(255, 0, 0)
}
}, ply)
ply:Freeze(true)
gmInte.SendNet("openVerifPopup", nil, ply)
end
end)
end
//
// Hooks
//
hook.Add("gmInte:PlayerReady", "gmInte:Verif:PlayerReady", function(ply)
ply.gmIntIsReady = true
if (!gmInte.config.forcePlayerLink) then return end
if !gmInte.config.forcePlayerLink then return end
gmInte.verifyPlayer(ply)
end)

View File

@ -1,7 +1,3 @@
//
// Websocket
//
function gmInte.wsRcon(data)
gmInte.log("Rcon Command from Discord '" .. data.command .. "' by " .. data.steamID)
game.ConsoleCommand(data.command .. "\n")

View File

@ -5,23 +5,17 @@ function gmInte.saveSetting(setting, value)
end
// Boolean
if (value == "true") then value = true end
if (value == "false") then value = false end
if value == "true" then value = true end
if value == "false" then value = false end
// Number
if (tonumber(value) != nil) then value = tonumber(value) end
if tonumber(value) != nil then value = tonumber(value) end
gmInte.config[setting] = value
file.Write("gm_integration/config.json", util.TableToJSON(gmInte.config, true))
gmInte.log("Setting Saved")
if (value == "websocketFQDN" || value == "id" || value == "token") then
gmInte.resetWebSocket()
end
if value == "websocketFQDN" || value == "id" || value == "token" then gmInte.resetWebSocket() end
// send to all players the new public config
for _, ply in pairs(player.GetAll()) do
if (ply:IsValid() && ply:IsPlayer(ply)) then
if ply:IsValid() && ply:IsPlayer(ply) then
gmInte.log("Sending new Public Config to " .. ply:Nick(), true)
gmInte.publicGetConfig(ply)
end
@ -29,26 +23,17 @@ function gmInte.saveSetting(setting, value)
end
function gmInte.tryConfig()
gmInte.http.get("/servers/:serverID",
function(code, body)
gmInte.http.get("/servers/:serverID", function(code, body)
print(" ")
gmInte.log("Congratulations your server is now connected to Gmod Integration")
gmInte.log("Server Name: " .. body.name)
gmInte.log("Server ID: " .. body.id)
print(" ")
end
)
end)
end
function gmInte.testConnection(ply)
gmInte.http.get("/servers/:serverID",
function(code, body)
if (ply) then gmInte.SendNet("testApiConnection", body, ply) end
end,
function(code, body)
if (ply) then gmInte.SendNet("testApiConnection", body, ply) end
end
)
gmInte.http.get("/servers/:serverID", function(code, body) if ply then gmInte.SendNet("testApiConnection", body, ply) end end, function(code, body) if ply then gmInte.SendNet("testApiConnection", body, ply) end end)
end
function gmInte.refreshSettings()
@ -58,15 +43,13 @@ function gmInte.refreshSettings()
end
function gmInte.superadminGetConfig(ply)
if (!ply:IsValid() || !ply:IsPlayer(ply) || !ply:IsSuperAdmin()) then return end
if !ply:IsValid() || !ply:IsPlayer(ply) || !ply:IsSuperAdmin() then return end
gmInte.config.websocket = GWSockets && true || false
gmInte.SendNet("adminConfig", gmInte.config, ply)
end
function gmInte.publicGetConfig(ply)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
gmInte.SendNet("publicConfig", {
["config"] = {
["id"] = gmInte.config.id,
@ -82,13 +65,10 @@ function gmInte.publicGetConfig(ply)
end
function gmInte.superadminSetConfig(ply, data)
if (!ply:IsValid() || !ply:IsPlayer(ply) || !ply:IsSuperAdmin()) then return end
if !ply:IsValid() || !ply:IsPlayer(ply) || !ply:IsSuperAdmin() then return end
for k, v in pairs(data) do
gmInte.saveSetting(k, v)
end
if data.token || data.id then
gmInte.testConnection(ply)
end
if data.token || data.id then gmInte.testConnection(ply) end
end

View File

@ -1,7 +1,3 @@
//
// Methods
//
function gmInte.sendStatus()
gmInte.http.post("/servers/:serverID/status", gmInte.getServerFormat())
end
@ -14,24 +10,6 @@ function gmInte.serverShutDown()
gmInte.http.post("/servers/:serverID/stop")
end
//
// Timers
//
timer.Create("gmInte.sendStatus", 300, 0, function()
gmInte.sendStatus()
end)
//
// Hooks
//
hook.Add("Initialize", "gmInte:Server:Initialize:SendStatus", function()
timer.Simple(1, function()
gmInte.serverStart()
end)
end)
hook.Add("ShutDown", "gmInte:Server:ShutDown:SendStatus", function()
gmInte.serverShutDown()
end)
timer.Create("gmInte.sendStatus", 300, 0, function() gmInte.sendStatus() end)
hook.Add("Initialize", "gmInte:Server:Initialize:SendStatus", function() timer.Simple(1, function() gmInte.serverStart() end) end)
hook.Add("ShutDown", "gmInte:Server:ShutDown:SendStatus", function() gmInte.serverShutDown() end)

View File

@ -1,29 +1,13 @@
//
// Websocket
//
function gmInte.wsSyncBan(data)
for _, ply in ipairs(player.GetAll()) do
if (ply:SteamID64() == data.steam) then
ply:Kick(data.reason || "You have been banned from the server.")
end
if ply:SteamID64() == data.steam then ply:Kick(data.reason || "You have been banned from the server.") end
end
end
//
// Methods
//
function gmInte.playerBan(data)
data.steamID64 = util.SteamIDTo64(data.networkid)
gmInte.http.post("/servers/:serverID/players/" .. util.SteamIDTo64(data.networkid) .. "/ban", data)
end
//
// Hooks
//
gameevent.Listen("server_addban")
hook.Add("server_addban", "gmInte:Player:Ban", function(data)
gmInte.playerBan(data)
end)
hook.Add("server_addban", "gmInte:Player:Ban", function(data) gmInte.playerBan(data) end)

View File

@ -1,29 +1,13 @@
//
// Websocket
//
function gmInte.wsPlayerSay(data)
gmInte.SendNet("wsRelayDiscordChat", data, nil)
end
//
// Methods
//
function gmInte.playerSay(ply, text, teamOnly)
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/say",
{
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/say", {
["player"] = gmInte.getPlayerFormat(ply),
["text"] = text,
["teamOnly"] = teamOnly,
}
)
})
end
//
// Hooks
//
hook.Add("PlayerSay", "gmInte:SyncChat:PlayerSay", function(ply, text, team)
gmInte.playerSay(ply, text, team)
end)
hook.Add("PlayerSay", "gmInte:SyncChat:PlayerSay", function(ply, text, team) gmInte.playerSay(ply, text, team) end)

View File

@ -1,30 +1,12 @@
//
// Websocket
//
function gmInte.wsSyncKick(data)
for _, ply in ipairs(player.GetAll()) do
if (ply:SteamID64() == data.steam) then
ply:Kick(data.reason || "You have been banned from the server.")
end
if ply:SteamID64() == data.steam then ply:Kick(data.reason || "You have been banned from the server.") end
end
end
//
// Methods
//
function gmInte.playerKick(data)
gmInte.http.post("/servers/:serverID/players/" .. util.SteamIDTo64(data.networkid) .. "/kick", data)
end
//
// Hooks
//
gameevent.Listen("player_disconnect")
hook.Add("player_disconnect", "gmInte:SyncKick:Disconnect", function(data)
if (string.StartWith(data.reason, "Kicked by ") || data.reason == "No reason provided.") then
gmInte.playerKick(data)
end
end)
hook.Add("player_disconnect", "gmInte:SyncKick:Disconnect", function(data) if string.StartWith(data.reason, "Kicked by ") || data.reason == "No reason provided." then gmInte.playerKick(data) end end)

View File

@ -1,33 +1,16 @@
//
// Websocket
//
function gmInte.wsSyncName(data)
local ply = player.GetBySteamID(data.player.steamID64)
if not IsValid(ply) then return end
if !IsValid(ply) then return end
ply:SetName(data.newName)
end
//
// Methods
//
function gmInte.playerChangeName(ply, oldName, newName)
if (!ply:IsValid() || !ply:IsPlayer(ply)) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/name",
{
if !ply:IsValid() || !ply:IsPlayer(ply) then return end
gmInte.http.post("/servers/:serverID/players/" .. ply:SteamID64() .. "/name", {
["player"] = gmInte.getPlayerFormat(ply),
["oldName"] = oldName,
["newName"] = newName,
}
)
})
end
//
// Hooks
//
hook.Add("onPlayerChangedName", "gmInte:PlayerChangeName", function(ply, old, new)
gmInte.playerChangeName(ply, old, new)
end)
hook.Add("onPlayerChangedName", "gmInte:PlayerChangeName", function(ply, old, new) gmInte.playerChangeName(ply, old, new) end)

View File

@ -1,31 +1,17 @@
//
// Websocket
//
local cachedPlayers = {}
function gmInte.wsPlayerUpdateGroup(data)
if (cachedPlayers[steamID64] == data.group) then return end
if cachedPlayers[steamID64] == data.group then return end
data.steamID = util.SteamIDFrom64(data.steamID64)
data.group = data.add && data.group || "user"
cachedPlayers[data.steamID64] = data.group
local ply = player.GetBySteamID(data.steamID)
if (ply && ply:IsValid()) then
ply:SetUserGroup(data.group)
end
if ply && ply:IsValid() then ply:SetUserGroup(data.group) end
// ULX
if (ULib) then
ULib.ucl.addUser(data.steamID, nil, nil, data.group)
end
if ULib then ULib.ucl.addUser(data.steamID, nil, nil, data.group) end
// ServerGuard
if (serverguard) then
if serverguard then
local ply = player.GetBySteamID(data.steamID)
if (ply) then
if ply then
local rankData = serverguard.ranks:GetRank(data.group)
serverguard.player:SetRank(ply, data.group)
serverguard.player:SetImmunity(ply, rankData.immunity)
@ -37,52 +23,27 @@ function gmInte.wsPlayerUpdateGroup(data)
end
// Evolve
if (evolve) then
evolve:RankPlayer(data.steamID64, data.group)
end
if evolve then evolve:RankPlayer(data.steamID64, data.group) end
// SAM
if (SAM) then
SAM:PlayerSetRank(data.steamID64, data.group)
end
if SAM then SAM:PlayerSetRank(data.steamID64, data.group) end
// sam (wtf another one?)
if (sam) then
sam.player.setRank(data.steamID64, data.group)
end
if sam then sam.player.setRank(data.steamID64, data.group) end
// xAdmin
if (xAdmin) then
xAdmin.SetRank(data.steamID64, data.group)
end
if xAdmin then xAdmin.SetRank(data.steamID64, data.group) end
// maestro
if (maestro) then
maestro.userrank(data.steamID64, data.group)
end
if maestro then maestro.userrank(data.steamID64, data.group) end
// D3A
if (D3A) then
D3A.Ranks.SetSteamIDRank(data.steamID, data.group)
end
if D3A then D3A.Ranks.SetSteamIDRank(data.steamID, data.group) end
// Mercury
if (Mercury) then
RunConsoleCommand("hg", "setrank", data.steamID, data.group)
end
if Mercury then RunConsoleCommand("hg", "setrank", data.steamID, data.group) end
// FAdmin
if (FAdmin) then
RunConsoleCommand("fadmin", "setaccess", data.steamID, data.group)
end
if FAdmin then RunConsoleCommand("fadmin", "setaccess", data.steamID, data.group) end
gmInte.log("[Sync Role] Player " .. data.steamID .. " has been updated to group " .. data.group)
end
function gmInte.playerChangeGroup(steamID64, oldGroup, newGroup)
if (cachedPlayers[steamID64] == newGroup) then return end
if cachedPlayers[steamID64] == newGroup then return end
cachedPlayers[steamID64] = newGroup
gmInte.http.post("/servers/:serverID/players/" .. steamID64 .. "/group", {
["player"] = gmInte.getPlayerFormat(ply),
["oldGroup"] = oldGroup || "user",
@ -90,12 +51,12 @@ function gmInte.playerChangeGroup(steamID64, oldGroup, newGroup)
})
end
hook.Add('CAMI.PlayerUsergroupChanged', 'gmInte:SyncChat:CAMI:PlayerUsergroupChanged', function(ply, old, new)
if (ply:IsBot() || !ply:IsValid()) then return end
hook.Add("CAMI.PlayerUsergroupChanged", "gmInte:SyncChat:CAMI:PlayerUsergroupChanged", function(ply, old, new)
if ply:IsBot() || !ply:IsValid() then return end
gmInte.playerChangeGroup(ply:SteamID64(), old, new)
end)
hook.Add('CAMI.SteamIDUsergroupChanged', 'gmInte:SyncChat:CAMI:SteamIDUsergroupChanged', function(SteamID64, old, new)
if (string.StartWith(SteamID64, "STEAM_")) then SteamID64 = util.SteamIDTo64(SteamID64) end
hook.Add("CAMI.SteamIDUsergroupChanged", "gmInte:SyncChat:CAMI:SteamIDUsergroupChanged", function(SteamID64, old, new)
if string.StartWith(SteamID64, "STEAM_") then SteamID64 = util.SteamIDTo64(SteamID64) end
gmInte.playerChangeGroup(SteamID64, old, new)
end)

View File

@ -1,11 +1,7 @@
//
// Methods
//
gmInte.serverPublicToken = gmInte.serverPublicToken || nil
function gmInte.getPublicServerToken(callback)
if (gmInte.serverPublicToken) then
if (callback) then callback(gmInte.serverPublicToken) end
if gmInte.serverPublicToken then
if callback then callback(gmInte.serverPublicToken) end
return
end
@ -15,24 +11,20 @@ function gmInte.getPublicServerToken(callback)
end)
end
hook.Add("Initialize", "gmInte:Server:Initialize:GetPublicToken", function()
timer.Simple(1, function()
gmInte.getPublicServerToken(function(publicToken)
gmInte.log("Server Public Token Received: " .. publicToken)
end)
end)
end)
gmInte.serverPlayerTempTokens = gmInte.serverPlayerTempTokens || {}
function gmInte.getPlayerTempToken(ply, callback)
if (gmInte.serverPlayerTempTokens[ply:SteamID64()] && gmInte.serverPlayerTempTokens[ply:SteamID64()].userID == ply:UserID()) then
if (callback) then callback(gmInte.serverPlayerTempTokens[ply:SteamID64()].token) end
if gmInte.serverPlayerTempTokens[ply:SteamID64()] && gmInte.serverPlayerTempTokens[ply:SteamID64()].userID == ply:UserID() then
if callback then callback(gmInte.serverPlayerTempTokens[ply:SteamID64()].token) end
return
end
gmInte.getPublicServerToken(function(publicToken)
local token = util.SHA256(ply:SteamID64() .. "-" .. publicToken .. "-" .. gmInte.config.token .. "-" .. ply:UserID()) .. " " .. ply:UserID()
gmInte.serverPlayerTempTokens[ply:SteamID64()] = { token = token, userID = ply:UserID() }
gmInte.serverPlayerTempTokens[ply:SteamID64()] = {
token = token,
userID = ply:UserID()
}
callback(token)
end)
end
@ -45,6 +37,5 @@ function sendPlayerToken(ply)
end)
end
hook.Add("gmInte:PlayerReady", "gmInte:Verif:PlayerReady", function(ply)
sendPlayerToken(ply)
end)
hook.Add("gmInte:PlayerReady", "gmInte:Verif:PlayerReady", function(ply) sendPlayerToken(ply) end)
hook.Add("Initialize", "gmInte:Server:Initialize:GetPublicToken", function() timer.Simple(1, function() gmInte.getPublicServerToken(function(publicToken) gmInte.log("Server Public Token Received: " .. publicToken) end) end) end)

View File

@ -1,5 +1,5 @@
function gmInte.getPlayerFormat(ply)
if (!IsValid(ply) || !ply:IsPlayer()) then return end
if !IsValid(ply) || !ply:IsPlayer() then return end
return {
["steamID"] = ply:SteamID(),
["steamID64"] = ply:SteamID64(),
@ -40,7 +40,7 @@ function gmInte.getServerFormat()
end
function gmInte.getWeaponFormat(weapon)
if (!IsValid(weapon) || !weapon:IsWeapon()) then return end
if !IsValid(weapon) || !weapon:IsWeapon() then return end
return {
["class"] = weapon:GetClass(),
["printName"] = weapon:GetPrintName()
@ -48,7 +48,7 @@ function gmInte.getWeaponFormat(weapon)
end
function gmInte.getEntityFormat(ent)
if (!IsValid(ent)) then return end
if !IsValid(ent) then return end
return {
["class"] = ent:GetClass(),
["model"] = ent:GetModel(),
@ -58,7 +58,7 @@ function gmInte.getEntityFormat(ent)
end
function gmInte.getVectorFormat(vec)
if (!isvector(vec)) then return end
if !isvector(vec) then return end
return {
["x"] = math.Round(vec.x),
["y"] = math.Round(vec.y),
@ -67,7 +67,7 @@ function gmInte.getVectorFormat(vec)
end
function gmInte.getAngleFormat(ang)
if (!isangle(ang)) then return end
if !isangle(ang) then return end
return {
["p"] = math.Round(ang.p),
["y"] = math.Round(ang.y),
@ -76,7 +76,7 @@ function gmInte.getAngleFormat(ang)
end
function gmInte.getTeamFormat(teamID)
if (!isnumber(teamID)) then return end
if !isnumber(teamID) then return end
return {
["id"] = teamID,
["name"] = team.GetName(teamID)

View File

@ -1,32 +1,22 @@
//
// Methods
//
local cacheErrors = {}
function gmInte.sendLuaErrorReport(err, realm, stack, name, id)
cacheErrors[err] = {
["time"] = CurTime(),
["count"] = cacheErrors[err] && cacheErrors[err].count + 1 || 1,
}
if (!gmInte.config.id || !gmInte.config.token) then return end
if (CLIENT && !IsValid(LocalPlayer())) then return end
if !gmInte.config.id || !gmInte.config.token then return end
if CLIENT && !IsValid(LocalPlayer()) then return end
local count = cacheErrors[err].count
timer.Simple(0.5, function()
if (cacheErrors[err].count != count) then
if (cacheErrors[err].count == 100) then
else
return
end
if cacheErrors[err].count != count then
if cacheErrors[err].count != 100 then return end
else
cacheErrors[err] = nil
end
local endpoint = SERVER && "/servers/:serverID/errors" || "/clients/:steamID64/servers/:serverID/errors"
gmInte.http.post(endpoint,
{
gmInte.http.post(endpoint, {
["error"] = err,
["realm"] = realm,
["stack"] = stack,
@ -35,15 +25,8 @@ function gmInte.sendLuaErrorReport(err, realm, stack, name, id)
["count"] = count,
["uptime"] = math.Round(RealTime()),
["identifier"] = SERVER && gmInte.config.id || CLIENT && LocalPlayer():SteamID64()
}
)
})
end)
end
//
// Hooks
//
hook.Add("OnLuaError", "gmInte:OnLuaError:SendReport", function(err, realm, stack, name, id)
gmInte.sendLuaErrorReport(err, realm, stack, name, id)
end)
hook.Add("OnLuaError", "gmInte:OnLuaError:SendReport", function(err, realm, stack, name, id) gmInte.sendLuaErrorReport(err, realm, stack, name, id) end)

View File

@ -1,23 +1,14 @@
local apiVersion = "v3"
gmInte.http = gmInte.http || {}
local function getAPIURL(endpoint)
local method = gmInte.isPrivateIP(gmInte.config.apiFQDN) && "http" || "https"
endpoint = string.gsub(endpoint, ":serverID", gmInte.config.id)
if (CLIENT) then
endpoint = string.gsub(endpoint, ":steamID64", LocalPlayer():SteamID64())
end
if CLIENT then endpoint = string.gsub(endpoint, ":steamID64", LocalPlayer():SteamID64()) end
return method .. "://" .. gmInte.config.apiFQDN .. "/" .. apiVersion .. endpoint
end
local function showableBody(endpoint)
if (string.sub(endpoint, 1, 8) == "/streams" || string.sub(endpoint, 1, 12) == "/screenshots") then
return false
end
if string.sub(endpoint, 1, 8) == "/streams" || string.sub(endpoint, 1, 12) == "/screenshots" then return false end
return true
end
@ -32,8 +23,7 @@ function gmInte.http.requestAPI(params)
local version = gmInte.version || "Unknown"
local showableBody = showableBody(params.endpoint)
local localRequestID = util.CRC(tostring(SysTime()))
if (token == "") then
if token == "" then
return failed(401, {
["error"] = "No token provided"
})
@ -51,7 +41,6 @@ function gmInte.http.requestAPI(params)
gmInte.log("HTTP Request ID: " .. localRequestID, true)
gmInte.log("HTTP Request: " .. method .. " " .. url, true)
gmInte.log("HTTP Body: " .. (showableBody && body || "HIDDEN"), true)
HTTP({
["url"] = url,
["method"] = method,
@ -62,15 +51,13 @@ function gmInte.http.requestAPI(params)
gmInte.log("HTTP Request ID: " .. localRequestID, true)
gmInte.log("HTTP Response: " .. code, true)
gmInte.log("HTTP Body: " .. body, true)
if (string.sub(headers["Content-Type"], 1, 16) != "application/json") then
if string.sub(headers["Content-Type"], 1, 16) != "application/json" then
gmInte.log("HTTP Failed: Invalid Content-Type", true)
return failed(code, body)
end
body = util.JSONToTable(body || "{}")
if (code < 200 || code >= 300) then
if code < 200 || code >= 300 then
gmInte.log("HTTP Failed: Invalid Status Code", true)
return failed(code, body)
end
@ -85,10 +72,6 @@ function gmInte.http.requestAPI(params)
})
end
//
// HTTP Methods
//
function gmInte.http.get(endpoint, onSuccess, onFailed)
gmInte.http.requestAPI({
["endpoint"] = endpoint,

View File

@ -1,59 +1,50 @@
//
// Functions
//
// Log
function gmInte.log(msg, debug)
if (debug && !gmInte.config.debug) then return end
if debug && !gmInte.config.debug then return end
print("[" .. os.date("%Y-%m-%d %H:%M:%S") .. "] [Gmod Integration] " .. msg)
end
// Log Error
function gmInte.logError(msg, debug)
if (debug && !gmInte.config.debug) then return end
if debug && !gmInte.config.debug then return end
print("[" .. os.date("%Y-%m-%d %H:%M:%S") .. "] [Gmod Integration] [ERROR] " .. msg)
end
// Log Warning
function gmInte.logWarning(msg, debug)
if (debug && !gmInte.config.debug) then return end
if debug && !gmInte.config.debug then return end
print("[" .. os.date("%Y-%m-%d %H:%M:%S") .. "] [Gmod Integration] [WARNING] " .. msg)
end
// Log Hint
function gmInte.logHint(msg, debug)
if (debug && !gmInte.config.debug) then return end
if debug && !gmInte.config.debug then return end
print("[" .. os.date("%Y-%m-%d %H:%M:%S") .. "] [Gmod Integration] [HINT] " .. msg)
end
// Is Private IP
function gmInte.isPrivateIP(ip)
// detect localhost
if (ip == "localhost") then return true end
if ip == "localhost" then return true end
// detect private IP addresses (RFC 1918)
local parts = string.Explode(".", ip)
if (parts[1] == "192" && parts[2] == "168") then return true end
if (parts[1] == "10") then return true end
if (parts[1] == "172" && tonumber(parts[2]) >= 16 && tonumber(parts[2]) <= 31) then return true end
if (parts[1] == "127") then return true end
if parts[1] == "192" && parts[2] == "168" then return true end
if parts[1] == "10" then return true end
if parts[1] == "172" && tonumber(parts[2]) >= 16 && tonumber(parts[2]) <= 31 then return true end
if parts[1] == "127" then return true end
return false
end
concommand.Add("gmi_test_error", function( ply, cmd, args )
concommand.Add("gmi_test_error", function(ply, cmd, args)
print(ply, cmd)
PrintTable(args)
if (#args == 0) then
if #args == 0 then
error("This is a test error")
else
if (args[1] == "loop") then
hook.Add("Think", "gmInte:TestError:Loop", function()
error("This is a test error")
end)
timer.Simple(5, function()
hook.Remove("Think", "gmInte:TestError:Loop")
end)
elseif (args[1] == "crash") then
while (true) do
if args[1] == "loop" then
hook.Add("Think", "gmInte:TestError:Loop", function() error("This is a test error") end)
timer.Simple(5, function() hook.Remove("Think", "gmInte:TestError:Loop") end)
elseif args[1] == "crash" then
while true do
error("This is a crash error")
end
else

View File

@ -1,9 +1,4 @@
//
// Meta
//
local ply = FindMetaTable("Player")
function ply:gmIntGetConnectTime()
return self.gmIntTimeConnect || 0
end
@ -22,52 +17,38 @@ function ply:gmIntGetCustomValue(key)
end
function ply:gmIntRemoveCustomValue(key)
if (self.gmIntCustomValues) then
self.gmIntCustomValues[key] = nil
end
if self.gmIntCustomValues then self.gmIntCustomValues[key] = nil end
end
//
// Compatibility
//
local function getCustomCompatability(ply)
local values = {}
// DarkRP
if (DarkRP) then
if DarkRP then
values.money = ply:getDarkRPVar("money")
values.job = ply:getDarkRPVar("job")
end
// GUI Level System
if (GUILevelSystem) then
if GUILevelSystem then
values.level = ply:GetLevel()
values.xp = ply:GetXP()
end
return values
end
//
// Methods
//
local function getCustomValues(ply)
local values = {}
// Get compatability values
for key, value in pairs(getCustomCompatability(ply)) do
values[key] = value
end
// Get custom values or overwrite compatability values
if (ply.gmIntCustomValues) then
if ply.gmIntCustomValues then
for key, value in pairs(ply.gmIntCustomValues) do
values[key] = value
end
end
return values
end

View File

@ -5,10 +5,11 @@
Add Server:
0. Add the bot to your guild if it's not already done: https://gmod-integration.com/invite
1. Go to our dashboard and Login with Discord: https://gmod-integration.com/login
2. Go to the "Servers" page: https://gmod-integration.com/config/servers and click on "Create Server"
3. Copy the ID and Token of your server and paste them in this file
4. Everything is ready, you can now restart your server
1. Go to our dashboard and Login with Discord: https://gmod-integration.com/login you should be redirected to the dashboard
2. Add the bot to your guild and click on "Add to Guild" or select your guild if it's already added
3. Go to the "Servers" page and click on "Create Server"
4. Copy the ID and Token of your server and paste them in this file
5 Everything is ready, you can now restart your server
To go further, you can check the documentation: https://docs.gmod-integration.com
@ -17,43 +18,22 @@
IF ANY PROBLEM OCCURS, GO TO OUR WEBSITE AND FOLLOW THE INSTRUCTIONS:
https://gmod-integration.com/emergency
*/
//
// General
//
// API Connection
gmInte.config.id = "" // Server ID
gmInte.config.token = "" // Server Token
gmInte.config.websocketFQDN = "ws.gmod-integration.com" // The FQDN of the websocket server
gmInte.config.apiFQDN = "api.gmod-integration.com" // The FQDN of the API server
// Other
gmInte.config.forcePlayerLink = false // If true, the addon will force the players to link their discord account to their steam account before playing
gmInte.config.supportLink = "" // The link of your support (shown when a player do not have the requiments to join the server)
gmInte.config.maintenance = false // If true, the addon will only allow the players with the "gmod-integration.maintenance" permission to join the server
//
// Syncronization
//
// Punishment
gmInte.config.syncBan = true // If true, the addon will sync gmod bans with discord bans (and vice versa)
gmInte.config.syncTimeout = false // If true, the addon will sync gmod timeouts with discord timeouts (and vice versa)
gmInte.config.syncKick = false // If true, the addon will sync gmod kicks with discord kicks (and vice versa)
// Ban
gmInte.config.filterOnBan = true // If true, the addon will filter the players according to their ban status
//
// Materials
//
gmInte.config.redownloadMaterials = false // If true, the addon will redownload the materials of the addon (useful if you have a problem with the materials)
//
// Debug & Development
//
gmInte.config.debug = false // If true, the addon will show debug informations in the console
gmInte.config.devInstance = false // If true, the addon will use the development instance of API and Websocket