Untitled

mail@pastecode.io avatar
unknown
javascript
7 months ago
5.0 kB
3
Indexable
Never
// Function to remove duplicate and spam messages in a chat
function removeDuplicateAndSpamMessages() {
  // Get the messages container element
  const messagesContainer = document.getElementById('chat-content');

  // Get all the chat message elements from the messages container
  const chatMessages = messagesContainer.querySelectorAll('.messages-content div p');

  // Create an object to store messages for each username
  const usernameMessages = {};

  // Constant for minimum matching words threshold
  const minMatchingWords = 3;

  // Function to check if a message is spam
  function isSpam(messageText, otherMessages) {
    const words = messageText.toLowerCase().split(/\s+/);

    // Check if the number of matching words with other messages is greater than the threshold
    const matchingMessages = otherMessages.filter((otherMessage) => {
      const otherWords = otherMessage.toLowerCase().split(/\s+/);
      const commonWords = words.filter((word) => otherWords.includes(word));
      return commonWords.length > minMatchingWords;
    });

    return matchingMessages.length > 0;
  }

  // Iterate over each chat message
  chatMessages.forEach((message, index) => {
    // Check if the message contains text content
    const hasTextContent = Array.from(message.childNodes).some(node => node.nodeType === Node.TEXT_NODE && node.textContent.trim() !== '');

    if (!hasTextContent) {
      return; // Skip messages without text content
    }

    // Extract the text content without considering the time and username
    const messageText = Array.from(message.childNodes)
      .filter(node => node.nodeType === Node.TEXT_NODE)
      .map(node => node.textContent)
      .join('');

    // Extract the user's username
    const usernameElement = message.querySelector('.username span[data-user]');
    if (!usernameElement) {
      return; // Skip messages without a username
    }
    const username = usernameElement.dataset.user;

    // Create an object for the username if it doesn't exist
    usernameMessages[username] = usernameMessages[username] || {};

    // Add the message to the object based on its text content
    if (!usernameMessages[username][messageText]) {
      // If the message is encountered for the first time, initialize the object
      usernameMessages[username][messageText] = {
        occurrences: 1,
        messages: [message]
      };
    } else {
      // If the message is a duplicate, increment occurrences and add to messages array
      usernameMessages[username][messageText].occurrences++;
      usernameMessages[username][messageText].messages.push(message);

      // Check for spam and handle accordingly
      if (isSpam(messageText, usernameMessages[username][messageText].messages.slice(0, -1))) {
        // Mark the current message as spam and hide it
        message.classList.add('spam-message');
        message.style.display = 'none';
      }
    }
  });

  // Iterate over each username and text content
  Object.keys(usernameMessages).forEach((username) => {
    Object.keys(usernameMessages[username]).forEach((messageText) => {
      // Check if occurrences are 2 or more
      if (usernameMessages[username][messageText].occurrences >= 2) {
        // Set class 'spam-message' and display: none for all occurrences except the first one for this username and text content
        usernameMessages[username][messageText].messages.forEach((message, i) => {
          if (i === 0) {
            // Add class 'initial-spam-message' for the first message
            if (!message.classList.contains('initial-spam-message')) {
              message.classList.add('initial-spam-message');

              // Create a span element if it doesn't exist for this username and text content
              let spamCountSpan = message.querySelector('.spam-messages-count');
              if (!spamCountSpan) {
                spamCountSpan = document.createElement('span');
                spamCountSpan.classList.add('spam-messages-count');
                spamCountSpan.style.color = 'chocolate';
                message.appendChild(spamCountSpan);
              }

              // Update the text content of the span for this username and text content
              spamCountSpan.textContent = ` ${usernameMessages[username][messageText].occurrences - 1}`;
            } else {
              // If the element already has 'initial-spam-message', update the span element
              let spamCountSpan = message.querySelector('.spam-messages-count');
              if (spamCountSpan) {
                spamCountSpan.textContent = ` ${usernameMessages[username][messageText].occurrences - 1}`;
              }
            }
          } else {
            if (!message.classList.contains('spam-message')) {
              message.classList.add('spam-message');
              message.style.display = 'none';
            }
          }
        });
      }
    });
  });
}
Leave a Comment