diff --git a/Plugins/BDFDB.js b/Plugins/BDFDB.js index c9ef568dc7..d9b44935d7 100644 --- a/Plugins/BDFDB.js +++ b/Plugins/BDFDB.js @@ -288,9 +288,9 @@ BDFDB.PluginUtils.addLoadingIcon = function (icon) { if (!Node.prototype.isPrototypeOf(icon)) return; BDFDB.DOMUtils.addClass(icon, BDFDB.disCN.loadingicon); - let loadingIconWrapper = document.querySelector(BDFDB.dotCN.app + ">" + BDFDB.dotCN.loadingIconWrapper); + let loadingIconWrapper = document.querySelector(BDFDB.dotCN.app + ">" + BDFDB.dotCN.loadingiconwrapper); if (!loadingIconWrapper) { - loadingIconWrapper = BDFDB.DOMUtils.create(`
`); + loadingIconWrapper = BDFDB.DOMUtils.create(``); document.querySelector(BDFDB.dotCN.app).appendChild(loadingIconWrapper); let killObserver = new MutationObserver(changes => {if (!loadingIconWrapper.firstElementChild) BDFDB.DOMUtils.remove(loadingIconWrapper);}); killObserver.observe(loadingIconWrapper, {childList:true}); @@ -1316,8 +1316,8 @@ selectedTypes = [selectedTypes].flat(10).filter(n => n).map(type => type && WebModulesData.PatchMap[type] ? WebModulesData.PatchMap[type] + " _ _ " + type : type); let filteredModules = [], specialModules = [], patchtypes = {}; for (let patchType in plugin.patchedModules) for (let type in plugin.patchedModules[patchType]) { - let methodnames = [plugin.patchedModules[patchType][type]].flat(10).filter(n => n); - if (BDFDB.ArrayUtils.includes(methodnames, "componentDidMount", "componentDidUpdate", "render", false) && (!selectedTypes.length || selectedTypes.includes(type))) { + let methodNames = [plugin.patchedModules[patchType][type]].flat(10).filter(n => n); + if (BDFDB.ArrayUtils.includes(methodNames, "componentDidMount", "componentDidUpdate", "render", false) && (!selectedTypes.length || selectedTypes.includes(type))) { let unmappedType = type.split(" _ _ ")[1] || type; let className = WebModulesData.PatchFinder[unmappedType]; let filter = WebModulesData.SpecialFilter[unmappedType]; @@ -1360,12 +1360,12 @@ InternalBDFDB.forceInitiateProcess = function (plugin, instance, type, patchtypes) { plugin = plugin == BDFDB && InternalBDFDB || plugin; if (!plugin || !instance || !type) return; - let methodnames = []; - for (let patchType in plugin.patchedModules) if (plugin.patchedModules[patchType][type]) methodnames.push(plugin.patchedModules[patchType][type]); - methodnames = BDFDB.ArrayUtils.removeCopies(methodnames).flat(10).filter(n => n); - if (methodnames.includes("componentDidMount")) InternalBDFDB.initiateProcess(plugin, type, {instance, methodname:"componentDidMount", patchtypes}); - if (methodnames.includes("render")) BDFDB.ReactUtils.forceUpdate(instance); - else if (methodnames.includes("componentDidUpdate")) InternalBDFDB.initiateProcess(plugin, type, {instance, methodname:"componentDidUpdate", patchtypes}); + let methodNames = []; + for (let patchType in plugin.patchedModules) if (plugin.patchedModules[patchType][type]) methodNames.push(plugin.patchedModules[patchType][type]); + methodNames = BDFDB.ArrayUtils.removeCopies(methodNames).flat(10).filter(n => n); + if (methodNames.includes("componentDidMount")) InternalBDFDB.initiateProcess(plugin, type, {instance, methodname:"componentDidMount", patchtypes}); + if (methodNames.includes("render")) BDFDB.ReactUtils.forceUpdate(instance); + else if (methodNames.includes("componentDidUpdate")) InternalBDFDB.initiateProcess(plugin, type, {instance, methodname:"componentDidUpdate", patchtypes}); }; InternalBDFDB.initiateProcess = function (plugin, type, e) { plugin = plugin == BDFDB && InternalBDFDB || plugin; @@ -1700,8 +1700,8 @@ for (let attr of node.attributes) attributes[attr.name] = attr.value; if (node.attributes.style) attributes.style = BDFDB.ObjectUtils.filter(node.style, n => node.style[n] && isNaN(parseInt(n)), true); attributes.children = []; - if (node.style && node.style.cssText) for (let propstr of node.style.cssText.split(";")) if (propstr.endsWith("!important")) { - let key = propstr.split(":")[0]; + if (node.style && node.style.cssText) for (let propStr of node.style.cssText.split(";")) if (propStr.endsWith("!important")) { + let key = propStr.split(":")[0]; let camelprop = key.replace(/-([a-z]?)/g, (m, g) => g.toUpperCase()); if (attributes.style[camelprop] != null) importantStyles.push(key); } @@ -3997,7 +3997,6 @@ cardInner: "inner-OP_8zd", cardWrapper: "card-rT4Wbb", charCounter: "counter-uAzbKp", - changeLogIcon: "icon-vGGh7_", changeLogModal: "changeLogModal-ny_dHC", collapseContainer: "container-fAVkOf", collapseContainerArrow: "arrow-uglXxc", @@ -4091,6 +4090,7 @@ bdGuildSeparator: "bd-guild-separator", bdGuildUnread: "bd-unread", bdGuildVideo: "bd-video", + bdIcon: "bd-icon", bdPillSelected: "bd-selected", bdPillUnread: "bd-unread", bdPfbtn: "bd-pfbtn", @@ -4539,6 +4539,7 @@ _repofooter: ["BDrepo", "bdaFooter"], _repoheader: ["BDrepo", "bdaHeader"], _repoheadertitle: ["BDrepo", "bdaHeaderTitle"], + _repoicon: ["BDrepo", "bdIcon"], _repolist: ["BDrepo", "bdaSlist"], _repolink: ["BDrepo", "bdaLink"], _repolinks: ["BDrepo", "bdaLinks"], @@ -4719,7 +4720,6 @@ changelogadded: ["ChangeLog", "added"], changelogcontainer: ["ChangeLog", "container"], changelogfixed: ["ChangeLog", "fixed"], - changelogicon: ["BDFDB", "changeLogIcon"], changelogimproved: ["ChangeLog", "improved"], changelogprogress: ["ChangeLog", "added"], changelogtitle: ["ChangeLog", "title"], @@ -5231,7 +5231,7 @@ livetaglarge: ["LiveTag", "liveLarge"], livetagsmall: ["LiveTag", "liveSmall"], loadingicon: ["BDFDB", "loadingIcon"], - loadingIconWrapper: ["BDFDB", "loadingIconWrapper"], + loadingiconwrapper: ["BDFDB", "loadingIconWrapper"], loadingscreen: ["LoadingScreen", "container"], loginscreen: ["NotFound", "loginScreen"], marginbottom4: ["Margins", "marginBottom4"], @@ -7933,6 +7933,7 @@ if (BDFDB.ReactUtils.isValidElement(icon)) { icon.props.className = BDFDB.DOMUtils.formatClassName(!this.props.nativeClass && BDFDB.disCN.svgicon, icon.props.class, this.props.className); icon.props.style = Object.assign({}, icon.props.style, this.props.style); + icon.props = Object.assign({}, this.props, icon.props); return icon; } } @@ -7940,12 +7941,15 @@ } }; InternalComponents.LibraryComponents.SvgIcon.Names = { + CHANGELOG: { + icon: `` + }, CHECKMARK: { defaultProps: { width: 18, height: 18, }, - icon: `` + icon: `` }, CLOSE: { defaultProps: { @@ -8001,7 +8005,7 @@ width: 16, height: 16 }, - icon: `` + icon: `` }, RIGHT_CARET: { icon: `` @@ -8331,23 +8335,15 @@ img:not([src]), img[src=""], img[src="null"] { opacity: 0; } - - ${BDFDB.dotCN.changelogicon} { - display: inline-block; - background: currentColor; - -webkit-mask: url('data:image/svg+xml; utf8, ') center/contain no-repeat; - cursor: pointer; - margin: 0 4px 0 3px; - } - ${BDFDB.dotCN.loadingIconWrapper} { + ${BDFDB.dotCN.loadingiconwrapper} { position: absolute; bottom: 0; right: 0; z-index: 1000; animation: loadingwrapper-fade 3s infinite ease; } - ${BDFDB.dotCNS.loadingIconWrapper + BDFDB.dotCN.loadingicon} { + ${BDFDB.dotCNS.loadingiconwrapper + BDFDB.dotCN.loadingicon} { margin: 0 5px; } @keyframes loadingwrapper-fade { @@ -9116,16 +9112,19 @@ if (BDFDB.ObjectUtils.toArray(BDFDB.myPlugins).some(n => n == data)) { let children, index; if (data.changelog) { - [children, index] = BDFDB.ReactUtils.findChildren(e.returnvalue, {props: [["className", BDFDB.disCN._repoversion]]}); - if (index > -1) children[index].props.children = [children[index].props.children, BDFDB.ReactUtils.createElement(InternalComponents.LibraryComponents.TooltipContainer, { - text: BDFDB.LanguageUtils.LanguageStrings.CHANGE_LOG, - children: BDFDB.ReactUtils.createElement("span", { - className: BDFDB.disCN.changelogicon, - children: " ", - style: {whiteSpace: "pre"}, - onClick: _ => {BDFDB.PluginUtils.openChangeLog(data);} + [children, index] = BDFDB.ReactUtils.findChildren(e.returnvalue, {props: [["className", BDFDB.disCN._repocontrols]]}); + if (index > -1) children[index].props.children.unshift(BDFDB.ReactUtils.createElement("div", { + className: BDFDB.disCN._repocontrolsbutton, + children: BDFDB.ReactUtils.createElement(InternalComponents.LibraryComponents.TooltipContainer, { + text: BDFDB.LanguageUtils.LanguageStrings.CHANGE_LOG, + children: BDFDB.ReactUtils.createElement(InternalComponents.LibraryComponents.SvgIcon, { + name: InternalComponents.LibraryComponents.SvgIcon.Names.CHANGELOG, + color: "#FFFFFF", + className: BDFDB.disCN._repoicon, + onClick: _ => {BDFDB.PluginUtils.openChangeLog(data);} + }) }) - })]; + })); } [children, index] = BDFDB.ReactUtils.findChildren(e.returnvalue, {props: [["className", BDFDB.disCN._repofooter]]}); if (index == -1) { diff --git a/Plugins/BDFDB.min.js b/Plugins/BDFDB.min.js index 3558b6150f..67a07d3ee2 100644 --- a/Plugins/BDFDB.min.js +++ b/Plugins/BDFDB.min.js @@ -1 +1 @@ -(a=>{if(window['BDFDB']&&window['BDFDB']['ListenerUtils']&&typeof window['BDFDB']['ListenerUtils']['remove']=='function')window['BDFDB']['ListenerUtils']['remove'](window['BDFDB']);if(window['BDFDB']&&window['BDFDB']['StoreChangeUtils']&&typeof window['BDFDB']['StoreChangeUtils']['remove']=='function')window['BDFDB']['StoreChangeUtils']['remove'](window['BDFDB']);if(window['BDFDB']&&window['BDFDB']['ObserverUtils']&&typeof window['BDFDB']['ObserverUtils']['disconnect']=='function')window['BDFDB']['ObserverUtils']['disconnect'](window['BDFDB']);if(window['BDFDB']&&window['BDFDB']['ModuleUtils']&&typeof window['BDFDB']['ModuleUtils']['unpatch']=='function')window['BDFDB']['ModuleUtils']['unpatch'](window['BDFDB']);if(window['BDFDB']&&window['BDFDB']['WindowUtils']&&typeof window['BDFDB']['WindowUtils']['closeAll']=='function')window['BDFDB']['WindowUtils']['closeAll'](window['BDFDB']);if(window['BDFDB']&&window['BDFDB']['WindowUtils']&&typeof window['BDFDB']['WindowUtils']['removeListener']=='function')window['BDFDB']['WindowUtils']['removeListener'](window['BDFDB']);const b={'myPlugins':Object['assign']({},window['BDFDB']&&window['BDFDB']['myPlugins']),'InternalData':Object['assign']({'pressedKeys':[],'mousePosition':{'pageX':0x0,'pageY':0x0},'componentPatchQueries':{}},window['BDFDB']&&window['BDFDB']['InternalData'],{'creationTime':performance['now']()}),'BDv2Api':window['BDFDB']&&window['BDFDB']['BDv2Api']||undefined,'name':'BDFDB'};const c={'name':'BDFDB','patchPriority':0x0};const d=Math['round'](Math['random']()*0x2386f26fc10000);b['InternalData']['loadId']=d;if(typeof Array['prototype']['flat']!='function')Array['prototype']['flat']=function(){return this;};c['defaults']={'settings':{'showToasts':{'value':!![],'description':'Show\x20Plugin\x20start\x20and\x20stop\x20Toasts'},'showSupportBadges':{'value':!![],'description':'Show\x20little\x20Badges\x20for\x20Users\x20who\x20support\x20my\x20Patreon'}}};b['LogUtils']={};b['LogUtils']['log']=function(y,z){console['log']('%c['+(typeof z=='string'&&z||'BDFDB')+']','color:\x20#3a71c1;\x20font-weight:\x20700;',(typeof y=='string'&&y||'')['trim']());};b['LogUtils']['warn']=function(y,z){console['warn']('%c['+(typeof z=='string'&&z||'BDFDB')+']','color:\x20#3a71c1;\x20font-weight:\x20700;',(typeof y=='string'&&y||'')['trim']());};b['LogUtils']['error']=function(y,z){console['error']('%c['+(typeof z=='string'&&z||'BDFDB')+']','color:\x20#3a71c1;\x20font-weight:\x20700;','Fatal\x20Error:\x20'+(typeof y=='string'&&y||'')['trim']());};b['LogUtils']['log']('Loading\x20library.');b['PluginUtils']={};b['PluginUtils']['init']=function(y){y['name']=y['name']||(typeof y['getName']=='function'?y['getName']():null);y['version']=y['version']||(typeof y['getVersion']=='function'?y['getVersion']():null);y['author']=y['author']||(typeof y['getAuthor']=='function'?y['getAuthor']():null);y['description']=y['description']||(typeof y['getDescription']=='function'?y['getDescription']():null);c['clearStartTimeout'](y);let z=b['LanguageUtils']['LibraryStringsFormat']('toast_plugin_started','v'+y['version']);b['LogUtils']['log'](z,y['name']);if(!b['BDUtils']['getSettings']('fork-ps-2')&&b['DataUtils']['get'](b,'settings','showToasts'))b['NotificationUtils']['toast'](y['name']+'\x20'+z,{'nopointer':!![],'selector':'plugin-started-toast'});let A=typeof y['getRawUrl']=='function'&&typeof y['getRawUrl']()=='string'?y['getRawUrl']():'https://mwittrien.github.io/BetterDiscordAddons/Plugins/'+y['name']+'/'+y['name']+'.plugin.js';b['PluginUtils']['checkUpdate'](y['name'],A);if(b['ObjectUtils']['is'](y['classes']))c['addPluginClasses'](y);if(typeof y['initConstructor']==='function')b['TimeUtils']['suppress'](y['initConstructor']['bind'](y),'Could\x20not\x20initiate\x20constructor!',y['name'])();if(typeof y['css']==='string')b['DOMUtils']['appendLocalStyle'](y['name'],y['css']);c['patchPlugin'](y);c['addSpecialListeners'](y);b['PluginUtils']['translate'](y);b['PluginUtils']['checkChangeLog'](y);if(!window['PluginUpdates']||typeof window['PluginUpdates']!=='object')window['PluginUpdates']={'plugins':{}};window['PluginUpdates']['plugins'][A]={'name':y['name'],'raw':A,'version':y['version']};if(typeof window['PluginUpdates']['interval']==='undefined')window['PluginUpdates']['interval']=b['TimeUtils']['interval'](B=>{b['PluginUtils']['checkAllUpdates']();},0x3e8*0x3c*0x3c*0x2);y['started']=!![];delete y['stopping'];for(let B in b['myPlugins'])if(!b['myPlugins'][B]['started']&&typeof b['myPlugins'][B]['initialize']=='function')setImmediate(C=>{b['TimeUtils']['suppress'](b['myPlugins'][B]['initialize']['bind'](b['myPlugins'][B]),'Could\x20not\x20initiate\x20plugin!',B)();});};b['PluginUtils']['clear']=function(y){c['clearStartTimeout'](y);delete b['myPlugins'][y['name']];let z=b['LanguageUtils']['LibraryStringsFormat']('toast_plugin_stopped','v'+y['version']);b['LogUtils']['log'](z,y['name']);if(!b['BDUtils']['getSettings']('fork-ps-2')&&b['DataUtils']['get'](b,'settings','showToasts'))b['NotificationUtils']['toast'](y['name']+'\x20'+z,{'nopointer':!![],'selector':'plugin-stopped-toast'});let A=typeof y['getRawUrl']=='function'&&typeof y['getRawUrl']()=='string'?y['getRawUrl']():'https://mwittrien.github.io/BetterDiscordAddons/Plugins/'+y['name']+'/'+y['name']+'.plugin.js';if(b['ObjectUtils']['is'](y['classes']))c['removePluginClasses'](y);if(typeof y['css']==='string')b['DOMUtils']['removeLocalStyle'](y['name']);b['ModuleUtils']['unpatch'](y);b['ListenerUtils']['remove'](y);b['StoreChangeUtils']['remove'](y);b['ObserverUtils']['disconnect'](y);b['WindowUtils']['closeAll'](y);b['WindowUtils']['removeListener'](y);for(let B in b['InternalData']['componentPatchQueries'])b['ArrayUtils']['remove'](b['InternalData']['componentPatchQueries'][B]['query'],y,!![]);for(let C of document['querySelectorAll']('.'+y['name']+'-modal,\x20.'+y['name']['toLowerCase']()+'-modal,\x20.'+y['name']+'-settingsmodal,\x20.'+y['name']['toLowerCase']()+'-settingsmodal')){let D=C['querySelector'](b['dotCN']['modalclose']);if(D)D['click']();}delete b['DataUtils']['cached'][y['name']];delete window['PluginUpdates']['plugins'][A];delete y['started'];b['TimeUtils']['timeout'](E=>{delete y['stopping'];});};b['PluginUtils']['translate']=function(y){y['labels']={};if(typeof y['setLabelsByLanguage']==='function'||typeof y['changeLanguageStrings']==='function'){if(document['querySelector']('html')['lang'])z();else{let A=b['TimeUtils']['interval'](B=>{if(document['querySelector']('html')['lang']){b['TimeUtils']['clear'](A);z();}},0x64);}function z(){let B=b['LanguageUtils']['getLanguage']();if(typeof y['setLabelsByLanguage']==='function')y['labels']=y['setLabelsByLanguage'](B['id']);if(typeof y['changeLanguageStrings']==='function')y['changeLanguageStrings']();b['LogUtils']['log'](b['LanguageUtils']['LibraryStringsFormat']('toast_plugin_translated',B['ownlang']),y['name']);}}};b['PluginUtils']['checkUpdate']=function(y,z){if(y&&z)return new Promise(A=>{j['request'](z,(B,C,D)=>{if(B)return A(null);let E=D['match'](/['"][0-9]+\.[0-9]+\.[0-9]+['"]/i);if(!E)return A(null);if(b['NumberUtils']['getVersionDifference'](E[0x0],window['PluginUpdates']['plugins'][z]['version'])>0.2){b['NotificationUtils']['toast'](y+'\x20will\x20be\x20force\x20updated,\x20because\x20your\x20version\x20is\x20heavily\x20outdated.',{'type':'warn','nopointer':!![],'selector':'plugin-forceupdate-toast'});b['PluginUtils']['downloadUpdate'](y,z);return A(0x2);}else if(b['NumberUtils']['compareVersions'](E[0x0],window['PluginUpdates']['plugins'][z]['version'])){b['PluginUtils']['showUpdateNotice'](y,z);return A(0x1);}else{b['PluginUtils']['removeUpdateNotice'](y);return A(0x0);}});});return new Promise(A=>{callback(null);});};b['PluginUtils']['checkAllUpdates']=function(){return new Promise(y=>{let z=0x0,A=0x0;for(let B in window['PluginUpdates']['plugins']){let C=window['PluginUpdates']['plugins'][B];if(C)b['PluginUtils']['checkUpdate'](C['name'],C['raw'])['then'](D=>{z++;if(D==0x1)A++;if(z>=Object['keys'](window['PluginUpdates']['plugins'])['length'])y(A);});}});};b['PluginUtils']['showUpdateNotice']=function(y,z){if(!y||!z)return;let A=document['querySelector']('#pluginNotice');if(!A){A=b['NotificationUtils']['notice']('The\x20following\x20plugins\x20need\x20to\x20be\x20updated: ',{'html':!![],'id':'pluginNotice','type':'info','btn':!b['BDUtils']['isAutoLoadEnabled']()?'Reload':'','customicon':''});A['style']['setProperty']('display','block','important');A['style']['setProperty']('visibility','visible','important');A['style']['setProperty']('opacity','1','important');A['querySelector'](b['dotCN']['noticedismiss'])['addEventListener']('click',C=>{b['DOMUtils']['remove']('.update-clickme-tooltip');});let B=A['querySelector'](b['dotCN']['noticebutton']);if(B){b['DOMUtils']['toggle'](B,!![]);B['addEventListener']('click',C=>{j['electron']['remote']['getCurrentWindow']()['reload']();});B['addEventListener']('mouseenter',C=>{if(window['PluginUpdates']['downloaded'])b['TooltipUtils']['create'](B,window['PluginUpdates']['downloaded']['join'](',\x20'),{'type':'bottom','selector':'update-notice-tooltip','style':'max-width:\x20420px'});});}}if(A){let C=A['querySelector']('#outdatedPlugins');if(C&&!C['querySelector']('#'+y+'-notice')){if(C['querySelector']('span'))C['appendChild'](b['DOMUtils']['create'](',\x20'));let D=b['DOMUtils']['create'](''+y+'');D['addEventListener']('click',E=>{b['PluginUtils']['downloadUpdate'](y,z);});C['appendChild'](D);if(!document['querySelector']('.update-clickme-tooltip'))b['TooltipUtils']['create'](C,'Click\x20us!',{'type':'bottom','selector':'update-clickme-tooltip','delay':0x1f4});}}};b['PluginUtils']['removeUpdateNotice']=function(y,z=document['querySelector']('#pluginNotice')){if(!y||!z)return;let A=z['querySelector']('#outdatedPlugins');if(A){let B=A['querySelector']('#'+y+'-notice');if(B){let C=B['nextSibling'];let D=B['prevSibling'];if(C&&b['DOMUtils']['containsClass'](C,'separator'))C['remove']();else if(D&&b['DOMUtils']['containsClass'](D,'separator'))D['remove']();B['remove']();}if(!A['querySelector']('span')){let E=z['querySelector'](b['dotCN']['noticebutton']);if(E){z['querySelector']('.notice-message')['innerText']='To\x20finish\x20updating\x20you\x20need\x20to\x20reload.';b['DOMUtils']['toggle'](E,![]);}else z['querySelector'](b['dotCN']['noticedismiss'])['click']();}}};b['PluginUtils']['downloadUpdate']=function(y,z){if(!y||!z)return;j['request'](z,(A,B,C)=>{if(A)return b['LogUtils']['warn']('Unable\x20to\x20get\x20update\x20for\x20'+y);b['InternalData']['creationTime']=0x0;let D=C['match'](/['"][0-9]+\.[0-9]+\.[0-9]+['"]/i);D=D['toString']()['replace'](/['"]/g,'');j['fs']['writeFileSync'](j['path']['join'](b['BDUtils']['getPluginsFolder'](),z['split']('/')['slice'](-0x1)[0x0]),C);b['NotificationUtils']['toast'](y+'\x20v'+window['PluginUpdates']['plugins'][z]['version']+'\x20has\x20been\x20replaced\x20by\x20'+y+'\x20v'+D+'.',{'nopointer':!![],'selector':'plugin-updated-toast'});let E=document['querySelector']('#pluginNotice');if(E){if(E['querySelector'](b['dotCN']['noticebutton'])){window['PluginUpdates']['plugins'][z]['version']=D;if(!window['PluginUpdates']['downloaded'])window['PluginUpdates']['downloaded']=[];if(!window['PluginUpdates']['downloaded']['includes'](y))window['PluginUpdates']['downloaded']['push'](y);}b['PluginUtils']['removeUpdateNotice'](y,E);}});};b['PluginUtils']['checkChangeLog']=function(y){if(!b['ObjectUtils']['is'](y)||!y['changelog'])return;let z=b['DataUtils']['load'](y,'changelog');if(!z['currentversion']||b['NumberUtils']['compareVersions'](y['version'],z['currentversion'])){z['currentversion']=y['version'];b['DataUtils']['save'](z,y,'changelog');b['PluginUtils']['openChangeLog'](y);}};b['PluginUtils']['openChangeLog']=function(y){if(!b['ObjectUtils']['is'](y)||!y['changelog'])return;let z='',A={'added':'New\x20Features','fixed':'Bug\x20Fixes','improved':'Improvements','progress':'Progress'};for(let B in y['changelog']){B=B['toLowerCase']();let C=b['disCN']['changelog'+B];if(C){z+='