Discord.py机器人credit命令计算5%转账手续费不生效问题咨询
代码调整方案
之前尝试在f-string占位符中写{Reason*5%}无法生效,核心原因有三个:
- 原代码中
Reason是默认接收字符串的参数,Python无法直接对字符串执行数学运算 5%不是Python合法的内联运算语法,Python没有内置的百分比运算符,需要手动将5%转换为0.05的小数比例完成乘法计算- 原代码存在逻辑错位:用来接收转账金额的参数被命名为
Reason,导致后续给接收人发的回执里固定写"Reason: No reason provided",和实际的转账功能完全不匹配
分步调整逻辑
- 修正参数定义:将原来存转账金额的
Reason参数重命名为amount,加上discord.py的类型标注amount: int,让机器人自动把用户输入的数字转为整数类型,从根源避免字符串运算报错。 - 提前完成数值计算:在发送提示消息前,提前计算好手续费金额,比如
transfer_fee = round(amount * 0.05, 2),对计算结果保留两位小数,适配货币的计数规则。 - 替换消息占位符:把原来所有f-string里硬编码
Reason当金额展示的位置,替换为提前算好的手续费、实际转账金额变量,不要在占位符里直接写未做类型转换的运算逻辑。 - 补全安全校验:原代码的消息检查函数只判断了消息内容是确认码,没有限定输入消息的人必须是指令发起者,很容易被其他用户输入确认码触发转账,调整时补上身份判断堵上漏洞。
调整后的完整代码
@client.command() async def credit(ctx, member: discord.Member, amount: int): # 计算5%比例的转账手续费,保留两位小数 transfer_fee = round(amount * 0.05, 2) # 校验转账金额合法性 if amount <= 0: await ctx.send("转账金额必须为大于0的正数值") return # 分别展示手续费与实际转账金额的提示 await ctx.send( f'**{ctx.author.name}, 本次转账手续费: ${transfer_fee}, 转出金额: ${amount}, 请输入确认码完成转账:**' ) await ctx.send('https://cdn.discordapp.com/attachments/783308936622112789/820678247984398386/unknown.png') # 确认逻辑:仅接收指令发起者发送的正确确认码 def check(m): return m.content == '81592' and m.author == ctx.author await client.wait_for('message', check=check) # 给转账接收人发送回执 await member.send( f':atm: | Transfer Receipt\n```You have received ${amount} from user {ctx.author.name}, (ID: {ctx.author.id})\n本次转账累计产生手续费: ${transfer_fee}```' ) # 清理频道内的指令相关消息 await ctx.channel.purge(limit=3) # 公屏播报最终转账结果 await ctx.send(f':moneybag: **| {ctx.author.name}, 已完成向 {member.mention} 的转账,本次账户累计扣取 ${amount + transfer_fee}**')
内容的提问来源于stack exchange,提问作者OtakuXD
相关产品推荐
相关产品推荐

