Обработка одного сообщения двумя обработчиками
Есть бот, который ограничивает возможность писать людям с указанной ролью (накладывает ограничение: не больше 1 сообщения в n секунд). Поскольку ограничение нужно накладывать при любом сообщении, используется эвент on_message.
Бот шикарно работает и справляется со своей задачей, пока не возникает необходимость добавить в него какую-либо команду через client.command, а не client.event:
import discord
from discord.ext import commands
import asyncio
CONTROL_ROLE = 'limited' # название роли, которая не может писать часто
MUTE_ROLE = 'muted' # название роли, которая будет выдаваться для мута
COOLDOWN = 5 # минимальная дистанция между сообщениями в секундах
INVERTED = False # при инверсии CONTROL_ROLE отображает whitelist-роль, которая обходит ограничение. По умолчанию это blacklist-роль
TOKEN = 'TOKEN'
PREFIX = '.'
client = commands.Bot(command_prefix=PREFIX)
@client.event
async def on_message(message=None):
if message is not None:
if (CONTROL_ROLE in (role.name for role in message.author.roles)) != INVERTED:
role = discord.utils.get(message.channel.guild.roles, name=MUTE_ROLE)
await message.author.add_roles(role)
await asyncio.sleep(COOLDOWN)
await message.author.remove_roles(role)
@commands.has_permissions(administrator=True)
@client.command(pass_context=True)
async def clear(ctx, count=20):
await ctx.channel.purge(limit=count)
client.run(TOKEN)
Проблема возникает при вызове .clear. Бот попросту не реагирует на неё, как на команду.
Очевидно, это вызвано тем, что обработку этого сообщения берёт на себя эвент on_message. Можно ли как-то заставить бота после обработки on_message проверить существование команды?
P.s. пробовал убирать декоратор @commands.has_permissions(administrator=True), дело не в нём.
Ответы (1 шт):
Попробуйте добавить await client.process_commands(message) первой строкой в функцию on_message (возможно поможет)