2020-08-14 11:34:14 +00:00
|
|
|
import requestCreator from './libs/requestCreator';
|
2020-08-14 11:44:23 +00:00
|
|
|
import getTranslations from './i18n/warStatsGenerator';
|
2020-08-14 11:34:14 +00:00
|
|
|
import getServer from './utils/getCurrentServer';
|
2021-01-01 17:03:36 +00:00
|
|
|
import getServerVersionCode from './utils/getServerVersionCode';
|
2021-01-03 12:13:05 +00:00
|
|
|
import * as twhelputils from './utils/twhelp';
|
2020-08-14 11:34:14 +00:00
|
|
|
import showPopup, { POPUP_SELECTOR } from './utils/showPopup';
|
|
|
|
|
|
|
|
// ==UserScript==
|
2020-08-14 11:53:56 +00:00
|
|
|
// @name War stats generator
|
2020-08-14 11:34:14 +00:00
|
|
|
// @namespace https://github.com/tribalwarshelp/scripts
|
|
|
|
// @updateURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/warStatsGenerator.js
|
|
|
|
// @downloadURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/warStatsGenerator.js
|
2021-06-12 06:21:48 +00:00
|
|
|
// @version ${version}
|
2020-08-14 11:53:56 +00:00
|
|
|
// @description War stats generator
|
2021-01-17 08:20:19 +00:00
|
|
|
// @author Kichiyaki https://dwysokinski.me/
|
2020-08-14 11:34:14 +00:00
|
|
|
// @match *://*/game.php*screen=ranking*mode=wars*
|
|
|
|
// @grant none
|
|
|
|
// @run-at document-end
|
|
|
|
// ==/UserScript==
|
|
|
|
|
|
|
|
const SERVER = getServer();
|
|
|
|
const SIDE_ONE_BUTTON_ID = 'sideOneAdd';
|
|
|
|
const SIDE_ONE_INPUT_CONTAINER_ID = 'sideOneInputs';
|
|
|
|
const SIDE_TWO_BUTTON_ID = 'sideTwoAdd';
|
|
|
|
const SIDE_TWO_INPUT_CONTAINER_ID = 'sideTwoInputs';
|
|
|
|
const TO_INPUT_ID = 'to';
|
|
|
|
const FROM_INPUT_ID = 'from';
|
|
|
|
const RESULT_CONTAINER_ID = 'warStatsResult';
|
|
|
|
const TRIBES_QUERY = `
|
|
|
|
query tribes($server: String!, $filter: TribeFilter) {
|
|
|
|
tribes(server: $server, filter: $filter) {
|
|
|
|
items {
|
|
|
|
id
|
|
|
|
tag
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
const ENNOBLEMENTS_QUERY = `
|
2020-08-16 13:49:32 +00:00
|
|
|
query ennoblements($server: String!, $sideOneFilter: EnnoblementFilter, $sideTwoFilter: EnnoblementFilter) {
|
|
|
|
sideOneEnnoblements: ennoblements(server: $server, filter: $sideOneFilter) {
|
|
|
|
total
|
|
|
|
}
|
|
|
|
sideTwoEnnoblements: ennoblements(server: $server, filter: $sideTwoFilter) {
|
2020-08-14 11:34:14 +00:00
|
|
|
total
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`;
|
2020-08-14 11:44:23 +00:00
|
|
|
const translations = getTranslations();
|
2020-08-14 11:34:14 +00:00
|
|
|
|
|
|
|
const showResult = (sideOne = 0, sideTwo = 0) => {
|
|
|
|
const html = `
|
|
|
|
<div>
|
2020-08-14 11:44:23 +00:00
|
|
|
<h3>${translations.conquers}:</h3>
|
|
|
|
<p style="margin: 0;"><strong>${
|
|
|
|
translations.sideOne
|
|
|
|
}: ${sideOne}</strong></p>
|
|
|
|
<p style="margin: 0;"><strong>${
|
|
|
|
translations.sideTwo
|
|
|
|
}: ${sideTwo}</strong></p>
|
|
|
|
<p style="margin: 0;"><strong>${translations.difference}: ${Math.abs(
|
|
|
|
sideOne - sideTwo
|
|
|
|
)}</strong></p>
|
2020-08-14 11:34:14 +00:00
|
|
|
<hr style="margin: 10px 0;" />
|
|
|
|
</div>
|
|
|
|
`;
|
|
|
|
document.querySelector('#' + RESULT_CONTAINER_ID).innerHTML = html;
|
|
|
|
};
|
|
|
|
|
2021-02-26 17:04:05 +00:00
|
|
|
const createAddTribeHandler = container => {
|
2020-08-14 11:34:14 +00:00
|
|
|
return () => {
|
|
|
|
const div = document.createElement('div');
|
|
|
|
div.innerHTML = `
|
2020-08-14 11:44:23 +00:00
|
|
|
<label>${translations.tribeTag}: </label>
|
2020-08-14 11:34:14 +00:00
|
|
|
<input type="text" required />
|
2020-08-14 11:44:23 +00:00
|
|
|
<button type="button" class="btn">${translations.delete}</button>
|
2020-08-14 11:34:14 +00:00
|
|
|
`;
|
|
|
|
div.querySelector('button').addEventListener('click', () => {
|
|
|
|
div.remove();
|
|
|
|
});
|
|
|
|
container.appendChild(div);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2021-02-26 17:04:05 +00:00
|
|
|
const handleFormSubmit = async e => {
|
2020-08-14 11:34:14 +00:00
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
const sideOneTags = [];
|
|
|
|
const sideTwoTags = [];
|
|
|
|
e.target
|
|
|
|
.querySelectorAll(`#${SIDE_ONE_INPUT_CONTAINER_ID} input`)
|
2021-02-26 17:04:05 +00:00
|
|
|
.forEach(el => {
|
2020-08-14 11:34:14 +00:00
|
|
|
if (el.value.trim()) {
|
|
|
|
sideOneTags.push(el.value.trim());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
e.target
|
|
|
|
.querySelectorAll(`#${SIDE_TWO_INPUT_CONTAINER_ID} input`)
|
2021-02-26 17:04:05 +00:00
|
|
|
.forEach(el => {
|
2020-08-14 11:34:14 +00:00
|
|
|
if (el.value.trim()) {
|
|
|
|
sideTwoTags.push(el.value.trim());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
console.log('sideOneTags', sideOneTags, 'sideTwoTags', sideTwoTags);
|
|
|
|
|
|
|
|
if (sideOneTags.length === 0)
|
2020-08-14 11:44:23 +00:00
|
|
|
return UI.ErrorMessage(translations.notEnoughTribesSideOne);
|
2020-08-14 11:34:14 +00:00
|
|
|
if (sideTwoTags.length === 0)
|
2020-08-14 11:44:23 +00:00
|
|
|
return UI.ErrorMessage(translations.notEnoughTribesSideTwo);
|
2020-08-14 11:34:14 +00:00
|
|
|
|
|
|
|
const fromInputs = document.querySelectorAll(
|
|
|
|
`${POPUP_SELECTOR} form #${FROM_INPUT_ID} input`
|
|
|
|
);
|
|
|
|
let ennobledAtGTE;
|
|
|
|
if (fromInputs.length === 2 && fromInputs[0].value && fromInputs[1].value) {
|
|
|
|
ennobledAtGTE = new Date(
|
|
|
|
`${fromInputs[0].value}T${fromInputs[1].value}:00`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
const toInputs = document.querySelectorAll(
|
|
|
|
`${POPUP_SELECTOR} form #${TO_INPUT_ID} input`
|
|
|
|
);
|
|
|
|
let ennobledAtLTE;
|
|
|
|
if (toInputs.length === 2 && toInputs[0].value && toInputs[1].value) {
|
|
|
|
ennobledAtLTE = new Date(`${toInputs[0].value}T${toInputs[1].value}:00`);
|
|
|
|
}
|
2021-02-26 17:04:05 +00:00
|
|
|
e.target.querySelectorAll('button').forEach(button => {
|
2020-08-14 11:34:14 +00:00
|
|
|
button.disabled = true;
|
|
|
|
});
|
|
|
|
|
|
|
|
try {
|
|
|
|
const { tribes } = await requestCreator({
|
|
|
|
query: TRIBES_QUERY,
|
|
|
|
variables: {
|
|
|
|
server: SERVER,
|
|
|
|
filter: {
|
|
|
|
tag: [...sideOneTags, ...sideTwoTags],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
|
|
|
const sideOneTribes = tribes.items
|
2021-02-26 17:04:05 +00:00
|
|
|
.filter(item => sideOneTags.some(tag => item.tag === tag))
|
|
|
|
.map(tribe => tribe.id);
|
2020-08-14 11:34:14 +00:00
|
|
|
const sideTwoTribes = tribes.items
|
2021-02-26 17:04:05 +00:00
|
|
|
.filter(item => sideTwoTags.some(tag => item.tag === tag))
|
|
|
|
.map(tribe => tribe.id);
|
2020-08-14 11:34:14 +00:00
|
|
|
|
2020-08-16 13:49:32 +00:00
|
|
|
const { sideOneEnnoblements, sideTwoEnnoblements } = await requestCreator({
|
2020-08-14 11:34:14 +00:00
|
|
|
query: ENNOBLEMENTS_QUERY,
|
|
|
|
variables: {
|
|
|
|
server: SERVER,
|
2020-08-16 13:49:32 +00:00
|
|
|
sideOneFilter: {
|
2020-08-14 11:34:14 +00:00
|
|
|
newOwnerTribeID: sideOneTribes,
|
|
|
|
oldOwnerTribeID: sideTwoTribes,
|
|
|
|
ennobledAtGTE,
|
|
|
|
ennobledAtLTE,
|
|
|
|
},
|
2020-08-16 13:49:32 +00:00
|
|
|
sideTwoFilter: {
|
2020-08-14 11:34:14 +00:00
|
|
|
newOwnerTribeID: sideTwoTribes,
|
|
|
|
oldOwnerTribeID: sideOneTribes,
|
|
|
|
ennobledAtGTE,
|
|
|
|
ennobledAtLTE,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
|
|
|
console.log(
|
|
|
|
'sideOneEnnoblements',
|
|
|
|
sideOneEnnoblements,
|
|
|
|
'sideTwoEnnoblements',
|
|
|
|
sideTwoEnnoblements
|
|
|
|
);
|
|
|
|
|
|
|
|
showResult(sideOneEnnoblements.total, sideTwoEnnoblements.total);
|
|
|
|
} catch (error) {
|
|
|
|
console.log('handleFormSubmit', error);
|
|
|
|
}
|
2021-02-26 17:04:05 +00:00
|
|
|
e.target.querySelectorAll('button').forEach(button => {
|
2020-08-14 11:34:14 +00:00
|
|
|
button.disabled = false;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2021-02-26 17:04:05 +00:00
|
|
|
const showWarStatsForm = e => {
|
2020-08-14 11:34:14 +00:00
|
|
|
const html = `
|
|
|
|
<form>
|
2021-01-03 12:13:05 +00:00
|
|
|
<h1 style="margin-bottom: 0px; text-align: center;"><a href="${twhelputils.buildURLToServerPage(
|
2021-01-01 17:03:36 +00:00
|
|
|
getServerVersionCode(SERVER),
|
|
|
|
SERVER
|
|
|
|
)}">TWHelp</a></h1>
|
|
|
|
<h3 style="margin-bottom: 10px; margin-top: 0;">${
|
|
|
|
translations.devNote
|
|
|
|
}</h3>
|
2020-08-14 11:34:14 +00:00
|
|
|
<div id="${RESULT_CONTAINER_ID}">
|
|
|
|
</div>
|
|
|
|
<div style="margin-bottom: 10px;">
|
|
|
|
<div id="${FROM_INPUT_ID}">
|
2020-08-14 11:44:23 +00:00
|
|
|
<label>${translations.from}: </label>
|
2020-08-14 11:34:14 +00:00
|
|
|
<input type="date" required />
|
|
|
|
<input type="time" required />
|
|
|
|
</div>
|
|
|
|
<div id="${TO_INPUT_ID}">
|
2020-08-14 11:44:23 +00:00
|
|
|
<label>${translations.to}: </label>
|
2020-08-14 11:34:14 +00:00
|
|
|
<input type="date" required />
|
|
|
|
<input type="time" required />
|
|
|
|
</div>
|
|
|
|
</div>
|
2020-08-16 13:49:32 +00:00
|
|
|
<div style="display: flex; justify-content: space-between; margin-bottom: 10px; min-width: 800px;">
|
2020-08-14 11:34:14 +00:00
|
|
|
<div>
|
2020-08-14 11:44:23 +00:00
|
|
|
<h3>${translations.sideOne}</h3>
|
2020-08-14 11:34:14 +00:00
|
|
|
<div id="${SIDE_ONE_INPUT_CONTAINER_ID}">
|
|
|
|
</div>
|
2021-01-01 17:03:36 +00:00
|
|
|
<button id="${SIDE_ONE_BUTTON_ID}" class="btn" type="button">${
|
|
|
|
translations.addTribe
|
|
|
|
}</button>
|
2020-08-14 11:34:14 +00:00
|
|
|
</div>
|
|
|
|
<div style="margin: 0 5px;"></div>
|
|
|
|
<div>
|
2020-08-14 11:44:23 +00:00
|
|
|
<h3>${translations.sideTwo}</h3>
|
2020-08-14 11:34:14 +00:00
|
|
|
<div id="${SIDE_TWO_INPUT_CONTAINER_ID}">
|
|
|
|
</div>
|
2021-01-01 17:03:36 +00:00
|
|
|
<button id="${SIDE_TWO_BUTTON_ID}" class="btn" type="button">${
|
|
|
|
translations.addTribe
|
|
|
|
}</button>
|
2020-08-14 11:34:14 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div style="text-align: center;">
|
2021-01-01 17:03:36 +00:00
|
|
|
<button class="btn" type="submit">${
|
|
|
|
translations.generateWarStats
|
|
|
|
}</button>
|
2020-08-14 11:34:14 +00:00
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
`;
|
|
|
|
|
2020-08-14 11:44:23 +00:00
|
|
|
showPopup({ title: translations.warStatsGenerator, id: 'warStats', html, e });
|
2020-08-14 11:34:14 +00:00
|
|
|
|
|
|
|
document
|
|
|
|
.querySelector(`${POPUP_SELECTOR} form #${SIDE_ONE_BUTTON_ID}`)
|
|
|
|
.addEventListener(
|
|
|
|
'click',
|
|
|
|
createAddTribeHandler(
|
|
|
|
document.querySelector('#' + SIDE_ONE_INPUT_CONTAINER_ID)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
document
|
|
|
|
.querySelector(`${POPUP_SELECTOR} form #${SIDE_TWO_BUTTON_ID}`)
|
|
|
|
.addEventListener(
|
|
|
|
'click',
|
|
|
|
createAddTribeHandler(
|
|
|
|
document.querySelector('#' + SIDE_TWO_INPUT_CONTAINER_ID)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
document
|
|
|
|
.querySelector(`${POPUP_SELECTOR} form`)
|
|
|
|
.addEventListener('submit', handleFormSubmit);
|
|
|
|
};
|
|
|
|
|
|
|
|
const renderUI = () => {
|
|
|
|
const div = document.createElement('div');
|
|
|
|
const button = document.createElement('button');
|
2020-08-14 11:44:23 +00:00
|
|
|
button.innerHTML = translations.generateWarStats;
|
2020-08-14 11:34:14 +00:00
|
|
|
button.addEventListener('click', showWarStatsForm);
|
|
|
|
div.appendChild(button);
|
|
|
|
|
|
|
|
document.querySelector('#wars_ranking_table').parentElement.prepend(div);
|
|
|
|
};
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
try {
|
|
|
|
renderUI();
|
|
|
|
} catch (error) {
|
|
|
|
console.log('war stats', error);
|
|
|
|
}
|
|
|
|
})();
|