All user data for FoundryVTT. Includes worlds, systems, modules, and any asset in the "foundryuserdata" directory. Does NOT include the FoundryVTT installation itself.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

157 lines
5.8 KiB

class TheRipperPremiumHUB {
constructor() {
this.outdatedModules = {};
this.announcementsHtml = ""
this._debug = false;
this.init();
}
async init() {
this.moduleData = await this.fetchData();
this.announcements = this.moduleData.announcements;
delete this.moduleData.announcements;
this.getOutdatedModules();
if (game.settings.get("theripper-premium-hub", "autoCheck")) {
this.displayOutdated(false);
}
this.displayAnnouncements();
}
getOutdatedModules() {
const checkDisabled = game.settings.get(
"theripper-premium-hub",
"checkDisabled"
);
for (let [k, v] of Object.entries(this.moduleData)) {
const installedModule = game.modules.get(k);
if(!installedModule) continue;
if (!checkDisabled && !installedModule?.active) continue;
if (isNewerVersion(v.version, installedModule.version) || this._debug) {
this.outdatedModules[k] = v;
this.outdatedModules[k].title = installedModule.title;
this.outdatedModules[k].currentVersion = installedModule.version;
}
}
}
async displayOutdated(notify = false) {
if (Object.keys(this.outdatedModules).length === 0)
return notify
? ui.notifications.info(`No outdated modules found.`)
: null;
let displayUpdated = {}
if(!notify) {
const viewedUpdates = game.settings.get("theripper-premium-hub", "viewedUpdates");
for(let [k, v] of Object.entries(this.outdatedModules)) {
if(viewedUpdates[k] && v.version === viewedUpdates[k]) continue;
displayUpdated[k] = v;
}
}else{
displayUpdated = this.outdatedModules;
}
if (Object.keys(displayUpdated).length === 0) return null;
const html = await renderTemplate(
"modules/theripper-premium-hub/templates/modlist.hbs",
displayUpdated
);
Dialog.prompt({
title: "TheRipper93 Premium HUB - Updates Available!",
content: html,
rejectClose: false,
callback: () => {
const viewedUpdates = game.settings.get("theripper-premium-hub", "viewedUpdates");
for(let [k, v] of Object.entries(this.outdatedModules)){
viewedUpdates[k] = v.version;
}
game.settings.set("theripper-premium-hub", "viewedUpdates", viewedUpdates);
},
close: () => {},
});
}
async displayAnnouncements() {
const announcements = this.announcements;
if (!announcements) return;
const ids = Object.keys(announcements);
const viewedAnnouncements = game.settings.get("theripper-premium-hub", "viewedAnnouncements") ?? "";
const allViewed = ids.every(id => viewedAnnouncements.includes(id));
const html = await renderTemplate(
"modules/theripper-premium-hub/templates/announcements.hbs",
announcements
);
this.announcementsHtml = html;
if (allViewed && !this._debug) return;
game.settings.set("theripper-premium-hub", "viewedAnnouncements", ids.join(","));
Dialog.prompt({
title: "TheRipper93 Premium HUB - Announcement!",
content: html + ` <p style="text-align: center;">Want to support me and get access to premium modules?</p><hr>
<p style="text-align: center;"><a href="https://theripper93.com/" target="_blank" rel="nofollow" title="https://theripper93.com/">Check out my Website</a></p>`,
rejectClose: false,
callback: () => {},
close: () => {},
});
}
async fetchData() {
return await fetch(
`https://api.theripper93.com/moduleListing/latest`, { cache: "no-cache" }
)
.then((response) => response.json())
.then((data) => data);
}
_getdataforfile() {
const mods = {};
game.modules.forEach((v, k) => {
if(v.authors && v.authors.some(a => a.name === "theripper93") && (!v.data?.download || v.data?.url === "https://github.com/theripper93/name")){
mods[k] = {
title: v.title,
version: v.version,
downloadURL: this.moduleData[k]?.downloadURL ?? ""
};
}
});
return mods;
}
getDependencies(moduleId) {
const rootModule = game.modules.get(moduleId);
const dependencies = new Set();
const addDependecies = (module) => {
const moduleDependencies = Array.from(module.relationships.requires).map((m) => game.modules.get(m.id));
moduleDependencies.forEach((m) => {
dependencies.add(m);
addDependecies(m);
});
};
addDependecies(rootModule);
return dependencies;
}
async troubleshoot(moduleId) {
console.log(moduleId);
const confirm = await Dialog.confirm({
title: "TheRipper93 Premium HUB - Troubleshoot",
content: `<p>Do you want to start the troubleshoot for ${game.modules.get(moduleId).title}?</p><br><p>This will disable all modules except the one you selected and its dependencies. You will be prompted to restore your modules after the troubleshoot.</p>`,
yes: () => {
return true;
},
no: () => {
return false;
},
});
if (!confirm) return;
const dependencies = this.getDependencies(moduleId);
const dependenciesIds = [...Array.from(dependencies).map((m) => m.id) ,moduleId,"theripper-premium-hub"];
const modulesSetting = game.settings.get("core", ModuleManagement.CONFIG_SETTING);
const currentlyEnabled = [];
for (let [k, v] of Object.entries(modulesSetting)) {
if (v) currentlyEnabled.push(k);
if (dependenciesIds.includes(k)) continue;
modulesSetting[k] = false;
}
await game.settings.set("theripper-premium-hub", "prevEnabledModules", currentlyEnabled);
await game.settings.set("core", ModuleManagement.CONFIG_SETTING, modulesSetting);
debouncedReload();
}
}