From dc4e68ad75882d95cf86fc95be5970bc7869f79b Mon Sep 17 00:00:00 2001 From: klemek Date: Sat, 25 Apr 2020 13:41:01 +0200 Subject: [PATCH] not found proposition --- discord_bot/__main__.py | 54 ++++++++++++++++++++++------------------- meme_otron/__main__.py | 19 ++++++++------- meme_otron/meme_db.py | 5 ++++ meme_otron/utils.py | 17 +++++++++++++ requirements.txt | 3 ++- 5 files changed, 63 insertions(+), 35 deletions(-) diff --git a/discord_bot/__main__.py b/discord_bot/__main__.py index a6f37b9..35e6029 100644 --- a/discord_bot/__main__.py +++ b/discord_bot/__main__.py @@ -120,31 +120,35 @@ async def on_message(message): left_wmark_text = f"By {message.author.display_name}" img = meme_otron.compute(*args, left_wmark_text=left_wmark_text) if img is None: - await message.channel.send(f":warning: Template `{args[0]}` not found\n" - f"You can find a more detailed help and a list of templates at:\n" - f"") - return - with tempfile.NamedTemporaryFile(delete=False) as output: - img.save(output, format="JPEG") - response = None - if len(args) == 1: - meme = db.get_meme(args[0]) - response = f"Template `{meme.id}`:" - if len(meme.aliases) > 0: - response += f"\n- Aliases: `{'`, `'.join(meme.aliases)}`" - if meme.info is not None: - response += f"\n- More info: <{meme.info}>" - elif not direct: - response = f"A meme by {message.author.mention}:" - if mid not in SENT: - SENT[mid] = [] - response = await message.channel.send(response, - file=discord.File(filename="meme.jpg", fp=output.name)) - SENT[mid] += [response] - try: - os.remove(output.name) - except PermissionError: - pass + hint = db.find_nearest(args[0]) + response = f":warning: Template `{args[0]}` not found\n" + if hint is not None: + response += f"Did you mean `{hint}`?\n" + response += f"You can find a more detailed help and a list of templates at:\n" \ + f"" + await message.channel.send(response) + else: + with tempfile.NamedTemporaryFile(delete=False) as output: + img.save(output, format="JPEG") + response = None + if len(args) == 1: + meme = db.get_meme(args[0]) + response = f"Template `{meme.id}`:" + if len(meme.aliases) > 0: + response += f"\n- Aliases: `{'`, `'.join(meme.aliases)}`" + if meme.info is not None: + response += f"\n- More info: <{meme.info}>" + elif not direct: + response = f"A meme by {message.author.mention}:" + if mid not in SENT: + SENT[mid] = [] + response = await message.channel.send(response, + file=discord.File(filename="meme.jpg", fp=output.name)) + SENT[mid] += [response] + try: + os.remove(output.name) + except PermissionError: + pass if not direct: await delete(message) diff --git a/meme_otron/__main__.py b/meme_otron/__main__.py index 43742d7..064f895 100644 --- a/meme_otron/__main__.py +++ b/meme_otron/__main__.py @@ -9,23 +9,26 @@ from . import meme_otron if __name__ == "__main__": db.load_memes() imgf.load_fonts() - - if len(sys.argv) <= 1 or sys.argv[1].lower().strip() == "help" or "-h" in sys.argv : + + if len(sys.argv) <= 1 or sys.argv[1].lower().strip() == "help" or "-h" in sys.argv: print("python -h\r\n", - "python -m meme_otron (meme_id) \"[text 1]\" \"[text 2]\" ... > file.jpg\r\n", - "python -m meme_otron -o file.jpg (meme_id) \"[text 1]\" \"[text 2]\" ...", - file=sys.stderr) + "python -m meme_otron (meme_id) \"[text 1]\" \"[text 2]\" ... > file.jpg\r\n", + "python -m meme_otron -o file.jpg (meme_id) \"[text 1]\" \"[text 2]\" ...", + file=sys.stderr) sys.exit(1) else: output_f = None if "-o" in sys.argv: i = sys.argv.index("-o") if len(sys.argv) >= i: - output_f = sys.argv[i+1] - del sys.argv[i+1] + output_f = sys.argv[i + 1] + del sys.argv[i + 1] del sys.argv[i] img = meme_otron.compute(*sys.argv[1:]) if img is None: + hint = db.find_nearest(sys.argv[1]) + if hint is not None: + print(f"Did you mean '{hint}'?") sys.exit(1) if output_f is None: with os.fdopen(os.dup(sys.stdout.fileno())) as output: @@ -40,5 +43,3 @@ if __name__ == "__main__": except ValueError as e: print(f"Cannot write '{output_f}': {e}", file=sys.stderr) sys.exit(1) - - diff --git a/meme_otron/meme_db.py b/meme_otron/meme_db.py index 92d55a9..adc97fe 100644 --- a/meme_otron/meme_db.py +++ b/meme_otron/meme_db.py @@ -165,3 +165,8 @@ def get_meme(name): return DATA[ALIASES[name]].clone() else: return None + + +def find_nearest(word): + word = word.lower().strip().replace(" ", "_") + return utils.find_nearest(word, ALIASES.keys()) diff --git a/meme_otron/utils.py b/meme_otron/utils.py index d6d445b..72bb82f 100644 --- a/meme_otron/utils.py +++ b/meme_otron/utils.py @@ -1,5 +1,6 @@ import re import os.path as path +from Levenshtein import distance def relative_path(file, *args): @@ -120,3 +121,19 @@ def parse_arguments(s): :return: """ return [[g for g in m if len(g) > 0][0] for m in args_regex.findall(s)] + + +def find_nearest(word, wlist, threshold=5): + """ + TODO + + :param (str) word: + :param (list of str) wlist: + :param (int) threshold: + :rtype: str | None + :return: + """ + found = min([(distance(word, w) - abs(len(w) - len(word)), w) for w in wlist], key=lambda v: v[0]) + if found[0] > threshold: + return None + return found[1] diff --git a/requirements.txt b/requirements.txt index 5873a22..2a1099d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -Pillow \ No newline at end of file +Pillow +python-Levenshtein \ No newline at end of file