diff --git a/Warp.rbxm b/Warp.rbxm index b12e9e0..aca5eae 100644 Binary files a/Warp.rbxm and b/Warp.rbxm differ diff --git a/src/Index/Server/ServerProcess/init.luau b/src/Index/Server/ServerProcess/init.luau index 522b119..09a5d47 100644 --- a/src/Index/Server/ServerProcess/init.luau +++ b/src/Index/Server/ServerProcess/init.luau @@ -49,12 +49,13 @@ local ReliableEvent = Event.Reliable local UnreliableEvent = Event.Unreliable local RequestEvent = Event.Request +RateLimit.Protect() + local function initializeEachPlayer(player: Player) if not player then return end if not queueOut[player] then queueOut[player] = {} end - for Identifier: string in registeredIdentifier do if not player then break end if not queueOut[player][Identifier] then diff --git a/src/Index/Util/RateLimit.luau b/src/Index/Util/RateLimit.luau index e2d29c8..812e788 100644 --- a/src/Index/Util/RateLimit.luau +++ b/src/Index/Util/RateLimit.luau @@ -4,21 +4,51 @@ local RateLimit = {} local RunService = game:GetService("RunService") local Assert = require(script.Parent.Assert) -local Event = require(script.Parent.Parent.Event).Reliable +local Events = require(script.Parent.Parent.Event) +local Reliable, Unreliable, Request = Events.Reliable, Events.Unreliable, Events.Request +local Signal = require(script.Parent.Parent.Signal)("Warp_OnSpamSignal") + +local map, activity, meta = {}, {}, {} +setmetatable(meta , { + __index = map, + __newindex = function(self, key, value) + if not activity[key] then + activity[key] = os.clock() + end + if (os.clock()-activity[key]) >= 1 then + activity[key] = os.clock() + map[key] = 1 + return + end + if value >= 1e1 then -- 100 + Signal:Fire(key) + return + end + map[key] = value + end, +}) + +local function onReceived(player: Player) + if not meta[player] then + meta[player] = 1 + return + end + meta[player] += 1 +end function RateLimit.create(Identifier: string, entrance: number?, interval: number?) Assert(typeof(Identifier) == "string", "Identifier must a string type.") if RunService:IsServer() then Assert(typeof(entrance) == "number", "entrance must a number type.") Assert(entrance :: number > 0, "entrance must above 0.") - Event:SetAttribute(Identifier.."_ent", entrance) - Event:SetAttribute(Identifier.."_int", interval) + Reliable:SetAttribute(Identifier.."_ent", entrance) + Reliable:SetAttribute(Identifier.."_int", interval) else - while (not Event:GetAttribute(Identifier.."_ent")) or (not Event:GetAttribute(Identifier.."_int")) do + while (not Reliable:GetAttribute(Identifier.."_ent")) or (not Reliable:GetAttribute(Identifier.."_int")) do task.wait(0.1) end - entrance = tonumber(Event:GetAttribute(Identifier.."_ent")) - interval = tonumber(Event:GetAttribute(Identifier.."_int")) + entrance = tonumber(Reliable:GetAttribute(Identifier.."_ent")) + interval = tonumber(Reliable:GetAttribute(Identifier.."_int")) end local entrances: number = 0 return function(incoming: number?): boolean @@ -32,4 +62,14 @@ function RateLimit.create(Identifier: string, entrance: number?, interval: numbe end end +function RateLimit.Protect() + if not RunService:IsServer() or Reliable:GetAttribute("Protected") then return end + Reliable:SetAttribute("Protected", true) + Unreliable:SetAttribute("Protected", true) + Request:SetAttribute("Protected", true) + Reliable.OnServerEvent:Connect(onReceived) + Unreliable.OnServerEvent:Connect(onReceived) + Request.OnServerEvent:Connect(onReceived) +end + return RateLimit :: typeof(RateLimit) \ No newline at end of file diff --git a/src/init.luau b/src/init.luau index 219e40d..e4cb501 100644 --- a/src/init.luau +++ b/src/init.luau @@ -1,5 +1,5 @@ -- Warp Library (@Eternity_Devs) --- version 1.0.13 +-- version 1.0.14 --!strict --!native --!optimize 2 @@ -11,6 +11,8 @@ return { fromServerArray = Index.fromServerArray, fromClientArray = Index.fromClientArray, + OnSpamSignal = Index.OnSpamSignal, + Signal = Index.Signal, fromSignalArray = Index.fromSignalArray, diff --git a/wally.toml b/wally.toml index cae5b8e..ce7b67d 100644 --- a/wally.toml +++ b/wally.toml @@ -1,6 +1,6 @@ [package] name = "imezx/warp" -version = "1.0.13" +version = "1.0.14" registry = "https://github.com/UpliftGames/wally-index" realm = "shared" license = "MIT"