Auto Duo
Auto Duo
// @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/*
// @grant none
// @license MIT
// @icon https://autoduo.click/assets/imgs/favicon.ico
// @downloadURL https://update.greasyfork.org/scripts/487867/Auto-Duolingo.user.js
// @updateURL https://update.greasyfork.org/scripts/487867/Auto-Duolingo.meta.js
// ==/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-full-version">
FULL VERSION
</div>
</div>
`,
});
const upgrade = this.signatureElm.querySelector('.autoduo-
upgrade')
upgrade.addEventListener('click', () => this.updateBtn.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");
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);
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);
},
if (isSave) {
setDataSession("isShowUI", this.isShowUI);
this.controlContainer.classList.contains("autoduo-animate")
||
this.controlContainer.classList.add("autoduo-
animate");
}
},
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;
}
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);
},
if (!challengeTypeElm) {
return this.autoduoError("Undefined challenge!!");
}
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;
}
if (!data?.length) {
data = this.getData(["challengeResponseTrackingProperties",
"best_solution"])?.split(" ");
}
if (!data) {
return this.autoduoError("Lesson data not found.");
}
// Flag:BETA
let options = arr($$('button[data-test*="challenge-tap-
token"]'));
if (options.length === 0) {
return setTimeout(this.handleChallengeTranslate.bind(this),
500);
}
options[index].click();
options.splice(index, 1);
selectCaseHandler();
}, this.rmSafeDlTm());
};
selectCaseHandler();
},
handleChallengeChoice: function () {
if (!this.isAuto) {
return;
}
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);
setDataSession({
exp: this.exp,
time: this.totalTime,
});
if (!this.reactProps) {
return this.autoduoError("ERROR");
}
},
if (Array.isArray(childrenData)) {
this.dataStateNode = childrenData?.[0]?._owner?.stateNode;
} else {
this.dataStateNode = childrenData?._owner?.stateNode;
}
},
if (Array.isArray(subGenealogy)) {
const result = subGenealogy.reduce((acc, currentKey) => {
if (acc === null) {
return null;
}
renderTime: function () {
const timeString = timeFormat(this.totalTime);
this.dateElm.innerText = timeString;
},
rmSafeDlTm: function () {
if (!this.isSafeMode) {
return 0;
}
return Math.floor(Math.random() * 700 + 300);
},
wrapperElm.classList.add("switch-wrapper-listening");
if (id > 3) {
wrapperElm.classList.add("unavailable");
}
wrapperElm.append(switchContainer);
wrapperElm.setAutoduoSwitch = setSwitch;
},
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;
}
`;
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();
setDataSession("isBasicAuto", false);
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) : null;
} catch (e) {
autoDuoLite.start = () => {};
}
}
const $ = document.querySelector.bind(document);
const $$ = document.querySelectorAll.bind(document);
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();
})();