Files
wnsrc/addons/sam-master/lua/sam/command/arguments/steamid.lua
lifestorm ba1fc01b16 Upload
2024-08-04 23:12:27 +03:00

121 lines
2.7 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 sam, command = sam, sam.command
local cached_ranks = {}
local targeting_offline = {}
local check_steamid = function(steamid)
if not sam.is_steamid(steamid) then
if sam.is_steamid64(steamid) then
return util.SteamIDFrom64(steamid)
else
return nil
end
end
return steamid
end
local can_target_steamid_callback = function(data, promise)
local ply, steamid = promise.ply, promise.steamid
if not data or sam.ranks.can_target(promise.rank, data.rank) then
promise:resolve({steamid})
elseif IsValid(ply) then
ply:sam_send_message("cant_target_player", {
S = steamid
})
end
targeting_offline[ply] = nil
cached_ranks[steamid] = data ~= nil and data or false
end
command.new_argument("steamid")
:OnExecute(function(argument, input, ply, _, result, i)
local steamid = check_steamid(input)
if not steamid then
ply:sam_send_message("invalid", {
S = "steamid/steamid64", S_2 = input
})
return false
end
if argument.allow_higher_target then
result[i] = steamid
return
end
local promise = sam.Promise.new()
promise.ply = ply
promise.rank = ply:sam_getrank()
promise.steamid = steamid
local target = player.GetBySteamID(steamid)
if sam.isconsole(ply) then
promise:resolve({steamid})
elseif target then
if ply:CanTarget(target) then
promise:resolve({steamid, target})
else
ply:sam_send_message("cant_target_player", {
S = steamid
})
end
elseif cached_ranks[steamid] ~= nil then
can_target_steamid_callback(cached_ranks[steamid], promise)
else
targeting_offline[ply] = true
sam.SQL.FQuery([[
SELECT
`rank`
FROM
`sam_players`
WHERE
`steamid` = {1}
]], {steamid}, can_target_steamid_callback, true, promise)
end
result[i] = promise
end)
:Menu(function(set_result, body, buttons, argument)
local steamid_entry = buttons:Add("SAM.TextEntry")
steamid_entry:SetTall(25)
steamid_entry:SetUpdateOnType(true)
steamid_entry:SetPlaceholder("steamid/steamid64")
steamid_entry:SetCheck(function(steamid)
steamid = check_steamid(steamid)
set_result(steamid)
return steamid or false
end)
return steamid_entry
end)
:End()
timer.Create("SAM.ClearCachedRanks", 60 * 2.5, 0, function()
table.Empty(cached_ranks)
end)
hook.Add("SAM.ChangedSteamIDRank", "RemoveIfCached", function(steamid)
cached_ranks[steamid] = nil
end)
hook.Add("SAM.CanRunCommand", "StopIfTargetingOffline", function(ply)
if targeting_offline[ply] then
return false
end
end)