Untitled
unknown
javascript
2 years ago
12 kB
6
Indexable
// Add styles for hover effects dynamically to the head const newChatUserListStyles = document.createElement('style'); // Apply class to the style element newChatUserListStyles.classList.add('new_chat_user_list'); newChatUserListStyles.innerHTML = ` .chat-user-list { display: flex; flex-direction: column; position: absolute; top: 20px; background-color: #282B2F; } .chat-user-list [class^="user"] { display: inline-flex; margin: 2px 0; } .chat-user-list .avatar { width: 24px; height: 24px; display: inline-flex; } .chat-user-list .avatar:not([src^="data:image/svg+xml"]):hover { transform: scale(2); } .chat-user-list .name { text-decoration: none; display: inline-flex; width: auto; height: 24px; line-height: 24px; padding: 0 8px; } .chat-user-list .name:hover { text-decoration: underline; } .chat-user-list .name, .avatar:not([src^="data:image/svg+xml"]) { transition: filter 0.3s, transform 0.3s; } .chat-user-list .profile { display: inline-flex; width: 24px; height: 24px; justify-content: center; align-items: center; } `; head.appendChild(newChatUserListStyles); // Function to get status title from API or local storage cache function getStatusTitle(userId) { return new Promise((resolve, reject) => { const cachedUserInfo = JSON.parse(localStorage.getItem('fetchedUsers')) || {}; if (cachedUserInfo[userId]) { resolve(cachedUserInfo[userId].statusTitle); } else { const apiUrl = `https://klavogonki.ru/api/profile/get-summary?id=${userId}`; fetch(apiUrl) .then(response => { if (response.ok) { return response.json(); } throw new Error('Network response was not ok.'); }) .then(data => { if (data && data.title) { cachedUserInfo[userId] = { statusTitle: data.title, // Add other user-related information here }; localStorage.setItem('fetchedUsers', JSON.stringify(cachedUserInfo)); resolve(data.title); } else { throw new Error('Invalid data format received from the API.'); } }) .catch(error => { console.error(`Error fetching status title for user ${userId}:`, error); reject(error); }); } }); } // Function to get rank color based on status title function getRankColor(statusTitle) { const statusColors = { 'Экстракибер': '#06B4E9', // Light Blue 'Кибергонщик': '#3864E6', // Medium Blue 'Супермен': '#7A1FAE', // Purple 'Маньяк': '#DA0543', // Red 'Гонщик': '#FF8C00', // Orange 'Профи': '#C1AA00', // Yellow 'Таксист': '#2DAB4F', // Green 'Любитель': '#61B5B3', // Light Cyan 'Новичок': '#AFAFAF' // Grey }; return statusColors[statusTitle] || '#000000'; // Default to black color if status title not found } // Function to get rank class based on status title in English function getRankClass(statusTitle) { const statusClasses = { 'Экстракибер': 'extra_cyber', 'Кибергонщик': 'cyber_racer', 'Супермен': 'superman', 'Маньяк': 'maniac', 'Гонщик': 'racer', 'Профи': 'pro', 'Таксист': 'driver', 'Любитель': 'amateur', 'Новичок': 'newbie' }; return statusClasses[statusTitle] || 'unknown'; // Default to 'unknown' class if status title not found } // Function to handle private message function insertPrivate(userId) { const userName = document.querySelector(`.name[data-user="${userId}"]`).textContent; const message = `<${userName}>`; const textElement = document.querySelector('.messages .text'); textElement.value = message; textElement.focus(); textElement.selectionEnd = textElement.value.length; console.log(`Setting private message to: ${message}`); } // Inline SVG source for the "info" icon const infoSVG = ` <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="lightgray" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-info"> <circle cx="12" cy="12" r="10"></circle> <line x1="12" y1="16" x2="12" y2="12"></line> <line x1="12" y1="8" x2="12.01" y2="8"></line> </svg>`; // Inline SVG source for the "meh" icon const mehSVG = ` <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="lightgray" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" class="feather feather-meh"> <circle cx="12" cy="12" r="10"></circle> <line x1="8" y1="15" x2="16" y2="15"></line> <line x1="9" y1="9" x2="9.01" y2="9"></line> <line x1="15" y1="9" x2="15.01" y2="9"></line> </svg>`; // Array to store user IDs and their status titles const fetchedUsers = JSON.parse(localStorage.getItem('fetchedUsers')) || {}; // Function to create a new user element function createUserElement(userId, statusTitle, userName) { const bigAvatarUrl = `/storage/avatars/${userId}_big.png`; const newUserElement = document.createElement('div'); const rankClass = getRankClass(statusTitle); newUserElement.classList.add(`user${userId}`, rankClass); // Assign the rank class const newAvatarElement = document.createElement('img'); newAvatarElement.classList.add('avatar'); newAvatarElement.src = bigAvatarUrl; newAvatarElement.addEventListener('error', function () { this.src = `data:image/svg+xml;utf8,${encodeURIComponent(mehSVG)}`; }); const newNameElement = document.createElement('a'); newNameElement.classList.add('name'); newNameElement.title = 'Написать в приват'; newNameElement.dataset.user = userId; newNameElement.textContent = userName; const rankColor = getRankColor(statusTitle); newNameElement.style.setProperty('color', rankColor, 'important'); const newProfileElement = document.createElement('a'); newProfileElement.classList.add('profile'); newProfileElement.title = 'Профиль'; newProfileElement.target = '_blank'; newProfileElement.href = `/profile/${userId}/`; const newProfileImageElement = document.createElement('img'); newProfileImageElement.src = `data:image/svg+xml;utf8,${encodeURIComponent(infoSVG)}`; newNameElement.addEventListener('click', function () { insertPrivate(userId); }); newUserElement.appendChild(newAvatarElement); newUserElement.appendChild(newNameElement); newProfileElement.appendChild(newProfileImageElement); newUserElement.appendChild(newProfileElement); return newUserElement; } // Function to refresh the user list function refreshUserList() { // Get the original user list container const originalUserListContainer = document.querySelector('.userlist-content'); // Get or create the user list container let userListContainer = document.querySelector('.chat-user-list'); if (!userListContainer) { userListContainer = document.createElement('div'); userListContainer.classList.add('chat-user-list'); // Find the element with the class "userlist" const userlistElement = document.querySelector('.userlist'); // Append the userListContainer to the userlistElement if found if (userlistElement) { userlistElement.appendChild(userListContainer); } } // Define the rank order const rankOrder = ['extra_cyber', 'cyber_racer', 'superman', 'maniac', 'racer', 'pro', 'driver', 'amateur', 'newbie']; // Create an object to store subparent elements for each rank class const rankSubparents = {}; // Check if subparent elements already exist, if not, create them rankOrder.forEach(rankClass => { const existingSubparent = userListContainer.querySelector(`.rank-group-${rankClass}`); if (!existingSubparent) { rankSubparents[rankClass] = document.createElement('div'); rankSubparents[rankClass].classList.add(`rank-group-${rankClass}`); // rankSubparents[rankClass].style.marginTop = '5px'; userListContainer.appendChild(rankSubparents[rankClass]); } else { rankSubparents[rankClass] = existingSubparent; } }); // Iterate over each rank group and set display to flex Object.values(rankSubparents).forEach(rankGroup => { rankGroup.style.display = 'flex'; rankGroup.style.flexDirection = 'column'; // Adjust as needed }); // Create a set to store existing user IDs in the updated user list const existingUserIds = new Set(); // Iterate over each user element in the original user list originalUserListContainer.querySelectorAll('ins').forEach(userElement => { const nameElement = userElement.querySelector('.name'); const userId = nameElement.getAttribute('data-user'); const userName = nameElement.textContent; // Check if the user already exists in the updated user list if (!existingUserIds.has(userId)) { if (!fetchedUsers[userId]) { getStatusTitle(userId) .then(statusTitle => { fetchedUsers[userId] = { statusTitle }; localStorage.setItem('fetchedUsers', JSON.stringify(fetchedUsers)); const newUserElement = createUserElement(userId, statusTitle, userName); const rankClass = getRankClass(statusTitle); // Add the user to the corresponding rank group rankSubparents[rankClass].appendChild(newUserElement); // Update existing user IDs existingUserIds.add(userId); }) .catch(error => { console.error(`Error fetching status title for user ${userId}:`, error); }); } else { // If the user exists, ensure the element exists and update existing user IDs const statusTitle = fetchedUsers[userId].statusTitle; const rankClass = getRankClass(statusTitle); // Check if the user element already exists const existingUserElement = userListContainer.querySelector(`.user${userId}.${rankClass}`); if (!existingUserElement) { const newUserElement = createUserElement(userId, statusTitle, userName); // Add the user to the corresponding rank group rankSubparents[rankClass].appendChild(newUserElement); } // Update existing user IDs existingUserIds.add(userId); } } }); // Remove any existing user elements that are not present in the updated user list userListContainer.querySelectorAll('.chat-user-list [class^="user"]').forEach(userElement => { const userId = userElement.querySelector('.name').getAttribute('data-user'); if (!existingUserIds.has(userId)) { userElement.remove(); } }); } // Call the refreshUserList function refreshUserList();
Editor is loading...
Leave a Comment