Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- admin_request_sv.lua
- util.AddNetworkString("AdminRequest")
- util.AddNetworkString("AdminRequestAction")
- util.AddNetworkString("AdminRequestClaim")
- util.AddNetworkString("AdminRequestClaimData")
- util.AddNetworkString("RequestUpdatedAdminRequests")
- util.AddNetworkString("UpdatedAdminRequests")
- util.AddNetworkString("AdminRequestClose")
- local userRequestTracker = {}
- local function loadAdminClaimData()
- if file.Exists("admin_claim_data.txt", "DATA") then
- local jsonData = file.Read("admin_claim_data.txt", "DATA")
- adminClaimData = util.JSONToTable(jsonData)
- -- Ensure 'lastConnected' and 'timeOnline' fields are initialized for existing records
- for adminID, data in pairs(adminClaimData) do
- if not data.lastConnected then
- data.lastConnected = os.date("%Y-%m-%d")
- end
- if not data.timeOnline then
- data.timeOnline = 0
- end
- if not data.sessionStart then
- data.sessionStart = os.time()
- end
- end
- else
- adminClaimData = {}
- end
- end
- loadAdminClaimData()
- local adminRequests = {}
- local function GetAdmins()
- local adminGroups = {
- "trialmod", "moderator", "seniormod", "admin", "headadmin", "senioradmin", "council", "superadmin", "manager"
- }
- local admins = {}
- for _, ply in ipairs(player.GetAll()) do
- for _, group in ipairs(adminGroups) do
- if ply:IsUserGroup(group) then
- table.insert(admins, ply)
- break
- end
- end
- end
- return admins
- end
- local function IsAdminGroup(ply)
- local adminGroups = {
- "trialmod", "moderator", "seniormod", "admin", "headadmin", "senioradmin", "council", "superadmin", "manager"
- }
- for _, group in ipairs(adminGroups) do
- if ply:IsUserGroup(group) then
- return true
- end
- end
- return false
- end
- hook.Add("PlayerInitialSpawn", "AdminTimeOnlineStart", function(ply)
- if not IsAdminGroup(ply) then return end
- local adminID = ply:SteamID64()
- if not adminClaimData[adminID] then
- adminClaimData[adminID] = {
- name = ply:Nick(),
- totalCount = 0,
- weeklyCount = 0,
- week = os.date("%U"),
- lastConnected = os.date("%Y-%m-%d"),
- timeOnline = 0,
- sessionStart = os.time()
- }
- else
- adminClaimData[adminID].sessionStart = os.time()
- end
- end)
- hook.Add("PlayerSay", "AdminRequestSystem", function(ply, text, teamChat)
- if string.sub(text, 1, 1) == "@" then
- -- Check if user already has an open request
- local currentPlayerSteamID64 = ply:SteamID64()
- if userRequestTracker[currentPlayerSteamID64] then
- ply:ChatPrint("You already have an open request.")
- return ""
- end
- -- Proceed with creating the new request
- local requestData = {
- steamID64 = currentPlayerSteamID64,
- name = ply:Nick(),
- message = string.sub(text, 2),
- requestTime = CurTime()
- }
- table.insert(adminRequests, requestData) -- Save the request data to the adminRequests table
- userRequestTracker[currentPlayerSteamID64] = requestData
- net.Start("AdminRequest")
- net.WriteTable(requestData)
- net.Send(GetAdmins()) -- GetAdmins will now check for the specified user groups
- return "" -- Hide the message from the chat
- end
- end)
- local function getUpdatedAdminRequests()
- -- Return the contents of the adminRequests table
- return adminRequests
- end
- -- Handle admin actions
- local playerPreviousPositions = {}
- net.Receive("AdminRequestAction", function(len, ply)
- if not IsAdminGroup(ply) then return end
- local action = net.ReadString()
- local target = net.ReadEntity()
- if action == "goto" then
- playerPreviousPositions[ply:SteamID64()] = ply:GetPos()
- ply:SetPos(target:GetPos() + Vector(0, 0, 50))
- elseif action == "bring" then
- playerPreviousPositions[target:SteamID64()] = target:GetPos()
- target:SetPos(ply:GetPos() + ply:GetForward() * 100 + Vector(0, 0, 50))
- elseif action == "return" then
- local prevPos = playerPreviousPositions[target:SteamID64()]
- if prevPos then
- target:SetPos(prevPos)
- playerPreviousPositions[target:SteamID64()] = nil
- end
- end
- end)
- local function saveAdminClaimData()
- local jsonData = util.TableToJSON(adminClaimData)
- file.Write("admin_claim_data.txt", jsonData)
- end
- local function GetCurrentTimeOnline(adminID)
- local data = adminClaimData[adminID]
- if data and data.sessionStart then
- return data.timeOnline + (os.time() - data.sessionStart)
- end
- return data.timeOnline
- end
- -- Periodically update claim data
- local function updateClaimData()
- local currentTime = os.time()
- for adminID, data in pairs(adminClaimData) do
- if data.sessionStart then
- data.timeOnline = GetCurrentTimeOnline(adminID)
- data.sessionStart = currentTime
- end
- end
- saveAdminClaimData()
- end
- hook.Add("PlayerDisconnected", "AdminTimeOnlineEnd", function(ply)
- if not IsAdminGroup(ply) then return end
- local adminID = ply:SteamID64()
- local data = adminClaimData[adminID]
- if data and data.sessionStart then
- data.timeOnline = data.timeOnline + (os.time() - data.sessionStart)
- data.sessionStart = nil
- end
- saveAdminClaimData()
- end)
- timer.Create("UpdateClaimDataTimer", 2, 0, function() updateClaimData() end)
- net.Receive("AdminRequestClaim", function(len, ply)
- if not IsAdminGroup(ply) then return end
- local requestData = net.ReadTable() -- Add this line
- UpdateAdminClaim(ply)
- local adminID = ply:SteamID64()
- local currentDate = os.date("*t")
- local currentWeek = os.date("%U")
- if not adminClaimData[adminID] then
- adminClaimData[adminID] = {
- name = ply:Nick(),
- totalCount = 0,
- weeklyCount = 0,
- week = os.date("%U"),
- lastConnected = currentDate,
- timeOnline = 0,
- sessionStart = os.time()
- }
- end
- local data = adminClaimData[adminID]
- if data.week ~= os.date("%U") then
- data.weeklyCount = 0
- data.week = os.date("%U")
- end
- data.lastConnected = currentDate
- data.timeOnline = GetCurrentTimeOnline(adminID) -- Update time online using the new function
- data.sessionStart = os.time()
- data.totalCount = data.totalCount + 1
- data.weeklyCount = data.weeklyCount + 1
- saveAdminClaimData()
- userRequestTracker[requestData.steamID64] = nil
- end)
- -- Handle claimed cases
- local function markCaseAsClaimed(caseIndex, adminID)
- adminRequests[caseIndex].claimedBy = adminID
- end
- net.Receive("RequestUpdatedAdminRequests", function(len, ply)
- -- Get updated admin requests here
- local updatedRequests = getUpdatedAdminRequests()
- net.Start("UpdatedAdminRequests")
- net.WriteTable(updatedRequests)
- net.Send(ply)
- end)
- net.Receive("AdminRequestClose", function(len, ply)
- if not IsAdminGroup(ply) then return end
- local requestData = net.ReadTable()
- local index = -1
- for i, request in ipairs(adminRequests) do
- if request.steamID64 == requestData.steamID64 and request.requestTime == requestData.requestTime then
- index = i
- break
- end
- end
- if index > 0 then
- table.remove(adminRequests, index)
- end
- end)
- concommand.Add("show_claim_data", function(ply, cmd, args)
- if not IsAdminGroup(ply) then return end
- -- Send the claim data to the player who requested it
- saveAdminClaimData()
- net.Start("AdminRequestClaimData")
- net.WriteTable(adminClaimData)
- net.Send(ply)
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement