// Github: https://github.com/shdwjk/Roll20API/blob/master/NoteLog/NoteLog.js
// By: The Aaron, Arcane Scriptomancer
// Contact: https://app.roll20.net/users/104025/the-aaron
const NoteLog = (() => {
let version = '0.1.3',
lastUpdate = 1576528439,
schemaVersion = 0.1,
noteLogName = 'Log',
bulletChar = '•',
defaults = {
expandlinks: true,
logname: 'Log'
},
createNoteLog = function() {
const noteLog = createObj('handout',{
name: noteLogName
});
noteLog.set('notes', '
Log
');
return noteLog;
},
getNoteLog = function() {
const noteLog = filterObjs(function(o){
return ( 'handout' === o.get('type') && noteLogName === o.get('name') && false === o.get('archived'));
})[0];
if(noteLog) {
return noteLog;
}
return createNoteLog();
},
checkInstall = function() {
log('-=> NoteLog v'+version+' <=- ['+(new Date(lastUpdate*1000))+']');
if( ! _.has(state,'NoteLog') || state.NoteLog.version !== schemaVersion) {
log(' > Updating Schema to v'+schemaVersion+' <');
state.NoteLog = {
version: schemaVersion
};
}
},
getAsBoolean = function(val,defVal){
let isTrue = _.isBoolean(val) ? val : _.contains(['on','yes','y','true'],(`${val}`||'true').toLowerCase()),
isFalse = _.isBoolean(val) ? !val : _.contains(['off','no','n','false'],(`${val}`||'true').toLowerCase());
if(isTrue || isFalse){
return !isFalse;
}
return !_.isUndefined(defVal) ? defVal : val;
},
getAsText = function(val, defVal) {
return (_.isString(val) && val.length) ? val : defVal;
},
parseOptions = function(cmdOpts){
return _.chain((cmdOpts||'').replace(/((?:\\.|[^|])*)\|/g,'$1\n').replace(/\\/,'').split(/\n/))
.filter((a)=>a.length)
.reduce((m,o)=>{
let tok=o.split(/(?:%%|:)/),
c=tok.shift().toLowerCase(),
a=tok.join(':')||true;
switch(c){
case 'logname':
a=getAsText(a,defaults[c]);
break;
case 'expandlinks':
a=getAsBoolean(a,defaults[c]);
break;
}
m[c]=a;
return m;
},_.clone(defaults))
.value();
},
handleInput = function(msg_orig) {
let args,
nl,
longtext,
msg = _.clone(msg_orig);
if (msg.type !== "api" || !playerIsGM(msg.playerid)) {
return;
}
if(_.has(msg,'inlinerolls')){
msg.content = _.chain(msg.inlinerolls)
.reduce(function(m,v,k){
let 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();
}
args = msg.content.split(/\s/);
switch(args.shift()) {
case '!note-text':
longtext=msg.content
.replace(/^!note-text\b\s*/,'')
.replace(/(\{\{([\s\S]*?)\}\})/g," $2 ")
.trim();
nl = getNoteLog();
nl.get('notes', function(n){
if(!_.isNull(n)){
setTimeout(function(){
let text=n+'
'+longtext;
nl.set('notes',text);
},0);
}
});
break;
case '!note-log':
nl = getNoteLog();
nl.get('notes', function(n){
if(!_.isNull(n)){
setTimeout(function(){
let text=n+'
'+bulletChar+' '+args.join(' ');
nl.set('notes',text);
},0);
}
});
break;
}
},
registerEventHandlers = function() {
on('chat:message', handleInput);
};
return {
CheckInstall: checkInstall,
RegisterEventHandlers: registerEventHandlers
};
})();
on('ready',function() {
'use strict';
NoteLog.CheckInstall();
NoteLog.RegisterEventHandlers();
});