答案(已更新)
新的更新家伙,我选择删除这个,因为我读到这段代码,基本上这整个事情我已经创建,是不够好,如果机器人会变得更大,它会导致问题,因为它会超载.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)
前缀File: (INSIDE A COG)
@commands.Cog.listener()
async def on_guild_remove(self, guild):
with open('prefixes.json', 'r') as f:
prefixes = json.load(f)
prefixes.pop(str(guild.id))
with open('prefixes.json', 'w') as f:
json.dump(prefixes, f, indent=4)
在这个"Update"bot只会将默认前缀加载到.JSON
文件。现在我所做的是Get_Prefix
将检查公会的ID是否在.JSON
文件上,如果在任何情况下都不在那里,它将使用/
作为默认前缀。这将有所帮助,因为代码不必将每个服务器存储到.JSON
文件中,如果机器人有机会变得更大,更知名,将来会导致问题。
然后在前缀文件(也可以在你的主文件中使用,但你必须删除我使用的Self
)。我删除了代码,bot将不得不添加前缀到.JSON
文件,我只让部分,将删除公会的自定义前缀,如果它是在.JSON
文件。差不多就是这样了,如果你有任何问题,我可以帮助你,只要在这个问题上发表评论!
我正在努力寻找解决我与我的机器人的一个大问题的方法。基本上我使用的是per-server-prefix
代码,这是我在互联网上找到的教程。这是一个非常基本的代码,我相信还有比这个更高级的代码,但这不是目前的重点。在我开始我的问题之前,我想向你解释我的代码是如何工作的,基本上每当客户端加入一个新的服务器,它会保存它的ID在一个JSON文件,它会给它一个默认前缀。
import discord
import json
import asyncio
import os
from discord.ext import commands
class Prefixes(commands.Cog):
def __init__(self, client):
self.client = client
@commands.Cog.listener()
async def on_guild_join(self, guild):
with open('prefixes.json', 'r') as f:
prefixes = json.load(f)
prefixes[str(guild.id)] = '/'
with open('prefixes.json', 'w') as f:
json.dump(prefixes, f, indent=4)
@commands.Cog.listener()
async def on_guild_remove(self, guild):
with open('prefixes.json', 'r') as f:
prefixes = json.load(f)
prefixes.pop(str(guild.id))
with open('prefixes.json', 'w') as f:
json.dump(prefixes, f, indent=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}`')
这就是代码,我还使用了一些命令错误,但目前不需要。我的问题是,如果客户端离线代码基本上不运行,这意味着如果机器人被邀请到一个新的服务器,客户端将无法保存JSON文件的前缀,这将导致问题的服务器,因为当客户端将回到在线,它将没有任何前缀,这意味着他们将无法使用任何命令。
现在如何解决这个问题?我已经知道它的工作原理了。我可能需要使用on_ready
事件,该事件将搜索客户端是否已加入的服务器在JSON文件中,它将使用它们,否则它将创建一个新的前缀(默认的),并将其保存到JSON文件。这是我的想法,但我需要一些帮助,因为我不知道这是可能的。这是如何工作的呢?
如果没有为服务器找到前缀,您可以添加一个bot可以识别的默认前缀。这样,当第一个命令在服务器中发送时,bot可以识别它,即使它没有添加到前缀文件中。然后,当它运行默认前缀时,服务器可以在JSON文件中注册,从那里一切都会正常。