Список пользователей

1
Админ
Постов: 101
2
Элита
Постов: 34
3
Элита
Постов: 28
4
VIP
Постов: 26
5
Дизайнер
Постов: 25
6
Пользователи
Постов: 25
7
Пользователи
Постов: 24
8
Проверенные
Постов: 21

  • Страница 1 из 1
  • 1
Личные сообщения скрипт подставляет аватарки UCOZ
Дата: Понедельник, 13.10.2025, 18:03 | Сообщение # 1 | | Написал: Начинающий
Автор темы
Мурчанн не в сети
        Сообщений:101
         Регистрация:20.10.2016

Простенький, но бодрый скрипт, который уверенно работает со списком сообщений и даже заглядывает внутрь писем.
Правда, с письмами внутри пришлось немного повозиться - не удалось пока полностью "хакнуть" этот участок, система держится.
Но ничего, личные сообщения всё ещё в разработке - время есть, нагнём, куда она денется. 💪

Скрипт подставляет аватарки в списке сообщений , работает стабильно.
Внутри письма пока просто стоит картинка-заглушка: там особо и не нужна аватарка, всё и так на своих местах. 2

Код
<script>
(function(){
'use strict';

const DEFAULT_AVATAR = "https://jordan.moy.su/ava/avapm.png";
const CACHE_KEY = "pmAvatarCache_v9";
const CHECK_DELAY = 150;

const cache = JSON.parse(localStorage.getItem(CACHE_KEY) || "{}");

function saveCache(){ localStorage.setItem(CACHE_KEY, JSON.stringify(cache)); }

async function fetchAvatarFromProfile(url){
try {
const res = await fetch(url, {cache: "no-cache"});
if(!res.ok) return null;
const txt = await res.text();
const doc = new DOMParser().parseFromString(txt, "text/html");
const img = doc.querySelector('img[src*="/avatar/"], img[src*="/ava/"], .user_avatar img, .avatar img');
if(img && img.src) return new URL(img.src, location.origin).href;
return null;
} catch(e){ console.log("fetchAvatar error", e); return null; }
}

function buildProfileUrls(username){
if(!username) return [];
const safe = encodeURIComponent(username.replace(/\s+/g,'-'));
return [
location.origin + '/index/8-0-' + safe,
location.origin + '/index/8-0-' + username
];
}

async function getAvatar(username){
if(!username) return null;
if(cache[username]) return cache[username];

const urls = buildProfileUrls(username);
for(const u of urls){
const found = await fetchAvatarFromProfile(u);
if(found){ cache[username] = found; saveCache(); return found; }
await new Promise(r => setTimeout(r, CHECK_DELAY));
}
cache[username] = null; saveCache(); return null;
}

async function insertAvatarOver(container, username){
if(!container || !username) return;

const avatarSrc = await getAvatar(username) || DEFAULT_AVATAR;

const letters = container.querySelectorAll('.avatarLetter');
letters.forEach(l => l.style.visibility = 'hidden');

// Размеры аватара
let width = 60, height = 60; // стандарт для списка сообщений

// Если это открытое письмо — увеличиваем
if(container.closest('.userpm-message-table') && !container.closest('.userpm-messages-table')){
width = 60;
height = 60;
}

// Если найдена буква — используем её размеры (но не больше установленных)
const letter = container.querySelector('.avatarLetter');
if(letter){
width = Math.min(width, letter.offsetWidth);
height = Math.min(height, letter.offsetHeight);
}

let overlay = container.querySelector('.avatarOverlay');
if(!overlay){
overlay = document.createElement('div');
overlay.className = 'avatarOverlay';
overlay.style.position = 'absolute';
overlay.style.top = '0';
overlay.style.left = '0';
overlay.style.width = width + 'px';
overlay.style.height = height + 'px';
overlay.style.overflow = 'hidden';
overlay.style.zIndex = '10';
container.style.position = 'relative';
container.appendChild(overlay);
}

overlay.innerHTML = '';
const img = document.createElement('img');
img.src = avatarSrc;
img.alt = username;
img.style.width = '100%';
img.style.height = '100%';
img.style.objectFit = 'cover';
img.style.marginTop = '0px'; // смещаем вверх на 0px, подстраивай
// img.style.marginTop = '-5px'; // смещаем вверх, можно менять число
img.style.borderRadius = '1px'; // лёгкое закругление
overlay.appendChild(img);
}

async function processContainers(root=document){
// Список сообщений
const msgRows = Array.from(root.querySelectorAll(".userpm-messages-table tr[id^='ent']"));
for(const row of msgRows){
if(row.dataset._avatarInjected === "1") continue;
const link = row.querySelector('td:nth-child(2) a[href*="/index/8-0-"]');
const rRound = row.querySelector('.r_round');
if(link && rRound){
await insertAvatarOver(rRound, link.textContent.trim());
row.dataset._avatarInjected = "1";
await new Promise(r => setTimeout(r, CHECK_DELAY));
}
}

// Открытое письмо
const openPMs = Array.from(root.querySelectorAll('.userpm-message-table'));
for(const row of openPMs){
if(row.dataset._avatarInjected === "1") continue;
const userLink = row.querySelector('a[href*="/index/8-0-"]');
const target = row.querySelector('.userpm-message-subject') || row;
if(userLink && target){
await insertAvatarOver(target, userLink.textContent.trim());
row.dataset._avatarInjected = "1";
await new Promise(r => setTimeout(r, CHECK_DELAY));
}
}
}

async function init(){
await processContainers();

const table = document.querySelector('.userpm-messages-table');
if(table){
const obs = new MutationObserver(()=> setTimeout(()=>processContainers(), 200));
obs.observe(table, {childList:true, subtree:true});
}

const pmView = document.querySelector('.userpm-message-table');
if(pmView){
const obs2 = new MutationObserver(()=> setTimeout(()=>processContainers(), 200));
obs2.observe(document.body, {childList:true, subtree:true});
}
}

(function addStyles(){
const css = `
.avatarOverlay img { transition: transform .18s ease, opacity .18s ease; }
.avatarOverlay img:hover { transform: scale(1.06); }
`;
const st = document.createElement('style');
st.textContent = css;
document.head.appendChild(st);
})();

if(document.readyState === 'loading'){
document.addEventListener('DOMContentLoaded', init);
}else{
init();
}

})();
</script>




Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Понедельник, 13.10.2025, 18:11 | Сообщение # 2 | | Написал: Начинающий
Автор темы
Мурчанн не в сети
        Сообщений:101
         Регистрация:20.10.2016

Без Серёги Есенина ни один мозговой штурм не обходится - вдохновляет 12

Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Вторник, 14.10.2025, 07:39 | Сообщение # 3 | | Написал: Новичок
Razor не в сети
        Сообщений:18
         Регистрация:29.06.2013

Клевая песня 27

Razor

Напиши мне, что у тебя все хорошо, или я сама приеду в этом убедиться. Это не угроза, это обещание.
Дата: Вторник, 14.10.2025, 07:40 | Сообщение # 4 | | Написал: Новичок
Messi не в сети
        Сообщений:25
         Регистрация:15.03.2024

Это еще первая версия скрипта , для первого раза ничего так вышло 2

Messi

Ме́сси аргентинский футболист, нападающий футбольного клуба «Барселона», с 2011 года капитан национальной сборной Аргентины. Лучший бомбардир в истории «Барселоны» и сборной Аргентины. Считается одним из лучших футболистов современности и одним из лучшиx игроков всеx времён.
Дата: Среда, 15.10.2025, 07:57 | Сообщение # 5 | | Написал: Новичок
Maxon не в сети
        Сообщений:5
         Регистрация:16.05.2024

Со светлыми тонами нужна страница с сообщениями и не помешало бы добавить классы там где новые сообщения добавляются , привязать их к классам к непрочитанным сообщениям , там настроены шрифты или добавить новые.

Нужна новая версия страницы с сообщениями. 12

Maxon

Сообщение отредактировал Maxon - Среда, 15.10.2025, 07:57
Теперь я понимаю, что когда люди любят друг друга, они помнят все, и если они остаются вместе, то не потому что они забывают, а потому что они прощают.
Дата: Среда, 15.10.2025, 07:59 | Сообщение # 6 | | Написал: Новичок
Maxon не в сети
        Сообщений:5
         Регистрация:16.05.2024

Не помешало бы сделать более информативную страницу ,
колонку друзей например - справой стороны . 6

Maxon

Сообщение отредактировал Maxon - Среда, 15.10.2025, 08:00
Теперь я понимаю, что когда люди любят друг друга, они помнят все, и если они остаются вместе, то не потому что они забывают, а потому что они прощают.
  • Страница 1 из 1
  • 1
Поиск: