99from zmq import ROUTER , Poller , POLLIN
1010from zmq .asyncio import Context
1111from io import BytesIO
12- from logging import warning , info
12+ from asyncio import create_task
1313from PIL import Image , ImageDraw , ImageChops
1414
1515from killua .bot import BaseBot
@@ -429,7 +429,9 @@ async def stats(self, _) -> dict:
429429 "guilds" : len (self .client .guilds ),
430430 "shards" : self .client .shard_count ,
431431 "registered_users" : await DB .teams .count_documents ({}),
432- "user_installs" : (await self .client .application_info ()).approximate_user_install_count ,
432+ "user_installs" : (
433+ await self .client .application_info ()
434+ ).approximate_user_install_count ,
433435 "last_restart" : self .client .startup_datetime .timestamp (),
434436 }
435437
@@ -488,7 +490,7 @@ def jsonify(self, obj):
488490 """Helper function to convert objects to JSON transferable format"""
489491 return self ._convert_snowflakes (self ._convert_datetime (obj ))
490492
491- async def user_info (self , data ) -> dict :
493+ async def user_info (self , data : dict ) -> dict :
492494 """Gets user info by Discord ID and returns it with display name and avatar URL"""
493495 user_id = data .get ("user_id" )
494496 if not user_id :
@@ -515,7 +517,7 @@ async def user_info(self, data) -> dict:
515517
516518 # Return flat dictionary structure with all user data and Discord info
517519 response_data = {
518- "id" : user_data .id ,
520+ "id" : user_data .id ,
519521 "email" : user_data .email ,
520522 "display_name" : user .display_name ,
521523 "avatar_url" : str (user .avatar .url ) if user .avatar else None ,
@@ -537,9 +539,7 @@ async def user_info(self, data) -> dict:
537539 "lootboxes" : user_data .lootboxes ,
538540 "boosters" : user_data .boosters ,
539541 "weekly_cooldown" : (
540- user_data .weekly_cooldown
541- if user_data .weekly_cooldown
542- else None
542+ user_data .weekly_cooldown if user_data .weekly_cooldown else None
543543 ),
544544 "action_settings" : user_data .action_settings ,
545545 "action_stats" : user_data .action_stats ,
@@ -549,7 +549,35 @@ async def user_info(self, data) -> dict:
549549 "premium_tier" : user_data .premium_tier ,
550550 }
551551
552+ if data .get ("from_admin" , False ) is False :
553+ # Fire and forget background task
554+ create_task (self ._register_login (user , user_data ))
555+
552556 return self .jsonify (response_data )
553557
558+ async def _register_login (self , user : discord .User , user_data : User ) -> None :
559+ """The actual background work you want to do"""
560+ first_login = await user_data .register_login ()
561+ if not first_login :
562+ return
563+
564+ # Add free golden lootbox and 1000 Jenny to user
565+ await user_data .add_lootbox (4 )
566+ await user_data .add_jenny (1000 )
567+
568+ # Try to send the user a DM about their reward
569+ if user :
570+ try :
571+ await user .send (
572+ embed = discord .Embed .from_dict (
573+ {
574+ "title" : "Thank you for checking out Killua's new website!" ,
575+ "description" : "You've received a free golden lootbox and 1000 Jenny!" ,
576+ "color" : 0x3E4A78 ,
577+ }
578+ )
579+ )
580+ except discord .HTTPException :
581+ pass # Ignore failure
554582
555583Cog = IPCRoutes
0 commit comments