如何使 Discord 应用程序命令在 Discord.py 中立即同步?

问题描述 投票:0回答:1

我正在尝试创建一个能够使用斜线命令的审核机器人,并且我只需要它用于一台服务器。我不明白为什么这些命令根本不同步,但我确实希望它们立即同步。我遇到的另一个问题是清除以前未使用的命令。以某种方式起作用的旧命令仍然存在。

import discord
from discord.ext import commands

class Bot(commands.Bot):
    def __init__(self):
        intents = discord.Intents.default()
        intents.message_content = True
        super().__init__(command_prefix='?', intents=intents)

    async def setup_hook(self):
        await self.tree.sync(guild=discord.Object(id=12345678910)) # I didn't include the id for security reasons.
        print(f"Synced slash commands for {self.user}.")

    async def on_command_error(self, ctx, error):
        await ctx.reply(str(error), ephemeral=True)

bot = Bot()

@bot.hybrid_command(name="test", with_app_command=True, description="Testing")
@commands.guild_only()
@commands.has_permissions(administrator=True)
async def test(ctx: commands.Context):
    await ctx.defer(ephemeral=True)
    await ctx.reply("hi!")

bot_token = 'bot-token-here' # I didn't include the token for security reasons.

bot.run(bot_token)

我尝试更改代码并运行不同的版本。我什至尝试了

@bot.command
,但似乎没有任何效果。

python discord discord.py synchronization
1个回答
0
投票

测试和修复


测试您的代码后

?test
可以工作,并且全局同步也可以工作,但是,正如您所描述的,如果您针对特定公会,则应用程序命令不会在不和谐时更新。

以下是修复:

guild = await bot.fetch_guild(GUILD_ID)
bot.tree.copy_global_to(guild=guild)
await self.tree.sync(guild=guild)
print(f"Synced slash commands for {self.user}.")

因此,您使用 guild_ID 获取公会,而不是使用

discord.Object
,然后将所有全局命令推送到特定公会。
bot.tree.copy_global_to(...)
的文档可在 here 找到。 最后,您将树同步到特定的公会,将其作为参数传入
self.tree.sync

同步命令


我建议创建一个只有您可以执行的命令来同步您的命令 - 为了避免速率受到限制,您也只需要在创建或删除应用程序命令时进行同步。

# an example of a global sync command
@bot.tree.command(name='sync', description='Owner only')
async def sync(interaction: discord.Interaction):
    if str(interaction.user.id) == YOUR_ID:
        await client.tree.sync()
        await interaction.response.send_message('Synced Successfully')
    else:
        await interaction.response.send_message('You must be the owner to use this command!')

.

© www.soinside.com 2019 - 2024. All rights reserved.