2020-07-11 10:08:26 +00:00
|
|
|
import requestCreator from './libs/requestCreator';
|
2020-07-20 12:07:57 +00:00
|
|
|
import showPopup from './utils/showPopup';
|
2020-07-11 10:08:26 +00:00
|
|
|
import getCurrentServer from './utils/getCurrentServer';
|
2021-01-17 15:21:47 +00:00
|
|
|
import { formatDate } from './utils/date';
|
2021-01-03 12:13:05 +00:00
|
|
|
import * as twutils from './utils/tribalwars';
|
2020-07-11 10:08:26 +00:00
|
|
|
import { setItem, getItem } from './utils/localStorage';
|
2021-01-03 12:13:05 +00:00
|
|
|
import * as twhelputils from './utils/twhelp';
|
2021-01-01 17:03:36 +00:00
|
|
|
import getServerVersionCode from './utils/getServerVersionCode';
|
2020-07-20 12:07:57 +00:00
|
|
|
import loadTranslations from './i18n/latestEnnoblements';
|
2020-07-11 10:08:26 +00:00
|
|
|
|
|
|
|
// ==UserScript==
|
2021-06-12 05:49:43 +00:00
|
|
|
// @name The latest ennoblements
|
2020-07-12 18:28:46 +00:00
|
|
|
// @namespace https://github.com/tribalwarshelp/scripts
|
2020-07-12 17:29:58 +00:00
|
|
|
// @updateURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/latestEnnoblements.js
|
|
|
|
// @downloadURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/latestEnnoblements.js
|
2021-10-17 11:02:02 +00:00
|
|
|
// @version <%= version %>
|
2021-06-12 05:49:43 +00:00
|
|
|
// @description Shows the latest ennoblements
|
2021-01-17 08:20:19 +00:00
|
|
|
// @author Kichiyaki https://dwysokinski.me/
|
2020-07-16 17:49:01 +00:00
|
|
|
// @match *://*/game.php*
|
2020-07-11 10:08:26 +00:00
|
|
|
// @grant none
|
2020-07-12 17:29:58 +00:00
|
|
|
// @run-at document-end
|
2020-07-11 10:08:26 +00:00
|
|
|
// ==/UserScript==
|
|
|
|
|
|
|
|
const SERVER = getCurrentServer();
|
2021-01-17 15:21:47 +00:00
|
|
|
const FILTER_FORM_ID = 'le_form';
|
|
|
|
const TABLE_ID = 'le_table';
|
2020-07-11 10:08:26 +00:00
|
|
|
const CACHE_LOCAL_STORAGE_KEY = 'kiszkowaty_show_latest_ennoblements_cache';
|
|
|
|
const FILTERS_LOCAL_STORAGE_KEY = 'kiszkowaty_show_latest_ennoblements_filter';
|
|
|
|
const ICON_URL = 'https://i.imgur.com/4WP4098.png';
|
|
|
|
const query = `
|
2021-01-17 15:21:47 +00:00
|
|
|
query ennoblements($server: String!, $sort: [String!], $limit: Int) {
|
|
|
|
ennoblements(server: $server, sort: $sort, limit: $limit) {
|
|
|
|
items {
|
|
|
|
newOwner {
|
2020-07-11 10:08:26 +00:00
|
|
|
id
|
|
|
|
name
|
2021-01-17 15:21:47 +00:00
|
|
|
tribe {
|
|
|
|
id
|
|
|
|
name
|
|
|
|
tag
|
|
|
|
}
|
2020-07-11 10:08:26 +00:00
|
|
|
}
|
2021-01-17 15:21:47 +00:00
|
|
|
oldOwner {
|
2020-07-11 10:08:26 +00:00
|
|
|
id
|
|
|
|
name
|
2021-01-17 15:21:47 +00:00
|
|
|
tribe {
|
|
|
|
id
|
|
|
|
name
|
|
|
|
tag
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ennobledAt
|
|
|
|
village {
|
|
|
|
id
|
|
|
|
name
|
|
|
|
x
|
|
|
|
y
|
2020-07-11 10:08:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
const DEFAULT_FILTER = {
|
|
|
|
newOwner: '',
|
|
|
|
newOwnerTribe: '',
|
|
|
|
oldOwner: '',
|
|
|
|
oldOwnerTribe: '',
|
|
|
|
};
|
2020-07-20 12:07:57 +00:00
|
|
|
const translations = loadTranslations();
|
2020-07-11 10:08:26 +00:00
|
|
|
|
|
|
|
const loadLatestEnnoblementsFromCache = () => {
|
|
|
|
return getItem(CACHE_LOCAL_STORAGE_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const loadFilters = () => {
|
|
|
|
return getItem(FILTERS_LOCAL_STORAGE_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const cacheEnnoblements = (data = {}) => {
|
|
|
|
setItem(CACHE_LOCAL_STORAGE_KEY, data);
|
|
|
|
};
|
|
|
|
|
|
|
|
const cacheFilters = (data = {}) => {
|
|
|
|
setItem(FILTERS_LOCAL_STORAGE_KEY, data);
|
|
|
|
};
|
|
|
|
|
|
|
|
const loadLatestEnnoblements = () => {
|
|
|
|
return requestCreator({
|
|
|
|
query,
|
|
|
|
variables: {
|
|
|
|
server: SERVER,
|
2021-01-17 15:21:47 +00:00
|
|
|
limit: 50,
|
|
|
|
sort: ['ennobledAt DESC'],
|
2020-07-11 10:08:26 +00:00
|
|
|
},
|
2021-02-26 17:04:05 +00:00
|
|
|
}).then(data => {
|
2020-07-11 10:08:26 +00:00
|
|
|
cacheEnnoblements(data);
|
2021-02-26 17:04:05 +00:00
|
|
|
return new Promise(resolve => resolve(data));
|
2020-07-11 10:08:26 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const isValidPlayer = (obj, searchValue) => {
|
|
|
|
return obj && obj.name.toLowerCase().includes(searchValue.toLowerCase());
|
|
|
|
};
|
|
|
|
|
|
|
|
const isValidPlayerTribe = (obj, searchValue) => {
|
|
|
|
return (
|
|
|
|
obj &&
|
|
|
|
obj.tribe &&
|
|
|
|
(obj.tribe.name.toLowerCase().includes(searchValue.toLowerCase()) ||
|
|
|
|
obj.tribe.tag.toLowerCase().includes(searchValue.toLowerCase()))
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
const filterEnnoblements = (
|
|
|
|
ennoblements = [],
|
|
|
|
{ newOwner, newOwnerTribe, oldOwner, oldOwnerTribe } = {}
|
|
|
|
) => {
|
2021-02-26 17:04:05 +00:00
|
|
|
return ennoblements.filter(ennoblement => {
|
2020-07-11 10:08:26 +00:00
|
|
|
if (newOwner && !isValidPlayer(ennoblement.newOwner, newOwner)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
newOwnerTribe &&
|
|
|
|
!isValidPlayerTribe(ennoblement.newOwner, newOwnerTribe)
|
|
|
|
) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (oldOwner && !isValidPlayer(ennoblement.oldOwner, oldOwner)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
oldOwnerTribe &&
|
|
|
|
!isValidPlayerTribe(ennoblement.oldOwner, oldOwnerTribe)
|
|
|
|
) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2021-01-17 15:21:47 +00:00
|
|
|
const applyFilters = (e, ennoblements) => {
|
2020-07-11 10:08:26 +00:00
|
|
|
e.preventDefault();
|
|
|
|
const filters = {
|
|
|
|
...DEFAULT_FILTER,
|
|
|
|
newOwner: e.target[0].value,
|
|
|
|
newOwnerTribe: e.target[1].value,
|
|
|
|
oldOwner: e.target[2].value,
|
|
|
|
oldOwnerTribe: e.target[3].value,
|
|
|
|
};
|
2021-06-12 05:26:55 +00:00
|
|
|
document.querySelector(`#${TABLE_ID} tbody`).innerHTML =
|
|
|
|
buildEnnoblementsRows(filterEnnoblements(ennoblements, filters)).join('');
|
2020-07-11 10:08:26 +00:00
|
|
|
cacheFilters(filters);
|
|
|
|
};
|
|
|
|
|
|
|
|
const addEventListeners = (ennoblements = []) => {
|
2021-02-26 17:04:05 +00:00
|
|
|
document.querySelector('#' + FILTER_FORM_ID).addEventListener('submit', e => {
|
|
|
|
applyFilters(e, ennoblements);
|
|
|
|
});
|
2020-07-11 10:08:26 +00:00
|
|
|
};
|
|
|
|
|
2021-02-26 17:04:05 +00:00
|
|
|
const getPlayerHTML = player => {
|
2020-07-11 10:08:26 +00:00
|
|
|
return player && player.name
|
2021-01-03 12:13:05 +00:00
|
|
|
? `<a href="${twutils.buildPlayerURL(player.id)}">${player.name}</a> (${
|
2020-07-11 10:08:26 +00:00
|
|
|
player.tribe && player.tribe.tag
|
2021-01-03 12:13:05 +00:00
|
|
|
? `<a href="${twutils.buildTribeURL(player.tribe.id)}">${
|
2020-07-11 18:44:52 +00:00
|
|
|
player.tribe.tag
|
|
|
|
}</a>`
|
2020-07-11 10:08:26 +00:00
|
|
|
: '-'
|
|
|
|
})`
|
|
|
|
: '-';
|
|
|
|
};
|
|
|
|
|
2021-02-26 17:04:05 +00:00
|
|
|
const getVillageHTML = village => {
|
2021-01-03 12:13:05 +00:00
|
|
|
return `<a href="${twutils.buildVillageURL(
|
|
|
|
village.id
|
|
|
|
)}">${twutils.buildVillageName(village.name, village.x, village.y)}</a>`;
|
2020-07-11 10:08:26 +00:00
|
|
|
};
|
|
|
|
|
2021-02-26 17:04:05 +00:00
|
|
|
const buildEnnoblementsRows = ennoblements => {
|
|
|
|
return ennoblements.map(ennoblement => {
|
2020-07-11 10:08:26 +00:00
|
|
|
return `<tr>
|
2021-01-03 12:13:05 +00:00
|
|
|
<td>${getVillageHTML(ennoblement.village)}</td>
|
|
|
|
<td>${getPlayerHTML(ennoblement.newOwner)}</td>
|
|
|
|
<td>${getPlayerHTML(ennoblement.oldOwner)}</td>
|
2020-07-11 10:08:26 +00:00
|
|
|
<td>${formatDate(ennoblement.ennobledAt)}</td>
|
|
|
|
</tr>`;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const renderLatestEnnoblements = (ennoblements = [], filters = {}) => {
|
|
|
|
const prepared = {
|
|
|
|
...DEFAULT_FILTER,
|
|
|
|
...filters,
|
|
|
|
};
|
|
|
|
const html = `
|
|
|
|
<form style="margin-bottom: 15px" id="${FILTER_FORM_ID}">
|
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-07-20 12:07:57 +00:00
|
|
|
<h3 style="margin-bottom: 5px">${translations.filters}</h3>
|
|
|
|
<input type="text" placeholder="${translations.newOwner}" value="${
|
|
|
|
prepared.newOwner
|
|
|
|
}" />
|
|
|
|
<input type="text" placeholder="${
|
|
|
|
translations.newOwnerTribe
|
|
|
|
}" value="${prepared.newOwnerTribe}" />
|
|
|
|
<input type="text" placeholder="${translations.oldOwner}" value="${
|
|
|
|
prepared.oldOwner
|
|
|
|
}" />
|
|
|
|
<input type="text" placeholder="${
|
|
|
|
translations.oldOwnerTribe
|
|
|
|
}" value="${prepared.oldOwnerTribe}" />
|
2020-07-11 10:08:26 +00:00
|
|
|
<div>
|
2020-07-20 12:07:57 +00:00
|
|
|
<button type="submit">${translations.apply}</button>
|
2020-07-11 10:08:26 +00:00
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
<table class="vis" id="${TABLE_ID}" style="width: 100%">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
2020-07-20 12:07:57 +00:00
|
|
|
<th>${translations.village}</th>
|
|
|
|
<th>${translations.newOwner}</th>
|
|
|
|
<th>${translations.oldOwner}</th>
|
|
|
|
<th>${translations.date}</th>
|
2020-07-11 10:08:26 +00:00
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>
|
2021-01-03 12:13:05 +00:00
|
|
|
${buildEnnoblementsRows(
|
2020-07-11 10:08:26 +00:00
|
|
|
filterEnnoblements(ennoblements, prepared)
|
|
|
|
).join('')}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
`;
|
|
|
|
|
2020-07-20 12:07:57 +00:00
|
|
|
showPopup({
|
|
|
|
title: translations.ennoblements,
|
2020-07-11 10:08:26 +00:00
|
|
|
id: 'ennoblements',
|
|
|
|
html,
|
|
|
|
});
|
|
|
|
|
|
|
|
addEventListeners(ennoblements);
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleButtonClick = async () => {
|
|
|
|
try {
|
|
|
|
const cache = loadLatestEnnoblementsFromCache();
|
|
|
|
const filters = loadFilters();
|
|
|
|
if (
|
2021-01-17 15:21:47 +00:00
|
|
|
cache.ennoblements &&
|
|
|
|
Array.isArray(cache.ennoblements.items) &&
|
|
|
|
cache.ennoblements.items.length > 0
|
2020-07-11 10:08:26 +00:00
|
|
|
) {
|
2021-01-17 15:21:47 +00:00
|
|
|
renderLatestEnnoblements(cache.ennoblements.items, filters);
|
2020-07-11 10:08:26 +00:00
|
|
|
}
|
2021-01-17 15:21:47 +00:00
|
|
|
const { ennoblements } = await loadLatestEnnoblements();
|
|
|
|
renderLatestEnnoblements(ennoblements.items, filters);
|
2020-07-11 10:08:26 +00:00
|
|
|
} catch (error) {
|
|
|
|
console.log('latestEnnoblements', error);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const renderButton = () => {
|
|
|
|
const container = document.createElement('div');
|
|
|
|
container.style.position = 'fixed';
|
|
|
|
container.style.top = '5px';
|
|
|
|
container.style.left = '4px';
|
|
|
|
container.style.zIndex = '50000';
|
|
|
|
|
|
|
|
const button = document.createElement('a');
|
|
|
|
button.innerHTML = `<img src="${ICON_URL}">`;
|
2020-07-20 12:07:57 +00:00
|
|
|
button.title = translations.showLatestEnnoblements;
|
2020-07-11 10:08:26 +00:00
|
|
|
button.style.cursor = 'pointer';
|
|
|
|
button.addEventListener('click', handleButtonClick);
|
|
|
|
container.append(button);
|
|
|
|
|
|
|
|
document.body.appendChild(container);
|
|
|
|
};
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
renderButton();
|
|
|
|
})();
|