Files
2026-03-15 14:54:49 +03:00

77 lines
3.6 KiB
Lua

--[[---------------------------------------------------------------------------
Create the tables used for banning
---------------------------------------------------------------------------]]
hook.Add("DatabaseInitialized", "FAdmin_CreateMySQLTables", function()
MySQLite.query("CREATE TABLE IF NOT EXISTS FAdminBans(SteamID VARCHAR(25) NOT NULL PRIMARY KEY, Nick VARCHAR(40), BanDate DATETIME, UnbanDate DATETIME, Reason VARCHAR(100), AdminName VARCHAR(40), Admin_steam VARCHAR(25));", function()
hook.Call("FAdmin_RetrieveBans", nil)
end)
end)
--[[---------------------------------------------------------------------------
Store a ban in the MySQL tables
---------------------------------------------------------------------------]]
hook.Add("FAdmin_StoreBan", "MySQLBans", function(SteamID, Nick, Duration, Reason, AdminName, Admin_steam)
local steam = MySQLite.SQLStr(SteamID)
local nick = Nick and MySQLite.SQLStr(Nick) or "NULL"
local bandate = MySQLite.isMySQL() and "NOW()" or "datetime('now')"
local reason = Reason and MySQLite.SQLStr(Reason) or "NULL"
local admin = AdminName and MySQLite.SQLStr(AdminName) or "NULL"
local adminsteam = Admin_steam and MySQLite.SQLStr(Admin_steam) or "NULL"
local duration
if MySQLite.isMySQL() then
duration = Duration == 0 and "NULL" or "DATE_ADD(NOW(), INTERVAL " .. tonumber(Duration or 60) .. " MINUTE)"
else
duration = Duration == 0 and "NULL" or "datetime('now', '+" .. tonumber(Duration or 60) .. " minutes')"
end
MySQLite.query("REPLACE INTO FAdminBans VALUES(" .. steam .. ", " .. nick .. ", " .. bandate .. ", " .. duration .. ", " .. reason .. ", " .. admin .. ", " .. adminsteam .. ");")
end)
--[[---------------------------------------------------------------------------
Unban someone
---------------------------------------------------------------------------]]
hook.Add("FAdmin_UnBan", "FAdmin_MySQLUnban", function(ply, steamID)
MySQLite.query("DELETE FROM FAdminBans WHERE steamID = " .. MySQLite.SQLStr(steamID))
end)
--[[---------------------------------------------------------------------------
Retrieve the bans from the MySQL server and put them into effect
Note: Must be called more than two seconds after InitPostEntity, because
that's when the database initializes
---------------------------------------------------------------------------]]
hook.Add("FAdmin_RetrieveBans", "getMySQLBans", function()
FAdmin.BANS = FAdmin.BANS or {}
-- Small SQLite and MySQL syntax difference
local diffSeconds = MySQLite.isMySQL() and "TIMESTAMPDIFF(SECOND, NOW(), UnbanDate)" or
"strftime('%s', UnbanDate) - strftime('%s','now')"
local now = MySQLite.isMySQL() and "NOW()" or "datetime('now')"
MySQLite.query("SELECT SteamID, Nick, " .. diffSeconds .. " AS duration, Reason, AdminName, Admin_steam FROM FAdminBans WHERE (UnbanDate > " .. now .. " OR UnbanDate IS NULL);", function(data)
if not data then return end
for _, v in ipairs(data) do
if tonumber(v.SteamID) or not v.SteamID then continue end
local duration = (not v.duration or v.duration == "NULL") and 0 or (os.time() + v.duration)
FAdmin.BANS[string.upper(v.SteamID)] = {
time = duration,
name = v.Nick,
reason = v.Reason,
adminname = v.AdminName,
adminsteam = v.Admin_steam
}
end
for _, v in ipairs(player.GetAll()) do
if not FAdmin.BANS[string.upper(v:SteamID())] then continue end
v:Kick("FAdmin ban evasion")
end
end)
end)