您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds useful UI controls for JanitorAI, hides buttons on all chat pages
当前为
- // ==UserScript==
- // @name JanitorAI Enhanced UI
- // @namespace http://tampermonkey.net/
- // @version 3
- // @description Adds useful UI controls for JanitorAI, hides buttons on all chat pages
- // @author Fefnik
- // @match https://janitorai.com/*
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- // Settings
- let MIN_TOKENS = localStorage.getItem('janitorAITokenFilter') ? parseInt(localStorage.getItem('janitorAITokenFilter')) : 500;
- let isSidebarHidden = localStorage.getItem('janitorAISidebarHidden') === 'true';
- let isAutoScrollEnabled = localStorage.getItem('janitorAIAutoScroll') !== 'false';
- let isMenuVisible = localStorage.getItem('janitorAIMenuVisible') === 'true';
- // Elements
- let sliderElement = null;
- let sliderContainer = null;
- let controlPanel = null;
- let controlsContainer = null;
- let emblaSlide = null; // Переменная для хранения ссылки на элемент .is-in-view.is-snapped.embla__slide
- function isAllowedPage() {
- const path = window.location.pathname;
- return (path === '/' || path.startsWith('/search') || path === '/my_characters' || path.startsWith('/profiles/'));
- }
- function isChatsPage() {
- const path = window.location.pathname;
- return path.startsWith('/chats');
- }
- function parseTokens(tokenText) {
- try {
- let cleanText = tokenText.replace(/<!--[\s\S]*?-->/g, '').replace('tokens', '').trim();
- if (cleanText.includes('k')) {
- return parseFloat(cleanText.replace('k', '')) * 1000;
- }
- return parseInt(cleanText, 10) || 0;
- } catch (error) {
- return 0;
- }
- }
- function filterCards() {
- const cards = document.querySelectorAll('.chakra-stack.css-1s5evre, .css-1s5evre');
- cards.forEach(card => {
- const tokenElement = card.querySelector('.chakra-text.css-jccmq6, .css-jccmq6');
- if (!tokenElement) return;
- const tokenCount = parseTokens(tokenElement.textContent);
- const parentContainer = card.closest('.css-1sxhvxh, .css-1dbw1r8');
- if (parentContainer) {
- parentContainer.style.display = tokenCount < MIN_TOKENS ? 'none' : '';
- }
- });
- }
- function setupPaginationScroll() {
- const paginationButtons = document.querySelectorAll('.css-kzd6o0');
- paginationButtons.forEach(button => {
- button.removeEventListener('click', handlePaginationClick);
- button.addEventListener('click', handlePaginationClick);
- });
- }
- function handlePaginationClick() {
- if (isAutoScrollEnabled) {
- setTimeout(() => {
- window.scrollTo({
- top: 0,
- behavior: 'smooth'
- });
- }, 300);
- }
- }
- function toggleSidebar() {
- const sidebar = document.querySelector('.css-h988mi');
- const css70qvj9 = document.querySelector('.css-70qvj9'); // Элемент .css-70qvj9
- if (sidebar) {
- isSidebarHidden = !isSidebarHidden;
- sidebar.style.display = isSidebarHidden ? 'none' : '';
- // Управление видимостью элемента .is-in-view.is-snapped.embla__slide
- if (!emblaSlide && isSidebarHidden) {
- emblaSlide = document.querySelector('.is-in-view.is-snapped.embla__slide');
- }
- if (emblaSlide) {
- emblaSlide.style.display = isSidebarHidden ? 'none' : '';
- }
- // Управление видимостью элемента .css-70qvj9
- if (css70qvj9) {
- css70qvj9.style.display = isSidebarHidden ? 'none' : '';
- }
- localStorage.setItem('janitorAISidebarHidden', isSidebarHidden);
- updateControlText();
- }
- }
- function toggleAutoScroll() {
- isAutoScrollEnabled = !isAutoScrollEnabled;
- localStorage.setItem('janitorAIAutoScroll', isAutoScrollEnabled);
- updateControlText();
- }
- function toggleMenu() {
- isMenuVisible = !isMenuVisible;
- localStorage.setItem('janitorAIMenuVisible', isMenuVisible);
- updateElementsVisibility();
- updateControlText();
- }
- function updateControlText() {
- const sidebarText = document.getElementById('sidebar-toggle-text');
- const scrollText = document.getElementById('auto-scroll-text');
- if (sidebarText) {
- sidebarText.textContent = isSidebarHidden ? 'Show Topbar' : 'Hide Topbar';
- sidebarText.style.color = isSidebarHidden ? '#fff' : '#ccc';
- }
- if (scrollText) {
- scrollText.textContent = isAutoScrollEnabled ? 'Auto-Scroll: ON' : 'Auto-Scroll: OFF';
- scrollText.style.color = isAutoScrollEnabled ? '#fff' : '#ccc';
- }
- }
- function createControlPanel() {
- if (controlPanel) return;
- controlPanel = document.createElement('div');
- controlPanel.id = 'janitor-control-panel';
- controlPanel.style.position = 'fixed';
- controlPanel.style.top = '75px';
- controlPanel.style.left = '10px';
- controlPanel.style.zIndex = '100000';
- controlPanel.style.display = 'flex';
- controlPanel.style.flexDirection = 'column';
- controlPanel.style.gap = '5px';
- controlPanel.style.alignItems = 'flex-start';
- const settingsButton = document.createElement('button');
- settingsButton.id = 'token-filter-toggle';
- settingsButton.textContent = '⚙️';
- settingsButton.title = 'Toggle settings';
- settingsButton.style.width = '30px';
- settingsButton.style.height = '30px';
- settingsButton.style.padding = '0';
- settingsButton.style.backgroundColor = 'rgba(74, 74, 74, 0.7)';
- settingsButton.style.color = '#fff';
- settingsButton.style.border = 'none';
- settingsButton.style.borderRadius = '5px';
- settingsButton.style.cursor = 'pointer';
- settingsButton.style.display = 'flex';
- settingsButton.style.alignItems = 'center';
- settingsButton.style.justifyContent = 'center';
- settingsButton.style.fontSize = '16px';
- settingsButton.style.transition = 'background-color 0.2s';
- settingsButton.addEventListener('click', toggleMenu);
- controlsContainer = document.createElement('div');
- controlsContainer.id = 'controls-container';
- controlsContainer.style.display = 'none';
- controlsContainer.style.flexDirection = 'column';
- controlsContainer.style.gap = '5px';
- controlsContainer.style.backgroundColor = 'rgba(74, 74, 74, 0.7)';
- controlsContainer.style.padding = '5px';
- controlsContainer.style.borderRadius = '5px';
- const sidebarText = document.createElement('span');
- sidebarText.id = 'sidebar-toggle-text';
- sidebarText.style.cursor = 'pointer';
- sidebarText.style.fontSize = '12px';
- sidebarText.addEventListener('click', toggleSidebar);
- const scrollText = document.createElement('span');
- scrollText.id = 'auto-scroll-text';
- scrollText.style.cursor = 'pointer';
- scrollText.style.fontSize = '12px';
- scrollText.addEventListener('click', toggleAutoScroll);
- controlsContainer.appendChild(sidebarText);
- controlsContainer.appendChild(scrollText);
- controlPanel.appendChild(settingsButton);
- controlPanel.appendChild(controlsContainer);
- document.body.appendChild(controlPanel);
- updateControlText();
- }
- function createOrUpdateSlider() {
- if (!sliderElement) {
- sliderContainer = document.createElement('div');
- sliderContainer.id = 'token-filter-container';
- sliderContainer.style.position = 'fixed';
- sliderContainer.style.top = '75px';
- sliderContainer.style.left = '50px';
- sliderContainer.style.zIndex = '99999';
- sliderContainer.style.display = 'none';
- sliderContainer.style.flexDirection = 'row';
- sliderContainer.style.alignItems = 'center';
- sliderContainer.style.gap = '10px';
- sliderContainer.style.padding = '5px';
- sliderContainer.style.backgroundColor = 'rgba(74, 74, 74, 0.7)';
- sliderContainer.style.borderRadius = '5px';
- sliderElement = document.createElement('input');
- sliderElement.type = 'range';
- sliderElement.id = 'token-filter-slider';
- sliderElement.min = '0';
- sliderElement.max = '6000';
- sliderElement.step = '100';
- sliderElement.value = MIN_TOKENS;
- sliderElement.style.width = '150px';
- sliderElement.style.height = '20px';
- sliderElement.style.backgroundColor = '#4a4a4a';
- sliderElement.style.cursor = 'pointer';
- sliderElement.style.appearance = 'none';
- sliderElement.style.outline = 'none';
- sliderElement.style.borderRadius = '5px';
- sliderElement.style.padding = '0';
- const style = document.createElement('style');
- style.textContent = `
- #token-filter-slider {
- -webkit-appearance: none;
- appearance: none;
- background: #4a4a4a;
- border-radius: 5px;
- }
- #token-filter-slider::-webkit-slider-thumb {
- -webkit-appearance: none;
- appearance: none;
- width: 20px;
- height: 20px;
- background: #ffffff;
- cursor: pointer;
- border-radius: 50%;
- border: 2px solid #000;
- box-shadow: 0 0 2px rgba(0,0,0,0.5);
- transform: translateY(-5px);
- }
- #token-filter-slider::-moz-range-thumb {
- width: 20px;
- height: 20px;
- background: #ffffff;
- cursor: pointer;
- border-radius: 50%;
- border: 2px solid #000;
- box-shadow: 0 0 2px rgba(0,0,0,0.5);
- transform: translateY(-5px);
- }
- #token-filter-slider::-webkit-slider-runnable-track {
- height: 10px;
- background: #4a4a4a;
- border-radius: 5px;
- }
- #token-filter-slider::-moz-range-track {
- height: 10px;
- background: #4a4a4a;
- border-radius: 5px;
- }
- `;
- document.head.appendChild(style);
- const label = document.createElement('span');
- label.id = 'token-filter-label';
- label.style.color = '#fff';
- label.style.fontSize = '12px';
- label.style.minWidth = '60px';
- label.textContent = `${MIN_TOKENS} tokens`;
- sliderElement.addEventListener('input', (e) => {
- MIN_TOKENS = parseInt(e.target.value);
- label.textContent = `${MIN_TOKENS} tokens`;
- localStorage.setItem('janitorAITokenFilter', MIN_TOKENS);
- filterCards();
- });
- sliderContainer.appendChild(sliderElement);
- sliderContainer.appendChild(label);
- document.body.appendChild(sliderContainer);
- }
- }
- function updateElementsVisibility() {
- const shouldShow = isAllowedPage() && !isChatsPage();
- if (controlPanel) {
- controlPanel.style.display = shouldShow ? 'flex' : 'none';
- }
- if (sliderContainer) {
- sliderContainer.style.display = shouldShow && isMenuVisible ? 'flex' : 'none';
- }
- if (controlsContainer) {
- controlsContainer.style.display = shouldShow && isMenuVisible ? 'flex' : 'none';
- }
- }
- function initialize() {
- createControlPanel();
- createOrUpdateSlider();
- updateElementsVisibility();
- if (isAllowedPage() && !isChatsPage()) {
- filterCards();
- setupPaginationScroll();
- const sidebar = document.querySelector('.css-h988mi');
- if (sidebar && isSidebarHidden) {
- sidebar.style.display = 'none';
- emblaSlide = document.querySelector('.is-in-view.is-snapped.embla__slide');
- if (emblaSlide) {
- emblaSlide.style.display = 'none';
- }
- const css70qvj9 = document.querySelector('.css-70qvj9');
- if (css70qvj9) {
- css70qvj9.style.display = 'none'; // Скрываем при инициализации, если сайдбар скрыт
- }
- }
- const observer = new MutationObserver(() => {
- filterCards();
- setupPaginationScroll();
- });
- observer.observe(document.body, { childList: true, subtree: true });
- }
- }
- const tryInitialize = () => {
- if (document.body) {
- initialize();
- let lastPath = window.location.pathname;
- setInterval(() => {
- if (lastPath !== window.location.pathname) {
- lastPath = window.location.pathname;
- updateElementsVisibility();
- if (isAllowedPage() && !isChatsPage()) {
- filterCards();
- setupPaginationScroll();
- }
- }
- }, 500);
- } else {
- setTimeout(tryInitialize, 1000);
- }
- };
- tryInitialize();
- })();