Как исключить роль в discord.py - PullRequest
0 голосов
/ 09 февраля 2019

Итак, у меня есть команда Emergency, если есть что-то, и я должен DM каждый, но есть проблема с ботами, так как DMing их вызывает ошибку (роль ботов "BOTS")

@bot.command(pass_context=True)
async def emergency(ctx, *, message: str):
    if admin in [role.id for role in ctx.message.author.roles]:
        for server_member in ctx.message.server.members:
            await bot.send_message(server_member, message)
    else:
        await bot.say("DENIED, You do not have permission to use this command")

и Ошибка

Traceback (most recent call last):
  File "C:\Users\adamk\PycharmProjects\bot\venv\lib\site-packages\discord\ext\commands\bot.py", line 846, in process_commands
    yield from command.invoke(ctx)
  File "C:\Users\adamk\PycharmProjects\bot\venv\lib\site-packages\discord\ext\commands\core.py", line 374, in invoke
    yield from injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\adamk\PycharmProjects\bot\venv\lib\site-packages\discord\ext\commands\core.py", line 54, in wrapped
    raise CommandInvokeError(e) from e
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: Forbidden: FORBIDDEN (status code: 403): Cannot send messages to this user

1 Ответ

0 голосов
/ 09 февраля 2019

Есть и другие обстоятельства, при которых вы получите это сообщение (вы были заблокированы, у пользователя полностью отключены DM и т. Д.), Поэтому имеет смысл просто перехватить ошибку и продолжать каждый раз, когда она происходит.

@bot.command(pass_context=True)
async def emergency(ctx, *, message: str):
    if admin in [role.id for role in ctx.message.author.roles]:
        for server_member in ctx.message.server.members:
            try:
                await bot.send_message(server_member, message)
            except discord.Forbidden:
                pass
    else:
        await bot.say("DENIED, You do not have permission to use this command")

Если вы также хотите проверить роль, вы можете сделать это с помощью discord.utils.get

if get(server_member.roles, name="BOTS"):
    # has role
else:
    # does not have role
...