From be46d62c8708af3f92b645c53e6640ce8b398c47 Mon Sep 17 00:00:00 2001 From: infinitefusion Date: Sat, 5 Oct 2024 20:02:18 -0400 Subject: [PATCH] =?UTF-8?q?adds=20client=20side=20rate=20limit=20for=20cus?= =?UTF-8?q?tom=20sprites=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Data/Scripts/051_AddOns/HttpCalls.rb | 24 ++++++++++++++++++++++++ Data/sprites/sprites_rate_limit.log | 2 ++ 2 files changed, 26 insertions(+) create mode 100644 Data/sprites/sprites_rate_limit.log diff --git a/Data/Scripts/051_AddOns/HttpCalls.rb b/Data/Scripts/051_AddOns/HttpCalls.rb index 407cc4657..6dbbd0380 100644 --- a/Data/Scripts/051_AddOns/HttpCalls.rb +++ b/Data/Scripts/051_AddOns/HttpCalls.rb @@ -103,6 +103,7 @@ def download_autogen_sprite(head_id, body_id,spriteformBody_suffix=nil,spritefor end def download_custom_sprite(head_id, body_id, spriteformBody_suffix = "", spriteformHead_suffix = "", alt_letter="") + return nil if requestRateExceeded?(Settings::CUSTOMSPRITES_RATE_LOG_FILE,Settings::CUSTOMSPRITES_ENTRIES_RATE_TIME_WINDOW,Settings::CUSTOMSPRITES_RATE_MAX_NB_REQUESTS) head_id = (head_id.to_s) + spriteformHead_suffix.to_s body_id = (body_id.to_s) + spriteformBody_suffix.to_s return nil if $PokemonSystem.download_sprites != 0 @@ -117,6 +118,7 @@ def download_custom_sprite(head_id, body_id, spriteformBody_suffix = "", spritef end def download_custom_sprite_filename(filename) + return nil if requestRateExceeded?(Settings::CUSTOMSPRITES_RATE_LOG_FILE,Settings::CUSTOMSPRITES_ENTRIES_RATE_TIME_WINDOW,Settings::CUSTOMSPRITES_RATE_MAX_NB_REQUESTS) head_id = (head_id.to_s) + spriteformHead_suffix.to_s body_id = (body_id.to_s) + spriteformBody_suffix.to_s return nil if $PokemonSystem.download_sprites != 0 @@ -246,3 +248,25 @@ def fetch_latest_game_version end end + +def requestRateExceeded?(logFile,timeWindow, maxRequests) + # Read or initialize the request log + if File.exist?(logFile) + log_data = File.read(logFile).split("\n") + request_timestamps = log_data.map(&:to_i) + else + request_timestamps = [] + end + current_time = Time.now.to_i + # Remove old timestamps that are outside the time window + request_timestamps.reject! { |timestamp| (current_time - timestamp) > timeWindow } + # Update the log with the current request + request_timestamps << current_time + # Write the updated log back to the file + File.write(logFile, request_timestamps.join("\n")) + # Check if the number of requests in the time window exceeds the limit + echoln request_timestamps.size > maxRequests + echoln request_timestamps + echoln maxRequests + return request_timestamps.size > maxRequests +end diff --git a/Data/sprites/sprites_rate_limit.log b/Data/sprites/sprites_rate_limit.log new file mode 100644 index 000000000..183c19e73 --- /dev/null +++ b/Data/sprites/sprites_rate_limit.log @@ -0,0 +1,2 @@ +1728172794 +1728172795 \ No newline at end of file