如何在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
相关产品推荐
相关产品推荐

