159 lines
7.3 KiB
JavaScript
159 lines
7.3 KiB
JavaScript
// ==UserScript==
|
|
// @name Travel picker - Autopilot quest helpers tool
|
|
// @match https://www.dofuspourlesnoobs.com/*
|
|
// @match https://www.dofus.com/*
|
|
// @match https://dofus.jeuxonline.info/*
|
|
// @match https://www.gamosaurus.com/jeux/dofus/*
|
|
// @match https://dofus-map.com/*
|
|
// @match https://dofus-portals.fr/*
|
|
// @version 1.2.3
|
|
// @author BoBobby
|
|
// @description Permet de rendre cliquable toutes les positions [x,y] indiquées sur les sites dofuspourlesnoobs/dofus.jeuxonline.com/gamosaurus et dofus-map. Copie automatiquement /travel x,y lors des chasses sur dofus-map.com/hunt
|
|
// ==/UserScript==
|
|
const _settings = {
|
|
travelCommand: '/travel ',
|
|
popupTextStyle: 'color: white; font-size: 1.3em',
|
|
popupDivStyle: 'display: inline-block; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); border-radius: 5px; background-color: #5FE026; border: solid 1px #46A31D; padding: 5px 15px; transition: opacity 1s ease-in-out; transition-delay: 1s; z-index: 9999999;',
|
|
textareaStyle: 'position: fixed; top: 0; left: 0; width: 2em; height: 2em; padding: 0; border: none; outline: none; boxShadow: none; background: transparent;',
|
|
colors: {
|
|
success: {
|
|
background: '#5FE026',
|
|
border: '#46A31D'
|
|
},
|
|
error: {
|
|
background: '#C70039',
|
|
border: '#992144'
|
|
}
|
|
}
|
|
|
|
}
|
|
const parameters = new URLSearchParams(window.location.search)
|
|
const displayPopup = (prmText, prmStatus) => {
|
|
let popupDiv = document.createElement('div')
|
|
let popupText = document.createElement('p')
|
|
popupText.setAttribute('style', _settings.popupTextStyle)
|
|
popupDiv.setAttribute('style', _settings.popupDivStyle)
|
|
if (!prmStatus || prmStatus === 'success') {
|
|
popupDiv.style.borderColor = _settings.colors.success.border
|
|
popupDiv.style.backgroundColor = _settings.colors.success.background
|
|
} else {
|
|
popupDiv.style.borderColor = _settings.colors.error.border
|
|
popupDiv.style.backgroundColor = _settings.colors.error.background
|
|
}
|
|
|
|
popupText.textContent = prmText
|
|
popupDiv.appendChild(popupText)
|
|
document.body.appendChild(popupDiv)
|
|
window.setTimeout(_ => {
|
|
popupDiv.style.opacity = 0
|
|
window.setTimeout(_ => {
|
|
popupDiv.parentNode.removeChild(popupDiv)
|
|
}, 3000)
|
|
}, 50)
|
|
}
|
|
|
|
const copyTextToClipboard = (prmText, prmStatus) => {
|
|
let textArea = document.createElement("textarea");
|
|
|
|
textArea.setAttribute('style', _settings.textareaStyle)
|
|
|
|
textArea.value = prmText;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
let successful = document.execCommand('copy');
|
|
let msg = successful ? 'successful' : 'unsuccessful';
|
|
if (successful) displayPopup(prmText + ' a bien été copié !', prmStatus ? prmStatus : 'success')
|
|
else displayPopup(msg, prmStatus ? prmStatus : 'error')
|
|
} catch (err) {}
|
|
document.body.removeChild(textArea);
|
|
}
|
|
|
|
const getPositionArray = prmString => {
|
|
const rule = /[-]?[0-9]{1,2}/g
|
|
return prmString.match(rule)
|
|
}
|
|
|
|
if (!window.location.href.includes('dofus-map')) {
|
|
(() => {
|
|
const match = /(?<!\(.*)[\[]?(\s)*(-)?([0-9]+)[\s]*,[\s]*(-)?([0-9]+)[\s]*[\]]?(?!\))/g
|
|
document.body.innerHTML = document.body.innerHTML.replace(match, "<goto data-x=\"$2$3\" data-y=\"$4$5\">$1[$2$3,$4$5]</goto>");
|
|
|
|
const allGotos = document.getElementsByTagName('goto');
|
|
for (let i = 0; i < allGotos.length; i++) {
|
|
allGotos[i].addEventListener('click', event => {
|
|
if (event.target.getAttribute('data-x') !== null && event.target.getAttribute('data-y') !== null && !isNaN(event.target.getAttribute('data-x').replace('-', '')) && !isNaN(event.target.getAttribute('data-y').replace('-', ''))) {
|
|
copyTextToClipboard(_settings.travelCommand + event.target.getAttribute('data-x') + ',' + event.target.getAttribute('data-y'))
|
|
} else {
|
|
displayPopup('Cette coordonnée n\'est pas compatible :(', 'error')
|
|
}
|
|
|
|
})
|
|
allGotos[i].addEventListener('contextmenu', event => {
|
|
event.preventDefault()
|
|
if (event.target.getAttribute('data-x') !== null && event.target.getAttribute('data-y') !== null && !isNaN(event.target.getAttribute('data-x').replace('-', '')) && !isNaN(event.target.getAttribute('data-y').replace('-', ''))) {
|
|
/**
|
|
* Ajouter ?noob à la fin de l'url pour que le message copié soit simplement la position [x,y] au lieu de la commande /travel x,y, pour les noobs qui n'ont pas l'autopilot
|
|
*/
|
|
copyTextToClipboard((parameters.has('noob') ? '/p ' : '') + '[' + event.target.getAttribute('data-x') + ',' + event.target.getAttribute('data-y') + ']')
|
|
} else {
|
|
displayPopup('Cette coordonnée n\'est pas compatible :(', 'error')
|
|
}
|
|
})
|
|
}
|
|
|
|
})()
|
|
} else if (window.location.href.includes('hunt')) {
|
|
console.log('Dofus-Map Hunt detected')
|
|
const result = document.getElementById('secondLine')
|
|
let observer = new MutationObserver(mutations => {
|
|
mutations.forEach(mutation => {
|
|
if (mutation.addedNodes.length) {
|
|
const position = getPositionArray(result.innerHTML.replace( /(<([^>]+)>)/ig, '').replace(';', ',').replace(/\s/g, ''))
|
|
if(position && position.length === 2) {
|
|
if (parameters.has('noob')) {
|
|
/**
|
|
* Ajouter ?noob à la fin de l'url pour que le message copié soit simplement la position [x,y] au lieu de la commande /travel x,y, pour les noobs qui n'ont pas l'autopilot
|
|
*/
|
|
copyTextToClipboard('/p [' + position[0] + ',' + position[1] + ']')
|
|
} else {
|
|
copyTextToClipboard(_settings.travelCommand + position[0] + ',' + position[1])
|
|
}
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
observer.observe(result, {
|
|
childList: true
|
|
})
|
|
} else {
|
|
console.log('Dofus-Map detected')
|
|
const result = document.getElementById('mapCoordinates');
|
|
const mapElement = document.getElementById('mapContainer')
|
|
|
|
mapElement.addEventListener('mousedown', mousedownEvent => {
|
|
/**
|
|
* Détecte si on a déplacé la map pour éviter de copier des positions non souhaitées
|
|
*/
|
|
let moved = false
|
|
mapElement.addEventListener('mousemove', moveEvent => moved = true)
|
|
mapElement.addEventListener('mouseup', mouseupEvent => {
|
|
const position = getPositionArray(result.innerHTML)
|
|
|
|
if (position && position.length === 2 && !moved) {
|
|
if (parameters.has('noob')) {
|
|
/**
|
|
* Ajouter ?noob à la fin de l'url pour que le message copié soit simplement la position [x,y] au lieu de la commande /travel x,y, pour les noobs qui n'ont pas l'autopilot
|
|
*/
|
|
copyTextToClipboard('/p [' + position[0] + ',' + position[1] + ']')
|
|
} else {
|
|
copyTextToClipboard(_settings.travelCommand + position[0] + ',' + position[1])
|
|
}
|
|
}
|
|
})
|
|
})
|
|
} |