// 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 displayName = server.ops && server.ops.length > 0 ? `${server.ops[0].name}'s Server` : 'Unclaimed Server';
// 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 = `
${displayName}
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 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() : 'unclaimed';
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);