You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Discord.py中获取用户输入存储为变量以计算游戏总积分

解决方案

你可以使用discord.py内置的bot.wait_for()方法监听用户的消息回复,通过自定义校验规则确保只捕获触发命令的用户在当前频道的回复,实现你要的分步收集输入的效果。

另外先修正你原有代码的两个显性问题:

  • 积分计算逻辑里第一名的赋值写错了变量名tlace,实际应该是tplace,否则第一名的积分会计算错误
  • 原有启动逻辑重复调用了bot.run(),额外加的多线程事件循环写法完全没必要,保持常规启动逻辑即可,keep_alive()放在bot.run()之前调用就行。

修改后的完整可用代码如下:

from discord import channel
from discord.embeds import Embed
import discord
from discord.ext import commands
import os
from dotenv import load_dotenv
import asyncio
from keep_alive import keep_alive

load_dotenv()
# 开启消息内容意图,否则无法读取普通消息内容
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix = '.', intents=intents)

@bot.event
async def on_ready():
    print('Bot is up and running')

@bot.command()
async def p(ctx):
    # 校验规则:只接收触发命令的用户在当前频道发的消息
    def check(msg):
        return msg.author == ctx.author and msg.channel == ctx.channel
    
    # 收集名次输入
    embed=discord.Embed()
    embed.add_field(name="Where did you place?", value="** **")
    await ctx.send(embed=embed)
    try:
        # 最多等30秒回复
        place_msg = await bot.wait_for('message', check=check, timeout=30)
        place = int(place_msg.content)
        # 名次超出范围归0
        if place >20 or place <1:
            place = 0
    except asyncio.TimeoutError:
        await ctx.send("输入超时,命令已终止")
        return
    except ValueError:
        await ctx.send("请输入合法的数字名次,命令已终止")
        return
    
    # 收集击杀数输入
    embed=discord.Embed()
    embed.add_field(name="How many kills did you get?", value="** **")
    await ctx.send(embed=embed)
    try:
        kills_msg = await bot.wait_for('message', check=check, timeout=30)
        kills = int(kills_msg.content)
    except asyncio.TimeoutError:
        await ctx.send("输入超时,命令已终止")
        return
    except ValueError:
        await ctx.send("请输入合法的数字击杀数,命令已终止")
        return

    # 积分计算逻辑
    tplace = 0
    # 名次对应积分配置
    top20 = (18,19,20)      #Top 20
    top17 = (16,17)         #Top 17
    top15 = (13,14,15)      #Top 15
    top12 = (11,12)         #Top 12
    top10 = (6,7,8,9,10)    #Top 10

    # 击杀分计算
    kills = kills * 10
    
    # 名次分计算
    if place in top20:
        tplace = 10
    if place in top17:
        tplace = 20
    if place in top15:
        tplace = 35
    if place in top12:
        tplace = 50
    if place in top10:
        tplace = 60
    if place == 5:
        tplace = 80
    if place == 4:
        tplace = 90
    if place == 3:
        tplace = 100
    if place == 2:
        tplace = 125    
    if place == 1:
        tplace = 175

    total = kills + tplace

    # 发送结果
    embed=discord.Embed()
    embed.add_field(name="Total Points:", value=total)
    await ctx.send(embed=embed)

keep_alive()
# 这里填你的bot token,也可以从dotenv里读取更安全
bot.run("OTA0MDc5MzY5NzU1MDU4MjA2.YX2Thg.S4A2e9SqZUvYZpyTzBW44W4Vumk")

注意事项

你需要到Discord开发者后台的Bot设置页,开启Message Content Intent权限,否则bot无法读取用户发送的普通消息内容,wait_for会收不到回复。

内容的提问来源于stack exchange,提问作者Spedungis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:06:03