module.exports = (Plugin, Api, Vendor) => { if (typeof BDFDB !== "object") global.BDFDB = {$: Vendor.$, BDv2Api: Api}; const {$} = Vendor; return class extends Plugin { initConstructor () { this.labels = {}; this.languages; this.creationDateMarkup = `
`; this.css = ` ${BDFDB.dotCNS.themelight + BDFDB.dotCN.userpopoutheadernormal} .creationDate { color: #b9bbbe; } ${BDFDB.dotCNS.themelight + BDFDB.dotCN.userpopoutheader}:not(${BDFDB.dotCN.userpopoutheadernormal}) .creationDate, ${BDFDB.dotCNS.themedark + BDFDB.dotCN.userpopoutheader} .creationDate { color: hsla(0,0%,100%,.6); } ${BDFDB.dotCNS.themelight + BDFDB.dotCN.userprofiletopsectionnormal} .creationDate { color: hsla(216,4%,74%,.6); } ${BDFDB.dotCN.themelight} [class*='topSection']:not(${BDFDB.dotCN.userprofiletopsectionnormal}) .creationDate, ${BDFDB.dotCN.themedark} [class*='topSection'] .creationDate { color: hsla(0,0%,100%,.6); }`; this.defaults = { settings: { addInUserPopout: {value:true, description:"Add in User Popouts:"}, addInUserProfil: {value:true, description:"Add in User Profil Modal:"}, addCreationTime: {value:true, description:"Display the Time of Creation:"}, forceZeros: {value:false, description:"Force leading Zeros:"} }, choices: { creationDateLang: {value:"$discord", description:"Creation Date Format:"} } }; } onStart () { var libraryScript = null; if (typeof BDFDB !== "object" || typeof BDFDB.isLibraryOutdated !== "function" || BDFDB.isLibraryOutdated()) { libraryScript = document.querySelector('head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]'); if (libraryScript) libraryScript.remove(); libraryScript = document.createElement("script"); libraryScript.setAttribute("type", "text/javascript"); libraryScript.setAttribute("src", "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"); document.head.appendChild(libraryScript); } this.startTimeout = setTimeout(() => {this.initialize();}, 30000); if (typeof BDFDB === "object" && typeof BDFDB.isLibraryOutdated === "function") this.initialize(); else libraryScript.addEventListener("load", () => {this.initialize();}); return true; } initialize () { if (typeof BDFDB === "object") { BDFDB.loadMessage(this); var observer = null; observer = new MutationObserver((changes, _) => { changes.forEach( (change, i) => { if (change.addedNodes) { change.addedNodes.forEach((node) => { if (node && node.tagName && node.querySelector(BDFDB.dotCN.userpopout)) { if (BDFDB.getData("addInUserPopout", this, "settings")) this.addCreationDate(node.querySelector(BDFDB.dotCN.userpopoutheadertext)); } }); } } ); }); BDFDB.addObserver(this, BDFDB.dotCN.popouts, {name:"userPopoutObserver",instance:observer}, {childList: true}); observer = new MutationObserver((changes, _) => { changes.forEach( (change, i) => { if (change.addedNodes) { change.addedNodes.forEach((node) => { if (node && node.tagName && node.querySelector(BDFDB.dotCN.userprofile)) { if (BDFDB.getData("addInUserProfil", this, "settings")) this.addCreationDate(node.querySelector(BDFDB.dotCN.userprofileheaderinfo)); } }); } } ); }); BDFDB.addObserver(this, BDFDB.dotCN.app + " ~ [class^='theme-']:not([class*='popouts'])", {name:"userProfilModalObserver",instance:observer}, {childList: true}); this.languages = Object.assign({},BDFDB.languages); return true; } else { console.error(this.name + ": Fatal Error: Could not load BD functions!"); return false; } } onStop () { if (typeof BDFDB === "object") { BDFDB.unloadMessage(this); return true; } else { return false; } } // begin of own functions updateSettings (settingspanel) { var settings = {}; for (var input of settingspanel.querySelectorAll(BDFDB.dotCN.switchinner)) { settings[input.value] = input.checked; } BDFDB.saveAllData(settings, this, "settings"); } openDropdownMenu (e) { var selectControl = e.currentTarget; var selectWrap = selectControl.parentElement; if (selectWrap.classList.contains(BDFDB.disCN.selectisopen)) return; selectWrap.classList.add(BDFDB.disCN.selectisopen); $("li").has(selectWrap).css("overflow", "visible"); var type = selectWrap.getAttribute("type"); var selectMenu = this.createDropdownMenu(selectWrap.getAttribute("value"), type); selectWrap.appendChild(selectMenu); $(selectMenu).on("mousedown." + this.name, BDFDB.dotCN.selectoption, (e2) => { var language = e2.currentTarget.getAttribute("value"); selectWrap.setAttribute("value", language); selectControl.querySelector(".languageName").innerText = this.languages[language].name; selectControl.querySelector(".languageTimestamp").innerText = this.getCreationTime(language); BDFDB.saveData(type, language, this, "choices"); }); $(document).on("mousedown.select" + this.name, (e2) => { if (e2.target.parentElement == selectMenu) return; $(document).off("mousedown.select" + this.name); selectMenu.remove(); $("li").has(selectWrap).css("overflow", "auto"); setTimeout(() => {selectWrap.classList.remove(BDFDB.disCN.selectisopen);},100); }); } createDropdownMenu (choice, type) { var menuhtml = `
`; for (var key in this.languages) { var isSelected = key == choice ? ` ${BDFDB.disCN.selectselected}` : ``; menuhtml += `
${this.languages[key].name}
${this.getCreationTime(this.languages[key].id)}
` } menuhtml += `
`; return $(menuhtml)[0]; } addCreationDate (container) { if (!container) return; var info = BDFDB.getKeyInformation({"node":container,"key":"user"}); if (info) { var creationDate = $(this.creationDateMarkup); var choice = BDFDB.getData("creationDateLang", this, "choices"); creationDate.text(this.labels.createdat_text + " " + this.getCreationTime(this.languages[choice].id, info.createdAt)); var nametag = container.querySelector(BDFDB.dotCN.nametag); container.insertBefore(creationDate[0], nametag ? nametag.nextSibling : null); } } getCreationTime (languageid, timestamp = new Date()) { var settings = BDFDB.getAllData(this, "settings"); var timestring = settings.addCreationTime ? timestamp.toLocaleString(languageid) : timestamp.toLocaleDateString(languageid); if (timestring && settings.forceZeros) timestring = this.addLeadingZeros(timestring); return timestring; } addLeadingZeros (timestring) { var chararray = timestring.split(""); var numreg = /[0-9]/; for (var i = 0; i < chararray.length; i++) { if (!numreg.test(chararray[i-1]) && numreg.test(chararray[i]) && !numreg.test(chararray[i+1])) chararray[i] = "0" + chararray[i]; } return chararray.join(""); } getSettingsPanel () { var settings = BDFDB.getAllData(this, "settings"); var choices = BDFDB.getAllData(this, "choices"); var settingshtml = `
`; for (let key in choices) { settingshtml += `

${this.defaults.choices[key].description}

${this.languages[choices[key]].name}
${this.getCreationTime(this.languages[choices[key]].id)}
`; } for (let key in settings) { settingshtml += `

${this.defaults.settings[key].description}

`; } settingshtml += `
`; var settingspanel = $(settingshtml)[0]; $(settingspanel) .on("click", BDFDB.dotCN.switchinner, () => { this.updateSettings(settingspanel); var choices = BDFDB.getAllData(this, "choices"); for (let key in choices) { settingspanel.querySelector(`${BDFDB.dotCN.select}[type='${key}'] .languageTimestamp`).innerText = this.getCreationTime(this.languages[choices[key]].id); } }) .on("click", BDFDB.dotCN.selectcontrol, (e) => {this.openDropdownMenu(e);}); return settingspanel; } setLabelsByLanguage () { switch (BDFDB.getDiscordLanguage().id) { case "hr": //croatian return { createdat_text: "Izrađen" }; case "da": //danish return { createdat_text: "Oprettet den" }; case "de": //german return { createdat_text: "Erstellt am" }; case "es": //spanish return { createdat_text: "Creado el" }; case "fr": //french return { createdat_text: "Créé le" }; case "it": //italian return { createdat_text: "Creato il" }; case "nl": //dutch return { createdat_text: "Gemaakt op" }; case "no": //norwegian return { createdat_text: "Opprettet på" }; case "pl": //polish return { createdat_text: "Utworzono" }; case "pt-BR": //portuguese (brazil) return { createdat_text: "Criado em" }; case "fi": //finnish return { createdat_text: "Luotu" }; case "sv": //swedish return { createdat_text: "Skapat den" }; case "tr": //turkish return { createdat_text: "Oluşturma tarihi" }; case "cs": //czech return { createdat_text: "Vytvořeno dne" }; case "bg": //bulgarian return { createdat_text: "Създадена на" }; case "ru": //russian return { createdat_text: "Создано" }; case "uk": //ukrainian return { createdat_text: "Створено" }; case "ja": //japanese return { createdat_text: "作成日" }; case "zh-TW": //chinese (traditional) return { createdat_text: "創建於" }; case "ko": //korean return { createdat_text: "생성 일" }; default: //default: english return { createdat_text: "Created on" }; } } } };