Загрузка...

Расширение для удобных, быстрых и выгодных обменов в P2P разделе

Тема в разделе Дополнения создана пользователем APT29388 Пятница в 19:34. (поднята Вчера, в 11:10) 243 просмотра

Загрузка...
  1. APT29388
    APT29388 Автор темы Пятница в 19:34 Лучшие аккаунты тг - lolz.live/threads/8322738/ :admin:
    [IMG]

    Как поставить?
    1) Качаете Tampermonkey
    2) Включаете режим разработчика в браузере
    3) Нажимаете на него
    4) Нажимаете Создать новый скрипт
    5) Копируете туда скрипт
    6) Файл -> Сохранить

    JS
    // ==UserScript== // @name Lolz P2P Фильтр обменов // @namespace http://tampermonkey.net/ // @version 1.0 // @description Фильтрация P2P обменов на Lolz.live с возможностью выбора направлений и процентов // @author APT29388 // @match https://lolz.live/forums/1001/* // @grant none // ==/UserScript== (function() { 'use strict'; const styles = ` .p2p-filter-container { background-color: #1c1c1c; border: 1px solid #242424; border-radius: 10px; padding: 15px; margin-bottom: 15px; color: #d6d6d6; } .p2p-filter-title { font-size: 16px; font-weight: bold; margin-bottom: 10px; color: #00ba78; } .p2p-filter-section { margin-bottom: 15px; } .p2p-filter-section:not(:last-child) { border-bottom: 1px solid #333; padding-bottom: 15px; margin-bottom: 20px; } .p2p-filter-section-title { font-size: 14px; font-weight: bold; margin-bottom: 5px; display: flex; align-items: center; } .p2p-filter-section-title .direction-icon { margin: 0 5px; color: #00ba78; } .p2p-filter-options { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 10px; } .p2p-filter-checkbox { display: flex; align-items: center; margin-right: 10px; } .p2p-filter-checkbox input { margin-right: 5px; } .p2p-filter-percent { display: flex; align-items: center; margin-top: 5px; } .p2p-filter-percent input { width: 60px; margin: 0 5px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .p2p-filter-button { background-color: #00ba78; color: #fff; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer; font-weight: bold; margin-right: 10px; } .p2p-filter-button:hover { background-color: #008c5a; } .p2p-filter-reset { background-color: #444; color: #fff; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer; font-weight: bold; } .p2p-filter-reset:hover { background-color: #555; } .p2p-highlight { border-left: 3px solid #00ba78 !important; } .p2p-filter-info { font-size: 12px; color: #888; margin-top: 5px; } .p2p-filter-example { background-color: #242424; padding: 5px 10px; border-radius: 5px; margin-top: 5px; font-size: 12px; } .p2p-filter-example-good { color: #00ba78; } .p2p-filter-example-bad { color: #ff5555; text-decoration: line-through; } .p2p-filter-actions { margin-top: 15px; } .p2p-filter-auto-refresh { display: flex; align-items: center; gap: 15px; margin-bottom: 5px; } .p2p-filter-interval { display: flex; align-items: center; } .p2p-filter-interval input { width: 60px; margin: 0 5px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .p2p-filter-button-small { padding: 5px 10px; font-size: 12px; margin-left: 10px; } `; const styleElement = document.createElement('style'); styleElement.textContent = styles; document.head.appendChild(styleElement); const banks = ['Тинькофф', 'СБП', 'Сбербанк', 'Юмани', 'Альфа-Банк']; function createFilterHTML() { return ` <div class="p2p-filter-container"> <div class="p2p-filter-title">Фильтр P2P обменов</div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Банк</span> <span class="direction-icon"></span> <span>Маркет (пополнение маркета)</span> </div> <div class="p2p-filter-options" id="bank-to-market"> ${banks.map(bank => ` <div class="p2p-filter-checkbox"> <input type="checkbox" id="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}"> <label for="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label> </div> `).join('')} </div> <div class="p2p-filter-percent"> <label for="bank-to-market-percent">Максимальный процент:</label> <input type="number" id="bank-to-market-percent" value="3" min="-10" max="20" step="0.5"> <span>%</span> </div> </div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Маркет</span> <span class="direction-icon"></span> <span>Банк (вывод с маркета)</span> </div> <div class="p2p-filter-options" id="market-to-bank"> ${banks.map(bank => ` <div class="p2p-filter-checkbox"> <input type="checkbox" id="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}"> <label for="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label> </div> `).join('')} </div> <div class="p2p-filter-percent"> <label for="market-to-bank-percent">Минимальный процент:</label> <input type="number" id="market-to-bank-percent" value="5" min="0" max="20" step="0.5"> <span>%</span> </div> </div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Автообновление ленты</span> </div> <div class="p2p-filter-auto-refresh"> <div class="p2p-filter-checkbox"> <input type="checkbox" id="auto-refresh-enabled"> <label for="auto-refresh-enabled">Включить автообновление</label> </div> <div class="p2p-filter-interval"> <label for="auto-refresh-interval">Интервал (сек):</label> <input type="number" id="auto-refresh-interval" value="30" min="5" max="300" step="1"> </div> <button id="save-auto-refresh" class="p2p-filter-button p2p-filter-button-small">Сохранить</button> </div> <div class="p2p-filter-info"> Автоматически нажимает кнопку "Обновить ленту" с указанным интервалом </div> </div> <div class="p2p-filter-actions"> <button id="apply-filter" class="p2p-filter-button">Применить фильтр</button> <button id="reset-filter" class="p2p-filter-reset">Сбросить</button> </div> </div> `; } function checkThreadMatchesFilter(threadTitle, selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent) { let marketAmount = null; let bankAmount = null; let direction = null; const bracketMatch = threadTitle.match(/\[(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\s*>\s*(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\]/i); const marketToBankMatch = threadTitle.match(/(?:Маркет|Market|LZT|Lolz)\s*(?:>|→|-)\s*(Тинькофф|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa)/i); const bankToMarketMatch = threadTitle.match(/(Тинькофф|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa)\s*(?:>|→|-)\s*(?:Маркет|Market|LZT|Lolz)/i); if (marketToBankMatch) { direction = 'market-to-bank'; const bank = marketToBankMatch[1]; const bankMatches = selectedBanksMarketToBank.some(selectedBank => bank.toLowerCase().includes(selectedBank.toLowerCase()) || selectedBank.toLowerCase().includes(bank.toLowerCase()) ); if (!bankMatches || selectedBanksMarketToBank.length === 0) { return false; } if (bracketMatch) { const firstAmount = parseFloat(bracketMatch[1].replace(',', '.')); const secondAmount = parseFloat(bracketMatch[2].replace(',', '.')); marketAmount = firstAmount; bankAmount = secondAmount; const percent = (marketAmount - bankAmount) / (marketAmount / 100); return percent >= marketToBankPercent; } return true; } else if (bankToMarketMatch) { direction = 'bank-to-market'; const bank = bankToMarketMatch[1]; const bankMatches = selectedBanksBankToMarket.some(selectedBank => bank.toLowerCase().includes(selectedBank.toLowerCase()) || selectedBank.toLowerCase().includes(bank.toLowerCase()) ); if (!bankMatches || selectedBanksBankToMarket.length === 0) { return false; } if (bracketMatch) { const firstAmount = parseFloat(bracketMatch[1].replace(',', '.')); const secondAmount = parseFloat(bracketMatch[2].replace(',', '.')); bankAmount = firstAmount; marketAmount = secondAmount; const percent = (marketAmount - bankAmount) / (bankAmount / 100); return percent <= bankToMarketPercent; } return true; } return false; } function applyFilterToThreads(selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent) { const threads = document.querySelectorAll('.discussionListItem'); threads.forEach(thread => { const titleElement = thread.querySelector('.spanTitle'); if (!titleElement) return; const threadTitle = titleElement.textContent.trim(); const matches = checkThreadMatchesFilter( threadTitle, selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent ); if (matches) { thread.style.display = 'block'; thread.classList.add('p2p-highlight'); } else { thread.style.display = 'none'; thread.classList.remove('p2p-highlight'); } }); } function applyFilter() { const selectedBanksMarketToBank = []; document.querySelectorAll('#market-to-bank input:checked').forEach(checkbox => { selectedBanksMarketToBank.push(checkbox.value); }); const selectedBanksBankToMarket = []; document.querySelectorAll('#bank-to-market input:checked').forEach(checkbox => { selectedBanksBankToMarket.push(checkbox.value); }); const marketToBankPercent = parseFloat(document.getElementById('market-to-bank-percent').value); const bankToMarketPercent = parseFloat(document.getElementById('bank-to-market-percent').value); if (selectedBanksMarketToBank.length === 0 && selectedBanksBankToMarket.length === 0) { resetFilter(); return; } applyFilterToThreads( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent ); saveFilterSettings( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent ); } function saveFilterSettings(selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent) { const settings = { marketToBank: selectedBanksMarketToBank, bankToMarket: selectedBanksBankToMarket, marketToBankPercent: marketToBankPercent, bankToMarketPercent: bankToMarketPercent }; localStorage.setItem('p2pFilterSettings', JSON.stringify(settings)); } function loadFilterSettings() { const settingsJson = localStorage.getItem('p2pFilterSettings'); if (!settingsJson) return null; try { return JSON.parse(settingsJson); } catch (e) { return null; } } function resetFilter() { document.querySelectorAll('.p2p-filter-checkbox input').forEach(checkbox => { checkbox.checked = false; }); document.getElementById('market-to-bank-percent').value = 5; document.getElementById('bank-to-market-percent').value = 3; const threads = document.querySelectorAll('.discussionListItem'); threads.forEach(thread => { thread.style.display = 'block'; thread.classList.remove('p2p-highlight'); }); localStorage.removeItem('p2pFilterSettings'); } function applyFilterSettings(settings) { if (!settings) return; settings.marketToBank.forEach(bank => { const checkbox = document.getElementById(`market-to-${bank.toLowerCase().replace(/\s+/g, '-')}`); if (checkbox) checkbox.checked = true; }); settings.bankToMarket.forEach(bank => { const checkbox = document.getElementById(`bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}`); if (checkbox) checkbox.checked = true; }); document.getElementById('market-to-bank-percent').value = settings.marketToBankPercent; document.getElementById('bank-to-market-percent').value = settings.bankToMarketPercent; applyFilterToThreads( settings.marketToBank, settings.bankToMarket, settings.marketToBankPercent, settings.bankToMarketPercent ); } function autoLoadAllThreads() { return new Promise((resolve) => { const maxScrollAttempts = 30; let scrollAttempts = 0; let noNewThreadsCounter = 0; const checkAllResultsShowing = () => { return document.querySelector('.AllResultsShowing') !== null; }; const scrollDown = () => { window.scrollTo(0, document.body.scrollHeight); }; const checkIfLoading = () => { const loadingIndicator = document.querySelector('.loading'); return loadingIndicator && loadingIndicator.style.display !== 'none'; }; let previousThreadCount = 0; const checkForNewThreads = () => { const currentThreadCount = document.querySelectorAll('.discussionListItem').length; const hasNewThreads = currentThreadCount > previousThreadCount; previousThreadCount = currentThreadCount; return hasNewThreads; }; const loadMoreThreads = () => { scrollAttempts++; if (scrollAttempts > maxScrollAttempts || checkAllResultsShowing()) { console.log('Загрузка завершена, всего тем: ' + previousThreadCount); resolve(); return; } if (checkIfLoading()) { setTimeout(loadMoreThreads, 500); return; } scrollDown(); setTimeout(() => { if (checkForNewThreads()) { noNewThreadsCounter = 0; loadMoreThreads(); } else if (checkIfLoading()) { loadMoreThreads(); } else { noNewThreadsCounter++; if (noNewThreadsCounter >= 3) { console.log('Загрузка завершена после ' + scrollAttempts + ' попыток, всего тем: ' + previousThreadCount); resolve(); } else { setTimeout(loadMoreThreads, 1000); } } }, 1000); }; loadMoreThreads(); }); } let autoRefreshInterval = null; function toggleAutoRefresh() { const isEnabled = document.getElementById('auto-refresh-enabled').checked; const intervalSeconds = parseInt(document.getElementById('auto-refresh-interval').value) || 30; if (autoRefreshInterval) { clearInterval(autoRefreshInterval); autoRefreshInterval = null; } if (isEnabled && intervalSeconds >= 5) { autoRefreshInterval = setInterval(() => { const refreshButton = document.querySelector('.UpdateFeedButton'); if (refreshButton) { if (window.getComputedStyle(refreshButton).display !== 'none') { refreshButton.click(); console.log('Лента обновлена автоматически'); } else { console.log('Кнопка обновления ленты скрыта, пропускаем обновление'); } } else { console.log('Кнопка обновления ленты не найдена'); } }, intervalSeconds * 1000); console.log(`Автообновление ленты включено с интервалом ${intervalSeconds} сек`); } else { console.log('Автообновление ленты выключено'); } saveAutoRefreshSettings(isEnabled, intervalSeconds); } function saveAutoRefreshSettings(isEnabled, intervalSeconds) { localStorage.setItem('p2pAutoRefreshEnabled', isEnabled); localStorage.setItem('p2pAutoRefreshInterval', intervalSeconds); } function loadAutoRefreshSettings() { const isEnabled = localStorage.getItem('p2pAutoRefreshEnabled') === 'true'; const intervalSeconds = parseInt(localStorage.getItem('p2pAutoRefreshInterval')) || 30; return { isEnabled, intervalSeconds }; } function applyAutoRefreshSettings() { const settings = loadAutoRefreshSettings(); const enabledCheckbox = document.getElementById('auto-refresh-enabled'); const intervalInput = document.getElementById('auto-refresh-interval'); if (enabledCheckbox && intervalInput) { enabledCheckbox.checked = settings.isEnabled; intervalInput.value = settings.intervalSeconds; if (settings.isEnabled) { toggleAutoRefresh(); } } } function saveAndApplyAutoRefresh() { const isEnabled = document.getElementById('auto-refresh-enabled').checked; const intervalSeconds = parseInt(document.getElementById('auto-refresh-interval').value) || 30; if (intervalSeconds < 5) { alert('Минимальный интервал - 5 секунд'); document.getElementById('auto-refresh-interval').value = 5; return; } if (intervalSeconds > 300) { alert('Максимальный интервал - 300 секунд'); document.getElementById('auto-refresh-interval').value = 300; return; } saveAutoRefreshSettings(isEnabled, intervalSeconds); toggleAutoRefresh(); alert(`Настройки автообновления сохранены. ${isEnabled ? `Интервал: ${intervalSeconds} сек.` : 'Автообновление выключено.'}`); } function initFilter() { const container = document.querySelector('.aboveThreadList'); if (!container) return; const filterElement = document.createElement('div'); filterElement.innerHTML = createFilterHTML(); container.appendChild(filterElement); document.getElementById('apply-filter').addEventListener('click', applyFilter); document.getElementById('reset-filter').addEventListener('click', resetFilter); document.getElementById('save-auto-refresh').addEventListener('click', saveAndApplyAutoRefresh); autoLoadAllThreads().then(() => { const settings = loadFilterSettings(); if (settings) { applyFilterSettings(settings); } applyAutoRefreshSettings(); }); setupDynamicThreadsObserver(); } function setupDynamicThreadsObserver() { const observer = new MutationObserver(mutations => { let newThreadsAdded = false; mutations.forEach(mutation => { if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { mutation.addedNodes.forEach(node => { if (node.nodeType === 1 && node.classList.contains('discussionListItem')) { newThreadsAdded = true; } }); } }); if (newThreadsAdded) { const settings = loadFilterSettings(); if (settings) { applyFilterToThreads( settings.marketToBank, settings.bankToMarket, settings.marketToBankPercent, settings.bankToMarketPercent ); } } }); const discussionList = document.querySelector('.discussionList'); if (discussionList) { observer.observe(discussionList, { childList: true, subtree: true }); } } setTimeout(initFilter, 1000); })();
    ЭТО НЕ ОКОНЧАТЕЛЬНАЯ ВЕРСИЯ СКРИПТА, НО 1 КОНТРОЛЬНАЯ ТОЧКА, ПОЭТОМУ СОВЕТУЮ СЛЕДИТЬ ЗА ЕГО ОБНОВЛЕНИЯМИ, ЧТОБЫ ПОПОЛНИТЬ ДЕП НА 10К, ЗАПУСТИТЬ СКРИПТ И ПОЛУЧАТЬ ПРОФИТ

    P.S. я говнокодер на js, поэтому мне похуй

    Последние и актуальные обновления скрипта будут всегда висеть в закрепе темы

    Если у вам есть какие то вопросы по его работе, то не стесняйтесь и пишите мне в ТГ - Telegram: APT29388
     
    Пятница в 19:34 Изменено
    1. APT29388 Автор темы
      3645383, момент иметтся
    2. 3645383
      APT29388, написал 700 строчек на жс = говнокодер по твоему, зря ты так :despair: :obdance:
  2. APT29388
    APT29388 Автор темы Вчера, в 12:59 Лучшие аккаунты тг - lolz.live/threads/8322738/ :admin:
    ОБНОВЛЕНИЕ:
    Добавлены добавочный текст к предложению обмена и расчёт для тем с CryptoBot
    [IMG]

    JS
    // ==UserScript== // @name Lolz P2P Фильтр обменов // @namespace http://tampermonkey.net/ // @version 1.0 // @description Фильтрация P2P обменов на Lolz.live с возможностью выбора направлений и процентов // @author APT29388 // @match https://lolz.live/forums/1001/* // @grant none // ==/UserScript== (function() { 'use strict'; const styles = ` .p2p-filter-container { background-color: #1c1c1c; border: 1px solid #242424; border-radius: 10px; padding: 15px; margin-bottom: 15px; color: #d6d6d6; } .p2p-filter-title { font-size: 16px; font-weight: bold; margin-bottom: 10px; color: #00ba78; } .p2p-filter-section { margin-bottom: 15px; } .p2p-filter-section:not(:last-child) { border-bottom: 1px solid #333; padding-bottom: 15px; margin-bottom: 20px; } .p2p-filter-section-title { font-size: 14px; font-weight: bold; margin-bottom: 5px; display: flex; align-items: center; } .p2p-filter-section-title .direction-icon { margin: 0 5px; color: #00ba78; } .p2p-filter-options { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 10px; } .p2p-filter-checkbox { display: flex; align-items: center; margin-right: 10px; } .p2p-filter-checkbox input { margin-right: 5px; } .p2p-filter-percent { display: flex; align-items: center; margin-top: 5px; } .p2p-filter-percent input { width: 60px; margin: 0 5px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .p2p-filter-button { background-color: #00ba78; color: #fff; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer; font-weight: bold; margin-right: 10px; } .p2p-filter-button:hover { background-color: #008c5a; } .p2p-filter-reset { background-color: #444; color: #fff; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer; font-weight: bold; } .p2p-filter-reset:hover { background-color: #555; } .p2p-highlight { border-left: 3px solid #00ba78 !important; } .p2p-filter-info { font-size: 12px; color: #888; margin-top: 5px; } .p2p-filter-example { background-color: #242424; padding: 5px 10px; border-radius: 5px; margin-top: 5px; font-size: 12px; } .p2p-filter-example-good { color: #00ba78; } .p2p-filter-example-bad { color: #ff5555; text-decoration: line-through; } .p2p-filter-actions { margin-top: 15px; } .p2p-filter-auto-refresh { display: flex; align-items: center; gap: 15px; margin-bottom: 5px; } .p2p-filter-interval { display: flex; align-items: center; } .p2p-filter-interval input { width: 60px; margin: 0 5px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .p2p-filter-button-small { padding: 5px 10px; font-size: 12px; margin-left: 10px; } .p2p-filter-amount { display: flex; align-items: center; margin-top: 10px; gap: 10px; } .p2p-filter-amount input { width: 80px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .quick-offer-button { background-color: #00ba78; color: #fff; border: none; padding: 3px 6px; border-radius: 3px; cursor: pointer; font-size: 11px; margin-right: 5px; display: inline-flex; align-items: center; opacity: 1 !important; } .quick-offer-button:hover { background-color: #008c5a; } .quick-offer-button i { margin-right: 0; } .discussionListItem .controls { opacity: 1 !important; } /* Стили для настройки дополнительного текста */ .p2p-filter-custom-message { margin-top: 10px; } .p2p-filter-custom-message textarea { width: 100%; height: 40px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; padding: 5px; margin-top: 5px; resize: vertical; font-size: 12px; line-height: 1.3; } .p2p-filter-custom-message .p2p-filter-button-small { padding: 3px 8px; font-size: 11px; margin-top: 3px; } .p2p-filter-custom-message .p2p-filter-info { font-size: 11px; margin-top: 3px; opacity: 0.8; } `; const styleElement = document.createElement('style'); styleElement.textContent = styles; document.head.appendChild(styleElement); const banks = ['Т-Банк', 'СБП', 'Сбербанк', 'Юмани', 'Альфа-Банк', 'CryptoBot']; function getDefaultSettings() { return { marketToBank: true, bankToMarket: true, tinkoff: true, sbp: true, sber: true, yoomoney: true, alpha: true, marketToBankPercent: 5, bankToMarketPercent: 3, autoRefresh: false, refreshInterval: 30, marketToBankMinAmount: 0, marketToBankMaxAmount: 0, bankToMarketMinAmount: 0, bankToMarketMaxAmount: 0 }; } let settings = loadFilterSettings() || getDefaultSettings(); function createFilterHTML() { return ` <div class="p2p-filter-container"> <div class="p2p-filter-title">Фильтр P2P обменов</div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Банк</span> <span class="direction-icon"></span> <span>Маркет (пополнение маркета)</span> </div> <div class="p2p-filter-options" id="bank-to-market"> ${banks.map(bank => ` <div class="p2p-filter-checkbox"> <input type="checkbox" id="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}"> <label for="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label> </div> `).join('')} </div> <div class="p2p-filter-percent"> <label for="bank-to-market-percent">Максимальный процент:</label> <input type="number" id="bank-to-market-percent" value="3" min="-10" max="20" step="0.5"> <span>%</span> </div> <div class="p2p-filter-amount"> <label for="bank-to-market-min-amount">Сумма от:</label> <input type="number" id="bank-to-market-min-amount" value="0" min="0"> <label for="bank-to-market-max-amount">до:</label> <input type="number" id="bank-to-market-max-amount" value="0" min="0"> <span class="p2p-filter-info">(0 = без ограничений)</span> </div> </div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Маркет</span> <span class="direction-icon"></span> <span>Банк (вывод с маркета)</span> </div> <div class="p2p-filter-options" id="market-to-bank"> ${banks.map(bank => ` <div class="p2p-filter-checkbox"> <input type="checkbox" id="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}"> <label for="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label> </div> `).join('')} </div> <div class="p2p-filter-percent"> <label for="market-to-bank-percent">Минимальный процент:</label> <input type="number" id="market-to-bank-percent" value="5" min="0" max="20" step="0.5"> <span>%</span> </div> <div class="p2p-filter-amount"> <label for="market-to-bank-min-amount">Сумма от:</label> <input type="number" id="market-to-bank-min-amount" value="0" min="0"> <label for="market-to-bank-max-amount">до:</label> <input type="number" id="market-to-bank-max-amount" value="0" min="0"> <span class="p2p-filter-info">(0 = без ограничений)</span> </div> </div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Автообновление ленты</span> </div> <div class="p2p-filter-auto-refresh"> <div class="p2p-filter-checkbox"> <input type="checkbox" id="auto-refresh-enabled"> <label for="auto-refresh-enabled">Включить автообновление</label> </div> <div class="p2p-filter-interval"> <label for="auto-refresh-interval">Интервал (сек):</label> <input type="number" id="auto-refresh-interval" value="30" min="5" max="300" step="1"> </div> <button id="save-auto-refresh" class="p2p-filter-button p2p-filter-button-small">Сохранить</button> </div> <div class="p2p-filter-info"> Автоматически нажимает кнопку "Обновить ленту" с указанным интервалом </div> </div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Текст сообщения</span> </div> <div class="p2p-filter-custom-message"> <label for="custom-message-text">Дополнительный текст:</label> <textarea id="custom-message-text" placeholder="Введите текст, который будет добавлен к стандартному сообщению"></textarea> <div class="p2p-filter-info"> Добавляется после "Здравствуйте, интересует обмен: [ссылка]" </div> <button id="save-custom-message" class="p2p-filter-button p2p-filter-button-small">Сохранить</button> </div> </div> <div class="p2p-filter-actions"> <button id="apply-filter" class="p2p-filter-button">Применить фильтр</button> <button id="reset-filter" class="p2p-filter-reset">Сбросить</button> </div> </div> `; } function checkThreadMatchesFilter( threadTitle, selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ) { let marketAmount = null; let bankAmount = null; let direction = null; const bracketMatch = threadTitle.match(/\[(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\s*>\s*(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\]/i); const marketToBankMatch = threadTitle.match(/(?:Маркет|Market|LZT|Lolz)\s*(?:>|→|-)\s*(Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa|CryptoBot|Crypto\s*Bot|крипто\s*бот)/i); const bankToMarketMatch = threadTitle.match(/(Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa|CryptoBot|Crypto\s*Bot|крипто\s*бот)\s*(?:>|→|-)\s*(?:Маркет|Market|LZT|Lolz)/i); if (marketToBankMatch) { direction = 'market-to-bank'; const bank = marketToBankMatch[1]; const bankMatches = selectedBanksMarketToBank.some(selectedBank => { if (selectedBank ===-Банк') { return /Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|Tinkoff/i.test(bank); } if (selectedBank === 'CryptoBot') { return /CryptoBot|Crypto\s*Bot|крипто\s*бот/i.test(bank); } return bank.toLowerCase().includes(selectedBank.toLowerCase()) || selectedBank.toLowerCase().includes(bank.toLowerCase()); }); if (!bankMatches || selectedBanksMarketToBank.length === 0) { return false; } if (bracketMatch) { const firstAmount = parseFloat(bracketMatch[1].replace(',', '.')); const secondAmount = parseFloat(bracketMatch[2].replace(',', '.')); marketAmount = firstAmount; bankAmount = secondAmount; const percent = (marketAmount - bankAmount) / (marketAmount / 100); if ((marketToBankMinAmount > 0 || marketToBankMaxAmount > 0) && marketAmount) { if (marketToBankMinAmount > 0 && marketAmount < marketToBankMinAmount) { return false; } if (marketToBankMaxAmount > 0 && marketAmount > marketToBankMaxAmount) { return false; } } return percent >= marketToBankPercent; } return true; } else if (bankToMarketMatch) { direction = 'bank-to-market'; const bank = bankToMarketMatch[1]; const bankMatches = selectedBanksBankToMarket.some(selectedBank => { if (selectedBank ===-Банк') { return /Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|Tinkoff/i.test(bank); } if (selectedBank === 'CryptoBot') { return /CryptoBot|Crypto\s*Bot|крипто\s*бот/i.test(bank); } return bank.toLowerCase().includes(selectedBank.toLowerCase()) || selectedBank.toLowerCase().includes(bank.toLowerCase()); }); if (!bankMatches || selectedBanksBankToMarket.length === 0) { return false; } if (bracketMatch) { const firstAmount = parseFloat(bracketMatch[1].replace(',', '.')); const secondAmount = parseFloat(bracketMatch[2].replace(',', '.')); bankAmount = firstAmount; marketAmount = secondAmount; const percent = (marketAmount - bankAmount) / (bankAmount / 100); if ((bankToMarketMinAmount > 0 || bankToMarketMaxAmount > 0) && bankAmount) { if (bankToMarketMinAmount > 0 && bankAmount < bankToMarketMinAmount) { return false; } if (bankToMarketMaxAmount > 0 && bankAmount > bankToMarketMaxAmount) { return false; } } return percent <= bankToMarketPercent; } return true; } return false; } function applyFilterToThreads( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ) { const threads = document.querySelectorAll('.discussionListItem'); threads.forEach(thread => { const titleElement = thread.querySelector('.spanTitle'); if (!titleElement) return; const threadTitle = titleElement.textContent.trim(); const shouldShow = checkThreadMatchesFilter( threadTitle, selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ); if (shouldShow) { thread.style.display = 'block'; thread.classList.add('p2p-highlight'); } else { thread.style.display = 'none'; thread.classList.remove('p2p-highlight'); } }); addQuickOfferButtons(); return threads.length; } function applyFilter() { const selectedBanksMarketToBank = []; const selectedBanksBankToMarket = []; document.querySelectorAll('#market-to-bank input[type="checkbox"]:checked').forEach(checkbox => { selectedBanksMarketToBank.push(checkbox.value); }); document.querySelectorAll('#bank-to-market input[type="checkbox"]:checked').forEach(checkbox => { selectedBanksBankToMarket.push(checkbox.value); }); const marketToBankPercent = parseFloat(document.getElementById('market-to-bank-percent').value); const bankToMarketPercent = parseFloat(document.getElementById('bank-to-market-percent').value); const marketToBankMinAmount = parseInt(document.getElementById('market-to-bank-min-amount').value) || 0; const marketToBankMaxAmount = parseInt(document.getElementById('market-to-bank-max-amount').value) || 0; const bankToMarketMinAmount = parseInt(document.getElementById('bank-to-market-min-amount').value) || 0; const bankToMarketMaxAmount = parseInt(document.getElementById('bank-to-market-max-amount').value) || 0; saveFilterSettings( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ); applyFilterToThreads( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ); } function saveFilterSettings( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ) { const settings = { marketToBank: selectedBanksMarketToBank, bankToMarket: selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount }; localStorage.setItem('p2pFilterSettings', JSON.stringify(settings)); } function loadFilterSettings() { const settingsJson = localStorage.getItem('p2pFilterSettings'); if (settingsJson) { const settings = JSON.parse(settingsJson); if (settings.marketToBankMinAmount === undefined) { settings.marketToBankMinAmount = 0; } if (settings.marketToBankMaxAmount === undefined) { settings.marketToBankMaxAmount = 0; } if (settings.bankToMarketMinAmount === undefined) { settings.bankToMarketMinAmount = 0; } if (settings.bankToMarketMaxAmount === undefined) { settings.bankToMarketMaxAmount = 0; } return settings; } return null; } function resetFilter() { document.querySelectorAll('.p2p-filter-checkbox input').forEach(checkbox => { checkbox.checked = false; }); document.getElementById('market-to-bank-percent').value = 5; document.getElementById('bank-to-market-percent').value = 3; const threads = document.querySelectorAll('.discussionListItem'); threads.forEach(thread => { thread.style.display = 'block'; thread.classList.remove('p2p-highlight'); }); localStorage.removeItem('p2pFilterSettings'); } function applyFilterSettings(settings) { if (!settings) return; settings.marketToBank.forEach(bank => { const checkbox = document.getElementById(`market-to-${bank.toLowerCase().replace(/\s+/g, '-')}`); if (checkbox) checkbox.check
     
  3. vrodefrik
    ебать спасибо
     
  4. Весть
    uncpfiae пора бы это со стороны форума реализовывать...
     
    1. Посмотреть предыдущие комментарии (2)
    2. Toil
      Весть,
      РайсМорган на нг отвечал, что планируют полностью переделать раздел p2p, но это процесс не быстрый. Мб вместе с этим и сделают все по красоте
    3. Весть
      Toil, я от надёжного источника слышал, что п2п вовсе закроют
  5. APT29388
    APT29388 Автор темы Вчера, в 11:08 Лучшие аккаунты тг - lolz.live/threads/8322738/ :admin:
    ОБНОВЛЕНИЕ:
    Добавлены фильтры "от/до" для каждого из направлений обменов и кнопка быстрой отправки предложения обмена

    [IMG]

    JS
    // ==UserScript== // @name P2P Фильтр обменов // @namespace http://tampermonkey.net/ // @version 1.0 // @description P2P // @author APT29388 // @match https://lolz.live/forums/1001/* // @grant none // ==/UserScript== (function() { 'use strict'; const styles = ` .p2p-filter-container { background-color: #1c1c1c; border: 1px solid #242424; border-radius: 10px; padding: 15px; margin-bottom: 15px; color: #d6d6d6; } .p2p-filter-title { font-size: 16px; font-weight: bold; margin-bottom: 10px; color: #00ba78; } .p2p-filter-section { margin-bottom: 15px; } .p2p-filter-section:not(:last-child) { border-bottom: 1px solid #333; padding-bottom: 15px; margin-bottom: 20px; } .p2p-filter-section-title { font-size: 14px; font-weight: bold; margin-bottom: 5px; display: flex; align-items: center; } .p2p-filter-section-title .direction-icon { margin: 0 5px; color: #00ba78; } .p2p-filter-options { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 10px; } .p2p-filter-checkbox { display: flex; align-items: center; margin-right: 10px; } .p2p-filter-checkbox input { margin-right: 5px; } .p2p-filter-percent { display: flex; align-items: center; margin-top: 5px; } .p2p-filter-percent input { width: 60px; margin: 0 5px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .p2p-filter-button { background-color: #00ba78; color: #fff; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer; font-weight: bold; margin-right: 10px; } .p2p-filter-button:hover { background-color: #008c5a; } .p2p-filter-reset { background-color: #444; color: #fff; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer; font-weight: bold; } .p2p-filter-reset:hover { background-color: #555; } .p2p-highlight { border-left: 3px solid #00ba78 !important; } .p2p-filter-info { font-size: 12px; color: #888; margin-top: 5px; } .p2p-filter-example { background-color: #242424; padding: 5px 10px; border-radius: 5px; margin-top: 5px; font-size: 12px; } .p2p-filter-example-good { color: #00ba78; } .p2p-filter-example-bad { color: #ff5555; text-decoration: line-through; } .p2p-filter-actions { margin-top: 15px; } .p2p-filter-auto-refresh { display: flex; align-items: center; gap: 15px; margin-bottom: 5px; } .p2p-filter-interval { display: flex; align-items: center; } .p2p-filter-interval input { width: 60px; margin: 0 5px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .p2p-filter-button-small { padding: 5px 10px; font-size: 12px; margin-left: 10px; } .p2p-filter-amount { display: flex; align-items: center; margin-top: 10px; gap: 10px; } .p2p-filter-amount input { width: 80px; padding: 5px; background-color: #242424; border: 1px solid #333; color: #d6d6d6; border-radius: 5px; } .quick-offer-button { background-color: #00ba78; color: #fff; border: none; padding: 3px 6px; border-radius: 3px; cursor: pointer; font-size: 11px; margin-right: 5px; display: inline-flex; align-items: center; opacity: 1 !important; transition: background-color 0.2s; } .quick-offer-button:hover { background-color: #008c5a; } .quick-offer-button i { margin-right: 3px; font-size: 10px; } .discussionListItem .controls { opacity: 1 !important; } `; const styleElement = document.createElement('style'); styleElement.textContent = styles; document.head.appendChild(styleElement); const banks = ['Тинькофф', 'СБП', 'Сбербанк', 'Юмани', 'Альфа-Банк']; function getDefaultSettings() { return { marketToBank: true, bankToMarket: true, tinkoff: true, sbp: true, sber: true, yoomoney: true, alpha: true, marketToBankPercent: 5, bankToMarketPercent: 3, autoRefresh: false, refreshInterval: 30, marketToBankMinAmount: 0, marketToBankMaxAmount: 0, bankToMarketMinAmount: 0, bankToMarketMaxAmount: 0 }; } let settings = loadFilterSettings() || getDefaultSettings(); function createFilterHTML() { return ` <div class="p2p-filter-container"> <div class="p2p-filter-title">Фильтр P2P обменов</div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Банк</span> <span class="direction-icon"></span> <span>Маркет (пополнение маркета)</span> </div> <div class="p2p-filter-options" id="bank-to-market"> ${banks.map(bank => ` <div class="p2p-filter-checkbox"> <input type="checkbox" id="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}"> <label for="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label> </div> `).join('')} </div> <div class="p2p-filter-percent"> <label for="bank-to-market-percent">Максимальный процент:</label> <input type="number" id="bank-to-market-percent" value="3" min="-10" max="20" step="0.5"> <span>%</span> </div> <div class="p2p-filter-amount"> <label for="bank-to-market-min-amount">Сумма от:</label> <input type="number" id="bank-to-market-min-amount" value="0" min="0"> <label for="bank-to-market-max-amount">до:</label> <input type="number" id="bank-to-market-max-amount" value="0" min="0"> <span class="p2p-filter-info">(0 = без ограничений)</span> </div> </div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Маркет</span> <span class="direction-icon"></span> <span>Банк (вывод с маркета)</span> </div> <div class="p2p-filter-options" id="market-to-bank"> ${banks.map(bank => ` <div class="p2p-filter-checkbox"> <input type="checkbox" id="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}"> <label for="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label> </div> `).join('')} </div> <div class="p2p-filter-percent"> <label for="market-to-bank-percent">Минимальный процент:</label> <input type="number" id="market-to-bank-percent" value="5" min="0" max="20" step="0.5"> <span>%</span> </div> <div class="p2p-filter-amount"> <label for="market-to-bank-min-amount">Сумма от:</label> <input type="number" id="market-to-bank-min-amount" value="0" min="0"> <label for="market-to-bank-max-amount">до:</label> <input type="number" id="market-to-bank-max-amount" value="0" min="0"> <span class="p2p-filter-info">(0 = без ограничений)</span> </div> </div> <div class="p2p-filter-section"> <div class="p2p-filter-section-title"> <span>Автообновление ленты</span> </div> <div class="p2p-filter-auto-refresh"> <div class="p2p-filter-checkbox"> <input type="checkbox" id="auto-refresh-enabled"> <label for="auto-refresh-enabled">Включить автообновление</label> </div> <div class="p2p-filter-interval"> <label for="auto-refresh-interval">Интервал (сек):</label> <input type="number" id="auto-refresh-interval" value="30" min="5" max="300" step="1"> </div> <button id="save-auto-refresh" class="p2p-filter-button p2p-filter-button-small">Сохранить</button> </div> <div class="p2p-filter-info"> Автоматически нажимает кнопку "Обновить ленту" с указанным интервалом </div> </div> <div class="p2p-filter-actions"> <button id="apply-filter" class="p2p-filter-button">Применить фильтр</button> <button id="reset-filter" class="p2p-filter-reset">Сбросить</button> </div> </div> `; } function checkThreadMatchesFilter( threadTitle, selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ) { let marketAmount = null; let bankAmount = null; let direction = null; const bracketMatch = threadTitle.match(/\[(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\s*>\s*(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\]/i); const marketToBankMatch = threadTitle.match(/(?:Маркет|Market|LZT|Lolz)\s*(?:>|→|-)\s*(Тинькофф|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa)/i); const bankToMarketMatch = threadTitle.match(/(Тинькофф|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa)\s*(?:>|→|-)\s*(?:Маркет|Market|LZT|Lolz)/i); if (marketToBankMatch) { direction = 'market-to-bank'; const bank = marketToBankMatch[1]; const bankMatches = selectedBanksMarketToBank.some(selectedBank => bank.toLowerCase().includes(selectedBank.toLowerCase()) || selectedBank.toLowerCase().includes(bank.toLowerCase()) ); if (!bankMatches || selectedBanksMarketToBank.length === 0) { return false; } if (bracketMatch) { const firstAmount = parseFloat(bracketMatch[1].replace(',', '.')); const secondAmount = parseFloat(bracketMatch[2].replace(',', '.')); marketAmount = firstAmount; bankAmount = secondAmount; const percent = (marketAmount - bankAmount) / (marketAmount / 100); if ((marketToBankMinAmount > 0 || marketToBankMaxAmount > 0) && marketAmount) { if (marketToBankMinAmount > 0 && marketAmount < marketToBankMinAmount) { return false; } if (marketToBankMaxAmount > 0 && marketAmount > marketToBankMaxAmount) { return false; } } return percent >= marketToBankPercent; } return true; } else if (bankToMarketMatch) { direction = 'bank-to-market'; const bank = bankToMarketMatch[1]; const bankMatches = selectedBanksBankToMarket.some(selectedBank => bank.toLowerCase().includes(selectedBank.toLowerCase()) || selectedBank.toLowerCase().includes(bank.toLowerCase()) ); if (!bankMatches || selectedBanksBankToMarket.length === 0) { return false; } if (bracketMatch) { const firstAmount = parseFloat(bracketMatch[1].replace(',', '.')); const secondAmount = parseFloat(bracketMatch[2].replace(',', '.')); bankAmount = firstAmount; marketAmount = secondAmount; const percent = (marketAmount - bankAmount) / (bankAmount / 100); if ((bankToMarketMinAmount > 0 || bankToMarketMaxAmount > 0) && bankAmount) { if (bankToMarketMinAmount > 0 && bankAmount < bankToMarketMinAmount) { return false; } if (bankToMarketMaxAmount > 0 && bankAmount > bankToMarketMaxAmount) { return false; } } return percent <= bankToMarketPercent; } return true; } return false; } function applyFilterToThreads( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ) { const threads = document.querySelectorAll('.discussionListItem'); threads.forEach(thread => { const titleElement = thread.querySelector('.spanTitle'); if (!titleElement) return; const threadTitle = titleElement.textContent.trim(); const shouldShow = checkThreadMatchesFilter( threadTitle, selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ); if (shouldShow) { thread.style.display = 'block'; thread.classList.add('p2p-highlight'); } else { thread.style.display = 'none'; thread.classList.remove('p2p-highlight'); } }); addQuickOfferButtons(); return threads.length; } function applyFilter() { const selectedBanksMarketToBank = []; const selectedBanksBankToMarket = []; document.querySelectorAll('#market-to-bank input[type="checkbox"]:checked').forEach(checkbox => { selectedBanksMarketToBank.push(checkbox.value); }); document.querySelectorAll('#bank-to-market input[type="checkbox"]:checked').forEach(checkbox => { selectedBanksBankToMarket.push(checkbox.value); }); const marketToBankPercent = parseFloat(document.getElementById('market-to-bank-percent').value); const bankToMarketPercent = parseFloat(document.getElementById('bank-to-market-percent').value); const marketToBankMinAmount = parseInt(document.getElementById('market-to-bank-min-amount').value) || 0; const marketToBankMaxAmount = parseInt(document.getElementById('market-to-bank-max-amount').value) || 0; const bankToMarketMinAmount = parseInt(document.getElementById('bank-to-market-min-amount').value) || 0; const bankToMarketMaxAmount = parseInt(document.getElementById('bank-to-market-max-amount').value) || 0; saveFilterSettings( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ); applyFilterToThreads( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ); } function saveFilterSettings( selectedBanksMarketToBank, selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount ) { const settings = { marketToBank: selectedBanksMarketToBank, bankToMarket: selectedBanksBankToMarket, marketToBankPercent, bankToMarketPercent, marketToBankMinAmount, marketToBankMaxAmount, bankToMarketMinAmount, bankToMarketMaxAmount }; localStorage.setItem('p2pFilterSettings', JSON.stringify(settings)); } function loadFilterSettings() { const settingsJson = localStorage.getItem('p2pFilterSettings'); if (settingsJson) { const settings = JSON.parse(settingsJson); if (settings.marketToBankMinAmount === undefined) { settings.marketToBankMinAmount = 0; } if (settings.marketToBankMaxAmount === undefined) { settings.marketToBankMaxAmount = 0; } if (settings.bankToMarketMinAmount === undefined) { settings.bankToMarketMinAmount = 0; } if (settings.bankToMarketMaxAmount === undefined) { settings.bankToMarketMaxAmount = 0; } return settings; } return null; } function resetFilter() { document.querySelectorAll('.p2p-filter-checkbox input').forEach(checkbox => { checkbox.checked = false; }); document.getElementById('market-to-bank-percent').value = 5; document.getElementById('bank-to-market-percent').value = 3; const threads = document.querySelectorAll('.discussionListItem'); threads.forEach(thread => { thread.style.display = 'block'; thread.classList.remove('p2p-highlight'); }); localStorage.removeItem('p2pFilterSettings'); } function applyFilterSettings(settings) { if (!settings) return; settings.marketToBank.forEach(bank => { const checkbox = document.getElementById(`market-to-${bank.toLowerCase().replace(/\s+/g, '-')}`); if (checkbox) checkbox.checked = true; }); settings.bankToMarket.forEach(bank => { const checkbox = document.getElementById(`bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}`); if (checkbox) checkbox.checked = true; }); document.getElementById('market-to-bank-percent').value = settings.marketToBankPercent; document.getElementById('bank-to-market-percent').value = settings.bankToMarketPercent; applyFilterToThreads( settings.marketToBank, settings.bankToMarket, settings.marketToBankPercent, settings.bankToMarketPercent, settings.marketToBankMinAmount, settings.marketToBankMaxAmount, settings.bankToMarketMinAmount, settings.bankToMarketMaxAmount ); } function autoLoadAllThreads() { return new Promise((resolve) => { const maxScrollAttempts = 30; let scrollAttempts = 0; let noNewThreadsCounter = 0; const checkAllResultsShowing = () => { return document.querySelector('.AllResultsShowing') !== null; }; const scrollDown = () => { window.scrollTo(0, document.body.scrollHeight); }; const checkIfLoading = () => { const loadingIndicator = document.querySelector('.loading'); return loadingIndicator && loadingIndicator.style.display !== 'none'; }; let previousThreadCount = 0; const checkForNewThreads = () => { const currentThreadCount = document.querySelectorAll('.discussionListItem').length; const hasNewThreads = currentThreadCount > previousThreadCount; previousThreadCount = currentThreadCount; return hasNewThreads; }; const loadMoreThreads = () => { scrollAttempts++; if (scrollAttempts > maxScrollAttempts || checkAllResultsShowing()) { console.log('Загрузка завершена, всего тем: ' + previousThreadCount); resolve(); return; } if (checkIfLoading()) { setTimeout(loadMoreThreads, 500); return; } scrollDown(); setTimeout(() => { if (checkForNewThreads()) { noNewThreadsCounter = 0; loadMoreThreads(); } else if (checkIfLoading()) { loadMoreThreads(); } else { noNewThreadsCounter++; if (noNewThreadsCounter >= 3) { console.log('Загрузка завершена после ' + scrollAttempts + ' попыток, всего тем: ' + previousThreadCount); resolve(); } else { setTimeout(loadMoreThreads, 1000); } } }, 1000); }; loadMoreThreads(); }); } let autoRefreshInterval = null; function toggleAutoRefresh() { const isEnabled = document.getElementById('auto-refresh-enabled').checked; const intervalSeconds = parseInt(document.getElementById('auto-refresh-interval').value) || 30; if (autoRefreshInterval) { clearInterval(autoRefreshInterval); autoRefreshInterval = null; } if (isEnabled && intervalSeconds >= 5) { autoRefreshInterval = setInterval(() => { const refreshButton = document.querySelector('.UpdateFeedButton'); if (refreshButton) { if (window.getComputedStyle(refreshButton).display !== 'none') { refreshButton.click(); console.log('Лента обновлена автоматически'); } else { console.log('Кнопка обновления ленты скрыта, пропускаем обновление'); } } else { console.log('Кнопка обновления ленты не найдена'); } }, intervalSeconds * 1000); console.log(`Автообновление ленты включено с интервалом ${intervalSeconds} сек`); } else { console.log('Автообновление ленты выключено'); } saveAutoRefreshSettings(isEnabled, intervalSeconds); } function saveAutoRefreshSettings(isEnabled, intervalSeconds) { localStorage.setItem('p2pAutoRefreshEnabled', isEnabled); localStorage.setItem('p2pAutoRefresh
     
    Вчера, в 11:08 Изменено
    1. APT29388 Автор темы
      Прошлая версия, актуальная в закрепе выше
Top
JavaScript error: