Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update for roll20 iframe character sheets #2

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 51 additions & 20 deletions Roll20-Character-Switcher.user.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,44 @@
// @name Roll20 Character Switcher
// @namespace de.idrinth
// @homepage https://github.com/Idrinth/Roll20-Character-Switcher
// @version 1.2.0
// @version 1.3.0
// @description Switches the chatting character to the one whose sheet or macro you clicked on
// @author Idrinth, KingMarth
// @author Idrinth, KingMarth, TransLunarInjection
// @match https://app.roll20.net/editor/
// @grant none
// ==/UserScript==

(function() {
'use strict';
var charswitcher = function(event) {
var charswitcher = function(event, frame) {
var e = window.event || event;
if (e.target.tagName !== 'BUTTON') {
return;
}
var id='';
if(e.target.hasAttribute('type') && e.target.getAttribute('type') === 'roll') {
var character = e.target;
while (!character.hasAttribute('data-characterid')) {
if(!character.parentNode) {
return;

function findAttrInParentsOrFrameParents(originalTarget, attr) {
var target = originalTarget;
var usedFrame = false;
while (!target.hasAttribute(attr)) {
target = target.parentNode;
if (!target || !target.hasAttribute) {
if (!frame || usedFrame) {
console.error("Couldn't find attr %o in %o or %o", attr, originalTarget, frame);
return;
}
target = frame;
usedFrame = true;
}
character = character.parentNode;
}
id = 'character|' + character.getAttribute('data-characterid');
return target.getAttribute(attr);
}

if(e.target.hasAttribute('type') && e.target.getAttribute('type') === 'roll') {
console.debug("Looks like a roll for %o", e.target);
id = 'character|' + findAttrInParentsOrFrameParents(e.target, 'data-characterid');
} else if(e.target.hasAttribute('class') && e.target.getAttribute('class') === 'btn') {
var macro = e.target;
while (!macro.hasAttribute('data-macroid')) {
if(!macro.parentNode) {
return;
}
macro = macro.parentNode;
}
id = 'character|' + (macro.getAttribute('data-macroid')).split('|')[0];
id = 'character|' + findAttrInParentsOrFrameParents(e.target, 'data-macroid');
}
if(!id) {
return;
Expand All @@ -47,6 +52,32 @@
}
}
};
document.getElementsByTagName('body')[0].addEventListener('mousedown', charswitcher);
document.getElementsByClassName('tokenactions')[0].addEventListener('mousedown', charswitcher);

function addCharSwitcher(doc, frame) {
function callback(evt) {
charswitcher(evt, frame);
}
doc.body.addEventListener('mousedown', callback);
var tokenActions = doc.getElementsByClassName('tokenactions')[0];
if (tokenActions) {
tokenActions.addEventListener('mousedown', callback);
}

var observer = new MutationObserver(function(mutations) {
for(const mutation of mutations) {
if (!mutation.addedNodes) continue;
for (const added of mutation.addedNodes) {
if (added.tagName === 'IFRAME') {
added.addEventListener("load", function() {
addCharSwitcher(added.contentWindow.document, added);
});
}
}

}
});

observer.observe(doc, {attributes: false, childList: true, characterData: false, subtree:true});
}
addCharSwitcher(document);
})();