// ==UserScript==
// @name Embedded diep lobby selector
// @namespace http://tampermonkey.net/
// @version 2
// @description Embed diep lobby selector into diep.io page
// @author discord@celestial_raccoon_80621
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @match diep.io/*
// @grant none
// @license MIT
// ==/UserScript==
/*
This script (unless in TypeScript form) is the result of
transpiling TypeScript into JavaScript, hence why this
code looks so messy. This is because i want types with
TypeScript, but tampermonkey doesn't support TypeScript
so i have to transpile my TypeScript code with the `tsc`
compiler, then put it here, if you want the TypeScript
source, DM on discord and i'll likely respond
in a few hours or less, discord username is in the
author field above or in any gui of the script
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
(() => {
'use strict';
// Top level variables, change TOGGLE_KEYBIND to whatever you want (to change display visibility)
const TOGGLE_KEYBIND = 'q';
const UPDATE_DELAY = 1000; // miliseconds
const storageKey = "diepioLobbyselect_";
const API = "https://lb.diep.io/api/lb/pc"; // or you can change this to /mobile
// todo: add these in accurately
let colors = {
fra: "rgba(255, 0, 0, 0.5)",
atl: "rgba(255, 255, 0, 0.5)",
sgp: "rgba(50, 50, 200, 0.5)",
syd: "rgba(0, 255, 0, 0.5)"
};
let intToTeam = {
0: "blue",
1: "red",
2: "purple",
3: "green"
};
let intToColor = {
0: "rgb(33, 143, 221)",
1: "rgb(232, 27, 27)",
2: "rgb(184, 13, 207)",
3: "rgb(81, 220, 34)",
};
let data = [];
// local storage management
const storage = {
get(key, defaultValue) {
return localStorage.getItem(storageKey + key) || defaultValue;
},
set(key, value) {
return __awaiter(this, void 0, void 0, function* () {
localStorage.setItem(storageKey + key, value);
});
},
getBool(key, defaultValue) {
let value = this.get(key, null);
return value === null ? defaultValue : value === "true";
},
getNumber(key, defaultValue) {
let value = this.get(key, null);
return value === null ? defaultValue : parseFloat(value);
},
};
let showUI = storage.getBool('showUI', false);
// inject CSS into the head element
// https://stackoverflow.com/questions/79614720/how-do-i-add-hover-and-active-events-to-my-tampermonkey-injected-script
const styleElem = document.createElement('style');
styleElem.textContent = `
.lobby-button {
padding: 5px;
border: 1px solid black;
background-color: rgba(255, 255, 255, 0.5);
cursor: pointer;
transition: background-color 0.2s ease;
}
.lobby-button:hover {
background-color: rgba(200, 200, 200, 0.7);
}
.lobby-button:active {
background-color: rgba(150, 150, 150, 0.9);
}
`;
document.head.appendChild(styleElem);
function getTextForNumPlayers(numPlayers) {
// this function was vibe coded
if (numPlayers < 850)
return "Very Low";
if (numPlayers < 900)
return "Low";
if (numPlayers < 950)
return "Below Average";
if (numPlayers < 1050)
return "Average";
if (numPlayers < 1100)
return "Above Average";
if (numPlayers < 1200)
return "High";
return "Very High";
}
// update the values in the UI every second
function update() {
return __awaiter(this, void 0, void 0, function* () {
let response = yield fetch(API);
let value = yield response.json();
data = value.regions;
let count = 0;
for (let region of data) {
count += region.numPlayers;
}
numPlayers.textContent = `Players Active: ${count} (${getTextForNumPlayers(count)})`;
// https://stackoverflow.com/questions/3955229/remove-all-child-elements-of-a-dom-node-in-javascript
buttons.textContent = "";
for (let region of data) {
let playerCount = document.createElement('p');
playerCount.textContent = `${region.regionName} ${region.numPlayers} Players`;
playerCount.style.marginRight = "0px";
buttons.appendChild(playerCount);
for (let index = 0; index < region.lobbies.length; index++) {
// put every sixth lobby on a new row
if (index % 6 === 0 && index > 5) {
buttons.appendChild(document.createElement('br'));
}
const lobby = region.lobbies[index];
const button = document.createElement('button');
button.textContent = `${lobby.gamemode} ${lobby.numPlayers}p`;
button.className = 'lobby-button';
button.addEventListener('click', () => {
let teamIndex = buttonIndex;
if (lobby.gamemode === "teams"
&& teamIndex > 1
|| !lobby.gamemode.includes("teams")) {
teamIndex = 0;
}
window.open(`https://diep.io/?ip=${lobby.ip}&g=${lobby.gamemode}&l=0x${teamIndex}`);
});
button.style.padding = "5px";
button.style.border = "1px solid black";
button.style.backgroundColor = colors[region.region] || "rgba(255, 255, 255, 0.5)";
button.style.marginLeft = "5px";
button.style.marginBottom = "2px";
buttons.appendChild(button);
}
buttons.appendChild(document.createElement('br'));
}
});
}
update();
let IntervalID = setInterval(update, UPDATE_DELAY);
// toggle display visibility
function toggle() {
return __awaiter(this, void 0, void 0, function* () {
let display = container.style.display;
container.style.display = display === 'block' ? 'none' : 'block';
showUI = !showUI;
storage.set('showUI', showUI);
console.log("ShowUI is: ", showUI);
if (showUI) {
update();
IntervalID = setInterval(update, UPDATE_DELAY);
}
else {
clearInterval(IntervalID);
}
});
}
// handle display visibility update
document.addEventListener('keydown', (ev) => {
if (ev.key === TOGGLE_KEYBIND) {
toggle();
}
});
const container = document.createElement('div');
let style = container.style;
style.position = 'absolute';
style.left = '0%';
style.top = '0';
style.zIndex = '999999';
style.backgroundColor = 'rgba(255, 255, 255, 0.5)';
style.padding = '5px';
style.border = '1px solid black';
style.borderRadius = '5px';
style.display = 'block';
document.body.append(container);
const title = document.createElement('p');
title.textContent = 'Diep lobby selector by EclipSyS';
title.style.position = 'relative';
title.style.zIndex = '999999';
title.style.padding = '0px';
title.style.margin = '0px';
container.appendChild(title);
const numPlayers = document.createElement('p');
numPlayers.textContent = "Players Active: ?";
numPlayers.style.position = 'relative';
numPlayers.style.zIndex = '999999';
numPlayers.style.padding = '0px';
numPlayers.style.margin = '0px';
numPlayers.style.marginBottom = "3px";
container.appendChild(numPlayers);
const teamDiv = document.createElement('div');
teamDiv.style.zIndex = '999999';
teamDiv.style.backgroundColor = 'rgb(25, 160, 205)';
teamDiv.style.border = '1px solid black';
teamDiv.style.borderRadius = '5px';
teamDiv.style.display = 'flex';
teamDiv.style.height = "20px";
const teamTitle = document.createElement('p');
teamTitle.textContent = "Switch target team:";
teamTitle.style.marginTop = "0px";
teamDiv.appendChild(teamTitle);
let buttonIndex = storage.getNumber('teamIndex', 0);
const teamButton = document.createElement('button');
teamButton.style.marginLeft = "5px";
teamButton.textContent = intToTeam[buttonIndex];
teamButton.style.backgroundColor = intToColor[buttonIndex];
teamButton.addEventListener('click', () => {
buttonIndex++;
if (buttonIndex >= Object.keys(intToTeam).length) {
buttonIndex = 0;
}
teamButton.textContent = intToTeam[buttonIndex];
teamButton.style.backgroundColor = intToColor[buttonIndex];
storage.set('teamIndex', buttonIndex);
});
teamDiv.appendChild(teamButton);
container.appendChild(teamDiv);
const buttons = document.createElement('div');
let btnStyle = buttons.style;
btnStyle.right = '0%';
btnStyle.top = '0';
btnStyle.zIndex = '999999';
btnStyle.backgroundColor = 'rgb(141, 24, 187)';
btnStyle.padding = '5px';
btnStyle.border = '1px solid black';
btnStyle.borderRadius = '5px';
btnStyle.display = 'block';
container.appendChild(buttons);
console.log("Initial showUi is", showUI);
if (!showUI) {
// by default the div is visible, we set this here to synchronize the values
showUI = true;
toggle();
}
})();