Как кикать после определенного количества нарушений discord.js

#discord.js #bots

#discord.js #боты

Вопрос:

Я разрабатываю discord.js бот модерации, и я хочу, чтобы он кикнул кого-нибудь после определенного количества нарушений. Есть ли способ заставить его регистрировать эти нарушения (ругань), а затем кикать через определенное количество раз? Бот уже находит и удаляет ругательства, поэтому я хочу иметь возможность внедрить это в эту систему. Я хочу знать, есть ли способ встроить систему регистрации нарушений непосредственно в систему защиты от ругани. Я не собираюсь вставлять неизмененный код, потому что он защищает от ругани, и ему нужно на чем-то основываться, но я размещу версию с цензурой ниже

 // require the discord.js module
const Discord = require('discord.js');

// create a new Discord client
const client = new Discord.Client();

// when the client is ready, run this code
// this event will only trigger one time after logging in
client.once('ready', () => {
    console.log('Ready!');
});

client.login('TOKEN');

client.on('message', message => {
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }
  if (message.content.includes('bad word')) {
    message.delete();
    message.author.send('Please do not swear on this server.');
  }

});
  

Ответ №1:

Вы должны использовать discord.js Collection , который является:

Карта с дополнительными служебными методами. Это используется повсюду discord.js вместо массивов для всего, что имеет идентификатор, для значительного повышения производительности и простоты использования.

Map Объект содержит пары ключ-значение и запоминает первоначальный порядок вставки ключей. Любое значение может использоваться как ключ, так и значение. Вот краткая демонстрация:

 // let's say we had two people: John and Sarah
const people = new Map();

// each of them were a different age
people.set('John', 25); // in this example, 'John' is the key, and 25 is the value
people.set('Sarah', 19); // in this example, 'Sarah' is the key, and 25 is the value

// each person has an individual age
// you can `get()` the key, and it will return the value
console.log(`Sarah is ${people.get('Sarah')} years old.`);
console.log(`John is ${people.get('John')} years old.`);  

Вы можете использовать этот тип формата для создания коллекции, где каждый ключ представляет собой отдельный идентификатор пользователя, а каждое значение — количество нарушений, которые у них есть. Каждый раз, когда кто-то ругается, увеличивайте количество нарушений на единицу, а затем проверяйте, превышает ли оно заданное число.

Кроме того, вы можете значительно упростить свою текущую систему, поместив каждое плохое слово в массив, а затем повторив ту же функцию через каждый элемент, используя Array.prototype.some()

 // const Discord = require('discord.js');

const infractions = new Discord.Collection();
const words = ["bad word", "bad word", "bad word", "..."];

// since it's the same function, you should only have to write it once
if (words.some((word) => message.content.includes(word))) {
  message.delete();
  message.author.send("Please do not swear on this server.");
  if (!infractions.has(message.author.id))
    // if they don't have any infractions
    infractions.set(message.author.id, 1);
  // create a new element for them with 1 infraction
  // otherwise, increment their existing infractions by 1
  else
    infractions.set(message.author.id, infractions.get(message.author.id)   1);
  // check if it's above the specified number
  if (infractions.get(message.author.id) >= 5) {
    // kick the member, send log messages, etc.
  }
}
  

Комментарии:

1. Это работает, за исключением случаев, когда они совершают такое количество нарушений, это не требует никаких действий. Я установил его для отправки сообщения на данный момент, но он ничего не делает

2. Есть ли способ зарегистрировать, кого выгнали, и отправить его на сервер журналов, используя идентификатор канала?