All pastes #953948 Raw Edit

Anonymous

public text v1 · immutable
#953948 ·published 2008-03-23 15:01 UTC
rendered paste body
local meta=FindMetaTable( "Player" )

local oldConCommand=meta.ConCommand
local oldRunConcommand=RunConsoleCommand

local CommandAllow={}
local CommandDeny={}

if file.Exists("cmdallow/cmdallow.txt") then
	local str1=file.Read("cmdallow/cmdallow.txt")
	local str2=file.Read("cmdallow/cmddeny.txt")
	CommandAllow=util.KeyValuesToTable(str1)
	CommandDeny=util.KeyValuesToTable(str2)
end

concommand.Add("cmdallow_save",function()
	local str1=util.TableToKeyValues(CommandAllow)
	local str2=util.TableToKeyValues(CommandDeny)
	file.Write("cmdallow/cmdallow.txt", str1)
	file.Write("cmdallow/cmddeny.txt", str2)
end)

local function ConCommandPrompt(cmd,allowcallback,denycallback)
	local Window = vgui.Create( "DFrame" )
		Window:SetTitle( "ConCommand verification" )
		Window:SetDraggable( false )
		Window:ShowCloseButton( true )
		Window:SetBackgroundBlur( false )
		Window:SetDrawOnTop( true )
		
	local InnerPanel = vgui.Create( "DPanel", Window )
	 
	local Text = vgui.Create( "DLabel", InnerPanel )
		Text:SetText( "A script tried to run "..cmd )
		Text:SizeToContents()
		Text:SetContentAlignment( 5 )
		Text:SetTextColor( color_white )
		 
		 
		local ButtonPanel = vgui.Create( "DPanel", Window ) 
		ButtonPanel:SetTall( 30 )
	
		local AlwaysCheck = vgui.Create( "CheckButton", ButtonPanel )
		AlwaysCheck:SetText( "Always" )
		AlwaysCheck:SizeToContents()
			AlwaysCheck:SetTall( 20 )
			AlwaysCheck:SetWide( 100 )
			AlwaysCheck:SetPos( 110, 5 )
			
		local AccButton = vgui.Create( "DButton", ButtonPanel )
		AccButton:SetText( "Allow" )
		AccButton:SizeToContents()
			AccButton:SetTall( 20 )
			AccButton:SetWide( 50 )
			AccButton:SetPos( 5, 5 )
		AccButton.DoClick = function () Window:Close() allowcallback(AlwaysCheck:GetValue()) end
		
		local DenButton = vgui.Create( "DButton", ButtonPanel )
		DenButton:SetText( "Deny" )
		DenButton:SizeToContents()
			DenButton:SetTall( 20 )
			DenButton:SetWide( 50 )
			DenButton:SetPos( 60, 5 )
		DenButton.DoClick = function() Window:Close() denycallback(AlwaysCheck:GetValue()) end


		 
	local w, h = Text:GetSize()
	w = math.max( w, 400 )
	 
	Window:SetSize( w + 50, h + 25 + 75 + 10 ) 
	Window:Center() 
	
	InnerPanel:StretchToParent( 5, 25, 5, 45 ) 
	 
	Text:StretchToParent( 5, 5, 5, 35 )
	 
	ButtonPanel:CenterHorizontal()
	ButtonPanel:AlignBottom( 8 )
	ButtonPanel:SetWide(200)
	 
	Window:MakePopup()
	Window:DoModal()
end

function RunConsoleCommand(...)
	local cmd=string.lower(arg[1])
	if CommandAllow[cmd] then
		oldRunConcommand(unpack(arg))
	elseif not CommandDeny[cmd] then
		ConCommandPrompt(cmd,function(store) if store=="1" then  CommandAllow[cmd]=true end oldRunConcommand(unpack(arg)) end,function(store) if store=="1" then CommandDeny[cmd]=true end end)
	end
	return
end

function meta.ConCommand(self,command)
	local cmd=string.lower(string.Explode(" ", command)[1])
	if CommandAllow[cmd] then
		oldConCommand(self,command)
	elseif not CommandDeny[cmd] then
		ConCommandPrompt(cmd,function(store) if store=="1" then CommandAllow[cmd]=true end oldConCommand(self,command) end,function(store) if store=="1" then CommandDeny[cmd]=true end end)
	end
	return
end