// ==UserScript== // @name Duolingo Helper // @namespace http://tampermonkey.net/ // @version 1.0.9 // @description This tool helps you listen to music while studying // @author @kietxx_163 and @bot1.py // @match https://*.duolingo.com/* // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @icon https://d35aaqx5ub95lt.cloudfront.net/images/leagues/020eeff7a4bb54d62dc430445102de8f.svg // @downloadURL none // ==/UserScript== (function() { 'use strict'; let basePing = 100; // Basic Ping (ms) let baseFps = 60; // Basic FPS let ping = basePing; // Current ping value (ms) let fps = baseFps; // Current FPS value let sessionStartTime = Date.now(); // Session start time function isLocalStorageSupported() { try { const testKey = '__testKey'; localStorage.setItem(testKey, testKey); localStorage.removeItem(testKey); return true; } catch (error) { return false; } } if (!isLocalStorageSupported()) { console.error('LocalStorage is not supported.'); return; } const style = document.createElement('style'); style.textContent = ` :root { --text-color: black; /* Default text color */ --background-color: white; /* Default background color */ } @keyframes rainbow-border { 0% { border-color: red; } 14% { border-color: orange; } 28% { border-color: yellow; } 42% { border-color: green; } 57% { border-color: blue; } 71% { border-color: indigo; } 85% { border-color: violet; } 100% { border-color: red; } } #performanceMonitor { position: fixed; top: 10px; right: 10px; padding: 8px; border: 5px solid; border-radius: 8px; font-family: Arial, sans-serif; font-size: 14px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); width: 200px; height: auto; text-align: left; overflow: hidden; cursor: pointer; z-index: 9999; transition: opacity 0.3s ease-in-out, width 0.3s ease-in-out, transform 0.3s ease-in-out; background-color: var(--background-color); /* Use the CSS variable for background color */ background-image: url('data:image/gif;base64,R0lGODlhAQABAIAAAAAA...'); background-size: 32px 32px; background-repeat: no-repeat; background-position: 10px center; animation: rainbow-border 3s linear infinite; color: var(--text-color); /* Use the CSS variable for text color */ } #performanceMonitor.hidden { width: 80px; transform: scale(0.9); } #performanceContentWrapper { transition: opacity 0.3s ease-in-out; } #performanceContentWrapper.hidden { opacity: 0; height: 0; overflow: hidden; } #performanceMonitor button { display: block; margin-bottom: 5px; cursor: pointer; background-color: #444; /* Fixed button background color */ color: white; /* Fixed button text color */ border: none; border-radius: 4px; padding: 4px 8px; font-size: 12px; transition: background-color 0.3s, transform 0.3s; } #performanceMonitor button:hover { background-color: #666; transform: scale(1.05); } .modal { position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%) scale(0); background-color: rgba(255, 255, 255, 0.9); /* Default modal background */ color: var(--text-color); /* Use the CSS variable for modal text color */ border-radius: 8px; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); z-index: 10000; transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; opacity: 0; } .modal.show { transform: translate(-50%, -50%) scale(1); opacity: 1; } .modal h3 { margin-bottom: 10px; } .modal label { display: block; margin-bottom: 5px; } .modal input[type="email"], .modal textarea { width: 100%; padding: 8px; margin-bottom: 10px; border: 1px solid #666; border-radius: 4px; background-color: #f9f9f9; /* Default input background color */ color: var(--text-color); /* Use the CSS variable for input text color */ } .modal textarea { height: 100px; /* Set height for feedback textarea */ resize: vertical; /* Allow vertical resizing */ } .modal button { margin-top: 10px; padding: 8px 16px; background-color: #1cb0f6; color: white; border: none; border-radius: 4px; cursor: pointer; transition: background-color 0.3s; } .modal button:hover { background-color: #0a7bb0; } #settingsPanel { position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%) scale(0); background-color: rgba(255, 255, 255, 0.9); /* Default settings panel background */ color: var(--text-color); /* Use the CSS variable for settings panel text color */ border-radius: 8px; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); z-index: 10001; transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; opacity: 0; } #settingsPanel.show { transform: translate(-50%, -50%) scale(1); opacity: 1; } #settingsPanel h3 { margin-bottom: 10px; } #musicMenu { position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%) scale(0); background-color: rgba(255, 255, 255, 0.9); color: var(--text-color); border-radius: 8px; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); z-index: 10001; transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; opacity: 0; max-height: 80%; overflow-y: auto; } #musicMenu.show { transform: translate(-50%, -50%) scale(1); opacity: 1; } #musicMenu button { display: block; margin-bottom: 5px; cursor: pointer; background-color: #444; color: white; border: none; border-radius: 4px; padding: 4px 8px; font-size: 12px; transition: background-color 0.3s, transform 0.3s; } #musicMenu button:hover { background-color: #666; transform: scale(1.05); } `; document.head.appendChild(style); // Add audio element const audio = document.createElement('audio'); audio.id = 'backgroundMusic'; audio.src = 'https://ia600605.us.archive.org/8/items/NeverGonnaGiveYouUp/jocofullinterview41.mp3'; // Thay thế URL bằng liên kết đến file nhạc của bạn audio.loop = true; // Lặp lại nhạc liên tục document.body.appendChild(audio); const container = document.createElement('div'); container.id = 'performanceMonitor'; container.title = 'Click to hide/show'; document.body.appendChild(container); const contentWrapper = document.createElement('div'); contentWrapper.id = 'performanceContentWrapper'; container.appendChild(contentWrapper); const content = document.createElement('div'); content.id = 'performanceContent'; contentWrapper.appendChild(content); const toggleButton = document.createElement('button'); toggleButton.textContent = 'Hide'; toggleButton.addEventListener('mouseover', () => { toggleButton.style.backgroundColor = '#666'; }); toggleButton.addEventListener('mouseout', () => { toggleButton.style.backgroundColor = '#444'; }); toggleButton.addEventListener('click', () => { const isVisible = !contentWrapper.classList.contains('hidden'); contentWrapper.classList.toggle('hidden', isVisible); toggleButton.textContent = isVisible ? 'Show' : 'Hide'; const monitor = document.getElementById('performanceMonitor'); monitor.classList.toggle('hidden', isVisible); }); container.appendChild(toggleButton); const reloadButton = document.createElement('button'); reloadButton.textContent = 'Reload Page'; reloadButton.addEventListener('click', () => { location.reload(); }); contentWrapper.appendChild(reloadButton); const discordButton = document.createElement('button'); discordButton.textContent = 'Discord'; discordButton.addEventListener('click', () => { window.open('https://discord.gg/XSXPtD5hD4', '_blank'); }); contentWrapper.appendChild(discordButton); // New Choose Music Button const chooseMusicButton = document.createElement('button'); chooseMusicButton.textContent = 'Choose Music'; chooseMusicButton.addEventListener('click', () => { showMusicMenu(); }); contentWrapper.appendChild(chooseMusicButton); // Music Menu const musicMenu = document.createElement('div'); musicMenu.id = 'musicMenu'; musicMenu.innerHTML = `