79 lines
2.6 KiB
Lua
79 lines
2.6 KiB
Lua
local kickMessage = [[You cannot join these server(s) twice with the same account.
|
|
If you're a developer, please disable antimultirun in the DarkRP config.
|
|
]]
|
|
|
|
local function clearServerEntries()
|
|
MySQLite.query(string.format([[
|
|
DELETE FROM darkrp_serverplayer WHERE serverid = %s
|
|
]], MySQLite.SQLStr(DarkRP.serverId)))
|
|
end
|
|
|
|
local function insertSteamid64(steamid64, userid)
|
|
local query = string.format([[
|
|
INSERT INTO darkrp_serverplayer VALUES(%s, %s)
|
|
]], steamid64, MySQLite.SQLStr(DarkRP.serverId))
|
|
MySQLite.query(
|
|
query,
|
|
-- Ignore result of successful insertion
|
|
function() end,
|
|
-- Attempt to kick the user when insertion fails, as it means that
|
|
-- the row already exists in the database.
|
|
function(err)
|
|
if not string.find(err, "Duplicate entry") then return end
|
|
|
|
game.KickID(userid, kickMessage)
|
|
return true
|
|
end
|
|
)
|
|
end
|
|
|
|
local function insertPlayer(ply)
|
|
insertSteamid64(ply:SteamID64(), ply:UserID())
|
|
end
|
|
|
|
local function removePlayer(ply)
|
|
MySQLite.query(string.format([[
|
|
DELETE FROM darkrp_serverplayer WHERE uid = %s AND serverid = %s
|
|
]], ply:SteamID64(), MySQLite.SQLStr(DarkRP.serverId)))
|
|
end
|
|
|
|
local function addHooks()
|
|
hook.Add("PlayerAuthed", "DarkRP_antimultirun", function(ply, steamId)
|
|
insertSteamid64(util.SteamIDTo64(steamId), ply:UserID())
|
|
end)
|
|
|
|
hook.Add("PlayerDisconnected", "DarkRP_antimultirun", removePlayer)
|
|
hook.Add("ShutDown", "DarkRP_antimultirun", clearServerEntries)
|
|
end
|
|
|
|
hook.Add("DarkRPDBInitialized", "DarkRP_antimultirun", function()
|
|
if not GAMEMODE.Config.antimultirun then return end
|
|
if not MySQLite.isMySQL() then return end
|
|
if not game.IsDedicated() then return end
|
|
|
|
-- Wait until game.GetIPAddress() returns a sensible value
|
|
-- https://github.com/FPtje/DarkRP/issues/2982
|
|
-- https://github.com/Facepunch/garrysmod-issues/issues/3001
|
|
hook.Add("Think", "DarkRP_antimultirun", function()
|
|
DarkRP.serverId = game.GetIPAddress()
|
|
if string.sub(DarkRP.serverId, 0, 8) == "0.0.0.0:" then return end
|
|
hook.Remove("Think", "DarkRP_antimultirun")
|
|
|
|
MySQLite.query([[
|
|
CREATE TABLE IF NOT EXISTS darkrp_serverplayer(
|
|
uid BIGINT NOT NULL,
|
|
serverid VARCHAR(32) NOT NULL,
|
|
PRIMARY KEY(uid, serverid)
|
|
);
|
|
]])
|
|
|
|
-- Clear this server's entries in case the server wasn't cleanly shut down
|
|
clearServerEntries()
|
|
|
|
-- Re-insert players currently in the game
|
|
fn.Map(insertPlayer, player.GetAll())
|
|
|
|
addHooks()
|
|
end)
|
|
end)
|