246 lines
8.7 KiB
JavaScript
246 lines
8.7 KiB
JavaScript
// Fonction pour obtenir l'access token Twitch
|
|
async function getAccessToken() {
|
|
const clientId = 'z2tcrq9oeynzf4ijgzhv6br5feoprr';
|
|
const clientSecret = 'ybm8e512lrsylqqkl78ow08nv3jgx9';
|
|
const url = `https://id.twitch.tv/oauth2/token?client_id=${clientId}&client_secret=${clientSecret}&grant_type=client_credentials`;
|
|
|
|
const response = await fetch(url, { method: 'POST' });
|
|
const data = await response.json();
|
|
return data.access_token;
|
|
}
|
|
|
|
// Fonction pour obtenir les informations utilisateur et le statut du stream
|
|
async function getUserInfoAndStreamStatus(username, accessToken, clientId) {
|
|
const userUrl = `https://api.twitch.tv/helix/users?login=${username}`;
|
|
const userResponse = await fetch(userUrl, {
|
|
headers: {
|
|
'Authorization': `Bearer ${accessToken}`,
|
|
'Client-ID': clientId,
|
|
},
|
|
});
|
|
|
|
if (userResponse.status !== 200) {
|
|
console.error('Erreur lors de la récupération des informations utilisateur.');
|
|
return null;
|
|
}
|
|
|
|
const userData = await userResponse.json();
|
|
if (userData.data.length === 0) {
|
|
console.error('Utilisateur non trouvé.');
|
|
return null;
|
|
}
|
|
|
|
const userId = userData.data[0].id;
|
|
const profileImageUrl = userData.data[0].profile_image_url;
|
|
const displayName = userData.data[0].display_name;
|
|
|
|
const streamUrl = `https://api.twitch.tv/helix/streams?user_id=${userId}`;
|
|
const streamResponse = await fetch(streamUrl, {
|
|
headers: {
|
|
'Authorization': `Bearer ${accessToken}`,
|
|
'Client-ID': clientId,
|
|
},
|
|
});
|
|
|
|
const streamData = await streamResponse.json();
|
|
let streamType = 'offline';
|
|
|
|
if (streamData.data.length > 0) {
|
|
streamType = streamData.data[0].type;
|
|
}
|
|
|
|
return {
|
|
profileImageUrl,
|
|
displayName,
|
|
streamType,
|
|
};
|
|
}
|
|
|
|
// Lire le fichier streamers.json depuis le localStorage
|
|
function readStreamersFile() {
|
|
const fileContent = localStorage.getItem('streamers');
|
|
return fileContent ? JSON.parse(fileContent) : { streamers: [] };
|
|
}
|
|
|
|
// Sauvegarder dans streamers.json dans le localStorage
|
|
function saveStreamersFile(streamersData) {
|
|
localStorage.setItem('streamers', JSON.stringify(streamersData, null, 2));
|
|
}
|
|
|
|
// Vérifier et ajouter les streamers manquants
|
|
async function updateMissingStreamers(usernames) {
|
|
let streamersData = readStreamersFile();
|
|
|
|
const currentStreamers = streamersData.streamers.map(streamer => streamer.username);
|
|
|
|
const missingUsernames = usernames.filter(username => !currentStreamers.includes(username));
|
|
|
|
if (missingUsernames.length === 0) {
|
|
console.log("Tous les streamers sont déjà présents.");
|
|
return;
|
|
}
|
|
|
|
console.log(`Les streamers suivants sont manquants: ${missingUsernames.join(', ')}`);
|
|
|
|
const accessToken = await getAccessToken();
|
|
const clientId = 'z2tcrq9oeynzf4ijgzhv6br5feoprr';
|
|
|
|
for (const username of missingUsernames) {
|
|
const data = await getUserInfoAndStreamStatus(username, accessToken, clientId);
|
|
if (data) {
|
|
streamersData.streamers.push({
|
|
username: username,
|
|
displayName: data.displayName,
|
|
profileImageUrl: data.profileImageUrl,
|
|
streamType: data.streamType
|
|
});
|
|
}
|
|
}
|
|
|
|
saveStreamersFile(streamersData);
|
|
console.log("Les streamers manquants ont été ajoutés.");
|
|
}
|
|
|
|
// Fonction pour afficher les streamers
|
|
async function displayStreamers(usernames) {
|
|
const accessToken = await getAccessToken();
|
|
const clientId = 'z2tcrq9oeynzf4ijgzhv6br5feoprr';
|
|
|
|
const streamersData = readStreamersFile();
|
|
const onlineStreamers = [];
|
|
const offlineStreamers = [];
|
|
|
|
for (const username of usernames) {
|
|
const streamerInfo = streamersData.streamers.find(streamer => streamer.username === username);
|
|
|
|
if (streamerInfo && streamerInfo.streamType === 'live') {
|
|
onlineStreamers.push(streamerInfo);
|
|
} else {
|
|
offlineStreamers.push(streamerInfo);
|
|
}
|
|
}
|
|
|
|
// Trier les streamers par nom
|
|
onlineStreamers.sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
offlineStreamers.sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
|
|
// Mettre à jour le nombre de streamers en ligne et hors ligne
|
|
document.getElementById('onlineCount').textContent = onlineStreamers.length;
|
|
document.getElementById('offlineCount').textContent = offlineStreamers.length;
|
|
|
|
const onlineContainer = document.getElementById('onlineStreamers');
|
|
const offlineContainer = document.getElementById('offlineStreamers');
|
|
|
|
// Réinitialiser les conteneurs
|
|
onlineContainer.innerHTML = '';
|
|
offlineContainer.innerHTML = '';
|
|
|
|
if (onlineStreamers.length > 0) {
|
|
// Supprimer le texte de chargement
|
|
const loaderText = document.getElementById('loadertext');
|
|
if (loaderText) {
|
|
loaderText.style.display = 'none';
|
|
}
|
|
} else {
|
|
// Ajouter le texte de chargement si aucun streamer en ligne
|
|
const loaderText = document.getElementById('loadertext');
|
|
if (loaderText) {
|
|
loaderText.textContent = "Il n'y a aucun streamer en ligne actuellement";
|
|
loaderText.style.display = 'block';
|
|
}
|
|
}
|
|
|
|
onlineStreamers.forEach(data => {
|
|
const profileLink = `https://twitch.tv/${data.displayName}`;
|
|
|
|
const image = document.createElement('img');
|
|
image.src = data.profileImageUrl;
|
|
image.alt = data.displayName;
|
|
image.className = 'streamer-image';
|
|
|
|
const liveIndicator = document.createElement('div');
|
|
liveIndicator.className = 'live-indicator';
|
|
liveIndicator.style.display = 'block';
|
|
|
|
const name = document.createElement('div');
|
|
name.className = 'streamer-name';
|
|
name.textContent = data.displayName;
|
|
|
|
const link = document.createElement('a');
|
|
link.href = profileLink;
|
|
link.target = '_blank';
|
|
link.appendChild(image);
|
|
link.appendChild(liveIndicator);
|
|
|
|
const infoDiv = document.createElement('div');
|
|
infoDiv.className = 'streamer-info';
|
|
infoDiv.appendChild(link);
|
|
infoDiv.appendChild(name);
|
|
|
|
onlineContainer.appendChild(infoDiv);
|
|
});
|
|
|
|
// Réinitialiser et remplir le conteneur des streamers hors ligne
|
|
if (offlineStreamers.length === 0) {
|
|
// Ajouter le texte de chargement si aucun streamer hors ligne
|
|
const loaderText = document.getElementById('loadertext');
|
|
if (loaderText) {
|
|
loaderText.textContent = "Il n'y a aucun streamer hors ligne actuellement";
|
|
loaderText.style.display = 'block';
|
|
}
|
|
} else {
|
|
// Supprimer le texte de chargement
|
|
const loaderText = document.getElementById('loadertext');
|
|
if (loaderText) {
|
|
loaderText.style.display = 'none';
|
|
}
|
|
}
|
|
|
|
offlineStreamers.forEach(data => {
|
|
const profileLink = `https://twitch.tv/${data.displayName}`;
|
|
|
|
const image = document.createElement('img');
|
|
image.src = data.profileImageUrl;
|
|
image.alt = data.displayName;
|
|
image.className = 'streamer-image';
|
|
image.classList.toggle('offline', data.streamType !== 'live');
|
|
|
|
const liveIndicator = document.createElement('div');
|
|
liveIndicator.className = 'live-indicator';
|
|
liveIndicator.style.display = 'none';
|
|
|
|
const name = document.createElement('div');
|
|
name.className = 'streamer-name';
|
|
name.textContent = data.displayName;
|
|
|
|
const link = document.createElement('a');
|
|
link.href = profileLink;
|
|
link.target = '_blank';
|
|
link.appendChild(image);
|
|
link.appendChild(liveIndicator);
|
|
|
|
const infoDiv = document.createElement('div');
|
|
infoDiv.className = 'streamer-info';
|
|
infoDiv.appendChild(link);
|
|
infoDiv.appendChild(name);
|
|
|
|
offlineContainer.appendChild(infoDiv);
|
|
});
|
|
|
|
if (onlineStreamers.length > 0) {
|
|
// Supprimer le texte "aucun streamer en ligne" et le texte de chargement
|
|
const loaderText = document.getElementById('onlineLoaderText');
|
|
if (loaderText) {
|
|
loaderText.style.display = 'none';
|
|
}
|
|
} else {
|
|
// Ajouter le texte "aucun streamer en ligne"
|
|
const loaderText = document.getElementById('onlineLoaderText');
|
|
if (loaderText) {
|
|
loaderText.textContent = "Il n'y a aucun streamer en ligne actuellement";
|
|
loaderText.style.display = 'block'; // Assurez-vous que le texte est visible
|
|
}
|
|
}
|
|
|
|
}
|