Скрипт обновляет данные о подарках через проверку их количества. То есть он не идёт по каждому подарку и не сравнивает детали, а делает это скрыто, быстро и экономно:
Скрипт сначала делает fetch на URL /index/54-USERID- и подсчитывает общее количество подарков с сервера.
Затем он берёт сохранённое значение в localStorage (COUNT_KEY) — это количество подарков, которое было при последней загрузке.
Если текущее количество отличается от сохранённого, скрипт понимает, что появились новые подарки и загружает их полностью (loadAndRenderLastGifts()).
Если количество совпадает, скрипт ничего не подгружает и просто показывает последние 3 подарка из кэша.
То есть логика экономичная и «по числу», чтобы не дергать сервер постоянно. Проверка идёт только через число подарков, а детали обновляются только если это число изменилось.
Источник данных
Код
1. Основной источник — URL /index/54-USERID-.
2. Сервер возвращает HTML/XML с элементами <td> для каждого подарка.
2. Каждый <td> содержит:
4. <img> — картинку подарка
5. <b> — количество одинаковых подарков
6. атрибут onclick — ссылку/действие для открытия профиля отправителя
Кэширование
Код
Скрипт сохраняет подарки в localStorage под ключом giftsData_USERID.
При следующей загрузке он использует кэш, чтобы быстро показать подарки без нового запроса.
Максимальное количество сохранённых подарков — 120.
Мини-превью на странице
Код
На странице показываются последние 3 подарка из массива allGifts.
Для каждого подарка создаётся блок <div class="gift-card"> с изображением (<img>).
Подставляется title с ником пользователя (или «Подарок» по умолчанию).
Попап с полной информацией
Код
При клике на счётчик создаётся попап (.gifts-popup) с листом подарков (.gifts-list).
Для каждого подарка создаётся блок gift-item с:
Аватар отправителя (gift.avatar)
Ник (gift.nick)
Дата подарка (gift.date)
Комментарий (gift.comment) — оформлен в gift-comment-wrapper
Основное изображение (gift.img)
Кнопка вручения (gift.recipientId), которая активна только для других пользователей
Порядок рендера
Код
Сначала берётся кэш из localStorage и рендерятся все подарки в попапе (новые сверху).
Затем асинхронно для каждого подарка вызывается fetchGiftDetails(), которая подгружает актуальные данные: ник, аватар, комментарий, дату.
Если данные обновились, скрипт обновляет DOM конкретного подарка в попапе.
После полной загрузки обновлённые данные сохраняются в кэш.
Итоговая логика
Код
Мини-превью: последние 3 подарка, берутся из кэша.
Полный список: показывается в попапе с аватаром, ником, комментариями, кнопкой «вручить».
Обновление данных: происходит только если число подарков на сервере изменилось.
let total = 0; temp.querySelectorAll('td[onclick*="_uWnd.reload"]').forEach(td => { const b = td.querySelector('b'); total += b ? (+b.textContent || 1) : 1; }); return total; } catch { return null; } }
// Функцию fetchGiftDetails нужно вставить сюда из предыдущей версии // (она отвечает за загрузку ника, аватара, комментария, даты и т.д.) // Если её нет — добавь свою рабочую версию
async function loadAndRenderLastGifts() { try { const res = await fetch(`/index/54-${userId}-`); if (!res.ok) throw new Error("Fetch error");
const text = await res.text(); const xml = new DOMParser().parseFromString(text, 'application/xml'); const cmd = xml.querySelector('cmd[p="content"]'); if (!cmd) { counter.textContent = '0 подарков'; return; }
// Фоновая загрузка полной информации const updated = []; for (const gift of allGifts) { const upd = await fetchGiftDetails({ ...gift }); updated.push(upd);
Это наиболее продвинутая на данный момент версия скрипта с точки зрения логики, однако кто знает, какие идеи придут мне в голову завтра. На сегодня это актуальная версия.