mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-07 03:38:53 -05:00
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:
parent
7009be8922
commit
9370b5110e
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user