- // ==UserScript==
- // @name Agar Extras
- // @description Improves the functionality and aesthetic of agar.io
- // @include *agar.io/*
- // @grant none
- // @run-at document-start
- // @version 1.7
- // @author Tom Burris
- // @namespace https://greasyfork.org/en/users/46159
- // @icon http://bit.ly/2oT4wRk
- // @compatible chrome
- // ==/UserScript==
-
- "use strict";
-
- const byId = (id, prnt) => (prnt || document).getElementById(id);
- const byClass = (clss, prnt) => (prnt || document).getElementsByClassName(clss);
- const byTag = (tag, prnt) => (prnt || document).getElementsByTagName(tag);
- const hsl = hue => `hsl(${hue},100%,50%)`;
- const listen = (elm, evnt, cb) => elm.addEventListener(evnt, cb);
-
- /* document-start */
- (() => {
- const WebSocketOld = WebSocket;
- window.WebSocket = function(url) {
- window.wsURL = byId("wsTextInput").value = url;
- /*.replace(/\?.*$/, "")*/
- return new WebSocketOld(window.wsURL);
- };
- })();
-
- /* document-end */
- listen(document, "DOMContentLoaded", () => {
- let css = "";
-
- const nick = byId("nick");
- const profilePanel = byClass("agario-profile-panel")[0];
- const dailyQuests = byId("dailyQuests");
- const potionsBtn = byId("potions");
- const timers = byClass("timer menu-timer");
- const shopPanel = byClass("agario-shop-panel")[0];
- const options = byId("options");
- const rightPanel = byId("rightPanel");
- const playBtn = byClass("btn-play")[0];
- const prevent = event => event.preventDefault();
- const spectateBtn = byClass("btn-spectate")[0];
- const loginBtn = byClass("btn-login-play")[0];
- const subscribeBox = byId("agarYoutube");
-
- /* Fixes */
- css += "body {line-height: normal !important;}"; // blurry font.
- nick.type = "text"; // improper input.
-
- /* Compact Left Panel */
- css += ".quest-timer {width: auto; margin-left: 20px;}";
- profilePanel.appendChild(dailyQuests);
- dailyQuests.appendChild(timers[0]);
- profilePanel.appendChild(potionsBtn);
- potionsBtn.appendChild(timers[1]);
- const shopStuff = shopPanel.childNodes;
- while (shopStuff.length) {
- profilePanel.appendChild(shopStuff[0]);
- }
- css += "#freeCoins, #dailyQuests, #potions {margin: 0 0 5px 0;}";
- css += "#dailyquests-panel, .agario-shop-panel, #giftButton {display: none !important;}";
-
- /* Center Options */
- css += `#tags-container {display: none;} #options {margin-left: 25px;}`;
- for (let span of byTag("span", options)) {
- if (span.textContent == "Show Online Status") {
- span.textContent = "Show Online";
- }
- }
-
- /* Add Acid Mode */
- let acidLabel = document.createElement("label");
- acidLabel.innerHTML = `<input type="checkbox" id="acidMode" style="margin-top: 1px"><span>Acid mode</span>`;
- options.appendChild(acidLabel);
- const acidCheckbox = byId("acidMode");
- listen(acidCheckbox, "click", () => window.core.setAcid(window.checkbox.checked));
-
- /* FPS */
- let fpsBox = document.createElement("div");
- fpsBox.style = `
- position: absolute;
- top: 0px;
- left: 0px;
- color: white;
- background: black;
- `;
- document.body.appendChild(fpsBox);
- let frames = 0;
- setInterval(() => {
- fpsBox.textContent = "fps: " + frames;
- fpsBox.style.color = hsl(frames * 2);
- frames = 0;
- }, 1E3);
- const clearRectOld = CanvasRenderingContext2D.prototype.clearRect;
- CanvasRenderingContext2D.prototype.clearRect = function() {
- if (this.canvas === window.canvas) {
- frames++;
- }
- return clearRectOld.apply(this, arguments);
- };
-
- /* Server Connection */
- let wsBox = document.createElement("div");
- wsBox.innerHTML = `<input type="text" id="wsTextInput" class="agario-panel agario-side-panel" spellcheck="false"></input>`;
- rightPanel.appendChild(wsBox);
- const wsTextInput = byId("wsTextInput");
- listen(wsTextInput, "focus", wsTextInput.select.bind(wsTextInput));
- listen(wsTextInput, "blur", () => wsTextInput.value = window.wsURL);
- listen(wsTextInput, "keypress", ({keyCode: code}) => {
- if (code == 13) {
- window.core.disconnect();
- window.core.connect(wsTextInput.value);
- playBtn.click();
- }
- });
- css += `
- #wsTextInput {
- text-overflow: ellipsis;
- padding: 6px;
- display: inline-block;
- width: 293px;
- height: 34px;
- }
- #wsTextInput:focus {
- outline: 0px !important;
- box-shadow: 0 0 3px 1px white;
- }
- ::selection {
- background: #0d0 !important;
- }
- `;
-
- /* Mouse Controls */
- const speed = 50;
- const eject = () => {
- if (ejectDown) {
- window.core.eject();
- setTimeout(eject, speed);
- }
- };
- let ejectDown = false;
- window.canvas.addEventListener("mousedown", ({which}) => {
- if (which === 1) window.core.split();
- else if (which === 3) eject(ejectDown = true);
- });
- listen(window, "mouseup", ({which}) => which === 3 && (ejectDown = false));
- window.canvas.addEventListener("contextmenu", prevent);
- window.canvas.addEventListener("dragstart", prevent);
-
- /* Freeze */
- listen(window, "keydown", ({key}) => {
- if (key === "p") window.canvas.dispatchEvent(new MouseEvent("mousemove", {
- clientX: window.innerWidth / 2,
- clientY: window.innerHeight / 2
- }));
- });
-
- /* Arrow Keys */
- const keychange = ({keyCode: code, type}) => {
- const dir = code - 37;
- if (dir >= 0 && dir < 4 && (!keysDown[dir] || type == "keyup")) {
- keysDown[dir] = type == "keydown";
- update();
- }
- };
- const update = () => {
- let pos = [window.innerWidth / 2, window.innerHeight / 2];
- for (let n = 4; n--;) {
- if (keysDown[n]) {
- const min = Math.min(window.innerWidth, window.innerHeight);
- pos[n % 2] += [-1, 1][n / 2 | 0] * min / 2;
- }
- }
- window.canvas.dispatchEvent(new MouseEvent("mousemove", {
- clientX: pos[0],
- clientY: pos[1]
- }));
- };
- const keysDown = [];
- listen(document, "keydown", keychange);
- listen(document, "keyup", keychange);
-
- /* Music Player */
- const src = "//www.youtube.com/embed/TBGdEeYPYgg" + "?controls=0;";
- const player = document.createElement("div");
- player.className = "agario-panel agario-side-panel";
- player.style = "padding: 0px; width: 293px; height: 168px; margin-top: 5px;";
- player.innerHTML = `<iframe id="YTVideo" src="${src}" style="border: 0px; width: 100%; height: 100%;"></iframe>`;
- rightPanel.appendChild(player);
-
- /* Ubuntu Font */
- css += "@import url('https://fonts.googleapis.com/css?family=Ubuntu');";
- css += "body {font-family: 'Ubuntu', sans-serif !important;}";
- css += "#statsSubtext {white-space: nowrap;}";
-
- /* Vertically center main panel */
- css += `
- #helloContainer {
- position: relative;
- top: 50% !important;
- transform: perspective(1px) translate(-50%, -50%) !important;
- display: inline-block !important;
- width: auto !important;
- }
- #leftPanel {
- margin: 0px;
- width: 222px;
- }
- `;
-
- /* Always display settings and intructions, also move the login button */
- css += `
- #settings {
- display: block !important;
- }
- .btn-settings {
- display: none;
- }
- .btn-play-guest {
- width: 100%;
- margin: 0px !important;
- }
- .btn-play {
- width: 100% !important;
- margin: 0px !important;
- }
- .btn-login-play {
- width: 110px !important;
- float: right;
- }
- #instructions,
- #options,
- .text-muted,
- #mainPanel {
- cursor: default !important;
- }
- input,
- select {
- cursor: pointer !important;
- }
- `;
- spectateBtn.parentNode.appendChild(loginBtn);
-
- /* Darken Stuff */
- css += `
- select,
- .agario-panel,
- .shop-blocker,
- #blocker,
- input[type=text],
- footer,
- .progress,
- .party-token,
- .agario-profile-picture {
- background: black !important;
- color: white !important;
- border: 0px !important;
- border-radius: 0px !important;
- outline: 1px solid white !important;
- }
- span {
- color: white !important;
- }
- .party-icon-back {
- background: black !important;
- }
- .btn {
- border-radius: 0px !important;
- }
- `;
-
- /* Hide Static Ads */
- css += `
- .agario-promo-container,
- #advertisement,
- .diep-cross,
- #promo-badge-container,
- #agario-web-incentive,
- #mcbanners-container,
- #adsBottom {
- display: none !important;
- }
- `;
- subscribeBox.parentElement.style.display = "none";
-
- /* Append CSS To DOM */
- const style = document.createElement("style");
- style.innerHTML = css;
- document.head.appendChild(style);
- });
-
- /* document-idle */
- listen(window, "load", () => {
- // The page javascript changes the textContent (I think).
- byClass("btn-login-play")[0].textContent = "Login";
-
- /* Remove Video Ads */
- const good = () => {
- window.MC.notifyFullscreenAdFinished();
- //window.onDone();
- };
- window.initAdsController = good;
- window.requestAds = good;
- window.onAdLoaded = good;
- //window.adSlots = {};
- //window.googleAdsModule = {};
- //window.mc.Events.ads = {};
- //window.mc.services.ads = {};
- window.openOfferwall = good;
- window.openVideoAd = good;
- window.refreshAd = good;
- //window.supersonicAds = {};
- //window.startAd = function() {}; // banner.js line 1
- //console.log("%cDone!", "color:black;font-weight:bold;font-size:20px;");
- });