From d8526c7e25d1f0723bea7ed11b59a8f8bc91541c Mon Sep 17 00:00:00 2001 From: EternityDev Date: Sun, 1 Dec 2024 21:10:56 +0700 Subject: [PATCH] pre v1.0.14 --- Warp.rbxm | Bin 17453 -> 17918 bytes src/Index/Server/ServerProcess/init.luau | 3 +- src/Index/Util/RateLimit.luau | 52 ++++++++++++++++++++--- src/init.luau | 4 +- wally.toml | 2 +- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Warp.rbxm b/Warp.rbxm index b12e9e05c5db0ef1613a45b0aac82a312c5bc54a..aca5eae00819aeb835bd7c53baa4990552b20662 100644 GIT binary patch delta 5656 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 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"