You need to enable JavaScript to run this app. Discord.py机器人credit命令计算5%转账手续费不生效问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py机器人credit命令计算5%转账手续费不生效问题咨询

代码调整方案

之前尝试在f-string占位符中写{Reason*5%}无法生效,核心原因有三个:

  • 原代码中Reason是默认接收字符串的参数,Python无法直接对字符串执行数学运算
  • 5%不是Python合法的内联运算语法,Python没有内置的百分比运算符,需要手动将5%转换为0.05的小数比例完成乘法计算
  • 原代码存在逻辑错位:用来接收转账金额的参数被命名为Reason,导致后续给接收人发的回执里固定写"Reason: No reason provided",和实际的转账功能完全不匹配
分步调整逻辑
  1. 修正参数定义:将原来存转账金额的Reason参数重命名为amount,加上discord.py的类型标注amount: int,让机器人自动把用户输入的数字转为整数类型,从根源避免字符串运算报错。
  2. 提前完成数值计算:在发送提示消息前,提前计算好手续费金额,比如transfer_fee = round(amount * 0.05, 2),对计算结果保留两位小数,适配货币的计数规则。
  3. 替换消息占位符:把原来所有f-string里硬编码Reason当金额展示的位置,替换为提前算好的手续费、实际转账金额变量,不要在占位符里直接写未做类型转换的运算逻辑。
  4. 补全安全校验:原代码的消息检查函数只判断了消息内容是确认码,没有限定输入消息的人必须是指令发起者,很容易被其他用户输入确认码触发转账,调整时补上身份判断堵上漏洞。
调整后的完整代码
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 09:15:05