diff --git a/scripts/api.js b/scripts/api.js index 073ae55..1144575 100644 --- a/scripts/api.js +++ b/scripts/api.js @@ -9,10 +9,12 @@ export class api { static globals () { globalThis.swadeMBHelpers = { DEBUG: true, - runOnTargetOrSelectedTokens: helpers.runOnTargetOrSelectedTokens, createEffectDocument: helpers.createEffectDocument, createMutationWithEffect: helpers.createMutationWithEffect, - defaultMutationOptions: helpers.defaultMutationOptions + defaultMutationOptions: helpers.defaultMutationOptions, + getActorFolderByPath: helpers.getActorFolderByPath, + getActorsInFolder: helpers.getActorsInFolder, + runOnTargetOrSelectedTokens: helpers.runOnTargetOrSelectedTokens } } } diff --git a/scripts/helpers.js b/scripts/helpers.js index 7e31295..a194193 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -49,4 +49,44 @@ export class helpers { } return mutateOptions } + + static getActorFolderByPath (path) { + const names = path.split('/') + if (names[0] === '') { + names.shift() + } + let name = names.shift() + let folder = game.folders.find(f => f.name === name && !f.folder) + while (names.length > 0) { + name = names.shift() + folder = folder.children.find(c => c.folder.name === name) + folder = folder.folder + } + return folder + } + + static getActorsInFolder (inFolder) { + const prefixStack = [''] + const actors = {} + const folderStack = [inFolder] + + while (folderStack.length > 0) { + const prefix = prefixStack.shift() + const folder = folderStack.shift() + for (const actor of folder.contents) { + if ( + game.user.isGM || actor.testUserPermission( + game.user, foundry.CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER) + ) { + actors[`${prefix}${actor.name}`] = actor + } + } + for (const child of folder.children) { + const newPrefix = `${prefix}${child.folder.name} | ` + prefixStack.push(newPrefix) + folderStack.push(child.folder) + } + } + return actors + } }