--[[
| 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/
--]]


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:GetUserGroup() == name

end

--[[---------------------------------------------------------
	Name: GetUserGroup
	Desc: Returns the player's usergroup.
-----------------------------------------------------------]]
function meta:GetUserGroup()

	return self:GetNWString( "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:SetNWString( "UserGroup", name )

end


-- SteamIds table..
-- STEAM_0:1:7099:
--		name	=	garry
--		group	=	superadmin

local SteamIDs = {}

local function LoadUsersFile()

	local txt = file.Read( "settings/users.txt", "MOD" )
	if ( not txt ) then MsgN( "Failed to load settings/users.txt!" ) return end

	-- Load the users file
	local UsersKV = util.KeyValuesToTable( txt )
	if ( not UsersKV ) then MsgN( "Failed to parse settings/users.txt!" ) return end

	SteamIDs = {}

	-- 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

end

LoadUsersFile()

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 )
