Browse Source

embed custom commands finished atm. Might have some kinks or things to add in the future. But that should all be minor stuff.

tags/v2.0.0
Roxie Gibson 5 years ago
parent
commit
c89e8c7f7e
1 changed files with 85 additions and 31 deletions
  1. +85
    -31
      roxbot/cogs/customcommands.py

+ 85
- 31
roxbot/cogs/customcommands.py View File

class CustomCommands: class CustomCommands:
def __init__(self, bot_client): def __init__(self, bot_client):
self.bot = bot_client self.bot = bot_client
self.embed_fields = ("title", "description", "colour", "color", "footer", "image", "thumbnail", "url")


@staticmethod @staticmethod
def _get_output(command): def _get_output(command):
command = random.choice(command) command = random.choice(command)
return command return command


@staticmethod
def _embed_values(command_output):
# discord.Embed.Empty is used by discord.py to denote when a field is empty. Hence why it is the fallback here
title = command_output.get("title", discord.Embed.Empty)
desc = command_output.get("description", discord.Embed.Empty)
# Check for both possible colour fields. Then strip possible # and convert to hex for embed
colour = command_output.get("colour", discord.Embed.Empty) or command_output.get("color", discord.Embed.Empty)
if isinstance(colour, str):
colour = discord.Colour(int(colour.strip("#"), 16))
url = command_output.get("url", discord.Embed.Empty)
footer = command_output.get("footer", discord.Embed.Empty)
image = command_output.get("image", discord.Embed.Empty)
thumbnail = command_output.get("thumbnail", discord.Embed.Empty)
embed = discord.Embed(title=title, description=desc, colour=colour, url=url)
if footer:
embed.set_footer(text=footer)
if image:
embed.set_image(url=image)
if thumbnail:
embed.set_thumbnail(url=thumbnail)
return embed

def _embed_parse_options(self, options):
# Create an dict from a list, taking each two items as a key value pair
output = {item: options[index + 1] for index, item in enumerate(options) if index % 2 == 0}
for key in output.copy().keys():
if key not in self.embed_fields:
output.pop(key)
# Check for errors in inputs that would stop embed from being posted.
title = output.get("title", "")
desc = output.get("description", "")
if len(title) > 256 or len(desc) > 256:
raise ValueError

# We only need one so purge the inferior spelling
if "colour" in output and "color" in output:
output.pop("color")
return output

async def on_message(self, message): async def on_message(self, message):
# Limits customcommands to pm's as customcommands are handled at a guild level. # Limits customcommands to pm's as customcommands are handled at a guild level.
if isinstance(message.channel, discord.DMChannel):
if roxbot.blacklisted(message.author) or not isinstance(message.channel, discord.TextChannel):
return
if message.author == self.bot.user:
return return


settings = roxbot.guild_settings.get(message.guild) settings = roxbot.guild_settings.get(message.guild)
msg = message.content.lower() msg = message.content.lower()
channel = message.channel channel = message.channel


if roxbot.blacklisted(message.author) or type(message.channel) != discord.TextChannel:
return
if message.author == self.bot.user:
return

if msg.startswith(self.bot.command_prefix): if msg.startswith(self.bot.command_prefix):
command = msg.split(self.bot.command_prefix)[1] command = msg.split(self.bot.command_prefix)[1]
if command in settings.custom_commands["1"]: if command in settings.custom_commands["1"]:
return await channel.send(command_output) return await channel.send(command_output)


elif command in settings.custom_commands["2"]: elif command in settings.custom_commands["2"]:
# TODO: Convert shit that needs to be converted like ints so that all kwargs work.
embed = discord.Embed(**self._get_output(settings.custom_commands["2"][command]))
command_output = self._get_output(settings.custom_commands["2"][command])
embed = self._embed_values(command_output)
return await channel.send(embed=embed) return await channel.send(embed=embed)
else: else:
for command in settings.custom_commands["0"]: for command in settings.custom_commands["0"]:
@custom.command() @custom.command()
async def add(self, ctx, command_type, command, *output): async def add(self, ctx, command_type, command, *output):
"""Adds a custom command to the list of custom commands.""" """Adds a custom command to the list of custom commands."""
# TODO: Better command docstring for better help with embeds
if command_type in ("0", "no_prefix", "no prefix"): if command_type in ("0", "no_prefix", "no prefix"):
command_type = "0" command_type = "0"
if len(output) == 1:
output = output[0]
elif command_type in ("1", "prefix"): elif command_type in ("1", "prefix"):
command_type = "1" command_type = "1"
if len(output) == 1:
output = output[0]
elif command_type in ("2", "embed"): elif command_type in ("2", "embed"):
command_type = "2" command_type = "2"
if len(output) < 2: if len(output) < 2:
return await ctx.send("Not enough options given to generate embed.") return await ctx.send("Not enough options given to generate embed.")
output = {item : output[index+1] for index, item in enumerate(output) if index % 2 == 0}
try:
output = self._embed_parse_options(output)
except ValueError:
return await ctx.send("Failed to set output. Given output was too long.")
else: else:
return await ctx.send("Incorrect type given.") return await ctx.send("Incorrect type given.")


no_prefix_commands = settings.custom_commands["0"] no_prefix_commands = settings.custom_commands["0"]
prefix_commands = settings.custom_commands["1"] prefix_commands = settings.custom_commands["1"]
embed_commands = settings.custom_commands["2"] embed_commands = settings.custom_commands["2"]

command = command.lower() command = command.lower()
if len(output) == 1:
output = output[0]


if ctx.message.mentions or ctx.message.mention_everyone or ctx.message.role_mentions: if ctx.message.mentions or ctx.message.mention_everyone or ctx.message.role_mentions:
return await ctx.send("Custom Commands cannot mention people/roles/everyone.") return await ctx.send("Custom Commands cannot mention people/roles/everyone.")
return await ctx.send("Custom Commands cannot mention people/roles/everyone.") return await ctx.send("Custom Commands cannot mention people/roles/everyone.")


if command in no_prefix_commands: if command in no_prefix_commands:
if len(edit) == 1:
edit = edit[0]
settings.custom_commands["0"][command] = edit settings.custom_commands["0"][command] = edit
settings.update(settings.custom_commands, "custom_commands") settings.update(settings.custom_commands, "custom_commands")
return await ctx.send("Edit made. {} now outputs {}".format(command, edit)) return await ctx.send("Edit made. {} now outputs {}".format(command, edit))

elif command in prefix_commands: elif command in prefix_commands:
if len(edit) == 1:
edit = edit[0]
settings.custom_commands["1"][command] = edit settings.custom_commands["1"][command] = edit
settings.update(settings.custom_commands, "custom_commands") settings.update(settings.custom_commands, "custom_commands")
return await ctx.send("Edit made. {} now outputs {}".format(command, edit)) return await ctx.send("Edit made. {} now outputs {}".format(command, edit))

elif command in embed_commands: elif command in embed_commands:
# TODO: This needs to change when I add how to add embed cc's
if len(edit) < 2: if len(edit) < 2:
return await ctx.send("Not enough options given to generate embed.") return await ctx.send("Not enough options given to generate embed.")
edit = {item : edit[index+1] for index, item in enumerate(edit) if index % 2 == 0}
try:
edit = self._embed_parse_options(edit)
except ValueError:
return await ctx.send("Failed to set output. Given output was too long.")
settings.custom_commands["2"][command] = edit settings.custom_commands["2"][command] = edit
settings.update(settings.custom_commands, "custom_commands") settings.update(settings.custom_commands, "custom_commands")
return await ctx.send("Edit made. {} now outputs {}".format(command, edit)) return await ctx.send("Edit made. {} now outputs {}".format(command, edit))

else: else:
return await ctx.send("That Custom Command doesn't exist.") return await ctx.send("That Custom Command doesn't exist.")


embed_commands = settings.custom_commands["2"] embed_commands = settings.custom_commands["2"]


if command in no_prefix_commands: if command in no_prefix_commands:
cat = "0"
command_type = "0"
elif command in prefix_commands: elif command in prefix_commands:
cat = "1"
command_type = "1"
elif command in embed_commands: elif command in embed_commands:
cat = "2"
command_type = "2"
else: else:
return await ctx.send("Custom Command doesn't exist.") return await ctx.send("Custom Command doesn't exist.")


settings.custom_commands[cat].pop(command)
settings.custom_commands[command_type].pop(command)
settings.update(settings.custom_commands, "custom_commands") settings.update(settings.custom_commands, "custom_commands")
return await ctx.send("Removed {} custom command".format(command)) return await ctx.send("Removed {} custom command".format(command))


debug = "0" debug = "0"
settings = roxbot.guild_settings.get(ctx.guild) settings = roxbot.guild_settings.get(ctx.guild)
cc = settings.custom_commands cc = settings.custom_commands
listzero = ""
listone = ""
list_no_prefix = ""
list_prefix = ""

no_prefix_commands = cc["0"]
prefix_commands = {**cc["1"], **cc["2"]}


for command in cc["0"]:
for command in no_prefix_commands:
if debug == "1": if debug == "1":
command += " - {}".format(cc["0"][command]) command += " - {}".format(cc["0"][command])
listzero = listzero + "- " + command + "\n"
for command in cc["1"]:
list_no_prefix = list_no_prefix + "- " + command + "\n"
for command in prefix_commands:
if debug == "1": if debug == "1":
command += " - {}".format(cc["1"][command]) command += " - {}".format(cc["1"][command])
listone = listone + "- " + command + "\n"
if not listone:
listone = "There are no commands setup.\n"
if not listzero:
listzero = "There are no commands setup.\n"
list_prefix = list_prefix + "- " + command + "\n"
if not list_prefix:
list_prefix = "There are no commands setup.\n"
if not list_no_prefix:
list_no_prefix = "There are no commands setup.\n"


# TODO: Sort out a way to shorten this if it goes over 2000 characters.
# TODO: Sort out a way to shorten this if it goes over 2000 characters. Also clean up command to make sense
em = discord.Embed(title="Here is the list of Custom Commands", color=roxbot.EmbedColours.pink) em = discord.Embed(title="Here is the list of Custom Commands", color=roxbot.EmbedColours.pink)
em.add_field(name="Commands that require Prefix:", value=listone, inline=False)
em.add_field(name="Commands that don't:", value=listzero, inline=False)
em.add_field(name="Commands that require Prefix:", value=list_prefix, inline=False)
em.add_field(name="Commands that don't:", value=list_no_prefix, inline=False)
return await ctx.send(embed=em) return await ctx.send(embed=em)





Loading…
Cancel
Save