mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
215
lua/sam/player/sv_ranks.lua
Normal file
215
lua/sam/player/sv_ranks.lua
Normal file
@@ -0,0 +1,215 @@
|
||||
--[[
|
||||
| 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 sam = sam
|
||||
local SQL, Promise = sam.SQL, sam.Promise
|
||||
|
||||
function sam.player.set_rank(ply, rank, length)
|
||||
if sam.type(ply) ~= "Player" or not ply:IsValid() then
|
||||
error("invalid player")
|
||||
elseif not sam.ranks.is_rank(rank) then
|
||||
error("invalid rank")
|
||||
end
|
||||
|
||||
if not sam.isnumber(length) or length < 0 then
|
||||
length = 0
|
||||
end
|
||||
|
||||
local expiry_date = 0
|
||||
if length ~= 0 then
|
||||
if rank == "user" then
|
||||
expiry_date = 0
|
||||
else
|
||||
expiry_date = (math.min(length, 31536000) * 60) + os.time()
|
||||
end
|
||||
end
|
||||
|
||||
ply:sam_start_rank_timer(expiry_date)
|
||||
|
||||
SQL.FQuery([[
|
||||
UPDATE
|
||||
`sam_players`
|
||||
SET
|
||||
`rank` = {1},
|
||||
`expiry_date` = {2}
|
||||
WHERE
|
||||
`steamid` = {3}
|
||||
]], {rank, expiry_date, ply:SteamID()})
|
||||
|
||||
local old_rank = ply:sam_getrank()
|
||||
ply:SetUserGroup(rank)
|
||||
ply:sam_setrank(rank)
|
||||
sam.hook_call("SAM.ChangedPlayerRank", ply, rank, old_rank, expiry_date)
|
||||
end
|
||||
|
||||
do
|
||||
local set_rank_id = function(player_data, arguments)
|
||||
local old_rank = player_data and player_data.rank or false
|
||||
local promise, steamid, rank, length = unpack(arguments, 1, 4)
|
||||
|
||||
local expiry_date = 0
|
||||
if length ~= 0 then
|
||||
if rank == "user" then
|
||||
expiry_date = 0
|
||||
else
|
||||
expiry_date = (math.min(length, 31536000) * 60) + os.time()
|
||||
end
|
||||
end
|
||||
|
||||
local exists = true
|
||||
if old_rank == false then
|
||||
exists, old_rank = false, "user"
|
||||
|
||||
local time = os.time()
|
||||
SQL.FQuery([[
|
||||
INSERT INTO
|
||||
`sam_players`(
|
||||
`steamid`,
|
||||
`name`,
|
||||
`rank`,
|
||||
`expiry_date`,
|
||||
`first_join`,
|
||||
`last_join`,
|
||||
`play_time`
|
||||
)
|
||||
VALUES
|
||||
({1}, {2}, {3}, {4}, {5}, {6}, {7})
|
||||
]], {steamid, "", rank, 0, time, time, 0})
|
||||
else
|
||||
SQL.FQuery([[
|
||||
UPDATE
|
||||
`sam_players`
|
||||
SET
|
||||
`rank` = {1},
|
||||
`expiry_date` = {2}
|
||||
WHERE
|
||||
`steamid` = {3}
|
||||
]], {rank, expiry_date, steamid})
|
||||
end
|
||||
|
||||
promise:resolve()
|
||||
sam.hook_call("SAM.ChangedSteamIDRank", steamid, rank, old_rank, expiry_date, exists)
|
||||
end
|
||||
|
||||
function sam.player.set_rank_id(steamid, rank, length)
|
||||
sam.is_steamid(steamid, true)
|
||||
|
||||
if not sam.ranks.is_rank(rank) then
|
||||
error("invalid rank")
|
||||
end
|
||||
|
||||
local promise = Promise.new()
|
||||
|
||||
do
|
||||
local ply = player.GetBySteamID(steamid)
|
||||
if ply then
|
||||
promise:resolve(ply:sam_set_rank(rank, length))
|
||||
return promise
|
||||
end
|
||||
end
|
||||
|
||||
if not sam.isnumber(length) or length < 0 then
|
||||
length = 0
|
||||
end
|
||||
|
||||
SQL.FQuery([[
|
||||
SELECT
|
||||
`rank`
|
||||
FROM
|
||||
`sam_players`
|
||||
WHERE
|
||||
`steamid` = {1}
|
||||
]], {steamid}, set_rank_id, true, {promise, steamid, rank, length})
|
||||
|
||||
return promise
|
||||
end
|
||||
end
|
||||
|
||||
do
|
||||
local get_rank = function(data, callback)
|
||||
if not data then
|
||||
callback(false)
|
||||
else
|
||||
callback(data.rank)
|
||||
end
|
||||
end
|
||||
|
||||
function sam.player.get_rank(steamid, callback)
|
||||
sam.is_steamid(steamid, true)
|
||||
|
||||
SQL.FQuery([[
|
||||
SELECT
|
||||
`rank`
|
||||
FROM
|
||||
`sam_players`
|
||||
WHERE
|
||||
`steamid` = {1}
|
||||
]], {steamid}, get_rank, true, callback)
|
||||
end
|
||||
end
|
||||
|
||||
do
|
||||
local remove_rank_timer = function(ply)
|
||||
timer.Remove("SAM.RankTimer." .. ply:SteamID())
|
||||
end
|
||||
|
||||
function sam.player.start_rank_timer(ply, expiry_date)
|
||||
ply.sam_rank_expirydate = expiry_date
|
||||
if expiry_date == 0 then -- permanent rank
|
||||
return remove_rank_timer(ply)
|
||||
end
|
||||
expiry_date = expiry_date - os.time()
|
||||
timer.Create("SAM.RankTimer." .. ply:SteamID(), expiry_date, 1, function()
|
||||
sam.player.send_message(nil, "rank_expired", {
|
||||
T = {ply, admin = sam.console}, V = ply:sam_getrank()
|
||||
})
|
||||
ply:sam_set_rank("user")
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("PlayerDisconnected", "SAM.RemoveRankTimer", remove_rank_timer)
|
||||
end
|
||||
|
||||
hook.Add("SAM.OnRankRemove", "ResetPlayerRank", function(name)
|
||||
for _, ply in ipairs(player.GetAll()) do
|
||||
if ply:sam_getrank() == name then
|
||||
ply:sam_set_rank("user")
|
||||
end
|
||||
end
|
||||
|
||||
SQL.FQuery([[
|
||||
UPDATE
|
||||
`sam_players`
|
||||
SET
|
||||
`rank` = 'user',
|
||||
`expiry_date` = 0
|
||||
WHERE
|
||||
`rank` = {1}
|
||||
]], {name})
|
||||
end)
|
||||
|
||||
hook.Add("SAM.RankNameChanged", "ChangePlayerRankName", function(old, new)
|
||||
for _, ply in ipairs(player.GetAll()) do
|
||||
if ply:sam_getrank() == old then
|
||||
ply:sam_set_rank(new)
|
||||
end
|
||||
end
|
||||
|
||||
SQL.FQuery([[
|
||||
UPDATE
|
||||
`sam_players`
|
||||
SET
|
||||
`rank` = {1}
|
||||
WHERE
|
||||
`rank` = {2}
|
||||
]], {new, old})
|
||||
end)
|
||||
Reference in New Issue
Block a user