我正在尝试创建一个能够使用斜线命令的审核机器人,并且我只需要它用于一台服务器。我不明白为什么这些命令根本不同步,但我确实希望它们立即同步。我遇到的另一个问题是清除以前未使用的命令。以某种方式起作用的旧命令仍然存在。
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
,但似乎没有任何效果。
测试您的代码后
?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!')
.