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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:23:15