Окошко жалобы [SUP]

При принятии жалобы пропадает окно с жалобой

term.Add('StaffReqSent', 'Жалоба отправлена!')
term.Add('StaffReqPend', 'У вас есть активная жалоба!')
term.Add('StaffReqLonger', 'Пожалуйста, напишите причину (<10+ символов)!')
term.Add('AdminTookPlayersRequest', '# ответил на жалобу #.')
term.Add('AdminTookYourRequest', '# откликнулся на вашу жалобу и скоро с вами свяжется.')
term.Add('AdminClosedPlayersRequest', '# отклонил жалобу #.')
term.Add('AdminClosedYourRequest', '# отклонил вашу жалобу.')
-- 
ba.cmd.Create('Report', function(pl, args)
	if (hook.Call('PlayerCanUseAdminChat', ba, pl) ~= false) then
		text = args.text
				
		if pl:HasStaffRequest() or pl:GetBVar("StaffRequestAdmin") then
			ba.notify_err(pl, term.Get('StaffReqPend'))
		elseif (text:len() < 10) then
			ba.notify_err(pl, term.Get('StaffReqLonger'))
		else
			net.Start('ba.ReportAdmin')
				net.WriteEntity(pl)
				net.WriteString(pl:SteamID())
				net.WriteString(text)
				net.WriteFloat(CurTime())
			net.Send(player.GetStaff())
					
			ba.notify(pl, term.Get('StaffReqSent'))
			pl:SetBVar('StaffRequest', true)
			pl:SetBVar('StaffRequestReason', text)
			pl:SetBVar('StaffRequestTime', CurTime())
						
			hook.Call("PlayerSitRequestOpened", GAMEMODE, pl, text)
		end
	end
end)
:AddParam('string', 'text')

ba.cmd.Create('Remove Rating', function(pl, args)
	local targ = ba.InfoTo64(args.target)
	local db = ba.data.GetDB()
	if not tonumber(args.amount) then return end
	db:query([[UPDATE ba_rating SET rate = rate - ]] .. tonumber(args.amount) .. [[ WHERE steamid = ']] .. targ .. [[']])
end)
:AddParam('player_steamid', 'target')
:AddParam('string', 'amount')
:SetFlag('c')

ba.cmd.Create('Delete Rating', function(pl, args)
	local targ = ba.InfoTo64(args.target)
	local db = ba.data.GetDB()
	db:query([[DELETE FROM `ba_rating` WHERE `steamid` = ']] .. targ .. [[']])
end)
:AddParam('player_steamid', 'target')
:SetFlag('c')

if (SERVER) then
	util.AddNetworkString 'ba.AdminChat'
	util.AddNetworkString 'ba.ReportAdmin'
	util.AddNetworkString 'ba.AdminChatDelayed'
	util.AddNetworkString 'ba.GetStaffRequest'
	util.AddNetworkString 'ba.PurgeStaffRequests'
	util.AddNetworkString 'OpenMenuAdmin'
	util.AddNetworkString 'OpenMenuUser'
	util.AddNetworkString 'CloseMenusWow'
	
	function PLAYER:HasStaffRequest()
		return (self:GetBVar('StaffRequest') and (CurTime() - self:GetBVar('StaffRequestTime') < 600))
	end

	hook.Add('PlayerSay', 'ba.AdminChat', function(pl, text)
		if (text[1] == '@') then
			if (hook.Call('PlayerCanUseAdminChat', ba, pl) ~= false) then
				text = text:sub(2):Trim()
				
				if pl:HasStaffRequest() or pl:GetBVar("StaffRequestAdmin") and not pl:IsAdmin() then
					ba.notify_err(pl, term.Get('StaffReqPend'))
				elseif (not pl:IsAdmin() and text:len() < 10) then
					ba.notify_err(pl, term.Get('StaffReqLonger'))
				else
					net.Start('ba.AdminChat')
						net.WriteEntity(pl)
						net.WriteString(pl:SteamID())
						net.WriteString(text)
						net.WriteFloat(CurTime())
					net.Send(player.GetStaff())
					
					if (not pl:IsAdmin()) then
						ba.notify(pl, term.Get('StaffReqSent'))
						pl:SetBVar('StaffRequest', true)
						pl:SetBVar('StaffRequestReason', text)
						pl:SetBVar('StaffRequestTime', CurTime())
						
						hook.Call("PlayerSitRequestOpened", GAMEMODE, pl, text)
					end
				end
				
				return ''
			end
		end
	end)
	
	hook.Add('playerRankLoaded', 'ba.NetworkRequests', function(pl)
		if (!pl:IsAdmin()) then return end
		
		for k, v in ipairs(player.GetAll()) do
			if (v:HasStaffRequest()) then
				net.Start('ba.AdminChatDelayed')
					net.WriteUInt(v:EntIndex(), 8)
				net.Send(pl)
			end
		end
	end)
	
	hook.Add('PlayerDisconnected', 'ba.PurgeStaffRequests', function(pl)
		if (pl:HasStaffRequest()) then
			net.Start('ba.PurgeStaffRequests')
				net.WriteString(pl:SteamID())
			net.Send(player.GetStaff())
		end
	end)
	
	net.Receive('ba.GetStaffRequest', function(len, pl)
		local targ = net.ReadEntity()
		
		if (!IsValid(targ) or !pl:IsAdmin() or !targ:HasStaffRequest()) then return end
		
		net.Start('ba.AdminChat')
			net.WriteEntity(targ)
			net.WriteString(targ:SteamID())
			net.WriteString(targ:GetBVar('StaffRequestReason'))
			net.WriteFloat(targ:GetBVar('StaffRequestTime'))
		net.Send(pl)
	end)
else		
	local color_white = Color(235,235, 235)
	local fr
	local PANEL = {}
	function PANEL:Init()
		local w, h = chat.GetChatBoxSize()
		local x, y = chat.GetChatBoxPos()
		h = h * .75
		y = y - (h + 5)
		
		self.w, self.h = w * .5, h
		self.h3 = self.h * 1.5

		self.Requests = {}
		self.Visible = true

		self.btnMaxim:Remove()
		self.btnMinim:Remove()
		self.btnClose:Remove()
		
		self.lblTitle:SetText('Жалобы:')
		
		self.PlayerList = ui.Create('ui_scrollpanel', self)
		self.PlayerList:SetPadding(-1)

		self:SetSkin('bAdmin')
		self:SetDraggable(true)

		self:SetSize(self.w, self.h)
		self:SetPos(x, y)
	end

	function PANEL:PerformLayout()
		self.lblTitle:SizeToContents()
		self.lblTitle:SetPos(5, 4)

		self.PlayerList:SetPos(5, 32)
		self.PlayerList:SetSize(self.w - 10, self.h - 37)
	end

	function PANEL:ApplySchemeSettings()
		self.lblTitle:SetTextColor(ui.col.Close)
		self.lblTitle:SetFont('ba.ui.22')
	end

	function PANEL:SetStage(state)
		if (state == 1) then
			self:SizeTo(self.w, self.h, 0.175, 0, 0.25, cback)
		elseif (state == 2) then
			self:SizeTo(self.w * 2, self.h, 0.175, 0, 0.25, cback)
		else
			self:SizeTo(self.w * 2, self.h3, 0.175, 0, 0.25)
		end
	end

	function PANEL:AddRequest(pl, msg, startTime)
		local pnl = ui.Create('ba_menu_player')
		pnl.SteamID = pl:SteamID()
		pnl:SetPlayer(pl)
		pnl:SetStartTime(startTime)
		pnl.Checkbox.DoClick = function()
			if (self.Player ~= pnl) then
				if (self.Player ~= nil and IsValid(self.Player)) then
					self.Player.Selected = false
				end
				self.Player = pnl
				pnl.Selected = true
				self:SetStage(2)
				self:OpenRequest(pnl.ID)
			else
				self.Player = nil
				pnl.Selected = false
				self:SetStage(1)
			end
			self.ID = pnl.ID
		end
		pnl.OT = pnl.Think
		pnl.Think = function(s)
			if (not self.Requests[s.ID]) or (CurTime() - startTime >= 600) then
				self:RemoveRequest(s.ID)
				return
			end
			
			s:OT()
		end
		self.PlayerList:AddItem(pnl)
		pnl.ID = #self.Requests + 1
		pnl.Message = msg
		self.Requests[pnl.ID] = pnl
	end

	function PANEL:RemoveRequest(id)
		self.Requests[id]:Remove()
		table.remove(self.Requests, id)
		self.Player = nil
		if (self.ID == id) then
			self:SetStage(1)
		end
		
		for k, v in ipairs(self.Requests) do
			v.ID = k
		end
	end

	function PANEL:OpenRequest(id)
		if IsValid(self.CurRequest) then self.CurRequest:Remove() end

		local pnl = self.Requests[id]
		if !pnl then return end

		self.CurRequest = ui.Create('ui_panel', function(s, p)
			s:SetPos(self.w, 32)
			s:SetSize(self.w - 5, self.h - 37)
		end, self)
		ui.Create('DButton', function(s, p)
			s:SetPos(5, 5)
			s:SetSize(p:GetWide() * .5 - 7.5, 25)
			s:SetText('Принять')
			s.DoClick = function()
				if (IsValid(pnl.Player)) then
					RunConsoleCommand('ba', 'Treq', pnl.Player:SteamID())
				end
			end
		end, self.CurRequest)
		ui.Create('DButton', function(s, p)
			s:SetPos(p:GetWide() * .5 + 2.5, 5)
			s:SetSize(p:GetWide() * .5 - 7.5, 25)
			s:SetText('Отклонить')
			s.DoClick = function()
				if (IsValid(pnl.Player)) then
					RunConsoleCommand('ba', 'Rreq', pnl.Player:SteamID())
				end
			end
		end, self.CurRequest)

		ui.Create('DButton', function(s, p)
			s:SetPos(5, 35)
			s:SetSize(p:GetWide() - 10, 25)
			s:SetText('Скопировать SteamID')
			s.DoClick = function()
				if !IsValid( pnl.Player ) then return end
				SetClipboardText(pnl.Player:SteamID())
				LocalPlayer():ChatPrint('Скопировано')
			end
		end, self.CurRequest)

		local l = ba.ui.Label(pnl.Message, self.CurRequest, {font = 'ba.ui.22', color = ui.col.Close, wrap = true})
		l:SetSize(pnl:GetWide() - 10, pnl:GetTall() - 70)
		l:SetPos(5, 65)
	end
	vgui.Register('ba_adminchat', PANEL, 'DFrame')

	local staffRequestQueue = {}
	hook.Add('Think', 'AdminChat.Think', function()
		if IsValid(fr) then
			if (#fr.Requests <= 0) and fr.Visible then
				fr.Visible = false
				fr:SetVisible(fr.Visible)
			elseif (#fr.Requests > 0) and (not fr.Visible) then
				fr.Visible = true
				fr:SetVisible(fr.Visible)
			end
		end
		
		for k, v in ipairs(staffRequestQueue) do
			local pl
			if (type(v) == 'string') then
				pl = player.Find(v)
			else
				pl = ents.GetByIndex(v)
			end
			
			if (IsValid(pl)) then
				net.Start('ba.GetStaffRequest')
					net.WriteEntity(pl)
				net.SendToServer()
			
				table.remove(staffRequestQueue, k)
				
				return
			end
		end
	end)
	
	net.Receive('ba.PurgeStaffRequests', function()
		if (!IsValid(fr)) then return end
		
		local stid = net.ReadString()
		for k, v in ipairs(fr.Requests) do
			if (v.SteamID == stid) then
				fr:RemoveRequest(k)
			end
		end
	end)

	net.Receive('ba.AdminChat', function()
		if !ui or !ui.Create then return end
		fr = fr or ui.Create('ba_adminchat')
		local pl = net.ReadEntity()
		local stid = net.ReadString()
		if IsValid(pl) then
			if (pl:IsAdmin()) then
				local msg = net.ReadString()
				
				if (IsValid(CHATBOX)) then CHATBOX.DoEmotes = pl:IsVIP() end
				chat.AddText(ui.col.SUP, '[Админ-Чат] ', Color(255,255,255), pl:GetRank(), ' ', pl:GetJobColor(), pl:Name(), Color(255,255,255), ': ', msg)
				hook.Call("PlayerUseAdminChat", GAMEMODE, pl, msg)
			elseif IsValid(fr) then
				fr:AddRequest(pl, net.ReadString(), net.ReadFloat())
			end
		else
			table.insert(staffRequestQueue, stid)
		end
	end)
	
	net.Receive('ba.ReportAdmin', function()
		if !ui or !ui.Create then return end
		fr = fr or ui.Create('ba_adminchat')
		local pl = net.ReadEntity()
		local stid = net.ReadString()
		if IsValid(pl) then
			if IsValid(fr) then
				fr:AddRequest(pl, net.ReadString(), net.ReadFloat())
			end
		else
			table.insert(staffRequestQueue, stid)
		end
	end)
	
	net.Receive('ba.AdminChatDelayed', function()
		table.insert(staffRequestQueue, net.ReadUInt(8))
	end)
	
	concommand.Add('adr', function(pl, cmd, args)
		fr = fr or ui.Create('ba_adminchat')
		fr:AddRequest(pl, table.concat(args, ' '), CurTime())
	end)
	
	concommand.Add('rer', function(pl, cmd, args)
		fr = fr or ui.Create('ba_adminchat')
		local id = tonumber(args[1] or 0)
		
		if (!fr.Requests[id]) then return end
		
		fr:RemoveRequest(id)
	end)
end

ba.cmd.Create('Treq', function(pl, args)
	if IsValid(args.target) and pl == args.target then return end

	if args.target:HasStaffRequest() and not pl:GetBVar("StaffRequestAdmin") then
		net.Start 'ba.PurgeStaffRequests'
			net.WriteString(args.target:SteamID())
		net.Send(player.GetStaff())
		ba.notify_staff(term.Get('AdminTookPlayersRequest'), pl, args.target)
		ba.notify(args.target, term.Get('AdminTookYourRequest'), pl)
		args.target:SetBVar('StaffRequest', nil)
		args.target:SetBVar('StaffRequestTime', nil)
		args.target:SetBVar('StaffRequestReason', nil)
		
		args.target:SetBVar('StaffRequestAdmin', pl)
		pl:SetBVar('StaffRequestAdmin', args.target)
		
		net.Start("OpenMenuUser")
			net.WriteEntity(pl)
			net.WriteFloat(CurTime())
		net.Send(args.target)
		
		net.Start("OpenMenuAdmin")
			net.WriteEntity(args.target)
			net.WriteFloat(CurTime())
		net.Send(pl)
		
		hook.Call("PlayerSitRequestTaken", GAMEMODE, args.target, pl)
	end
end)
:AddParam('player_entity', 'target')
:SetFlag('M')
:SetHelp('Принять жалобу')

ba.cmd.Create('Creq', function(pl, args)
	if IsValid(args.target) and pl == args.target then return end

	if args.target:GetBVar("StaffRequestAdmin") then
		net.Start 'ba.PurgeStaffRequests'
			net.WriteString(args.target:SteamID())
		net.Send(player.GetStaff())
		ba.notify(args.target, "Админ # закрыл вашу жалобу!", pl)
		net.Start 'ba.openRatingPlayer'
			net.WriteString(pl:Name())
			net.WriteString(pl:SteamID())
		net.Send(args.target)
		ba.notify(pl, "Вы закрыли жалобу игрока #!", args.target)

		args.target:SetBVar('StaffRequestAdmin', nil)
		pl:SetBVar('StaffRequestAdmin', nil)
		args.target.ratingUsing = true
		
		net.Start("CloseMenusWow")
		net.Send( { pl, args.target } )
		
		hook.Call("PlayerSitRequestClosedSucc", GAMEMODE, args.target, pl)
	end
end)
:AddParam('player_entity', 'target')
:SetFlag('M')
:SetHelp('Закрыть жалобу')

ba.cmd.Create('Rreq', function(pl, args)
	if args.target:HasStaffRequest() then
		net.Start 'ba.PurgeStaffRequests'
			net.WriteString(args.target:SteamID())
		net.Send(player.GetStaff())
		ba.notify_staff(term.Get('AdminClosedPlayersRequest'), pl, args.target)
		ba.notify(args.target, term.Get('AdminClosedYourRequest'), pl)
		args.target:SetBVar('StaffRequest', nil)
		args.target:SetBVar('StaffRequestReason', nil)
		args.target:SetBVar('StaffRequestTime', nil)
		
		hook.Call("PlayerSitRequestClosed", GAMEMODE, args.target, pl)
	end
end)
:AddParam('player_entity', 'target')
:SetFlag('M')
:SetHelp('Отменить жалобу')