discord.py多文件架构下服务器ID已存储但!눈뽕命令未正确设置nun=True的问题求助
discord.py多文件架构下服务器ID已存储但!눈뽕命令未正确设置nun=True的问题求助
看起来你的问题主要出在全局变量作用域处理和初始化数据加载这两个核心点上,我帮你拆解问题并给出具体修复方案:
问题排查
1. DB.py中全局变量loadtruesever未被正确更新
你在on和off函数里直接写loadtruesever = json.load(f)时,Python会默认创建一个局部变量,而非修改全局的loadtruesever。全局变量在函数内修改必须用global声明,否则外部的loadtruesever会一直是空列表,导致服务器ID检查失效。
2. 机器人启动时未加载JSON中的已有数据
你的discord_py_bot.py启动时没有从JSON文件读取已存储的服务器ID,导致loadtruesever始终为空,哪怕JSON里有数据也无法生效。
3. enter变量未重置导致后续命令跳过检查逻辑
第一次执行!눈뽕后enter被设为True,后续命令会直接跳过服务器状态检查,一直沿用第一次的nun值,这显然不符合需求。
修复方案
第一步:修复DB.py的全局变量作用域与初始化逻辑
修改DB.py,确保全局变量被正确更新,并且启动时自动加载JSON数据:
truesever = [] import json # 初始化时从JSON加载已有数据,不存在则创建空列表 loadtruesever = [] try: with open('databa.json', 'r') as f: loadtruesever = json.load(f) truesever = loadtruesever.copy() # 同步到内存变量 except FileNotFoundError: truesever = [] loadtruesever = [] def on(a): global loadtruesever, truesever if a not in truesever: truesever.append(a) with open('databa.json', 'w') as f: json.dump(truesever, f) loadtruesever = truesever.copy() # 更新全局变量 print(loadtruesever) def off(a): global loadtruesever, truesever try: amogus = truesever.index(a) del truesever[amogus] with open('databa.json', 'w') as f: json.dump(truesever, f) loadtruesever = truesever.copy() # 更新全局变量 print(loadtruesever) except ValueError: print("이미 꺼저 있잖아") loadtruesever = truesever.copy() # 确保变量同步
第二步:修复discord_py_bot.py的逻辑与加载问题
修改机器人代码,确保启动时加载数据,重置enter状态,并且替换阻塞线程的time.sleep:
import discord import asyncio from DB import loadtruesever, on, off # 初始化全局变量 nun = False enter = False @bot.command() async def 눈뽕(ctx): global nun, enter # 每次执行命令重置enter,保证每次都检查服务器状态 enter = False print(ctx.guild.id) if not enter: sever = ctx.guild.id # 现在loadtruesever是从JSON加载的正确数据 if sever in loadtruesever: nun = True print("nun = true") msg = await ctx.send('https://media.discordapp.net/attachments/1194102643665158187/1198481161593298984/11cd7e6d772cfb2c.gif?ex=65d1848f&is=65bf0f8f&hm=14a06d28529cdd7c710f07bfe7e833e00be0a33f206fc6dbaa8c67275b6831d1&\n 이 메세지는 3초후 삭제 돼요!') await asyncio.sleep(3) # 用asyncio.sleep替代time.sleep,避免阻塞机器人 await msg.delete() else: nun = False print("nun = False") await ctx.send("이 서버는 눈뽕 기능이 꺼저 있습니다!") enter = True else: if nun: msg = await ctx.send('https://media.discordapp.net/attachments/1194102643665158187/1198481161593298984/11cd7e6d772cfb2c.gif?ex=65d1848f&is=65bf0f8f&hm=14a06d28529cdd7c710f07bfe7e833e00be0a33f206fc6dbaa8c67275b6831d1&\n 이 메세지는 3초후 삭제 돼요!') await asyncio.sleep(3) await msg.delete() elif not nun: await ctx.send("이 서버는 눈뽕 기능이 꺼저 있습니다!") @bot.command() async def 눈뽕설정(ctx , * , a: str): global nun if a is None: pass elif a == "on": nun = True on(ctx.guild.id) await ctx.send(embed=discord.Embed(title="눈뽕 명령어가 켜젔습니다!", description="다시 끄려면 !눈뽕설정 off 를 입력 해주세요!", colour=discord.Colour.blue())) elif a == "off": nun = False off(ctx.guild.id) await ctx.send(embed=discord.Embed(title="눈뽕 명령어가 꺼젔습니다!", description="다시 켜려면 !눈뽕설정 on 를 입력 해주세요!", colour=discord.Colour.blue()))
这样修改后,机器人启动时会自动加载JSON中的服务器ID,loadtruesever会被正确更新,每次执行!눈뽕时都会重新检查服务器状态,就能正确设置nun=True了。
备注:内容来源于stack exchange,提问作者최승리
相关产品推荐
相关产品推荐

