Initial commit
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user