То, что вы делаете прямо сейчас, - это , требующий от гильдии аргумента вашей команды , поэтому бот на самом деле ищет сообщение
close_all <guild>
guild: discord.Guild
- это конвертер для гильдии, поэтому он должен каким-то образом преобразовать строку в объект гильдии. Поскольку это на самом деле невозможно, ваша команда не будет работать.
Простое решение: Просто всегда используйте гильдию, в которую было отправлено сообщение
@bot.command()
async def close_all(ctx):
for chan in ctx.guild.channels:
await guild.channels.set_permissions(ctx.guild.default_role, send_messages=False)
Более гибкое решение: В функцию передается дополнительный аргумент, который является идентификатором гильдии, в которой должна быть выполнена команда
@bot.command()
async def close_all(ctx, guild_id: int):
# finding the guild according to the id passed
guild = discord.utils.find(lambda g: g.id == guild_id, ctx.bot.guilds)
for chan in guild.channels:
await guild.channels.set_permissions(ctx.guild.default_role, send_messages=False)