11from random import randint
22
33from discord import Interaction , Member , app_commands
4+ from discord .abc import Messageable
45from discord .ext .commands import Cog
56
67from bot .main import ActBot
78from bot .ui import EmbedX
89from db .actor import Actor
10+ from utils .misc import numsign
911
1012
1113# ----------------------------------------------------------------------------------------------------
1214# * Exchange Cog
1315# ----------------------------------------------------------------------------------------------------
14- class ExchangeCog (Cog , description = "Allows players to exchange gold and goods. " ):
16+ class ExchangeCog (Cog , description = "Allow players to exchange gold and goods" ):
1517 def __init__ (self , bot : ActBot ):
1618 self .bot = bot
1719
@@ -21,24 +23,26 @@ def __init__(self, bot: ActBot):
2123 @app_commands .guild_only ()
2224 @app_commands .command (description = "Give your gold to another member" )
2325 @app_commands .describe (
24- member = "Member to donate gold to" , gold = "Amount of gold to donate"
26+ member = "Recipient member to send gold to" , gold = "Amount of gold to donate"
2527 )
2628 async def donate (self , interaction : Interaction , member : Member , gold : int ):
2729 # Validate input
2830 if gold <= 0 :
2931 await interaction .response .send_message (
3032 embed = EmbedX .error (
31- f"Your gold input value of ** { gold } ** is invalid.\n Did you mean **{ - gold if gold else randint (1 , 1000 )} ** ?"
33+ f"Your gold input value of ` { gold } ` is invalid.\n Did you mean **{ - gold if gold else randint (1 , 1000 )} ** ?"
3234 ),
3335 ephemeral = True ,
3436 )
3537 return
3638
3739 # Retrieve donor user
38- await interaction .response .defer ()
40+ await interaction .response .defer (ephemeral = True )
3941 db = self .bot .get_db (interaction .guild )
4042 donor_member = interaction .user
41- donor_actor = db .find_one (Actor , Actor .id == donor_member .id )
43+ donor_actor = db .find_one (
44+ Actor , Actor .id == donor_member .id
45+ ) or self .bot .create_actor (donor_member )
4246 if not donor_actor :
4347 await interaction .followup .send (
4448 embed = EmbedX .error (f"There seems to be a problem from your side." ),
@@ -47,7 +51,9 @@ async def donate(self, interaction: Interaction, member: Member, gold: int):
4751
4852 # Retrieve recipient user
4953 recipient_member = member
50- recipient_actor = db .find_one (Actor , Actor .id == recipient_member .id )
54+ recipient_actor = db .find_one (
55+ Actor , Actor .id == recipient_member .id
56+ ) or self .bot .create_actor (recipient_member )
5157 if not recipient_actor :
5258 await interaction .followup .send (
5359 embed = EmbedX .error (
@@ -67,7 +73,7 @@ async def donate(self, interaction: Interaction, member: Member, gold: int):
6773 if donor_actor .gold < gold :
6874 await interaction .followup .send (
6975 embed = EmbedX .warning (
70- f"You don't have enough to donate **π° { gold } Gold** .\n You have **π° { donor_actor .gold } Gold** ."
76+ f"You don't have enough to donate **π° { gold } ** gold .\n You only have **π° { donor_actor .gold } ** gold ."
7177 )
7278 )
7379 return
@@ -77,20 +83,36 @@ async def donate(self, interaction: Interaction, member: Member, gold: int):
7783 recipient_actor .gold += gold
7884 db .save_all ([donor_actor , recipient_actor ])
7985
80- # Create the response embed
86+ # Send private response
87+ await interaction .followup .send (
88+ embed = EmbedX .success (
89+ f"You transferred **π° { gold } ** gold to { recipient_member .mention } ."
90+ )
91+ )
92+
93+ # Create public response embed
8194 embed = EmbedX .success (
8295 emoji = "π" ,
83- title = "Gold Donation" ,
96+ title = "Donation" ,
8497 description = (
85- f"{ recipient_member .mention } has received **π° { gold } Gold** from { donor_member .mention } ."
98+ f"{ donor_member .mention } has given gold to { recipient_member .mention } ."
8699 ),
87100 )
101+ embed .add_field (
102+ name = f"{ donor_actor .display_name } \n Gold π»" ,
103+ value = f"**π° -{ gold } **" ,
104+ )
105+ embed .add_field (
106+ name = f"{ recipient_member .display_name } \n Gold πΌ" ,
107+ value = f"**π° +{ gold } **" ,
108+ )
88109 embed .set_author (
89110 name = donor_member .display_name , icon_url = donor_member .display_avatar
90111 )
91112 embed .set_thumbnail (url = recipient_member .display_avatar )
92113
93- # Respond
94- await interaction .followup .send (
95- content = f"Congratulations, { recipient_member .mention } ! π" , embed = embed
96- )
114+ # Send public response
115+ if isinstance (interaction .channel , Messageable ):
116+ await interaction .channel .send (
117+ content = f"Congratulations, { recipient_member .mention } ! π" , embed = embed
118+ )
0 commit comments