[Lite Version] Automatically farm experience points, hacking Duolingo is so easy!
// ==UserScript== // @name Auto-Duolingo // @version 1.0.8 // @author DevX // @namespace http://tampermonkey.net/ // @description [Lite Version] Automatically farm experience points, hacking Duolingo is so easy! // @match https://*.duolingo.com/* // @match https://*.duolingo.cn/* // @grant none // @license MIT // @icon https://autoduo.click/assets/imgs/favicon.ico // ==/UserScript== (() => { const AUTODUOLINGO_STORAGE = "autoDuolingoStorage"; const { isSafeMode, isShowUI, isAnimationOff, exp, time, version, isNewNotify, rmNotiVer, rmNotiContent } = getSession(); const { notifyVersion } = getLocal(AUTODUOLINGO_STORAGE); const autoDuoLite = { initSignature: function () { this.signatureElm = document.createElement("div"); Object.assign(this.signatureElm, { className: "signature-listening", innerHTML: ` <div> Auto-Duolingo DevX <div class="autoduo-lite-version"> LITE VERSION <button class="autoduo-upgrade" title="Upgrade version"></button> </div> </div> `, }); const upgrade = this.signatureElm.querySelector('.autoduo-upgrade') upgrade.addEventListener('click', () => this.watchTutorial.click()) document.body.appendChild(this.signatureElm); }, initContact: function () { this.contactWrapper = document.createElement("div"); Object.assign(this.contactWrapper, { className: "contact-wrapper-listening", innerHTML: `<a class="contact-item-listening" href="https://t.me/imdevx" target="_blank" style="--data-img: url('https://autoduo.click/assets/client/tele-icon.ndx')"> <p class="popup">Chat with DevX</p> </a> <a class="contact-item-listening" href="https://t.me/autoduofamily" target="_blank" style="--data-img: url('https://autoduo.click/assets/client/tele-gr-icon.ndx')"> <p class="popup">Telegram Community</p> </a> <a class="contact-item-listening" href="https://zalo.me/g/lmhfps187" target="_blank" style="--data-img: url('https://autoduo.click/assets/client/zalo-icon.ndx')"> <p class="popup">Zalo Community</p> </a> <a class="contact-item-listening" href="https://www.youtube.com/@autoduofamily" target="_blank" style="--data-img: url('https://autoduo.click/assets/client/youtube-icon.ndx')"> <p class="popup">Youtube Channel</p> </a> <a class="contact-item-listening" href="https://www.facebook.com/groups/autoduofamily" target="_blank" style="--data-img: url('https://autoduo.click/assets/client/facebook-icon.png')"> <p class="popup">Facebook Community</p> </a> <a class="contact-item-listening" id="greasyfork" href="https://greasyfork.org/en/scripts/487867-auto-duolingo" target="_blank" style="--data-img: url('https://autoduo.click/assets/client/greasyfork-icon.ndx')"> <p class="popup">Greasy Fork</p> </a>`, }); }, initPopup: function () { this.updateGuidePopup = document.createElement("div"); Object.assign(this.updateGuidePopup, { className: "update-guide-popup", innerHTML: ` <div class="guide-popup-main"> <h2 class="guide-popup-title">AUTO GUIDE</h2> <div class="guide-popup-content"> <p class="guide-popup-text" style="color: rgb(0,159,235); margin-bottom: 24px"> This is a lite version of AutoDuo with the main feature of automatically farming listening exercises (requires Super Duolingo). To use auto, follow the steps below: </p> <p class="guide-popup-text"> <b>Step 1:</b> Go to the Super workout page (with the dumbbell icon). </p> <p class="guide-popup-text"> <b>Step 2</b>: Press the "Start Farm XP" button to start the automatic farming process!. </p> <i style="font-size: 13px; margin-top: 12px; line-height: 1.3; display: inline-block"><b style="color: #ff5555">Note: </b>Super Duolingo is required to use this version. If you want to auto or use all the other useful features without Super, click to watch the video tutorial!</i> <div class="guide-popup-btn"> <button class="autoduo-btn popup-btn-close"><span>Close</span></button> <a class="autoduo-btn btn-green popup-btn-access" href="https://autoduo.click/l/tutorial/" target="_blank"> <span>Watch tutorial</span> </a> </div> </div> </div> `, }); const closePopupBtn = this.updateGuidePopup.querySelector(".popup-btn-close"); this.watchTutorial = this.updateGuidePopup.querySelector(".popup-btn-access"); closePopupBtn.addEventListener("click", () => { document.body.contains(this.updateGuidePopup) && this.updateGuidePopup.remove(); }); }, initBtn: function () { this.autoBtn = document.createElement("button"); Object.assign(this.autoBtn, { className: "autoduo-btn btn-green auto-farm-btn-listening", innerText: "START FARM XP", onclick: () => { this.isAuto ? this.stop() : this.start(); }, }); this.updateBtn = document.createElement("button"); Object.assign(this.updateBtn, { className: "autoduo-btn guide-btn-listening", innerText: "Instructions for use", onclick: () => { this.isAuto && this.stop(); document.body.appendChild(this.updateGuidePopup); }, }); this.showHideBtn = document.createElement("button"); Object.assign(this.showHideBtn, { className: "show-hide-listening", style: `--data-version: 'V${this.version}'`, innerHTML: "<i></i>", }); this.showHideBtn.addEventListener("click", () => { this.isShowUI = !this.isShowUI; this.handleShowHideUI(true); }); document.body.append(this.showHideBtn); }, initBubbles: function () { this.notifyBubble = document.createElement("button"); Object.assign(this.notifyBubble, { className: "bubble-item-listening notify-bubble-listening", title: "Notification", }); this.superBubble = document.createElement("a"); Object.assign(this.superBubble, { className: "bubble-item-listening super-bubble-listening", title: "Duolingo Super Free", href: "https://t.me/duolingosuperfree", target: "_blank", }); this.marketerBubble = document.createElement("a"); Object.assign(this.marketerBubble, { className: "bubble-item-listening streak-bubble-listening", title: "Hack Streak Service", href: "https://autoduo.click/l/hack-streak/", target: "_blank", }); }, initStatistics: function () { this.statistic = document.createElement("div"); this.keyTypeElm = document.createElement("p"); this.expElm = document.createElement("p"); this.dateElm = document.createElement("p"); const statisticWrapper = document.createElement("div"); Object.assign(this.keyTypeElm, { className: "key-type-listening", innerHTML: "<b style='color: #009feb'>Auto-Duolingo Lite</b>", }); this.expElm.className = "total-exp-listening"; this.expElm.innerText = this.exp; this.statistic.className = "statistic-listening"; this.dateElm.className = "time-listening"; statisticWrapper.className = "statistic-wrapper-listening"; statisticWrapper.append(this.expElm, this.dateElm); this.statistic.append(this.keyTypeElm, statisticWrapper); }, initFunctions: function () { this.animationOffWrapper = document.createElement("div"); this.animationOffWrapper.style = `--data-name: "Hide Animation"`; const animationOffInfo = "HIDE ANIMATION MODE:\n" + "- When this mode is enabled, images and animations on the website will be hidden to optimize performance.\n\n" + "Suggestion: To achieve the best performance, you should find and disable items related to effects in Duolingo's settings!"; this.autoduoCreateSwitch( animationOffInfo, this.animationOffWrapper, 1, this.isAnimationOff, (setSwitch) => { this.isAnimationOff = !this.isAnimationOff; this.handleAnimationOff(true); setSwitch(this.isAnimationOff); } ); this.safeModeWrapper = document.createElement("div"); this.safeModeWrapper.style = `--data-name: "Safe Mode"`; const safeModeInfo = "SAFE MODE:\n" + "- When this mode is enabled, the system will simulate user actions when using auto. The speed will be more relaxed, " + "in exchange for the completion time of lessons and the amount of experience will be the most natural, minimizing " + "the risks of REPORT and account BAN!"; this.autoduoCreateSwitch(safeModeInfo, this.safeModeWrapper, 2, this.isSafeMode, () => { this.isSafeMode ? this.handleSafeModeOff() : this.handleSafeModeOn(); }); this.turboModeWrapper = document.createElement("div"); this.turboModeWrapper.style = `--data-name: "Turbo Mode"`; const turboModeInfo = "TURBO MODE:\n" + "- When enabled, the system will significantly boost the auto speed. It will utilize higher performance and " + "is not recommended for use on low-performance devices.\n- Turn it off and refresh the page if you encounter " + "issues while activating this mode!\n\n- Note: This is an experimental feature and requires a VIP Key to use. " + "Only enable it when you truly require speed and understand its implications!!"; this.autoduoCreateSwitch(turboModeInfo, this.turboModeWrapper, 4, false); this.legendModeWrapper = document.createElement("div"); this.legendModeWrapper.style = `--data-name: "Lesson Pass Mode"`; const legendModeInfo = "LESSON PASS MODE:\n" + "- When activated, the system won't repeat exercises as in the regular mode but will engage in exercises actively selected by the user. " + "This mode is used for legendary exercises, story exercises, and most other similar exercises.\n- You need to enter the lesson you want to " + "pass in, and then the system will automatically complete that lesson for you!\n" + "- When this mode is activated, the basic auto button will be temporarily disabled."; this.autoduoCreateSwitch(legendModeInfo, this.legendModeWrapper, 5, false); this.targetModeWrapper = document.createElement("div"); this.targetModeWrapper.style = `--data-name: "XP Target Mode"`; const targetModeInfo = "EXPERIENCE POINT TARGET MODE:\n" + "- By setting an experience point target, the system will automatically stop auto mode when the total experience points " + "obtained equal or exceed the specified target.\n- This helps you better control the auto function, " + "preventing unintentional accumulation of excess experience points due to forgetting to turn off auto mode!\n\n" + "- Note: The experience point target must be greater than the current amount of experience points obtained through auto mode!"; this.autoduoCreateSwitch(targetModeInfo, this.targetModeWrapper, 6, false); this.passModeWrapper = document.createElement("div"); this.passModeWrapper.style = `--data-name: "Auto Pass Mode"`; const passModeInfo = "AUTO PASS MODE:\n" + "- By setting the number of lessons you wish to pass, the system will automatically pass the corresponding " + "number of new lessons as per the value you've set!\n\n" + "- Note: the lesson value should be within the range of 1 - 1000 (Enter 0 for unlimited auto)!"; this.autoduoCreateSwitch(passModeInfo, this.passModeWrapper, 7, false); this.darkModeWrapper = document.createElement("div"); this.darkModeWrapper.style = `--data-name: "Dark Mode"`; const darkModeInfo = "DARK MODE\n- Enable/disable website dark mode faster!"; this.autoduoCreateSwitch(darkModeInfo, this.darkModeWrapper, 3, this.isDarkMode, (setSwitch) => { this.isDarkMode = !this.isDarkMode; const [theme, value, css] = this.isDarkMode ? ["dark", "on", "--app-offset: 0px; --color-snow: 19, 31, 36; --color-snow-always-light: 255, 255, 255; --color-snow-always-dark: 19, 31, 36; --color-polar: 32, 47, 54; --color-swan: 55, 70, 79; --color-swan-always-light: 229, 229, 229; --color-swan-always-dark: 55, 70, 79; --color-hare: 82, 101, 109; --color-hare-always-light: 175, 175, 175; --color-wolf: 220, 230, 236; --color-eel: 241, 247, 251; --color-squid: 235, 227, 227; --color-walking-fish: 32, 47, 54; --color-flamingo: 148, 81, 81; --color-pig: 245, 164, 164; --color-crab: 255, 120, 120; --color-cardinal: 238, 85, 85; --color-fire-ant: 216, 72, 72; --color-canary: 32, 47, 54; --color-duck: 251, 229, 109; --color-bee: 255, 199, 0; --color-bee-always-dark: 255, 199, 0; --color-lion: 255, 177, 0; --color-fox: 255, 171, 51; --color-cheetah: 32, 47, 54; --color-monkey: 229, 162, 89; --color-camel: 231, 166, 1; --color-guinea-pig: 215, 148, 51; --color-grizzly: 187, 113, 73; --color-sea-sponge: 32, 47, 54; --color-turtle: 95, 132, 40; --color-owl: 147, 211, 51; --color-tree-frog: 121, 185, 51; --color-peacock: 0, 205, 156; --color-iguana: 32, 47, 54; --color-anchovy: 210, 228, 232; --color-beluga: 187, 242, 255; --color-moon-jelly: 122, 240, 242; --color-blue-jay: 63, 133, 167; --color-macaw: 73, 192, 248; --color-whale: 24, 153, 214; --color-humpback: 43, 112, 201; --color-narwhal: 20, 83, 163; --color-manta-ray: 4, 44, 96; --color-starfish: 255, 134, 208; --color-beetle: 206, 130, 255; --color-betta: 144, 105, 205; --color-butterfly: 111, 78, 161; --color-dragon: 204, 52, 141; --color-starling: 92, 108, 252; --color-martin: 71, 85, 223; --color-grackle: 167, 160, 255; --color-honeycreeper: 193, 187, 255; --color-deep-starling: 34, 33, 81; --color-deep-martin: 16, 15, 62; --color-legendary-foreground: 140, 65, 3; --color-stardust: 199, 255, 254; --color-cosmos: 60, 77, 255; --color-nebula: 63, 34, 236; --color-nova: 207, 23, 200; --color-gamma: 38, 246, 99; --color-starlight: 38, 138, 255; --color-quasar: 252, 85, 255; --color-celestia: 255, 255, 255; --color-eclipse: 0, 4, 55; --color-black: 0, 0, 0; --color-aqua: 43, 164, 176; --color-aqua-always-light: 56, 238, 255; --color-ocean: 56, 238, 255; --color-seafoam: 30, 89, 97; --color-ice: 23, 52, 58; --color-max-shadow: 20, 208, 225; --color-black-white: 255, 255, 255; --color-diamond-stat: 86, 219, 226; --color-mask-green: 144, 220, 72; --color-pearl-stat: 255, 170, 222; --color-snow-dark-swan: 55, 70, 79; --color-black-text: 241, 247, 251; --color-blue-space: 11, 62, 113; --color-juicy-blue-space: 10, 74, 130; --color-juicy-blue-space-light: 35, 83, 144; --color-gold: 250, 169, 25; --color-gray-text: 220, 230, 236; --color-orange: 255, 157, 0; --color-diamond-highlight: 231, 251, 251; --color-diamond: 56, 208, 208; --color-banana: 255, 176, 32; --color-cloud: 207, 207, 207; --color-cloud-light: 221, 221, 221; --color-cloud-lightest: 240, 240, 240; --color-kiwi: 122, 199, 12; --color-kiwi-dark: 93, 151, 9; --color-kiwi-light: 142, 224, 0; --color-facebook: 59, 89, 152; --color-facebook-dark: 45, 67, 115; --color-google: 66, 133, 244; --color-twitter: 29, 161, 242; --color-hv-light-peach: 241, 218, 179; --color-hv-peach: 219, 186, 131; --color-hv-light-orange: 255, 177, 64; --color-hv-orange: 204, 121, 0; --color-hv-brown: 140, 90, 17; --color-streak-panel-extended-background: 205, 121, 0; --color-streak-panel-frozen-background: 43, 112, 201; --color-streak-panel-frozen-flair-background: 73, 192, 248; --color-streak-panel-frozen-subtitle: 255, 255, 255; --color-streak-panel-frozen-text: 255, 255, 255; --color-streak-panel-frozen-topbar-text: 255, 255, 255; --color-streak-panel-streak-society-background: 215, 148, 51; --color-streak-panel-streak-society-text: 255, 255, 255; --color-streak-panel-unextended-heading-text: 82, 101, 109; --color-streak-panel-unextended-heading-background: 32, 47, 54; --color-streak-panel-unextended-topbar-text: 255, 255, 255; --color-streak-panel-milestone-gradient-start: 255, 147, 58; --color-streak-panel-milestone-gradient-end: 255, 200, 0; --color-streak-society-dark-orange: 255, 151, 1; --color-streak-society-light-orange: 255, 179, 1; --color-friends-quest-own-incomplete: 111, 139, 157; --color-friends-quest-friend-incomplete: 79, 100, 113; --color-black-text-always-light: 60, 60, 60; --color-cardinal-always-light: 255, 75, 75; --color-cowbird: 174, 104, 2; --color-eel-always-light: 75, 75, 75; --color-fox-always-light: 255, 150, 0; --color-fire-ant-always-light: 234, 43, 43; --color-grizzly-lite: 220, 143, 71; --color-guinea-pig-always-light: 205, 121, 0; --color-iguana-always-light: 221, 244, 255; --color-macaw-always-light: 28, 176, 246; --color-owl-always-light: 88, 204, 2; --color-polar-always-light: 247, 247, 247; --color-sea-sponge-always-light: 215, 255, 184; --color-tree-frog-always-light: 88, 167, 0; --color-turtle-always-light: 165, 237, 110; --color-walking-fish-always-light: 255, 223, 224; --color-wolf-always-light: 119, 119, 119; --color-cardinal-always-dark: 238, 85, 85; --color-eel-always-dark: 241, 247, 251; --color-hare-always-dark: 82, 101, 109; --color-macaw-always-dark: 73, 192, 248; --color-owl-always-dark: 147, 211, 51; --color-polar-always-dark: 32, 47, 54; --color-wolf-always-dark: 220, 230, 236; --color-rookie: 0, 175, 133; --color-explorer: 255, 100, 191; --color-traveler: 255, 145, 83; --color-trailblazer: 154, 143, 232; --color-adventurer: 96, 12, 199; --color-discoverer: 111, 44, 57; --color-daredevil: 46, 83, 138; --color-navigator: 9, 47, 119; --color-champion: 255, 110, 53; --color-daily_refresh: 0, 148, 255; --color-dark-mode-locked-path-section-text-color: 82, 101, 109; --color-rookie-progress-bar: 0, 198, 150; --color-explorer-progress-bar: 255, 138, 207; --color-traveler-progress-bar: 255, 167, 106; --color-trailblazer-progress-bar: 169, 157, 254; --color-adventurer-progress-bar: 122, 13, 199; --color-discoverer-progress-bar: 131, 50, 65; --color-daredevil-progress-bar: 54, 98, 165; --color-navigator-progress-bar: 12, 57, 141; --color-champion-progress-bar: 255, 129, 80; --color-daily_refresh-progress-bar: 28, 160, 255; --color-course-complete-cta: 120, 219, 224; --color-course-complete-cta-border: 94, 201, 204; --color-bea-secondary: 24, 153, 214; --color-eddy-secondary: 234, 43, 43; --color-gilded-secondary: 231, 166, 1; --color-lily-secondary: 165, 104, 204; --color-vikram-secondary: 163, 42, 113; --color-zari-secondary: 204, 107, 166; --color-oscar-secondary: 0, 164, 125; --color-falstaff-secondary: 150, 90, 58; --color-bea-radio: 20, 123, 172; --color-duo-radio: 62, 143, 1; --color-eddy-radio: 179, 53, 53; --color-falstaff-radio: 131, 79, 51; --color-lin-lucy-radio: 179, 105, 0; --color-lily-radio: 144, 91, 179; --color-vikram-radio: 143, 36, 99; --color-zari-radio: 179, 94, 146; --color-oscar-radio: 0, 144, 109; --color-bea-junior-shine: 67, 190, 248; --color-duo-shine: 114, 214, 39; --color-eddy-shine: 255, 105, 105; --color-falstaff-shine: 227, 165, 108; --color-lily-shine: 214, 150, 255; --color-lin-lucy-shine: 255, 168, 44; --color-oscar-shine: 63, 217, 181; --color-vikram-shine: 214, 90, 162; --color-zari-shine: 255, 158, 217; --color-super-background-secondary: 26, 30, 76; --color-super-gradient-background: 12, 47, 113; --color-super-gradient-top-halo: 12, 76, 70; --color-super-gradient-bottom-halo: 76, 29, 115; --color-gold-shine: 255, 231, 0; --color-legendary-dark-background: 24, 24, 24; --color-roseate: 223, 75, 162; --color-rosefinch: 180, 28, 117; --color-bluebird: 3, 144, 211; --color-cotinga: 121, 58, 227; --color-sabrewing: 165, 112, 255; --color-blueberry: 17, 82, 167; --color-ether: 60, 89, 141; --color-diamond-tournament-purple: 161, 161, 238; --color-diamond-tournament-reaction: 118, 163, 231; --color-yir-page0: 221, 244, 255; --color-yir-page1: 227, 255, 235; --color-yir-page1-shadow: 19, 31, 36; --color-yir-page3-shadow: 187, 172, 252; --color-yir-page4-shadow: 143, 219, 255; --color-yir-page5-shadow: 255, 183, 80; --color-super-gradient-green-variant1: 38, 255, 85; --color-super-gradient-blue-variant1: 38, 139, 255; --color-super-gradient-pink-variant1: 252, 85, 255; --color-super-gradient-purple-variant1: 17, 34, 181; --color-unknown-001e2d: 0, 30, 45; --color-unknown-0047a4: 0, 71, 164; --color-unknown-0087d0: 0, 135, 208; --color-unknown-00aff9: 0, 175, 249; --color-unknown-013047: 1, 48, 71; --color-unknown-048fd1: 4, 143, 209; --color-unknown-0e0f10: 14, 15, 16; --color-unknown-0e3d79: 14, 61, 121; --color-unknown-172071: 23, 32, 113; --color-unknown-280378: 40, 3, 120; --color-unknown-3ebbf6: 62, 187, 246; --color-unknown-655ebb: 101, 94, 187; --color-unknown-696cee: 105, 108, 238; --color-unknown-7c0000: 124, 0, 0; --color-unknown-89e219: 137, 226, 25; --color-unknown-935051: 147, 80, 81; --color-unknown-959595: 149, 149, 149; --color-unknown-a2a2a2: 162, 162, 162; --color-unknown-a3dbeb: 163, 219, 235; --color-unknown-a4dffb: 164, 223, 251; --color-unknown-aaa: 170, 170, 170; --color-unknown-d087ff: 208, 135, 255; --color-unknown-d9d9d9: 217, 217, 217; --color-unknown-ddd: 221, 221, 221; --color-unknown-de8029: 222, 128, 41; --color-unknown-e3e3e3: 227, 227, 227; --color-unknown-e4ffff: 228, 255, 255; --color-unknown-ed8c01: 237, 140, 1; --color-unknown-f3484e: 243, 72, 78; --color-unknown-f4fafe: 244, 250, 254; --color-unknown-fbdec5: 251, 222, 197; --color-unknown-ffc700: 255, 199, 0; --color-unknown-fff2aa: 255, 242, 170; --color-unknown-fffbef: 255, 251, 239;"] : ["light", "off", "--app-offset: 0px; --color-snow: 255, 255, 255; --color-snow-always-light: 255, 255, 255; --color-snow-always-dark: 19, 31, 36; --color-polar: 247, 247, 247; --color-swan: 229, 229, 229; --color-swan-always-light: 229, 229, 229; --color-swan-always-dark: 55, 70, 79; --color-hare: 175, 175, 175; --color-hare-always-light: 175, 175, 175; --color-wolf: 119, 119, 119; --color-eel: 75, 75, 75; --color-squid: 235, 227, 227; --color-walking-fish: 255, 223, 224; --color-flamingo: 255, 178, 178; --color-pig: 245, 164, 164; --color-crab: 255, 120, 120; --color-cardinal: 255, 75, 75; --color-fire-ant: 234, 43, 43; --color-canary: 255, 245, 211; --color-duck: 251, 229, 109; --color-bee: 255, 200, 0; --color-bee-always-dark: 255, 199, 0; --color-lion: 255, 177, 0; --color-fox: 255, 150, 0; --color-cheetah: 255, 206, 142; --color-monkey: 229, 162, 89; --color-camel: 231, 166, 1; --color-guinea-pig: 205, 121, 0; --color-grizzly: 187, 113, 73; --color-sea-sponge: 215, 255, 184; --color-turtle: 165, 237, 110; --color-owl: 88, 204, 2; --color-tree-frog: 88, 167, 0; --color-peacock: 0, 205, 156; --color-iguana: 221, 244, 255; --color-anchovy: 210, 228, 232; --color-beluga: 187, 242, 255; --color-moon-jelly: 122, 240, 242; --color-blue-jay: 132, 216, 255; --color-macaw: 28, 176, 246; --color-whale: 24, 153, 214; --color-humpback: 43, 112, 201; --color-narwhal: 20, 83, 163; --color-manta-ray: 4, 44, 96; --color-starfish: 255, 134, 208; --color-beetle: 206, 130, 255; --color-betta: 144, 105, 205; --color-butterfly: 111, 78, 161; --color-dragon: 204, 52, 141; --color-starling: 92, 108, 252; --color-martin: 71, 85, 223; --color-grackle: 167, 160, 255; --color-honeycreeper: 193, 187, 255; --color-deep-starling: 34, 33, 81; --color-deep-martin: 16, 15, 62; --color-legendary-foreground: 140, 65, 3; --color-stardust: 199, 255, 254; --color-cosmos: 60, 77, 255; --color-nebula: 63, 34, 236; --color-nova: 207, 23, 200; --color-gamma: 38, 246, 99; --color-starlight: 38, 138, 255; --color-quasar: 252, 85, 255; --color-celestia: 255, 255, 255; --color-eclipse: 0, 4, 55; --color-black: 0, 0, 0; --color-aqua: 56, 238, 255; --color-aqua-always-light: 56, 238, 255; --color-ocean: 0, 124, 143; --color-seafoam: 158, 224, 233; --color-ice: 225, 253, 255; --color-max-shadow: 20, 208, 225; --color-black-white: 0, 0, 0; --color-diamond-stat: 86, 219, 226; --color-mask-green: 137, 226, 25; --color-pearl-stat: 255, 170, 222; --color-snow-dark-swan: 255, 255, 255; --color-black-text: 60, 60, 60; --color-blue-space: 11, 62, 113; --color-juicy-blue-space: 10, 74, 130; --color-juicy-blue-space-light: 35, 83, 144; --color-gold: 250, 169, 25; --color-gray-text: 153, 153, 153; --color-orange: 255, 157, 0; --color-diamond-highlight: 231, 251, 251; --color-diamond: 56, 208, 208; --color-banana: 255, 176, 32; --color-cloud: 207, 207, 207; --color-cloud-light: 221, 221, 221; --color-cloud-lightest: 240, 240, 240; --color-kiwi: 122, 199, 12; --color-kiwi-dark: 93, 151, 9; --color-kiwi-light: 142, 224, 0; --color-facebook: 59, 89, 152; --color-facebook-dark: 45, 67, 115; --color-google: 66, 133, 244; --color-twitter: 29, 161, 242; --color-hv-light-peach: 241, 218, 179; --color-hv-peach: 219, 186, 131; --color-hv-light-orange: 255, 177, 64; --color-hv-orange: 204, 121, 0; --color-hv-brown: 140, 90, 17; --color-streak-panel-extended-background: 255, 150, 0; --color-streak-panel-frozen-background: 221, 244, 255; --color-streak-panel-frozen-flair-background: 132, 216, 255; --color-streak-panel-frozen-subtitle: 28, 176, 246; --color-streak-panel-frozen-text: 132, 216, 255; --color-streak-panel-frozen-topbar-text: 24, 153, 214; --color-streak-panel-streak-society-background: 255, 200, 0; --color-streak-panel-streak-society-text: 205, 121, 0; --color-streak-panel-unextended-heading-text: 235, 195, 127; --color-streak-panel-unextended-heading-background: 255, 245, 211; --color-streak-panel-unextended-topbar-text: 235, 195, 127; --color-streak-panel-milestone-gradient-start: 255, 147, 58; --color-streak-panel-milestone-gradient-end: 255, 200, 0; --color-streak-society-dark-orange: 255, 151, 1; --color-streak-society-light-orange: 255, 179, 1; --color-friends-quest-own-incomplete: 175, 175, 175; --color-friends-quest-friend-incomplete: 145, 145, 145; --color-black-text-always-light: 60, 60, 60; --color-cardinal-always-light: 255, 75, 75; --color-cowbird: 174, 104, 2; --color-eel-always-light: 75, 75, 75; --color-fox-always-light: 255, 150, 0; --color-fire-ant-always-light: 234, 43, 43; --color-grizzly-lite: 220, 143, 71; --color-guinea-pig-always-light: 205, 121, 0; --color-iguana-always-light: 221, 244, 255; --color-macaw-always-light: 28, 176, 246; --color-owl-always-light: 88, 204, 2; --color-polar-always-light: 247, 247, 247; --color-sea-sponge-always-light: 215, 255, 184; --color-tree-frog-always-light: 88, 167, 0; --color-turtle-always-light: 165, 237, 110; --color-walking-fish-always-light: 255, 223, 224; --color-wolf-always-light: 119, 119, 119; --color-cardinal-always-dark: 238, 85, 85; --color-eel-always-dark: 241, 247, 251; --color-hare-always-dark: 82, 101, 109; --color-macaw-always-dark: 73, 192, 248; --color-owl-always-dark: 147, 211, 51; --color-polar-always-dark: 32, 47, 54; --color-wolf-always-dark: 220, 230, 236; --color-rookie: 0, 175, 133; --color-explorer: 255, 100, 191; --color-traveler: 255, 145, 83; --color-trailblazer: 154, 143, 232; --color-adventurer: 96, 12, 199; --color-discoverer: 111, 44, 57; --color-daredevil: 46, 83, 138; --color-navigator: 9, 47, 119; --color-champion: 255, 110, 53; --color-daily_refresh: 0, 148, 255; --color-dark-mode-locked-path-section-text-color: 82, 101, 109; --color-rookie-progress-bar: 0, 198, 150; --color-explorer-progress-bar: 255, 138, 207; --color-traveler-progress-bar: 255, 167, 106; --color-trailblazer-progress-bar: 169, 157, 254; --color-adventurer-progress-bar: 122, 13, 199; --color-discoverer-progress-bar: 131, 50, 65; --color-daredevil-progress-bar: 54, 98, 165; --color-navigator-progress-bar: 12, 57, 141; --color-champion-progress-bar: 255, 129, 80; --color-daily_refresh-progress-bar: 28, 160, 255; --color-course-complete-cta: 120, 219, 224; --color-course-complete-cta-border: 94, 201, 204; --color-bea-secondary: 24, 153, 214; --color-eddy-secondary: 234, 43, 43; --color-gilded-secondary: 231, 166, 1; --color-lily-secondary: 165, 104, 204; --color-vikram-secondary: 163, 42, 113; --color-zari-secondary: 204, 107, 166; --color-oscar-secondary: 0, 164, 125; --color-falstaff-secondary: 150, 90, 58; --color-bea-radio: 20, 123, 172; --color-duo-radio: 62, 143, 1; --color-eddy-radio: 179, 53, 53; --color-falstaff-radio: 131, 79, 51; --color-lin-lucy-radio: 179, 105, 0; --color-lily-radio: 144, 91, 179; --color-vikram-radio: 143, 36, 99; --color-zari-radio: 179, 94, 146; --color-oscar-radio: 0, 144, 109; --color-bea-junior-shine: 67, 190, 248; --color-duo-shine: 114, 214, 39; --color-eddy-shine: 255, 105, 105; --color-falstaff-shine: 227, 165, 108; --color-lily-shine: 214, 150, 255; --color-lin-lucy-shine: 255, 168, 44; --color-oscar-shine: 63, 217, 181; --color-vikram-shine: 214, 90, 162; --color-zari-shine: 255, 158, 217; --color-super-background-secondary: 26, 30, 76; --color-super-gradient-background: 12, 47, 113; --color-super-gradient-top-halo: 12, 76, 70; --color-super-gradient-bottom-halo: 76, 29, 115; --color-gold-shine: 255, 231, 0; --color-legendary-dark-background: 24, 24, 24; --color-roseate: 223, 75, 162; --color-rosefinch: 180, 28, 117; --color-bluebird: 3, 144, 211; --color-cotinga: 121, 58, 227; --color-sabrewing: 165, 112, 255; --color-blueberry: 17, 82, 167; --color-ether: 60, 89, 141; --color-diamond-tournament-purple: 161, 161, 238; --color-diamond-tournament-reaction: 118, 163, 231; --color-yir-page0: 221, 244, 255; --color-yir-page1: 227, 255, 235; --color-yir-page1-shadow: 19, 31, 36; --color-yir-page3-shadow: 187, 172, 252; --color-yir-page4-shadow: 143, 219, 255; --color-yir-page5-shadow: 255, 183, 80; --color-super-gradient-green-variant1: 38, 255, 85; --color-super-gradient-blue-variant1: 38, 139, 255; --color-super-gradient-pink-variant1: 252, 85, 255; --color-super-gradient-purple-variant1: 17, 34, 181; --color-unknown-001e2d: 0, 30, 45; --color-unknown-0047a4: 0, 71, 164; --color-unknown-0087d0: 0, 135, 208; --color-unknown-00aff9: 0, 175, 249; --color-unknown-013047: 1, 48, 71; --color-unknown-048fd1: 4, 143, 209; --color-unknown-0e0f10: 14, 15, 16; --color-unknown-0e3d79: 14, 61, 121; --color-unknown-172071: 23, 32, 113; --color-unknown-280378: 40, 3, 120; --color-unknown-3ebbf6: 62, 187, 246; --color-unknown-655ebb: 101, 94, 187; --color-unknown-696cee: 105, 108, 238; --color-unknown-7c0000: 124, 0, 0; --color-unknown-89e219: 137, 226, 25; --color-unknown-935051: 147, 80, 81; --color-unknown-959595: 149, 149, 149; --color-unknown-a2a2a2: 162, 162, 162; --color-unknown-a3dbeb: 163, 219, 235; --color-unknown-a4dffb: 164, 223, 251; --color-unknown-aaa: 170, 170, 170; --color-unknown-d087ff: 208, 135, 255; --color-unknown-d9d9d9: 217, 217, 217; --color-unknown-ddd: 221, 221, 221; --color-unknown-de8029: 222, 128, 41; --color-unknown-e3e3e3: 227, 227, 227; --color-unknown-e4ffff: 228, 255, 255; --color-unknown-ed8c01: 237, 140, 1; --color-unknown-f3484e: 243, 72, 78; --color-unknown-f4fafe: 244, 250, 254; --color-unknown-fbdec5: 251, 222, 197; --color-unknown-ffc700: 255, 199, 0; --color-unknown-fff2aa: 255, 242, 170; --color-unknown-fffbef: 255, 251, 239;"]; document.documentElement.setAttribute("data-duo-theme", theme); document.documentElement.setAttribute("style", css); const darkModeDataLocal = getLocal("duo.darkMode") for(const key in darkModeDataLocal){ darkModeDataLocal[key] = value } localStorage.setItem("duo.darkMode", JSON.stringify(darkModeDataLocal)); setSwitch(this.isDarkMode); }); this.farmingLocationWrapper = document.createElement("div"); this.farmingLocationWrapper.style = `--data-name: "Set XP Farm Location"`; const farmingLocationInfo = "SET XP FARM LOCATION\n" + "- By default, the system can only Farm XP in practice exercises or listening practices. However, with this feature, you can Farm XP " + "in any lesson you want, even in story lessons!\n" + "- Usage: Activate the feature and enter the URL of the lesson you want, then enable the XP Farm mode to start farming.\n" + "- NOTE: The URL to the lesson must be accurate and the lesson must be repeatable. Entering an inaccurate URL may lead " + "to errors or even pose risks to your account!"; this.autoduoCreateSwitch(farmingLocationInfo, this.farmingLocationWrapper, 8, false); this.autoX2Wrapper = document.createElement("div"); this.autoX2Wrapper.style = `--data-name: "Auto Collect x2 XP"`; const autoX2Info = "AUTO COLLECT X2 XP:\n" + '- This is a supplementary feature for "Auto Farm KN", helping to maintain the x2 KN status during farming. When enabled, ' + "it will check and automatically do new lessons to get x2 KN rewards if it detects the current state doesn't have x2. " + "This will help you farm more KN points than usual. \n\n- NOTE: This feature will do new lessons to maintain the x2 status, so " + "consider before enabling it if you have constraints with these lessons."; this.autoduoCreateSwitch(autoX2Info, this.autoX2Wrapper, 8, false); this.functionWrapper = document.createElement("div"); this.functionWrapper.className = "function-wrapper-listening"; this.functionWrapper.append( this.darkModeWrapper, this.animationOffWrapper, this.safeModeWrapper, this.turboModeWrapper ); }, initSetting: function () { this.settingBtn = document.createElement("button"); Object.assign(this.settingBtn, { className: "autoduo-btn setting-btn-listening", innerText: "Other settings", }); this.settingBtn.addEventListener("click", () => { this.controlContainer.contains(this.settingOverlay) || this.controlContainer.appendChild(this.settingOverlay); }); this.closeSettingBtn = document.createElement("button"); Object.assign(this.closeSettingBtn, { className: "autoduo-btn close-setting-btn-listening", innerText: "Close", }); this.closeSettingBtn.addEventListener("click", () => { this.controlContainer.contains(this.settingOverlay) && this.controlContainer.removeChild(this.settingOverlay); }); this.settingOverlay = document.createElement("div"); Object.assign(this.settingOverlay, { className: "setting-overlay-listening", innerHTML: ` <h3>Other settings</h3> `, }); this.settingFunction = document.createElement("div"); this.settingFunction.className = "setting-function-listening"; this.settingFunction.append( this.legendModeWrapper, this.passModeWrapper, this.targetModeWrapper, this.farmingLocationWrapper, this.autoX2Wrapper ); this.settingOverlay.append(this.settingFunction, this.closeSettingBtn); }, initContainer: function () { this.autoduoPowered = document.createElement('div') Object.assign(this.autoduoPowered, { className: 'autoduo-powered', innerHTML: `Powered by <a href="https://autoduo.click" target="_blank">🔥autoduo.click</a>` }) this.autoContainer = document.createElement("div"); this.autoContainer.className = "auto-container-listening"; this.autoContainer.append( this.statistic, this.functionWrapper, this.settingBtn, this.autoBtn, this.updateBtn ); this.overlayContainer = document.createElement("div"); this.overlayContainer.className = "overlay-listening"; this.controlContainer = document.createElement("div"); this.controlContainer.className = "control-container-listening"; this.controlContainer.append(this.autoContainer, this.contactWrapper, this.autoduoPowered); this.bubbleContainer = document.createElement("div"); this.bubbleContainer.className = "bubble-container-listening"; this.bubbleContainer.append(this.marketerBubble, this.superBubble, this.notifyBubble); document.body.append(this.controlContainer, this.bubbleContainer); }, fetchNoti: async function () { try { const res = await ( await fetch("https://api.autoduo.click/super/data/notify/?c7f54a73e6340a16176=91bf0d18b83") )?.json(); if (res?.code === 200) { const { notifyVersion: rmVersion, notifyContent: rmContent } = res.data[0]; setDataSession({ isNewNotify: (this.isNewNotify = +rmVersion > this.notifyVersion), rmNotiVer: (this.rmNotiVer = +rmVersion), rmNotiContent: (this.rmNotiContent = rmContent.replaceAll("\\n", "\n")), }); this.setNoti(); } } catch (e) {} }, setNoti: function () { if (!this.rmNotiVer) { return; } if (this.isNewNotify) { this.notifyBubble.classList.add("new"); } this.notifyBubble.addEventListener("click", () => { if (this.isNewNotify) { this.notifyBubble.classList.remove("new"); setDataSession("isNewNotify", (this.isNewNotify = false)); setDataLocal("notifyVersion", this.rmNotiVer); } window.alert(this.rmNotiContent); }); }, handleShowHideUI: function (isSave = false) { if (this.isShowUI) { this.showHideBtn.classList.remove("hide"); document.body.append(this.controlContainer, this.signatureElm, this.bubbleContainer); } else { this.showHideBtn.classList.add("hide"); this.controlContainer.remove(); this.signatureElm.remove(); this.bubbleContainer.remove(); } if (isSave) { setDataSession("isShowUI", this.isShowUI); this.controlContainer.classList.contains("autoduo-animate") || this.controlContainer.classList.add("autoduo-animate"); } }, handleAnimationOff: function (isSave = false) { this.isAnimationOff ? document.head.appendChild(this.animationStyle) : document.head.removeChild(this.animationStyle); isSave && setDataSession("isAnimationOff", this.isAnimationOff); }, handleSafeModeOn: function () { this.safeModeWrapper.setAutoduoSwitch(this.setSafeMode(true)); }, handleSafeModeOff: function () { this.safeModeWrapper.setAutoduoSwitch(this.setSafeMode(false)); }, start: function () { if (this.isAuto || this.isAutoRunning) { return; } document.body.appendChild(this.overlayContainer); this.isAuto = true; this.autoBtn.classList.add("running"); this.autoBtn.innerText = "STOP FARM XP"; setDataSession("isBasicAuto", this.isAuto); this.startTm = Date.now(); this.handleLocation(); }, stop: function () { if (!this.isAuto || this.isLegendMode) { return; } document.body.removeChild(this.overlayContainer); this.isAuto = false; this.autoBtn.classList.remove("running"); this.autoBtn.innerText = "START FARM XP"; setDataSession("isBasicAuto", this.isAuto); }, handleLocation: function () { if (!this.isAuto) { return; } const currentPath = window.location.pathname; switch (currentPath) { case this.practiceHubPath: this.goPracticeHubChallenge(); break; case this.listeningPacticePath: this.handlePracticeHubChallenge(); break; default: this.autoduoError( "[Inappropriate location]: Only enable auto when on the practice page (with the dumbbell icon) of Duolingo Super!" + "\n- Enabling auto on Duolingo Super's practice page will automatically farm listening exercises (20 XP)." + "\n- Upgrade to the full version of Auto-Duolingo to use auto farming and many other useful features without needing Super Duolingo!" , true); break; } }, goPracticeHubChallenge: function () { if (this.isAuto === false) { return; } const challengeBtn = $( 'img[src="https://d35aaqx5ub95lt.cloudfront.net/images/practiceHub/2ebe830fd55a7f2754d371bcd79faf32.svg"]' ); if (!challengeBtn) { setTimeout(this.goPracticeHubChallenge.bind(this), 1000); return; } challengeBtn.click(); setTimeout(this.handlePracticeHubChallenge.bind(this), 1000); }, handlePracticeHubChallenge: function () { if (window.location.pathname === this.practiceHubPath) { this.goPracticeHubChallenge(); return; } // Flag:BETA const challengeWrapper = $(".wqSzE"); if (challengeWrapper) { this.getDataStateNode(challengeWrapper); this.next(); return; } const nextActiveBtn = $('[data-test="player-next"][aria-disabled="false"]'); if (nextActiveBtn) { this.next(); return; } setTimeout(this.handlePracticeHubChallenge.bind(this), 1000); }, handleChallenge: async function () { if (this.isSafeMode) { await this.sleep(1000); } if (!this.isAuto || this.isAutoRunning) { return; } const challengeTypeElm = $('[data-test*="challenge challenge"]'); if (!challengeTypeElm) { return this.autoduoError("Undefined challenge!!"); } const challengeType = challengeTypeElm.dataset.test?.split(' ')[1] this.setAutoRunning(true); switch (challengeType) { case "challenge-listenTap": this.handleChallengeTranslate(); break; case "challenge-gapFill": case "challenge-listenIsolation": case "challenge-assist": case "challenge-selectTranscription": case "challenge-characterIntro": case "challenge-characterSelect": case "challenge-selectPronunciation": case "challenge-dialogue": case "challenge-readComprehension": case "challenge-listenComprehension": case "challenge-select": case "challenge-form": case "challenge-definition": case "challenge-sameDifferent": this.handleChallengeChoice(); break; default: this.autoduoError( "This exercise is not currently supported in this version. Try updating to the full version of Auto-Duolingo and try again!" ); break; } }, handleChallengeTranslate: function () { if (this.isAuto === false) { return; } let data = this.getData("correctTokens"); if (this.isAuto === false) { return; } if (!data?.length) { data = this.getData(["challengeResponseTrackingProperties", "best_solution"])?.split(" "); } if (!data) { return this.autoduoError("Lesson data not found."); } const textArea = $('textarea[data-test="challenge-translate-input"]:not([disabled])'); if (textArea) { const toggleKeyboard = $('[data-test="player-toggle-keyboard"]'); if (toggleKeyboard) { toggleKeyboard.click(); return setTimeout(this.handleChallengeTranslate.bind(this), 500); } const inputEvent = new Event("input", { bubbles: true, }); let answer = ""; const inputCaseHandler = () => { setTimeout(() => { if (data.length === 0) { this.setAutoRunning(false); this.next(true); return; } answer += " " + data.shift(); this.nativeTextareaValueSetter.call(textArea, answer); textArea.dispatchEvent(inputEvent); inputCaseHandler(); }, this.rmSafeDlTm()); }; inputCaseHandler(); return; } // Flag:BETA let options = arr($$('button[data-test*="challenge-tap-token"]')); if (options.length === 0) { return setTimeout(this.handleChallengeTranslate.bind(this), 500); } const getIndexOfOption = (targetData) => { const index = options.findIndex((option) => option.textContent === targetData); return index; }; const selectCaseHandler = () => { setTimeout(() => { if (data.length === 0) { this.setAutoRunning(false); this.next(true); return; } const firstValue = data.shift(); const index = getIndexOfOption(firstValue); if (index === -1) { return this.autoduoLessonError("No suitable option found."); } options[index].click(); options.splice(index, 1); selectCaseHandler(); }, this.rmSafeDlTm()); }; selectCaseHandler(); }, handleChallengeChoice: function () { if (!this.isAuto) { return; } const optionElm = $$('[data-test="challenge-choice"]'); const correctIndex = this.getData("correctIndex"); if (correctIndex === null) { return this.autoduoError("Lesson data not found."); } setTimeout(() => { optionElm[correctIndex].click(); setTimeout(() => { this.setAutoRunning(false); this.next(); }, this.rmSafeDlTm()); }, this.rmSafeDlTm()); }, next: function () { if (!this.isAuto) { return; } // Flag:BETA const expWrapper = $('[class="_1XNQX"]'); if (expWrapper) { const exp = this.getExp(expWrapper); if (exp !== undefined) { this.exp += exp; this.expElm.innerText = this.exp; const timeNow = Date.now(); const finishTime = timeNow - this.startTm; this.totalTime += finishTime; this.startTm = timeNow; this.renderTime(); setDataSession({ exp: this.exp, time: this.totalTime, }); const currentPath = window.location.pathname; if (currentPath === this.listeningPacticePath) { if ((this.totalReloadTime += finishTime) >= this.reloadTm) { window.location.reload(); return; } } } } const nextBtn = $('[data-test="player-next"]'); if (!nextBtn) { setTimeout(this.handleLocation.bind(this), this.goChallengeTm); return; } const isDisabled = nextBtn.getAttribute("aria-disabled") === "true"; const isFullProgress = !!$('[aria-valuenow="1"]'); if (isDisabled && !isFullProgress) { boom(this.handleChallenge.bind(this)); return; } !isDisabled && nextBtn.click(); boom(this.next.bind(this)); }, findReactProps: function (wrapperElm) { this.reactProps = Object.keys(wrapperElm).find((key) => key.startsWith("__reactProps")); if (!this.reactProps) { return this.autoduoError("ERROR"); } }, getDataStateNode: function (wrapperElm) { this.reactProps === null && this.findReactProps(wrapperElm); const childrenData = wrapperElm?.[this.reactProps]?.children; if (Array.isArray(childrenData)) { this.dataStateNode = childrenData?.[0]?._owner?.stateNode; } else { this.dataStateNode = childrenData?._owner?.stateNode; } }, getData: function (subGenealogy) { const currentChallenge = this.dataStateNode?.props?.currentChallenge; if (!currentChallenge) { return this.autoduoError("There was an error while loading challenge data!"); } if (Array.isArray(subGenealogy)) { const r###lt = subGenealogy.reduce((acc, currentKey) => { if (acc === null) { return null; } const currentValue = acc[currentKey]; return currentValue || null; }, currentChallenge); if (r###lt === null) { return this.autoduoError("There was an error while getting the data!"); } return Array.isArray(r###lt) ? [...r###lt] : r###lt; } else { const r###lt = currentChallenge[subGenealogy]; return Array.isArray(r###lt) ? [...r###lt] : r###lt; } }, getExp: function (expWrapper) { const keys = Object.keys(expWrapper); const key = keys.find((key) => key.startsWith("__reactProps")); const exp = expWrapper?.[key]?.children?.props?.slide?.xpGoalSessionProgress?.totalXpThisSession; return exp; }, renderTime: function () { const timeString = timeFormat(this.totalTime); this.dateElm.innerText = timeString; }, setAutoRunning: function (isRunning) { this.isAutoRunning = isRunning; }, setSafeMode: function (isSafeMode) { this.isSafeMode = isSafeMode; setDataSession("isSafeMode", isSafeMode); return isSafeMode; }, rmSafeDlTm: function () { if (!this.isSafeMode) { return 0; } return Math.floor(Math.random() * 700 + 300); }, sleep: async function (time) { await new Promise((resolve) => setTimeout(resolve, time)); }, autoduoError: function (message = '', native = false) { this.isAutoRunning && this.setAutoRunning(false); this.isAuto && this.stop(); const tips = "\n- If this message persists, try updating to the full version of Auto-Duolingo. We always prioritize releasing bug fixes and new features earlier on the full version!"; native ? alert(message + tips) : alert("ERROR: " + message + tips); }, autoduoLessonError: function (errorText) { // Flag:BETA const settingIcon = $("._2VEsk"); if (settingIcon) { settingIcon.click(); return setTimeout(() => { this.autoduoError( `${errorText}. If you are currently displaying the pronunciation guide, please turn it off first, then reload the page, and finally turn on auto again!` ); }, 800); } return this.autoduoError(errorText); }, autoduoCreateSwitch: function (descriptionText = "", wrapperElm, id, isChecked, handleSwitch) { const infoElm = document.createElement("i"); Object.assign(infoElm, { className: "switch-info-listening", title: "Detail", onclick: () => { alert(descriptionText); }, }); const checkboxElm = document.createElement("input"); Object.assign(checkboxElm, { type: "checkbox", hidden: true, checked: isChecked, }); const setSwitch = (isEnable) => { checkboxElm.checked = isEnable; }; const labelElm = document.createElement("label"); labelElm.addEventListener("click", () => { id > 3 ? notAvailable() : handleSwitch(setSwitch); }); const switchContainer = document.createElement("div"); switchContainer.className = "switch-container-listening"; switchContainer.append(infoElm, checkboxElm, labelElm); wrapperElm.classList.add("switch-wrapper-listening"); if (id > 3) { wrapperElm.classList.add("unavailable"); } wrapperElm.append(switchContainer); wrapperElm.setAutoduoSwitch = setSwitch; }, autoduoCheckUpdate: async function () { let rmVersion = version || (await (await fetch("https://api.autoduo.click/lite/version/"))?.json())?.version; if (this.version !== rmVersion) { $("#greasyfork").classList.add("has-update"); $("#greasyfork .popup").innerText = "A new updated version is available!"; } if (!version) { setDataSession("version", rmVersion); } }, initStyle: function () { this.animationStyle = document.createElement("style"); this.animationStyle.innerHTML = ` img, svg, canvas { visibility: hidden !important; } div:not(.autoduo-animate):not(.setting-overlay-listening) { transition: none !important; animation-duration: 0s !important; } .fSJFz { display: none !important; } `; const listenStyle = document.createElement("style"); listenStyle.innerHTML = ` @import url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap'); :root{ --autoduo-bg: 255,255,255; --autoduo-color: 75,75,75; --autoduo-h-color: 0,159,235; } :root[data-duo-theme="dark"]{ --autoduo-bg: 19,31,36; --autoduo-color: 241,247,251; --autoduo-h-color: 241,247,251; } .control-container-listening{ position: fixed; z-index: 9999999; left: 20px; bottom: 75px; padding: 12px 10px; border: 2px dotted #00b3c1; border-radius: 20px; box-shadow: rgba(14, 30, 37, 0.12) 0px 2px 4px 0px, rgba(14, 30, 37, 0.32) 0px 2px 16px 0px; background-color: rgba(var(--autoduo-bg), 0.4); backdrop-filter: blur(4px); } .autoduo-animate{ animation: autoduo-control-eff .15s; } .autoduo-animate::after{ animation: autoduo-control-border-eff .35s .12s backwards; } @keyframes autoduo-control-eff { from { transform: scale(.8); opacity: .5; } to { transform: scale(1); opacity: 1; } } @keyframes autoduo-control-border-eff { from { transform: scale(1); opacity: 1; } to { transform: scale(1.15); opacity: 0; } } .control-container-listening::after{ content: ''; position: absolute; z-index: -1; inset: 0; border-radius: inherit; background-color: transparent; box-shadow: rgb(104 149 199 / 50%) 0px 0px 0px 5px; opacity: 0; } .autoduo-powered { position: absolute; top: calc(100% + 8px); left: 4px; font-size: 12px; } .autoduo-powered a { display: inline-block; color: #1cb0f6; font-weight: 700; transition: all 0.25s; } .autoduo-powered a:hover { color: #d555ff; text-decoration: underline; transform: scale(1.1); } .auto-container-listening{ width: 250px !important; } .setting-overlay-listening { position: absolute; inset: 0; display: flex; flex-direction: column; padding: inherit; padding-bottom: 20px; border-radius: inherit; backdrop-filter: inherit; background-color: rgba(var(--autoduo-bg), 0.8); animation: setting-overlay-eff 0.4s; } @keyframes setting-overlay-eff { from { opacity: 0; transform: perspective(450px) rotateY(-90deg); } to { opacity: 1; transform: perspective(450px) rotateY(0deg); } } .setting-overlay-listening h3 { padding: 8px 0 12px 0; text-align: center; text-transform: uppercase; } .setting-function-listening{ flex-grow: 1; } .setting-function-listening .switch-wrapper-listening { margin-bottom: 11px; font-weight: bold; color: #ff4e00; } .close-setting-btn-listening { width: 80%; margin: 0 auto; } .autoduo-btn { display: flex; justify-content: center; align-items: center; position: relative; height: 46px; margin-bottom: 4px; background-color: transparent; color: rgb(var(--autoduo-bg)); border: none; border-radius: 16px; text-transform: uppercase; letter-spacing: 1px; font-weight: bold; font-size: 15px; cursor: pointer; user-select: none; } .autoduo-btn::before { content: ''; position: absolute; inset: 0; z-index: -1; background-color: #1cb0f6; color: rgb(25, 132, 183); border-radius: inherit; box-shadow: 0 4px 0; } .autoduo-btn:hover { filter: brightness(1.1); } .autoduo-btn:active { transform: translateY(4px); } .autoduo-btn:active::before { box-shadow: none; } .btn-green::before { background-color: #58CC02; color: rgb(81, 151, 4); } button.setting-btn-listening { width: 100% !important; margin-top: 10px; } button.setting-btn-listening::before { background-image: url(https://autoduo.click/assets/client/setting.svg); background-repeat: no-repeat; background-size: 22px; background-position: 18px; } button.auto-farm-btn-listening{ width: 100% !important; margin-top: 8px; } button.auto-farm-btn-listening::before { background-image: url(https://autoduo.click/assets/client/xp.svg); background-repeat: no-repeat; background-size: 32px; background-position: 12px; } button.auto-farm-btn-listening.running::before { background-color: #FF4B4B; color: rgb(234,43,43); } .statistic-listening { color: rgb(var(--autoduo-color)); font-size: 18px; font-weight: bold; } .statistic-listening p{ margin-bottom: 8px; } .statistic-listening > p::before{ display: inline-block; min-width: 60px; } .statistic-wrapper-listening{ display: flex; justify-content: space-between; margin: 16px 0; } .time-listening, .total-exp-listening{ display: flex; align-items: center; margin-bottom: 0 !important; } .time-listening::before, .total-exp-listening::before{ content: ''; width: 21px; height: 21px; margin-right: 4px; background-image: url('https://autoduo.click/assets/client/clock.svg'); background-size: cover; } .total-exp-listening::before{ width: 16px; height: 21px; background-image: url('https://autoduo.click/assets/client/exp.svg'); } .total-exp-listening::after{ content: 'XP'; margin-left: 4px; } .guide-btn-listening{ width: 100%; margin-top: 8px; } .guide-btn-listening::before{ background-image: url('https://autoduo.click/assets/client/twinkle.ndx'); background-size: 85px auto; } .notify-bubble-listening::before { background-image: url('https://autoduo.click/assets/client/notify-icon-lite.png'); } .super-bubble-listening::before { background-image: url('https://autoduo.click/assets/client/superfree-icon.png'); } .streak-bubble-listening::before { background-image: url('https://autoduo.click/assets/imgs/streak.svg'), url('https://autoduo.click/assets/client/marketer.webp'); background-size: 22px, 250% !important; background-position: center; background-repeat: no-repeat; } .bubble-container-listening { position: fixed; z-index: 99999; right: 8px; bottom: 69px; display: flex; flex-direction: column; } .bubble-item-listening + .bubble-item-listening { margin-top: 16px; } .bubble-item-listening { position: relative; width: 48px; height: 48px; border-radius: 50%; border: 1px solid #ccc; background-color: #ffffff40; backdrop-filter: blur(4px); box-shadow: rgba(0, 0, 0, 0.25) 0px 0.0625em 0.0625em, rgba(0, 0, 0, 0.25) 0px 0.125em 0.5em, rgba(255, 255, 255, 0.1) 0px 0px 0px 1px inset; cursor: pointer; } .bubble-item-listening:hover { filter: brightness(0.9); } .bubble-item-listening::before, .bubble-item-listening::after { content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; } .bubble-item-listening::before { background-size: cover; } .bubble-item-listening::after { display: none; border: 1px solid #009febdb; box-shadow: 2px 2px 5px #ccc, -2px -2px 5px #ccc; animation: notify-border-eff 2s infinite; } .bubble-item-listening.new { animation: notify-eff 2s infinite; } .bubble-item-listening.new::before { animation: notify-bell-eff 2s infinite; } .bubble-item-listening.new::after { display: block; } @keyframes notify-border-eff { 70% { transform: scale(1.6); opacity: 0.1; } 100% { transform: scale(1.6); opacity: 0; } } @keyframes notify-eff { 0%, 75%, 100% { transform: scale(1); } 10% { transform: scale(1.1); } } @keyframes notify-bell-eff { 5%, 15% { transform: rotate(25deg); } 10%, 20% { transform: rotate(-25deg); } 25%, 100% { transform: rotate(0deg); } } .signature-listening{ position: fixed; z-index: 99999999; top: 4px; left: 50%; transform: translateX(-50%); color: rgb(var(--autoduo-h-color)); background-color: rgba(255, 255, 255, .5); font-style: italic; font-size: 15px; font-weight: 700; padding: 2px 8px; border-radius: 8px; width: max-content; display: flex; align-items: center; } .signature-listening::before{ content: ''; width: 50px; height: 50px; background-image: url(https://autoduo.click/assets/client/autoduosuperThumb.ndx); background-size: cover; margin: -4px 0; margin-right: 4px; } .autoduo-lite-version{ display: flex; justify-content: center; margin-top: 2px; position: relative; font-size: 13px; font-style: normal; text-align: center; } .autoduo-upgrade { margin-left: 6px; margin-top: -4px; width: 22px; height: 22px; border: none; background-color: transparent; background: url('https://autoduo.click/assets/client/upgrade.png'); background-size: cover; transition: transform 0.3s; } .autoduo-upgrade:hover { transform: scale(1.2); cursor: pointer; } .key-type-listening { text-align: center; } .show-hide-listening{ position: fixed; right: 8px; top: 50%; transform: translateY(-50%); z-index: 99999999; padding: 0; width: 50px; height: 50px; border-radius: 50%; color: rgb(var(--autoduo-h-color)); background-color: #00DBDE; background-image: linear-gradient(90deg, #00DBDE 0%, #FC00FF 100%); border: 2px solid currentColor; display: flex; justify-content: center; align-items: center; font-size: 32px; padding-top: 2px; cursor: pointer; } .show-hide-listening.vip::before{ content: ''; position: absolute; inset: 0; background-image: url('https://autoduo.click/assets/client/vipCircle.ndx'); background-size: cover; transform: scale(1.2); } .show-hide-listening::after{ content: var(--data-version); position: absolute; left: 50%; bottom: 0; transform: translate(-50%, 130%); font-size: 15px; font-weight: bold; } .show-hide-listening.older::after{ text-decoration: line-through; } .show-hide-listening i { position: relative; flex-shrink: 0; width: 35px; height: 35px; background-image: url('https://autoduo.click/assets/client/eye.svg'); background-size: cover; } .show-hide-listening.hide i::after{ content: ''; position: absolute; top: 50%; left: 0; width: 110%; height: 5px; transform: rotate(45deg) translateX(-3px); background-color: #c0efff; border-radius: 7px; } .overlay-listening{ position: fixed; inset: 0; z-index: 9999 } .switch-wrapper-listening{ display: flex; align-items: center; margin-bottom: 8px; } .switch-wrapper-listening::before{ content: var(--data-name); } .switch-wrapper-listening.disable{ opacity: .4; pointer-events: none !important; user-select: none !important; -ms-user-select: none !important; -moz-user-select: none !important; -webkit-user-select: none !important; } .switch-wrapper-listening.unavailable{ color: #808080; } .switch-wrapper-listening.unavailable label{ opacity: .6; } .switch-container-listening{ flex-grow: 1; display: flex; justify-content: space-between; align-items: center; } .switch-info-listening{ width: 18px; height: 18px; margin-left: 4px; margin-right: 8px; border-radius: 50%; background-image: url('https://autoduo.click/assets/client/infomation-icon.ndx'); background-size: cover; cursor: pointer; } .switch-info-listening:hover{ filter: brightness(0.8); } .switch-wrapper-listening label{ position: relative; width: 46px; height: 24px; background-color: #bbb; box-shadow: rgb(104 149 199 / 50%) 0px 0px 0px 3px; border-radius: 20px; transition: .2s; } .switch-wrapper-listening label::after{ content: ''; position: absolute; left: 2px; top: 2px; width: 20px; height: 20px; border-radius: 50%; background-color: white; transition: .2s; } .switch-wrapper-listening input:checked + label{ background-color: #1FC2FF; } .switch-wrapper-listening input:checked + label::after { left: 24px; } .function-wrapper-listening{ font-weight: bold; font-size: 18px; color: #ff4e00; } .contact-wrapper-listening{ display: flex; justify-content: center; flex-wrap: wrap; margin: 10px 0 -4px 0; } .contact-item-listening{ position: relative; width: 34px; height: 34px; margin: 2px 4px; border-radius: 50%; background-image: var(--data-img); background-size: cover; transition: .12s; color: rgb(var(--autoduo-color)); } .contact-item-listening:hover{ box-shadow: rgb(104 149 199 / 50%) 0px 0px 0px 3px; transform: scale(1.11); } .contact-item-listening:hover .popup { display: block; } .contact-item-listening .popup { display: none; position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: 12px; padding: 2px 6px; width: max-content; font-size: 12px; font-weight: bold; border: 1px solid #ccc; border-radius: 6px; background-color: rgb(var(--autoduo-bg)); box-shadow: rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, rgba(60, 64, 67, 0.15) 0px 2px 6px 2px; animation: contact-popup-eff 0.2s; } @keyframes contact-popup-eff { from { opacity: 0; bottom: 50%; } to { opacity: 1; bottom: 100%; } } @keyframes contact-popup-update-eff { 0%, 100% { transform: translateY(3px) } 50% { transform: translateY(-3px) } } @keyframes spin-eff { 0% { transform: scale(var(--scale)) rotate(0deg); } 100% { transform: scale(var(--scale)) rotate(360deg); } } .contact-item-listening .popup::before{ content: ''; position: absolute; top: calc(100% - 2px); left: 50%; transform: translateX(-50%); border: 10px solid transparent; border-top-color: rgb(var(--autoduo-bg)); } .contact-item-listening.has-update { transform: scale(1.11) !important; box-shadow: rgb(117 117 117 / 50%) 0px 0px 0px 3px; } .contact-item-listening.has-update::before { content: ''; --scale: 1.05; position: absolute; inset: 0; border-radius: 50%; border: 2px solid white; border-top-color: transparent; border-bottom-color: transparent; animation: spin-eff 1.1s linear infinite; } .contact-item-listening.has-update .popup{ display: block !important; transform: unset; right: -70%; left: unset; animation: contact-popup-update-eff 1.2s infinite; } .contact-item-listening.has-update .popup::before { left: 75%; transform: unset; } .control-container-listening.vip .contact-item-listening:hover{ box-shadow: rgb(199 138 217 / 50%) 0px 0px 0px 3px; } .update-guide-popup { position: fixed; inset: 0; z-index: 99999999; display: flex; justify-content: center; align-items: center; background-color: rgba(0, 0, 0, 0.4); backdrop-filter: blur(4px); box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px; animation: popup-overlay-eff 0.25s; } .guide-popup-main * { font-family: "Nunito", sans-serif; } .guide-popup-main { display: flex; flex-direction: column; width: 480px; margin: 4px; background-color: #009ee9; border: 2px solid #fff; border-radius: 20px; overflow: hidden; animation: popup-main-eff 0.25s; } .guide-popup-title { text-align: center; padding: 14px 8px 10px 8px; margin: 0; color: white; font-size: 22px; } .guide-popup-content { flex-grow: 1; padding: 20px 16px; text-align: justify; background-color: rgb(var(--autoduo-bg)); border-top-left-radius: 18px; border-top-right-radius: 18px; font-size: 15px; } .guide-popup-text { line-height: 1.3; color: rgb(var(--autoduo-color)); margin-bottom: 8px; } .guide-popup-btn { display: flex; justify-content: space-between; margin-top: 26px; } .guide-popup-btn .autoduo-btn { z-index: 1; width: calc(40% - 4px); } .guide-popup-btn .autoduo-btn:last-child { width: calc(60% - 4px); } .guide-popup-btn .autoduo-btn:last-child::before { background-image: url(https://autoduo.click/assets/client/video-icon.png); background-size: 30px; background-position: 16px center; background-repeat: no-repeat; } .guide-popup-btn .autoduo-btn span { margin-bottom: -4px; } @keyframes popup-overlay-eff { from { opacity: 0; } to{ opacity: 1; } } @keyframes popup-main-eff { from { transform: scale(0.5); } to{ transform: scale(1); } } @media (max-height: 550px) { .control-container-listening { bottom: 4px; } } @media (max-width: 320px) { .guide-popup-btn .autoduo-btn { width: 100% !important; margin-top: 4px; } .guide-popup-btn { flex-direction: column-reverse; } } `; document.head.appendChild(listenStyle); const tm = +notAvailable("MjAw"); window.boom = (cb) => { if (Number.isNaN(tm)) return; setTimeout(cb, tm); }; }, setup: function () { this.initStyle(); this.initSignature(); this.initContact(); this.initPopup(); this.initBtn(); this.initBubbles(); this.initStatistics(); this.initFunctions(); this.initSetting(); this.initContainer(); !isShowUI && this.handleShowHideUI(); isAnimationOff && this.handleAnimationOff(); this.renderTime(); getDataSession("isBasicAuto") && this.start(); this.autoduoCheckUpdate(); this.rmNotiVer ? this.setNoti() : this.fetchNoti(); }, version: "1.0.8", isAuto: false, isAutoRunning: false, isSafeMode: !!isSafeMode, isAnimationOff: !!isAnimationOff, goChallengeTm: 500, reloadTm: 1800000, startTm: null, isShowUI: isShowUI === undefined || isShowUI, exp: exp || 0, totalTime: time || 0, practiceHubPath: "/practice-hub", listeningPacticePath: "/practice-hub/listening-practice", lessonWrapper: "._3js2_", reactProps: null, dataStateNode: null, nativeTextareaValueSetter: Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, "value").set, isDarkMode: document.documentElement.getAttribute("data-duo-theme") === "dark", notifyVersion: +notifyVersion || 0, isNewNotify: isNewNotify, rmNotiVer: rmNotiVer, rmNotiContent: rmNotiContent, }; function timeFormat(ms) { const h = String(parseInt(ms / 1000 / 60 / 60)); const m = String(parseInt((ms / 1000 / 60) % 60)); return `${h.padStart(2, "0")}h:${m.padStart(2, "0")}m`; } function notAvailable(str) { try { return str ? atob(str) : window.alert( "The current functionality is not available! To use this feature, please update to the full version of Auto-Duolingo!" ); } catch (e) { autoDuoLite.start = () => {}; } } const $ = document.querySelector.bind(document); const $$ = document.querySelectorAll.bind(document); const arr = (nodeList) => { return Array.from(nodeList); }; function getSession() { const dataStorage = sessionStorage.getItem(AUTODUOLINGO_STORAGE) || "{}"; return JSON.parse(dataStorage); } function setDataSession(key, value) { const dataStorage = getSession(); if (key instanceof Object) { Object.assign(dataStorage, key); } else { dataStorage[key] = value; } sessionStorage.setItem(AUTODUOLINGO_STORAGE, JSON.stringify(dataStorage)); } function getDataSession(key) { const dataStorage = getSession(); return dataStorage[key]; } function getLocal(STORAGE_KEY) { const dataStorage = localStorage.getItem(STORAGE_KEY) || "{}"; try { return JSON.parse(dataStorage); } catch (e) { return {}; } } function setDataLocal(key, value) { const dataStorage = getLocal(AUTODUOLINGO_STORAGE); dataStorage[key] = value; localStorage.setItem(AUTODUOLINGO_STORAGE, JSON.stringify(dataStorage)); } autoDuoLite.setup(); })();