aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Leon Sandøy <[email protected]>2020-07-29 20:14:52 +0200
committerGravatar Leon Sandøy <[email protected]>2020-07-29 20:14:52 +0200
commite0837f4f6dd7c5c2d6fc0811dccfaf1ecae768ba (patch)
tree3a33d8ab90447f01044deeac3a10b4ba00826552
parentFix a bad type annotation. (diff)
Restructure bot.filter_list_cache.
This is an optimization designed to eliminate all the list comprehensions we were doing inside antimalware and filtering. The cache is now structured so that the content is the key and the metadata is the value.
-rw-r--r--bot/bot.py8
-rw-r--r--bot/cogs/antimalware.py2
-rw-r--r--bot/cogs/filter_lists.py18
-rw-r--r--bot/cogs/filtering.py3
-rw-r--r--tests/bot/cogs/test_antimalware.py10
5 files changed, 20 insertions, 21 deletions
diff --git a/bot/bot.py b/bot/bot.py
index 5deb986ec..4492feaa9 100644
--- a/bot/bot.py
+++ b/bot/bot.py
@@ -35,7 +35,7 @@ class Bot(commands.Bot):
self.redis_ready = asyncio.Event()
self.redis_closed = False
self.api_client = api.APIClient(loop=self.loop)
- self.filter_list_cache = defaultdict(list)
+ self.filter_list_cache = defaultdict(dict)
self._connector = None
self._resolver = None
@@ -169,14 +169,14 @@ class Bot(commands.Bot):
"""Add an item to the bots filter_list_cache."""
type_ = item["type"]
allowed = item["allowed"]
- metadata = {
+ content = item["content"]
+
+ self.filter_list_cache[f"{type_}.{allowed}"][content] = {
"id": item["id"],
- "content": item["content"],
"comment": item["comment"],
"created_at": item["created_at"],
"updated_at": item["updated_at"],
}
- self.filter_list_cache[f"{type_}.{allowed}"].append(metadata)
async def login(self, *args, **kwargs) -> None:
"""Re-create the connector and set up sessions before logging into Discord."""
diff --git a/bot/cogs/antimalware.py b/bot/cogs/antimalware.py
index 9a100b3fc..c76bd2c60 100644
--- a/bot/cogs/antimalware.py
+++ b/bot/cogs/antimalware.py
@@ -40,7 +40,7 @@ class AntiMalware(Cog):
def _get_whitelisted_file_formats(self) -> list:
"""Get the file formats currently on the whitelist."""
- return [item['content'] for item in self.bot.filter_list_cache['file_format.True']]
+ return self.bot.filter_list_cache['FILE_FORMAT.True'].keys()
def _get_disallowed_extensions(self, message: Message) -> t.Iterable[str]:
"""Get an iterable containing all the disallowed extensions of attachments."""
diff --git a/bot/cogs/filter_lists.py b/bot/cogs/filter_lists.py
index a93de2de9..3331be014 100644
--- a/bot/cogs/filter_lists.py
+++ b/bot/cogs/filter_lists.py
@@ -88,16 +88,16 @@ class FilterLists(Cog):
# Find the content and delete it.
log.trace(f"Trying to delete the {content} item from the {list_type} {allow_type}")
- for allow_list in self.bot.filter_list_cache[f"{list_type}.{allowed}"]:
- if content == allow_list.get("content"):
- item = allow_list
+ for allow_list, metadata in self.bot.filter_list_cache[f"{list_type}.{allowed}"].items():
+ if content == allow_list:
+ item = metadata
break
if item is not None:
await self.bot.api_client.delete(
- f"bot/filter-lists/{item.get('id')}"
+ f"bot/filter-lists/{item['id']}"
)
- self.bot.filter_list_cache[f"{list_type}.{allowed}"].remove(item)
+ del self.bot.filter_list_cache[f"{list_type}.{allowed}"][content]
await ctx.message.add_reaction("✅")
async def _list_all_data(self, ctx: Context, allowed: bool, list_type: ValidFilterListType) -> None:
@@ -107,11 +107,11 @@ class FilterLists(Cog):
# Build a list of lines we want to show in the paginator
lines = []
- for item in result:
- line = f"• `{item.get('content')}`"
+ for content, metadata in result.items():
+ line = f"• `{content}`"
- if item.get("comment"):
- line += f" - {item.get('comment')}"
+ if metadata.get("comment"):
+ line += f" - {metadata.get('comment')}"
lines.append(line)
lines = sorted(lines)
diff --git a/bot/cogs/filtering.py b/bot/cogs/filtering.py
index 7787d396d..0951cb740 100644
--- a/bot/cogs/filtering.py
+++ b/bot/cogs/filtering.py
@@ -101,8 +101,7 @@ class Filtering(Cog):
def _get_filterlist_items(self, list_type: str, *, allowed: bool) -> list:
"""Fetch items from the filter_list_cache."""
- items = self.bot.filter_list_cache[f"{list_type.upper()}.{allowed}"]
- return [item["content"] for item in items]
+ return self.bot.filter_list_cache[f"{list_type.upper()}.{allowed}"].keys()
@staticmethod
def _expand_spoilers(text: str) -> str:
diff --git a/tests/bot/cogs/test_antimalware.py b/tests/bot/cogs/test_antimalware.py
index 664fa8f19..82eadf226 100644
--- a/tests/bot/cogs/test_antimalware.py
+++ b/tests/bot/cogs/test_antimalware.py
@@ -15,11 +15,11 @@ class AntiMalwareCogTests(unittest.IsolatedAsyncioTestCase):
"""Sets up fresh objects for each test."""
self.bot = MockBot()
self.bot.filter_list_cache = {
- "file_format.True": [
- {"content": ".first"},
- {"content": ".second"},
- {"content": ".third"}
- ]
+ "file_format.True": {
+ ".first": {},
+ ".second": {},
+ ".third": {},
+ }
}
self.cog = antimalware.AntiMalware(self.bot)
self.message = MockMessage()