Untitled
unknown
javascript
2 years ago
5.7 kB
6
Indexable
// Time difference threshold (in milliseconds) to identify spam (increased to 1 second)
const timeDifferenceThreshold = 2000;
// Message limit within a specific time frame (set this value to 2 for more than 2 messages in 1 second)
const messageLimit = 5;
// Object to track user-specific data
let userChatData = {};
// Maximum number of consecutive times a user is allowed to exceed the message limit
const thresholdMaxTries = 5;
// Function to format time difference
function formatTimeDifference(difference) {
// Define time units
const units = ['hour', 'minute', 'second', 'millisecond'];
// Calculate values for each time unit
const values = [
Math.floor(difference / (1000 * 60 * 60)), // hours
Math.floor((difference / (1000 * 60)) % 60), // minutes
Math.floor((difference / 1000) % 60), // seconds
difference % 1000 // milliseconds
];
// Map each non-zero value to a formatted string with its corresponding unit
const formattedStrings = values
.map((value, index) => (value > 0 ? `${value} ${units[index]}${value > 1 ? 's' : ''}` : ''));
// Filter out empty strings (units with a value of 0) and join the remaining strings
const formattedTime = formattedStrings
.filter(Boolean)
.join(' ');
// Return the formatted time string
return formattedTime;
}
// Helper function to remove all messages by a user
function removeUserMessages(userId) {
const userMessages = document.querySelectorAll(`.messages-content span[data-user="${userId}"]`);
userMessages.forEach(message => {
const pTag = message.closest('p');
if (pTag) {
pTag.remove();
}
});
}
// Function to track and handle spam messages
function banSpammer() {
// Get the current timestamp
const currentTime = new Date().getTime();
// Select the last p element in the chat
const latestMessage = document.querySelector('.messages-content p:last-child');
if (latestMessage) {
// Get user ID from the last message
const userIdElement = latestMessage.querySelector('span[data-user]');
const userId = userIdElement ? userIdElement.getAttribute('data-user') : null;
// Initialize user-specific data outside the if block
if (!userChatData[userId]) {
userChatData[userId] = {
messagesCount: 0,
thresholdMaxTries: 0,
time: currentTime,
userName: userIdElement ? userIdElement.textContent : 'Unknown User',
previousTime: null,
firstInteraction: true,
banned: false
};
}
// Calculate time difference
const timeDifference = currentTime - userChatData[userId].time;
// Function to generate log information dynamically
function generateLogUserInfo() {
return `%cID: ${userId}, Name: ${userChatData[userId].userName}, ` +
`Time Difference: ${formatTimeDifference(timeDifference)}, ` +
`Messages Count: ${userChatData[userId].messagesCount}, ` +
`Spam Tries: ${userChatData[userId].thresholdMaxTries}, ` +
`Banned: ${userChatData[userId].banned}`;
}
// Special handling for the first interaction
if (userChatData[userId].firstInteraction) {
console.log(`%c${userChatData[userId].userName} posted the first message for the current chat session.`, 'color: yellow');
userChatData[userId].firstInteraction = false;
}
// Check if the user is banned
else if (userChatData[userId].banned) {
// Remove all the messages by that user continuously until banned
removeUserMessages(userId);
} else {
if (timeDifference < timeDifferenceThreshold) {
// Check if the time difference is less than the threshold
userChatData[userId].messagesCount++;
if (userChatData[userId].messagesCount > messageLimit) {
// Remove all messages by that user if messages limit was exceeded
removeUserMessages(userId);
// Check if the thresholdMaxTries is equal or more than the limit
userChatData[userId].thresholdMaxTries++;
if (userChatData[userId].thresholdMaxTries >= thresholdMaxTries) {
// Set 'banned' to true after passing the max thresholdMaxTries to remove user messages passing the messages limit checking
userChatData[userId].banned = true;
console.log(generateLogUserInfo(), 'color: pink');
console.log(`%c${userChatData[userId].userName} cannot send messages anymore`, 'color: pink');
} else {
// Log the information immediately after updating the values if not banned
console.log(generateLogUserInfo(), 'color: red');
}
} else {
// Log the information immediately after updating the values if not banned and not exceeding the limit
console.log(generateLogUserInfo(), 'color: green');
}
} else {
// If none of the above conditions are met, update user-specific data for the current interaction
userChatData[userId].previousTime = userChatData[userId].time;
userChatData[userId].time = currentTime;
userChatData[userId].messagesCount = 1;
// Log the information immediately after updating the values if not banned and not exceeding the limit
console.log(generateLogUserInfo(), 'color: green');
}
}
}
}Editor is loading...
Leave a Comment