您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Fügt einen Filter für saisonale Einsätze hinzu
// ==UserScript== // @name Saisonale Einsätze // @namespace leeSalami.lss // @version 1.1.2 // @license MIT // @description Fügt einen Filter für saisonale Einsätze hinzu // @author leeSalami // @match https://*.leitstellenspiel.de // @require https://update.greasyfork.org/scripts/516844/API-Speicher.user.js // ==/UserScript== (async function () { 'use strict'; const missionsElement = document.getElementById('missions'); if (!missionsElement) { return; } /** * @type {string[]} */ const seasonalMissionIds = await getSeasonalMissionIds(); const missionSelector = getMissionSelector(seasonalMissionIds); let filtered = false; setCss(); addFilterButton(); function filterSeasonalMissions(e) { e.preventDefault(); filtered = !e.currentTarget.classList.contains('btn-success'); const missions = missionsElement.querySelectorAll(missionSelector); if (!filtered) { e.currentTarget.classList.replace('btn-success', 'btn-danger'); } else { e.currentTarget.classList.replace('btn-danger', 'btn-success'); } for (let i = 0, n = missions.length; i < n; i++) { missions[i].classList.toggle('seasonal-missions-filtered', filtered); } } function addFilterButton() { const icon = document.createElement('img'); icon.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAjElEQVR4nO2QuwmAQBBET0wvsAU7sBtTi7EAS7IAi7gCDMTIQHiyMoKKv8tdGFhu5+0O55wKSAHvHgrw5rsaFED7Arfmc6eLBpZAp/5OnXzWpwZnwKTBoO13GuQzf7bBAciB+iV2LV/Ywz1QRajfwyPQRGg8xH6KexE//HBEnT9s1sNXmX+FEy2IVbIAcIu+jCM+kocAAAAASUVORK5CYII=' icon.className = 'icon icons8-Calendar'; icon.height = 15; icon.width = 15; const button = document.createElement('a'); button.className = 'btn btn-xs btn-danger'; button.id = 'mission_select_seasonal_missions'; button.title = 'Saisonale Einsätze'; button.addEventListener('click', filterSeasonalMissions); button.appendChild(icon); document.getElementById('missions-panel-main').querySelector(':scope > a:last-of-type').insertAdjacentElement('afterend', button); } function getMissionSelector(seasonalMissionIds) { let missionSelector = '.missionSideBarEntry:not(.mission_deleted)'; for (let i = 0, n = seasonalMissionIds.length; i < n; i++) { missionSelector += `:not([mission_type_id="${seasonalMissionIds[i]}"])`; } return missionSelector; } async function getSeasonalMissionIds() { const seasonalMissionIds = []; const now = Date.now(); const db = await openDb(); await updateMissions(db); const missions = await getAllData(db, 'missions'); for (let i = 0, n = missions.length; i < n; i++) { if (missions[i]['additional']['date_start'] === undefined || missions[i]['additional']['date_end'] === undefined || seasonalMissionIds.includes(missions[i]['base_mission_id'])) { continue; } if (Date.parse(missions[i]['additional']['date_start']) < now && Date.parse(missions[i]['additional']['date_end']) > now) { seasonalMissionIds.push(missions[i]['base_mission_id']); } } return seasonalMissionIds; } const prepareMissionDomElementStrOrig = prepareMissionDomElementStr; prepareMissionDomElementStr = (e, t, i, n, s, o, a, r, l, c, u, d, h, p, m, _, f) => { const missionDomElementStr = prepareMissionDomElementStrOrig(e, t, i, n, s, o, a, r, l, c, u, d, h, p, m, _, f); if (filtered && !seasonalMissionIds.includes(s.mtid)) { return missionDomElementStr.replace("class='", "class='seasonal-missions-filtered "); } return missionDomElementStr; } function setCss() { const style = document.createElement('style'); style.innerHTML = ` .seasonal-missions-filtered { display: none; } `; document.head.appendChild(style); } })();