aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/cogs/events.py58
-rw-r--r--bot/constants.py1
2 files changed, 56 insertions, 3 deletions
diff --git a/bot/cogs/events.py b/bot/cogs/events.py
index a7111b8a0..721e51e3d 100644
--- a/bot/cogs/events.py
+++ b/bot/cogs/events.py
@@ -1,20 +1,24 @@
import logging
-from discord import Embed, Member
+from discord import Colour, Embed, Member, Object
from discord.ext.commands import (
BadArgument, Bot, BotMissingPermissions,
CommandError, CommandInvokeError, Context,
NoPrivateMessage, UserInputError
)
+from bot.cogs.modlog import ModLog
from bot.constants import (
- Channels, DEBUG_MODE, Guild,
- Keys, Roles, URLs
+ Channels, Colours, DEBUG_MODE,
+ Guild, Icons, Keys,
+ Roles, URLs
)
from bot.utils import chunks
log = logging.getLogger(__name__)
+RESTORE_ROLES = (str(Roles.muted), str(Roles.announcements))
+
class Events:
"""No commands, just event handlers."""
@@ -22,6 +26,10 @@ class Events:
def __init__(self, bot: Bot):
self.bot = bot
+ @property
+ def mod_log(self) -> ModLog:
+ return self.bot.get_cog("ModLog")
+
async def send_updated_users(self, *users, replace_all=False):
users = list(filter(lambda user: str(Roles.verified) in user["roles"], users))
@@ -85,6 +93,15 @@ class Events:
log.exception(f"Failed to delete {len(users)} users")
return {}
+ async def get_user(self, user_id):
+ response = await self.bot.http_session.get(
+ url=URLs.site_user_api,
+ params={"user_id": user_id},
+ headers={"X-API-Key": Keys.site_api}
+ )
+
+ return await response.json()["data"]
+
async def on_command_error(self, ctx: Context, e: CommandError):
command = ctx.command
parent = None
@@ -194,6 +211,29 @@ class Events:
async def on_member_join(self, member: Member):
role_ids = [str(r.id) for r in member.roles] # type: List[str]
+ new_roles = []
+
+ try:
+ user_objs = await self.get_user(str(member.id))
+ except Exception as e:
+ log.exception("Failed to persist roles")
+
+ await self.mod_log.send_log_message(
+ Icons.crown_red, Colour(Colours.soft_red), "Failed to persist roles",
+ f"```py\n{e}\n```",
+ member.avatar_url_as(static_format="png")
+ )
+ else:
+ if user_objs:
+ old_roles = user_objs[0].get("roles", [])
+
+ for role in RESTORE_ROLES:
+ if role in old_roles:
+ new_roles.append(Object(int(role)))
+
+ for role in new_roles:
+ if str(role) not in role_ids:
+ role_ids.append(str(role.id))
changes = await self.send_updated_users({
"avatar": member.avatar_url_as(format="png"),
@@ -205,6 +245,18 @@ class Events:
log.debug(f"User {member.id} joined; changes: {changes}")
+ if new_roles:
+ await member.add_roles(
+ *new_roles,
+ reason="Roles restored"
+ )
+
+ await self.mod_log.send_log_message(
+ Icons.crown_blurple, Colour.blurple(), "Roles restored",
+ f"Restored {len(new_roles)} roles",
+ member.avatar_url_as(static_format="png")
+ )
+
async def on_member_remove(self, member: Member):
changes = await self.send_delete_users({
"user_id": str(member.id)
diff --git a/bot/constants.py b/bot/constants.py
index ad6236cd9..68155e800 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -301,6 +301,7 @@ class Roles(metaclass=YAMLGetter):
devops: int
jammer: int
moderator: int
+ muted: int
owner: int
verified: int
muted: int