diff options
| -rw-r--r-- | bot/cogs/rmq.py | 146 | 
1 files changed, 141 insertions, 5 deletions
| diff --git a/bot/cogs/rmq.py b/bot/cogs/rmq.py index f6cf7332b..6eb8c1f95 100644 --- a/bot/cogs/rmq.py +++ b/bot/cogs/rmq.py @@ -1,13 +1,29 @@ +import datetime  import json  import logging +import pprint  import aio_pika +from discord import Colour, Embed  from discord.ext.commands import AutoShardedBot +from discord.utils import get -from bot.constants import Channels, RabbitMQ +from bot.constants import Channels, Guild, RabbitMQ  log = logging.getLogger(__name__) +LEVEL_COLOURS = { +    "debug": Colour.blue(), +    "info": Colour.green(), +    "warning": Colour.gold(), +    "error": Colour.red() +} + +DEFAULT_LEVEL_COLOUR = Colour.greyple() +EMBED_PARAMS = ( +    "colour", "title", "url", "description", "timestamp" +) +  class RMQ:      """ @@ -43,12 +59,132 @@ class RMQ:          try:              data = json.loads(data) -            await self.send_test(f"JSON: {data}")          except Exception: -            await self.send_test(f"Non-JSON: {data}") +            await self.do_mod_log("error", "Unable to parse event", data) +        else: +            event = data["event"] +            event_data = data["data"] + +            try: +                func = getattr(self, f"do_{event}") +                await func(**event_data) +            except Exception as e: +                await self.do_mod_log( +                    "error", f"Unable to handle event: {event}", +                    str(e) +                ) + +    async def do_mod_log(self, level: str, title: str, message: str): +        colour = LEVEL_COLOURS.get(level, DEFAULT_LEVEL_COLOUR) +        embed = Embed( +            title=title, description=f"```\n{message}\n```", +            colour=colour, timestamp=datetime.datetime.now() +        ) + +        await self.bot.get_channel(Channels.modlog).send(embed=embed) +        log.log(logging._nameToLevel[level.upper()], f"Modlog: {title} | {message}") + +    async def do_send_message(self, target: int, message: str): +        channel = self.bot.get_channel(target) + +        if channel is None: +            await self.do_mod_log( +                "error", "Failed: Send Message", +                f"Unable to find channel: {target}" +            ) +        else: +            await channel.send(message) + +            await self.do_mod_log( +                "info", "Succeeded: Send Embed", +                f"Message sent to channel {target}\n\n{message}" +            ) + +    async def do_send_embed(self, target: int, **embed_params): +        for param in list(embed_params.keys()):  # To keep a full copy +            if param not in EMBED_PARAMS: +                await self.do_mod_log( +                    "warning", "Warning: Send Embed", +                    f"Unknown embed parameter: {param}" +                ) +                del embed_params[param] + +        channel = self.bot.get_channel(target) + +        if channel is None: +            await self.do_mod_log( +                "error", "Failed: Send Embed", +                f"Unable to find channel: {target}" +            ) +        else: +            await channel.send(embed=Embed(**embed_params)) + +            await self.do_mod_log( +                "info", "Succeeded: Send Embed", +                f"Embed sent to channel {target}\n\n{pprint.pformat(embed_params, 4)}" +            ) + +    async def do_add_role(self, target: int, role_id: int, reason: str): +        guild = self.bot.get_guild(Guild.id) +        member = guild.get_member(target) + +        if member is None: +            return await self.do_mod_log( +                "error", "Failed: Add Role", +                f"Unable to find member: {target}" +            ) + +        role = get(guild.roles, id=int(role_id)) + +        if role is None: +            return await self.do_mod_log( +                "error", "Failed: Add Role", +                f"Unable to find role: {role_id}" +            ) -    async def send_test(self, data): -        await self.bot.get_channel(Channels.devtest).send(data) +        try: +            await member.add_roles(role, reason=reason) +        except Exception as e: +            await self.do_mod_log( +                "error", "Failed: Add Role", +                f"Error while adding role {role.name}: {e}" +            ) +        else: +            await self.do_mod_log( +                "info", "Succeeded: Add Role", +                f"Role {role.name} added to member {target}" +            ) + +    async def do_remove_role(self, target: int, role_id: int, reason: str): +        guild = self.bot.get_guild(Guild.id) +        member = guild.get_member(target) + +        if member is None: +            return await self.do_mod_log( +                "error", "Failed: Remove Role", +                f"Unable to find member: {target}" +            ) + +        role = get(guild.roles, id=int(role_id)) + +        if role is None: +            return await self.do_mod_log( +                "error", "Failed: Remove Role", +                f"Unable to find role: {role_id}" +            ) + +        try: +            await member.remove_roles(role, reason=reason) +        except Exception as e: +            await self.do_mod_log( +                "error", "Failed: Remove Role", +                f"Error while adding role {role.name}: {e}" +            ) +        else: +            await self.do_mod_log( +                "info", "Succeeded: Remove Role", +                f"Role {role.name} removed from member {target}" +            )  def setup(bot): | 
