adesduende / DebrisDetection

// ==UserScript==
// @name         DebrisDetection
// @namespace    http://tampermonkey.net/
// @version      2025-04-27
// @description  Search debris in 16 position of the universe of Ogame
// @author       adesduende
// @match        https://*.ogame.gameforge.com/game/*
// @require      http://code.jquery.com/jquery-3.4.1.min.js
// @downloadURL  https://openuserjs.org/install/adesduende/DebrisDetection.user.js
// @updateURL    https://openuserjs.org/meta/adesduende/DebrisDetection.meta.js
// @icon         data:image/gif;base64,R0lGODlhHgAeANU/ADJIWsLQ2bTBy0xidSlKZJysuDhUa8HP2CM5TFdvhKy6xKKxvCg9URsxRHGFlRw0SDZNYLzJ02h7iyxCVL/M1SREXY2eq1Bkc3uMmUFUZlpteyA+VbnH0FZrfLfFzoCWpYGSn7G+yUhdbWB0g7vI0r3K04WXpW2Ckqa1v0VabpSksKm3womZpixFVxctPkFXaBguQGR4h2+AjniKmE1hcUZfdJCfrCdBVx04Tl1xgFBnen6SoixKYHaHlXGAjRUeKyH5BAEAAD8ALAAAAAAeAB4AAAb/wJ9wSCwaj8ikcslsFmGQSQPpQrQAGYhrOVmgHC+EccJChTwKCUOJsJUoAssIMhVCBIf8oWSjPZIjEXkUESsmORA4dwGMAQckCxBJL3iMgxwFLwQCjXs2GXVHLQUHjZYoBgQKjhQcPWJKDyAUpgEUGBsEK3soOn9MgaYHHB0/GwslKpJKMEMvIaWnkjgWGDdCDCJrQi4TGRcyF0ItC9EHERh/DRM/ih02Aj2/PxoKHhwKGsYWpXAz20MyFOBAgUIIcUIQ5FgQIUKIDhVOUDiwwJcRBjJWlBgmoQgAEBxKFKiQgEIBA0oMfCjBgYYRBB0UCNBBIIGBCjFcFvlFQIKFqmVGIBTYQYCAAQsCOj5AACCFBBYybhKoMG9MjZq7OHQcYGEFBxIlIgj4MKDCkgoOODjS+qMHBz2mPOx4gaQBBBPRAnA48SPB21oHDPpAkmHBREuufgwIUcuWgBgAPYLwcHgYhh8vdgnzkGMJggEF3pAQcJlHgU5wRlRNAuDEjBw0AOyjtWdFBxxOfjxY7YAErwG5k+TwEAGFiOBJBihYcBw5Egggmjuf/iMIADs=
// @grant        none
// @copyright    2025, adesduende (https://openuserjs.org/users/adesduende)
// @license      MIT
// ==/UserScript==
let inProgress = true;

// Create interface
const $planetList = document.querySelector('#planetList');
const buttonFindDebris = document.createElement('i');
const buttonClearDebris = document.createElement('i');
const inputDebrisOffset = document.createElement('input');
const debrisContainer = document.createElement('div');
const positionDebrisContainer = document.createElement('div');
const ddProgressBar = document.createElement('div');
const ddBar = document.createElement('div');

debrisContainer.setAttribute('id', 'dd_debriscontainer');

buttonFindDebris.setAttribute('class', 'material-icons dd_icons dd_find');
buttonFindDebris.innerText = "search";

buttonClearDebris.setAttribute('class', 'material-icons dd_icons dd_delete');
buttonClearDebris.innerText = "delete";

inputDebrisOffset.setAttribute('type', 'text');
inputDebrisOffset.setAttribute('class', 'dd_searchbar');
inputDebrisOffset.setAttribute('placeholder', '1000000');

ddProgressBar.setAttribute('id', 'dd_progressBar');
ddBar.setAttribute('id', 'dd_Bar');

positionDebrisContainer.setAttribute('class', 'dd_positiondebriscontainer');

buttonFindDebris.addEventListener('click', () => {
  localStorageDebrisClear();
  let offSetDebris = (inputDebrisOffset.value !== "") ? inputDebrisOffset.value ?? 1000000 : 1000000;
  console.log(offSetDebris);
  getDebris(offSetDebris).then(() => {
    console.log("End of scan")
  });
  positionDebrisContainer.innerHTML = "";
});
buttonClearDebris.addEventListener('click', () => {
  ClearDebris();
});

ddProgressBar.append(ddBar);
debrisContainer.append(buttonFindDebris);
debrisContainer.append(inputDebrisOffset);
debrisContainer.append(buttonClearDebris);
debrisContainer.append(ddProgressBar);
debrisContainer.append(positionDebrisContainer);
$planetList.append(debrisContainer);

//Load data from localstorage on init
localStorageToDebris();

/*Delay function*/
function delay(time) {
  return new Promise(resolve => setTimeout(resolve, time));
}

/*Get debris with a offset of min debris */
async function getDebris(offSetDebris) {
  const gaMax = 5;
  const ssMax = 499;
  let debris = [];
  for (let ga = 1; ga <= gaMax; ga++) {
    for (let ss = 1; ss <= ssMax; ss++) {
      //console.log(`Ask for Galaxy: ${ga} System: ${ss}`);
      inProgress = true;
      var jqxhr = $.post("https://s261-es.ogame.gameforge.com/game/index.php?page=ingame&component=galaxy&action=fetchGalaxyContent&ajax=1&asJson=1", {
        galaxy: ga,
        system: ss
      }, function (data) {
        //Move progres bar
        moveBar(ga * ss, gaMax * ssMax);
        var json = $.parseJSON(data);

        //Get debris of position 16
        if (json.system.galaxyContent.length > 15) {
          let UME = 0;
          const metal = json.system.galaxyContent[15].planets.resources.metal.amount;
          const crystal = json.system.galaxyContent[15].planets.resources.crystal.amount;
          const deuterium = json.system.galaxyContent[15].planets.resources.deuterium.amount;

          UME += metal;
          UME += crystal * 2 / 3;
          UME += deuterium * 1 / 3;

          const minUME = offSetDebris;

          if (UME >= minUME) {
            const debri = {
              coord: {
                ga: ga,
                ss: ss,
              },
              UME: UME,
              Metal: metal,
              Crystal: crystal,
              Deuterium: deuterium
            };
            //Save to global variable
            debris.push(debri);
            //Save to local storage
            debrisToLocalStorage(debris);
            //Show Debris in DOM
            ShowDebris(debri);
            //Show in console
            console.log(`*** Debris in [${ga}:${ss}:16] ___ METAL: ${amountConvert(metal)} CRISTAL: ${amountConvert(crystal)} DEUTERIO: ${amountConvert(deuterium)}`);
          }
        }
      });

      jqxhr.done(() => {
        inProgress = false;
        //console.log(inProgress);
      });

      await delay(100);

    }
  }
}

// FUnction to show debris in DOM
function ShowDebris(debris) {
  positionDebrisContainer.innerHTML += `
                        <div class="dd_debris">
                          <a class="dd_coord" href="https://s261-es.ogame.gameforge.com/game/index.php?page=ingame&component=galaxy&galaxy=${debris.coord.ga}&system=${debris.coord.ss}&position=16">[${debris.coord.ga}:${debris.coord.ss}:16]</a>
                          <span class="dd_ume"><div class="debrisTooltip microdebris debris_1"></div> ${amountConvert(debris.UME)}</span>
                          <span class="dd_metal">${amountConvert(debris.Metal)}</span>
                          <span class="dd_crystal">${amountConvert(debris.Crystal)}</span>
                          <span class="dd_deuterium">${amountConvert(debris.Deuterium)}</span>
                        </div>`;
  //TODO: delete only one debri (icon: do_not_disturb_on)
}

//Function to clear debris
function ClearDebris() {
  positionDebrisContainer.innerHTML = "";
  localStorageDebrisClear();
}

//Clear localStorage
function localStorageDebrisClear() {
  localStorage.removeItem('dd_coords');
}

//Get Positions from localstorage
function localStorageToDebris() {
  const debris = JSON.parse(localStorage.getItem('dd_coords'));
  if (debris == null) return;
  for (let i = 0; i < debris.length; i++) {
    ShowDebris(debris[i]);
  }
}

//Save positions to localstorage
function debrisToLocalStorage(debris) {
  localStorage.setItem('dd_coords', JSON.stringify(debris));
}

/* Convert amounts to short expresion*/
function amountConvert(amount) {
  let result = "";
  const decimals = 1;
  if (amount > 1000000000) {
    result = (Math.round(amount / (1000000000 / (decimals * 10))) / (decimals * 10)).toFixed(decimals) + "G";
  }
  else if (amount > 1000000) {
    result = (Math.round(amount / (1000000 / (decimals * 10))) / (decimals * 10)).toFixed(decimals) + "M";
  }
  else {
    result = (Math.round(amount / (1000 / (decimals * 10))) / (decimals * 10)).toFixed(decimals) + "K";
  }

  return result;
}

/* Progress bar movement*/
var i = 0;

function moveBar(amount, maxVal) {
  const percent = amount * 100 / maxVal;
  const elem = document.getElementById("dd_Bar");
  elem.style.width = percent + "%";
}

/* CSS Style sheet*/
const dd_css = `
#dd_debriscontainer{
  font-size: 8pt;
  &>.dd_icons{
    font-size: 19pt !important;
    cursor: pointer;

    &>.dd_find:hover {
      font-size: 15pt !important;
    }
    &>.dd_delete:hover {
      font-size: 15pt !important;
    }
  }

  &>.dd_positiondebriscontainer {
    display: flex;
    flex-flow:column;
    gap: 3px;

    &>.dd_debris {
      display: flex;
      gap: 3px;

      &>.dd_coord {
        color: violet;
      }

      &>.dd_ume {
        color: white;
        display: flex;

        &>.debrisTooltip.microdebris.debris_1 {
          width: 12px;
          height: 12px;
          background-size: contain;
        }
      }
      &>.dd_metal {
        color: hsl(240deg 24% 68%);
      }
      &>.dd_crystal {
        color: hsl(199deg 72% 74%);
      }
      &>.dd_deuterium {
        color: hsl(172deg 45% 46%);
      }
    }
  }
}
#dd_progressBar {
  width: 100%;
  background-color: grey;
  margin-top: 3px;
  margin-bottom: 3px;
}

#dd_Bar {
  width: 0%;
  height: 5px;
  background-color: green;
}
`;
const ddStyleCSS = document.createElement('style');
//const matIcons = document.createElement('link');

ddStyleCSS.setAttribute('id', 'ddCssStyle');
ddStyleCSS.innerText = dd_css;

//matIcons.setAttribute('href','https://fonts.googleapis.com/icon?family=Material+Icons');
//matIcons.setAttribute('rel','stylesheet');

document.head.append(ddStyleCSS);
//document.head.append(matIcons);