您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Sort and display rooms by number of broadcasters and users, with toggle functionality
当前为
// ==UserScript== // @name StumbleChat Alternate Directory View // @namespace http://tampermonkey.net/ // @version 1.0 // @description Sort and display rooms by number of broadcasters and users, with toggle functionality // @author You // @match https://stumblechat.com/* // @exclude https://stumblechat.com/room/* // @grant none // ==/UserScript== (function() { 'use strict'; const buttonContainer = document.createElement('div'); buttonContainer.style.position = 'fixed'; buttonContainer.style.top = '10px'; buttonContainer.style.right = '200px'; buttonContainer.style.zIndex = '1000'; buttonContainer.style.display = 'flex'; buttonContainer.style.alignItems = 'center'; document.body.appendChild(buttonContainer); const sortButton = document.createElement('button'); sortButton.innerHTML = 'Alternate View'; sortButton.style.padding = '10px'; sortButton.style.backgroundColor = '#00ff0080'; sortButton.style.color = 'white'; sortButton.style.border = 'none'; sortButton.style.borderTopLeftRadius = '5px'; sortButton.style.borderBottomLeftRadius = '5px'; sortButton.style.cursor = 'pointer'; sortButton.style.opacity = '0.8'; sortButton.style.height = '40px'; // Ensure both buttons have the same height buttonContainer.appendChild(sortButton); const settingsButton = document.createElement('button'); settingsButton.innerHTML = '⚙️'; settingsButton.style.padding = '10px'; settingsButton.style.backgroundColor = 'blue'; settingsButton.style.color = 'white'; settingsButton.style.border = 'none'; settingsButton.style.borderTopRightRadius = '5px'; settingsButton.style.borderBottomRightRadius = '5px'; settingsButton.style.cursor = 'pointer'; settingsButton.style.opacity = '0.8'; settingsButton.style.height = '40px'; // Ensure both buttons have the same height buttonContainer.appendChild(settingsButton); let originalContent = ''; let sortedContainerWidth = '80%'; let roomInfoBorderColor = 'orange'; let gridTemplateColumnsMinmax = '300px'; let showCameras = false; let conspiracyTalkRoom = null; function removeConspiracyTalkRoom() { const rooms = document.querySelectorAll('.grid-item'); rooms.forEach(room => { const roomName = room.querySelector('.roomname h3').textContent; if (roomName.toLowerCase() === 'conspiracytalk') { conspiracyTalkRoom = room.cloneNode(true); room.remove(); } }); } function sortRooms() { const content = document.querySelector('.content'); if (!originalContent) { originalContent = content.innerHTML; } const rooms = Array.from(document.querySelectorAll('.grid-item')); if (conspiracyTalkRoom) { rooms.push(conspiracyTalkRoom.cloneNode(true)); } rooms.sort((a, b) => { const aBroadcasters = parseInt(a.querySelector('.detailbadge.broadcast').textContent); const bBroadcasters = parseInt(b.querySelector('.detailbadge.broadcast').textContent); const aUsers = parseInt(a.querySelector('.detailbadge.users').textContent); const bUsers = parseInt(b.querySelector('.detailbadge.users').textContent); if (aBroadcasters === bBroadcasters) { return bUsers - aUsers; } return bBroadcasters - aBroadcasters; }); content.innerHTML = ''; const sortedContainer = document.createElement('div'); sortedContainer.style.display = 'flex'; sortedContainer.style.flexDirection = 'column'; sortedContainer.style.alignItems = 'center'; sortedContainer.style.width = sortedContainerWidth; sortedContainer.style.margin = '0 auto'; rooms.forEach(room => { const roomName = room.querySelector('.roomname h3').textContent; const broadcasters = room.querySelector('.detailbadge.broadcast').textContent; const users = room.querySelector('.detailbadge.users').textContent; const roomLink = room.querySelector('.slideshow a').getAttribute('href'); const roomInfo = document.createElement('div'); roomInfo.style.margin = '10px'; roomInfo.style.padding = '10px'; roomInfo.style.borderRadius = '1rem'; roomInfo.style.backgroundColor = '#00000080'; roomInfo.style.width = '100%'; roomInfo.style.textAlign = 'center'; roomInfo.style.color = 'white'; roomInfo.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)'; roomInfo.style.border = `2px solid ${roomInfoBorderColor}`; roomInfo.style.cursor = 'pointer'; if (roomName.toLowerCase() === 'conspiracytalk') { roomInfo.innerHTML = ` <h1 style="font-family: Impact; color: red; animation: flash 1s infinite;">PEDO ROOM</h1> `; roomInfo.style.cursor = 'pointer'; const toggleButton = document.createElement('button'); toggleButton.innerHTML = '💀'; toggleButton.style.position = 'absolute'; toggleButton.style.bottom = '10px'; toggleButton.style.left = '10px'; toggleButton.style.backgroundColor = 'transparent'; toggleButton.style.border = 'none'; toggleButton.style.color = 'white'; toggleButton.style.fontSize = '20px'; toggleButton.style.cursor = 'pointer'; toggleButton.addEventListener('click', () => { showCameras = !showCameras; if (showCameras) { roomInfo.innerHTML = ` <h3>${roomName}</h3> <p>Broadcasters: ${broadcasters}</p> <p>Users: ${users}</p> `; const slideshow = room.querySelector('.slideshow').cloneNode(true); const slides = slideshow.querySelectorAll('.slides'); const gridContainer = document.createElement('div'); gridContainer.style.display = 'grid'; gridContainer.style.gridTemplateColumns = `repeat(auto-fill, minmax(${gridTemplateColumnsMinmax}, 1fr))`; gridContainer.style.gap = '5px'; gridContainer.style.padding = '5px'; gridContainer.style.justifyContent = 'center'; gridContainer.style.borderRadius = '5px'; slides.forEach(slide => { const img = slide.querySelector('img'); if (img) { const imgContainer = document.createElement('div'); imgContainer.style.borderRadius = '5px'; imgContainer.style.overflow = 'hidden'; img.style.width = '100%'; img.style.height = 'auto'; imgContainer.appendChild(img.cloneNode(true)); gridContainer.appendChild(imgContainer); } }); roomInfo.appendChild(gridContainer); } else { roomInfo.innerHTML = ` <h1 style="font-family: Impact; color: red; animation: flash 1s infinite;">PEDO ROOM</h1> `; } roomInfo.appendChild(toggleButton); }); roomInfo.appendChild(toggleButton); roomInfo.addEventListener('click', () => { alert('What is on your harddrive?'); }); } else { roomInfo.innerHTML = ` <h3>${roomName}</h3> <p>Broadcasters: ${broadcasters}</p> <p>Users: ${users}</p> `; roomInfo.addEventListener('click', () => { window.location.href = roomLink; }); } const slideshow = room.querySelector('.slideshow').cloneNode(true); const slides = slideshow.querySelectorAll('.slides'); const gridContainer = document.createElement('div'); gridContainer.style.display = 'grid'; gridContainer.style.gridTemplateColumns = `repeat(auto-fill, minmax(${gridTemplateColumnsMinmax}, 1fr))`; gridContainer.style.gap = '5px'; gridContainer.style.padding = '5px'; gridContainer.style.justifyContent = 'center'; gridContainer.style.borderRadius = '5px'; slides.forEach(slide => { const img = slide.querySelector('img'); if (img) { const imgContainer = document.createElement('div'); imgContainer.style.borderRadius = '5px'; imgContainer.style.overflow = 'hidden'; img.style.width = '100%'; img.style.height = 'auto'; imgContainer.appendChild(img.cloneNode(true)); gridContainer.appendChild(imgContainer); } }); roomInfo.appendChild(gridContainer); sortedContainer.appendChild(roomInfo); }); content.appendChild(sortedContainer); sortButton.innerHTML = 'Show Original View'; sortButton.style.backgroundColor = '#ff000080'; sortButton.removeEventListener('click', sortRooms); sortButton.addEventListener('click', showOriginalView); } function showOriginalView() { const content = document.querySelector('.content'); content.innerHTML = originalContent; removeConspiracyTalkRoom(); sortButton.innerHTML = 'Alternate View'; sortButton.style.backgroundColor = '#00ff0080'; sortButton.removeEventListener('click', showOriginalView); sortButton.addEventListener('click', sortRooms); } function openSettings() { const modal = document.createElement('div'); modal.style.position = 'fixed'; modal.style.top = '60px'; // Positioned below the settings button modal.style.right = '200px'; // Align with the settings button modal.style.zIndex = '1001'; modal.style.backgroundColor = '#000000cc'; modal.style.padding = '20px'; modal.style.borderRadius = '1rem'; modal.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)'; modal.style.color = '#ffff33'; const form = document.createElement('form'); form.style.display = 'grid'; form.style.gridTemplateColumns = 'auto 1fr'; form.style.gap = '10px'; form.innerHTML = ` <label for="gridTemplateColumnsMinmax">Cam Size:</label> <input type="range" id="gridTemplateColumnsMinmax" min="100" max="500" value="${gridTemplateColumnsMinmax.replace('px', '')}" step="1"> <label for="sortedContainerWidth">Width:</label> <input type="range" id="sortedContainerWidth" min="20" max="100" value="${sortedContainerWidth.replace('%', '')}" step="1"> <label for="roomInfoBorderColor">Border Color:</label> <input type="color" id="roomInfoBorderColor" value="${roomInfoBorderColor}"> <button type="button" id="saveSettings" style="background-color: blue; color: white; border-radius: 5px; padding: 5px; width: 50%;">Save</button> <button type="button" id="closeSettings" style="background-color: red; color: white; border-radius: 5px; padding: 5px; width: 50%;">Cancel</button> `; modal.appendChild(form); document.body.appendChild(modal); const saveButton = document.getElementById('saveSettings'); saveButton.addEventListener('click', () => { gridTemplateColumnsMinmax = `${document.getElementById('gridTemplateColumnsMinmax').value}px`; sortedContainerWidth = `${document.getElementById('sortedContainerWidth').value}%`; roomInfoBorderColor = document.getElementById('roomInfoBorderColor').value; document.body.removeChild(modal); showOriginalView(); sortRooms(); }); const closeButton = document.getElementById('closeSettings'); closeButton.addEventListener('click', () => { document.body.removeChild(modal); }); } settingsButton.addEventListener('click', openSettings); sortButton.addEventListener('click', sortRooms); // Wait 1 second and then toggle alternate view and back to original view to remove the room setTimeout(() => { sortRooms(); }, 1000); // CSS for flashing text const style = document.createElement('style'); style.innerHTML = ` @keyframes flash { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } `; document.head.appendChild(style); })();