// Function to copy text to clipboard and trigger animation function copyToClipboard(text, button) { navigator.clipboard.writeText(text).then(() => { button.classList.add('copied'); setTimeout(() => { button.classList.remove('copied'); }, 2000); }).catch(err => { console.error('Failed to copy:', err); }); } // Function to create a server card function createServerCard(server, isNew = false) { const ownerName = server.ops && server.ops.length > 0 ? server.ops[0].name : 'Unknown'; // Prefer connect2 if it's a my-mc.link subdomain, otherwise use connect const displayConnect = server.connect2 && server.connect2.includes('.my-mc.link') ? server.connect2 : server.connect; const serverCard = document.createElement('div'); serverCard.className = `feature-card tilt-card ${isNew ? 'new-server-animation' : ''}`; serverCard.dataset.connect = server.connect; // Add identifier serverCard.innerHTML = `

${ownerName}'s Server

MOTD: ${server.motd}

Version: ${server.gameVersion}

Gamemode: ${server.gamemode}

Hardcore: ${server.hardcore ? 'Yes' : 'No'}

Status: ${server.online ? 'Online' : 'Offline'}

Connect: ${displayConnect}
`; return serverCard; } // Function to update server list dynamically function updateServerList(newServers) { const serverList = document.getElementById('server-list'); const currentCards = Array.from(serverList.children); const currentConnects = currentCards.map(card => card.dataset.connect); const newConnects = newServers.map(server => server.connect); // Find new servers const serversToAdd = newServers.filter(server => !currentConnects.includes(server.connect)); const serversToRemove = currentCards.filter(card => !newConnects.includes(card.dataset.connect)); // Remove old servers serversToRemove.forEach(card => { card.style.opacity = '0'; card.style.transform = 'translateY(20px)'; setTimeout(() => card.remove(), 300); }); // Add new servers with animation serversToAdd.forEach(server => { const newCard = createServerCard(server, true); serverList.insertBefore(newCard, serverList.firstChild); }); // Update existing servers newServers.forEach(server => { const existingCard = currentCards.find(card => card.dataset.connect === server.connect); if (existingCard) { const ownerName = server.ops && server.ops.length > 0 ? server.ops[0].name : 'Unknown'; const updatedCard = createServerCard(server); existingCard.innerHTML = updatedCard.innerHTML; existingCard.className = updatedCard.className; } }); console.log('Server list updated:', { added: serversToAdd.length, removed: serversToRemove.length, total: newServers.length }); } // Function to fetch and display servers async function fetchServers() { const serverList = document.getElementById('server-list'); const loadingMessage = document.getElementById('loading-message'); const errorMessage = document.getElementById('error-message'); const searchInput = document.getElementById('search-input'); try { const response = await fetch('https://api.my-mc.link/list_all_servers_public'); const data = await response.json(); if (data.success && data.servers) { loadingMessage.classList.add('hidden'); errorMessage.classList.add('hidden'); // Store servers globally for search filtering window.serverData = data.servers; // Initial render or update if (serverList.children.length === 0) { window.serverData.forEach(server => { serverList.appendChild(createServerCard(server)); }); } else { updateServerList(window.serverData); } // Add search event listener (only once) if (!searchInput.dataset.listener) { searchInput.dataset.listener = 'true'; searchInput.addEventListener('input', () => { const searchTerm = searchInput.value.trim().toLowerCase(); const filteredServers = window.serverData.filter(server => { const ownerName = server.ops && server.ops.length > 0 ? server.ops[0].name.toLowerCase() : 'unknown'; const motd = server.motd.toLowerCase(); const version = server.gameVersion.toLowerCase(); const status = server.online ? 'online' : 'offline'; return ( ownerName.includes(searchTerm) || motd.includes(searchTerm) || version.includes(searchTerm) || status.includes(searchTerm) ); }); updateServerList(filteredServers); }); } } else { throw new Error('No servers found'); } } catch (error) { loadingMessage.classList.add('hidden'); errorMessage.classList.remove('hidden'); console.error('Error fetching servers:', error); } } // Initial fetch fetchServers(); // Fetch servers every 60 seconds setInterval(fetchServers, 60000);