Add [p]cc search command (#2573)

* Add search command for Custom Commands

* Spelling mistake

* Create 2573.feature.rst

* Remove `bot.db` usage, improve returned message

* remove towncrier entry

* Fix CI errors

* Fix more CI errors

* Add `@staticmethod` decorator

Co-authored-by: Toby Harradine <Tobotimus@users.noreply.github.com>
Co-authored-by: Michael H <michael@michaelhall.tech>
Co-authored-by: Kowlin <Kowlin@users.noreply.github.com>
Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
This commit is contained in:
Neuro Assassin 2020-03-27 21:11:36 -04:00 committed by GitHub
parent 7009be8922
commit 9370b5110e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,10 +3,11 @@ import random
from datetime import datetime, timedelta from datetime import datetime, timedelta
from inspect import Parameter from inspect import Parameter
from collections import OrderedDict from collections import OrderedDict
from typing import Mapping, Tuple, Dict, Set from typing import Iterable, List, Mapping, Tuple, Dict, Set
from urllib.parse import quote_plus from urllib.parse import quote_plus
import discord import discord
from fuzzywuzzy import process
from redbot.core import Config, checks, commands from redbot.core import Config, checks, commands
from redbot.core.i18n import Translator, cog_i18n from redbot.core.i18n import Translator, cog_i18n
@ -205,6 +206,33 @@ class CustomCommands(commands.Cog):
"""Custom commands management.""" """Custom commands management."""
pass pass
@customcom.command(name="search")
@commands.guild_only()
async def cc_search(self, ctx: commands.Context, *, query):
"""Searches through custom commands, according to the query."""
cc_commands = await CommandObj.get_commands(self.config.guild(ctx.guild))
extracted = process.extract(query, list(cc_commands.keys()))
accepted = []
for entry in extracted:
if entry[1] > 60:
# Match was decently strong
accepted.append((entry[0], cc_commands[entry[0]]))
else:
# Match wasn't strong enough
pass
if len(accepted) == 0:
return await ctx.send(_("No close matches were found."))
results = self.prepare_command_list(ctx, accepted)
if await ctx.embed_requested():
content = " \n".join(map("**{0[0]}** {0[1]}".format, results))
embed = discord.Embed(
title=_("Search results"), description=content, colour=await ctx.embed_colour()
)
await ctx.send(embed=embed)
else:
content = "\n".join(map("{0[0]:<12} : {0[1]}".format, results))
await ctx.send(_("The following matches have been found:") + box(content))
@customcom.group(name="create", aliases=["add"], invoke_without_command=True) @customcom.group(name="create", aliases=["add"], invoke_without_command=True)
@checks.mod_or_permissions(administrator=True) @checks.mod_or_permissions(administrator=True)
async def cc_create(self, ctx: commands.Context, command: str.lower, *, text: str): async def cc_create(self, ctx: commands.Context, command: str.lower, *, text: str):
@ -359,23 +387,7 @@ class CustomCommands(commands.Cog):
) )
return return
results = [] results = self.prepare_command_list(ctx, sorted(cc_dict.items(), key=lambda t: t[0]))
for command, body in sorted(cc_dict.items(), key=lambda t: t[0]):
responses = body["response"]
if isinstance(responses, list):
result = ", ".join(responses)
elif isinstance(responses, str):
result = responses
else:
continue
# Cut preview to 52 characters max
if len(result) > 52:
result = result[:49] + "..."
# Replace newlines with spaces
result = result.replace("\n", " ")
# Escape markdown and mass mentions
result = escape(result, formatting=True, mass_mentions=True)
results.append((f"{ctx.clean_prefix}{command}", result))
if await ctx.embed_requested(): if await ctx.embed_requested():
# We need a space before the newline incase the CC preview ends in link (GH-2295) # We need a space before the newline incase the CC preview ends in link (GH-2295)
@ -663,3 +675,26 @@ class CustomCommands(commands.Cog):
""" """
return set(await CommandObj.get_commands(self.config.guild(guild))) return set(await CommandObj.get_commands(self.config.guild(guild)))
@staticmethod
def prepare_command_list(
ctx: commands.Context, command_list: Iterable[Tuple[str, dict]]
) -> List[Tuple[str, str]]:
results = []
for command, body in command_list:
responses = body["response"]
if isinstance(responses, list):
result = ", ".join(responses)
elif isinstance(responses, str):
result = responses
else:
continue
# Cut preview to 52 characters max
if len(result) > 52:
result = result[:49] + "..."
# Replace newlines with spaces
result = result.replace("\n", " ")
# Escape markdown and mass mentions
result = escape(result, formatting=True, mass_mentions=True)
results.append((f"{ctx.clean_prefix}{command}", result))
return results