@SasukeUchiha

Как сделать мут после определенного количества предупреждений?

Я пишу своего дискорд бота на JavaScript
Я сделал блокировку ссылок, т.е. когда участник отправляет любую ссылку бот удаляет ее и пишет о том что ссылки запрещены
Как можно сделать так чтобы после предупреждения за повторную отправку ссылки участник получал мут, а на 3 раз получал бан?

Вот код:
const client = require('../index')
const { MessageEmbed } = require('discord.js')

function is_url(str) {
  let regexp = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/;
  if(regexp.test(str)) {
    return true;
  } else {
    return false;
  }
}

client.on('message', async (message) => {

  if (!message.member.permissions.has('ADMINISTRATOR')) {
  
   if(is_url(message.content) === true) {
    message.delete()

  const embed = new MessageEmbed()
  .setTitle('Обнаружена ссылка!')
  .setDescription(`Ссылки на нашем сервере запрещены\nНе присылай их больше пожалуйста, это наказуемо.`)
  .setThumbnail(message.author.avatarURL())
  .setTimestamp()
  .setColor('RED')
  .setFooter('Ознакомьтесь с правилами')
     
    message.channel.send({ content: `<@${message.author.id}>`, embeds: [embed]})
   }
  }

})


Заранее спасибо
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
Alexandre888
@Alexandre888 Куратор тега discord.js
Javascript-разработчик
для такого функционала используется база данных.
при обнаружении ссылки, в БД записывается:
  1. ID сервера, на котором пользователь отправил ссылку
  2. ID пользователя
  3. кол-во предупреждений у пользователя (если это его первое нарушение - 1, если повторное - текущее кол-во предупреждений + 1

далее, делается запрос к БД и полученные данные сверяются.

если же вы на данном этапе не готовы её использовать, можно всё это делать записывая данные, например, в коллекцию:
function is_url(str) {
  let regexp = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/;
  if(regexp.test(str)) {
    return true;
  } else {
    return false;
  }
}

let warns = new Map();

client.on('messageCreate', async message => {
	if (is_url(message.content) === true) {
		const embed = new MessageEmbed()
			.setTitle('Обнаружена ссылка!')
			.setDescription(`Ссылки на нашем сервере запрещены\nНе присылай их больше пожалуйста, это наказуемо.`)
			.setThumbnail(message.author.avatarURL())
			.setTimestamp()
			.setColor('RED')
			.setFooter('Ознакомьтесь с правилами')

		if (!warns.has(message.author.id)) {
			warns.set(message.author.id, 1);
			message.channel.send({ content: `<@${message.author.id}>`, embeds: [embed] })
		} else {
			warns.set(message.author.id, warns.get(message.author.id) + 1);

			if (warns.get(message.author.id) === 2) {
				return функция_мута();
			} else if (warns.get(message.author.id) >= 3) {
				warns.delete(message.author.id);
				return функция_бана();
			}
		}
	}
});

учтите, что для подобного варианта нужно обеспечивать бесперебойную работу бота, т.к после его остановки содержимое коллекции очистится.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы