Python

Как сделать анти спам функцию в discord.py

Допустим я хочу чтобы при 10 сообщениях подряд с интервалом в 1мс, то человек отправлялся в мут (функцию мута уже прописал, мне нужно определение спама, с пояснениями, я новичок в discord.py)
Глеб Зубов
Глеб Зубов
534
С таким интервалом ты точно никого не забанишь. Сообщения от дискорда так быстро не придут. А так - храни для каждого пользователя время последнего отправленного сообщения и количество сообщений подряд. Когда получаешь сообщение, если время - время последнего > лимит, то прибавляешь к количеству 1, иначе обнуляешь количество. Если количество 10, то мутишь.

От Ник НАр наверное попроще для понимания решение
ГА
Гиззат Абаев
34 940
Лучший ответ
В твоем случае ты можешь создать счетчик подсчета числа сообщений от пользователя и переменную для хранения времени отправки первого из 10 сообщений. При получении 10 сообщения проверяешь время его отправки, и если разница между начальным сообщением и этим по времени будет менее, допустим, 5 сек, то пользователя в мут, а счетчик обнуляешь ему.
Для определения спама в Discord.py можно использовать счетчик сообщений пользователя и проверять, превышает ли он определенное значение за определенный период времени. Например, если пользователь отправил 10 сообщений за 5 секунд, это может быть признаком спама.

Вот пример кода, который может помочь вам определить спам-сообщения:


from collections import deque
from datetime import datetime, timedelta
import discord

client = discord.Client()
message_queue = deque(maxlen=10) # очередь последних 10 сообщений

@client.event
async def on_message(message):
# Проверяем, что сообщение не от бота и не команда
if not message.author.bot and not message.content.startswith('!'):
# Добавляем сообщение в очередь
message_queue.append( datetime.now ())

# Проверяем, что в очереди больше 10 сообщений
if len(message_queue) == 10:
# Проверяем, что все сообщения в интервале 1 секунда
time_diff = message_queue[-1] - message_queue[0]
if time_diff <= timedelta(milliseconds=100):
# Пользователь спамит, отправляем в мут
await message.author .add_roles(message.guild.get_role(ROLE_ID_MUTE))
await message.channel.send(f"{ message.author .mention} замьючен за спам сообщений!")

client.run ('YOUR_BOT_TOKEN')

Как вы можете видеть, мы используем очередь message_queue, чтобы хранить временные метки последних 10 сообщений, и проверяем, что время между первым и последним сообщением в очереди меньше или равно 100 миллисекундам. Если это так, то мы отправляем пользователя в мут. Вы можете изменить время интервала и количество сообщений в очереди в соответствии с вашими потребностями.
Виктор Шертух
Виктор Шертух
1 156
Глеб Зубов AttributeError: module 'datetime' has no attribute 'now'
Я что то не так делаю?