Files
wnsrc/lua/sam/sv_sql.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

425 lines
8.0 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if SAM_LOADED then return end
local SQL = sam.SQL
SQL.SetAddonName("SAM")
if file.Exists("sam_sql_config.lua", "LUA") then
local config = sam.load_file("sam_sql_config.lua", "sv_")
if sam.istable(config) then
SQL.SetConfig(config)
end
end
local current_version = 0
local versions = {}
local add_version = function(version, fn)
table.insert(versions, {version, fn})
end
local update = function()
for _, v in ipairs(versions) do
local version = v[1]
if version > current_version then
v[2]()
end
end
end
local check_updates = function()
-- SQL.Query([[DROP TABLE IF EXISTS `sam_players`]])
-- SQL.Query([[DROP TABLE IF EXISTS `sam_bans`]])
-- SQL.Query([[DROP TABLE IF EXISTS `sam_ranks`]])
-- SQL.Query([[DROP TABLE IF EXISTS `sam_version`]])
-- SQL.Query([[DROP TABLE IF EXISTS `sam_config`]])
SQL.TableExists("sam_version", function(exists)
if exists then
SQL.Query([[
SELECT
`version`
FROM
`sam_version`
]], function(version_data)
current_version = tonumber(version_data.version)
if sam.version > current_version then
update()
SQL.FQuery([[
UPDATE
`sam_version`
SET
`version` = {1}
]], {sam.version}):wait()
end
hook.Call("SAM.DatabaseLoaded")
end, true):wait()
else
update()
SQL.Query([[
CREATE TABLE `sam_version`(
`version` SMALLINT(255)
)
]])
SQL.FQuery([[
INSERT INTO
`sam_version`(`version`)
VALUES
({1})
]], {sam.version}):wait()
hook.Call("SAM.DatabaseLoaded")
end
end):wait()
end
add_version(100, function()
local auto_increment = SQL.IsMySQL() and "AUTO_INCREMENT" or ""
SQL.FQuery([[
CREATE TABLE `sam_players`(
`id` INT PRIMARY KEY {1f},
`steamid` VARCHAR(32),
`name` VARCHAR(255),
`rank` VARCHAR(30),
`expiry_date` INT UNSIGNED,
`first_join` INT UNSIGNED,
`last_join` INT UNSIGNED,
`play_time` MEDIUMINT UNSIGNED
)
]], {auto_increment})
SQL.FQuery([[
CREATE TABLE `sam_bans`(
`id` INT PRIMARY KEY {1f},
`steamid` VARCHAR(32),
`name` VARCHAR(255),
`reason` VARCHAR(255),
`admin` VARCHAR(32),
`unban_date` INT UNSIGNED
)
]], {auto_increment})
SQL.Query([[
CREATE TABLE `sam_ranks`(
`name` VARCHAR(30),
`immunity` TINYINT UNSIGNED,
`ban_limit` INT UNSIGNED,
`data` TEXT
)
]])
end)
add_version(110, function()
SQL.Query([[
ALTER TABLE `sam_ranks`
ADD `inherit` VARCHAR(30)
]])
SQL.Query([[
UPDATE
`sam_ranks`
SET
`inherit` = 'user'
WHERE
`name` != 'user'
]])
if not SQL.IsMySQL() then
SQL.Query([[
ALTER TABLE
`sam_players` RENAME TO `tmp_sam_players`
]])
SQL.Query([[
CREATE TABLE `sam_players`(
`id` INT PRIMARY KEY,
`steamid` VARCHAR(32),
`name` VARCHAR(255),
`rank` VARCHAR(30),
`expiry_date` INT UNSIGNED,
`first_join` INT UNSIGNED,
`last_join` INT UNSIGNED,
`play_time` INT UNSIGNED
)
]])
SQL.Query([[
INSERT INTO
`sam_players`(
`id`,
`steamid`,
`name`,
`rank`,
`expiry_date`,
`first_join`,
`last_join`,
`play_time`
)
SELECT
`id`,
`steamid`,
`name`,
`rank`,
`expiry_date`,
`first_join`,
`last_join`,
`play_time` * 60
FROM
`tmp_sam_players`
]])
SQL.Query([[DROP TABLE `tmp_sam_players`]])
else
SQL.Query([[
ALTER TABLE
`sam_players`
MODIFY
`play_time` INT UNSIGNED
]])
SQL.Query([[
UPDATE `sam_players`
SET `play_time` = `play_time` * 60
]])
end
end)
add_version(112, function()
if not SQL.IsMySQL() then
SQL.Query([[
ALTER TABLE
`sam_players` RENAME TO `tmp_sam_players`
]])
SQL.Query([[
ALTER TABLE
`sam_bans` RENAME TO `tmp_sam_bans`
]])
SQL.Query([[
CREATE TABLE `sam_players`(
`id` INTEGER PRIMARY KEY,
`steamid` VARCHAR(32),
`name` VARCHAR(255),
`rank` VARCHAR(30),
`expiry_date` INT UNSIGNED,
`first_join` INT UNSIGNED,
`last_join` INT UNSIGNED,
`play_time` INT UNSIGNED
)
]])
SQL.Query([[
CREATE TABLE `sam_bans`(
`id` INTEGER PRIMARY KEY,
`steamid` VARCHAR(32),
`name` VARCHAR(255),
`reason` VARCHAR(255),
`admin` VARCHAR(32),
`unban_date` INT UNSIGNED
)
]])
SQL.Query([[
INSERT INTO
`sam_players`(
`id`,
`steamid`,
`name`,
`rank`,
`expiry_date`,
`first_join`,
`last_join`,
`play_time`
)
SELECT
*
FROM
`tmp_sam_players`
]])
SQL.Query([[
INSERT INTO
`sam_bans`(
`id`,
`steamid`,
`name`,
`reason`,
`admin`,
`unban_date`
)
SELECT
*
FROM
`tmp_sam_bans`
]])
SQL.Query([[DROP TABLE `tmp_sam_players`]])
SQL.Query([[DROP TABLE `tmp_sam_bans`]])
end
end)
add_version(114, function()
SQL.Query([[
SELECT
`name`,
`data`
FROM
`sam_ranks`
]], function(ranks)
for k, v in ipairs(ranks) do
local name, permissions = v.name, v.data
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`data` = {1}
WHERE
`name` == {2}
]], {sam.pon.encode({permissions = sam.pon.decode(permissions), limits = {}}), name})
end
end):wait()
end)
add_version(120, function()
if SQL.IsMySQL() then
SQL.Query([[ALTER TABLE `sam_bans` ADD UNIQUE (`steamid`)]])
SQL.Query([[ALTER TABLE `sam_bans` DROP `name`]])
else
SQL.Query([[
ALTER TABLE
`sam_bans` RENAME TO `tmp_sam_bans`
]])
SQL.Query([[
CREATE TABLE `sam_bans`(
`id` INTEGER PRIMARY KEY,
`steamid` VARCHAR(32) UNIQUE,
`reason` VARCHAR(255),
`admin` VARCHAR(32),
`unban_date` INT UNSIGNED
)
]])
SQL.Query([[
INSERT INTO
`sam_bans`(
`id`,
`steamid`,
`reason`,
`admin`,
`unban_date`
)
SELECT
`id`,
`steamid`,
`reason`,
`admin`,
`unban_date`
FROM
`tmp_sam_bans`
]])
SQL.Query([[DROP TABLE `tmp_sam_bans`]])
end
SQL.Query([[
SELECT
`name`,
`data`
FROM
`sam_ranks`
]], function(ranks)
for k, v in ipairs(ranks) do
SQL.FQuery([[
UPDATE
`sam_ranks`
SET
`data` = {1}
WHERE
`name` = {2}
]], {util.TableToJSON(sam.pon.decode(v.data)), v.name})
end
end
):wait()
end)
add_version(135, function()
if not SQL.IsMySQL() then return end
SQL.Query([[ALTER TABLE `sam_ranks` MODIFY `name` BLOB;]])
end)
add_version(138, function()
SQL.Query([[
CREATE TABLE `sam_config`(
`key` VARCHAR(40) UNIQUE,
`value` TEXT
)
]])
end)
add_version(141, function()
if not SQL.IsMySQL() then return end
SQL.Query([[ALTER TABLE `sam_config` MODIFY `value` BLOB;]])
end)
add_version(143, function()
SQL.Query([[DROP TABLE IF EXISTS `sam_config`]])
SQL.Query([[
CREATE TABLE `sam_config`(
`key` VARCHAR(40) UNIQUE,
`value` BLOB
)
]])
end)
add_version(147, function()
SQL.Query([[CREATE UNIQUE INDEX sam_players_steamid_index ON `sam_players` (`steamid`);]])
SQL.Query([[CREATE INDEX sam_bans_steamid_index ON `sam_bans` (`steamid`);]])
end)
hook.Add("SAM.DatabaseConnected", "CheckUpdates", check_updates)
hook.Add("SAM.DatabaseLoaded", "SAM.DatabaseLoaded", function()
sam.DatabaseLoaded = true
sam.print("Connected to database and loaded data successfully.")
end)
SQL.Connect()
timer.Create("SAM.CheckForUpdates", 60 * 20, 0, function()
http.Fetch("https://raw.githubusercontent.com/Srlion/SAM-Docs/master/version.txt", function(version, _, _, code)
if code ~= 200 then return end
version = version:gsub("%s", "")
if sam.version >= (tonumber(version) or 0) then return end
sam.print(Color(255, 0, 0), "New update is available for SAM to download")
local superadmins = {}
for k, v in ipairs(player.GetAll()) do
if v:IsSuperAdmin() then
table.insert(superadmins, v)
end
end
sam.player.add_text(superadmins, Color(255, 0, 0), "New update is available for SAM to download")
end)
end)