@@ -165,7 +165,7 @@ class ConfigManager:
165165 "thread_creation_menu_embed_footer_icon_url" : None ,
166166 "thread_creation_menu_embed_color" : str (discord .Color .green ()),
167167 # snippet attachments
168- "snippet_attachment_max_size" : 10 , # in MB
168+ "snippet_attachment_max_size" : 10 , # in MiB
169169 }
170170
171171 private_keys = {
@@ -245,7 +245,7 @@ class ConfigManager:
245245
246246 duration_seconds = {"snooze_default_duration" , "thread_creation_menu_timeout" }
247247
248- megabytes = {"snippet_attachment_max_size" }
248+ mebibytes = {"snippet_attachment_max_size" }
249249
250250 booleans = {
251251 "use_user_id_channel_name" ,
@@ -318,6 +318,23 @@ def __init__(self, bot):
318318 def __repr__ (self ):
319319 return repr (self ._cache )
320320
321+ @staticmethod
322+ def _convert_mebibytes (value : typing .Any ) -> int :
323+ """Convert a positive whole-number MiB value without rounding it."""
324+ if isinstance (value , bool ):
325+ raise InvalidConfigError ("Must be a positive whole number of MiB." )
326+
327+ if isinstance (value , int ):
328+ converted = value
329+ elif isinstance (value , str ) and re .fullmatch (r"[1-9]\d*" , value .strip ()):
330+ converted = int (value )
331+ else :
332+ raise InvalidConfigError ("Must be a positive whole number of MiB." )
333+
334+ if converted <= 0 :
335+ raise InvalidConfigError ("Must be a positive whole number of MiB." )
336+ return converted
337+
321338 def populate_cache (self ) -> dict :
322339 data = deepcopy (self .defaults )
323340
@@ -426,13 +443,12 @@ def get(self, key: str, *, convert: bool = True) -> typing.Any:
426443 logger .warning ("Invalid %s %s." , key , value )
427444 value = self .remove (key )
428445
429- elif key in self .megabytes :
430- if not isinstance (value , int ):
431- try :
432- value = int (value )
433- except (ValueError , TypeError ):
434- logger .warning ("Invalid %s %s." , key , value )
435- value = self .remove (key )
446+ elif key in self .mebibytes :
447+ try :
448+ value = self ._convert_mebibytes (value )
449+ except InvalidConfigError :
450+ logger .warning ("Invalid %s %s." , key , value )
451+ value = self .remove (key )
436452
437453 elif key in self .force_str :
438454 # Temporary: as we saved in int previously, leading to int32 overflow,
@@ -537,6 +553,9 @@ async def set(self, key: str, item: typing.Any, convert=True) -> None:
537553 duration_seconds = int ((time .dt - now ).total_seconds ())
538554 return self .__setitem__ (key , duration_seconds )
539555
556+ elif key in self .mebibytes :
557+ return self .__setitem__ (key , self ._convert_mebibytes (item ))
558+
540559 elif key in self .enums :
541560 if isinstance (item , self .enums [key ]):
542561 # value is an enum type
0 commit comments