• Как сделать рассылку сообщения сразу во все каналы?

    Vindicar
    @Vindicar
    RTFM!
    Как-то так. Никаких гарантий, что дискорд не пошлёт твоего бота далеко и надолго за спам.
    @client.command()
    async def test(ctx):
        await ctx.author.send(f'test')
        # сохраняем набор и порядок каналов на случай, если он поменяется в процессе отправки.
        channels = list(ctx.guild.text_channels)
        # формируем пачку корутин, выполняющих отправку
        send_coroutines = [channel.send('test') for channel in channels]
        # планируем одновременное выполнение этих корутин и ждём завершения. 
        # Исключения будут возвращены наравне с результатами, а не выброшены.
        results = await asyncio.gather(*send_coroutines, return_exceptions=True)
        # анализируем results на предмет ошибок. 
        # Успешная отправка вернёт объект сообщения, неудачная вернет (а не выбросит!) объект исключения.
        failed = [ (ch.name, str(res)) for res, ch in zip(results, channels) if isinstance(res, (Exception, asyncio.CancelledError)) ]
        if failed: # были ошибки?
            await ctx.author.send('Failed to send to the following channels:\n' + '\n'.join(f'- {ch}: {msg}' for ch, msg in failed))
        else: # ошибок не было
            await ctx.author.send('Message has been spammed successfully.')
    Ответ написан
    Комментировать