🏠 Home 

Nexus Download Wabbajack Modlist

Download all mods from NexusMods for a Wabbajack Modlist with a single click


Install this script?
// ==UserScript==
// @name         Nexus Download Wabbajack Modlist
// @namespace    NDWM
// @version      0.2
// @description  Download all mods from NexusMods for a Wabbajack Modlist with a single click
// @author       Drigtime
// @match        https://www.nexusmods.com/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=nexusmods.com
// @compatible   chrome
// @compatible   edge
// @compatible   firefox
// @compatible   safari
// @compatible   brave
// @grant        GM.xmlHttpRequest
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM.setValue
// @grant        GM.getValue
// @grant        GM_addStyle
// @connect      next.nexusmods.com
// @connect      nexusmods.com
// @require      https://cdn.jsdelivr.net/npm/@zip.js/[email protected]/dist/zip.min.js
// ==/UserScript==
(async function () {
// MDI : https://pictogrammers.com/library/mdi/
// MDI : https://github.com/MathewSachin/Captura/blob/master/src/Captura.Core/MaterialDesignIcons.cs
GM_addStyle(`
.bg-primary-subdued {
background-color: rgb(200 123 40);
}
.text-white {
color: #fff;
}
.spinner-border {
display: inline-block;
width: 1.5rem;
height: 1.5rem;
vertical-align: text-bottom;
border: 0.25em solid currentColor;
border-right-color: transparent;
border-radius: 50%;
animation: spinner-border 0.75s linear infinite;
}
@keyframes spinner-border {
to {
transform: rotate(360deg);
}
}
.ndc-badge-primary {
padding: 0.25rem 0.5rem;
border-radius: 1rem;
font-size: 0.75rem;
color: #fff;
background-color: rgb(217, 143, 64);
white-space: nowrap;
}
.btn-outline-secondary {
align-items: center;
appearance: button;
background-color: rgb(41, 41, 46);
border: 1px solid rgb(212, 212, 216);
box-sizing: border-box;
color: rgb(212, 212, 216);
cursor: pointer;
display: flex;
font: 600 14px/14px "Montserrat", ui-sans-serif, system-ui, sans-serif;
height: 36px;
justify-content: center;
min-height: 36px;
padding: 4px 8px;
position: relative;
text-align: center;
text-transform: uppercase;
transition: color 0.15s, background-color 0.15s, border-color 0.15s;
border-radius: 0.25rem;
}
.import-btn {
border-radius: 0.25rem 0px 0px 0.25rem;
}
.import-btn-info {
border-radius: 0px 0.25rem 0.25rem 0px;
}
.btn-outline-secondary:hover {
background-color: rgb(51, 51, 56);
border-color: rgb(212, 212, 216);
}
.btn-outline-secondary:disabled {
background-color: rgb(51, 51, 56, 0.5);
border-color: rgb(212, 212, 216);
color: rgb(212, 212, 216);
cursor: not-allowed;
}
.btn-primary {
font-family: Montserrat, sans-serif;
font-weight: 600;
font-size: 0.875rem;
line-height: 1;
letter-spacing: 0.05em;
text-transform: uppercase;
transition: background-color 0.3s;
position: relative;
min-height: 2.25rem;
outline: none;
padding: 0.25rem;
cursor: pointer;
background-color: rgb(217, 143, 64);
color: rgb(255, 255, 255);
border: none;
border-radius: 5px;
}
.btn-primary:disabled {
background-color: rgb(217, 143, 64, 0.5);
color: rgb(255, 255, 255, 0.5);
cursor: not-allowed;
}
.download-btn-all {
width: 100%;
display: flex;
gap: 0.5rem;
justify-content: space-between;
align-items: center;
border-radius: 0.25rem 0 0 0.25rem;
}
.download-btn-menu {
border-radius: 0 0.25rem 0.25rem 0;
}
.ndc-dropdown {
background-color: rgb(29, 29, 33);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 6px;
box-shadow: 0px 9px 12px 1px rgba(0, 0, 0, 0.14),
0px 3px 16px 2px rgba(0, 0, 0, 0.12), 0px 5px 6px 0px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
color: rgb(244, 244, 245);
display: none;
font: 400 16px/24px "Montserrat", ui-sans-serif, system-ui, sans-serif;
min-width: 12rem;
outline: 2px solid rgba(0, 0, 0, 0);
padding: 0.25rem 0;
position: absolute;
right: 0;
top: 0;
z-index: 10;
transform: translate3d(0px, 38px, 0px);
}
.ndc-dropdown-item {
align-items: center;
appearance: button;
background-color: transparent;
border: 0;
box-sizing: border-box;
color: rgb(244, 244, 245);
cursor: pointer;
display: flex;
font: 600 14px/14px "Montserrat", ui-sans-serif, system-ui, sans-serif;
height: 44px;
justify-content: space-between;
padding: 8px;
position: relative;
text-align: left;
text-transform: uppercase;
white-space: nowrap;
width: 100%;
}
.ndc-dropdown-item:hover {
background-color: rgba(217, 143, 64);
}
.progress-bar {
background-color: rgb(41, 41, 46);
border-radius: 0.25rem;
border: 0 solid rgb(244, 244, 245);
box-sizing: border-box;
color: rgb(244, 244, 245);
display: block;
flex: 1 1 0%;
font: 400 14px/24px "Montserrat", ui-sans-serif, system-ui, sans-serif;
height: 36px;
min-height: 36px;
overflow: hidden;
position: relative;
width: 100%;
}
.progress-bar-fill {
background-color: rgb(217, 143, 64);
border: 0 solid rgb(244, 244, 245);
box-sizing: border-box;
color: rgb(244, 244, 245);
display: block;
font: 400 14px/24px "Montserrat", ui-sans-serif, system-ui, sans-serif;
height: 36px;
position: absolute;
top: 0;
left: 0;
transition: width 0.3s ease;
width: 0;
}
.progress-bar-text-container {
align-items: center;
border: 0 solid rgb(255, 255, 255);
box-sizing: border-box;
color: rgb(255, 255, 255);
cursor: pointer;
display: grid;
font: 600 14px/14px "Montserrat", ui-sans-serif, system-ui, sans-serif;
grid-template-columns: repeat(3, minmax(0, 1fr));
height: 36px;
position: absolute;
top: 0;
left: 0;
text-transform: uppercase;
width: 100%;
}
.progress-bar-text-base {
border: 0 solid rgb(255, 255, 255);
box-sizing: border-box;
color: rgb(255, 255, 255);
cursor: pointer;
display: block;
font: 600 14px/14px "Montserrat", ui-sans-serif, system-ui, sans-serif;
height: 14px;
text-transform: uppercase;
}
.progress-bar-text-progress {
margin-left: 8px;
}
.progress-bar-text-center {
text-align: center;
}
.progress-bar-text-right {
margin-right: 8px;
text-align: right;
}
.pause-btn {
border-radius: 0;
}
.stop-btn {
border-radius: 0 0.25rem 0.25rem 0;
}
.ndc-modal-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
display: flex;
justify-content: center;
align-items: center;
background-color: rgba(0, 0, 0, 0.25);
backdrop-filter: brightness(50%);
}
.ndc-modal {
background-color: rgb(29, 29, 33);
padding: 1rem;
border-radius: 0.5rem;
display: flex;
flex-direction: column;
max-width: 850px;
width: 100%;
height: calc(100vh - 3.5rem);
}
.ndc-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
gap: 0.5rem;
}
.ndc-modal-header-title {
font-family: Montserrat, sans-serif;
font-weight: 600;
font-size: 1.125rem;
text-transform: uppercase;
}
.ndc-modal-header-dropdown-btn {
padding: 0.25rem;
border-radius: 0.25rem;
}
.ndc-modal-filter {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
gap: 0.5rem;
}
.ndc-modal-filter input,
.ndc-modal-filter select {
padding: 0.25rem;
border: 1px solid rgb(212, 212, 216);
border-radius: 0.25rem;
flex: 0 1 auto;
color: rgb(0, 0, 0);
width: 100%;
height: 100%;
}
.ndc-modal-filter input {
box-sizing: border-box;
}
@media (min-width: 640px) {
.ndc-modal-filter input,
.ndc-modal-filter select {
width: auto;
}
}
.ndc-modal-mods-list {
display: block;
margin-bottom: 0.5rem;
height: 100%;
overflow-y: auto;
}
.ndc-modal-mods-list-header {
display: hidden;
gap: 0.5rem;
border: 1px solid hsla(0, 0%, 100%, 0.2);
padding: 0.5rem;
border-radius: 0.25rem;
cursor: pointer;
user-select: none;
}
@media (min-width: 640px) {
.ndc-modal-mods-list-header {
display: flex;
border-radius: 0;
}
}
.ndc-modal-mods-list-header span {
font-family: Montserrat, sans-serif;
font-weight: 600;
font-size: 0.875rem;
text-transform: uppercase;
color: rgb(161 161 170);
}
.ndc-modal-mods-list-body {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
@media (min-width: 640px) {
.ndc-modal-mods-list-body {
gap: 0;
}
}
.ndc-modal-mods-list-body-row {
border: 1px solid hsla(0, 0%, 100%, 0.2);
padding: 0.5rem;
border-radius: 0.25rem;
cursor: pointer;
user-select: none;
}
.ndc-modal-mods-list-body-row-desktop {
display: none;
}
@media (min-width: 640px) {
.ndc-modal-mods-list-body-row-desktop {
display: flex;
gap: 0.5rem;
}
}
.ndc-modal-mods-list-body-row-mobile {
display: block;
}
@media (min-width: 640px) {
.ndc-modal-mods-list-body-row-mobile {
display: none;
}
}
.ndc-modal-actions {
display: flex;
justify-content: end;
gap: 0.5rem;
}
`);
const convertSize = (sizeInByte) => {
// 3769655540 => 3.51 GB
const units = ["B", "KB", "MB", "GB", "TB"];
let i = 0;
let size = sizeInByte;
while (size >= 1024) {
size /= 1024;
i++;
}
return `${size.toFixed(2)} ${units[i]}`;
};
class NDC {
mods = [];
constructor() {
this.element = document.createElement("div");
Object.assign(this.element.style, {
borderRadius: ".5rem",
border: "2px solid rgb(217 143 64/1)",
padding: "1rem",
marginTop: "1rem",
backgroundColor: "rgb(29 29 33 / 1)",
backgroundImage: "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAKACAIAAABMkUL2AAABg2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kbtLA0EQh78kiq+Iz8LCIkgUiygaIWhjkaBRUIskglGb5MxDyOO4S5BgK9gKCqKNr0L/Am0Fa0FQFEFsbKwVbTScc0aIiJlldr797c6wOwvWUEpJ61UDkM7ktIDf65gLzztqnqinlTpa6I0oujodHA9R0d5vsZjxus+sVfncv9awFNMVsNQKjyqqlhOeEJ5ayakmbwm3K8nIkvCJsEuTCwrfmHq0xM8mJ0r8abIWCvjA2izsSPzi6C9WklpaWF6OM53KKz/3MV9ij2VmgxK7xDvRCeDHi4NJxvDhYZARmT304aZfVlTIH/jOnyEruYrMKgU0lkmQJIdL1LxUj0mMix6TkaJg9v9vX/X4kLtU3e6F6kfDeO2Gmk0obhjGx4FhFA/B9gDnmXJ+dh+G30TfKGvOPWhag9OLshbdhrN16LhXI1rkW7KJW+NxeDmGxjC0XUH9QqlnP/sc3UFoVb7qEnZ2oUfONy1+AVwqZ+GLoDsUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nOzdd2BV5f3H8eece849d2QvAgkzjLC3AxQVcCEVwdqKgohUcdRZt6XDUWmd1SrVn4h1UEWcoLIqYFmCogxlr4QA2ePudc7vj2tTGiCEkJsbOO/XP+We+5zzfG+CNJ88S0pLSxMAAAAAAJzu5HgXAAAAAABAcyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAAUyAAAwAAAABMgQAMAAAAADAFAjAAAAAAwBQIwAAAAAAA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/ZUx6qgOq8XROqmbISKl7r2+UE3zdAoAAIBTDgHY7FRZa5XYSZbVMk+BN1jVPJ2mJ+QM6vwzVVaLKrZ+v3eJIYyYdvezn/3sjTfe+O1vfztjxgwhxP/93/+NGzfu/vvvf/ONt3u3O69P+2F7Sn7YVPjlZ4s+/uabb26//fY2bdq888470YnK27dvnz9//ooVK7Zs2eLxeJKSkjp06JCfn3/uueeef/75GzZsuO2221RVHTp0aPv27ffv379ixYpjrS6uo3Xr1nffffegQYPy8/Ojg7SGYXz77bfPPvvswoULa5tJknTxxRffeOONQ4YMsVr/O8V3//79s2bNmjFjRrt27f75z39mZ2ePGjVq48aNh3fRt2/fL7/8sn///gUFBUKIvLy8tWvXTp8+/amnnmqKr+vRqRZtSNexSfYsT6Bm9Y65vqA7dn0dLs2Rm6hlBCLeYtfOGM0mAAAAwKmOAGx2mY6ONmtiMOwudu9unh6T7Blndh2nWbTS6r1rd3/WPFll3rx53bt379evn9vt/vWvf/3HP/7xkzmL//3u7u3F3363Z7E3UHP//ff36dNn0qRJPXv2fO+997KysrZv3/7kk09aLJbLL7986NChNpstHA5v2LBh0aJF8+bN279/v9VqHTFixKhRo9588816xnuPS1GUbt26OZ3OH3/80e3+b1xUVfXKK6+8/fbb8/PzhRBer3fHjh3R04zatWsXncIdnWtdXV391ltvZWRknH/++YefP9yhQ4dvv/22a9eu0fOQhRDffPPNli1bJk6c2OhqG0JTned2udJuS6nxla7a/lEoUt+666YiS5bsxHzFolT7DlX7i49/AwAAAMyHAGxqDjUl3dlWl6SSmm2hSOD4N5x8j1ryWV3HOtTESlfxml0fxWLXq6MaPHjwggUL/vjHP/795f+7btztf57xwPq1m392+Sh/yCOE6Nq16+9///sbbrjB6XQuW7YsJydnxowZzzzzzFNPPXXURbPBYHDmzJlPP/10VVWVECIzMzM6x7gJjR49+vHHH8/Ozl69evXixYv/9a9/bd++3TB+GipXFGXkyJHTpk3Lz88/cODAyJEjvV7v559//vHHHz/zzDO1D0lJSdm1a1eb1m0CwZ++uR999FFqaur555/ftNUeyamlDOl2lU2xl7uLvt75SURvjp3VEqxp6c72YREurt4e1pvj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1M6SJG0qWGrEJlqkOrMv7vOrz9e/Uu1t5ETu/Pz8cePGzZo1K7oXdPfcIRf1/9WXm58rLy9vdFXRANy4f4sDgYBhGMedAt0IiqLcfNGzc1Y9VVy158svvywvLx8/fnzjArAQYk/JRpua8LPBd3z89TPBcNP/MB0IebYUr+qVe17XNmcdrNzhD53AycwnxBus0h1tZUmzqwm+UEzCfC2/3//ggw/WmRu/c+fO2AVgSZJ27NgRnd5/uE8++eSGG26IRY9nnHHGb3/728OvlJSUPPfcc7Ho60RNnDhx6NChx3q3srLyr3/9a0v7IWby5MmDBg1q2meGQqGNGzeuXbv266+/XrNmTWlpbFfBHFVqamqdvydNorKycu1/fPvtt4FAoMm7iDWbzfbrX/+6nhU0drv9dArAZ5555rRp0+pcfPnll1tUAJYk6bbbbsvIyDhWg44dO56KAbhVq1Z33333qFGjoj+0HJeqqv379+/fv/8DDzxQUlKycOHC559/fu/evTEus6577rnnyO/FW2+9FesArGnaa6+9duQJlw888EBL+z8ONBprgE9vkk1NliThCVbGtJce2UOFkPaVbqryFseiA6tiu2zgLUt/eLu0pqDRD3nooYeCweAzzzyjyOqoATedk3/lP758cNOeTSdTWHTEpnEjwIZhBAKBkxzzOapwOPzpupfHn/PwoLxLw6HwJ598cuGFF7Zv377RD9xStGrPoe9G9JokYnNm797SjVXeMqts7dr6zFg8P8oQhjdUKQnJYU2LXS9RwWBwz549dS527Nixnt+4n6TWrVsfmX6FEF26xGobsyOfvH379hj1dUIURal/3XtqaupRjx87/aiqOnDgwFtuueWNN9748ccfIJiqJQAAIABJREFUX3311V69esW7qKaRmpp68cUXT5s2bd68eRs3brznnntSUlLiXdSJ6du3b/37RwwePLjZikFU+/bt60m/Qoh+/fo17tyHeNE07c4771y3bt2NN97YwPRbR1ZW1sSJE1etWvXII484HI4mr7AFuuOOO45Mvxs2bJg1a1Zc6kEsEIBPZ5ritFo0I2J4Qyd2EM4JyU7plOBMCxuRbQfXxKYH6YJeE7YWfV1YvqXRj+jUqdOoUaNee+21sNcyZfifI3pk5pcPVHlOdlr4yQRgIYTP52vdunXjNpGu377Szf+3+N7uOUN+fvZ9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g0f7Pzbt9LiH+uNGo9G77767sbGxsbHx6quvzufz27dv37x58+bNm999992ffPO33nrr888/v3Llyscff/zRRx/9/U8d/wfjev2F8eUir/q+P1jubB3cXbQnKM4BAOCQAOaYZSlbHb60OrhY5HmW+r35o83pP7u+Pe65/qw333zz+vXrN27cePvtt4ui+Omnn27dunXz5s2vv/56b+8ZnonNsuzatWsffPDB9evXHz58+OGHH3755Zd/3djPqswHF1b+Ma5W+z417Wx79vNBs3XcQwEAwL8ngDkRyrxeH10a12tZyru2eTz7eb/ZPO6hno8XX3zx+vXrGxsb165dW11dbZrm9u3bt27d+vbbb+/cufPjjz82TfP/f6qqqsuXL7/33nvvv//+1atXHz169Mknn3z22Wcn56HfLGXnRq+s1y/1eZHScmf+aHt6/wz85wIAgDNMAHOCjKq19fGlKh9kKZ8vdx8d/LRoT0rv/XlVVb3zzjs3btzY2Ni4evXq4Tfbtr179+4PP/xw586d+/fvX7p06fXXX3/ttdcuXbpUlmVK6d69e1988cWnn376TOvGf7VRtXZh/I+qqPu+ny72Nqdn6pMCAOCsEsCcLFmWrw1emoxeLFLZpX5/9svW7J993x33XM/Z5cuXr169euXKlTfeeOPJ18lk0jTN48ePHzx4cO/evW+++earr776/vvvj3vY3yjz+sL4f8b1et+ntm+2pj/vzR8f91AAAPC7CGBOoiofrI8vjarVLOWLvt2fPdid/3Lmb69dWVk5ODg4UbtbPa3M67XRxdXyfMqLPnV780db05/P/IcCAMBZIoA5ucb1+vrgYlkOs5R1fbc3f7g9e3hKTww+1apieG50caU+l/oipX7e7j/ev9u0f+FZxwAA8FcQwJxoWcpW6guT4Qt1McpS1rf93vKX7dmDtlsc92gh1MXo3OiVlXq971NK/WyxtzN/MF3sHPdcAADwRwhgToVspV5fG75cFcMsZW3XTReb27P7y+7f7J/MczEoV9aHr4zqtcP0PVhu704fzpYnaCMuAAB4VgKYUyQbV2tr9cW6HmUpa1M3bbZ2ZvcX7fy4BztThtVkfXhxWB2l7/5ia2f2oFm64RkAgFNPAHP6jKrVtcHFQbWSpSyl7GCxuT2937TT457r1BtVa+ujVwblylH6NpvbswcLf1gAAM4KAcxpNSwna8OXh9UkpSxL+aLd32u29pvHbWeXrGdTFcPJ4MKkvlDkVd/3fVruN1s7s18c7QsAwBkjgDnd6nK8Nnh5XK+llGUpS6mbLvf2548PFjtn7/Tg56vIypXB+Ul1vq6Olny7drG/3NqZPfRwNQAAZ5IA5iwo8mpcnVup1utf74tu02LW7OzNH9u36V9kWTaqzq3W5+t6Ne+LlPo+9dPl7sF8c7rY7vzXAACAs0sAc6ZUxXBcnx/X56u8OirhfrY339pvHtsra1CuTAYvTOr1LCuOjjVaTqeLzf1m07FSAABEIIA5g7KUDarJSrU+rNaLPD8s4abd3282p4vdUI+2Zimry/GoWhtXF+qyPuzetp/vNdsH8007hwEAEIoA5izLs2JUra1UF4b1yq8PCWdd28y6/dlid7rYW3Znc1m4LsejanVYTqp8Uhb5YfcuUzdrtg+azeliN6X+uGcEAIC/mwAmhDKvx/X6oJiM6lFK5WEJp5QW/axZHMyWu9PFXnvKd36qitGomgzL1VE1eXKTc0qpa9tptztrdg8WW13fHveYAABwbAQwsWRZPihWhtVkWE3qYpxSehLDTTtftHvTxe5suXtazlKq8sGwWh1Wq6N8nB/d4ZxS6pddt2j3Zsu92WKvaafWewEAIAlgIsuzYlCuDIrJqJ5UxSg9FcNdO1/0i2U3X7SzxeHXtjnejMyyvMoHVTGsikGVD6u8Lsth/tRKb5+W8+XBbLk/W+w1y4Ne9AIAwG8JYEgppSIrB+XKoJqMqpUyHx5m8JMezrLUpr5r54v26SSe/XV3FBd5VRXDqhjWxbDKB1VRF/kgpfRkjTeldJi4zXL/MHrn7b6jjwEA4D8QwPCviqwsi0GZD6piUBaDuhiWeZlSkaXs15ccXfSpabu+79s+9W2/TH3f9W3Xd33qji769vCi69ssZXmWZ1mRZ3meFf930ed5nuVZmbKsyMosy1Jf/bpz1a+/J6U+Hb7jkwKfL9v5sps5uRcAAH4nAQz/XZaysqjLfFDlg7IYlvmgLgd5Vj79gt+8/Jk9HbtH1+2yadK8PVp2ni+7+fKUb9MFAADHq/zvL4Hw+tQfVujTx+bmWVEWgzwdLepmh8u5Kc/zw4ssz4osFXlKqSiLrEip7frU9V3fL7uu79NTa8Xd4cXhinHX9ctl17ifGQAAni8BDH9Q17fN8uC4pwAAAH6v/LgHAAAAgL+DAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQggAGAAAgBAEMAABACAIYAACAEAQwAAAAIQhgAAAAQhDAAAAAhCCAAQAACEEAAwAAEIIABgAAIAQBDAAAQAgCGAAAgBAEMAAAACEIYAAAAEIQwAAAAIQggAEAAAhBAAMAABCCAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQggAGAAAgBAEMAABACAIYAACAEAQwAAAAIQhgAAAAQhDAAAAAhCCAAQAACEEAAwAAEIIABgAAIAQBDAAAQAgCGAAAgBAEMAAAACEIYAAAAEIQwAAAAIQggAEAAAhBAAMAABCCAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQggAGAAAgBAEMAABACAIYAACAEAQwAAAAIQhgAAAAQhDAAAAAhCCAAQAACEEAAwAAEIIABgAAIAQBDAAAQAgCGAAAgBAEMAAAACEIYAAAAEIQwAAAAIQggAEAAAhBAAMAABCCAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQggAGAAAgBAEMAABACAIYAACAEAQwAAAAIQhgAAAAQhDAAAAAhCCAAQAACEEAAwAAEIIABgAAIAQBDAAAQAgCGAAAgBAEMAAAACEIYAAAAEIQwAAAAIQggAEAAAhBAAMAABCCAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQggAGAAAgBAEMAABACAIYAACAEAQwAAAAIQhgAAAAQhDAAAAAhCCAAQAACEEAAwAAEIIABgAAIAQBDAAAQAgCGAAAgBAEMAAAACEIYAAAAEIQwAAAAIQggAEAAAhBAAMAABCCAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQggAGAAAgBAEMAABACAIYAACAEAQwAAAAIQhgAAAAQhDAAAAAhCCAAQAACEEAAwAAEIIABgAAIAQBDAAAQAgCGAAAgBAEMAAAACEIYAAAAEIQwAAAAIQggAEAAAhBAAMAABCCAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQggAGAAAgBAEMAABACAIYAACAEAQwAAAAIQhgAAAAQhDAAAAAhCCAAQAACEEAAwAAEIIABgAAIAQBDAAAQAgCGAAAgBAEMAAAACEIYAAAAEIQwAAAAIQggAEAAAhBAAMAABCCAAYAACAEAQwAAEAIAhgAAIAQBDAAAAAhCGAAAABCEMAAAACEIIABAAAIQQADAAAQwv8C0iurPdXJqqUAAAAASUVORK5CYII=",
backgroundSize: "100%",
backgroundPosition: "center",
backgroundRepeat: "no-repeat",
width: "100%",
});
this.downloadButton = new NDCDownloadButton(this);
this.progressBar = new NDCProgressBar(this);
this.console = new NDCLogConsole(this);
}
async init() {
this.downloadButton.render();
this.element.innerHTML = "";
this.element.appendChild(this.downloadButton.element);
this.element.appendChild(this.progressBar.element);
this.element.appendChild(this.console.element);
}
async fetchGameId(gameDomain) {
const response = await fetch("https://api-router.nexusmods.com/graphql", {
headers: {
"content-type": "application/json",
},
referrer: document.location.href,
referrerPolicy: "strict-origin-when-cross-origin",
body: JSON.stringify({
query:
"query GameDomainToId($gameDomain: String!) { game(domainName: $gameDomain) { id } }",
variables: { gameDomain },
operationName: "GameDomainToId",
}),
method: "POST",
mode: "cors",
credentials: "include",
});
const responseJson = await response.json().catch((e) => {
return null;
});
return responseJson?.data?.game?.id || null;
}
async handleFileUpload(file) {
try {
// Validate input
if (!file) {
this.console.log("No file provided", NDCLogConsole.TYPE_ERROR);
return;
}
// Initialize ZipReader with error handling
let entries;
try {
const zipReader = new zip.ZipReader(new zip.BlobReader(file));
entries = await zipReader.getEntries({});
} catch (zipError) {
this.console.log("Failed to read zip file: " + zipError.message, NDCLogConsole.TYPE_ERROR);
return;
}
// Check if entries exist
if (!entries || entries.length === 0) {
this.console.log("No entries found in zip file", NDCLogConsole.TYPE_ERROR);
return;
}
// Find modlist entry
const modListEntry = entries.find(entry => entry?.filename === "modlist");
if (!modListEntry) {
this.console.log("modlist file not found", NDCLogConsole.TYPE_ERROR);
return;
}
// Extract and parse modlist data
let modList;
try {
modList = await modListEntry.getData(new zip.TextWriter());
} catch (extractError) {
this.console.log("Failed to extract modlist: " + extractError.message, NDCLogConsole.TYPE_ERROR);
return;
}
let mods;
try {
mods = JSON.parse(modList);
if (!mods?.Archives || !Array.isArray(mods.Archives)) {
throw new Error("Invalid modlist structure");
}
} catch (parseError) {
this.console.log("Invalid modlist format: " + parseError.message, NDCLogConsole.TYPE_ERROR);
return;
}
// Process nexus mods
const nexusMods = mods.Archives.filter(mod =>
mod?.State && mod.State['$type'] === "NexusDownloader, Wabbajack.Lib"
);
const games = {};
const processedMods = [];
for (const mod of nexusMods) {
try {
// Validate mod structure
if (!mod?.State || !mod.State.GameName || !mod.State.ModID || !mod.State.FileID) {
this.console.log(`Skipping invalid mod: ${mod?.Name || 'unknown'}`, NDCLogConsole.TYPE_WARNING);
continue;
}
const gameName = mod.State.GameName;
let gameId = games[gameName];
// Fetch game ID if not cached
if (!gameId) {
const gameDomain = gameName.toLowerCase();
gameId = await this.fetchGameId(gameDomain);
if (!gameId) {
this.console.log(`Failed to get game id for ${gameName}`, NDCLogConsole.TYPE_ERROR);
continue;
}
games[gameName] = gameId;
}
// Construct mod object with fallback values
processedMods.push({
fileName: mod.Name || "Unknown File",
modName: mod.State.Name || "Unknown Mod",
size: mod.Size || 0,
url: `https://www.nexusmods.com/${mod.State.GameName.toLowerCase()}/mods/${mod.State.ModID}?tab=files&file_id=${mod.State.FileID}`,
gameId,
modId: mod.State.ModID,
fileId: mod.State.FileID,
});
} catch (modError) {
this.console.log(`Error processing mod ${mod?.Name || 'unknown'}: ${modError.message}`, NDCLogConsole.TYPE_ERROR);
continue;
}
}
// Update mods array and render
this.mods = processedMods;
this.downloadButton.render();
this.console.log(`Wabbajack Modlist loaded successfully. Processed ${processedMods.length} mods.`, NDCLogConsole.TYPE_INFO);
} catch (error) {
this.console.log("Unexpected error in handleFileUpload: " + error.message, NDCLogConsole.TYPE_ERROR);
}
}
async fetchDownloadLink(mod) {
this.bypassNexusAdsCookie();
const response = await fetch(mod.url);
const text = await response.text();
if (text.match(/class="replaced-login-link"/)) {
this.console.log(
'You are not connected on NexusMods. <a href="https://users.nexusmods.com/auth/continue?client_id=nexus&redirect_uri=https://www.nexusmods.com/oauth/callback&response_type=code&referrer=https%3A%2F%2Fwww.nexusmods.com%2F" target="_blank" style="color: rgb(217 143 64)">Login</a> and try again.',
NDCLogConsole.TYPE_ERROR,
);
return { downloadUrl: "", text, stop: true };
} else if (text.match(/Just a moment.../)) {
this.console.log(
`You are rate limited by Cloudflare. Click on the link to solve the captcha and try again. <a href="${mod.url}" target="_blank" style="color: rgb(217 143 64)">Solve captcha</a>`,
NDCLogConsole.TYPE_ERROR,
);
return { downloadUrl: "", text, stop: true };
} else if (
text.match(/Your access to Nexus Mods has been temporarily suspended/)
) {
this.console.log(
"Du to too many requests, Nexus mods temporarily suspended your account for 10 minutes, try again later.",
NDCLogConsole.TYPE_ERROR,
);
return { downloadUrl: "", text, stop: true };
}
if (!response.ok) return { downloadUrl: "", text };
const generateDownloadUrlResponse = await fetch(
"https://www.nexusmods.com/Core/Libs/Common/Managers/Downloads?GenerateDownloadUrl",
{
headers: {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
body: `fid=${mod.fileId}&game_id=${mod.gameId}`,
method: "POST"
},
);
const fileLink = await generateDownloadUrlResponse.json();
const downloadUrl = fileLink?.url || "";
return { downloadUrl, text };
}
bypassNexusAdsCookie() {
const now = Math.round(Date.now() / 1000);
const expirySeconds = 5 * 60; // 5 minutes in seconds
const expiryTimestamp = now + expirySeconds;
// Set expiry date for the cookie
const expiryDate = new Date(Date.now() + expirySeconds * 1000).toUTCString();
// Create and set the cookie
document.cookie = `ab=0|${expiryTimestamp};expires=${expiryDate};domain=nexusmods.com;path=/`;
}
async downloadMods(mods) {
this.startDownload(mods.length);
try {
const lauchedDownload = await GM.getValue("lauchedDownload", {
count: 0,
date: new Date().getTime(),
});
const failedDownload = [];
let forceStop = false;
for (const [index, mod] of mods.entries()) {
const modNumber = `${(index + 1)
.toString()
.padStart(mods.length.toString().length, "0")}/${mods.length}`;
if (lauchedDownload.date < new Date().getTime() - 1000 * 60 * 5) {
// 5 minutes
lauchedDownload.count = 0;
await GM.setValue("lauchedDownload", lauchedDownload);
}
if (this.progressBar.skipTo) {
if (this.progressBar.skipToIndex - 1 > index) {
this.console.log(
`[${modNumber}] Skipping <a href="${mod.url}" target="_blank" style="color: rgb(217 143 64)">${mod.modName}</a>`,
);
this.progressBar.incrementProgress();
if (this.progressBar.skipToIndex - 1 === index + 1) {
// if skip to index is the next index
this.progressBar.skipTo = false;
}
continue;
}
this.progressBar.skipTo = false;
}
if (this.progressBar.status === NDCProgressBar.STATUS_STOPPED) {
this.console.log("Download stopped.", NDCLogConsole.TYPE_INFO);
break;
}
const { downloadUrl, text, stop = false } = await this.fetchDownloadLink(mod);
if (downloadUrl === "") {
const logRow = this.console.log(
`
[${modNumber}] Failed to get download link for
<a href="${mod.url}" target="_blank" style="color: rgb(217 143 64)">${mod.modName}</a>
<button style="color: rgb(217 143 64)" title="Copy response to clipboard">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1rem; height: 1rem;">
<path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" style="fill: currentcolor;"></path>
</svg>
</button>
`,
NDCLogConsole.TYPE_ERROR,
);
logRow.querySelector("button").addEventListener("click", () => {
navigator.clipboard.writeText(text);
alert("Response copied to clipboard");
});
// check if find .replaced-login-link in the html it is because the user is not connect on nexusmods
if (stop) {
forceStop = true;
} else {
failedDownload.push(mod);
}
} else {
this.console.log(
`[${modNumber}] Downloading <a href="${mod.url
}" target="_blank" style="color: rgb(217 143 64)" title="Nexus mod page">${mod.modName
}</a><a href="${downloadUrl}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="presentation" style="width: 1.3rem; height: 1.3rem;"><title>Download link</title><path d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z" style="fill: currentcolor;" /></svg></a><span style="font-size: .75rem; color: rgb(161 161 170)">(${convertSize(
mod.size,
)})</span>`,
);
const downloadLink = document.createElement("a");
downloadLink.href = downloadUrl;
downloadLink.download = mod.fileName;
downloadLink.click();
this.progressBar.incrementProgress();
lauchedDownload.count++;
lauchedDownload.date = new Date().getTime();
await GM.setValue("lauchedDownload", lauchedDownload);
}
if (forceStop) {
this.console.log(
"Download forced to stop due to an error.",
NDCLogConsole.TYPE_ERROR,
);
break;
}
if (index < mods.length - 1) {
if (lauchedDownload.count >= 200) {
// 200 is a safe number of downloads to avoid Nexus bans
let remainingTime = 5 * 60; // 5 minutes
this.console.log(
"Started the download of 200 mods. Waiting 5 minutes before continuing to avoid the temporary 10 minutes ban from Nexus.",
NDCLogConsole.TYPE_INFO,
);
let logRow = null;
await new Promise((resolve) => {
const intervalId = setInterval(async () => {
remainingTime--;
const minutes = Math.floor(remainingTime / 60);
const seconds = remainingTime % 60;
const logMessage = `Waiting for ${minutes} minutes and ${seconds} seconds before continuing...`;
if (!logRow) {
logRow = this.console.log(logMessage, NDCLogConsole.TYPE_INFO);
} else {
logRow.innerHTML = logMessage;
}
if (remainingTime <= 0) {
logRow.remove();
clearInterval(intervalId);
lauchedDownload.count = 0;
await GM.setValue("lauchedDownload", lauchedDownload);
return resolve();
}
}, 1000);
});
}
const pause = 1;
let logRow = null;
const startDateTime = new Date().getTime();
await new Promise((resolve) => {
const intervalId = setInterval(async () => {
const remainingTime = Math.max(
0,
Math.round(
(startDateTime + pause * 1000 - new Date().getTime()) / 1000,
),
);
const minutes = Math.max(0, Math.floor(remainingTime / 60));
const seconds = Math.max(0, remainingTime % 60);
const logMessage = `Waiting ${minutes} minutes and ${seconds} seconds before starting the next download...`;
if (!logRow) {
logRow = this.console.log(logMessage, NDCLogConsole.TYPE_INFO);
} else {
logRow.innerHTML = logMessage;
}
const shouldClearInterval = () => {
clearInterval(intervalId);
logRow.remove();
return resolve();
};
if (
this.progressBar.skipPause ||
this.progressBar.skipTo ||
this.progressBar.status === NDCProgressBar.STATUS_STOPPED
) {
if (this.progressBar.skipPause) {
this.progressBar.skipPause = false;
}
return shouldClearInterval();
}
if (this.progressBar.status === NDCProgressBar.STATUS_PAUSED) {
return;
}
if (new Date().getTime() >= startDateTime + pause * 1000) {
return shouldClearInterval();
}
}, 100);
});
}
}
if (failedDownload.length) {
this.console.log(
`Failed to download ${failedDownload.length} mods:`,
NDCLogConsole.TYPE_INFO,
);
for (const mod of failedDownload) {
this.console.log(
`<a href="${mod.url}" target="_blank" style="color: rgb(217 143 64)">${mod.modName}</a>`,
NDCLogConsole.TYPE_INFO,
);
}
}
} catch (error) {
this.console.log("An error occurred during the download.", NDCLogConsole.TYPE_ERROR);
console.error(error);
}
this.endDownload();
}
startDownload(modsCount) {
this.progressBar.setModsCount(modsCount);
this.progressBar.setProgress(0);
this.progressBar.setStatus(NDCProgressBar.STATUS_DOWNLOADING);
this.downloadButton.element.style.display = "none";
this.progressBar.element.style.display = "flex";
this.console.log("Download started.", NDCLogConsole.TYPE_INFO);
}
endDownload() {
this.progressBar.setStatus(NDCProgressBar.STATUS_FINISHED);
this.progressBar.element.style.display = "none";
this.downloadButton.element.style.display = "flex";
this.console.log("Download finished.", NDCLogConsole.TYPE_INFO);
}
}
class NDCDownloadButton {
constructor(ndc) {
this.element = document.createElement("div");
Object.assign(this.element.style, {
display: "flex",
flexDirection: "column",
gap: "1rem",
width: "100%",
});
this.ndc = ndc;
this.html = `
<div style="display: flex; flex-direction: row; gap: 1rem; justify-content: center;">
<div style="display: flex;">
<button id="importWabbajackModsBtn" class="btn-outline-secondary import-btn">
Import Wabbajack modlist
</button>
<button id="importWabbajackModsBtnInfo" class="btn-outline-secondary import-btn-info">
<svg id="extraPauseInfo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="presentation" style="width: 1.5rem; height: 1.5rem; cursor: pointer; fill: currentcolor;">
<title>information</title>
<path d="M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"></path>
</svg>
</button>
</div>
</div>
<div style="display: flex; width: 100%;">
<button id="mainBtn" class="btn-primary download-btn-all">
download all mods
<span id="mainModsCount" style="padding: 0.5rem; background-color: rgba(29, 29, 33, 0.8); border-radius: 5px; font-size: 0.75rem; color: white; white-space: nowrap;"></span>
</button>
<div style="position: relative;">
<button id="menuBtn" class="btn-primary download-btn-menu">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.5rem; height: 1.5rem;">
<path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" style="fill: currentcolor;"></path>
</svg>
</button>
<div id="otherOptionMenu" class="ndc-dropdown">
<button id="menuBtnSelect" class="ndc-dropdown-item">
Select mods to download
</button>
</div>
</div>
</div>
`;
this.element.innerHTML = this.html;
this.importWabbajackModsBtn = this.element.querySelector("#importWabbajackModsBtn",);
this.importWabbajackModsBtnInfo = this.element.querySelector("#importWabbajackModsBtnInfo",);
this.allBtn = this.element.querySelector("#mainBtn");
this.modsCount = this.element.querySelector("#mainModsCount");
this.selectBtn = this.element.querySelector("#menuBtnSelect");
this.menuBtn = this.element.querySelector("#menuBtn");
const otherOptionMenu = this.element.querySelector("#otherOptionMenu");
this.importWabbajackModsBtn.addEventListener("click", () => {
// create a temporary input element to select a folder
const input = document.createElement("input");
input.type = "file";
// allow only .wabbajack files
input.accept = ".wabbajack";
// input.multiple = true;
input.addEventListener("change", async () => {
// disable the button to prevent multiple uploads
this.importWabbajackModsBtn.disabled = true;
// Add a loading spinner
this.importWabbajackModsBtn.innerHTML = `
<div class="spinner-border" role="status" style="margin-right: 0.25rem;"></div>
Importing...
`;
await this.ndc.handleFileUpload(input.files[0]);
// re-enable the button
this.importWabbajackModsBtn.disabled = false;
this.importWabbajackModsBtn.innerHTML = "Import Wabbajack modlist";
// remove the input element
input.remove();
});
input.click();
});
this.importWabbajackModsBtnInfo.addEventListener("click", () => {
alert(
'How to import a Wabbajack modlist?'
+ '\n\n'
+ '1. Download the modlist from Wabbajack.'
+ '\n'
+ '2. Click on "Import Wabbajack modlist".'
+ '\n'
+ '3. Select the downloaded modlist file (.wabbajack).'
+ '\n'
+ 'This file should be your Wabbajack installation folder. '
+ '\n'
+ '(ex: C:\\Wabbajack\\3.7.5.3\\downloaded_mod_lists\\*.wabbajack)'
+ '\n\n'
+ 'The modlist will be loaded and you will be able to download the mods.'
);
});
this.menuBtn.addEventListener("click", () => {
otherOptionMenu.style.display = otherOptionMenu.style.display === "block" ? "none" : "block";
});
document.addEventListener("click", (event) => {
const isClickInside =
// otherOptionMenu.contains(event.target) ||
this.menuBtn.contains(event.target);
if (!isClickInside) {
otherOptionMenu.style.display = "none";
}
});
this.allBtn.addEventListener("click", () =>
this.ndc.downloadMods(this.ndc.mods, "all"),
);
this.selectBtn.addEventListener("click", () => {
const selectModsModal = new NDCSelectModsModal(this.ndc);
document.body.appendChild(selectModsModal.element);
selectModsModal.render();
});
}
updateModsCount() {
// if mods count is 0, gray and disable the button
if (this.ndc.mods.length === 0) {
this.allBtn.disabled = true;
this.menuBtn.disabled = true;
} else {
this.allBtn.disabled = false;
this.menuBtn.disabled = false;
}
this.modsCount.innerHTML = `${this.ndc.mods.length} mods`;
}
render() {
this.updateModsCount();
}
}
class NDCProgressBar {
static STATUS_DOWNLOADING = 0;
static STATUS_PAUSED = 1;
static STATUS_FINISHED = 2;
static STATUS_STOPPED = 3;
static STATUS_TEXT = {
[NDCProgressBar.STATUS_DOWNLOADING]: "Downloading...",
[NDCProgressBar.STATUS_PAUSED]: "Paused",
[NDCProgressBar.STATUS_FINISHED]: "Finished",
[NDCProgressBar.STATUS_STOPPED]: "Stopped",
};
constructor(ndc, options = {}) {
this.element = document.createElement("div");
Object.assign(this.element.style, {
// "flex", "flex-wrap", "w-100"
// display: "flex",
display: "none",
flexWrap: "wrap",
width: "100%",
});
this.ndc = ndc;
this.modsCount = 0;
this.progress = 0;
this.skipPause = false;
this.skipTo = false;
this.skipToIndex = 0;
this.status = NDCProgressBar.STATUS_DOWNLOADING;
this.html = `
<div class="progress-bar" id="progressBar">
<div class="progress-bar-fill" id="progressBarFill"></div>
<div class="progress-bar-text-container" id="progressBarText">
<div class="progress-bar-text-base progress-bar-text-progress" id="progressBarProgress">${this.progress}%</div>
<div class="progress-bar-text-base progress-bar-text-center" id="progressBarTextCenter">Downloading...</div>
<div class="progress-bar-text-base progress-bar-text-right" id="progressBarTextRight">${this.progress}/${this.modsCount}</div>
</div>
</div>
<div style="display: flex;" id="actionBtnGroup">
<button class="btn-primary pause-btn" id="playPauseBtn">
<svg style="width: 1.5rem; height: 1.5rem; fill: currentcolor;" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation"><path d="M14,19H18V5H14M6,19H10V5H6V19Z" style="fill: currentcolor;"></path></svg>
</button>
<button class="btn-primary stop-btn" id="stopBtn">
<svg style="width: 1.5rem; height: 1.5rem; fill: currentcolor;" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation"><path d="M18,18H6V6H18V18Z" style="fill: currentcolor;"></path></svg>
</button>
</div>
<div style="display: flex; margin: 0.5rem 0; justify-content: flex-end; flex-basis: 100%;" id="toolbarContainer">
<div style="display: flex; gap: 0.5rem; align-items: center;" id="skipContainer">
<button class="btn-primary" id="skipNextBtn">
Skip pause
</button>
<button class="btn-primary" id="skipToIndexBtn">
Skip to index
</button>
<input style="appearance: auto; background-color: rgb(41, 41, 46); border: 1px solid rgb(161, 161, 170); border-radius: 4px; box-sizing: border-box; color: rgb(161, 161, 170); cursor: text; display: block; font: 400 16px/24px 'Montserrat', ui-sans-serif, system-ui, sans-serif; height: 36px; outline: 2px solid rgba(0, 0, 0, 0); padding: 0.5rem; text-align: start; width: 80px;" type="number" min="0" placeholder="Index" id="skipToIndexInput">
</div>
</div>
`;
this.element.innerHTML = this.html;
this.progressBarFill = this.element.querySelector("#progressBarFill");
this.progressBarProgress = this.element.querySelector("#progressBarProgress");
this.progressBarTextCenter = this.element.querySelector("#progressBarTextCenter");
this.progressBarTextRight = this.element.querySelector("#progressBarTextRight");
this.playPauseBtn = this.element.querySelector("#playPauseBtn");
this.stopBtn = this.element.querySelector("#stopBtn");
this.skipNextBtn = this.element.querySelector("#skipNextBtn");
this.skipToIndexBtn = this.element.querySelector("#skipToIndexBtn");
this.skipToIndexInput = this.element.querySelector("#skipToIndexInput");
this.playPauseBtn.addEventListener("click", () => {
const status =
this.status === NDCProgressBar.STATUS_DOWNLOADING
? NDCProgressBar.STATUS_PAUSED
: NDCProgressBar.STATUS_DOWNLOADING;
this.setStatus(status);
});
this.stopBtn.addEventListener("click", () => {
this.setStatus(NDCProgressBar.STATUS_STOPPED);
});
this.skipNextBtn.addEventListener("click", () => {
this.skipPause = true;
this.setStatus(NDCProgressBar.STATUS_DOWNLOADING);
});
this.skipToIndexBtn.addEventListener("click", () => {
const index = Number.parseInt(this.skipToIndexInput.value);
if (index > this.progress && index <= this.modsCount) {
this.skipTo = true;
this.skipToIndex = index;
this.setStatus(NDCProgressBar.STATUS_DOWNLOADING);
}
});
}
setState(newState) {
Object.assign(this, newState);
this.render();
}
setModsCount(modsCount) {
this.setState({ modsCount });
}
setProgress(progress) {
this.setState({ progress });
}
incrementProgress() {
this.setState({ progress: this.progress + 1 });
}
setStatus(status) {
this.setState({ status });
this.progressBarTextCenter.innerHTML = NDCProgressBar.STATUS_TEXT[status];
}
getProgressPercent() {
return ((this.progress / this.modsCount) * 100).toFixed(2);
}
updateProgressBarFillWidth() {
this.progressBarFill.style.width = `${this.getProgressPercent()}%`;
}
updateProgressBarTextProgress() {
this.progressBarProgress.innerHTML = `${this.getProgressPercent()}%`;
}
updateProgressBarTextRight() {
this.progressBarTextRight.innerHTML = `${this.progress}/${this.modsCount}`;
}
updatePlayPauseBtn() {
this.playPauseBtn.innerHTML =
this.status === NDCProgressBar.STATUS_PAUSED
? '<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.5rem; height: 1.5rem;"><path d="M8,5.14V19.14L19,12.14L8,5.14Z" style="fill: currentcolor;"></path></svg>'
: '<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.5rem; height: 1.5rem;"><path d="M14,19H18V5H14M6,19H10V5H6V19Z" style="fill: currentcolor;"></path></svg>';
}
render() {
this.updateProgressBarFillWidth();
this.updateProgressBarTextProgress();
this.updateProgressBarTextRight();
this.updatePlayPauseBtn();
}
}
class NDCSelectModsModal {
constructor(ndc) {
this.element = document.createElement("div");
this.element.classList.add(
"ndc-modal-backdrop",
);
this.ndc = ndc;
this.html = `
<div class="ndc-modal">
<div class="ndc-modal-header">
<h2 class="ndc-modal-header-title">Select mods</h2>
<div style="display: flex; gap: .5rem;">
<div style="display: flex; align-items: center;">
<span class="ndc-badge-primary" id="selectedModsCount">0 mods selected</span>
</div>
<div style="position: relative;">
<button type="button" class="btn-outline-secondary ndc-modal-header-dropdown-btn" id="openSelectModsOptionMenu">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 1.5rem; height: 1.5rem; fill: currentcolor;">
<title>Options</title>
<path d="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z" />
</svg>
</button>
<div class="ndc-dropdown" id="selectModsOptionMenu">
<button class="ndc-dropdown-item" id="selectModsSelectAll">
Select all
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 1.5rem; height: 1.5rem;"><title>Check all mods</title><path d="M0.41,13.41L6,19L7.41,17.58L1.83,12M22.24,5.58L11.66,16.17L7.5,12L6.07,13.41L11.66,19L23.66,7M18,7L16.59,5.58L10.24,11.93L11.66,13.34L18,7Z" style="fill: currentcolor;"/></svg>
</button>
<button class="ndc-dropdown-item" id="selectModsDeselectAll">
Deselect all
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 1.5rem; height: 1.5rem;"><title>Clear selection</title><path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" style="fill: currentcolor;"/></svg>
</button>
<button class="ndc-dropdown-item" id="selectModsInvertSelection">
Invert selection
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 1.5rem; height: 1.5rem;"><title>Invert selection</title><path d="M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M6.5 9L10 5.5L13.5 9H11V13H9V9H6.5M17.5 15L14 18.5L10.5 15H13V11H15V15H17.5Z" style="fill: currentcolor;"/></svg>
</button>
<div class="border-t border-stroke-subdued"></div>
<button class="ndc-dropdown-item" id="exportModsSelection">
Export mods selection
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 1.5rem; height: 1.5rem;"><title>Export</title><path d="M9,16V10H5L12,3L19,10H15V16H9M5,20V18H19V20H5Z" style="fill: currentcolor;"/></svg>
</button>
<button class="ndc-dropdown-item" id="importModsSelection">
Import mods selection
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 1.5rem; height: 1.5rem;"><title>Import</title><path d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z" style="fill: currentcolor;"/></svg>
</button>
<div class="border-t border-stroke-subdued"></div>
<button class="ndc-dropdown-item" id="selectModsImportDownloadedMods">
Import downloaded mods
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 1.5rem; height: 1.5rem;"><title>Import</title><path d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z" style="fill: currentcolor;"/></svg>
</button>
</div>
</div>
</div>
</div>
<div class="ndc-modal-filter">
<input type="search" id="searchMods" placeholder="Search mods...">
<select id="sortMods">
<option value="mod_name_asc">Order by mod name ASC</option>
<option value="mod_name_desc">Order by mod name DESC</option>
<option value="file_name_asc">Order by file name ASC</option>
<option value="file_name_desc">Order by file name DESC</option>
<option value="size_asc">Order by size ASC</option>
<option value="size_desc">Order by size DESC</option>
</select>
</div>
<div class="ndc-modal-mods-list">
<div class="ndc-modal-mods-list-header">
<span class="mod-list-index" style="width: 3rem;">Index</span>
<span style="flex: 1 1 0%;">Mod name</span>
<span style="flex: 1 1 0%;">File name</span>
<span style="width: 5rem;">Size</span>
</div>
<div id="modsListMobile" class="ndc-modal-mods-list-body"></div>
</div>
<div class="ndc-modal-actions">
<button class="btn-outline-secondary" id="cancelSelectModsBtn">Cancel</button>
<button class="btn-primary" id="selectModsBtn">Download selected mods</button>
</div>
</div>
`;
this.element.innerHTML = this.html;
this.searchMods = this.element.querySelector("#searchMods");
this.sortMods = this.element.querySelector("#sortMods");
this.selectModsSelectAll = this.element.querySelector(
"#selectModsSelectAll",
);
this.selectModsInvertSelection = this.element.querySelector(
"#selectModsInvertSelection",
);
this.selectModsDeselectAll = this.element.querySelector(
"#selectModsDeselectAll",
);
this.modsListMobile = this.element.querySelector("#modsListMobile");
this.selectedModsCount = this.element.querySelector("#selectedModsCount");
this.openSelectModsOptionMenu = this.element.querySelector(
"#openSelectModsOptionMenu",
);
this.selectModsOptionMenu = this.element.querySelector(
"#selectModsOptionMenu",
);
this.exportModsSelection = this.element.querySelector(
"#exportModsSelection",
);
this.importModsSelection = this.element.querySelector(
"#importModsSelection",
);
this.selectModsImportDownloadedMods = this.element.querySelector(
"#selectModsImportDownloadedMods",
);
this.selectModsBtn = this.element.querySelector("#selectModsBtn");
this.cancelSelectModsBtn = this.element.querySelector(
"#cancelSelectModsBtn",
);
this.openSelectModsOptionMenu.addEventListener("click", () => {
this.selectModsOptionMenu.style.display =
this.selectModsOptionMenu.style.display === "block" ? "none" : "block";
});
this.selectModsBtn.addEventListener("click", () => {
const selectedMods = [];
for (const mod of this.ndc.mods) {
const checkbox = this.element.querySelector(`#mod_${mod.fileId}`);
if (checkbox.checked) {
selectedMods.push(mod);
}
}
this.element.remove();
this.ndc.downloadMods(selectedMods);
});
this.cancelSelectModsBtn.addEventListener("click", () => {
this.element.remove();
});
document.addEventListener("click", (event) => {
const isClickInside = this.openSelectModsOptionMenu.contains(
event.target,
);
// if the click on an option, close the menu
if (!isClickInside) {
this.selectModsOptionMenu.style.display = "none";
}
});
}
updateModList(mods) {
this.modsListMobile.innerHTML = "";
for (const [index, mod] of mods.entries()) {
const modElementMobile = document.createElement("div");
modElementMobile.classList.add("ndc-modal-mods-list-body-row");
modElementMobile.innerHTML = `
<input type="checkbox" id="mod_${mod.fileId}" style="display: none;">
<div class="ndc-modal-mods-list-body-row-desktop">
<span style="width: 3rem; color: rgb(217 143 64);" class="mod-list-index">#${index + 1}</span>
<span style="flex: 1 1 0%;" class="text-white">${mod.modName}</span>
<span style="flex: 1 1 0%;" class="text-white">${mod.fileName}</span>
<span style="width: 5rem;" class="text-white">${convertSize(mod.size)}</span>
</div>
<div class="ndc-modal-mods-list-body-row-mobile">
<div style="flex: 1 1 0%; justify-content: space-between; align-items: center; margin-bottom: 0.25rem;">
<div style="flex: 1 1 0%; gap: 0.5rem; align-items: center;">
<span class="mod-list-index" style="color: rgb(217 143 64);">#${index + 1}</span>
</div>
<div style="flex: 1 1 0%; gap: 0.5rem;">
<span class="text-white">${convertSize(mod.size)}</span>
</div>
</div>
<div style="flex: 1 1 0%; flex-direction: column; gap: 0.25rem;">
<div class="text-white">${mod.modName}</div>
<div class="text-white">${mod.fileName}</div>
</div>
</div>
`;
modElementMobile.addEventListener("click", (event) => {
// if check change color, if shiftkey is pressed, select all between the last checked and this one
const checkbox = modElementMobile.querySelector(
'input[type="checkbox"]',
);
checkbox.checked = !checkbox.checked;
const modElement = checkbox.parentNode;
modElement.classList.toggle("bg-primary-subdued");
modElement
.querySelector(".mod-list-index")
.classList.toggle("text-white");
// if shift key is pressed and there is a last checked element
if (event.shiftKey && modElement.parentNode.dataset.lastChecked) {
const start = Array.from(modElement.parentNode.children).indexOf(
modElement,
);
const end = modElement.parentNode.dataset.lastChecked;
const checkedState = modElement.parentNode.children[
end
].querySelector('input[type="checkbox"]').checked;
for (let i = Math.min(start, end); i <= Math.max(start, end); i++) {
const modEl = modElement.parentNode.children[i];
const checkboxEl = modEl.querySelector('input[type="checkbox"]');
checkboxEl.checked = checkedState;
modEl.classList.toggle("bg-primary-subdued", checkedState);
modEl
.querySelector(".mod-list-index")
.classList.toggle("text-white", checkedState);
}
}
// get the index of the element, and store it to the parent
const index = Array.from(modElement.parentNode.children).indexOf(
modElement,
);
modElement.parentNode.dataset.lastChecked = index;
this.selectedModsCount.firstChild.textContent = `${this.element.querySelectorAll('input[type="checkbox"]:checked').length
} mods selected`;
});
this.modsListMobile.appendChild(modElementMobile);
}
}
render() {
this.updateModList(this.ndc.mods);
// close the modal when clicking outside of it
this.element.addEventListener("click", (event) => {
if (event.target === this.element) {
this.element.remove();
}
});
// searchMods
this.searchMods.addEventListener("input", () => {
const search = this.searchMods.value.toLowerCase();
for (const mod of this.ndc.mods) {
const modElement = this.element.querySelector(
`#mod_${mod.fileId}`,
).parentNode;
if (
mod.modName.toLowerCase().includes(search) ||
mod.fileName.toLowerCase().includes(search)
) {
modElement.style.display = "";
} else {
modElement.style.display = "none";
}
}
});
// sortMods
this.sortMods.addEventListener("change", () => {
const sort = this.sortMods.value;
const mods = [...this.ndc.mods];
switch (sort) {
case "mod_name_asc":
mods.sort((a, b) => a.modName.localeCompare(b.modName));
break;
case "mod_name_desc":
mods.sort((a, b) => b.modName.localeCompare(a.modName));
break;
case "file_name_asc":
mods.sort((a, b) => a.fileName.localeCompare(b.fileName));
break;
case "file_name_desc":
mods.sort((a, b) => b.fileName.localeCompare(a.fileName));
break;
case "size_asc":
mods.sort((a, b) => a.size - b.size);
break;
case "size_desc":
mods.sort((a, b) => b.size - a.size);
break;
}
this.updateModList(mods);
});
this.selectModsSelectAll.addEventListener("click", () => {
for (const mod of this.ndc.mods) {
const checkbox = this.element.querySelector(`#mod_${mod.fileId}`);
checkbox.checked = true;
const modElement = checkbox.parentNode;
modElement.classList.add("bg-primary-subdued");
modElement.querySelector(".mod-list-index").classList.add("text-white");
}
this.selectedModsCount.firstChild.textContent = `${this.ndc.mods.length} mods selected`;
});
this.selectModsInvertSelection.addEventListener("click", () => {
for (const mod of this.ndc.mods) {
const checkbox = this.element.querySelector(`#mod_${mod.fileId}`);
checkbox.checked = !checkbox.checked;
const modElement = checkbox.parentNode;
modElement.classList.toggle("bg-primary-subdued");
modElement
.querySelector(".mod-list-index")
.classList.toggle("text-white");
}
this.selectedModsCount.firstChild.textContent =
`${this.element.querySelectorAll('input[type="checkbox"]:checked').length} mods selected`;
});
this.selectModsDeselectAll.addEventListener("click", () => {
for (const mod of this.ndc.mods) {
const checkbox = this.element.querySelector(`#mod_${mod.fileId}`);
checkbox.checked = false;
const modElement = checkbox.parentNode;
modElement.classList.remove("bg-primary-subdued");
modElement
.querySelector(".mod-list-index")
.classList.remove("text-white");
}
this.selectedModsCount.firstChild.textContent = "0 mods selected";
});
this.exportModsSelection.addEventListener("click", () => {
if (!this.element.querySelector('input[type="checkbox"]:checked')) {
alert("You must select at least one mod to export.");
return;
}
const selectedMods = [];
for (const mod of this.ndc.mods) {
const checkbox = this.element.querySelector(`#mod_${mod.fileId}`);
if (checkbox.checked) {
selectedMods.push(mod);
}
}
const selectedModsText = JSON.stringify(selectedMods, null, 2);
const blob = new Blob([selectedModsText], { type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = `ndc_selected_mods_${this.ndc.gameId}_${this.ndc.collectionId
}_${Date.now()}.json`;
a.click();
URL.revokeObjectURL(url);
});
this.importModsSelection.addEventListener("click", () => {
const input = document.createElement("input");
input.type = "file";
input.accept = ".json";
input.addEventListener("change", async () => {
const file = input.files[0];
const reader = new FileReader();
reader.onload = async () => {
const selectedMods = JSON.parse(reader.result);
for (const mod of selectedMods) {
const checkbox = this.element.querySelector(
`#mod_${mod.fileId}`,
);
if (checkbox == null) {
continue;
}
checkbox.checked = true;
const modElement = checkbox.parentNode;
modElement.classList.add("bg-primary-subdued");
modElement
.querySelector(".mod-list-index")
.classList.add("text-white");
}
this.selectedModsCount.firstChild.textContent = `${selectedMods.length} mods selected`;
};
reader.readAsText(file);
});
input.click();
});
this.selectModsImportDownloadedMods.addEventListener("click", () => {
const input = document.createElement("input");
input.type = "file";
input.multiple = true;
input.addEventListener("change", async () => {
const files = input.files;
const downloadedMods = this.ndc.mods.filter((mod) => {
for (const file of files) {
if (file.name.includes(mod.fileName)) {
return true;
}
}
return false;
}).reduce((acc, mod) => {
acc[mod.fileId] = mod;
return acc;
}, {});
// for each checkbox, check if the mod is in the downloadedMods array, if not, check the checkbox
const notDownloadedMods = [];
for (const modElement of this.modsListMobile.childNodes) {
const checkbox = modElement.querySelector('input[type="checkbox"]');
const modId = Number.parseInt(checkbox.id.split("_")[1]);
if (downloadedMods[modId] == null) {
notDownloadedMods.push(downloadedMods[modId]);
checkbox.checked = true;
modElement.classList.add("bg-primary-subdued");
modElement.querySelector(".mod-list-index").classList.add("text-white");
}
}
this.selectedModsCount.firstChild.textContent = `${notDownloadedMods.length} mods selected`;
if (notDownloadedMods.length === 0) {
alert("All mods are already downloaded.");
} else {
alert(
`Selected ${notDownloadedMods.length
} mods that are not downloaded yet.`,
);
}
});
input.click();
});
}
}
class NDCLogConsole {
static TYPE_NORMAL = "NORMAL";
static TYPE_ERROR = "ERROR";
static TYPE_INFO = "INFO";
constructor(ndc, options = {}) {
this.element = document.createElement("div");
Object.assign(this.element.style, {
// "flex", "flex-col", "w-100", "gap-3", "mt-3"
display: "flex",
flexDirection: "column",
width: "100%",
gap: "1rem",
marginTop: "1rem",
});
this.ndc = ndc;
this.hidden = false;
this.html = `
<div style="display: flex; flex-direction: column; width: 100%; gap: 0.75rem;">
<button style="appearance: button; background: none; border: 0; box-sizing: border-box; color: rgb(244, 244, 245); cursor: pointer; display: block; font: 400 16px/24px 'Montserrat', ui-sans-serif, system-ui, sans-serif; height: 24px; text-align: center; width: 100%;" id="toggleLogsButton">
Hide logs
</button>
<div style="background-color: rgb(29 29 33 / 70%); border: 1px solid rgb(255, 255, 255); border-radius: 4px; box-sizing: border-box; color: rgb(255, 255, 255); display: block; font: 600 14px/21px 'Montserrat', ui-sans-serif, system-ui, sans-serif; height: 160px; overflow-y: auto; resize: vertical; width: 100%;" id="logContainer">
</div>
</div>
`;
this.element.innerHTML = this.html;
this.toggle = this.element.querySelector("#toggleLogsButton");
this.logContainer = this.element.querySelector("#logContainer");
this.toggle.addEventListener("click", () => {
this.hidden = !this.hidden;
logContainer.style.display = this.hidden ? "none" : "";
this.toggle.innerHTML = this.hidden ? "Show logs" : "Hide logs";
});
}
log(message, type = NDCLogConsole.TYPE_NORMAL) {
const rowElement = document.createElement("div");
Object.assign(rowElement.style, {
display: "flex",
columnGap: ".25rem",
padding: "0.25rem .5rem",
});
if (type === NDCLogConsole.TYPE_ERROR) {
Object.assign(rowElement.style, {
color: "rgb(229, 62, 62)",
});
} else if (type === NDCLogConsole.TYPE_INFO) {
Object.assign(rowElement.style, {
color: "rgb(96 165 250)",
});
}
rowElement.innerHTML = `<span>[${new Date().toLocaleTimeString()}]</span><span class="ndc-log-message" style="display: flex; gap: 1rem;">${message}</span>`;
rowElement.message = rowElement.querySelector(".ndc-log-message");
this.logContainer.appendChild(rowElement);
this.logContainer.scrollTop = this.logContainer.scrollHeight;
console.log(`${message}`);
return rowElement;
}
clear() {
this.logContainer.innerHTML = "";
}
}
let ndc = null;
async function handleNextRouterChange() {
ndc = new NDC();
await ndc.init();
// set interval to check if ndc.element is still in the DOM, if not re add it
setInterval(() => {
if (!document.contains(ndc.element)) {
document
.querySelector("#mainContent > section > div.home-intro")
.prepend(ndc.element);
}
}, 500);
}
// Monitor route changes using popstate
window.addEventListener("popstate", handleNextRouterChange);
// Handle programmatic navigation (optional, for pushState or replaceState)
const originalPushState = history.pushState;
const originalReplaceState = history.replaceState;
history.pushState = function (...args) {
originalPushState.apply(this, args);
window.dispatchEvent(new Event("popstate"));
};
history.replaceState = function (...args) {
originalReplaceState.apply(this, args);
window.dispatchEvent(new Event("popstate"));
};
// Initial call to handle the current route
handleNextRouterChange();
})();