import requestCreator from './libs/requestCreator'; import InADayParser from './libs/InADayParser'; import getIDFromURL from './utils/getIDFromURL'; import getCurrentServer from './utils/getCurrentServer'; import formatDate from './utils/formatDate'; import { formatPlayerURL } from './utils/twstats'; import { setItem, getItem } from './utils/localStorage'; // ==UserScript== // @name Extended Player Profile // @namespace https://gist.github.com/Kichiyaki/3c273582cc6856512e22c86c375f795a // @version 0.1 // @description Extended Player Profile // @author Kichiyaki http://dawid-wysokinski.pl/ // @match *://*.plemiona.pl/game.php*&screen=info_player* // @match *://*.tribalwars.net/game.php*&screen=info_player* // @grant none // ==/UserScript== const SERVER = getCurrentServer(); let PLAYER_ID = getIDFromURL(window.location.search); const CURRENT_PLAYER_ID = parseInt(game_data.player.id); if (isNaN(PLAYER_ID) || !PLAYER_ID) { PLAYER_ID = CURRENT_PLAYER_ID; } const LOCAL_STORAGE_KEY = 'kichiyaki_extended_player_profile' + PLAYER_ID; const PLAYER_QUERY = ` query player($server: String!, $id: Int!) { player(server: $server, id: $id) { id name servers joinedAt nameChanges { oldName newName changeDate } dailyGrowth } } `; const profileInfoTBody = document.querySelector('#player_info > tbody'); const otherElementsContainer = document.querySelector( PLAYER_ID === CURRENT_PLAYER_ID ? '#content_value > table:nth-child(7) > tbody > tr > td:nth-child(2)' : '#content_value > table > tbody > tr > td:nth-child(2)' ); const loadPlayerDataFromCache = () => { return getItem(LOCAL_STORAGE_KEY); }; const cachePlayerData = (data = {}) => { setItem(LOCAL_STORAGE_KEY, data); }; const loadInADayRankAndScore = async (name, playerID, type) => { try { const response = await fetch( TribalWars.buildURL('', { screen: 'ranking', mode: 'in_a_day', type, name, }) ); const html = await response.text(); const res = new InADayParser(html, { playerID }).parse(); if (res.length === 0) { throw new Error(); } return res[0]; } catch (error) { console.log(error); return { rank: 0, playerID: 0, score: 0, tribeID: 0, date: new Date(), }; } }; const loadPlayerData = async () => { const data = await requestCreator({ query: PLAYER_QUERY, variables: { server: SERVER, id: PLAYER_ID, }, }); if (data.player) { const inADay = {}; inADay.att = await loadInADayRankAndScore( data.player.name, data.player.id, 'kill_att' ); inADay.def = await loadInADayRankAndScore( data.player.name, data.player.id, 'kill_def' ); inADay.sup = await loadInADayRankAndScore( data.player.name, data.player.id, 'kill_sup' ); inADay.lootRes = await loadInADayRankAndScore( data.player.name, data.player.id, 'loot_res' ); inADay.lootVil = await loadInADayRankAndScore( data.player.name, data.player.id, 'loot_vil' ); inADay.scavenge = await loadInADayRankAndScore( data.player.name, data.player.id, 'scavenge' ); inADay.conquer = await loadInADayRankAndScore( data.player.name, data.player.id, 'conquer' ); data.player.inADay = inADay; } cachePlayerData(data); return data; }; const renderTr = ({ title, data, id }) => { let tr = document.querySelector('#' + id); if (!tr) { tr = document.createElement('tr'); tr.id = id; tr.appendChild(document.createElement('td')); tr.appendChild(document.createElement('td')); profileInfoTBody.append(tr); } tr.children[0].innerHTML = title; tr.children[1].innerHTML = data; }; const renderPlayerServers = (player) => { let playerServers = document.querySelector('#playerServers'); if (!playerServers) { playerServers = document.createElement('table'); playerServers.id = 'playerServers'; playerServers.classList.add('vis'); playerServers.width = '100%'; playerServers.innerHTML = `
Old name | New name | Date |
---|---|---|
${nameChange.oldName} | ${nameChange.newName} | ${formatDate(nameChange.changeDate, { year: 'numeric', month: 'numeric', day: 'numeric', })} |