// ==UserScript== // @name Versions 4pda // @namespace http://4pda.ru/forum/index.php // @version 1.4.1 // @description:ru Вывод версий приложений в Избранном 4pda, показ обновленных приложений // @author Azat-777 // @icon http://s.4pda.to/kkRM7z1nbI3gbG5E7r0a561qtdKnE2GlKhz1ipnv.png // @match http*://4pda.ru/forum/index.php?act=fav* // @match http*://4pda.ru/forum/index.php?showtopic=* // @grant GM_xmlhttpRequest // @history:ru 26.07.2017: допиливание мелочей // @history:ru 31.07.2017: расширение функционала скрипта: подробная информация о каждом пользователе в топиках // @history:ru 04.08.2017: добавлено мигание 'NEW' // @history:ru 02.01.2018: небольшие правки кода // @history:ru 10.05.2018: изменение списка обновленных приложений // @history:ru 11.05.2018: мелкие правки и исправления // @history:ru 20.05.2018: добавлено удаление пробелов в начале и конце названий версий, чтобы из-за пробелов версия не определялась как новая // @history:ru 16.08.2018: теперь обновления не исчезают с обновлением страницы, для ручного скрытия обновлений добавлена кнопка // @history:ru 17.08.2018: правка вчерашних ошибок, добавление мелочей (title и переход к последнему непрочитанному сообщению в теме // @history:ru 17.08.2018: обновленного приложения); реализация скрытия обновлений по одному: убрад мигание NEW для обновлений, т.к. уже неактуально // @history:ru 20.08.2018: починен показ кнопки скрытия отдельного обновления; в консоли выводится объем загруженого XHR-запросами траффика // @history:ru 06.05.2019: кроме слова 'версия' другой текст, если он был, не удалялся, поправлено // @history:ru 01.06.2019: слово 'версия' не заменялось на 'v.', если после него не было пробела. Недоработка в регулярках. Поправлено // @description Вывод версий приложений в Избранном 4pda, показ обновленных приложений // @downloadURL none // ==/UserScript== (function() { 'use strict'; //============================================================ // получение ссылки текущей страницы var URL = window.document.URL; //console.log(URL); //============================================================ // удаляем рекламу и центрируем логотип 4pda var tbody = document.getElementsByTagName('tbody')[0], td = tbody.getElementsByTagName('td'); td[1].remove(); td[0].align = 'center'; //============================================================ var favURL = '4pda.ru/forum/index.php?act=fav', i, head = document.getElementsByTagName('head')[0]; //var topicURL = 'http://4pda.ru/forum/index.php?showtopic='; // спойлер с объявлениями всегда скрыт if(document.querySelector('#gc_1, #go_1')) { document.querySelector('#go_1').style.display = 'none'; document.querySelector('#gc_1').style.display = 'none'; } var l = 0, // счетчик totalKB = 0, totalMB = 0; // Избранное if (~URL.indexOf(favURL)) { //localStorage //localStorage.clear(); //============================================================ // добавление в строке названий приложений их версий var ver; // находим таблицу var tbl = document.getElementsByClassName('ipbtable')[0]; var tbody2 = tbl.getElementsByTagName('tbody')[0]; var _tr = tbody2.getElementsByTagName('tr'); // запихиваем в tr нужные нам строки таблицы var tr = []; for(i=0; i<_tr.length; i++) { if (_tr[i].hasAttribute('data-item-fid')) // отсортировываем из таблицы только темы tr.push(_tr[i]); // запихиваем в массив tr } var trLength = tr.length var name = []; // названия тем for (i=0; i')) { replace_ver = replace_ver.toLowerCase().replace(/[А-Яа-я\s]*верси[ия]:[\s]*/, 'v.').replace(/<[\/]*b[r]*>/g, '').trim(); alt_ver = replace_ver; var alt_name; alt_name = name[i].innerHTML.replace(/<[\/]*strong>/g, ''); // сравнение версий: текущей полученной и сохраненной в локальном хранилище if (alt_ver.localeCompare(localStorage.getItem(alt_name)) !== 0) { showNotif(alt_name, alt_ver); } } // если тема была открыта и просмотрена else { replace_ver = replace_ver.toLowerCase().replace(/[А-Яа-я\s]*верси[ия]:[\s]*/, 'v.').replace(/<[\/]*b>/g, '').trim(); alt_ver = replace_ver; if (replace_ver.localeCompare(localStorage.getItem(name[i].innerHTML)) !== 0) { showNotif(name[i].innerHTML, alt_ver); } } // вывод обновленных приложений вверху function showNotif(alt_name, alt_ver) { hideBtn.style.display = 'inline'; // показываем скрытую кнопку, если есть обновления //replace_ver += _new; // прибавляем тэг 'NEW' для новой версии count++; var goto = '>N ' app_name = goto + ''+alt_name + ''; saveToHideName.push(alt_name); saveToHideVer.push(alt_ver); showUpdates(app_name, alt_ver); } replace_ver = ' ' + replace_ver + ''; // добавление цвета для наглядности name[i].innerHTML += replace_ver; } break; } } break; } } } } }; xhr.onerror = function() { console.log('onerror'); alert('Ошибка'); }; xhr.onloadend = function(event) { //console.log('onloadend'); totalKB += (event.loaded/1024); // подсчет загруженного траффика totalMB += (event.loaded/1024/1024); if(++l === trLength) { addEvent(); // вешаем обработчик событий строки (появление/скрытие кноки "Скрыть") hideApp(); // скрытие строки с обновленным приложением console.log('Скачано XHR-запросами:', totalKB.toFixed(2), 'КБ |', totalMB.toFixed(2), 'МБ'); // вывод объема скачанного } }; xhr.onprogress = function(event) { //console.log('onprogress'); }; } // переопределяем стиль для кнопок var btnStyle = document.createElement('style'); btnStyle.type = 'text/css'; var _s = ` .myBtn { display: inline-block; font-family: arial,sans-serif; font-size: 10px; font-weight: bold; color: rgb(68,68,68); text-decoration: none; user-select: none; padding: .1em 1.2em; outline: none; border: 1px solid rgba(0,0,0,.1); border-radius: 2px; background: rgb(245,245,245) linear-gradient(#f4f4f4, #f1f1f1); transition: all .218s ease 0s; } .myBtn:hover { color: rgb(24,24,24); border: 1px solid rgb(198,198,198); background: #f7f7f7 linear-gradient(#f7f7f7, #f1f1f1); box-shadow: 0 1px 2px rgba(0,0,0,.1); } .myBtn:active { color: rgb(51,51,51); border: 1px solid rgb(204,204,204); background: rgb(238,238,238) linear-gradient(rgb(238,238,238), rgb(224,224,224)); box-shadow: 0 1px 2px rgba(0,0,0,.1) inset; }`; var _st = document.createTextNode(_s); btnStyle.appendChild(_st); head.appendChild(btnStyle); navstrip.appendChild(_span); _span.innerHTML = '

Обновлений: ' + '' + count + '
' + `
# Название Версия
`; var _tbl = document.querySelector('#_tbl'), _tbody = _tbl.querySelector('tbody'), _cnt = document.querySelector('#_cnt'), n = 0; _tbl.style.display = 'none'; var tblStyle = document.createElement('style'); tblStyle.type = 'text/css'; var s = ` #_tbl th { color: brown; background-color: white; text-align: center; padding: 2px; letter-spacing: 0px; } #_tbl td { font-size: 10px; padding: 0 5px; } #_tbl .one, .two { border-right: 1px solid }`; var st = document.createTextNode(s); tblStyle.appendChild(st); head.appendChild(tblStyle); // кнопка скрытия обновлений вручную var hideBtn = document.querySelector('#hideBtn'); hideBtn.onclick = function() { hideBtn.style.display = 'none'; // сразу сохраняем обновленные версии в память, чтобы при следующем обновлении не всплыли в таблице обновлений for(var i=0; i 0;) { _tbl.deleteRow(1); } } // показ количества обновлений и вывод их в таблице function showUpdates(app_name, ver) { _tbl.style.display = 'block'; n++; var row = _tbody.insertRow(-1), cell1 = row.insertCell(-1), cell2 = row.insertCell(-1), cell3 = row.insertCell(-1), cell4 = row.insertCell(-1); row.className = 'myTr'; cell1.className = 'one'; cell2.className = 'two'; cell1.innerHTML = n; _cnt.innerHTML = count; cell2.innerHTML = app_name; cell3.innerHTML = ver; cell4.innerHTML = ''; } function addEvent() { var myTr = document.querySelectorAll('.myTr'); for(var i=0; i center'), userLink = document.getElementsByClassName('normalname'), link = [], // собираем все ссылки на профили ulLength = userLink.length; for (i=0; i]+>/g,'').replace(/(Город:)/, '$1 ').replace(/(юзера:)/, '$1 ').replace(/(рождения:)/, '$1 ') + '
'; } insertData(tt, i); } } }; xhr.onerror = function() { console.log('error'); alert('Ошибка'); }; xhr.onloadend = function(event) { //console.log('onloadend'); totalKB += (event.loaded/1024); // подсчет загруженного траффика totalMB += (event.loaded/1024/1024); if(++l === ulLength) { console.log('Скачано XHR-запросами:', totalKB.toFixed(2), 'КБ |', totalMB.toFixed(2), 'МБ'); // вывод объема скачанного } }; } //========================================================================== function insertData(data0, i) { div.innerHTML = data0; post[i].appendChild(div.cloneNode(true)); } } })();