// ==UserScript== // @name Duolingo Course Progress // @namespace https://github.com/kane77/userscripts // @include https://www.duolingo.com/* // @description Progress report for Duolingo course // @author Martin Harvan // @version 1.6.1 // @grant GM_getValue // @downloadURL https://update.greasyfork.icu/scripts/6948/Duolingo%20Course%20Progress.user.js // @updateURL https://update.greasyfork.icu/scripts/6948/Duolingo%20Course%20Progress.meta.js // ==/UserScript== function inject(f) { //Inject the script into the document var script; script = document.createElement('script'); script.type = 'text/javascript'; script.setAttribute('name', 'lesson_stats'); script.textContent = '(' + f.toString() + ')(jQuery)'; document.head.appendChild(script); } inject(f); function f($) { function duolingoStats() { try { var langData = window.duo.user.attributes.language_data[window.duo.user.attributes.learning_language]; var totalSkills = langData.skills.models.length; var doneSkills = 0; var totalActivities = 0; var doneActivities = 0; for (var i = 0; i < langData.skills.models.length; i++) { var skill = langData.skills.models[i]; totalActivities += skill.attributes.num_lessons; doneActivities += skill.attributes.num_lessons - skill.attributes.missing_lessons; if (skill.attributes.missing_lessons === 0) { doneSkills += 1; } } if (langData.bonus_skills) { totalSkills += langData.bonus_skills.length; for (var i = 0; i < langData.bonus_skills.models.length; i++) { var skill = langData.bonus_skills.models[i]; totalActivities += skill.attributes.num_lessons; doneActivities += skill.attributes.num_lessons - skill.attributes.missing_lessons; if (skill.attributes.missing_lessons === 0) { doneSkills += 1; } } } var lessonPercent = Math.round(doneActivities / totalActivities * 100); var skillPercent = Math.round(doneSkills / totalSkills * 100); var skillElem = createElem(doneSkills, totalSkills, skillPercent, "Skills", "S"); var lessonElem = createElem(doneActivities, totalActivities, lessonPercent, "Lessons", "L"); var stats = $('
'); skillElem.appendTo(stats); lessonElem.appendTo(stats); if ($('#app').hasClass('home') && !$('.lesson-progress').length) { $('.strengthen-skills-container').before(stats); } } catch (ex) { console.log(ex); } } function createElem(doneCount, totalCount, percent, name, icon) { var elemText = $('' + doneCount + '/' + totalCount + ' '+name+''); var percentage = $('' + percent + '%'); percentage.hide(); var elem = $('