diff --git a/bot/src/cogs/galtinn.py b/bot/src/cogs/galtinn.py index 3787b3b..afeb6de 100644 --- a/bot/src/cogs/galtinn.py +++ b/bot/src/cogs/galtinn.py @@ -25,6 +25,7 @@ class Galtinn(commands.Cog): self.membership_check.start() self.verification_cleanup.start() + asyncio.create_task(self.listen_db()) async def init_db(self): """ @@ -42,6 +43,41 @@ class Galtinn(commands.Cog): """ ) + async def listen_db(self): + """ + Creates a listener for galitnn_auth_complete events from the database and processes them + """ + + async def process_notification(conn, pid, channel, payload): + if channel != "galtinn_auth_complete": + return + + self.bot.logger.info("Received galtinn_auth_complete event from database") + + # Surely, no one would ever send a bad payload, right? RIGHT??? + discord_id, galtinn_id = payload.split(" ") + + # Fetch Discord user + user = self.bot.get_user(int(discord_id)) + if not user: + self.bot.logger.info( + f"Could not find discord user with ID {discord_id} in cache. Fetching from API instead..." + ) + user = await self.bot.fetch_user(int(discord_id)) + + if not user: + self.bot.logger.warning(f"Discord user with ID {payload} not found in cache or API. Ignoring event...") + return + + # Fetch roles + # Give user roles + + conn = await self.bot.db.acquire() + await conn.add_listener("galtinn_auth_complete", process_notification) + + while True: + await asyncio.sleep(1) + def cog_unload(self): self.bot.logger.info("Unloading cog") self.membership_check.cancel() diff --git a/verification_server/src/server.py b/verification_server/src/server.py index efe5df0..51defdc 100644 --- a/verification_server/src/server.py +++ b/verification_server/src/server.py @@ -113,6 +113,15 @@ async def callback(request: Request, code: str, state: str): discord_id, ) + # Notify bot that user is verified + await app.state.pool.execute( + """ + NOTIFY galtinn_auth_complete, '$1 $2' + """, + discord_id, + user["sub"], # TODO: use UUID? + ) + return RedirectResponse(f"/success/{user['preferred_username']}", status_code=303)