diff --git a/index.html b/index.html
index 8938690..0831f16 100644
--- a/index.html
+++ b/index.html
@@ -566,8 +566,20 @@
let reconnectTimeout = null;
let debugTimeout = null;
let duration = 0;
+
+ // Переменные для BeatLeader
let lastBlFetch = 0;
- let blFailCount = 0;
+ let isFetchingBL = false;
+ let currentProxyIdx = 0;
+
+ // Массив прокси (первый элемент пустой - попытка загрузки напрямую, т.к. API BL поддерживает CORS)
+ const proxies = [
+ "",
+ "https://api.codetabs.com/v1/proxy?quest=",
+ "https://api.allorigins.win/raw?url=",
+ "https://corsproxy.io/?",
+ "https://thingproxy.freeboard.io/fetch/"
+ ];
function init() {
els.app.style.display = 'none';
@@ -578,6 +590,9 @@
applyGlow();
connectWS();
+ // Фоновое обновление профиля каждые 15 минут
+ setInterval(() => fetchBL(), 900000);
+
document.addEventListener('keydown', (e) => {
if (e.key === 'F2') els.settings.classList.toggle('show');
});
@@ -793,49 +808,68 @@
async function fetchBL(force = false) {
if (!config.blId || !config.showBL) return;
+ if (isFetchingBL) return;
if (!force && Date.now() - lastBlFetch < 900000) return;
- try {
- const isNumeric = /^\d+$/.test(config.blId);
- let originalUrl;
- if (isNumeric) {
- originalUrl = `https://api.beatleader.xyz/player/${config.blId}?stats=true`;
- } else {
- originalUrl = `https://api.beatleader.xyz/players?search=${encodeURIComponent(config.blId)}`;
+ isFetchingBL = true;
+
+ const isNumeric = /^\d+$/.test(config.blId);
+ const originalUrl = isNumeric
+ ? `https://api.beatleader.com/player/${config.blId}?stats=true`
+ : `https://api.beatleader.com/players?search=${encodeURIComponent(config.blId)}`;
+
+ let success = false;
+ let attempts = 0;
+ const maxAttempts = 5;
+
+ while (!success && attempts < maxAttempts) {
+ try {
+ const proxy = proxies[currentProxyIdx % proxies.length];
+ const targetUrl = proxy ? proxy + encodeURIComponent(originalUrl) : originalUrl;
+
+ showDebug(`BL Fetch [${attempts + 1}/${maxAttempts}] via ${proxy ? 'Proxy' : 'Direct'}`);
+
+ const res = await fetch(targetUrl, { headers: { 'Accept': 'application/json' } });
+
+ if (!res.ok) throw new Error(`Network error: ${res.status}`);
+
+ const json = await res.json();
+ const player = json.data ? json.data[0] : json;
+
+ if (!player || !player.name) throw new Error("Player not found");
+
+ els.blName.textContent = player.name || "Unknown";
+ els.blGlobal.textContent = player.rank ? `#${player.rank.toLocaleString()}` : "#--";
+ els.blLocal.textContent = player.countryRank ? `#${player.countryRank.toLocaleString()} (${player.country || 'N/A'})` : "#-- (N/A)";
+ els.blPp.textContent = player.pp ? `${Math.round(player.pp).toLocaleString()}` : "--";
+
+ if (player.avatar) {
+ els.blAvatar.src = player.avatar;
+ els.blAvatarWrapper.style.display = 'block';
+ } else {
+ els.blAvatarWrapper.style.display = 'none';
+ }
+
+ lastBlFetch = Date.now();
+ success = true;
+ showDebug(`BL Profile Loaded Successfully!`);
+ } catch (err) {
+ attempts++;
+ currentProxyIdx++; // Пробуем следующий прокси
+ showDebug(`BL Error: ${err.message}. Retrying...`);
+
+ if (attempts < maxAttempts) {
+ await new Promise(r => setTimeout(r, 2000)); // Задержка 2 сек перед следующей попыткой
+ }
}
-
- const proxiedUrl = `https://api.codetabs.com/v1/proxy?quest=${encodeURIComponent(originalUrl)}`;
- const res = await fetch(proxiedUrl, { headers: { 'Accept': 'application/json' } });
-
- if (!res.ok) throw new Error(`Network error: ${res.status}`);
-
- const json = await res.json();
- const player = json.data ? json.data[0] : json;
-
- if (!player || !player.name) throw new Error("Player not found");
-
- els.blName.textContent = player.name || "Unknown";
- els.blGlobal.textContent = player.rank ? `#${player.rank.toLocaleString()}` : "#--";
- els.blLocal.textContent = player.countryRank ? `#${player.countryRank.toLocaleString()} (${player.country || 'N/A'})` : "#-- (N/A)";
- els.blPp.textContent = player.pp ? `${Math.round(player.pp).toLocaleString()}` : "--";
-
- if (player.avatar) {
- els.blAvatar.src = player.avatar;
- els.blAvatarWrapper.style.display = 'block';
- } else {
- els.blAvatarWrapper.style.display = 'none';
- }
-
- lastBlFetch = Date.now();
- blFailCount = 0;
- } catch (err) {
- blFailCount++;
- if (blFailCount >= 5) {
- showDebug(`BL Error: ${err.message} (${blFailCount} fails)`);
- }
- els.blName.textContent = "Error loading profile";
- console.error("BeatLeader fetch failed:", err);
}
+
+ if (!success) {
+ els.blName.textContent = "Error loading profile";
+ showDebug(`BL Fetch failed completely after ${maxAttempts} attempts.`);
+ }
+
+ isFetchingBL = false;
}
function connectWS() {