aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Shirayuki Nekomata <[email protected]>2020-03-08 21:30:18 +0700
committerGravatar Shirayuki Nekomata <[email protected]>2020-03-08 21:30:18 +0700
commitdd707182b4f4f4ce98353d5c82092f48dd8fb5c2 (patch)
tree1948d5e4534eca424c995236287e5a06dc178ee2
parentFixed searching for `,` returing all tags. Made it more descriptive when mult... (diff)
Refactored dense codes, removed obvious type hint.
- Show the process of sanitizing the List[str] `keywords_processed`. - Show the process of finding tag for `matching_tags` ( was `founds` ). - Refactored the logic to find boolean `is_plural`. - Minor wording changes for docstring.
-rw-r--r--bot/cogs/tags.py40
1 files changed, 25 insertions, 15 deletions
diff --git a/bot/cogs/tags.py b/bot/cogs/tags.py
index 49ed87c92..89f3acb6d 100644
--- a/bot/cogs/tags.py
+++ b/bot/cogs/tags.py
@@ -1,7 +1,7 @@
import logging
import re
import time
-from typing import Callable, Dict, Iterable, List, Optional, Tuple
+from typing import Callable, Dict, Iterable, List, Optional
from discord import Colour, Embed
from discord.ext.commands import Cog, Context, group
@@ -90,27 +90,37 @@ class Tags(Cog):
"""
Search for tags via contents.
- `predicate` will be either any or all, or a custom callable to search. Must return a bool.
+ `predicate` will be the built-in any, all, or a custom callable. Must return a bool.
"""
await self._get_tags()
- keywords_processed: Tuple[str] = tuple(query.strip().casefold() for query in keywords.split(',') if query)
- keywords_processed = keywords_processed or (keywords,)
- founds: list = [
- tag
- for tag in self._cache.values()
- if check(query in tag['embed']['description'] for query in keywords_processed)
- ]
-
- if not founds:
+ keywords_processed: List[str] = []
+ for keyword in keywords.split(','):
+ keyword_sanitized = keyword.strip().casefold()
+ if not keyword_sanitized:
+ # this happens when there are leading / trailing / consecutive comma.
+ continue
+ keywords_processed.append(keyword_sanitized)
+
+ if not keywords_processed:
+ # after sanitizing, we can end up with an empty list, for example when keywords is ','
+ # in that case, we simply want to search for such keywords directly instead.
+ keywords_processed = [keywords]
+
+ matching_tags = []
+ for tag in self._cache.values():
+ if check(query in tag['embed']['description'].casefold() for query in keywords_processed):
+ matching_tags.append(tag)
+
+ if not matching_tags:
return None
- elif len(founds) == 1:
- return Embed().from_dict(founds[0]['embed'])
+ elif len(matching_tags) == 1:
+ return Embed().from_dict(matching_tags[0]['embed'])
else:
- is_plural: bool = len(keywords_processed) > 1 or any(kw.count(' ') for kw in keywords_processed)
+ is_plural = len(keywords_processed) > 1 or keywords.strip().count(' ') > 1
embed = Embed(
title=f"Here are the tags containing the given keyword{'s' * is_plural}:",
- description='\n'.join(tag['title'] for tag in founds[:10])
+ description='\n'.join(tag['title'] for tag in matching_tags[:10])
)
embed.set_footer(text=f"Keyword{'s' * is_plural} used: {keywords}"[:1024])
return embed