Duolingo Switch Windows

It switches automatically between learn and league windows with the goal to be online for other users, and they think

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name        Duolingo Switch Windows
// @namespace   http://tampermonkey.net/
// @match       https://*.duolingo.com/*
// @grant       none
// @license     MIT
// @require https://cdn.jsdelivr.net/npm/[email protected]/tailwindcss.js
// @version     1.0
// @author      DuoSolverGrinder
// @description It switches automatically between learn and league windows with the goal to be online for other users, and they think
// you're watching for them to try to avoid those users who like to make points while you're offline.
// For other options you can visit the links https://github.com/DuoSolverGrinder/DuoSolverGrinder,  https://duosolver.is-great.net/
// ==/UserScript==
let state = 0;
let activate = false;
let switchWindowInterval = null;
let switchBetweenTimesInSeconds = 60;

let bttnSwitch = 'switchWindow-switch-bttn';

let html = `
<div id="switchWindow-container" class="inline-flex flex-col gap-y-4 justify-end fixed left-5 bottom-4 z-[211] border border-1 p-4 bg-indigo-400 dark:bg-gray-900">
    <button id="switchWindow-switch-bttn" class="px-4 py-2 rounded-md border border-2 bg-blue-600 text-gray-200  dark:bg-gray-100 dark:text-gray-800">Activate</button>
  <p>To grind xp, use next links:</p>
  <div class="flex justify-center gap-x-2">
       <a  onclick="alert('It switches automatically between learn and league windows with the goal to be online for other users and they think you are watching for them, to try to avoid those users who like to make points while you are offline. It changes every minute.Click on button Activate to start.')" href="#">
          <img class="rounded-md w-7 h-7" src="https://duosolvergrinder.github.io/DuoSolverGrinder/help.png" >
      </a>
      <a target="_blank" href="https://github.com/DuoSolverGrinder/DuoSolverGrinder">
         <svg  class="text-red-500 w-8 h-8" fill="none" viewBox="0 0 120 120"
            stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#24292f"/></svg>
      </a>
      <a target="_blank" href="https://duosolver.is-great.net">
          <img class="rounded-md w-7 h-7" src="https://duosolvergrinder.github.io/DuoSolverGrinder/dsg.png" >
      </a>
  </div>

</div>
`
function toggleMenu()
{
  let bttn = document.getElementById(bttnSwitch);
  if(activate) {
     activate = false;
     bttn.textContent = 'Activate';
     clearInterval(switchWindowInterval);
     switchWindowInterval = null;
    return;
  }
  activate = true;
  bttn.textContent = 'Deactivate';
  switchWindowInterval = setInterval(()=>{
                            state = state == 0 ? 2: 0;
                            document.getElementsByClassName("_2dvyl")[state].click()
                       }, switchBetweenTimesInSeconds * 1000)
}

function insertButtons()
{
  let container = document.getElementById('switchWindow-container');
  if(!container) {
     document.body.insertAdjacentHTML('beforeend',html);
     let bttn = document.getElementById(bttnSwitch);
     bttn.addEventListener('click', toggleMenu );
     activate ? bttn.textContent = "Deactivate" : "Activate";
  }

}

window.onload = (event) => {
  setInterval(insertButtons, 1000);
}