// ==UserScript== // @name Duolingo Pro BETA // @namespace Violentmonkey Scripts // @version 2.0BETA8 // @description Duolingo Auto Solver Tool - WORKING AUGUST 2023 // @author anonymoushackerIV // @match https://*.duolingo.com/* // @grant none // @license MIT // @require https://unpkg.com/@supabase/supabase-js@2.12.1 // @downloadURL none // ==/UserScript== let solvingIntervalId; let isAutoMode = false; let isSolving = false; let isTokenRunning = false; const debug = false; let simulated; if (JSON.parse(localStorage.getItem('DuolingoProSettingsHumaneSolvingMode')) === null) { simulated = false; } else { simulated = JSON.parse(localStorage.getItem('DuolingoProSettingsHumaneSolvingMode')); } let isSendFeedbackButtonPressed = false; let autoSolverBoxRepeatAmount = 0; autoSolverBoxRepeatAmount = Number(sessionStorage.getItem('autoSolverBoxRepeatAmount')); let DuolingoProAmountOfQuestionsEverSolved = 0; DuolingoProAmountOfQuestionsEverSolved = Number(localStorage.getItem('DuolingoProAmountOfQuestionsEverSolved')); let ProBlockBannerOneVisible = true; if (JSON.parse(localStorage.getItem('ProBlockBannerOneVisible')) === null) { ProBlockBannerOneVisible = true; } else { ProBlockBannerOneVisible = JSON.parse(localStorage.getItem('ProBlockBannerOneVisible')); } let autoSolverBoxPracticeOnlyMode; let autoSolverBoxRepeatLessonMode; if (JSON.parse(sessionStorage.getItem('autoSolverBoxPracticeOnlyMode')) === null) { autoSolverBoxPracticeOnlyMode = true; } else { autoSolverBoxPracticeOnlyMode = JSON.parse(sessionStorage.getItem('autoSolverBoxPracticeOnlyMode')); } if (JSON.parse(sessionStorage.getItem('autoSolverBoxRepeatLessonMode')) === null) { autoSolverBoxRepeatLessonMode = false; } else { autoSolverBoxRepeatLessonMode = JSON.parse(sessionStorage.getItem('autoSolverBoxRepeatLessonMode')); } let wasAutoSolverBoxRepeatStartButtonPressed = false; if (JSON.parse(sessionStorage.getItem('wasAutoSolverBoxRepeatStartButtonPressed')) === null) { wasAutoSolverBoxRepeatStartButtonPressed = false; } else { wasAutoSolverBoxRepeatStartButtonPressed = JSON.parse(sessionStorage.getItem('wasAutoSolverBoxRepeatStartButtonPressed')); } // Whats New Variables Start try { localStorage.removeItem('wasWhatsNewInTwoPointZeroBetaThreeFinished'); localStorage.removeItem('wasWhatsNewInTwoPointZeroBetaFourFinished'); } catch (error) { } let wasWhatsNewInTwoPointZeroBetaSixFinished = false; if (JSON.parse(localStorage.getItem('wasWhatsNewInTwoPointZeroBetaSixFinished')) === null) { wasWhatsNewInTwoPointZeroBetaSixFinished = false; } else { wasWhatsNewInTwoPointZeroBetaSixFinished = JSON.parse(localStorage.getItem('wasWhatsNewInTwoPointZeroBetaSixFinished')); } let wasWhatsNewInTwoPointZeroBetaSevenFinished = false; if (JSON.parse(localStorage.getItem('wasWhatsNewInTwoPointZeroBetaSevenFinished')) === null) { wasWhatsNewInTwoPointZeroBetaSevenFinished = false; } else { wasWhatsNewInTwoPointZeroBetaSevenFinished = JSON.parse(localStorage.getItem('wasWhatsNewInTwoPointZeroBetaSevenFinished')); } let whatsNewInBetaStage = 1; // Whats New Variables End let wasDuolingoProSettingsButtonOnePressed = false; // Duolingo Pro Settings Variables Start //moved here let AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox = false; //moved here let AutoSolverSettingsShowAutoSolverBox = true; if (JSON.parse(localStorage.getItem('AutoSolverSettingsShowAutoSolverBox')) === null) { AutoSolverSettingsShowAutoSolverBox = true; // default } else if (JSON.parse(localStorage.getItem('AutoSolverSettingsShowAutoSolverBox')) === false) { AutoSolverSettingsShowAutoSolverBox = JSON.parse(localStorage.getItem('AutoSolverSettingsShowAutoSolverBox')); AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox = false; localStorage.setItem('AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox', AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox); } else { AutoSolverSettingsShowAutoSolverBox = JSON.parse(localStorage.getItem('AutoSolverSettingsShowAutoSolverBox')); } //was here if (JSON.parse(localStorage.getItem('AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox')) === null) { AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox = false; // default } else { AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox = JSON.parse(localStorage.getItem('AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox')); } let AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox = true; if (JSON.parse(localStorage.getItem('AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox')) === null) { AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox = true; // default } else { AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox = JSON.parse(localStorage.getItem('AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox')); } let AutoSolverSettingsLowPerformanceMode = false; if (JSON.parse(localStorage.getItem('AutoSolverSettingsLowPerformanceMode')) === null) { AutoSolverSettingsLowPerformanceMode = false; // default } else { AutoSolverSettingsLowPerformanceMode = JSON.parse(localStorage.getItem('AutoSolverSettingsLowPerformanceMode')); } let DuolingoProSettingsProBlockMode = true; if (JSON.parse(localStorage.getItem('DuolingoProSettingsProBlockMode')) === null) { DuolingoProSettingsProBlockMode = true; // default } else { DuolingoProSettingsProBlockMode = JSON.parse(localStorage.getItem('DuolingoProSettingsProBlockMode')); if (!DuolingoProSettingsProBlockMode) { ProBlockBannerOneVisible = true; localStorage.setItem('ProBlockBannerOneVisible', ProBlockBannerOneVisible); } } let DuolingoProSettingsTurboSolveMode = false; if (JSON.parse(localStorage.getItem('DuolingoProSettingsTurboSolveMode')) === null) { DuolingoProSettingsTurboSolveMode = false; // default } else { DuolingoProSettingsTurboSolveMode = JSON.parse(localStorage.getItem('DuolingoProSettingsTurboSolveMode')); } let DuolingoProSettingsHumaneSolvingMode = true; if (JSON.parse(localStorage.getItem('DuolingoProSettingsHumaneSolvingMode')) === null) { DuolingoProSettingsHumaneSolvingMode = true; // default } else { DuolingoProSettingsHumaneSolvingMode = JSON.parse(localStorage.getItem('DuolingoProSettingsHumaneSolvingMode')); } let DuolingoProSettingsNeverEndMode = false; if (JSON.parse(localStorage.getItem('DuolingoProSettingsNeverEndMode')) === null) { DuolingoProSettingsNeverEndMode = false; // default } else { DuolingoProSettingsNeverEndMode = JSON.parse(localStorage.getItem('DuolingoProSettingsNeverEndMode')); } // Duolingo Pro Settings Variables End function addButtons() { if (window.location.pathname === '/learn') { let button = document.querySelector('a[data-test="global-practice"]'); if (button) { return; } } const solveAllButton = document.getElementById("solveAllButton"); if (solveAllButton !== null) { return; } const original = document.querySelectorAll('[data-test="player-next"]')[0]; const storiesContinue = document.querySelectorAll('[data-test="stories-player-continue"]')[0]; if (original === undefined) { if (storiesContinue === undefined) { const startButton = document.querySelector('[data-test="start-button"]'); console.log(`Wrapper line: ${startButton}`); if (startButton === null) { return; } const wrapper = startButton.parentNode; const solveAllButton = document.createElement('a'); solveAllButton.className = startButton.className; solveAllButton.id = "solveAllButton"; solveAllButton.innerText = "COMPLETE SKILL"; solveAllButton.removeAttribute('href'); solveAllButton.addEventListener('click', () => { solving(true); setInterval(() => { const startButton = document.querySelector('[data-test="start-button"]'); if (startButton && startButton.innerText.startsWith("START")) { startButton.click(); } }, 1000); startButton.click(); }); wrapper.appendChild(solveAllButton); } else { // const wrapper = document.getElementsByClassName('_10vOG')[0]; const wrapper = document.querySelector('._10vOG, ._2L_r0'); wrapper.style.display = "flex"; // const solveCopy = document.createElement('button'); const presssolveCopy1 = () => { solveCopy.style.borderBottom = '0px'; solveCopy.style.marginBottom = '4px'; solveCopy.style.top = '4px'; }; // Function to revert the border-bottom when the button is released const releasesolveCopy1 = () => { solveCopy.style.borderBottom = '4px solid #2b70c9'; solveCopy.style.marginBottom = '0px'; solveCopy.style.top = '0px'; }; // Add event listeners for mousedown, mouseup, and mouseleave solveCopy.addEventListener('mousedown', presssolveCopy1); solveCopy.addEventListener('mouseup', releasesolveCopy1); solveCopy.addEventListener('mouseleave', releasesolveCopy1); const pauseCopy = document.createElement('button'); const presspauseCopy2 = () => { pauseCopy.style.borderBottom = '0px'; pauseCopy.style.marginBottom = '4px'; pauseCopy.style.top = '4px'; }; // Function to revert the border-bottom when the button is released const releasepauseCopy2 = () => { pauseCopy.style.borderBottom = '4px solid #ff9600'; pauseCopy.style.marginBottom = '0px'; pauseCopy.style.top = '0px'; }; // Add event listeners for mousedown, mouseup, and mouseleave pauseCopy.addEventListener('mousedown', presspauseCopy2); pauseCopy.addEventListener('mouseup', releasepauseCopy2); pauseCopy.addEventListener('mouseleave', releasepauseCopy2); solveCopy.id = 'solveAllButton'; solveCopy.innerHTML = solvingIntervalId ? 'PAUSE SOLVE' : 'SOLVE ALL'; solveCopy.disabled = false; pauseCopy.innerHTML = 'SOLVE'; const solveCopyStyle = ` position: relative; min-width: 150px; font-size: 17px; border: none; border-bottom: 4px solid #2b70c9; border-radius: 16px; padding: 13px 16px; transform: translateZ(0); transition: filter .0s; font-weight: 700; letter-spacing: .8px; background: #1cb0f6; color: rgb(var(--color-snow)); margin-left: 20px; cursor: pointer; `; const pauseCopyStyle = ` position: relative; min-width: 100px; font-size: 17px; border: none; border-bottom: 4px solid #ff9600; border-radius: 16px; padding: 13px 16px; transform: translateZ(0); transition: filter .0s; font-weight: 700; letter-spacing: .8px; background: #ffc800; color: rgb(var(--color-snow)); margin-left: 20px; cursor: pointer; `; solveCopy.style.cssText = solveCopyStyle; pauseCopy.style.cssText = pauseCopyStyle; [solveCopy, pauseCopy].forEach(button => { button.addEventListener("mousemove", () => { button.style.filter = "brightness(1.1)"; }); }); [solveCopy, pauseCopy].forEach(button => { button.addEventListener("mouseleave", () => { button.style.filter = "none"; }); }); storiesContinue.parentElement.appendChild(pauseCopy); storiesContinue.parentElement.appendChild(solveCopy); solveCopy.addEventListener('click', solving); pauseCopy.addEventListener('click', solve); //solving(); } } else { // const wrapper = document.getElementsByClassName('_10vOG')[0]; const wrapper = document.querySelector('._10vOG, ._2L_r0'); wrapper.style.display = "flex"; // const solveCopy = document.createElement('button'); const presssolveCopy1 = () => { solveCopy.style.borderBottom = '0px'; solveCopy.style.marginBottom = '4px'; solveCopy.style.top = '4px'; }; // Function to revert the border-bottom when the button is released const releasesolveCopy1 = () => { solveCopy.style.borderBottom = '4px solid #2b70c9'; solveCopy.style.marginBottom = '0px'; solveCopy.style.top = '0px'; }; // Add event listeners for mousedown, mouseup, and mouseleave solveCopy.addEventListener('mousedown', presssolveCopy1); solveCopy.addEventListener('mouseup', releasesolveCopy1); solveCopy.addEventListener('mouseleave', releasesolveCopy1); const pauseCopy = document.createElement('button'); const presspauseCopy2 = () => { pauseCopy.style.borderBottom = '0px'; pauseCopy.style.marginBottom = '4px'; pauseCopy.style.top = '4px'; }; // Function to revert the border-bottom when the button is released const releasepauseCopy2 = () => { pauseCopy.style.borderBottom = '4px solid #ff9600'; pauseCopy.style.marginBottom = '0px'; pauseCopy.style.top = '0px'; }; // Add event listeners for mousedown, mouseup, and mouseleave pauseCopy.addEventListener('mousedown', presspauseCopy2); pauseCopy.addEventListener('mouseup', releasepauseCopy2); pauseCopy.addEventListener('mouseleave', releasepauseCopy2); solveCopy.id = 'solveAllButton'; solveCopy.innerHTML = solvingIntervalId ? 'PAUSE SOLVE' : 'SOLVE ALL'; solveCopy.disabled = false; pauseCopy.innerHTML = 'SOLVE'; const solveCopyStyle = ` position: relative; min-width: 150px; font-size: 17px; border: none; border-bottom: 4px solid #2b70c9; border-radius: 16px; padding: 13px 16px; transform: translateZ(0); transition: filter .0s; font-weight: 700; letter-spacing: .8px; background: #1cb0f6; color: rgb(var(--color-snow)); margin-left: 20px; cursor: pointer; `; const pauseCopyStyle = ` position: relative; min-width: 100px; font-size: 17px; border: none; border-bottom: 4px solid #ff9600; border-radius: 16px; padding: 13px 16px; transform: translateZ(0); transition: filter .0s; font-weight: 700; letter-spacing: .8px; background: #ffc800; color: rgb(var(--color-snow)); margin-left: 20px; cursor: pointer; `; solveCopy.style.cssText = solveCopyStyle; pauseCopy.style.cssText = pauseCopyStyle; [solveCopy, pauseCopy].forEach(button => { button.addEventListener("mousemove", () => { button.style.filter = "brightness(1.1)"; }); }); [solveCopy, pauseCopy].forEach(button => { button.addEventListener("mouseleave", () => { button.style.filter = "none"; }); }); original.parentElement.appendChild(pauseCopy); original.parentElement.appendChild(solveCopy); solveCopy.addEventListener('click', solving); pauseCopy.addEventListener('click', solve); //solving(); } } setInterval(addButtons, 100); const htmlContent = `

SEE ISSUES & ROADMAP

NEW

SEND FEEDBACK

SETTINGS

NEW

Stories are not supported yet

5s delay when activating

Chests now open automatically with Chromium Browsers

AutoSolver

2.0 BETA 8

How many lessons would you like to AutoSolve?

0
Practice Only Mode
Repeat Lesson Mode
`; const cssContent = ` .boxFirst { display: inline-flex; flex-direction: column; align-items: flex-end; gap: 8px; position: fixed; /* Fix the position to the bottom-right corner */ bottom: 24px; right: 24px; z-index: 2; } .SendFeedbackButtonAndSettingsButtonBox { display: flex; align-items: center; gap: 8px; align-self: stretch; } .DuolingoProSettingsButtonOne { position: relative; display: flex; height: 48px; width: calc(100% - 0px); padding: 16px 9px 16px 16px; justify-content: center; align-items: center; gap: 8px; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; width: auto; } .DuolingoProSettingsButtonOne:hover { filter: brightness(0.95); } .DuolingoProSettingsButtonOne:active { border-bottom: 2px solid rgba(0, 0, 0, 0.20); height: 46px; margin-top: 2px; filter: brightness(0.9); } .DuolingoProSettingsButtonOneTextOne { font-size: 16px; font-weight: 700; text-align: center; line-height: normal; color: #fff; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .SendFeedbackButtonOne { position: relative; display: flex; height: 48px; width: calc(100% - 0px); padding: 16px 16px 16px 16px; justify-content: center; align-items: center; gap: 8px; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; width: auto; } .SendFeedbackButtonOne:hover { filter: brightness(0.95); } .SendFeedbackButtonOne:active { height: 46px; margin-top: 2px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); filter: brightness(0.9); } .SendFeedbackButtonTextOne { font-size: 16px; font-weight: 700; text-align: center; line-height: normal; color: #fff; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .SendFeedbackButtonNewTagOne { display: flex; padding: 4px; flex-direction: column; justify-content: center; align-items: center; border-radius: 4px; background: #FF2D55; border: 2px solid rgba(0, 0, 0, 0.20); } .SendFeedbackButtonNewTagOneTextOne { color: #FFF; font-style: normal; font-weight: 700; line-height: normal; margin-top: 0px; margin-bottom: 0px; font-size: 12px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .SeeRoadmapButton { position: relative; display: flex; height: 48px; width: calc(100% - 0px); padding: 16px 9px 16px 16px; justify-content: center; align-items: center; gap: 8px; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; width: auto; } .SeeRoadmapButton:hover { filter: brightness(0.95); } .SeeRoadmapButton:active { border-bottom: 2px solid rgba(0, 0, 0, 0.20); height: 46px; margin-top: 2px; filter: brightness(0.9); } .SeeRoadmapButtonTextOne { font-size: 16px; font-weight: 700; text-align: center; line-height: normal; color: #fff; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .AutoSolverBoxBackground { display: flex; padding: 16px; flex-direction: column; justify-content: center; align-items: center; gap: 8px; border-radius: 16px; border: 2px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); width: 300px; } .AutoSolverBoxLayers { display: flex; width: 100%; flex-direction: column; align-items: flex-start; gap: 8px; } .AutoSolverBoxAlertSectionOne { display: flex; width: 100%; flex-direction: column; align-items: flex-start; gap: 16px; padding-bottom: 8px; } .AutoSolverBoxAlertOneBox { display: flex; align-items: center; gap: 8px; height: auto; cursor: default; } .AutoSolverBoxAlertOneBoxIconOne { width: 20px; height: 18px; fill: #FF2D55; } .AutoSolverBoxAlertOneBoxTextOne { color: #FF4B4B; font-weight: 700; font-size: 16px; margin-bottom: 0px; } .AutoSolverBoxAlertTwoBox { display: inline-flex; align-items: center; gap: 8px; height: auto; cursor: default; } .AutoSolverBoxAlertTwoBoxIconOne { width: 20px !important; height: 20px !important; fill: #FF9500; } .AutoSolverBoxAlertTwoBoxTextOne { color: #FF9500; font-weight: 700; font-size: 16px; margin-bottom: 0px; } .AutoSolverBoxSectionThreeBox { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; height: 100%; width: 100%; } .AutoSolverBoxTitleSectionOne { display: flex; justify-content: space-between; align-items: center; align-self: stretch; padding-bottom: 8px; padding: 0px; } .AutoSolverBoxTitleSectionOneTextOne { color: rgb(var(--color-eel)); font-style: normal; font-weight: 700; font-size: 24px; margin: 0px; cursor: default; } .AutoSolverBoxTitleSectionOneBETATagOne { display: flex; height: 36px; padding-right: 8px; padding-left: 8px; flex-direction: column; justify-content: center; align-items: center; border-radius: 8px; background: #FF2D55; border: 2px solid rgba(0, 0, 0, 0.20); } .AutoSolverBoxTitleSectionOneBETATagOneTextOne { color: #FFF; font-style: normal; font-weight: 700; line-height: normal; margin-top: 0px; margin-bottom: 0px; font-size: 16px; cursor: default; } .AutoSolverBoxTitleSectionTwoTextOne { color: rgb(var(--color-eel), 0.8); height: 44px; font-weight: 700; font-size: 16px; margin: 0px; margin-top: -2px; cursor: default; } .AutoSolverBoxSectionThreeBoxSectionOne { height: 100%; width: 100%; display: flex; justify-content: center; align-items: center; gap: 8px } .AutoSolverBoxRepeatNumberDownButton { position: relative; display: flex; width: 48px; height: 48px; flex-direction: column; justify-content: center; align-items: center; gap: 8px; flex-shrink: 0; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; color: #FFF; text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; } .AutoSolverBoxRepeatNumberDownButton:hover { filter: brightness(0.95); } .AutoSolverBoxRepeatNumberDownButton:active { margin-top: 2px; height: 46px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); filter: brightness(0.9); } .AutoSolverBoxRepeatNumberDisplay { position: relative; text-align: center; display: inline-flex; height: 48px; width: 100%; padding: 16px; justify-content: center; align-items: center; gap: 8px; font-size: 16px; font-weight: 700; border-radius: 8px; border: 2px solid rgb(var(--color-eel), 0.2); background: rgb(var(--color-swan), 0.8); cursor: default; color: rgb(var(--color-eel)); text-align: center; } .AutoSolverBoxRepeatNumberUpButton { position: relative; display: flex; width: 48px; height: 48px; flex-direction: column; justify-content: center; align-items: center; gap: 8px; flex-shrink: 0; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; color: #FFF; text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; } .AutoSolverBoxRepeatNumberUpButton:hover { filter: brightness(0.95); } .AutoSolverBoxRepeatNumberUpButton:active { margin-top: 2px; height: 46px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); filter: brightness(0.9); } .AutoSolverBoxSectionThreeBoxSectionTwo { height: 100%; width: 100%; display: flex; justify-content: center; align-items: center; gap: 8px; } .AutoSolverBoxSectionThreeBoxSectionTwoTextOne { position: relative; text-align: center; display: inline-flex; height: 48px; width: 100%; justify-content: left; align-items: center; gap: 8px; font-size: 16px; font-weight: 700; border-radius: 8px; cursor: default; color: rgb(var(--color-eel)); text-align: left; } .AutoSolverBoxSectionThreeBoxSectionTwoButton { position: relative; display: flex; width: 64px; height: 48px; flex-direction: column; justify-content: center; align-items: center; gap: 8px; flex-shrink: 0; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; color: rgb(var(--color-eel)); text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; } .AutoSolverBoxSectionThreeBoxSectionTwoButton:hover { filter: brightness(0.95); } .AutoSolverBoxSectionThreeBoxSectionTwoButton:active { height: 46px; margin-top: 2px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); filter: brightness(0.9); } .AutoSolverBoxRepeatStartButton { position: relative; display: flex; height: 48px; width: 100%; justify-content: center; align-items: center; gap: 8px; align-self: stretch; font-size: 16px; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; font-weight: 700; color: #FFF; text-align: center; cursor: pointer; transition: .1s; } .AutoSolverBoxRepeatStartButton:hover { filter: brightness(0.95); } .AutoSolverBoxRepeatStartButton:active { height: 46px; margin-top: 2px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); filter: brightness(0.9); } `; let injectedContainer = null; let injectedStyleElement = null; function injectContent() { if (window.location.pathname === '/learn') { // Inject the content if it's not already injected if (!injectedContainer) { // Creating a container for the overlay injectedContainer = document.createElement('div'); injectedContainer.innerHTML = htmlContent; document.body.appendChild(injectedContainer); // Creating a style tag for CSS injectedStyleElement = document.createElement('style'); injectedStyleElement.type = 'text/css'; injectedStyleElement.innerHTML = cssContent; document.head.appendChild(injectedStyleElement); initializeDuolingoProSystemButtons(); try { let AutoSolverBoxSectionThreeBoxSectionTwoIDOneForHiding = document.querySelector('#AutoSolverBoxSectionThreeBoxSectionTwoIDOne'); let AutoSolverBoxSectionThreeBoxSectionTwoIDTwoForHiding = document.querySelector('#AutoSolverBoxSectionThreeBoxSectionTwoIDTwo'); const AutoSolverBoxBackgroundForHiding = document.querySelector('.AutoSolverBoxBackground'); if (!AutoSolverSettingsShowAutoSolverBox) { AutoSolverBoxBackgroundForHiding.remove(); } else if (AutoSolverSettingsShowAutoSolverBox) { initializeAutoSolverBoxButtonInteractiveness(); something(); if (!AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox) { AutoSolverBoxSectionThreeBoxSectionTwoIDOneForHiding.remove(); } if (!AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox) { AutoSolverBoxSectionThreeBoxSectionTwoIDTwoForHiding.remove(); } } else { console.log('error 5'); } } catch(error) { } } } else { // Remove the content if it was previously injected if (injectedContainer) { document.body.removeChild(injectedContainer); document.head.removeChild(injectedStyleElement); injectedContainer = null; injectedStyleElement = null; } } } function initializeDuolingoProSystemButtons() { //console.log('yeah yeah yeah'); const DuolingoProSettingsButtonOne = document.querySelector('.DuolingoProSettingsButtonOne'); DuolingoProSettingsButtonOne.addEventListener('click', () => { wasDuolingoProSettingsButtonOnePressed = true; console.log('wasDuolingoProSettingsButtonOnePressed' + wasDuolingoProSettingsButtonOnePressed); }); const SendFeedbackButton = document.querySelector('.SendFeedbackButtonOne'); SendFeedbackButton.addEventListener('click', () => { isSendFeedbackButtonPressed = true; console.log('isSendFeedbackButtonPressed' + isSendFeedbackButtonPressed); }); } let isAutoSolverBoxRepeatStartButtonEnabled = false; function something() { //this is new try { const AutoSolverBoxRepeatStartButton = document.querySelector('.AutoSolverBoxRepeatStartButton'); function disableHover() { AutoSolverBoxRepeatStartButton.style.filter = ''; AutoSolverBoxRepeatStartButton.style.height = ''; AutoSolverBoxRepeatStartButton.style.marginTop = ''; AutoSolverBoxRepeatStartButton.style.borderBottom = ''; } function enableHover() { AutoSolverBoxRepeatStartButton.style.filter = 'brightness(1.0)'; AutoSolverBoxRepeatStartButton.style.height = '46px'; AutoSolverBoxRepeatStartButton.style.marginTop = '2px'; AutoSolverBoxRepeatStartButton.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } if (autoSolverBoxRepeatAmount > 0 || DuolingoProSettingsNeverEndMode) { AutoSolverBoxRepeatStartButton.style.opacity = '100%'; AutoSolverBoxRepeatStartButton.style.cursor = 'pointer'; isAutoSolverBoxRepeatStartButtonEnabled = true; console.log(autoSolverBoxRepeatAmount); } else if (autoSolverBoxRepeatAmount === 0) { AutoSolverBoxRepeatStartButton.style.opacity = '0.5'; AutoSolverBoxRepeatStartButton.style.cursor = 'not-allowed'; isAutoSolverBoxRepeatStartButtonEnabled = false; } else { AutoSolverBoxRepeatStartButton.style.opacity = '0.5'; AutoSolverBoxRepeatStartButton.style.cursor = 'not-allowed'; isAutoSolverBoxRepeatStartButtonEnabled = false; } if (isAutoSolverBoxRepeatStartButtonEnabled) { disableHover(); } else { enableHover(); } } catch (error) { } //this is new end } function initializeAutoSolverBoxButtonInteractiveness() { const AutoSolverBoxRepeatNumberDisplay = document.querySelector('.AutoSolverBoxRepeatNumberDisplay'); const AutoSolverBoxRepeatNumberDownButton = document.querySelector('.AutoSolverBoxRepeatNumberDownButton'); const AutoSolverBoxRepeatNumberUpButton = document.querySelector('.AutoSolverBoxRepeatNumberUpButton'); const AutoSolverBoxRepeatStartButton = document.querySelector('.AutoSolverBoxRepeatStartButton'); AutoSolverBoxRepeatNumberDisplay.textContent = autoSolverBoxRepeatAmount; something(); if (DuolingoProSettingsNeverEndMode) { AutoSolverBoxRepeatNumberDisplay.textContent = "∞"; AutoSolverBoxRepeatNumberDisplay.style.fontSize = '22px'; } AutoSolverBoxRepeatNumberDownButton.addEventListener('click', () => { if (!DuolingoProSettingsNeverEndMode) { autoSolverBoxRepeatAmount--; if (autoSolverBoxRepeatAmount < 0) { autoSolverBoxRepeatAmount = 0; } AutoSolverBoxRepeatNumberDisplay.textContent = autoSolverBoxRepeatAmount; sessionStorage.setItem('autoSolverBoxRepeatAmount', autoSolverBoxRepeatAmount); } else { } something(); }); AutoSolverBoxRepeatNumberUpButton.addEventListener('click', () => { if (!DuolingoProSettingsNeverEndMode) { autoSolverBoxRepeatAmount++; AutoSolverBoxRepeatNumberDisplay.textContent = autoSolverBoxRepeatAmount; sessionStorage.setItem('autoSolverBoxRepeatAmount', autoSolverBoxRepeatAmount); } else { } something(); }); if (wasAutoSolverBoxRepeatStartButtonPressed === true) { AutoSolverBoxRepeatStartButton.textContent = 'STOP'; } if (autoSolverBoxRepeatAmount === 0) { wasAutoSolverBoxRepeatStartButtonPressed = false; sessionStorage.setItem('wasAutoSolverBoxRepeatStartButtonPressed', wasAutoSolverBoxRepeatStartButtonPressed); AutoSolverBoxRepeatStartButton.textContent = 'START'; } if (wasAutoSolverBoxRepeatStartButtonPressed === true) { AutoSolverBoxRepeatStartButton.textContent = 'STOP'; AutoSolverBoxRepeatStartButtonActions(); } function AutoSolverBoxRepeatStartButtonActions() { if (autoSolverBoxRepeatAmount > 0) { sessionStorage.setItem('autoSolverBoxRepeatAmount', autoSolverBoxRepeatAmount); try { const openChestThingy = document.querySelector("button[aria-label='Open chest']"); openChestThingy.click(); } catch (error) { } setTimeout(function() { if (!DuolingoProSettingsNeverEndMode) { if (wasAutoSolverBoxRepeatStartButtonPressed === true && autoSolverBoxRepeatAmount > 0) { autoSolverBoxRepeatAmount--; sessionStorage.setItem('autoSolverBoxRepeatAmount', autoSolverBoxRepeatAmount); if (autoSolverBoxPracticeOnlyMode) { window.location.href = "https://duolingo.com/practice"; } else if (autoSolverBoxRepeatLessonMode) { window.location.href = "https://duolingo.com/lesson/unit/1/level/1"; } else { window.location.href = "https://duolingo.com/lesson"; } } else { console.log('cancelled'); } } else if (wasAutoSolverBoxRepeatStartButtonPressed === true) { if (autoSolverBoxPracticeOnlyMode) { window.location.href = "https://duolingo.com/practice"; } else if (autoSolverBoxRepeatLessonMode) { window.location.href = "https://duolingo.com/lesson/unit/1/level/1"; } else { window.location.href = "https://duolingo.com/lesson"; } } }, 4000); } } //this is new try { AutoSolverBoxRepeatStartButton.addEventListener('click', () => { if (autoSolverBoxRepeatAmount > 0) { AutoSolverBoxRepeatStartButton.textContent = AutoSolverBoxRepeatStartButton.textContent === 'START' ? 'STOP' : 'START'; wasAutoSolverBoxRepeatStartButtonPressed = !wasAutoSolverBoxRepeatStartButtonPressed; sessionStorage.setItem('wasAutoSolverBoxRepeatStartButtonPressed', wasAutoSolverBoxRepeatStartButtonPressed); } console.log(wasAutoSolverBoxRepeatStartButtonPressed); analyticsLogsSend('Duolingo Pro AutoSolver Box START Button', wasAutoSolverBoxRepeatStartButtonPressed ? 'ON' : 'OFF') setTimeout(function() { AutoSolverBoxRepeatStartButtonActions(); }, 500); }); } catch(error) { } //this is new end try { const AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement = document.querySelector('#AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOne'); const AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement = document.querySelector('#AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwo'); AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement.addEventListener('mouseup', () => { if (autoSolverBoxPracticeOnlyMode) { autoSolverBoxPracticeOnlyMode = !autoSolverBoxPracticeOnlyMode; sessionStorage.setItem('autoSolverBoxPracticeOnlyMode', autoSolverBoxPracticeOnlyMode); updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement, autoSolverBoxPracticeOnlyMode); } else { autoSolverBoxPracticeOnlyMode = !autoSolverBoxPracticeOnlyMode; autoSolverBoxRepeatLessonMode = !autoSolverBoxPracticeOnlyMode; sessionStorage.setItem('autoSolverBoxPracticeOnlyMode', autoSolverBoxPracticeOnlyMode); sessionStorage.setItem('autoSolverBoxRepeatLessonMode', autoSolverBoxRepeatLessonMode); updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement, autoSolverBoxPracticeOnlyMode, AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement, autoSolverBoxRepeatLessonMode); } }); AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement.addEventListener('mouseup', () => { if (autoSolverBoxRepeatLessonMode) { autoSolverBoxRepeatLessonMode = !autoSolverBoxRepeatLessonMode; sessionStorage.setItem('autoSolverBoxRepeatLessonMode', autoSolverBoxRepeatLessonMode); updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement, autoSolverBoxRepeatLessonMode); } else { autoSolverBoxRepeatLessonMode = !autoSolverBoxRepeatLessonMode; autoSolverBoxPracticeOnlyMode = !autoSolverBoxRepeatLessonMode; sessionStorage.setItem('autoSolverBoxPracticeOnlyMode', autoSolverBoxPracticeOnlyMode); sessionStorage.setItem('autoSolverBoxRepeatLessonMode', autoSolverBoxRepeatLessonMode); updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement, autoSolverBoxRepeatLessonMode, AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement, autoSolverBoxPracticeOnlyMode); } }); AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement.addEventListener('mousedown', () => { if (!autoSolverBoxPracticeOnlyMode) { AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement.style.border = '2px solid rgb(var(--color-swan))'; AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement.addEventListener('mousedown', () => { if (!autoSolverBoxRepeatLessonMode) { AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement.style.border = '2px solid rgb(var(--color-swan))'; AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); addEventListener('mouseup', () => { updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement, autoSolverBoxPracticeOnlyMode); updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement, autoSolverBoxRepeatLessonMode); }); updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDOneElement, autoSolverBoxPracticeOnlyMode); updateAutoSolverToggles(AutoSolverBoxSectionThreeBoxSectionTwoButtonIDTwoElement, autoSolverBoxRepeatLessonMode); } catch(error) { } function updateAutoSolverToggles(element, value, oppsiteElement, oppositeValue) { try { element.textContent = value ? "ON" : "OFF"; oppsiteElement.textContent = value ? "OFF" : "ON"; } catch(error) { } try { if (value) { element.style.background = '#007AFF'; element.style.border = '2px solid rgba(0, 0, 0, 0.20)'; element.style.borderBottom = '4px solid rgba(0, 0, 0, 0.20)'; element.style.color = '#fff'; oppsiteElement.style.background = 'rgb(var(--color-snow))'; oppsiteElement.style.border = '2px solid rgb(var(--color-swan))'; oppsiteElement.style.borderBottom = '4px solid rgb(var(--color-swan))'; oppsiteElement.style.color = '#fff'; } else { element.style.background = 'rgb(var(--color-snow))'; element.style.border = '2px solid rgb(var(--color-swan))'; element.style.borderBottom = '4px solid rgb(var(--color-swan))'; element.style.color = 'rgb(var(--color-eel))'; oppsiteElement.style.background = '#007AFF'; oppsiteElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; oppsiteElement.style.borderBottom = '4px solid rgba(0, 0, 0, 0.20)'; oppsiteElement.style.color = 'rgb(var(--color-eel))'; } } catch(error) { } } console.log('initializeAutoSolverBoxButtonInteractiveness ran'); } setInterval(injectContent, 100); function checkURLForAutoSolverBox() { if (window.location.pathname === '/lesson' || window.location.pathname.includes('/unit') || window.location.pathname === '/practice') { setTimeout(function() { if (wasAutoSolverBoxRepeatStartButtonPressed === true) { solving(true); } else { console.log('error 2'); } }, 1000); } else { } } checkURLForAutoSolverBox(); injectContent(); let DuolingoSiderbarPaddingThingFunctionRepeatTimes = 20; function DuolingoHomeSidebarAddPaddingFunction() { if (window.location.pathname === '/learn') { try { const DuolingoSiderbarPaddingThing = document.querySelector('.Fc0NK'); if (AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox && AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox) { DuolingoSiderbarPaddingThing.style.paddingBottom = '602px'; // or 574px if an 8px gap preferred } else if (AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox || AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox) { DuolingoSiderbarPaddingThing.style.paddingBottom = '546px'; // or 518px if an 8px gap preferred } else { DuolingoSiderbarPaddingThing.style.paddingBottom = '490px'; // or 462px if an 8px gap preferred } } catch(error) { } } } setInterval(DuolingoHomeSidebarAddPaddingFunction, 100); function DuolingoRemoveLearnAds() { // if (window.location.pathname === '/learn' || window.location.pathname === '/shop') { try { const DuolingoRemoveLearnAdsElementOne = document.querySelector('._3bfsh'); DuolingoRemoveLearnAdsElementOne.remove(); } catch(error) { } // } } const RemovedByDuolingoProOneHTML = `

Ads Blocked by Duolingo Pro

HIDE

These ads were removed with ProBlock by Duolingo Pro.

`; const RemovedByDuolingoProOneCSS = ` .BlockedByDuolingoProBoxBackground { display: flex; width: 100%; padding: 16px; flex-direction: column; justify-content: center; align-items: center; gap: 4px; flex-shrink: 0; border-radius: 16px; border: 2px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); } .BlockedByDuolingoProBoxSectionOne { display: flex; justify-content: space-between; align-items: center; align-self: stretch; } .BlockedByDuolingoProBoxSectionOneTextOne { color: rgb(var(--color-eel)); font-size: 18px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .BlockedByDuolingoProBoxSectionOneTextTwo { color: var(--web-ui_button-color,rgb(var(--color-macaw))); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: pointer; transition: .1s; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .BlockedByDuolingoProBoxSectionOneTextTwo:hover { filter: brightness(1.1); } .BlockedByDuolingoProBoxSectionOneTextTwo:active { filter: brightness(1.2); } .BlockedByDuolingoProBoxSectionTwoTextOne { align-self: stretch; color: rgb(var(--color-hare)); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } `; let injectedRemovedByDuolingoProOneElement = null; let injectedRemovedByDuolingoProOneStyle = null; function iforgot() { try { // if (window.location.pathname === '/learn' || window.location.pathname === '/shop') { let targetDiv = document.querySelector('.Fc0NK'); if (targetDiv) { if (ProBlockBannerOneVisible) { if (!injectedRemovedByDuolingoProOneElement) { injectedRemovedByDuolingoProOneStyle = document.createElement('style'); injectedRemovedByDuolingoProOneStyle.type = 'text/css'; injectedRemovedByDuolingoProOneStyle.innerHTML = RemovedByDuolingoProOneCSS; document.head.appendChild(injectedRemovedByDuolingoProOneStyle); injectedRemovedByDuolingoProOneElement = document.createElement('div'); injectedRemovedByDuolingoProOneElement.innerHTML = RemovedByDuolingoProOneHTML; targetDiv.appendChild(injectedRemovedByDuolingoProOneElement); } else { let BlockedByDuolingoProBoxSectionOneTextTwoElement = document.querySelector('.BlockedByDuolingoProBoxSectionOneTextTwo'); let BlockedByDuolingoProBoxBackgroundElement = document.querySelector('.BlockedByDuolingoProBoxBackground'); BlockedByDuolingoProBoxSectionOneTextTwoElement.addEventListener('click', () => { ProBlockBannerOneVisible = false; localStorage.setItem("ProBlockBannerOneVisible", ProBlockBannerOneVisible); BlockedByDuolingoProBoxBackgroundElement.remove(); }); if (document.querySelector('.BlockedByDuolingoProBoxBackground')) { } else { injectedRemovedByDuolingoProOneElement = null; injectedRemovedByDuolingoProOneStyle = null; } } } } else { console.error("Target div with class 'Fc0NK' not found."); } // } else { // } } catch(error) { } } if (DuolingoProSettingsProBlockMode) { setInterval(iforgot, 100); setInterval(DuolingoRemoveLearnAds, 100); } function theconsoleOne() { console.log(autoSolverBoxPracticeOnlyMode); console.log(autoSolverBoxRepeatLessonMode); } //setInterval(theconsoleOne, 1000); const SendFeedbackBoxHTML = `

Send Feedback for Duolingo Pro

Choose Feedback Type

Bug Report

Suggestion

Choose Sender ID

My Duolingo ProID  (LEARN MORE)

Anonymous (Not available in BETA)

`; const SendFeedbackBoxCSS = ` .SendFeebackBoxShadow { position: fixed; display: flex; width: 100%; height: 100vh; justify-content: center; align-items: center; flex-shrink: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(8px); z-index: 2; top: 0px; bottom: 0px; right: 0px; left: 0px; } .SendFeebackBoxBackground { display: flex; padding: 16px; justify-content: center; align-items: center; gap: 16px; border-radius: 16px; border: 2px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); width: 80%; max-width: 500px; min-width: 368px; } .SendFeebackBoxLayers { display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 8px; width: 100%; } form { width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 8px; } .SendFeebackBoxSectionOne { display: flex; justify-content: space-between; align-items: center; gap: 16px; width: 100%; height: 38px; } .SendFeebackBoxSectionOneTextOne { color: rgb(var(--color-eel)); font-size: 24px; font-style: normal; font-weight: 700; line-height: normal; margin-top: 0px; margin-bottom: 0px; height: 32px; cursor: default; } .SendFeebackBoxSectionOneCancelBoxBackground { display: flex; width: 34px; height: 36px; flex-shrink: 0; flex-direction: column; justify-content: center; align-items: center; background: rgb(var(--color-snow)); border-radius: 8px; border: 2px solid rgb(var(--color-eel), 0.2); border-bottom: 4px solid rgb(var(--color-eel), 0.2); cursor: pointer; transition: .1s; } .SendFeebackBoxSectionOneCancelBoxBackground:hover { filter: brightness(0.95); } .SendFeebackBoxSectionOneCancelBoxBackground:active { height: 34px; border-bottom: 2px solid rgb(var(--color-eel), 0.2); margin-top: 2px; filter: brightness(0.9); } .SendFeebackBoxSectionOneCancelBoxIconOne { display: flex; width: 12px; height: 12px; flex-direction: column; justify-content: center; flex-shrink: 0; fill: rgb(var(--color-eel), 0.4); } .SendFeebackBoxSectionTwo { display: flex; width: 100%; height: 150px; resize: vertical; padding: 8px; box-sizing: border-box; justify-content: center; align-items: center; border-radius: 8px; border: 2px solid rgb(var(--color-eel), 0.2); background: rgb(var(--color-swan), 0.4); color: rgb(var(--color-eel)); placeholder-color: rgb(var(--color-swan)); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; } .SendFeebackBoxSectionTwo::placeholder { font-weight: 700; } .SendFeebackBoxSectionTwo:focus { border: 2px solid #007AFF; } .SendFeebackBoxSectionThree { display: flex; width: 100%; flex-direction: column; justify-content: center; color: rgb(var(--color-eel)); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; cursor: default; margin-top: 0px; margin-bottom: 0px; height: 32px; } .SendFeebackBoxSectionFour { display: flex; width: 100%; justify-content: center; align-items: center; align-self: stretch; gap: 8px; } .SendFeebackBoxSectionFourButtonOneBackground { display: flex; height: 54px; align-items: center; flex: 1 0 0; border-radius: 8px; border: 2px solid rgb(var(--color-swan)); border-bottom: 4px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); cursor: pointer; transition: .1s; } .SendFeebackBoxSectionFourButtonOneBackground:hover { filter: brightness(0.95); } .SendFeebackBoxSectionFourButtonOneBackground:active { height: 52px; border-bottom: 2px solid rgb(var(--color-swan)); filter: brightness(0.9); margin-top: 2px; } .SendFeebackBoxSectionFourButtonOneIconOneBox { display: flex; width: 48px; height: 48px; justify-content: center; align-items: center; } .SendFeebackBoxSectionFourButtonOneIconOne { appearance: none; width: 20px; height: 20px; flex-shrink: 0; margin-right: 16px; margin-left: 16px; border-radius: 20px; border: 4px solid rgb(var(--color-swan), 0.4); background: rgb(var(--color-swan), 0.2); opacity: 100% !important; cursor: pointer; } .SendFeebackBoxSectionFourButtonOneTextOne { flex: 1 0 0; color: rgb(var(--color-swan)); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .SendFeebackBoxSectionFourButtonOneIconTwoBox { display: flex; width: 48px; height: 48px; justify-content: center; align-items: center; } .SendFeebackBoxSectionFourButtonOneIconTwo { display: flex; width: 16px; height: 16px; flex-direction: column; justify-content: center; align-items: center; color: rgba(255, 45, 85, 0.00); text-align: center; font-size: 15px; font-style: normal; font-weight: 700; line-height: normal; fill: #FF2D55; } .SendFeebackBoxSectionSix { display: flex; height: 54px; align-items: center; align-self: stretch; flex: 1 0 0; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; } .SendFeebackBoxSectionSix:hover { filter: brightness(0.95); } .SendFeebackBoxSectionSix:active { height: 52px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); filter: brightness(0.9); margin-top: 2px; } .SendFeebackBoxSectionSixIconOneBox { display: flex; width: 48px; height: 48px; justify-content: center; align-items: center; } .SendFeebackBoxSectionSixIconOne { width: 20px; height: 20px; flex-shrink: 0; border-radius: 20px; border: 4px solid rgb(241, 247, 251, 0.40); background: rgb(241, 247, 251, 0.40); } .SendFeebackBoxSectionSixTextOne { flex: 1 0 0; color: rgb(241, 247, 251); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .SendFeebackBoxSectionSixIconTwoBox { display: flex; width: 48px; height: 48px; justify-content: center; align-items: center; } .SendFeebackBoxSectionSixIconTwo { display: flex; width: 16px; height: 16px; flex-direction: column; justify-content: center; align-items: center; fill: rgb(241, 247, 251); text-align: center; line-height: normal; } .SendFeebackBoxSectionSeven { // height: 48px; height: 56px; align-self: stretch; border-radius: 8px; position: relative; cursor: not-allowed !important; } .SendFeebackBoxSectionSevenBoxOne { flex-shrink: 0; display: flex; gap: 32px; align-items: center; height: 54px; /* set the height */ overflow: hidden; /* clip any overflowing content */ border-radius: 8px; pointer-events: none; } .SendFeebackBoxSectionSevenBoxOneBoxOne { width: 16px; height: 100px; transform: rotate(45deg); flex-shrink: 0; background: rgb(var(--color-eel), 0.1); } .SendFeebackBoxSectionSevenBoxTwo { display: flex; height: 54px; align-items: center; align-self: stretch; flex: 1 0 0; position: absolute; width: 100%; border-radius: 8px; border: 2px solid rgb(var(--color-swan)); border-bottom: 4px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); // cursor: pointer; transition: .1s; } .SendFeebackBoxSectionSevenBoxTwo:hover { filter: brightness(0.95); } .SendFeebackBoxSectionSevenBoxTwo:active { border-bottom: 4px solid rgb(var(--color-swan)); filter: brightness(0.95); } .SendFeebackBoxSectionSevenBoxTwoIconOneBox { display: flex; width: 48px; height: 48px; justify-content: center; align-items: center; } .SendFeebackBoxSectionSevenBoxTwoIconOne { width: 20px; height: 20px; flex-shrink: 0; border-radius: 20px; border: 4px solid rgb(var(--color-swan), 0.4); background: rgb(var(--color-swan), 0.2); } .SendFeebackBoxSectionSevenBoxTwoTextOne { flex: 1 0 0; color: rgb(var(--color-swan)); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin-top: 0px; margin-bottom: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .SendFeebackBoxSectionSevenBoxTwoIconTwoBox { display: flex; width: 48px; height: 48px; justify-content: center; align-items: center; } .SendFeebackBoxSectionSevenBoxTwoIconTwo { display: flex; width: 16px; height: 16px; flex-direction: column; justify-content: center; align-items: center; text-align: center; line-height: normal; fill: rgb(var(--color-swan)); } .SendFeedbackBoxSectionEight { display: flex; justify-content: center; align-items: center; gap: 8px; align-self: stretch; } .SendFeebackBoxSectionEightSendButton { display: flex; height: 54px; width: 100%; justify-content: center; align-items: center; gap: 10px; align-self: stretch; border-radius: 8px; border: 2px solid #0062CC; border-bottom: 4px solid #0062CC; background: #007AFF; color: #FFF; text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; cursor: pointer; transition: .1s; padding: 0px; } .SendFeebackBoxSectionEightSendButton:hover { filter: brightness(0.95); } .SendFeebackBoxSectionEightSendButton:active { height: 52px; border-bottom: 2px solid #0062CC; margin-top: 2px; filter: brightness(0.9); } .SendFeebackBoxSectionEightEmailButton { display: flex; height: 54px; width: 100%; justify-content: center; align-items: center; gap: 10px; align-self: stretch; border-radius: 8px; border: 2px solid rgb(var(--color-swan)); border-bottom: 4px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); color: rgb(var(--color-eel)); text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; cursor: pointer; transition: .1s; text-decoration: none; } .SendFeebackBoxSectionEightEmailButton:hover { filter: brightness(0.95); } .SendFeebackBoxSectionEightEmailButton:active { height: 52px; border-bottom: 2px solid rgb(var(--color-swan)); margin-top: 2px; filter: brightness(0.9); } .SendFeebackBoxSectionEightTextOne { display: flex; flex-direction: column; justify-content: center; flex: 1 0 0; align-self: stretch; color: #FFF; text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } `; let randomValue; function setRandomValue() { if (Boolean(localStorage.getItem("RandomValue")) === false) { randomValue = Math.floor(Math.random() * 1000000); // Generates a random number between 0 and 999999 localStorage.setItem("RandomValue", String(randomValue)); console.log("Generated ID: ", randomValue); // This is to show you the generated ID, you can remove it later } else { randomValue = localStorage.getItem("RandomValue"); } } setRandomValue(); let injectedSendFeedBackBoxElement = null; let injectedSendFeedBackBoxStyle = null; let isSendFeebackBoxSectionEightSendButtonEnabled = false; let SendFeedbackTextAreaValue; let idktype = 'Bug Report'; let sendFeedbackStatus = 'none'; function injectSendFeedBackBox() { //console.log('injectSendFeedBackBox called'); if (isSendFeedbackButtonPressed === true) { // Inject the content if it's not already injected if (!injectedSendFeedBackBoxElement) { // Creating a container for the overlay injectedSendFeedBackBoxElement = document.createElement('div'); injectedSendFeedBackBoxElement.innerHTML = SendFeedbackBoxHTML; document.body.appendChild(injectedSendFeedBackBoxElement); // Creating a style tag for CSS injectedSendFeedBackBoxStyle = document.createElement('style'); injectedSendFeedBackBoxStyle.type = 'text/css'; injectedSendFeedBackBoxStyle.innerHTML = SendFeedbackBoxCSS; document.head.appendChild(injectedSendFeedBackBoxStyle); const SendFeedbackCloseButton = document.querySelector('.SendFeebackBoxSectionOneCancelBoxBackground'); SendFeedbackCloseButton.addEventListener('click', () => { isSendFeedbackButtonPressed = false; }); // Get the textarea element const TextAreaOneOne = document.getElementById('SendFeebackBoxSectionTwoID'); // Set the value of the textarea to the variable const bugRadio = document.getElementById('SendFeebackTypeButtonOne'); const suggestionRadio = document.getElementById('SendFeebackTypeButtonTwo'); // Create a variable to store the value of the selected radio button // Add a change event listener to both radio buttons bugRadio.addEventListener('mousedown', () => { if (idktype === 'Bug Report') { bugRadio.style.border = '2px solid rgba(0, 0, 0, 0.20)'; bugRadio.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } else { bugRadio.style.border = '2px solid rgb(var(--color-swan))'; bugRadio.style.borderBottom = '2px solid rgb(var(--color-swan))'; } }); bugRadio.addEventListener('mouseup', () => { idktype = 'Bug Report'; updateDuolingoProSendFeedbackButtons(bugRadio, idktype); }); suggestionRadio.addEventListener('mousedown', () => { if (idktype === 'Suggestion') { suggestionRadio.style.border = '2px solid rgba(0, 0, 0, 0.20)'; suggestionRadio.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } else { suggestionRadio.style.border = '2px solid rgb(var(--color-swan))'; suggestionRadio.style.borderBottom = '2px solid rgb(var(--color-swan))'; } }); suggestionRadio.addEventListener('mouseup', () => { idktype = 'Suggestion'; updateDuolingoProSendFeedbackButtonsTwo(bugRadio, idktype); }); addEventListener('mouseup', () => { updateDuolingoProSendFeedbackButtons(bugRadio, idktype); updateDuolingoProSendFeedbackButtonsTwo(suggestionRadio, idktype); }); updateDuolingoProSendFeedbackButtons(bugRadio, idktype); updateDuolingoProSendFeedbackButtonsTwo(suggestionRadio, idktype); const SendFeebackBoxSectionTwo = document.querySelector('.SendFeebackBoxSectionTwo'); const SendFeebackBoxSectionEightSendButton = document.querySelector('.SendFeebackBoxSectionEightSendButton'); SendFeebackBoxSectionEightSendButton.addEventListener('click', () => { if (isSendFeebackBoxSectionEightSendButtonEnabled) { SendFeedbackTextAreaValue = TextAreaOneOne.value; sendFeedbackNew(SendFeedbackTextAreaValue, idktype); sendFeedbackStatus = 'trying'; function checkFlag() { if (sendFeedbackStatus === 'trying') { SendFeebackBoxSectionEightSendButton.textContent = 'SENDING'; setTimeout(function() { checkFlag(); }, 100); } else if (sendFeedbackStatus === 'true') { SendFeebackBoxSectionEightSendButton.textContent = 'SUCCESSFULLY SENT'; setTimeout(function() { location.reload(); }, 1000); } else if (sendFeedbackStatus === 'error') { SendFeebackBoxSectionEightSendButton.textContent = 'ERROR SENDING'; SendFeebackBoxSectionEightSendButton.style.background = '#FF2D55'; SendFeebackBoxSectionEightSendButton.style.border = '2px solid rgba(0, 0, 0, 0.20)'; SendFeebackBoxSectionEightSendButton.style.borderBottom = '4px solid rgba(0, 0, 0, 0.20)'; setTimeout(function() { SendFeebackBoxSectionEightSendButton.textContent = 'TRY AGAIN'; }, 2000); setTimeout(function() { SendFeebackBoxSectionEightSendButton.textContent = 'SEND'; SendFeebackBoxSectionEightSendButton.style.background = ''; SendFeebackBoxSectionEightSendButton.style.border = ''; SendFeebackBoxSectionEightSendButton.style.borderBottom = ''; }, 4000); sendFeedbackStatus = 'empty'; } else if (sendFeedbackStatus === 'empty') { setTimeout(function() { checkFlag(); }, 100); } } checkFlag(); } }); function updateDuolingoProSendFeedbackButtons(element, value) { let textElement = element.querySelector('.SendFeebackBoxSectionFourButtonOneTextOne'); let iconElement = element.querySelector('.SendFeebackBoxSectionFourButtonOneIconOne'); if (value === 'Bug Report') { element.style.background = '#FF2D55'; element.style.border = '2px solid rgba(0, 0, 0, 0.20)'; element.style.borderBottom = '4px solid rgba(0, 0, 0, 0.20)'; textElement.style.color = 'rgb(241, 247, 251)'; iconElement.style.border = '4px solid rgb(241, 247, 251, 0.40)'; iconElement.style.background = 'rgb(241, 247, 251, 0.40)'; } else { element.style.background = 'rgb(var(--color-snow))'; element.style.border = '2px solid rgb(var(--color-swan))'; element.style.borderBottom = '4px solid rgb(var(--color-swan))'; textElement.style.color = 'rgb(var(--color-eel), 0.4)'; iconElement.style.border = '4px solid rgb(var(--color-swan))'; iconElement.style.background = 'rgb(var(--color-swan), 0.4)'; } } function updateDuolingoProSendFeedbackButtonsTwo(element, value) { let textElement = element.querySelector('.SendFeebackBoxSectionFourButtonOneTextOne'); let iconElement = element.querySelector('.SendFeebackBoxSectionFourButtonOneIconOne'); if (value === 'Suggestion') { element.style.background = '#34C759'; element.style.border = '2px solid rgba(0, 0, 0, 0.20)'; element.style.borderBottom = '4px solid rgba(0, 0, 0, 0.20)'; textElement.style.color = 'rgb(241, 247, 251)'; iconElement.style.border = '4px solid rgb(241, 247, 251, 0.40)'; iconElement.style.background = 'rgb(241, 247, 251, 0.40)'; } else { element.style.background = 'rgb(var(--color-snow))'; element.style.border = '2px solid rgb(var(--color-swan))'; element.style.borderBottom = '4px solid rgb(var(--color-swan))'; textElement.style.color = 'rgb(var(--color-eel), 0.4)'; iconElement.style.border = '4px solid rgb(var(--color-swan))'; iconElement.style.background = 'rgb(var(--color-swan), 0.4)'; } } } } else { // Remove the content if it was previously injected if (injectedSendFeedBackBoxElement) { document.body.removeChild(injectedSendFeedBackBoxElement); document.head.removeChild(injectedSendFeedBackBoxStyle); injectedSendFeedBackBoxElement = null; injectedSendFeedBackBoxStyle = null; } } } setInterval(injectSendFeedBackBox, 100); function SendFeedbackTextAreaStuff() { if (isSendFeedbackButtonPressed === true) { try { const SendFeebackBoxSectionEightSendButton = document.querySelector('.SendFeebackBoxSectionEightSendButton'); const SendFeebackBoxSectionTwo = document.querySelector('.SendFeebackBoxSectionTwo'); function disableHoverOne() { SendFeebackBoxSectionEightSendButton.style.marginTop = ''; SendFeebackBoxSectionEightSendButton.style.height = ''; SendFeebackBoxSectionEightSendButton.style.border = ''; SendFeebackBoxSectionEightSendButton.style.borderBottom = ''; } function enableHoverOne() { SendFeebackBoxSectionEightSendButton.style.marginTop = '2px'; SendFeebackBoxSectionEightSendButton.style.height = '52px'; SendFeebackBoxSectionEightSendButton.style.border = '2px solid rgb(var(--color-eel), 0.2)'; SendFeebackBoxSectionEightSendButton.style.borderBottom = '2px solid rgb(var(--color-eel), 0.2)'; } if (SendFeebackBoxSectionTwo.value.trim().length > 16) { SendFeebackBoxSectionEightSendButton.style.opacity = '100%'; SendFeebackBoxSectionEightSendButton.style.cursor = 'pointer'; isSendFeebackBoxSectionEightSendButtonEnabled = true; } else { SendFeebackBoxSectionEightSendButton.style.opacity = '0.5'; SendFeebackBoxSectionEightSendButton.style.cursor = 'not-allowed'; isSendFeebackBoxSectionEightSendButtonEnabled = false; } if (isSendFeebackBoxSectionEightSendButtonEnabled) { disableHoverOne(); } else { enableHoverOne(); } } catch (error) { } } } setInterval(SendFeedbackTextAreaStuff, 100); const WhatsNewBoxHTML = `

What’s New

2.0 BETA 8

Example Title

Example description.

NEXT

`; const WhatsNewBoxCSS = ` .WhatsNewBoxOneShadow { position: fixed; display: flex; width: 100%; height: 100vh; justify-content: center; align-items: center; flex-shrink: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(8px); z-index: 2; top: 0px; bottom: 0px; right: 0px; left: 0px; } .WhatsNewBoxOneBackground { display: flex; padding: 16px; flex-direction: column; justify-content: center; align-items: center; gap: 8px; border-radius: 16px; border: 2px solid rgba(0, 0, 0, 0.10); background: #FFF; width: 400px; } .WhatsNewBoxOneSectionOne { display: flex; justify-content: space-between; align-items: center; align-self: stretch; } .WhatsNewBoxOneSectionOneTextOne { color: #000; font-size: 24px; font-style: normal; font-weight: 700; line-height: normal; cursor: default; margin: 0px; } .WhatsNewBoxOneSectionOneBoxOne { display: flex; padding: 8px; flex-direction: column; justify-content: center; align-items: center; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); background: #FF2D55; } .WhatsNewBoxOneSectionOneBoxOneTextOne { color: #FFF; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; cursor: default; margin: 0px; } .WhatsNewBoxOneSectionTwo { display: flex; height: 300px; flex-direction: column; justify-content: center; align-items: center; align-self: stretch; padding: 0px; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); background: rgba(0, 0, 0, 0.05); } .WhatsNewBoxOneSectionTwoImageOne { width: 100%; border-radius: 8px; } .WhatsNewBoxOneSectionThree { display: flex; padding-bottom: 0px; flex-direction: column; align-items: flex-start; gap: 4px; align-self: stretch; margin-top: 4px; margin-bottom: 8px; } .WhatsNewBoxOneSectionThreeTextOne { align-self: stretch; color: #000; font-size: 20px; font-style: normal; font-weight: 700; line-height: normal; cursor: default; margin: 0px; } .WhatsNewBoxOneSectionThreeTextTwo { align-self: stretch; color: rgba(0, 0, 0, 0.50); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; cursor: default; margin: 0px; } .WhatsNewBoxOneSectionFour { display: flex; height: 48px; justify-content: center; align-items: center; gap: 8px; align-self: stretch; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; } .WhatsNewBoxOneSectionFour:hover { filter: brightness(0.95); } .WhatsNewBoxOneSectionFour:active { filter: brightness(0.9); margin-top: 2px; height: 46px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); filter: brightness(0.9); } .WhatsNewBoxOneSectionFourTextOne { color: #FFF; text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } `; let injectedWhatsNewBoxElement = null; let injectedWhatsNewBoxStyle = null; function injectWhatsNewBox() { //console.log('injectWhatsNewBox called'); if (wasWhatsNewInTwoPointZeroBetaSevenFinished === false) { if (window.location.pathname === '/learn') { // Inject the content if it's not already injected if (!injectedWhatsNewBoxElement) { // Creating a container for the overlay injectedWhatsNewBoxElement = document.createElement('div'); injectedWhatsNewBoxElement.innerHTML = WhatsNewBoxHTML; document.body.appendChild(injectedWhatsNewBoxElement); // Creating a style tag for CSS injectedWhatsNewBoxStyle = document.createElement('style'); injectedWhatsNewBoxStyle.type = 'text/css'; injectedWhatsNewBoxStyle.innerHTML = WhatsNewBoxCSS; document.head.appendChild(injectedWhatsNewBoxStyle); const WhatsNewBoxOneSectionFour = document.querySelector('.WhatsNewBoxOneSectionFour'); modifyWhatsNewBox(); WhatsNewBoxOneSectionFour.addEventListener('click', () => { whatsNewInBetaStage++; console.log('something'); modifyWhatsNewBox(); }); modifyWhatsNewBox(); } } } else { // Remove the content if it was previously injected if (injectedWhatsNewBoxElement) { document.body.removeChild(injectedWhatsNewBoxElement); document.head.removeChild(injectedWhatsNewBoxStyle); injectedWhatsNewBoxElement = null; injectedWhatsNewBoxStyle = null; } } } setInterval(injectWhatsNewBox, 100); function modifyWhatsNewBox() { const WhatsNewBoxOneSectionThreeTextOne = document.querySelector('.WhatsNewBoxOneSectionThreeTextOne'); const WhatsNewBoxOneSectionThreeTextTwo = document.querySelector('.WhatsNewBoxOneSectionThreeTextTwo'); const WhatsNewBoxOneSectionFourTextOne = document.querySelector('.WhatsNewBoxOneSectionFourTextOne'); const WhatsNewBoxOneSectionTwoImageOneURL = document.querySelector('img.WhatsNewBoxOneSectionTwoImageOne'); if (whatsNewInBetaStage === 1) { WhatsNewBoxOneSectionThreeTextOne.textContent = 'Major Bug Fixes'; WhatsNewBoxOneSectionThreeTextTwo.textContent = 'Duolingo Pro BETA 7 has fixes for major common bugs that stopped AutoSolver, Solve and Solve All Buttons from solving certain questions.'; WhatsNewBoxOneSectionTwoImageOneURL.src = 'https://framerusercontent.com/images/oaXxGJyRWwPc6cFDUM3fPxlDI.png'; WhatsNewBoxOneSectionFourTextOne.textContent = 'NEXT'; } else if (whatsNewInBetaStage === 2) { WhatsNewBoxOneSectionThreeTextOne.textContent = 'Low Performance Mode'; WhatsNewBoxOneSectionThreeTextTwo.textContent = 'Low Performance Mode enables Duolingo and Duolingo Pro to use less processing power by limiting animations and background tasks. This can reduce lags on certain lower end devices. You can enable this feature in Duolingo Pro Settings.'; WhatsNewBoxOneSectionTwoImageOneURL.src = 'https://framerusercontent.com/images/yxmX51WMXqAJmg5DvHXzPR5aQak.png'; WhatsNewBoxOneSectionFourTextOne.textContent = 'DONE'; } else { wasWhatsNewInTwoPointZeroBetaSevenFinished = true; localStorage.setItem('wasWhatsNewInTwoPointZeroBetaSevenFinished', true); } } const DuolingoProSettingsBoxHTML = `

Settings (scrollable)

2.0 BETA 8

RECOMMENDED

Show AutoSolver Box

AutoSolver Box makes it easier to binge solve questions automatically.

ON

Show Practice Only Mode for AutoSolver Box

NOTE: THIS MODE CURRENTY DOESN'T WORK. KEEP OFF UNLESS YOU WANT TO TRY IT OUT. Practice Mode enables AutoSolver to only do practices and repeat them.

OFF

RECOMMENDED

Show Repeat Lesson Mode for AutoSolver Box

Repeat Lesson Mode enables AutoSolver to only do a set lesson and repeat it. This mode improves chances of AutoSolver NOT getting stuck on an unsupported question type. We recommend using this mode with the Spanish/French/German course from English IF your main goal is to gain the most XP autonomously.

NOT SET

Low Performance Mode

In low performance mode, Duolingo Pro reduces animations and background tasks to reduce lag. Only recommended for lower-performance devices.

OFF

RECOMMENDED

ProBlock Ads by Duolingo Pro

ProBlock removes ads that pop-up on the main Duolingo tabs like Learn, Practice, and Shop.

ON

EXPERIMENTAL

TurboSolve Mode

TurboSolve, thanks to SicariusBlack, improves AutoSolve and Solve All speeds by up to 5 times. This is an experimental feature.

ON

NEW

Humane Solving Mode

Humane Solving mode, thanks to SicariusBlack, solves every question step by step, greatly reducing the slim chances of being caught and banned.

ON

EXPERIMENTAL

NEVER Stop Mode

With NEVER Stop Mode, Duolingo Pro keeps solving without any number limits to the AutoSolver Box.

ON

CANCEL

SAVE

`; const DuolingoProSettingsBoxCSS = ` .DuolingoProSettingsBoxShadow { position: fixed; display: flex; width: 100%; height: 100vh; justify-content: center; align-items: center; flex-shrink: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(8px); z-index: 2; top: 0px; bottom: 0px; right: 0px; left: 0px; } .DuolingoProSettingsBoxBackground { display: flex; max-height: 80vh; width: 80%; max-width: 600px; min-width: 368px; padding-right: 16px; padding-left: 16px; margin-bottom: 16px; overflow-y: visible; flex-direction: column; justify-content: center; align-items: center; gap: 8px; flex-shrink: 0; border-radius: 16px; border: 2px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); } .DuolingoProSettingsBoxLayers { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; align-self: stretch; overflow-y: auto; padding: 16px 0 16px 0; margin-right: -16px; padding-right: 16px; } .DuolingoProSettingsBoxSectionOne { display: flex; height: 36px; justify-content: space-between; align-items: center; align-self: stretch; } .DuolingoProSettingsBoxSectionOneTextOne { color: rgb(var(--color-eel)); font-size: 24px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .DuolingoProSettingsBoxSectionOneBoxOne { display: flex; width: 98px; height: 36px; flex-direction: column; justify-content: center; align-items: center; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); background: #FF2D55; } .DuolingoProSettingsBoxSectionOneBoxOneTextOne { color: #FFF; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .DuolingoProSettingsBoxSectionTwo { display: flex; padding-bottom: 8px; flex-direction: column; align-items: flex-start; gap: 16px; align-self: stretch; } .DuolingoProSettingsBoxSectionTwoBoxOne { display: flex; align-items: center; gap: 16px; align-self: stretch; } .DuolingoProSettingsBoxSectionTwoBoxOneBoxOne { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; flex: 1 0 0; } .DuolingoProSettingsBoxSectionTwoBoxOneBoxOneTextOne { align-self: stretch; color: rgb(var(--color-eel)); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .DuolingoProSettingsBoxSectionTwoBoxOneBoxOneTextTwo { align-self: stretch; color: rgb(var(--color-hare)); font-size: 14px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .DuolingoProSettingsBoxSectionTwoBoxOneBoxOneTextThree { align-self: stretch; color: #007AFF; font-size: 14px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .DuolingoProSettingsBoxSectionTwoBoxOneBoxOneTextFour { align-self: stretch; color: #FF2D55; font-size: 14px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .DuolingoProSettingsBoxToggleTypeOne { display: flex; width: 98px; height: 48px; justify-content: center; align-items: center; gap: 8px; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; } .DuolingoProSettingsBoxToggleTypeOne:hover { filter: brightness(0.95); } .DuolingoProSettingsBoxToggleTypeOne:active { filter: brightness(0.9); margin-top: 2px; height: 46px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); } .DuolingoProSettingsBoxToggleTypeOneTextOne { color: #FFF; text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .DuolingoProSettingsBoxSectionThree { display: flex; align-items: flex-start; gap: 8px; align-self: stretch; } .DuolingoProSettingsBoxCancelButton { display: flex; width: 98px; height: 54px; justify-content: center; align-items: center; gap: 8px; border-radius: 8px; border: 2px solid rgb(var(--color-swan)); border-bottom: 4px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); cursor: pointer; transition: .1s; } .DuolingoProSettingsBoxCancelButton:hover { filter: brightness(0.95); } .DuolingoProSettingsBoxCancelButton:active { filter: brightness(0.9); margin-top: 2px; height: 52px; border-bottom: 2px solid rgb(var(--color-swan)); } .DuolingoProSettingsBoxCancelButtonTextOne { color: rgb(var(--color-eel)); text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .DuolingoProSettingsBoxSaveButton { display: flex; height: 54px; padding: 0px 16px; justify-content: center; align-items: center; gap: 8px; flex: 1 0 0; border-radius: 8px; border: 2px solid rgba(0, 0, 0, 0.20); border-bottom: 4px solid rgba(0, 0, 0, 0.20); background: #007AFF; cursor: pointer; transition: .1s; } .DuolingoProSettingsBoxSaveButton:hover { filter: brightness(0.95); } .DuolingoProSettingsBoxSaveButton:active { filter: brightness(0.9); margin-top: 2px; height: 52px; border-bottom: 2px solid rgba(0, 0, 0, 0.20); } .DuolingoProSettingsBoxSaveButtonTextOne { color: #FFF; text-align: center; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } `; let injectedDuolingoProSettingsBoxElement = null; let injectedDuolingoProSettingsBoxStyle = null; function injectDuolingoProSettingsBox() { //console.log('injectDuolingoProSettingsBox called'); if (wasDuolingoProSettingsButtonOnePressed === true) { // Inject the content if it's not already injected if (!injectedDuolingoProSettingsBoxElement) { // Creating a container for the overlay injectedDuolingoProSettingsBoxElement = document.createElement('div'); injectedDuolingoProSettingsBoxElement.innerHTML = DuolingoProSettingsBoxHTML; document.body.appendChild(injectedDuolingoProSettingsBoxElement); // Creating a style tag for CSS injectedDuolingoProSettingsBoxStyle = document.createElement('style'); injectedDuolingoProSettingsBoxStyle.type = 'text/css'; injectedDuolingoProSettingsBoxStyle.innerHTML = DuolingoProSettingsBoxCSS; document.head.appendChild(injectedDuolingoProSettingsBoxStyle); const DuolingoProSettingsBoxCancelButton = document.querySelector('.DuolingoProSettingsBoxCancelButton'); DuolingoProSettingsBoxCancelButton.addEventListener('click', () => { wasDuolingoProSettingsButtonOnePressed = false; AutoSolverSettingsShowAutoSolverBox = JSON.parse(localStorage.getItem('AutoSolverSettingsShowAutoSolverBox')); AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox = JSON.parse(localStorage.getItem('AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox')); AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox = JSON.parse(localStorage.getItem('AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox')); AutoSolverSettingsLowPerformanceMode = JSON.parse(localStorage.getItem('AutoSolverSettingsLowPerformanceMode')); }); const DuolingoProSettingsBoxSaveButton = document.querySelector('.DuolingoProSettingsBoxSaveButton'); DuolingoProSettingsBoxSaveButton.addEventListener('click', () => { if (JSON.parse(localStorage.getItem('AutoSolverSettingsShowAutoSolverBox')) !== AutoSolverSettingsShowAutoSolverBox) { settingsStuff("Duolingo Pro AutoSolver Box", AutoSolverSettingsShowAutoSolverBox ? 'ON' : 'OFF'); } if (JSON.parse(localStorage.getItem('AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox')) !== AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox) { settingsStuff("Duolingo Pro Practice Only Mode", AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox ? 'ON' : 'OFF'); } if (JSON.parse(localStorage.getItem('AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox')) !== AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox) { settingsStuff("Duolingo Pro Repeat Lesson Mode", AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox ? 'ON' : 'OFF'); } if (JSON.parse(localStorage.getItem('AutoSolverSettingsLowPerformanceMode')) !== AutoSolverSettingsLowPerformanceMode) { settingsStuff("Duolingo Pro Low Performance Mode", AutoSolverSettingsLowPerformanceMode ? 'ON' : 'OFF'); } if (JSON.parse(localStorage.getItem('DuolingoProSettingsProBlockMode')) !== DuolingoProSettingsProBlockMode) { settingsStuff("Duolingo Pro ProBlock", DuolingoProSettingsProBlockMode ? 'ON' : 'OFF'); } if (JSON.parse(localStorage.getItem('DuolingoProSettingsTurboSolveMode')) !== DuolingoProSettingsTurboSolveMode) { settingsStuff("Duolingo Pro TurboSolve Mode", DuolingoProSettingsTurboSolveMode ? 'ON' : 'OFF'); } if (JSON.parse(localStorage.getItem('DuolingoProSettingsHumaneSolvingMode')) !== DuolingoProSettingsHumaneSolvingMode) { settingsStuff("Duolingo Pro Humane Solving Mode", DuolingoProSettingsHumaneSolvingMode ? 'ON' : 'OFF'); } if (JSON.parse(localStorage.getItem('DuolingoProSettingsNeverEndMode')) !== DuolingoProSettingsNeverEndMode) { settingsStuff("Duolingo Pro Never End Mode", DuolingoProSettingsNeverEndMode ? 'ON' : 'OFF'); } localStorage.setItem('AutoSolverSettingsShowAutoSolverBox', AutoSolverSettingsShowAutoSolverBox); localStorage.setItem('AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox', AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox); localStorage.setItem('AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox', AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox); localStorage.setItem('AutoSolverSettingsLowPerformanceMode', AutoSolverSettingsLowPerformanceMode); localStorage.setItem('DuolingoProSettingsProBlockMode', DuolingoProSettingsProBlockMode); localStorage.setItem('DuolingoProSettingsTurboSolveMode', DuolingoProSettingsTurboSolveMode); localStorage.setItem('DuolingoProSettingsHumaneSolvingMode', DuolingoProSettingsHumaneSolvingMode); localStorage.setItem('DuolingoProSettingsNeverEndMode', DuolingoProSettingsNeverEndMode); if (!AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox) { autoSolverBoxPracticeOnlyMode = false; sessionStorage.setItem('autoSolverBoxPracticeOnlyMode', autoSolverBoxPracticeOnlyMode); } if (!AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox) { autoSolverBoxPracticeOnlyMode = false; sessionStorage.setItem('autoSolverBoxRepeatLessonMode', autoSolverBoxRepeatLessonMode); } console.log('Settings saved'); notificationCall("New Settings Saved", "Reloading the tab and applying new settings."); let DuolingoProSettingsBoxSaveButtonTextElement = DuolingoProSettingsBoxSaveButton.querySelector('.DuolingoProSettingsBoxSaveButtonTextOne'); DuolingoProSettingsBoxSaveButtonTextElement.textContent = 'SAVED'; setTimeout(function() { //wasDuolingoProSettingsButtonOnePressed = false; location.reload(); }, 3000); }); const DuolingoProSettingsBoxToggleOneIDElement = document.querySelector('#DuolingoProSettingsBoxToggleOneID'); DuolingoProSettingsBoxToggleOneIDElement.addEventListener('mousedown', () => { if (!AutoSolverSettingsShowAutoSolverBox) { DuolingoProSettingsBoxToggleOneIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleOneIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleOneIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleOneIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleOneIDElement.addEventListener('mouseup', () => { AutoSolverSettingsShowAutoSolverBox = !AutoSolverSettingsShowAutoSolverBox; // Toggle the variable updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleOneIDElement, AutoSolverSettingsShowAutoSolverBox); }); const DuolingoProSettingsBoxToggleTwoIDElement = document.querySelector('#DuolingoProSettingsBoxToggleTwoID'); DuolingoProSettingsBoxToggleTwoIDElement.addEventListener('mousedown', () => { if (!AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox) { DuolingoProSettingsBoxToggleTwoIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleTwoIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleTwoIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleTwoIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleTwoIDElement.addEventListener('mouseup', () => { AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox = !AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox; // Toggle the variable updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleTwoIDElement, AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox); }); const DuolingoProSettingsBoxToggleThreeIDElement = document.querySelector('#DuolingoProSettingsBoxToggleThreeID'); DuolingoProSettingsBoxToggleThreeIDElement.addEventListener('mousedown', () => { if (!AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox) { DuolingoProSettingsBoxToggleThreeIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleThreeIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleThreeIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleThreeIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleThreeIDElement.addEventListener('mouseup', () => { AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox = !AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox; // Toggle the variable updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleThreeIDElement, AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox); }); const DuolingoProSettingsBoxToggleFourIDElement = document.querySelector('#DuolingoProSettingsBoxToggleFourID'); DuolingoProSettingsBoxToggleFourIDElement.addEventListener('mousedown', () => { if (!AutoSolverSettingsLowPerformanceMode) { DuolingoProSettingsBoxToggleFourIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleFourIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleFourIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleFourIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleFourIDElement.addEventListener('mouseup', () => { AutoSolverSettingsLowPerformanceMode = !AutoSolverSettingsLowPerformanceMode; // Toggle the variable updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleFourIDElement, AutoSolverSettingsLowPerformanceMode); }); const DuolingoProSettingsBoxToggleFiveIDElement = document.querySelector('#DuolingoProSettingsBoxToggleFiveID'); DuolingoProSettingsBoxToggleFiveIDElement.addEventListener('mousedown', () => { if (!DuolingoProSettingsProBlockMode) { DuolingoProSettingsBoxToggleFiveIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleFiveIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleFiveIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleFiveIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleFiveIDElement.addEventListener('mouseup', () => { DuolingoProSettingsProBlockMode = !DuolingoProSettingsProBlockMode; // Toggle the variable updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleFiveIDElement, DuolingoProSettingsProBlockMode); }); const DuolingoProSettingsBoxToggleSixIDElement = document.querySelector('#DuolingoProSettingsBoxToggleSixID'); DuolingoProSettingsBoxToggleSixIDElement.addEventListener('mousedown', () => { if (!DuolingoProSettingsTurboSolveMode) { DuolingoProSettingsBoxToggleSixIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleSixIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleSixIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleSixIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleSixIDElement.addEventListener('mouseup', () => { DuolingoProSettingsTurboSolveMode = !DuolingoProSettingsTurboSolveMode; // Toggle the variable if (DuolingoProSettingsTurboSolveMode && DuolingoProSettingsHumaneSolvingMode) { DuolingoProSettingsHumaneSolvingMode = false; } updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleSixIDElement, DuolingoProSettingsTurboSolveMode); }); const DuolingoProSettingsBoxToggleSevenIDElement = document.querySelector('#DuolingoProSettingsBoxToggleSevenID'); DuolingoProSettingsBoxToggleSevenIDElement.addEventListener('mousedown', () => { if (!DuolingoProSettingsHumaneSolvingMode) { DuolingoProSettingsBoxToggleSevenIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleSevenIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleSevenIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleSevenIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleSevenIDElement.addEventListener('mouseup', () => { DuolingoProSettingsHumaneSolvingMode = !DuolingoProSettingsHumaneSolvingMode; // Toggle the variable if (DuolingoProSettingsHumaneSolvingMode && DuolingoProSettingsTurboSolveMode) { DuolingoProSettingsTurboSolveMode = false; } updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleSevenIDElement, DuolingoProSettingsHumaneSolvingMode); }); const DuolingoProSettingsBoxToggleEightIDElement = document.querySelector('#DuolingoProSettingsBoxToggleEightID'); DuolingoProSettingsBoxToggleEightIDElement.addEventListener('mousedown', () => { if (!DuolingoProSettingsNeverEndMode) { DuolingoProSettingsBoxToggleEightIDElement.style.border = '2px solid rgb(var(--color-swan))'; DuolingoProSettingsBoxToggleEightIDElement.style.borderBottom = '2px solid rgb(var(--color-swan))'; } else { DuolingoProSettingsBoxToggleEightIDElement.style.border = '2px solid rgba(0, 0, 0, 0.20)'; DuolingoProSettingsBoxToggleEightIDElement.style.borderBottom = '2px solid rgba(0, 0, 0, 0.20)'; } }); DuolingoProSettingsBoxToggleEightIDElement.addEventListener('mouseup', () => { DuolingoProSettingsNeverEndMode = !DuolingoProSettingsNeverEndMode; // Toggle the variable updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleEightIDElement, DuolingoProSettingsNeverEndMode); }); addEventListener('mouseup', () => { updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleOneIDElement, AutoSolverSettingsShowAutoSolverBox); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleTwoIDElement, AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleThreeIDElement, AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleFourIDElement, AutoSolverSettingsLowPerformanceMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleFiveIDElement, DuolingoProSettingsProBlockMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleSixIDElement, DuolingoProSettingsTurboSolveMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleSevenIDElement, DuolingoProSettingsHumaneSolvingMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleEightIDElement, DuolingoProSettingsNeverEndMode); }); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleOneIDElement, AutoSolverSettingsShowAutoSolverBox); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleTwoIDElement, AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleThreeIDElement, AutoSolverSettingsShowRepeatLessonModeForAutoSolverBox); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleFourIDElement, AutoSolverSettingsLowPerformanceMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleFiveIDElement, DuolingoProSettingsProBlockMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleSixIDElement, DuolingoProSettingsTurboSolveMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleSevenIDElement, DuolingoProSettingsHumaneSolvingMode); updateDuolingoProSettingsToggle(DuolingoProSettingsBoxToggleEightIDElement, DuolingoProSettingsNeverEndMode); } } else { // Remove the content if it was previously injected if (injectedDuolingoProSettingsBoxElement) { document.body.removeChild(injectedDuolingoProSettingsBoxElement); document.head.removeChild(injectedDuolingoProSettingsBoxStyle); injectedDuolingoProSettingsBoxElement = null; injectedDuolingoProSettingsBoxStyle = null; } } } setInterval(injectDuolingoProSettingsBox, 100); function updateDuolingoProSettingsToggle(element, value) { let textElement = element.querySelector('.DuolingoProSettingsBoxToggleTypeOneTextOne'); if (element.id === 'DuolingoProSettingsBoxToggleThreeID') { textElement.textContent = value ? "LESSON 1" : "OFF"; } else { textElement.textContent = value ? "ON" : "OFF"; } if (value) { element.style.background = '#007AFF'; element.style.border = '2px solid rgba(0, 0, 0, 0.20)'; element.style.borderBottom = '4px solid rgba(0, 0, 0, 0.20)'; textElement.style.color = '#fff'; } else { element.style.background = 'rgb(var(--color-snow))'; element.style.border = '2px solid rgb(var(--color-swan))'; element.style.borderBottom = '4px solid rgb(var(--color-swan))'; textElement.style.color = 'rgb(var(--color-eel))'; } } function iwantstolol() { try { let nextStoryStartButton = document.querySelector('[data-test="story-start"]'); if (nextStoryStartButton) { nextStoryStartButton.click(); anonymousSolveDetails('Story Start'); } let noideatwo = document.querySelector('[data-test="practice-hub-ad-no-thanks-button"]'); if (noideatwo) { noideatwo.click(); } } catch (error) { } } setInterval(iwantstolol, 500); let downloadStuffVar = 'none'; let updateStuffVar = 'none'; let duolingoProCurrentVersion = "2.0 BETA 8"; if (String(localStorage.getItem('duolingoProLastInstalledVersion')) === null || String(localStorage.getItem('duolingoProLastInstalledVersion')) === "null") { downloadStuffVar = 'trying'; setTimeout(function() { versionServerStuff('download', "Downloaded Version", duolingoProCurrentVersion); checkFlagTwo(); }, 2000); function checkFlagTwo() { if (downloadStuffVar === 'trying') { setTimeout(function() { checkFlagTwo(); }, 100); } else if (downloadStuffVar === 'true') { localStorage.setItem('duolingoProLastInstalledVersion', duolingoProCurrentVersion); } else if (downloadStuffVar === 'error') { setTimeout(function() { versionServerStuff('download', 'Downloaded Version', duolingoProCurrentVersion); }, 1000); } else if (downloadStuffVar === 'empty') { notificationCall("Duolingo Pro Encountered An Error", "Duolingo Pro error #0001"); } } } else if (String(localStorage.getItem('duolingoProLastInstalledVersion')) !== duolingoProCurrentVersion) { updateStuffVar = 'trying'; setTimeout(function() { versionServerStuff('update', "Updated Version", duolingoProCurrentVersion, String(localStorage.getItem('duolingoProLastInstalledVersion'))); checkFlagThree(); }, 2000); function checkFlagThree() { if (updateStuffVar === 'trying') { setTimeout(function() { checkFlagThree(); }, 100); } else if (updateStuffVar === 'true') { localStorage.setItem('duolingoProLastInstalledVersion', duolingoProCurrentVersion); } else if (updateStuffVar === 'error') { setTimeout(function() { versionServerStuff('update', "Updated Version", duolingoProCurrentVersion, String(localStorage.getItem('duolingoProLastInstalledVersion'))); }, 1000); } else if (updateStuffVar === 'empty') { notificationCall("Duolingo Pro Encountered An Error", "Duolingo Pro error #0002"); } } } let screenWidth = screen.width; function BegMobileSupport() { try { screenWidth = screen.width; if (Number(localStorage.getItem('screenWidthDuolingoPro')) === null || isNaN(Number(localStorage.getItem('screenWidthDuolingoPro'))) || Number(localStorage.getItem('screenWidthDuolingoPro')) === 0) { setTimeout(function() { settingsStuff("Screen Width Set To", String(screenWidth)); }, 2000); setTimeout(function() { localStorage.setItem('screenWidthDuolingoPro', screenWidth); }, 3000); setTimeout(function() { BegMobileSupport(); }, 4000); } else if (Number(localStorage.getItem('screenWidthDuolingoPro')) !== screenWidth) { setTimeout(function() { settingsStuff("Screen Width Change To", String(screenWidth) + " from " + localStorage.getItem('screenWidthDuolingoPro')); }, 2000); setTimeout(function() { localStorage.setItem('screenWidthDuolingoPro', screenWidth); }, 3000); setTimeout(function() { BegMobileSupport(); }, 4000); } else { setTimeout(function() { BegMobileSupport(); }, 1000); } } catch (error) { } } BegMobileSupport(); function MidMobileSupport() { try { screenWidth = screen.width; const boxFirst = document.querySelector('.boxFirst'); if (screenWidth < 700) { boxFirst.style.marginBottom = '64px'; } else { boxFirst.style.marginBottom = ''; } } catch (error) { } } setInterval(MidMobileSupport, 1000); const DuolingoProNotificationBoxHTML = `

Title

DISMISS

Description

`; const DuolingoProNotificationBoxCSS = ` .BlockedByDuolingoProBoxBackground { position: fixed; display: flex; width: 368px !important; padding: 16px; flex-direction: column; justify-content: center; align-items: center; gap: 4px; flex-shrink: 0; border-radius: 16px; border: 2px solid rgb(var(--color-swan)); background: rgb(var(--color-snow)); z-index: 2048; right: 24px; top: calc(100%); /* Initially, it's hidden below the viewport */ transition: top 0.5s cubic-bezier(0.16, 1, 0.32, 1); /* Add a transition for the 'top' property */ } .BlockedByDuolingoProBoxSectionOne { display: flex; justify-content: space-between; align-items: center; align-self: stretch; } .BlockedByDuolingoProBoxSectionOneTextOne { color: rgb(var(--color-eel)); font-size: 18px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } .BlockedByDuolingoProBoxSectionOneTextTwo { color: #007AFF; font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: pointer; user-select: none; // chrome and Opera -moz-user-select: none; // Firefox -webkit-text-select: none; // IOS Safari -webkit-user-select: none; // Safari } .BlockedByDuolingoProBoxSectionTwoTextOne { align-self: stretch; color: rgb(var(--color-eel), 0.6); font-size: 16px; font-style: normal; font-weight: 700; line-height: normal; margin: 0px; cursor: default; } `; let injectedDuolingoProNotificationBoxElement = null; let injectedDuolingoProNotificationBoxStyle = null; let DuolingoProNotificationOne; let DuolingoProNotificationOneVar = false; let DuolingoProNotificationOneHideButton; function injectDuolingoProNotificationBox() { if (!injectedDuolingoProNotificationBoxElement) { // Creating a container for the overlay injectedDuolingoProNotificationBoxElement = document.createElement('div'); injectedDuolingoProNotificationBoxElement.innerHTML = DuolingoProNotificationBoxHTML; document.body.appendChild(injectedDuolingoProNotificationBoxElement); // Creating a style tag for CSS injectedDuolingoProNotificationBoxStyle = document.createElement('style'); injectedDuolingoProNotificationBoxStyle.type = 'text/css'; injectedDuolingoProNotificationBoxStyle.innerHTML = DuolingoProNotificationBoxCSS; document.head.appendChild(injectedDuolingoProNotificationBoxStyle); DuolingoProNotificationOne = document.querySelector('#DuolingoProNotificationBackgroundOneID'); DuolingoProNotificationOneHideButton = document.querySelector('#DuolingoProNotificationHideButtonOneID'); } } setInterval(injectDuolingoProNotificationBox, 100); //addEventListener('mouseup', () => { // notificationCall("title test one", "description test one"); //}); function notificationCall(title, description) { // if (event.target !== DuolingoProNotificationHideButtonOneID) { if (!DuolingoProNotificationOneVar) { notificationPopOne("", "", false); setTimeout(function() { notificationPopOne(title, description, true); DuolingoProNotificationOneVar = true; }, 600); } else if (DuolingoProNotificationOneVar) { notificationPopOne("", "", false); DuolingoProNotificationOneVar = false; setTimeout(function() { notificationPopOne(title, description, true); DuolingoProNotificationOneVar = false; }, 600); } // } } function notificationPopOne(title, description, value) { let DuolingoProNotificationOneTitle = document.querySelector('#DuolingoProNotificationTitleOneID'); let DuolingoProNotificationOneDescription = document.querySelector('#DuolingoProNotificationDescriptionOneID'); let DuolingoProNotificationOneHideButton = document.querySelector('#DuolingoProNotificationHideButtonOneID'); DuolingoProNotificationOneTitle.textContent = title; DuolingoProNotificationOneDescription.textContent = description; let DuolingoProNotificationOneHeight = DuolingoProNotificationOne.getBoundingClientRect().height; if (value) { DuolingoProNotificationOne.style.top = `calc(100% - ${DuolingoProNotificationOneHeight + 24}px)`; } else { DuolingoProNotificationOne.style.top = `calc(100%)`; } DuolingoProNotificationOneHideButton.addEventListener('click', () => { DuolingoProNotificationOne.style.top = `calc(100%)`; DuolingoProNotificationOneVar = false; }); } const simplifiedUICSS = ` div { transition: none !important; animation-duration: 0s !important; } .fSJFz { /* explosion effect at the tip of the progress bar */ display: none !important; } ` let injectedSimplifiedUICSS = null; function LowPerformanceAnimations() { if (window.location.pathname.includes('/lesson') && AutoSolverSettingsLowPerformanceMode) { injectedSimplifiedUICSS = document.createElement('style'); injectedSimplifiedUICSS.type = 'text/css'; injectedSimplifiedUICSS.innerHTML = simplifiedUICSS; document.head.appendChild(injectedSimplifiedUICSS); } else { setTimeout(function() { LowPerformanceAnimations(); }, 1000); } } if (AutoSolverSettingsLowPerformanceMode) { LowPerformanceAnimations(); } let DuolingoProShortSessionID; if (Number(sessionStorage.getItem('DuolingoProShortSessionID')) === null || Number(sessionStorage.getItem('DuolingoProShortSessionID')) === 0 || Number(sessionStorage.getItem('DuolingoProShortSessionID')) === NaN) { DuolingoProShortSessionID = Math.floor(Math.random() * (9999 - 1 + 1)) + 1; sessionStorage.setItem('DuolingoProShortSessionID', DuolingoProShortSessionID); } else { DuolingoProShortSessionID = Number(sessionStorage.getItem('DuolingoProShortSessionID')); //sessionStorage will be deleted after the tab is closed } async function solving(forceState) { if (isAutoMode == false || forceState == true) { let solveAllButton = await waitForElm("#solveAllButton"); solveAllButton.innerText = "PAUSE SOLVE"; isAutoMode = true; let delayTime; if (DuolingoProSettingsTurboSolveMode) { delayTime = 150; } else if (simulated == true) { delayTime = 150; } else { delayTime = 500; } let solveLoop = async () => { if (isAutoMode == true && isSolving == false) { isSolving = true; document.getElementById("solveAllButton") ? document.getElementById("solveAllButton").innerText = "PAUSE SOLVE": undefined; await solve(); await sleep(delayTime, 0, 0); isSolving = false; solveLoop(); } } solveLoop(); // initiate the loop } else { document.getElementById("solveAllButton").innerText = "SOLVE ALL"; isAutoMode = false; } } async function solve() { const selAgain = document.querySelectorAll('[data-test="player-practice-again"]'); const practiceAgain = document.querySelector('[data-test="player-practice-again"]'); if (selAgain.length === 1 && isAutoMode) { // Make sure it's the `practice again` button //if (selAgain[0].innerHTML.toLowerCase() === 'practice again') { // Click the `practice again` button if (simulated == true) await sleep(50, 50); selAgain[0].click(); // Terminate return; //} } if (practiceAgain !== null && isAutoMode) { if (!AutoSolverSettingsShowPracticeOnlyModeForAutoSolverBox) { practiceAgain.click(); return; } } try { window.sol = findReact(document.getElementsByClassName('_3FiYg')[0]).props.currentChallenge; } catch { let next = document.querySelector('[data-test="player-next"]'); if (next) { next.click(); } return; } if (!window.sol) { return; } let nextButton = document.querySelector('[data-test="player-next"]'); if (!nextButton) { return; } nextButton.click(); // skips motivational messages if (nextButton.getAttribute('aria-disabled') === 'true') { if (simulated == true) await sleep(300, 300, 200); // time to read the question if (document.querySelectorAll('[data-test*="challenge-speak"]').length > 0) { if (debug) { document.getElementById("solveAllButton").innerText = 'Challenge Speak'; } anonymousSolveDetails("SC"); waitForElm('button[data-test="player-skip"]').then((skip) => { skip.click(); }); } else if (window.sol.type === 'listenMatch') { // listen match question if (debug) { document.getElementById("solveAllButton").innerText = 'Listen Match'; } anonymousSolveDetails("LM"); waitForElm('button[data-test="player-skip"]').then((skip) => { skip.click(); }); } else if (document.querySelectorAll('[data-test="challenge-choice"]').length > 0) { // choice challenge if (debug) { document.getElementById("solveAllButton").innerText = 'Challenge Choice'; } anonymousSolveDetails("CC"); // text input (if one exists) if (document.querySelectorAll('[data-test="challenge-text-input"]').length > 0) { if (debug) { document.getElementById("solveAllButton").innerText = 'Challenge Choice with Text Input'; } anonymousSolveDetails("CT"); try { window.sol = findReact(document.getElementsByClassName('_3FiYg')[0]).props.currentChallenge; } catch { return } let elm = document.querySelectorAll('[data-test="challenge-text-input"]')[0]; elm?.click(); let answer = window.sol.correctSolutions ? window.sol.correctSolutions[0].split(/(?<=^\S+)\s/)[1] : (window.sol.displayTokens ? window.sol.displayTokens.find(t => t.isBlank).text : window.sol.prompt); if (!answer) return; if (simulated == true) await sleep(answer.length*100, 100); let nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set; nativeInputValueSetter.call(elm, simplifyString(answer)); let inputEvent = new Event('input', { bubbles: true }); elm.dispatchEvent(inputEvent); } // choice if (window.sol.correctTokens !== undefined) { await correctTokensRun(); } else if (window.sol.correctIndex !== undefined) { document.querySelectorAll('[data-test="challenge-choice"]')[window.sol.correctIndex].click(); } else if (window.sol.correctSolutions !== undefined) { var xpath = `//div[@data-test="challenge-choice" and ./div[@data-test="challenge-judge-text"]/text()="${window.sol.correctSolutions[0].split(/(?<=^\S+)\s/)[0]}"]`; document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue?.click(); } } else if (document.querySelectorAll('[data-test$="challenge-tap-token"]').length > 0) { // match correct pairs challenge if (window.sol.pairs !== undefined) { if (debug) { document.getElementById("solveAllButton").innerText = 'Pairs'; } anonymousSolveDetails("MC"); await correctPairsRun(); } else if (window.sol.correctTokens !== undefined) { if (debug) { document.getElementById("solveAllButton").innerText = 'Token Run'; } anonymousSolveDetails("TM"); await correctTokensRun(); } else if (window.sol.correctIndices !== undefined) { if (debug) { document.getElementById("solveAllButton").innerText = 'Indices Run'; } anonymousSolveDetails("IM"); await correctIndicesRun(); } } else if (document.querySelectorAll('[data-test="challenge-tap-token-text"]').length > 0) { if (debug) { document.getElementById("solveAllButton").innerText = 'Challenge Tap Token Text'; } anonymousSolveDetails("TT"); // fill the gap challenge await correctIndicesRun(); } else if (document.querySelectorAll('[data-test="challenge-text-input"]').length > 0) { if (debug) { document.getElementById("solveAllButton").innerText = 'Challenge Text Input'; } anonymousSolveDetails("TC"); try { window.sol = findReact(document.getElementsByClassName('_3FiYg')[0]).props.currentChallenge; } catch { return } let elm = document.querySelectorAll('[data-test="challenge-text-input"]')[0]; elm?.click(); let answer = window.sol.correctSolutions ? window.sol.correctSolutions[0] : (window.sol.displayTokens ? window.sol.displayTokens.find(t => t.isBlank).text : window.sol.prompt); if (!answer) return; if (simulated == true) await sleep(answer.length*100, 100); let nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set; nativeInputValueSetter.call(elm, simplifyString(answer)); let inputEvent = new Event('input', { bubbles: true }); elm.dispatchEvent(inputEvent); } else if (document.querySelectorAll('[data-test*="challenge-partialReverseTranslate"]').length > 0) { if (debug) { document.getElementById("solveAllButton").innerText = 'Partial Reverse'; } anonymousSolveDetails("PT"); try { window.sol = findReact(document.getElementsByClassName('_3FiYg')[0]).props.currentChallenge; } catch { return } let elm = document.querySelector('[data-test*="challenge-partialReverseTranslate"]')?.querySelector("span[contenteditable]"); elm?.click(); let answer = window.sol?.displayTokens?.filter(t => t.isBlank)?.map(t => t.text)?.join()?.replaceAll(',', ''); if (!answer) return; if (simulated == true) await sleep(answer.length*100, 100); let nativeInputNodeTextSetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").set; nativeInputNodeTextSetter.call(elm, simplifyString(answer)); let inputEvent = new Event('input', { bubbles: true }); elm.dispatchEvent(inputEvent); } else if (document.querySelectorAll('textarea[data-test="challenge-translate-input"]').length > 0) { if (debug) { document.getElementById("solveAllButton").innerText = 'Challenge Translate Input'; } anonymousSolveDetails("TC"); try { window.sol = findReact(document.getElementsByClassName('_3FiYg')[0]).props.currentChallenge; } catch { return } const elm = document.querySelector('textarea[data-test="challenge-translate-input"]'); elm?.click(); let answer = window.sol.correctSolutions ? window.sol.correctSolutions[0] : window.sol.prompt; if (!answer) return; if (simulated == true) await sleep(answer.length*100, 100); const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, "value").set; nativeInputValueSetter.call(elm, simplifyString(answer)); let inputEvent = new Event('input', { bubbles: true }); elm.dispatchEvent(inputEvent); } await nextButtonClick(); await nextButtonClick(); } } function waitForElm(selector) { return new Promise(resolve => { if (document.querySelector(selector) && (document.querySelector(selector).getAttribute('aria-disabled') !== 'true')) { return resolve(document.querySelector(selector)); } const observer = new MutationObserver(mutations => { if (document.querySelector(selector) && (document.querySelector(selector).getAttribute('aria-disabled') !== 'true')) { observer.disconnect(); resolve(document.querySelector(selector)); } }); observer.observe(document.body, { childList: true, subtree: true }); }); } function simplifyString(str) { return str.replace(/[\p{P}$+<=>^`|~]/gu, '').replace(/\s{2,}/g, ' ').toLowerCase(); } function sleepNormal(ms, tolerance = 0) { /** Sleeps for a random amount of time sampled from a non-uniform distribution within range [ms, ms + tolerance]. */ let sleepTime = ms + tolerance * (Math.random() + Math.random() + Math.random())/3; // simulates normal distribution return new Promise(resolve => setTimeout(resolve, sleepTime)); } async function sleepInverseCDF(msRange) { /** * Uses the inverse CDF method to determine the random amount of time to sleep from 0 to ~msRange, * with outlying values spanning up to 10*msRange. * * This method is intended to create outliers. */ let u = 1; while(u > 0.9999999999) u = Math.random(); // limit output range to 10*msRange let sleepTime = -1*Math.log10(1 - u) // x = –log(1–u) sleepTime *= msRange; // map to range await sleepNormal(sleepTime); } // General-use sleep functions async function sleep(ms, tolerance = 0, msRange = 10) { /** The most sophisticated version of sleep for general use. */ await sleepNormal(ms, tolerance); await sleepInverseCDF(msRange); await sleepProbability(0, 2000, 0.005); // add a bit of texture } async function sleepProbability(ms, tolerance = 0, probability = 0.05) { /** Has a probability to sleep for ms milliseconds. */ if (Math.random() < probability) { await sleep(ms, tolerance); } } function until(conditionFunction) { /** * Utility function to resolve a promise when condition is fulfilled. * Usage: await until(_ => condition == true); */ const poll = resolve => { if(conditionFunction()) resolve(); else setTimeout(_ => poll(resolve), 150); // callback interval } return new Promise(poll); } async function nextButtonClick() { return Promise.race([ new Promise(async (resolve) => { let next = await waitForElm('[data-test="player-next"]'); await until(_ => isTokenRunning == false); if (!DuolingoProSettingsTurboSolveMode) await sleep(100, 50); next.click(); resolve(); }), new Promise(async (resolve) => { setTimeout(() => resolve(), 700); // Maximum wait time until the "next" button shows up }) ]); } async function correctTokensRun() { isTokenRunning = true; const all_tokens = document.querySelectorAll('[data-test$="challenge-tap-token"]'); const correct_tokens = window.sol.correctTokens; const clicked_tokens = []; for (const correct_token of correct_tokens) { const matching_elements = Array.from(all_tokens).filter(element => element.textContent.trim() === correct_token.trim()); if (simulated == true) { await sleepProbability(200, 500, 0.1); // has a small chance to stay idle for a while await sleepProbability(0, 200, 0.3); await sleep(50, 100, 200); } if (matching_elements.length > 0) { const match_index = clicked_tokens.filter(token => token.textContent.trim() === correct_token.trim()).length; if (match_index < matching_elements.length) { matching_elements[match_index].click(); clicked_tokens.push(matching_elements[match_index]); } else { clicked_tokens.push(matching_elements[0]); } } }; isTokenRunning = false; } async function correctIndicesRun() { isTokenRunning = true; if (window.sol.correctIndices) { for (const index of window.sol.correctIndices) { if (simulated == true) await sleep(50, 100); document.querySelectorAll('div[data-test="word-bank"] [data-test="challenge-tap-token-text"]')[index].click(); }; // nextButtonClick(); } isTokenRunning = false; } async function correctPairsRun() { isTokenRunning = true; let nl = document.querySelectorAll('button[data-test*="challenge-tap-token"]'); if (document.querySelectorAll('[data-test*="challenge-tap-token-text"]').length === nl.length) { for (const pair of window.sol.pairs) { for (let i = 0; i < nl.length; i++) { if (simulated == true) { await sleep(50, 20, 50); } const nlInnerText = nl[i].querySelector('[data-test="challenge-tap-token-text"]').innerText.toLowerCase().trim(); try { if ( ( nlInnerText === pair.transliteration.toLowerCase().trim() || nlInnerText === pair.character.toLowerCase().trim() ) && !nl[i].disabled ) { nl[i].click() } } catch (TypeError) { if ( ( nlInnerText === pair.learningToken.toLowerCase().trim() || nlInnerText === pair.fromToken.toLowerCase().trim() ) && !nl[i].disabled ) { nl[i].click() } } } } } isTokenRunning = false; } function findSubReact(dom, traverseUp = 0) { const key = Object.keys(dom).find(key => key.startsWith("__reactProps$")); return dom.parentElement[key].children.props; } function findReact(dom, traverseUp = 0) { let reactProps = Object.keys(dom.parentElement).find((key) => key.startsWith("__reactProps$")); while (traverseUp-- > 0 && dom.parentElement) { dom = dom.parentElement; reactProps = Object.keys(dom.parentElement).find((key) => key.startsWith("__reactProps$")); } if(dom?.parentElement?.[reactProps]?.children[0] == null){ return dom?.parentElement?.[reactProps]?.children[1]?._owner?.stateNode; } else { return dom?.parentElement?.[reactProps]?.children[0]?._owner?.stateNode; } //return dom?.parentElement?.[reactProps]?.children[0]?._owner?.stateNode; } window.findReact = findReact; window.ss = solving; const SUPABASE_URL = 'https://henexdxgboppadgsxegm.supabase.co'; const ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImhlbmV4ZHhnYm9wcGFkZ3N4ZWdtIiwicm9sZSI6ImFub24iLCJpYXQiOjE2OTQ5MDI0ODEsImV4cCI6MjAxMDQ3ODQ4MX0.k3Y9mjNaw_SKrHfWr9dA7PkWCOl_i2zEUjo77OxNH68'; const supabase = window.supabase.createClient(SUPABASE_URL, ANON_KEY); let duolingoProCurrentVersionShort = "2B7"; async function settingsStuff(messageValue, value) { console.log("settingsStuff called"); if (messageValue) { const { data, error } = await supabase .from('settings_stuff') .insert([{ text: messageValue, value: value, randomValue: randomValue, version: duolingoProCurrentVersionShort }]); if (error) { console.error("Error sending message:", error); } else { console.log("Message sent successfully:", data); } } else { console.error("Message text is empty."); } } async function sendFeedbackNew(feedbackTextOne, feedbackTypeOne) { console.log("sendFeedbackNew called"); // Add a breakpoint here. // debugger; // const messageText = document.getElementById('messageInput').value; // , timestamptz: new Date().toISOString().substr(0, 19) if (feedbackTextOne) { const { data, error } = await supabase .from('send_feedback') .insert([{ feedback_text: feedbackTextOne, feedback_type: feedbackTypeOne, randomValue: randomValue, version: duolingoProCurrentVersion }]); if (error) { console.error("Error sending message:", error); sendFeedbackStatus = 'error'; } else { console.log("Message sent successfully:", data); sendFeedbackStatus = 'true'; } } else { console.error("Message text is empty."); sendFeedbackStatus = 'empty'; } } async function analyticsLogsSend(text, value) { if (text) { const { data, error } = await supabase .from('analytics_logs') .insert([{ text: text, value: value, randomValue: randomValue, version: duolingoProCurrentVersionShort }]); if (error) { console.error("Error sending message:", error); } else { console.log("Message sent successfully:", data); } } else { console.error("Message text is empty."); } } async function anonymousSolveDetails(value) { if (value) { // const { data, error } = await supabase // .from('AutoSolveSimpleLogs') // .insert([{ type: value, version: duolingoProCurrentVersionShort, sessionValue: DuolingoProShortSessionID }]); DuolingoProAmountOfQuestionsEverSolved++; localStorage.setItem('DuolingoProAmountOfQuestionsEverSolved', DuolingoProAmountOfQuestionsEverSolved); // if (error) { // console.error("Error sending message:", error); // } else { // console.log("Message sent successfully:", data); // } } else { console.error("Message text is empty."); } } async function versionServerStuff(option, status, to, from) { if (option === 'download') { if (status) { const { data, error } = await supabase .from('update_stuff') .insert([{ status: status, to: to, from: from, randomValue: randomValue }]); if (error) { console.error("Error sending message:", error); downloadStuffVar = 'error'; } else { console.log("Message sent successfully:", data); downloadStuffVar = 'true'; } } else { console.error("Message text is empty."); downloadStuffVar = 'empty'; } } else if (option === 'update') { if (status) { const { data, error } = await supabase .from('DownloadStuff') .insert([{ status: status, to: to, from: from, randomValue: randomValue }]); if (error) { console.error("Error sending message:", error); updateStuffVar = 'error'; } else { console.log("Message sent successfully:", data); updateStuffVar = 'true'; } } else { console.error("Message text is empty."); updateStuffVar = 'empty'; } } }