您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Améliorations des TPs de DC
// ==UserScript== // @name TP Overhaul // @namespace https://greasyfork.org/en/scripts/488053-tp-overhaul // @version 1.2.2 // @description Améliorations des TPs de DC // @author Altaïr // @match https://www.dreadcast.net/Main // @icon https://www.dreadcast.net/images/objets/mini/TERMINAL%20PORTABLE2.png // @grant GM_addStyle // @license MIT // ==/UserScript== /* globals $, GM_addStyle */ const A_SECOND = 1000; let cAData = undefined; let infoOI = undefined; let cercleList = undefined; let energyInfo = undefined; let cryoData = undefined; let gigaCryoData = undefined; let isFetchingImperialData = false; let isFetchingGigaCryoData = false; let sTVData = undefined; let isFetchingSTVData = false; let isFetchingPrisonData = false; const logMonthHistory = (baseUrl, from, to) => { const dateFrom = new Date(`${from} GMT+0100`); const dateTo = new Date(`${to} GMT+0100`); const timestampFrom = Math.floor(dateFrom.getTime() / 1000); const timestampTo = Math.floor(dateTo.getTime() / 1000); const isValid = validateRange(timestampFrom, timestampTo); if (!isValid) { return; } let calls = []; let logs = new Map(); for (let t = timestampFrom; t <= timestampTo; t += 86400) { calls.push( $.ajax({ type: 'GET', url: `${baseUrl}&date=${t}`, success: (res) => { const html = $(res).find('.entreprise_historique_ligne'); if (html.text() !== '') { logs.set(t, $(res).find('.entreprise_historique_ligne')); } }, }) ); } $.when(...calls).then(() => { $('#tpo_content').empty(); $(`<div id="imperial_data" class="entreprise_historique"></div>`).appendTo('#tpo_content'); if (logs.size === 0) { $('<div class="tpo_alert">Aucune donnée disponible pour la plage sélectionnée.</div>').appendTo('.entreprise_historique'); return; } for (let t = timestampFrom; t <= timestampTo; t += 86400) { logs.get(t)?.appendTo('.entreprise_historique'); } addCopyButton(); }); }; const validateRange = (from, to) => { if (from > to) { $('#tpo_content').empty(); $( `<div id="imperial_data" class="entreprise_historique"><div class="tpo_alert"><span>⚠</span> Invalide. La date de fin doit être après la date de début.</div></div>` ).appendTo('#tpo_content'); return false; } if (from + 15 * (164 + 7 * 100) * 100 < to) { $('#tpo_content').empty(); $(`<div id="imperial_data" class="entreprise_historique"><div class="tpo_alert"><span>⚠</span> Invalide. La plage limite est de 15 jours.</div></div>`).appendTo( '#tpo_content' ); return false; } return true; }; const addOrRefreshSearchElements = (baseUrl, name) => { updateHeader(name, "$('#tpo_history_range').css('display', 'none');"); $('#tpo_header_text span').click(() => { $('#tpo_content').remove(); backToInfoOIPage(); }); const historyRange = $('#tpo_history_range'); if (historyRange?.length) { historyRange.find('#tpo_history_submit').unbind('click'); historyRange.find('#tpo_history_submit').click(() => appendHistory(baseUrl)); historyRange.css('display', ''); } else { addHistorySearchForm(baseUrl); } const historyContent = $('#tpo_history_content'); if (historyContent?.length) { historyContent.empty(); } else { $(`<div id="tpo_history_content"></div>`).appendTo('.entreprise_historique'); } }; const setKeyUpListeners = () => { $('#history_from').on('keyup', (e) => { if (e.key === 'Enter' || e.keyCode === 13) { $('#tpo_history_submit').click(); } }); $('#history_to').on('keyup', (e) => { if (e.key === 'Enter' || e.keyCode === 13) { $('#tpo_history_submit').click(); } }); }; const addHistorySearchForm = (baseUrl) => { const today = new Date().toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); const submitButton = $(`<button id="tpo_history_submit" class="transition3s tpo_modern_button">Valider</button>`); submitButton.click(() => appendHistory(baseUrl)); $(` <div id="tpo_history_range"> <input id="history_from" type="text" name="from" placeholder="À partir du..." maxlength="10" autocomplete="off" value="${today}"><span class="tpo_arrow_seperator tpo_one_dot_two_rem">⇒</span><input id="history_to" type="text" name="to" placeholder="Jusqu'au..." maxlength="10" autocomplete="off" value="${today}"> </div>`).appendTo('#tpo_header_extra'); setKeyUpListeners(); submitButton.appendTo($('#tpo_history_range')); }; const appendHistory = (baseUrl) => { $('#tpo_content').empty(); $(getTPOLoader()).appendTo('#tpo_content'); let from = $('#history_from').val(); let to = $('#history_to').val(); const today = new Date().toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); if (from === '') { from = today; $('#history_from').val(today); } if (to === '') { to = today; $('#history_to').val(today); } logMonthHistory(baseUrl, from, to); }; const addCopyButton = () => { if ($('#tpo_history_copy').length) { return; } const button = $('<span id="tpo_history_copy" class="link">Copier</span>'); button.click(() => { $('#tpo_history_copy').text('Copié !'); setTimeout(() => { $('#tpo_history_copy').text('Copier'); }, A_SECOND); addHistoryToClipBoard(); }); button.appendTo('#tpo_content'); }; const addHistoryToClipBoard = () => { const dateColourReplacement = ''; const userColourReplacement = ''; const endColourTagReplacement = ''; let text = ''; $('.entreprise_historique_ligne').each((_, v) => { if ($(v).prop('style').display !== 'none') { text += v.innerHTML .replace('\n', '') .replace(/<br>/g, ' ') .replace(/<span style="display.+>/g, ' ') .replace(/<span class="orange">/g, '') .replace(/\t/g, '') .replace(/<span style="color:#28858d;">/g, dateColourReplacement) .replace(/<span class="couleur4">/g, userColourReplacement) .replace(/<\/span>/g, endColourTagReplacement) .replace(/<div class="entreprise_historique_ligne">/g, '') .replace(/<\/div>/g, '') .replace('\n', ' ') .replace(/<em class="couleur.+;">/g, '') .replace(/<\/em>/g, '') .replace(/ +/g, ' ') .replace(/(\n )+/g, '\n') .replace(/:\n/g, ': ') .replace(/\[ALERTE\]\n/g, '[ALERTE] '); } }); navigator.clipboard.writeText(text); }; const applyTPModifications = () => { $('#zone_dataBox').ajaxComplete(function (_, req, opt) { if (!opt.url.includes('Item/Activate')) { return; } $('#zone_dataBox').unbind('ajaxComplete'); if (!req.responseText.includes('db_portable_device')) { return; } fetchImperialData(); const originalMenuItems = $('#terminal_portable').clone().find('ul li'); $('#terminal_portable').empty(); let itemsToPutBack = []; originalMenuItems.each((_, e) => { if ( !e.innerText.includes('Terminal de la DA') && !e.innerText.includes('Terminal des STV') && !e.innerText.includes('Terminal de la CEV') && !e.innerText.includes('Terminal de la Prison') ) { itemsToPutBack.push(e); } }); if ($('#tpo_menu').length === 0) { getTPOMenu().appendTo('#terminal_portable'); } if (itemsToPutBack.length) { $(`<ul>${itemsToPutBack.map((i) => $(i).prop('outerHTML')).join('')}</ul>`).appendTo('#terminal_portable'); } }); }; const getTPOMenu = () => { const element = $(` <div id="tpo_menu"> <div id="tpo_cards"> ${getCardElement( 'Cercles publics', 'Informations sur les cercles publics recensés à ce jour', '<svg viewBox="0 0 283.46 283.46" class=""><use xlink:href="#icon-tableaucercle" filter="url(#dropshadow)"></use></svg>', 'tpo_cercle_button' )} ${getCardElement( 'Organisations officielles', 'Informations sur les organisations publiques', '<svg viewBox="0 0 192 192" filter="drop-shadow(2px 2px 2px black)"><path d="M96 56V24H16v144h160V56zm-16 96H32v-16h48zm0-32H32v-16h48zm0-32H32V72h48zm0-32H32V40h48zm80 96h-64V72h64zm-16-64h-32v16h32zm0 32h-32v16h32z"></path></svg>', 'tpo_info_oi_button' )} ${getCardElement( 'Bulletin énergétique', "Informations sur l'activité énergétique", '<svg viewBox="0 0 192 192" filter="drop-shadow(2px 2px 2px black)"><path d="M117.52 17.68 34.64 91.92c-5.12 4.64-2.24 13.2 4.64 13.84L104 112l-38.8 54.08c-1.76 2.48-1.52 5.92.64 8.08 2.4 2.4 6.16 2.48 8.64.16l82.88-74.24c5.12-4.64 2.24-13.2-4.64-13.84L88 80l38.8-54.08c1.76-2.48 1.52-5.92-.64-8.08-2.4-2.4-6.16-2.48-8.64-.16"></path></svg>', 'tpo_energy_button' )} ${getCardElement( "Centre d'Arrivée", 'Informations sur les nouveaux arrivants', '<svg viewBox="0 0 192 192" filter="drop-shadow(2px 2px 2px black)"><path d="m 176 24 l -16 16 L 144 24 L 128 40 L 112 24 l -16 16 L 80 24 L 64 40 L 48 24 L 32 40 L 16 24 v 128 c 0 8.8 7.2 16 16 16 h 128 c 8.8 0 16 -7.2 16 -16 z M 88 152 H 32 v -48 h 56 z m 72 0 h -56 v -16 h 56 z m 0 -32 h -56 v -16 h 56 z m 0 -32 H 32 V 64 h 128 z"></path></svg>', 'tpo_ca_button' )} ${getCardElement( 'Centre de Cryogénie', 'Informations sur les citoyens cryogénisés', '<svg viewBox="0 0 283.46 283.46" class=""><use xlink:href="#icon-cryo" filter="url(#dropshadow)"></use></svg>', 'tpo_cryo_button' )} ${getCardElement( 'Cartes du secteur', 'Informations graphiques du secteur', '<svg viewBox="0 0 283.46 283.46" class=""><use xlink:href="#icon-79" filter="url(#dropshadow)"></use></svg>', 'tpo_map_button' )} ${getCardElement( 'Prison', 'Informations sur les citoyens actuellement incarcérés', '<svg viewBox="0 0 192 192" filter="drop-shadow(2px 2px 2px black)"><path d="M129.6 89.2c5.04 0 9.864.72 14.4 2.088V82c0-7.92-6.48-14.4-14.4-14.4h-7.2V53.2c0-19.872-16.128-36-36-36S50.4 33.328 50.4 53.2v14.4H43.2c-7.92 0-14.4 6.48-14.4 14.4v72c0 7.92 6.48 14.4 14.4 14.4h45.072c-5.688-8.136-9.072-18.072-9.072-28.8 0-27.864 22.536-50.4 50.4-50.4M64.08 53.2c0-12.312 10.008-22.32 22.32-22.32s22.32 10.008 22.32 22.32v14.4H64.08z"></path><path d="M129.6 103.6c-19.872 0-36 16.128-36 36s16.128 36 36 36 36-16.128 36-36-16.128-36-36-36m0 14.4c5.976 0 10.8 4.824 10.8 10.8S135.576 139.6 129.6 139.6s-10.8-4.824-10.8-10.8 4.824-10.8 10.8-10.8m0 43.2c-7.416 0-13.968-3.744-17.856-9.504 5.256-3.024 11.304-4.896 17.856-4.896s12.6 1.872 17.856 4.896c-3.888 5.76-10.44 9.504-17.856 9.504"></path></svg>', 'tpo_prison_button' )} <div id="tpo_energy_info"> <div class="entreprise_infos_generales"> <div class="angle1" /> <div class="angle2" /> <div class="angle3" /> <div class="angle4" /> <table> <tbody> <tr> <td><span class="type1 info2 font15">Énergie actuelle</span> <span id="current_energy" class="type2">--- CF</span></td> </tr> <tr> <td><span class="font15 type1 info2">Consommation du jour</span> <span id="expected_consumption" class="type2">--- CF</span></td> </tr> <tr> <td><span class="type1 info2 font15">Restant à consommer</span> <span id="actual_consumption" class="type2">--- CF</span></td> </tr> </tbody> </table> </div> <p style="text-align: center;position: absolute;bottom: 10px;width: 100%;color: grey;"><small style="text-align: center;/*! margin: auto; */">Vous êtes connecté sur le Réseau Général.<br>Toute requête est enregistrée.</small></p> </div> </div> </div> `); element.find('#tpo_cercle_button').click(setCercleListPage); element.find('#tpo_info_oi_button').click(setInfoOIPage); element.find('#tpo_energy_button').click(setSTVPage); element.find('#tpo_ca_button').click(setCAPage); element.find('#tpo_cryo_button').click(setCryoPage); element.find('#tpo_map_button').click(setMapPage); element.find('#tpo_prison_button').click(setPrisonPage); return element; }; const getCardElement = (title, description, image, id) => { return `<div id="${id}" class="tpo_card"> <div class="tpo_card_content"> <div class="tpo_card_image"> ${image} </div> <div class="tpo_card_info_wrapper"> <div class="tpo_card_info"> <div class="tpo_card_info_title"> <h3 class="couleur4">${title}</h3> <h4>${description}</h4> </div> </div> </div> </div> </div>`; }; const setNewPageHeader = (title) => { $('#terminal_portable').attr('style', 'display:none;'); if ($('#tpo_header').length) { updateHeader( title, "$(this).parents('#tpo_header').parent().find('#tpo_content').remove();$(this).parents('#tpo_header').hide().parent().find('#terminal_portable').show();" ); $('#tpo_header').css('display', ''); } else { const headerElement = $(` <div id="tpo_header" class="tpo_one_dot_two_rem"> <div id="tpo_header_text"> <h2>${title} <span class="couleur5 link" onclick="$(this).parents('#tpo_header').parent().find('#tpo_content').remove();$(this).parents('#tpo_header').hide().parent().find('#terminal_portable').show();">Retour</span></h2> </div> <div id="tpo_header_extra"></div> </div>`); headerElement.appendTo($('#db_portable_device .content')); } }; const updateHeader = (title, action) => { $('#tpo_header_text').html(`<h2>${title} <span class="couleur5 link" onclick="${action}">Retour</span></h2>`); }; const fetchImperialData = () => { cercleList = undefined; infoOI = undefined; energyInfo = undefined; cAData = undefined; cryoData = undefined; isFetchingImperialData = true; $.ajax({ type: 'GET', url: 'https://www.dreadcast.net/Main/DataBox/SeeImperialData', success: (res) => { cercleList = $(res).find('.infos_cercles'); infoOI = $(res).find('.infos_oi'); energyInfo = $(res).find('.infos_energy'); cAData = $(res).find('.infos_nouveaux'); cryoData = $(res).find('.infos_cryo'); isFetchingImperialData = false; }, }).then(() => { $(cercleList).find('h2').remove(); if ($('#tpo_cercle_list').length) { showCercleList(); } $(infoOI).find('h2').remove(); if ($('#tpo_info_oi').length) { showInfoOI(); } $(energyInfo).find('h2').remove(); if ($('#tpo_energy_info').length) { showEnergyInfo(); } if ($('#tpo_ca_data').length) { showCAData(); } $(cryoData).find('h2').remove(); if ($('#tpo_cryo_data').length) { showCryoData(); } }); }; const fetchSTVData = (timestamp) => { $('#tpo_stv_data').empty(); sTVData = undefined; isFetchingSTVData = true; $.ajax({ type: 'GET', url: `https://www.dreadcast.net/Main/DataBox/default=CrystalHistory&date=${timestamp}`, success: (res) => { sTVData = $(res).find('#entreprise_historique'); $(sTVData).children()[1].remove(); isFetchingSTVData = false; }, }).then(() => { if ($('#tpo_stv_data').length) { showSTVData(timestamp); } }); }; const getTPOLoader = () => `<div id="tpo_loader" class="dbloader" style="color:#fff;font-size:12px;display:block;left:50%;margin-left:-100px;width:200px;height:100px;top:0px;text-align:center;background-position:bottom;margin-top:50px;margin-bottom:50px;"> Accès aux données du serveur... </div>`; const addOrRefreshSearchForm = (fn) => { const search = $('#tpo_search'); if (search?.length) { search.css('display', ''); $('#tpo_search input').on('keyup', (e) => { if (e.key === 'Enter' || e.keyCode === 13) { fn(); } }); $('#tpo_search input').attr('value', ''); $('#tpo_search_submit').unbind('click'); $('#tpo_search_submit').click(fn); } else { addSearchForm(fn); } }; const addSearchForm = (fn) => { const submitButton = $(`<button id="tpo_search_submit" class="transition3s tpo_modern_button">Rechercher</button>`); submitButton.click(fn); $(`<div id="tpo_search"> <input type="text" maxlength="100" autocomplete="on" value="" placeholder="Rechercher..."> </div>`).appendTo('#tpo_header_extra'); $('#tpo_search input').on('keyup', (e) => { if (e.key === 'Enter' || e.keyCode === 13) { fn(); } }); submitButton.appendTo($('#tpo_search')); }; ///////////////////// // Cercles publics // ///////////////////// const setCercleListPage = () => { if (cercleList === undefined && !isFetchingImperialData) { fetchImperialData(); } setNewPageHeader('Informations sur les Cercles Publics'); $('#tpo_header_text span').click(() => { $('#tpo_search').css('display', 'none'); }); getCercleListPageContent().appendTo('#db_portable_device .content'); if (cercleList !== undefined) { showCercleList(); } }; const getCercleListPageContent = () => { const element = $(` <div id="tpo_content"> <div id="tpo_loader" class="dbloader" style="color:#fff;font-size:12px;display:block;left:50%;margin-left:-100px;width:200px;height:100px;top:0px;text-align:center;background-position:bottom;margin-top:50px;margin-bottom:50px;">Accès aux données du serveur...</div> <div id="imperial_data"> <div id="tpo_cercle_list"></div> </div> </div> `); return element; }; const showCercleList = () => { $('#tpo_loader').remove(); addOrRefreshSearchForm(filterCercleList); $($(cercleList).clone()[0].innerHTML).appendTo('#tpo_cercle_list'); }; const filterCercleList = () => { const filterValue = $('#tpo_search input')[0].value.toLowerCase(); $('#tpo_cercle_list ul li').each((_, v) => { v.style = ''; if (!v.children[1].innerText.toLowerCase().includes(filterValue) && !v.children[2].innerText.toLowerCase().includes(filterValue)) { v.style = 'display: none;'; } }); }; /////////////////////////////// // Organisations Officielles // /////////////////////////////// const setInfoOIPage = () => { if (infoOI === undefined && !isFetchingImperialData) { fetchImperialData(); } setNewPageHeader('Organisations Officielles'); getInfoOIPageContent().appendTo('#db_portable_device .content'); if (infoOI !== undefined) { showInfoOI(); } }; const backToInfoOIPage = () => { updateHeader( 'Organisations Officielles', "$(this).parents('#tpo_header').parent().find('#tpo_content').remove();$(this).parents('#tpo_header').hide().parent().find('#terminal_portable').show();" ); $('#tpo_content').remove(); getInfoOIPageContent().appendTo('#db_portable_device .content'); showInfoOI(); }; const showInfoOI = () => { $('#tpo_loader').remove(); $($(infoOI).clone()[0].innerHTML).appendTo('#tpo_info_oi'); changeHistoryLinkOnInfoOI(); }; const getInfoOIPageContent = () => { const element = $(` <div id="tpo_content"> <div id="tpo_loader" class="dbloader" style="color:#fff;font-size:12px;display:block;left:50%;margin-left:-100px;width:200px;height:100px;top:0px;text-align:center;background-position:bottom;margin-top:50px;margin-bottom:50px;">Accès aux données du serveur...</div> <div id="imperial_data"> <div id="tpo_info_oi" class="infos_oi"></div> </div> </div> `); return element; }; const changeHistoryLinkOnInfoOI = () => { $('.infos_oi') .find('h3') .map((_, x) => { const path = $(x).find('.link').attr('onclick').replace("engine.convertDataBox('", '').replace("', 'db_imperial_data');", ''); const baseUrl = `https://www.dreadcast.net/${path}`; const name = $(x).text().replace('Historique', ''); $(x).find('.link').removeAttr('onclick'); $(x) .find('.link') .click(() => showHistoryPage(baseUrl, name)); }); }; const showHistoryPage = (baseUrl, name) => { addOrRefreshSearchElements(baseUrl, name); appendHistory(baseUrl); }; ////////////////////////// // Bulletin énergétique // ////////////////////////// const showEnergyInfo = () => { const html = $($(energyInfo).clone()[0].innerHTML); const numbers = html.find('.type2'); $('#current_energy').text(numbers[0].textContent); $('#expected_consumption').text(numbers[1].textContent); $('#actual_consumption').text(numbers[2].textContent); }; /////////////////////// // Service technique // /////////////////////// const setSTVPage = () => { if (!isFetchingSTVData) { const today = new Date().toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); const timestamp = Math.floor(new Date(`${today} GMT+0100`).getTime() / 1000); fetchSTVData(timestamp); } setNewPageHeader('Service Technique de la ville'); getSTVPageContent().appendTo('#db_portable_device .content'); }; const getSTVPageContent = () => { const element = $(` <div id="tpo_content"> ${getTPOLoader()} <div id="tpo_stv_data"></div> </div> `); return element; }; const showSTVData = (timestamp) => { addOrRefreshSTVNav(timestamp); updateHeader( 'Service Technique de la ville', "$(this).parents('#tpo_header').parent().find('#tpo_content').remove();$(this).parents('#tpo_header').hide().parent().find('#terminal_portable').show();$('#tpo_stv_header_extra').css('display', 'none');" ); $('#tpo_loader').remove(); $(sTVData).appendTo('#tpo_stv_data'); if ($('#tpo_stv_alert .tpo_toggle_svg_button').hasClass('active')) { $('.entreprise_historique_ligne').each((_, v) => { if (!$(v).find('.orange').length) { $(v).css('display', 'none'); } }); } addCopyButton(); }; const addOrRefreshSTVNav = (timestamp) => { const today = new Date().toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); if (!$('#tpo_stv_header_extra').length) { const date = new Date(timestamp * 1000).toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); const element = ` <div id=tpo_stv_header_extra> <div id="tpo_calendar"> <input type="text" id="datepicker" class="tpo_invisible"/> <button class="tpo_svg_button" onclick="$('#tpo_calendar #datepicker').focus()"> <svg viewBox="0 0 120 120" > <path d="M95 20h-5V10h-10v10H40V10H30v10H25c-5.55 0-9.95 4.5-9.95 10L15 100c0 5.5 4.45 10 10 10h70c5.5 0 10-4.5 10-10V30c0-5.5-4.5-10-10-10m0 80H25V50h70zM45 70H35v-10h10zm20 0h-10v-10h10zm20 0h-10v-10h10zm-40 20H35v-10h10zm20 0h-10v-10h10zm20 0h-10v-10h10z"></path> </svg> </button> </div> <div id="tpo_stv_nav"></div> <div id="tpo_stv_alert"> <button class="tpo_svg_button tpo_toggle_svg_button"> <svg viewBox="0 0 120 120"> <path d="M60 30 97.65 95H22.35zM60 10 5 105h110z"></path> <path d="M65 80h-10v10h10zm0-30h-10v25h10z"></path> </svg> </button> </div> </div>`; $(element).appendTo('#tpo_header_extra'); $('#datepicker').datepicker({ changeMonth: true, changeYear: true, dateFormat: $.datepicker.ISO_8601, minDate: '2011-12-08', maxDate: today }); $('#datepicker').val(date); $('#tpo_stv_alert .tpo_toggle_svg_button').click(toggleAlert); $('#datepicker').on('change', (event) => { const timestamp = Math.floor(new Date(`${event.target.value} 00:00 GMT+0100`).getTime() / 1000); updateSTVPage(timestamp); }); } else { $('#tpo_stv_nav').empty(); $('#tpo_stv_header_extra').css('display', ''); } buildSTVPageNav(timestamp); }; const toggleAlert = () => { if ($('#tpo_stv_alert .tpo_toggle_svg_button').hasClass('active')) { $('#tpo_stv_alert .tpo_toggle_svg_button').removeClass('active'); $('.entreprise_historique_ligne').each((_, v) => $(v).css('display', '')); } else { $('#tpo_stv_alert .tpo_toggle_svg_button').addClass('active'); $('.entreprise_historique_ligne').each((_, v) => { if (!$(v).find('.orange').length) { $(v).css('display', 'none'); } }); } }; const buildSTVPageNav = (timestamp) => { const maxDate = new Date().toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); const maxDateTimestamp = Math.floor(new Date(`${maxDate} GMT+0100`).getTime() / 1000); const minDate = new Date('2011-12-08').toLocaleDateString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); const minDateTimestamp = Math.floor(new Date(`${minDate} GMT+0100`).getTime() / 1000); const parts = []; if (timestamp - 172800 >= minDateTimestamp) { parts.push(getNavLinkElement(timestamp - 172800, false)); parts.push(' - '); } if (timestamp - 86400 >= minDateTimestamp) { parts.push(getNavLinkElement(timestamp - 86400, false)); parts.push(' - '); } parts.push(getNavLinkElement(timestamp, true)); if (timestamp + 86400 <= maxDateTimestamp) { parts.push(' - '); parts.push(getNavLinkElement(timestamp + 86400, false)); } if (timestamp + 172800 <= maxDateTimestamp) { parts.push(' - '); parts.push(getNavLinkElement(timestamp + 172800, false)); } $(parts).appendTo('#tpo_stv_nav'); }; const updateSTVPage = (timestamp) => { if (isFetchingSTVData) { return; } const date = new Date(timestamp * 1000).toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); if ($('#datepicker').val() !== date) { $('#datepicker').val(date); } $(getTPOLoader()).appendTo('#tpo_content'); fetchSTVData(timestamp); }; const getNavLinkElement = (timestamp, active) => { const today = new Date().toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); const date = new Date(timestamp * 1000).toLocaleString('en-CA', { timeZone: 'Europe/Paris' }).substring(0, 10); const element = $(`<span ${!active ? 'class="couleur4 link"' : ''}>${date === today ? "aujourd'hui" : date}</span>`); if (!active) { element.click(() => updateSTVPage(timestamp)); } return element; }; ///////////////////// // Centre d'arrivé // ///////////////////// const setCAPage = () => { if (cAData === undefined && !isFetchingImperialData) { fetchImperialData(); } setNewPageHeader("Compte-rendu du Centre d'Arrivée"); getCAPageContent().appendTo('#db_portable_device .content'); if (cAData !== undefined) { showCAData(); } }; const getCAPageContent = () => { const element = $(` <div id="tpo_content"> ${getTPOLoader()} <div id="tpo_ca_data"></div> </div> `); return element; }; const showCAData = () => { $('#tpo_loader').remove(); $(cAData) .find('ul') .children() .get() .reverse() .map((c) => getCAProfileCard($(c).clone()).appendTo('#tpo_ca_data')); }; const getCAProfileCard = (liElement) => { const name = liElement.find('.link').text(); const date = liElement.find('.couleur5').text(); const element = $(` <div class="tpo_profile_card"> <div class="tpo_profile_image"> <img src="https://www.dreadcast.net/images/avatars/${name}.png"> </div> <div class="tpo_profile_info"> <h3>${name}</h3> <p id="${name}_profile_info" class="couleur5 tpo_one_dot_two_rem"> </p><br> <p class="couleur5 tpo_one_dot_two_rem">Maturation: <span class="couleur4">${date}</span></p> </div> <div class="tpo_profile_action"> <button class="tpo_svg_button" onclick="nav.getMessagerie().newMessage('${name}')"> <svg viewBox="0 0 283.5 283.5"> <use xlink:href="#icon-envelope" filter="url(#dropshadow)"></use> </svg> </button> </div> </div> `); return element; }; ////////////////////////////// // Centre de cryogénisation // ////////////////////////////// const setCryoPage = () => { if (cryoData === undefined && !isFetchingImperialData) { fetchImperialData(); } setNewPageHeader('Centre de Cryogénisation'); getCryoPageContent().appendTo('#db_portable_device .content'); if (cryoData !== undefined) { showCryoData(); } }; const getCryoPageContent = () => { const element = $(` <div id="tpo_content"> ${getTPOLoader()} <div id="imperial_data"> <div id="tpo_cryo_data"></div> </div> </div> `); return element; }; const showCryoData = () => { $('#tpo_loader').remove(); $($(cryoData).clone()[0].innerHTML).appendTo('#tpo_cryo_data'); $('#tpo_cryo_data span.link').removeAttr('onclick'); $('#tpo_cryo_data span.link').click(setExtandedCryoPage); }; const showGigaCryoData = () => { $('#tpo_loader').remove(); $($(gigaCryoData).clone()[0].innerHTML).appendTo('#tpo_cryo_data'); }; const setExtandedCryoPage = () => { $('#tpo_content').empty(); $(getTPOLoader()).appendTo('#tpo_content'); $(`<div id="imperial_data"><div id="tpo_cryo_data"></div></div>`).appendTo('#tpo_content'); if (gigaCryoData) { showGigaCryoData(); } else { if (!isFetchingGigaCryoData) { fetchGigaCryoData(); } } }; const fetchGigaCryoData = () => { gigaCryoData = undefined; isFetchingGigaCryoData = true; $.ajax({ type: 'GET', url: 'https://www.dreadcast.net/Main/DataBox/ListeCryoFull', success: (res) => { gigaCryoData = $(res).find('.infos_cryo'); isFetchingGigaCryoData = false; }, }).then(() => { $(gigaCryoData).find('h2').remove(); if ($('#tpo_cryo_data').length) { showGigaCryoData(); } }); }; //////////// // CARTES // //////////// const setMapPage = () => { setNewPageHeader('Cartes du secteur'); getMapPageContent().appendTo('#db_portable_device .content'); setListeners(); }; const setListeners = () => { $('#db_portable_device').on('dragstop', () => { if ($('#tpo_map_container').length === 0) { $('#db_portable_device').off('dragstop'); return; } updateImageDragProperties(); }); }; const getMapPageContent = () => { const stepSize = 10; const element = $(` <div id="tpo_content"> <div class="tpo_tabs"> <button id="tpo_button_buildings" class="tpo_tab_btn tpo_tab_btn_active" onclick="$(this).parent().find('.tpo_tab_btn_active').removeClass('tpo_tab_btn_active');$(this).addClass('tpo_tab_btn_active');$('#tpo_map_container img').attr('src', 'https://www.dreadcast.net/Admin/Map/Buildings');">Bâtiments</button> <button id="tpo_button_crystals" class="tpo_tab_btn" onclick="$(this).parent().find('.tpo_tab_btn_active').removeClass('tpo_tab_btn_active');$(this).addClass('tpo_tab_btn_active');$('#tpo_map_container img').attr('src', 'https://www.dreadcast.net/Admin/Map/Crystals');">Cristaux farins</button> <button id="tpo_button_ground_quality" class="tpo_tab_btn" onclick="$(this).parent().find('.tpo_tab_btn_active').removeClass('tpo_tab_btn_active');$(this).addClass('tpo_tab_btn_active');$('#tpo_map_container img').attr('src', 'https://www.dreadcast.net/Admin/Map/Quality');">Qualité des sols</button> </div> <div class="tpo_map_section"> <div id="tpo_map_container"><img src="https://www.dreadcast.net/Admin/Map/Buildings"></div> <div id="tpo_map_controls"> <button id="zoomout" class="tpo_button"> <svg aria-hidden="true" viewBox="0 0 24 24" title="ZoomOut"> <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14M7 9h5v1H7z"> </path> </svg> </button> <input id="zoomlevel" type="range" min="0" max="100" value="0"> <button id="zoomin" class="tpo_button"> <svg aria-hidden="true" viewBox="0 0 24 24" title="ZoomIn"> <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"></path> <path d="M12 10h-2v2H9v-2H7V9h2V7h1v2h2z"></path> </svg> </button> </div> </div> </div> `); const zoomOut = () => { const currentZoom = parseInt($('#zoomlevel').attr('value')); const newZoom = Math.max(0, currentZoom - stepSize); $('#zoomlevel').attr('value', newZoom); scaleImage(newZoom); }; const zoomIn = () => { const currentZoom = parseInt($('#zoomlevel').attr('value')); const newZoom = Math.min(100, currentZoom + stepSize); $('#zoomlevel').attr('value', newZoom); scaleImage(newZoom); }; element.find('#zoomout').click(zoomOut); element.find('#zoomin').click(zoomIn); element.find('#zoomlevel').on('change', () => { const currentZoom = parseInt($('#zoomlevel').attr('value')); scaleImage(currentZoom); }); element.find('#tpo_map_container').on('wheel', (e) => { if (e.originalEvent.deltaY < 0) { zoomIn(); } if (e.originalEvent.deltaY > 0) { zoomOut(); } }); element.find('#tpo_map_container img').draggable({ containment: '#tpo_map_container', scroll: false }); return element; }; const scaleImage = (zoom) => { $('#tpo_map_container img').css('transform', `scale(${1 + zoom / 100})`); const imgElement = $('#tpo_map_container img'); const xMax = imgElement[0].getBoundingClientRect().width / 2 - 200; const yMax = imgElement[0].getBoundingClientRect().height / 2 - 200; const xMin = xMax * -1; const yMin = yMax * -1; const currentLeft = imgElement.css('left'); const currentTop = imgElement.css('top'); if (currentLeft.substring(0, currentLeft.length - 2) > xMax) { imgElement.css('left', `${xMax}px`); } if (currentLeft.substring(0, currentLeft.length - 2) < xMin) { imgElement.css('left', `${xMin}px`); } if (currentTop.substring(0, currentTop.length - 2) > yMax) { imgElement.css('top', `${yMax}px`); } if (currentTop.substring(0, currentTop.length - 2) < yMin) { imgElement.css('top', `${yMin}px`); } updateImageDragProperties(); }; const updateImageDragProperties = () => { const width = $('#tpo_map_container img')[0].getBoundingClientRect().width; const height = $('#tpo_map_container img')[0].getBoundingClientRect().height; const x = $('#tpo_map_container')[0].getBoundingClientRect().x; const y = $('#tpo_map_container')[0].getBoundingClientRect().y; $('#tpo_map_container img').draggable('option', 'containment', [x + 400 - width, y + 400 - height, x, y]); }; //////////// // Prison // //////////// const setPrisonPage = () => { if (!isFetchingPrisonData) { fetchPrisonData(); } setNewPageHeader('Prison'); getPrisonPageContent().appendTo('#db_portable_device .content'); }; const getPrisonPageContent = () => { const element = $(` <div id="tpo_content" style="width:auto;min-width:420px;"> ${getTPOLoader()} <div id="tpo_prison_data"></div> </div> `); return element; }; const fetchPrisonData = () => { $('#tpo_prison_data').empty(); isFetchingSTVData = true; $.ajax({ type: 'GET', url: `https://www.dreadcast.net/Main/DataBox/PrisonerList`, success: (res) => { isFetchingSTVData = false; sTVData = $(res).find('#db_liste_prisonnier .content'); if (sTVData && $('#tpo_prison_data').length) { $('#tpo_loader').remove(); sTVData.appendTo('#tpo_prison_data'); } }, }); }; ////////// // MAIN // ////////// const intercept = (urlMatch, callback) => { let send = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function () { this.addEventListener( 'readystatechange', function () { if (this.responseURL.includes(urlMatch) && this.readyState === 4) { callback(this); } }, false ); send.apply(this, arguments); }; }; $(document).ready(() => { setTimeout(() => { intercept('https://www.dreadcast.net/Item/Activate', applyTPModifications); }, A_SECOND); }); GM_addStyle(` #tpo_header { border-bottom: 1px solid; padding-bottom: 5px; margin-bottom: 10px; color: #fff; } #tpo_header h2 span { position: absolute; right: 0; font-size: 1rem; font-weight: 400; font-variant: small-caps; padding-top: 10px; padding-bottom: 10px; top: -10px; } #tpo_header input { padding-left: 5px; border: 1px solid #7ec8d8; color: #7ec8d8; } #tpo_history_range input { width: 37%; } #tpo_search input { width: 80%; line-height: 1.2em; } .tpo_modern_button { border: 1px solid #7ec8d8; background: #7ec8d8; line-height: 1.2em; width: 17%; color: #10426b; } .tpo_modern_button:hover { background: #10426b; color: #7ec8d8; } #tpo_header_extra { margin-top: 10px; } .tpo_alert { width: 70%; text-align: center; margin: auto; } #tpo_history_copy { position: absolute; right: 0px; bottom: 0px; color: #7ec8d8; font-size: 1rem; } #tpo_content { width: 420px; max-height: 500px; overflow: auto; } .tpo_tabs { display: flex; align-items: center; justify-content: center; } .tpo_tab_btn { border: none; border-bottom: 1px solid gray; color: #eee; cursor: pointer; padding: 10px 0; margin: 0 0 5px 0; width: 30%; } .tpo_tab_btn_active { border-bottom: 2px solid #7ec8d8; color: #7ec8d8; font-weight: bold; } .tpo_map_section { padding-bottom: 50px; } #tpo_map_container { width: 400px; height: 400px; margin: auto; overflow: hidden; } #tpo_map_controls { position: absolute; bottom: 15px; right: 25px; } #tpo_map_controls button { width: 24px; height: 24px; } #tpo_map_controls button svg { width: 26px; height: 26px; overflow: hidden; top: -1px; left: -1px; } .tpo_button { background: white; padding: 0; color: #307998; text-align: center; border: 1px solid #fff; box-sizing: border-box; box-shadow: 0 0 5px #5298b4; border-radius: 3px; } .tpo_button:hover { background: #0b9bcb; } .tpo_button svg { stroke: none; } .tpo_button svg:hover { fill: #fff; } .tpo_svg_button { border: none; } .tpo_svg_button:hover { cursor: pointer; } .tpo_svg_button svg:hover { fill: #eee; } .tpo_toggle_svg_button svg { fill: #999; } .tpo_toggle_svg_button.active svg { fill: #ffc146; } #tpo_map_controls input { height: 24px; margin: 0px 4px; } .tpo_profile_card { border-radius: 4px; box-shadow: 1px 1px 3px -1px rgba(0, 0, 0, 0.5); max-height: 90px; height: 7vh; margin: 0 auto 10px auto; display: flex; } .tpo_profile_info { padding: 5px; margin-right: auto; color: white; margin-left: 10px; } .tpo_profile_image img { max-height: 80px; max-width: 80px; height: 6.4vh; width: 6.4vh; top: 3px; left: 3px; } .tpo_profile_action { padding: 10px; margin: auto 0px; float: right; } .tpo_profile_action button { width: 38px; height: 38px; } .tpo_arrow_seperator { font-weight: bold; padding: 0 2px 0 2px; } .tpo_one_dot_two_rem { line-height: 1.2rem; font-size: 1.2rem; } #tpo_cards { display: flex; flex-wrap: wrap; gap: 4px; max-width: 42.7em; } .tpo_card { background-color: rgba(255, 255, 255, 0.1); border-radius: 10px; cursor: pointer; display: flex; height: 160px; flex-direction: column; width: 14em; } .tpo_card > .tpo_card_content { border-radius: inherit; display: flex; flex-direction: column; flex-grow: 1; inset: 1px; padding: 0px 4px 10px 4px; position: absolute; z-index: 2; border: 1px solid #ffffff33; } .tpo_card > .tpo_card_content:hover { border: 1px solid #ffffff; } .tpo_card_image { display: flex; height: 140px; justify-content: center; overflow: hidden; } .tpo_card_info_wrapper { align-items: center; display: flex; flex-grow: 1; justify-content: flex-start; } .tpo_card_info { align-items: flex-start; display: flex; gap: 4px; } .tpo_card_info > i { font-size: 1em; height: 20px; line-height: 20px; } .tpo_card_info_title > h3 { font-size: 1.1em; line-height: 20px; } .tpo_card_info_title > h4 { color: rgba(255, 255, 255, 0.5); font-size: 0.85em; } #tpo_energy_info { padding-top: 4px; width: 64%; } #tpo_energy_info .entreprise_infos_generales { width: 96%; padding: 10px; } #tpo_stv_header_extra { display: flex; } #tpo_stv_nav { margin-left: 30px; margin-right: 30px; text-align: center; width: 100%; font-size: 1rem; } #tpo_calendar { height: 1.6rem; position: absolute; top: -2px; left: 0px; } #tpo_calendar button svg { height: 1.6rem; } #tpo_stv_alert { height: 1.6rem; position: absolute; top: -2px; right: 0px; } #tpo_stv_alert button svg { height: 1.6rem; } .tpo_invisible { display: none; } #ui-datepicker-div { z-index: 300300 !important; } .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { border: 1px solid #ccc; background: #f6f6f6 url(../../images/jquery/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; color: #1c94c4; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover { border: 1px solid #fbcb09; background: #fdf5ce url(../../images/jquery/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; color: #c77405; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #fff url(../../images/jquery/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; color: #eb8f00; } .ui-widget-header { border: 1px solid #00839d; background: linear-gradient(to bottom,#00839d 0,#002c3e 100%); } .ui-datepicker-title select { color: #fff; border: 1px solid #7ec8d8; padding-left: 2px; } .ui-datepicker-title select option { color: #111; } #tpo_content div::-webkit-scrollbar-track { background: transparent; } #tpo_content div::-webkit-scrollbar-track:hover { background: rgba(255, 255, 255, 0.1); } `);