aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/cogs/rmq.py146
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):