如何在Discord.py中让变量仅对特定服务器生效?
解决Discord.py中变量的服务器专属问题
你的问题根源在于使用了全局变量Toggle,所有服务器会共享这个变量的状态,导致不同服务器的操作互相干扰。要实现服务器专属的变量状态,你可以用字典来存储每个服务器的独立状态,键为服务器ID,值为对应的开关状态。
以下是修改后的完整代码:
# 初始化字典,存储各服务器的开关状态,键为服务器ID,值为布尔值 guild_toggles = {} @client.command() async def enable(ctx): await ctx.message.delete() # 用当前服务器ID作为键,设置状态为True guild_toggles[ctx.guild.id] = True embed = discord.Embed(title="Enabled!", color=0x5e0000) embed.set_footer(text="To disable, do !disable.") await ctx.author.send(embed=embed) @client.command() async def disable(ctx): await ctx.message.delete() # 用当前服务器ID作为键,设置状态为False guild_toggles[ctx.guild.id] = False embed = discord.Embed(title="Disabled!", color=0x5e0000) embed.set_footer(text="To enable, do !enable.") await ctx.author.send(embed=embed) @client.command(pass_context=True) async def isenabled(ctx): await ctx.message.delete() # 获取当前服务器的状态,若服务器未初始化状态则默认返回False current_state = guild_toggles.get(ctx.guild.id, False) if current_state: await ctx.send("!enable has been ran!") else: embed = discord.Embed(title="Error: !enable must be ran first.", color=0x5e0000) await ctx.author.send(embed=embed)
关键修改说明:
- 移除全局变量
Toggle,改用guild_toggles字典存储每个服务器的独立状态 - 每个命令中通过
ctx.guild.id定位到当前服务器的状态项,确保操作仅影响当前服务器 - 在
isenabled命令中使用dict.get()方法,处理服务器从未执行过enable/disable的情况,默认返回False
如果需要持久化状态(重启机器人后不丢失),可以把字典数据保存到本地JSON文件或者数据库中,每次启动时加载,状态变更时同步保存。
内容的提问来源于stack exchange,提问作者4m w31rd
相关产品推荐
相关产品推荐

