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