

local meta = FindMetaTable("Player")

if not meta then return end



--[[---------------------------------------------------------

    Name: IsAdmin

    Desc: Returns if a player is an admin.

-----------------------------------------------------------]]

function meta:IsAdmin() 

    if self:IsSuperAdmin() then return true end

    if self:IsUserGroup("admin") then return true end



    return false

end



--[[---------------------------------------------------------

    Name: IsSuperAdmin

    Desc: Returns if a player is a superadmin.

-----------------------------------------------------------]]

function meta:IsSuperAdmin()

    return self:IsUserGroup("superadmin")

end



--[[---------------------------------------------------------

    Name: IsUserGroup

    Desc: Returns if a player is in the specified usergroup.

-----------------------------------------------------------]]

function meta:IsUserGroup(name)

    if not self:IsValid() then return false end



    return self:GetNetworkedString("UserGroup") == name

end



--[[---------------------------------------------------------

    Name: GetUserGroup

    Desc: Returns the player's usergroup.

-----------------------------------------------------------]]

function meta:GetUserGroup()

    return self:GetNetworkedString("UserGroup", "user")

end





--[[---------------------------------------------------------

    This is the meat and spunk of the player auth system

-----------------------------------------------------------]]



if not SERVER then return end



--[[---------------------------------------------------------

    Name: SetUserGroup

    Desc: Sets the player's usergroup. ( Serverside Only )

-----------------------------------------------------------]]

function meta:SetUserGroup(name)

    self:SetNetworkedString("UserGroup", name)

end





-- SteamIds table..

-- STEAM_0:1:7099:

--     name   =   garry

--     group  =   superadmin



local SteamIDs = {}



-- Load the users file

local UsersKV = util.KeyValuesToTable( file.Read( "settings/users.txt", "GAME" ) )



-- Extract the data into the SteamIDs table

for key, tab in pairs( UsersKV ) do

    for name, steamid in pairs( tab ) do

        SteamIDs[ steamid ] = {}

        SteamIDs[ steamid ].name = name

        SteamIDs[ steamid ].group = key

    end

end



function util.GetUserGroups()

    return SteamIDs

end



hook.Add("PlayerInitialSpawn", "PlayerAuthSpawn", function(ply)

    local steamid = ply:SteamID()

    

    if game.SinglePlayer() or ply:IsListenServerHost() then

        ply:SetUserGroup("superadmin")

        return

    end

    

    if SteamIDs[steamid] == nil then

        ply:SetUserGroup("user")

        return

    end



    -- Admin SteamID need to be fully authenticated by Steam!

    if ply.IsFullyAuthenticated and not ply:IsFullyAuthenticated() then

        ply:ChatPrint(string.format("Hey '%s' - Your SteamID wasn't fully authenticated, so your usergroup has not been set to '%s.'",

            SteamIDs[steamid].name, SteamIDs[steamid].group))

        ply:ChatPrint("Try restarting Steam.")

        return

    end



    ply:SetUserGroup(SteamIDs[steamid].group)

    ply:ChatPrint(string.format("Hey '%s' - You're in the '%s' group on this server.",

        SteamIDs[steamid].name, SteamIDs[steamid].group))

end)

