Как изменить разрешения всех каналов гильдии с discord.py ?

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

Я хочу изменить разрешения всех каналов сервера с Read messages = True на False. В принципе, я не хочу, чтобы пользователи с ролью по умолчанию могли видеть какой-либо канал. Что я написал:

 @bot.command()
async def maintainance(ctx):
    channel = ctx.guild.channels
    perms = channel.overwrites_for(ctx.guild.default_role)
    perms.read_messages=False
    for channel in ctx.guild.channels:
        await channel.set_permissions(ctx.guild.default_role, overwrite=perms)
        await ctx.message.add_reaction(emoji="<a:tick:748476262640779276>")
  

ошибка, которую я получаю:

 Ignoring exception in command maintainance:
Traceback (most recent call last):
  File "C:UsersRohitAppDataRoamingPythonPython37site-packagesdiscordextcommandscore.py", line 83, in wrapped
    ret = await coro(*args, **kwargs)
  File "c:UsersRohitDesktopdiscord botstutorial botbot.py", line 23, in maintainance
    perms = channel.overwrites_for(ctx.guild.default_role)
AttributeError: 'list' object has no attribute 'overwrites_for'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:UsersRohitAppDataRoamingPythonPython37site-packagesdiscordextcommandsbot.py", line 892, in invoke
    await ctx.command.invoke(ctx)
  File "C:UsersRohitAppDataRoamingPythonPython37site-packagesdiscordextcommandscore.py", line 797, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:UsersRohitAppDataRoamingPythonPython37site-packagesdiscordextcommandscore.py", line 92, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'list' object has no attribute 'overwrites_for'
  

Я не знаю, что я сделал не так.

Ответ №1:

Перезаписи выполняются для каждого канала, поэтому вам нужно выполнить get_overwrites внутри цикла for, некоторый псевдокод будет выглядеть так

 for every channel:
    overwrites = get_overwrites()
    overwrites.send_message = False
    channel.set_permissions(default_role, overwrites=overwrites)
  

Другое дело, что вы должны делать ctx.message.add_reaction() вне цикла, чтобы избежать попыток добавить одну и ту же реакцию несколько раз