diff --git a/changelog.d/3474.feature.rst b/changelog.d/3474.feature.rst new file mode 100644 index 000000000..2a93f4989 --- /dev/null +++ b/changelog.d/3474.feature.rst @@ -0,0 +1 @@ +Add a cli flag for setting a max size of message cache diff --git a/redbot/core/bot.py b/redbot/core/bot.py index 852c6281e..689379800 100644 --- a/redbot/core/bot.py +++ b/redbot/core/bot.py @@ -149,6 +149,12 @@ class RedBase( if "command_not_found" not in kwargs: kwargs["command_not_found"] = "Command {} not found.\n{}" + message_cache_size = cli_flags.message_cache_size + if cli_flags.no_message_cache: + message_cache_size = None + kwargs["max_messages"] = message_cache_size + self._max_messages = message_cache_size + self._uptime = None self._checked_time_accuracy = None self._color = discord.Embed.Empty # This is needed or color ends up 0x000000 @@ -271,6 +277,10 @@ class RedBase( def colour(self) -> NoReturn: raise AttributeError("Please fetch the embed colour with `get_embed_colour`") + @property + def max_messages(self) -> Optional[int]: + return self._max_messages + async def allowed_by_whitelist_blacklist( self, who: Optional[Union[discord.Member, discord.User]] = None, diff --git a/redbot/core/cli.py b/redbot/core/cli.py index 02da9c854..54e401d08 100644 --- a/redbot/core/cli.py +++ b/redbot/core/cli.py @@ -74,6 +74,22 @@ async def interactive_config(red, token_set, prefix_set, *, print_header=True): return token +def positive_int(arg: str) -> int: + try: + x = int(arg) + except ValueError: + raise argparse.ArgumentTypeError("Message cache size has to be a number.") + if x < 1000: + raise argparse.ArgumentTypeError( + "Message cache size has to be greater than or equal to 1000." + ) + if x > sys.maxsize: + raise argparse.ArgumentTypeError( + f"Message cache size has to be lower than or equal to {sys.maxsize}." + ) + return x + + def parse_cli_flags(args): parser = argparse.ArgumentParser( description="Red - Discord Bot", usage="redbot [arguments]" @@ -212,6 +228,15 @@ def parse_cli_flags(args): "all of the data on the host machine." ), ) + parser.add_argument( + "--message-cache-size", + type=positive_int, + default=1000, + help="Set the maximum number of messages to store in the internal message cache.", + ) + parser.add_argument( + "--no-message-cache", action="store_true", help="Disable the internal message cache.", + ) args = parser.parse_args(args)