提到机器人时如何获取服务器的前缀?不和谐.py

时间:2021-02-16 20:41:12

标签: python discord discord.py

我想做什么:我有一个与此类似的自定义前缀系统:discord.py prefix command 这是我的机器人被提及时的事件:

@client.event
async def on_message(message):
  if client.user.mentioned_in(message):

    embed=discord.Embed(title=f"Hello! my prefix is `{prefix}`")
   
    await message.channel.send(embed=embed)

  await client.process_commands(message)

所以我希望我的机器人使用该服务器的前缀进行响应。

我的问题:我不知道如何读取 json 文件并获取前缀。

1 个答案:

答案 0 :(得分:1)

要向您的机器人添加自定义前缀,您可以将前缀数据存储在 JSON 文件中。您应该创建一个名为 prefixes.json 的文件和 3 个命令/事件:一个在机器人加入服务器时设置默认前缀的事件,一个从 prefixes.json 文件中删除前缀信息的事件,以及一个用于更改机器人前缀的命令。

这里是你如何编写第一个事件:当机器人加入公会时定义默认前缀的事件:

@client.event
async def on_guild_join(guild):
    with open('prefixes.json', 'r') as f:
        prefixes = json.load(f)
    prefixes[str(guild.id)] = 'GG'

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

这是一种您可以编写事件以在从服务器中删除机器人时删除 JSON 文件中的前缀数据的方法:

@client.event
async def on_guild_remove(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)

最后,这里是您如何定义更改机器人前缀的函数。该命令将命名为 changeprefix,您可以通过键入 [prefix]changeprefix(将 [prefix] 替换为您的机器人前缀)来使用它。 :

async def changeprefix(ctx, prefix):
    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)

您还需要一个命令来查找与您的机器人所在的公会相对应的前缀。这是一个简单的函数,您可以像这样定义:

def get_prefix(client=None, message=None):
    with open('prefixes.json', 'r') as f:
        prefixes = json.load(f)
    try:
        prefix = str(message.guild.id)
        return prefixes[prefix]
    except AttributeError:
        return ['defaultPrefix']

现在,最后一步是将这四个命令集成到您定义的机器人变量中以运行其他命令。以下是您应该如何更改 prefix 语句:

client = commands.Bot(command_prefix=get_prefix)