custom rate limits

This commit is contained in:
Owen
2025-01-13 15:37:32 +01:00
committed by Owen Rees
parent 683c4c4de2
commit 3d0dc324a6
2 changed files with 18 additions and 8 deletions
@@ -17,14 +17,14 @@ defmodule PlantIdDiscordBot.Cog.PlantNetMessage do
IO.inspect(message) IO.inspect(message)
case RateLimiter.check_limit(message.guild_id) do case RateLimiter.check_limit(message.guild_id) do
{:limit_exceeded, _} -> {:limit_exceeded, _requests_used, _requests_limit} ->
Api.create_message(message.channel_id, Api.create_message(message.channel_id,
content: content:
"This server has exceeded its allowed requests in 24 hours. Please try again tomorrow.", "This server has exceeded its allowed requests in 24 hours. Please try again tomorrow.",
message_reference: %{message_id: message.id} message_reference: %{message_id: message.id}
) )
{:ok, _} -> {:ok, _requests_used, _requests_limit} ->
do_identification(message) do_identification(message)
end end
end end
+16 -6
View File
@@ -2,7 +2,10 @@ defmodule PlantIdDiscordBot.RateLimiter do
use GenServer use GenServer
require Logger require Logger
@request_limit Application.compile_env(:plantid_discord_bot, :guild_request_limit_per_day) @default_request_limit Application.compile_env(
:plantid_discord_bot,
:guild_request_limit_per_day
)
@custom_limits %{ @custom_limits %{
1_002_507_312_159_797_318 => 100, 1_002_507_312_159_797_318 => 100,
@@ -34,19 +37,26 @@ defmodule PlantIdDiscordBot.RateLimiter do
@doc """ @doc """
Check if the number of requests for a guild exceeds the limit. Check if the number of requests for a guild exceeds the limit.
""" """
@spec check_limit(String.t()) :: {:ok, integer()} | {:limit_exceeded, integer()} @spec check_limit(String.t() | integer()) :: {:ok, integer()} | {:limit_exceeded, integer()}
def check_limit(guild_id) do def check_limit(guild_id) do
request_limit =
case guild_id in Map.keys(@custom_limits) do
true -> @custom_limits[guild_id]
_ -> @default_request_limit
end
case get(guild_id) do case get(guild_id) do
{:ok, value} -> {:ok, value} ->
if value >= @request_limit do if value >= request_limit do
{:limit_exceeded, value} {:limit_exceeded, value, request_limit}
else else
{:ok, value} {:ok, value, request_limit}
end end
{:error, _} -> {:error, _} ->
put(guild_id, 0) put(guild_id, 0)
{:ok, 0} Logger.debug("Set counter for guild #{guild_id} to 0")
{:ok, 0, request_limit}
end end
end end