2021-01-01 15:55:56 +00:00
|
|
|
import format from 'date-fns/format';
|
2020-07-23 14:26:51 +00:00
|
|
|
import requestCreator from './libs/requestCreator';
|
2020-07-23 14:43:49 +00:00
|
|
|
import getTranslations from './i18n/dailyAchievments';
|
2020-07-23 14:26:51 +00:00
|
|
|
import { setItem, getItem } from './utils/localStorage';
|
2021-01-03 12:13:05 +00:00
|
|
|
import * as twutils from './utils/tribalwars';
|
2020-07-23 14:26:51 +00:00
|
|
|
import getCurrentServer from './utils/getCurrentServer';
|
2021-01-01 17:03:36 +00:00
|
|
|
import getServerVersionCode from './utils/getServerVersionCode';
|
2021-01-01 15:55:56 +00:00
|
|
|
import { inTZ } from './utils/date';
|
2021-01-01 17:03:36 +00:00
|
|
|
import { buildURLToServerPage } from './utils/twhelp';
|
2020-07-23 14:26:51 +00:00
|
|
|
|
|
|
|
// ==UserScript==
|
|
|
|
// @name Daily achievements
|
|
|
|
// @namespace https://github.com/tribalwarshelp/scripts
|
|
|
|
// @updateURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/dailyAchievements.js
|
|
|
|
// @downloadURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/dailyAchievements.js
|
2021-01-17 08:20:19 +00:00
|
|
|
// @version 0.4.4
|
2020-07-23 14:26:51 +00:00
|
|
|
// @description Daily achievements
|
2021-01-17 08:20:19 +00:00
|
|
|
// @author Kichiyaki https://dwysokinski.me/
|
2020-07-23 14:26:51 +00:00
|
|
|
// @match *://*/game.php*screen=info_player&mode=awards*
|
|
|
|
// @grant none
|
|
|
|
// ==/UserScript==
|
|
|
|
|
|
|
|
const SERVER = getCurrentServer();
|
|
|
|
const LOCAL_STORAGE_KEY = 'kichiyaki_daily_achievements';
|
|
|
|
const SERVER_QUERY = `
|
|
|
|
query server($server: String!) {
|
|
|
|
server(key: $server) {
|
|
|
|
key
|
|
|
|
historyUpdatedAt
|
2021-01-01 15:55:56 +00:00
|
|
|
version {
|
|
|
|
timezone
|
|
|
|
}
|
2020-07-23 14:26:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
const DAILY_STATS_QUERY = `
|
|
|
|
query data($server: String!, $createDateGTE: Time!) {
|
2020-11-21 14:01:40 +00:00
|
|
|
dailyPlayerStatsOrderedByScoreAtt: dailyPlayerStats(server: $server, sort: ["scoreAtt DESC", "playerID desc"], filter: { createDateGTE: $createDateGTE }, limit: 5) {
|
2020-07-23 14:26:51 +00:00
|
|
|
items {
|
|
|
|
scoreAtt
|
|
|
|
player {
|
|
|
|
id
|
|
|
|
name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-21 14:01:40 +00:00
|
|
|
dailyPlayerStatsOrderedByScoreDef: dailyPlayerStats(server: $server, sort: ["scoreDef DESC", "playerID desc"], filter: { createDateGTE: $createDateGTE }, limit: 5) {
|
2020-07-23 14:26:51 +00:00
|
|
|
items {
|
|
|
|
scoreDef
|
|
|
|
player {
|
|
|
|
id
|
|
|
|
name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-21 14:01:40 +00:00
|
|
|
dailyPlayerStatsOrderedByScoreSup: dailyPlayerStats(server: $server, sort: ["scoreSup DESC", "playerID desc"], filter: { createDateGTE: $createDateGTE }, limit: 5) {
|
2020-07-23 14:26:51 +00:00
|
|
|
items {
|
|
|
|
scoreSup
|
|
|
|
player {
|
|
|
|
id
|
|
|
|
name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-21 14:01:40 +00:00
|
|
|
dailyPlayerStatsOrderedByVillages: dailyPlayerStats(server: $server, sort: ["villages DESC", "playerID desc"], filter: { createDateGTE: $createDateGTE }, limit: 5) {
|
2020-07-23 14:26:51 +00:00
|
|
|
items {
|
|
|
|
villages
|
|
|
|
player {
|
|
|
|
id
|
|
|
|
name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
let container = undefined;
|
2020-07-23 14:43:49 +00:00
|
|
|
const translations = getTranslations();
|
2020-07-23 14:26:51 +00:00
|
|
|
|
|
|
|
const loadDataFromCache = () => {
|
|
|
|
return getItem(LOCAL_STORAGE_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const cacheData = (data = {}) => {
|
|
|
|
setItem(LOCAL_STORAGE_KEY, data);
|
|
|
|
};
|
|
|
|
|
|
|
|
const loadData = async () => {
|
|
|
|
let data = await requestCreator({
|
|
|
|
query: SERVER_QUERY,
|
|
|
|
variables: {
|
|
|
|
server: SERVER,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
if (data.server) {
|
2021-01-01 15:55:56 +00:00
|
|
|
const d = inTZ(data.server.historyUpdatedAt, data.server.version.timezone);
|
2020-07-23 14:26:51 +00:00
|
|
|
const dailyStatsData = await requestCreator({
|
|
|
|
query: DAILY_STATS_QUERY,
|
|
|
|
variables: {
|
|
|
|
server: SERVER,
|
|
|
|
createDateGTE:
|
2021-01-01 15:55:56 +00:00
|
|
|
format(d, 'yyyy-MM-dd') + 'T' + format(d, 'HH:mm:ss') + 'Z',
|
2020-07-23 14:26:51 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
data = {
|
|
|
|
...data,
|
|
|
|
...dailyStatsData,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
cacheData(data);
|
|
|
|
return data;
|
|
|
|
};
|
|
|
|
|
|
|
|
const render = ({
|
|
|
|
dailyPlayerStatsOrderedByScoreAtt,
|
|
|
|
dailyPlayerStatsOrderedByScoreDef,
|
|
|
|
dailyPlayerStatsOrderedByScoreSup,
|
|
|
|
dailyPlayerStatsOrderedByVillages,
|
|
|
|
}) => {
|
|
|
|
const html = `
|
2020-07-23 14:43:49 +00:00
|
|
|
<div class="award-group-head">${translations.title}</div>
|
2020-07-23 14:26:51 +00:00
|
|
|
<div class="award-group-content" style="text-align: center;">
|
|
|
|
<div style="padding: 10px;">
|
2021-01-01 17:03:36 +00:00
|
|
|
<h1 style="margin-bottom: 0px;"><a href="${buildURLToServerPage(
|
|
|
|
getServerVersionCode(SERVER),
|
|
|
|
SERVER
|
|
|
|
)}">TWHelp</a></h1>
|
|
|
|
<h3 style="margin-bottom: 10px; margin-top: 0;">${
|
|
|
|
translations.devNote
|
|
|
|
}</h3>
|
2020-07-23 14:43:49 +00:00
|
|
|
<h3 style="color: red;"><strong>${
|
|
|
|
translations.warning
|
|
|
|
}</strong></h3>
|
|
|
|
<p><strong>${translations.aotd}</strong></p>
|
2020-07-23 14:26:51 +00:00
|
|
|
${dailyPlayerStatsOrderedByScoreAtt.items
|
|
|
|
.map(
|
|
|
|
(item, index) =>
|
2021-01-03 12:13:05 +00:00
|
|
|
`<span>${index + 1}. <a href="${twutils.buildPlayerURL(
|
2020-07-23 14:26:51 +00:00
|
|
|
item.player.id
|
|
|
|
)}">${
|
|
|
|
item.player.name
|
|
|
|
} - ${item.scoreAtt.toLocaleString()}</a></span>`
|
|
|
|
)
|
|
|
|
.join('<br>')}
|
|
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div style="padding: 10px;">
|
2020-07-23 14:43:49 +00:00
|
|
|
<p><strong>${translations.dotd}</strong></p>
|
2020-07-23 14:26:51 +00:00
|
|
|
${dailyPlayerStatsOrderedByScoreDef.items
|
|
|
|
.map(
|
|
|
|
(item, index) =>
|
2021-01-03 12:13:05 +00:00
|
|
|
`<span>${index + 1}. <a href="${twutils.buildPlayerURL(
|
2020-07-23 14:26:51 +00:00
|
|
|
item.player.id
|
|
|
|
)}">${
|
|
|
|
item.player.name
|
|
|
|
} - ${item.scoreDef.toLocaleString()}</a></span>`
|
|
|
|
)
|
|
|
|
.join('<br>')}
|
|
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div style="padding: 10px;">
|
2020-07-23 14:43:49 +00:00
|
|
|
<p><strong>${translations.sotd}</strong></p>
|
2020-07-23 14:26:51 +00:00
|
|
|
${dailyPlayerStatsOrderedByScoreSup.items
|
|
|
|
.map(
|
|
|
|
(item, index) =>
|
2021-01-03 12:13:05 +00:00
|
|
|
`<span>${index + 1}. <a href="${twutils.buildPlayerURL(
|
2020-07-23 14:26:51 +00:00
|
|
|
item.player.id
|
|
|
|
)}">${
|
|
|
|
item.player.name
|
|
|
|
} - ${item.scoreSup.toLocaleString()}</a></span>`
|
|
|
|
)
|
|
|
|
.join('<br>')}
|
|
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div style="padding: 10px;">
|
2020-07-23 14:43:49 +00:00
|
|
|
<p><strong>${translations.gpotd}</strong></p>
|
2020-07-23 14:26:51 +00:00
|
|
|
${dailyPlayerStatsOrderedByVillages.items
|
|
|
|
.map(
|
|
|
|
(item, index) =>
|
2021-01-03 12:13:05 +00:00
|
|
|
`<span>${index + 1}. <a href="${twutils.buildPlayerURL(
|
2020-07-23 14:26:51 +00:00
|
|
|
item.player.id
|
|
|
|
)}">${
|
|
|
|
item.player.name
|
|
|
|
} - ${item.villages.toLocaleString()}</a></span>`
|
|
|
|
)
|
|
|
|
.join('<br>')}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="award-group-foot"></div>
|
|
|
|
`;
|
|
|
|
|
|
|
|
if (!container) {
|
|
|
|
container = document.createElement('div');
|
|
|
|
container.classList.add('award-group');
|
|
|
|
document
|
|
|
|
.querySelector('#content_value > div:nth-child(4)')
|
|
|
|
.prepend(container);
|
|
|
|
}
|
|
|
|
|
|
|
|
container.innerHTML = html;
|
|
|
|
};
|
|
|
|
|
|
|
|
(async function () {
|
|
|
|
try {
|
|
|
|
const dataFromCache = loadDataFromCache();
|
|
|
|
if (dataFromCache && dataFromCache.server) {
|
|
|
|
render(dataFromCache);
|
|
|
|
}
|
|
|
|
const data = await loadData();
|
|
|
|
if (data.server) {
|
|
|
|
render(data);
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
console.log('dailyAchievements', error);
|
|
|
|
}
|
|
|
|
})();
|