diff options
-rw-r--r-- | bot/cogs/events.py | 66 |
1 files changed, 47 insertions, 19 deletions
diff --git a/bot/cogs/events.py b/bot/cogs/events.py index 9727ed3a7..48aeadf11 100644 --- a/bot/cogs/events.py +++ b/bot/cogs/events.py @@ -8,7 +8,6 @@ from discord.ext.commands import ( ) from bot.constants import DEVLOG_CHANNEL, PYTHON_GUILD, SITE_API_KEY, SITE_API_USER_URL -from bot.utils import chunks log = logging.getLogger(__name__) @@ -21,9 +20,29 @@ class Events: def __init__(self, bot: AutoShardedBot): self.bot = bot - async def send_updated_users(self, *users): + async def send_updated_users(self, *users, replace_all=False): try: - response = await self.bot.http_session.post( + if replace_all: + response = await self.bot.http_session.post( + url=SITE_API_USER_URL, + json=list(users), + headers={"X-API-Key": SITE_API_KEY} + ) + else: + response = await self.bot.http_session.put( + url=SITE_API_USER_URL, + json=list(users), + headers={"X-API-Key": SITE_API_KEY} + ) + + return await response.json() + except Exception: + log.exception(f"Failed to send {len(users)} users") + return {} + + async def send_delete_users(self, *users): + try: + response = await self.bot.http_session.delete( url=SITE_API_USER_URL, json=list(users), headers={"X-API-Key": SITE_API_KEY} @@ -31,7 +50,7 @@ class Events: return await response.json() except Exception: - log.exception(f"Failed to send role updates") + log.exception(f"Failed to send {len(users)} users") return {} async def on_command_error(self, ctx: Context, e: CommandError): @@ -87,23 +106,11 @@ class Events: if users: log.debug(f"{len(users)} user roles to be updated") - data = [] # type: List[dict] - - for chunk in chunks(users, 1000): - data.append(await self.send_updated_users(*chunk)) - - done = {} - - for item in data: - for key, value in item.items(): - if key not in done: - done[key] = value - else: - done[key] += value + done = self.send_updated_users(*users, replace_all=True) if any(done.values()): embed = Embed( - title="User roles updated" + title="Users updated" ) for key, value in done.items(): @@ -126,13 +133,34 @@ class Events: log.debug(f"{before.display_name} roles changing from {before_role_names} to {after_role_names}") - await self.send_updated_users({ + changes = await self.send_updated_users({ "user_id": str(after.id), "roles": role_ids, "username": after.name, "discriminator": after.discriminator }) + log.debug(f"User {after.id} updated; changes: {changes}") + + async def on_member_join(self, member: Member): + role_ids = [str(r.id) for r in member.roles] # type: List[int] + + changes = await self.send_updated_users({ + "user_id": str(member.id), + "roles": role_ids, + "username": member.name, + "discriminator": member.discriminator + }) + + log.debug(f"User {member.id} joined; changes: {changes}") + + async def on_member_remove(self, member: Member): + changes = await self.send_delete_users({ + "user_id": str(member.id) + }) + + log.debug(f"User {member.id} left; changes: {changes}") + def setup(bot): bot.add_cog(Events(bot)) |