客户端检查所有前缀是否正确存储在JSON文件中。不和谐 答复(更新)

客户端检查所有前缀是否正确存储在JSON文件中。不和谐 答复(更新),json,python-3.x,discord.py,Json,Python 3.x,Discord.py,新的更新人员,我选择删除它,因为我读到这段代码,基本上我创建的整个东西,不够好,如果机器人变得更大,它会导致问题,因为它会使.JSON文件过载。所以我这样做了: 主文件: def get_prefix(client, message): with open('prefixes.json', 'r') as file: prefixes = json.load(file) if str(message.guild.id) in prefixes:

新的更新人员,我选择删除它,因为我读到这段代码,基本上我创建的整个东西,不够好,如果机器人变得更大,它会导致问题,因为它会使
.JSON
文件过载。所以我这样做了:

主文件:

def get_prefix(client, message):
    with open('prefixes.json', 'r') as file:
        prefixes = json.load(file)

    if str(message.guild.id) in prefixes:
        return prefixes[str(message.guild.id)]

    else:
        return "/"

client = commands.Bot(command_prefix = get_prefix)

前缀文件:(在齿轮内)

因此,在此“更新”之前,bot只需将默认前缀加载到
.JSON
文件中。现在我所做的是,
Get\u前缀
将检查帮会的ID是否在
.JSON
文件中,如果在任何情况下不在其中,它将使用
/
作为默认前缀。这将有所帮助,因为代码不必将每个服务器都存储到
.JSON
文件中,如果bot有机会变得更大、更知名,这将在将来导致问题

因此,在前缀文件中(也可以在主文件中使用,但您必须删除我使用的
Self
),我删除了机器人必须将前缀添加到
.JSON
文件中的代码,并且我只允许删除
.JSON
文件中的公会自定义前缀的部分。差不多就这样了,如果你还有任何问题,我可以帮你回答,就在这个问题上发表评论吧


问题: 我正在为我的机器人遇到的一个大问题努力寻找解决方案。基本上,我使用的是每服务器前缀
代码,这是我在互联网上作为教程找到的。这是一个非常基本的代码,我相信有比这个更高级的代码,但这不是目前的重点。在开始我的问题之前,我想向您解释一下我的代码是如何工作的,基本上只要客户机加入一个新服务器,它就会将它的ID保存在一个JSON文件中,并给它一个默认前缀

导入不一致
导入json
导入异步
导入操作系统
从discord.ext导入命令
类前缀(commands.Cog):
定义初始化(自我,客户机):
self.client=client
@commands.Cog.listener()
加入工会时的异步定义(自我、工会):
以open('prefixes.json','r')作为f:
前缀=json.load(f)
前缀[str(guild.id)]='/'
将open('prefixes.json','w')作为f:
dump(前缀,f,缩进=4)
@commands.Cog.listener()
帮会上的异步定义删除(自身、帮会):
以open('prefixes.json','r')作为f:
前缀=json.load(f)
前缀.pop(str(guild.id))
将open('prefixes.json','w')作为f:
dump(前缀,f,缩进=4)
然后,如果希望将前缀更改为其他内容,可以使用命令
/prefix
,它将更改为新前缀,而客户端将在JSON文件中保存新前缀

    @commands.command()
    @commands.has_permissions(manage_roles=True, ban_members=True)
    async def prefix(self, ctx, prefix=None):

        if prefix == None:

            try:
                x = ""
                pfp = self.client.user.avatar_url
                prefix = discord.Embed(title=x, description=f"My prefix for **{ctx.guild.name}** is `{ctx.prefix}`. If you want to find out more information about me type `{ctx.prefix}help`.", color = 0x456383)
                prefix.set_footer(text=f"ChizLanks", icon_url=pfp)
                await ctx.channel.send(embed = prefix)
                return

            except discord.Forbidden:
                return await ctx.channel.send(f"My prefix for **{ctx.guild.name}** is `{ctx.prefix}`. If you want to find out more information about me type `{ctx.prefix}help`")
                
        else:
            with open('prefixes.json', 'r') as f:
                prefixes = json.load(f)

            prefixes[str(ctx.guild.id)] = prefix

            with open('prefixes.json', 'w') as f:
                json.dump(prefixes, f, indent=4)

            await ctx.channel.send(f'Server Prefix has changed to `{prefix}`')
这几乎就是代码,我也为命令使用了一些错误,但目前不需要。我的问题是,如果客户端脱机,代码基本上没有运行,这意味着如果bot被邀请到新服务器,客户端将无法将前缀保存到JSON文件,这将给服务器带来问题,因为当客户端重新联机时,它将没有任何前缀,这意味着他们将无法使用任何命令


现在该怎么解决呢?我已经知道它将如何工作。我可能需要在_ready
事件上使用
,该事件将搜索客户端加入的服务器是否在JSON文件中,它将使用它们,否则它将创建一个新前缀(默认前缀),并将其保存到JSON文件中。这是我的想法,但我需要一些帮助,因为我不知道这是否可能。这是如何工作的?

如果找不到服务器的前缀,您可以添加机器人可以识别的默认前缀。这样,当第一个命令在服务器中发送时,bot可以识别它,即使它没有添加到前缀文件中。然后,当它运行该默认前缀时,服务器就可以在JSON文件中注册,从那里一切都将正常。

使用该命令后,它将如何存储到JSON文件中?我的意思是,我学会它的唯一方法就是加入工会。如果你能向我解释一下这是怎么回事,我会非常感激的!我相信您可以通过在bot开始运行时运行以下命令来设置前缀:bot=commands.bot(command_prefix=“/”),然后,您可以使用@bot.commands()来运行您的方法,而不是在方法之前使用@commands.commands()。这将允许您立即说出类似/prefix的内容,即使您没有在JSON文件中注册它。我已经写了,但是我删除了,因为你编辑了你的答案。基本上,这将破坏我的前缀系统,因为我已经通过以下代码使用它:
client=commands.Bot(command\u prefix=get\u prefix)
。这基本上是从.JSON文件中获取前缀。这里的问题是,如果我把你告诉我的代码放进去,机器人会把它作为前缀,而不是JSON文件中的前缀。这意味着每服务器前缀
系统根本无法工作。即使放置2个前缀,您所说的
/
get_prefix
机器人也将有2个前缀,这将是另一个问题。一个潜在的解决方法是在您收到消息时检查消息的公会ID是否在您的数据库中。您可以使用
@bot.listen('on_message')异步定义确保\u guild_前缀(message):
用于此,并执行
message.guild.id
以获取公会id。如果它不在前缀数据库中,您可以将其添加到此处。这可能不是最有效的解决方案,但可能会完成任务。我花了一段时间才把它做好,但实际上我用正确的方式编写了命令。我还将使用edi
    @commands.command()
    @commands.has_permissions(manage_roles=True, ban_members=True)
    async def prefix(self, ctx, prefix=None):

        if prefix == None:

            try:
                x = ""
                pfp = self.client.user.avatar_url
                prefix = discord.Embed(title=x, description=f"My prefix for **{ctx.guild.name}** is `{ctx.prefix}`. If you want to find out more information about me type `{ctx.prefix}help`.", color = 0x456383)
                prefix.set_footer(text=f"ChizLanks", icon_url=pfp)
                await ctx.channel.send(embed = prefix)
                return

            except discord.Forbidden:
                return await ctx.channel.send(f"My prefix for **{ctx.guild.name}** is `{ctx.prefix}`. If you want to find out more information about me type `{ctx.prefix}help`")
                
        else:
            with open('prefixes.json', 'r') as f:
                prefixes = json.load(f)

            prefixes[str(ctx.guild.id)] = prefix

            with open('prefixes.json', 'w') as f:
                json.dump(prefixes, f, indent=4)

            await ctx.channel.send(f'Server Prefix has changed to `{prefix}`')