95 lines
2.8 KiB
JavaScript
95 lines
2.8 KiB
JavaScript
|
// main.js
|
||
|
|
||
|
function jsonp(url, callbackName) {
|
||
|
return new Promise((resolve) => {
|
||
|
const script = document.createElement('script');
|
||
|
script.src = `${url}&callback=${callbackName}`;
|
||
|
document.body.appendChild(script);
|
||
|
|
||
|
window[callbackName] = (data) => {
|
||
|
delete window[callbackName];
|
||
|
document.body.removeChild(script);
|
||
|
resolve(data);
|
||
|
};
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async function getGames(username, userAgents) {
|
||
|
const gamesUrl = `https://api.chess.com/pub/player/${username}/games/archives`;
|
||
|
|
||
|
try {
|
||
|
const response = await jsonp(gamesUrl);
|
||
|
// Extracting URLs
|
||
|
const gameUrls = response.archives.map(url => `${url}/.pgn`);
|
||
|
return gameUrls;
|
||
|
} catch (error) {
|
||
|
console.error('Error fetching game URLs:', error);
|
||
|
throw error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function fetchGames(url, userAgent) {
|
||
|
const callbackName = `jsonp_callback_${Math.round(100000 * Math.random())}`;
|
||
|
|
||
|
try {
|
||
|
const response = await jsonp(url, callbackName);
|
||
|
// Process the JSONP response as needed
|
||
|
return response;
|
||
|
} catch (error) {
|
||
|
console.error(`Error fetching game from ${url}:`, error);
|
||
|
throw error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function concatenateGames(gameResults) {
|
||
|
// Customize how you want to concatenate the games
|
||
|
return gameResults.join('\n\n');
|
||
|
}
|
||
|
|
||
|
async function downloadGames() {
|
||
|
const username = document.getElementById('username').value;
|
||
|
|
||
|
// Function 1: Get game URLs
|
||
|
const allUserAgents = await loadUserAgents();
|
||
|
const urls = await getGames(username, allUserAgents);
|
||
|
|
||
|
// Function 2: Asynchronously fetch games
|
||
|
const gamePromises = urls.map(async (url, index) => {
|
||
|
const userAgent = allUserAgents[index % allUserAgents.length];
|
||
|
return await fetchGames(url, userAgent);
|
||
|
});
|
||
|
|
||
|
try {
|
||
|
// Function 3: Concatenate game results
|
||
|
const gameResults = await Promise.all(gamePromises);
|
||
|
const concatenatedGames = concatenateGames(gameResults);
|
||
|
|
||
|
// Function 4: Trigger download
|
||
|
download(concatenatedGames, 'chess_games.pgn', 'application/pgn');
|
||
|
} catch (error) {
|
||
|
console.error('Error fetching games:', error);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function download(content, fileName, contentType) {
|
||
|
const a = document.createElement('a');
|
||
|
const file = new Blob([content], { type: contentType });
|
||
|
a.href = URL.createObjectURL(file);
|
||
|
a.download = fileName;
|
||
|
a.click();
|
||
|
}
|
||
|
|
||
|
async function loadUserAgents() {
|
||
|
try {
|
||
|
const userAgentsModule = await import('./userAgents.js');
|
||
|
return userAgentsModule.default;
|
||
|
} catch (error) {
|
||
|
console.error('Error loading user agents:', error);
|
||
|
throw error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
document.addEventListener('DOMContentLoaded', function () {
|
||
|
// Your initialization logic here...
|
||
|
});
|