// ModifyTokenImage v1.0.3
// By: Zachare Sylvestre
// Concept was based on ChangeTokenImage but utilizes the Handout Repository, which allows for a little more robust look for tokens.
var ModifyTokenImage = ModifyTokenImage || (function() {
'use strict';
var version = '1.0.3';
var isGmRestricted = true;
var outputDebug = false;
var setIsGmRestricted = function() {
isGmRestricted = !isGmRestricted;
};
var showHelp = function(msg) {
logDebugOutput('showHelp');
whisperTalker(msg, '
'
+ '
ModifyTokenImage v' + version + '
' +
+ 'This API addon allows you to change the current token image to a specific one.'
+ '
'
+ '
Setup:'
+ '
There must be a folder named "Token Images" located in the Journal. For each token you want to enable this functionality, it must have its own folder named under the same name as the token.
'
+ '
Commands'
+ '
!ModifyTokenImage --next
Sets the next Token Image for the selected token.
'
+ '
!ModifyTokenImage --previous
Sets the previous Token Image for the selected token.
'
+ '
!ModifyTokenImage --set HandoutName
Sets the Token Image for the selected token to the Handout image specified in HandoutName.
'
+ '
');
};
var getTokenImageFolder = function() {
logDebugOutput("getTokenImageFolder");
var journalFolder = JSON.parse(Campaign().get("_journalfolder"));
var tokenImageFolder = null;
_.each(journalFolder, function(folder) {
if (folder.n == "Token Images") {
tokenImageFolder = folder;
}
});
return tokenImageFolder;
}
var getTokenFolder = function(name) {
logDebugOutput("getTokenFolder");
var tokenImageFolder = getTokenImageFolder();
if (tokenImageFolder == null) {
return null;
}
var tokenFolder = null;
_.each(tokenImageFolder.i, function (folder) {
if (folder.n == name) {
tokenFolder = folder;
}
});
return tokenFolder;
};
var showCampaignFolder = function(msg) {
logDebugOutput('showCampaignFolder');
_.each(getTokenImageFolder, function(folder) {
var folderName = folder.n;
var folderItems = folder.i.length;
whisperTalker(msg, folderName + " Contains " + folderItems + " objects");
});
};
var currentDateOutput = function() {
var date = new Date();
var month = date.getMonth() + 1;
var day = date.getDate();
var hours = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
if (month < 10) { month = "0" + month; }
if (day < 10) { day = "0" + day; }
if (hours < 10) { hours = "0" + hours; }
if (minutes < 10) { minutes = "0" + minutes; }
if (seconds < 10) { seconds = "0" + seconds; }
return date.getFullYear() + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
};
var whisperTalker = function(msg, contents) {
logDebugOutput('whisperTalker');
sendChat('ModifyTokenImage', '/w ' + msg.who + ' ' + contents);
};
var logDebugOutput = function(item) {
if (!outputDebug) { return; }
log('[ModifyTokenImage:DEBUG:' + currentDateOutput() + '] ' + item);
};
var logOutput = function(item) {
log('[ModifyTokenImage:' + currentDateOutput() + '] ' + item);
};
var getCleanImagesrc = function (imgsrc) {
var parts = imgsrc.match(/(.*\/images\/.*)(thumb|med|original|max)([^?]*)(\?[^?]+)?$/);
if(parts) {
return parts[1]+'thumb'+parts[3]+(parts[4]?parts[4]:`?${Math.round(Math.random()*9999999)}`);
}
return;
};
var handleInput = function(msg) {
if (msg.type !== "api") { return; }
if (isGmRestricted && !playerIsGM(msg.playerid)) { return; }
if (_.has(msg,'inlinerolls')) {
msg.content = _.chain(msg.inlinerolls)
.reduce(function(m,v,k){
var ti=_.reduce(v.results.rolls,function(m2,v2){
if(_.has(v2,'table')){
m2.push(_.reduce(v2.results,function(m3,v3){
m3.push(v3.tableItem.name);
return m3;
},[]).join(', '));
}
return m2;
},[]).join(', ');
m['$[['+k+']]']= (ti.length && ti) || v.results.total || 0;
return m;
},{})
.reduce(function(m,v,k){
return m.replace(k,v);
},msg.content)
.value();
}
logDebugOutput(msg.content);
var args = msg.content
.replace(/