GeoGuessr Ultimate Script

GeoGuessr Ultimate Script - One Script to rule them all - Work In Progress - Adding features over time - Removes Bottom, Right and Top Bar (Options) - Pimps Data - Makes for a cleaner experience - Removes Author (Optinal - For an extra challenge) - Changes flags with numbered flags - Adjust GeoGuessr Logo position - Adjusts Data position

目前为 2020-08-25 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name GeoGuessr Ultimate Script
  3. // @version 0.4.4
  4. // @description GeoGuessr Ultimate Script - One Script to rule them all - Work In Progress - Adding features over time - Removes Bottom, Right and Top Bar (Options) - Pimps Data - Makes for a cleaner experience - Removes Author (Optinal - For an extra challenge) - Changes flags with numbered flags - Adjust GeoGuessr Logo position - Adjusts Data position
  5. // @author MrAmericanMike
  6. // @include /^(https?)?(\:)?(\/\/)?([^\/]*\.)?geoguessr\.com($|\/.*)/
  7. // @grant none
  8. // @run-at document-start
  9. // @namespace https://greasyfork.org/en/scripts/406060-geoguessr-ultimate-script
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. "use strict";
  14. console.log("GeoGuessrUltimateScript");
  15.  
  16. // MODULES // Set from 'true' to 'false' any module that you don't need. Example: removeTopBar = false;
  17.  
  18. // REMOVE BOTTOM WHITE BAR WHILE PLAYING A MAP
  19. let removeBottomBar = true;
  20.  
  21. // REMOVE RIGHT WHITE BAR ON ROUND RESULTS SCREEN
  22. let removeRightBar = true;
  23.  
  24. // MAKE A CLEANER STREETVIEW BY REMOVING TOP BAR
  25. let removeTopBar = true;
  26.  
  27. // REPLACE FLAGS AT THE END OF A GAME WITH NUMBERED FLAGS
  28. let replaceFlags = true;
  29.  
  30. // MAKE FLAGS AND PINS TRANSPARENT ON MOUSE OVER
  31. let transparentPins = true;
  32.  
  33. // PIMP MY DATA
  34. let pimpData = true;
  35.  
  36. let floatData = "RIGHT"; // Where to place the logo on screen (Valid options "LEFT" "RIGHT")
  37.  
  38. let dataMargin = "0.5rem"; // Horizontal margin from the side of the window [default value is "2.0rem"] (https://www.w3schools.com/cssref/css_units.asp)
  39. let topMargin = "0.5rem"; // Vertical margin from top of the window [default value is "1.0rem"] (https://www.w3schools.com/cssref/css_units.asp)
  40.  
  41. let bgColor = "rgba(255, 255, 255, 0.55)"; // RGBA COLOR (https://www.hexcolortool.com/)
  42. let titlesColor = "#000033"; // Titles color on the data panel in HEX
  43. let dataColor = "#660000"; // Data color on the data panel in HEX
  44.  
  45. // GEOGUESSR LOGO
  46. let adjustLogo = true;
  47.  
  48. let floatLogo = "LEFT"; // Where to place the logo on screen (Valid options "LEFT" "CENTER" "RIGHT")
  49. let logoTopMargin = "0.25rem"; // Margin from top of the window (https://www.w3schools.com/cssref/css_units.asp)
  50. let logoOpacity = "0.5"; // Value going from 0.0 to 1.0 (0.0 represents fully transparent)
  51.  
  52. // HIDE FOOTPRINT - (This is where photospheres author would show)
  53. let hideFootprint = true;
  54.  
  55. // HIDE COMPASS - (For an extra challenge)
  56. let hideCompass = true;
  57.  
  58. // HIDE FLAG - (Hide the "Back to start flag" - For an extra challenge)
  59. let hideFlag = false;
  60.  
  61. // HIDE FULLSCREEN - (For those that don't need this button)
  62. let hideFullscreen = true;
  63.  
  64. // HIDE ZOOM - (Hide the zoom controls)
  65. let hideZoom = true;
  66.  
  67. // HIDE TOOLTIPS - (Hide the tooltips for flag, fullscreen and zoom controls)
  68. // Hiding an element does not hide the tooltip, so recommended leave this true
  69. let hideTooltips = true;
  70.  
  71.  
  72. // *******************************
  73. // NO NEED TO EDIT BELOW THIS LINE
  74. // *******************************
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96. // DEBUG
  97. let debug = true;
  98.  
  99. // IMAGES
  100. const IMAGES = [
  101. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAC4jAAAuIwF4pT92AAACjUlEQVR4nO2aT4hNURzHf1cTMVn4GzWUkoWUhVIsxIYVg7KwEaYGpZCkKItBzZQkSixkMjUkCxaKrSxYyv8/G2IhiiQl8XyOc5n7NPPc7n3nfa/mfOrTu2+65/1+9/vuPfe9M6+tVqvZaKZN3YCaGIC6ATUxAHUDamIA6gbUxADUDaiJAagbUBMDUDegJnQAy3ErLsYJ+Biv4wB+CFw7F6UC4Kv0dh5WpU/PJklyI92e6Z7j6r+GzMKVeARPY5+Jgyh7BizEten2zfRxGV7BaQ3GTcT92I3H8CR+LlB/DP4oMO4PIS6Bfmt88Fkm4VHchcfNnzUfc46dj+vNn02FCRFAUmDMdOzFg3jRfIh3bfh3dzxuw8M4WKzFIap2F3CXRnfqe7yFT/Cd+Ul0gfk5Z3KzClYtgCxTzZ/iQalyAC0hBqBuQE0MQN2AmhiAugE1MQB1A2piAIFf/ymexzv4FefhGvPrBGMD185FqAA+4T48h98zf3dBXMAO3Is7cFygHnIRIoCHuBtfNNjnNe7BE3gINwXq5Z+EKLoOv+Xc9yV2mV8aO4AbLf+l8cb8SlIpQgSQ9+CzPMPN5hdEutLtOSPs6xZJLps/y94WqFVH1e4C7l3tSXWLHytwLs7AL/gIr5kPrClULYAsD1KDUuUAWkJVAmjHTlyKO1tZWBmAm+3dP0nczO8O3oXwvNVNKAJYYv6+vwGnCOrXoQjgFC4S1B2WqswBMlQBuI/Cl/A2XhX18AtFAFvMf19wn+hmC+rXoQjgvqDmiMQ5QN2AmhhAyfFnbOiXIfdKvpaEUgEkSeIO+r888N/ES0DdgJoYgLoBNTEAcf1XVuxndU1DHYCcGIC6ATUxAHUDakZ9AD8BXfpYQy3tLQsAAAAASUVORK5CYII=',
  102. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAC4jAAAuIwF4pT92AAADRklEQVR4nO2aW4gPURzHf8NGbg+uuSaRcilKEQ9aJbyQdXkgIVvr8uCSpJDkEltaIkK5hBAeeBBCiRe8KeuWktsDNndqib/vr3PG/+z47+78Z/ac37R7vvVpZs7O7Pme7//M5ZyZklwuRy1ZJdIGpOUDkDYgLR+AtAFp+QCkDUjLByBtQFo+AGkD0vIBSBuQlu0ASsEiMBq0B4/AJXACfLRcdyylCgBD6SVYTNabB4MguKLXe/E2mBo5pB+YBLaC/aCShINI2wNGgOl6/apejgfnQfcGjusE1oIKsBPsAd8S1N8K/Elw3D/ZOAWOUcONN9UZbAMrQBWpXvMp5rFDwQxSvSmxbAQQJDimB9gB1oPTpEK8S4V/3XZgMdgCTiWzmFfW7gJ8alRoasAt8Bi8J3URHU7qmtOlqSrMWgCmupHq4laV5QCcyAcgbUBaPgBpA9LyAUgbkJYPQNqAtHwAlv//E3AU3AG1YDCYRmqeoI3lumPJVgBfwBpwGPw2yjmI46AvWA2WgraWPMSSjQCqwUrwrIF9XoNVYDfYCOZb8tKobFRaBn7F3PcFKCc1NbYOzKH4p8YbUjNJqWQjgLiNN/UULCQ1IVKu1wfUsy9Pkpwl1cveJqirjrJ2F+BfdbOGJz8mgEGgJ/gBHoKLpAJrEmUtAFMPNFaV5QCcSCKArmAeqZcmvXXZK3ADnARfXZpxHcBscAR0jJTzm6OZYBOpC+BlV4ZcBzCO/m+8KZ4evwAmgtsuDEldA36Ce+AlqUbz1b61/hs/B+wFI10YcR0AN3w7qbdANUZ5KbhO+RD4lRs/Bzy3bch1APzYW1ug/CapHjHWKOtDzTCAQo0PFfXywaaR+iqV0kAwyth+R2oobV1ZCWAXqVfdoaLDaGvKQgALqO6HFPwitNJV5dIBDAH7ImXLwWdXBtIGcIDyX4bcL/LYDuCcXobib4fOpPRUlFIFEAQBN7rYhoc6BIYZ2zzUXZbGTxJJnQLc0LnGNn8fNIuSfSeUShIB8MCnKlJ2DYzRhPpO6hSxKtcB8FCYp7OiM8FlGlM8cdqsAuD7PI/3+zuss1G5DGADmOKwvlhyGUA42ZkpST8IicsHIG1AWj4AaQPSavEB/AXGOn2ApXeUpQAAAABJRU5ErkJggg==',
  103. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAC4jAAAuIwF4pT92AAADe0lEQVR4nO2aW4hNURjHv80gooxbI/diHiQeRh5dHoxShLyMB51Mjcs8DMklyoNbppgmSjy4RCiXoijKk5RLKOUyLi+EwjQkKdfj//nWYc+ZM2f27H3W+nZZ//p19uXss779P3utvda3Vlk2m6X/WWXaAWjLG6AdgLa8AdoBaMsboB2AtrwB2gFoyxugHYC2vAHaAWjLtgEzwTIwDfQDj8ElcBx8sFx2JCUyAEPpFfiYY3YPBkFw2WwP530wL++SUaAabAf7QSMpG5H0CZgCFpjtK+ZzOjgLhha5bgDYAOrAbrAXfI5Rfg/wK8Z1f2WjChyl4jcfVjnYARpAE8lT8zHitRPBIpKnKbZsGBDEuGYY2AU2g1MkJt6iwv9uX7AcbAMn44X4T2l7C3DVqDO0gmugBbwnaUQnkbQ5g0pVYNoMCGsIySNuVWk2wIm8AdoBaMsboB2AtrwB2gFoyxugHYC2vAGWf/8JOAJugq+gEswnyRP0tlx2JNky4BNYBw6Bn6HjbMQxMBKsBStBH0sxRJINAx6C1eB5ke+8AmtAM9gCllqKpUvZKHQh+B7xuy9ALUlqbBOooehV4zVJJimRbBgQ9ebDegoyJAmRWrM9rpPvcpLkNMlT9jZGWe2UtrcA/6tbDZz8mAXGgwrwBTwCF0gMK4nSZkBYDwxWlWYDnEjLgKkkkyZjQS/wDtwmSa1/cxmIhgEnwJJOzrERG0k6T06kYcCYIuc4PX6YZGZpp4tgNNuANvDMxDCZpCrkxG+BM+a8VWkYwNNm3A3mOp9bpzsaXAUTzH5PkvFCk+1gNAxoLnDsJTgA9oSODXQRTJpegxV5+3dcFKppADd4PLvL01z8uDeEzt0gWUdgXZoG8Jxfed6xXD+/ntoPo60pTVWAxTPLgw1tLgrUNIDrOM8G83R3pflkA2aD66CKJG9gVUkN4JY7tzLkfjevrQ5t9wf7SIbBLG4fOD+wKklwUZTIgCAI+Ka7e+OFxMtjuAucCR2bUYLf7VKuqwB3gHgFyJsC50bk7TvJFbo2IEPSxz8HLpKM9/nfr6KOff+7LgLSaAQ551dj6EycVmt0EYxrA6IsaeN8AC+uvGc5lj9ybcBckh7fYuqY9OSqcJ5k2VyLq4BcG8BJz/UGXgTFo0B+/+eGxj8cx6PaEWo1qCptXWHn8gZoB6Atb4B2ANr6DQSNiEWFKZLTAAAAAElFTkSuQmCC',
  104. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAC4jAAAuIwF4pT92AAADCklEQVR4nO2aW4hNURjHv63JrZQRE+GBJEl5kyeXF14QyoOXCaNxeXBtKOTBrSFJklwSUUhSHhRPbiXeKMYlDxQhioRIjP9nrWP2OY1ztr1nrf+qs3716+w9Z+9Z3/6fvc8+e63V0NnZKfVMA7sANjEAdgFsYgDsAtjEANgFsIkBsAtgEwNgF8AmBsAugI3rAKbBJXAS7A8fwcvwNPzguO1MFAoAj9LL8TLTrh5JkuSKXR6m63B2xS4j4Qy4Ax6Cu4UcRNEzYCKca5ev2tcp8AIcUmW/AXAjbIV74QH4OUf7veCvHPv9xcUlcFKqH3yaRrgTrob7xJw1HzPuOx7OF3M25cZFAEmOfZpgO9wMz4oJ8a50/+n2g8vgdngmX4ldhHYX0Euj1foe3oSP4TsxX6ITxHznDOqpBkMLIM1gMae4U0IOwAsxAHYBbGIA7ALYxADYBbCJAbALYBMDcPz/n8AT8A78DsfCOWL6CXo7bjsTrgL4BNvgcfgz9XcN4hQcAdfDFbCPoxoy4SKAh3ANfFZlm5dwLdwPt8JmR7XUxEWj8+CPjNu+gC1iusY2wYWS/dJ4JaYnqRAuAsh68GmewkViOkRa7PKof2yrnSTnxZxlb3O0VUZodwH9VLdZtfNjOhwDh8KvsANeEhNYjxBaAGkeWJ0ScgBeCCWAqWK6x0voLfS6j4ZDCKAvPCrmR1KJRl+NhxDAFik/eK+wA9Bv+jZmAcwAdFjrmJCfCZgBrIST7bJOWM4zolQYVgA6Srwrta7D5c2MQlgBHBQzDKboz9obUkcBLBDTJ6DoSLCODM8i1PEH3wEMlPInOJ0j8EZI17/iO4A9Yh5slFti7gJUigZwWLpmhtyvsa3OHFmaWh8Ob9vlpoptda7ABvhNzBOhMwoFkCSJHnStA1e020tnf6RP9dHW7ij9MvySv7ps+LoEtKNjnKe2/gtfAZyDF6u8vxiuSq2vg9ek4ASoLPgKoKPG+68r1p/De25KKYf9MEQnBsAuwNJu9U4oAdCIAbALYBMDYBfApu4D+A30N2yf3VLhEwAAAABJRU5ErkJggg==',
  105. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAC4jAAAuIwF4pT92AAADUUlEQVR4nO2aW4hNURjHv61xjeQaRSJRTCkPXpR44UHk9sKDZGpQCknCNMml0JCIeBARIk15EB68eHJ5Um4jD0chlwmDRpPL+H/WambP7lyWffa3vl2z/vXrnH3O2mf99/+svfY53141nZ2d1JtVo21AWyEAbQPaCgFoG9BWCEDbgLZCANoGtBUC0DagrRCAtgFtSQcwF6wFs8Ag8AzcABfAZ+G+nVRVAPgrvR4PC+zm6SiKbtnnY3kbLErsMh7MB/vASXCQlIOodgTMAEvs89v2cQ64BkaV2W8I2A7qQRM4Br6n6L8P+JNivy5JnALnqPzBxzUM7AebwBEyo+aL477TwDIyoym1JAKIUuwzGhwAu8BlMiHep+Lf7kCwDuwFl9JZ7FbergJ8atRbWsFd8Bx8JDOJ1pKZc4Zn1WHeAohrJJkhLqo8B+BFIQBtA9oKAWgb0FYIQNuAtkIA2ga0FQIQ/vwWcBbcAx1gClhMpk7QT7hvJ0kF8BVsA2fA79jrHMR5MA5sBRtAfyEPTpII4AnYDF6WafMabAFHQSNYLeSloiQ6XQp+OrZ9BerIlMZ2gpXkfmq8IVNJqkoSAbgefFwvwBoyBZE6+3xiibZcJLlKZpS9T9FXD+XtKsDf6h4LFz/mgclgDGgHT8F1MoFlorwFENdji6jyHIAXaQTAw9ql1HUYFGSt6ATA9w02OrQ7IW2EpRGAa0X3k6gLK40ARiS2eWZvL9LOyy2zPATAP5wyu6z9r/IQQKuChy5pzwH8R8n1XqCItEcAL1W/QuZy9xDcBN98mvEdAPc3NLG9IrbNt8j5HyLf8e3wZcinePiXu3s8GDSQWVGyEPySNuQ7gB9gOWiz27yOYDqZRRa1sXa8ioSLJcelDVUbwCnqXhnyyKE9n9/NRV5vtOyOvbaK8h5AFEV80C4HXkk8GfJKkYaYpwkZfG5F+T4FeCXIhxLv8SkQ99NWol2m8h0Az/BTySyiegDekpn4ZoMdibZ3fBjyHQCv+phpKSeeK5rk7fgPIPkzuJj4XyD/NijIWjHyHQBPdLzCi2sCAxLvvQMXwSEqPU9kLt8BNFv6gklkRgRXefngC569/JNWTZBL5y1KffdQKIpqG9BWCEDbgLZ6fQB/AYF2gh8Ua2M5AAAAAElFTkSuQmCC'
  106. ];
  107.  
  108. setTimeout(executeRealTime, 5);
  109. setTimeout(executeRealTime, 150);
  110. setTimeout(executeRealTime, 300);
  111. setTimeout(executeRealTime, 600);
  112. setTimeout(executeRealTime, 900);
  113. setTimeout(executeRealTime, 1200);
  114. setTimeout(executeRealTime, 1500);
  115.  
  116. // REAL TIME
  117. function executeRealTime(){
  118. if(removeBottomBar){
  119. doRemoveBottomBar();
  120. }
  121. if(removeRightBar){
  122. doRemoveRightBar();
  123. }
  124. if(removeTopBar){
  125. doRemoveTopBar();
  126. }
  127. if(adjustLogo){
  128. doAdjustLogo();
  129. }
  130. }
  131.  
  132.  
  133. if(pimpData){
  134. doPimpData();
  135. }
  136. if(hideFootprint){
  137. doHideFootprint();
  138. }
  139. if(hideCompass){
  140. doHideCompass();
  141. }
  142. if(hideFlag){
  143. doHideFlag();
  144. }
  145. if(hideFullscreen){
  146. doHideFullscreen();
  147. }
  148. if(hideZoom){
  149. doHideZoom();
  150. }
  151. if(hideTooltips){
  152. doHideTooltips();
  153. }
  154.  
  155. if(replaceFlags){
  156. setTimeout(changeFlags, 1500);
  157. setTimeout(changeFlags, 750);
  158. setTimeout(changeFlags, 600);
  159. setTimeout(changeFlags, 450);
  160. setTimeout(changeFlags, 250);
  161. setTimeout(changeFlags, 50);
  162. document.addEventListener('mouseup', (event) => {
  163. setTimeout(changeFlags, 750);
  164. setTimeout(changeFlags, 600);
  165. setTimeout(changeFlags, 450);
  166. setTimeout(changeFlags, 250);
  167. setTimeout(changeFlags, 50);
  168. });
  169. }
  170.  
  171. if(transparentPins){
  172. setTimeout(makePinsTransparent, 1500);
  173. setTimeout(makePinsTransparent, 750);
  174. setTimeout(makePinsTransparent, 600);
  175. setTimeout(makePinsTransparent, 450);
  176. setTimeout(makePinsTransparent, 250);
  177. setTimeout(makePinsTransparent, 50);
  178. document.addEventListener('mouseup', (event) => {
  179. setTimeout(makePinsTransparent, 750);
  180. setTimeout(makePinsTransparent, 600);
  181. setTimeout(makePinsTransparent, 450);
  182. setTimeout(makePinsTransparent, 250);
  183. setTimeout(makePinsTransparent, 50);
  184. });
  185. }
  186.  
  187. // BOTTOM BAR
  188. function doRemoveBottomBar(){
  189. addGlobalStyle(`
  190. .game-layout__in-game-ad {
  191. display: none;
  192. }
  193. `);
  194. }
  195.  
  196. // RIGHT BAR
  197. function doRemoveRightBar(){
  198. addGlobalStyle(`
  199. .result__right {
  200. display: none;
  201. }
  202. `);
  203. }
  204.  
  205. // TOP BAR
  206. function doRemoveTopBar(){
  207. if(window.location.pathname.includes("game") || window.location.pathname.includes("challenge")){
  208. addGlobalStyle(`
  209. .layout {
  210. --layout-header-height: 0rem;
  211. }
  212. .header__right{
  213. display: none;
  214. }
  215. .game-layout__panorama-canvas{
  216. height: 100%;
  217. }
  218. `);
  219. }
  220. else{
  221. addGlobalStyle(`
  222. .layout {
  223. --layout-header-height: 3rem;
  224. }
  225. .header__right{
  226. display: block;
  227. }
  228. `);
  229. }
  230. }
  231.  
  232. // DATA
  233. function doPimpData(){
  234.  
  235. switch(floatData){
  236. case "LEFT":
  237. addGlobalStyle(`
  238. .game-layout__status{
  239. top: ${topMargin};
  240. left: ${dataMargin};
  241. right: auto;
  242. }
  243. `);
  244. break;
  245.  
  246. case "RIGHT":
  247. addGlobalStyle(`
  248. .game-layout__status{
  249. top: ${topMargin};
  250. right: ${dataMargin};
  251. left: auto;
  252. }
  253. `);
  254. break;
  255.  
  256. default:
  257. break;
  258. }
  259.  
  260. addGlobalStyle(`
  261. .game-statuses {
  262. background: ${bgColor};
  263. }
  264. .game-status__heading{
  265. color: ${titlesColor};
  266. }
  267. .game-status__body{
  268. color: ${dataColor};
  269. }
  270. `);
  271. }
  272.  
  273. // FOOTPRINT
  274. function doHideFootprint(){
  275. addGlobalStyle(`
  276. .gmnoprint, .gm-style-cc{
  277. display: none;
  278. }
  279. `);
  280. }
  281.  
  282. // COMPASS
  283. function doHideCompass(){
  284. addGlobalStyle(`
  285. .compass{
  286. display: none;
  287. }
  288. `);
  289. }
  290.  
  291. // FLAG
  292. function doHideFlag(){
  293. addGlobalStyle(`
  294. [data-qa="return-to-start"]{
  295. display: none;
  296. }
  297. `);
  298. }
  299.  
  300. // FULLSCREEN
  301. function doHideFullscreen(){
  302. addGlobalStyle(`
  303. [data-qa="enter-fullscreen"]{
  304. display: none;
  305. }
  306. `);
  307. }
  308.  
  309. // ZOOM
  310. function doHideZoom(){
  311. addGlobalStyle(`
  312. [data-qa="pano-zoom-in"]{
  313. display: none;
  314. }
  315. [data-qa="pano-zoom-out"]{
  316. display: none;
  317. }
  318. `);
  319. }
  320.  
  321. // HIDE TOOLTIPS
  322. function doHideTooltips(){
  323. addGlobalStyle(`
  324. .tooltip__label{
  325. display: none;
  326. }
  327. `);
  328. }
  329.  
  330. // GEOGUESSR LOGO
  331. function doAdjustLogo(){
  332. if(window.location.pathname.includes("game") || window.location.pathname.includes("challenge")){
  333. switch(floatLogo){
  334. case "LEFT":
  335. addGlobalStyle(`
  336. .header__left{
  337. margin-left: 0;
  338. }
  339. `);
  340. break;
  341.  
  342. case "CENTER":
  343. addGlobalStyle(`
  344. .header__left{
  345. margin-left: auto;
  346. }
  347. `);
  348. break;
  349.  
  350. case "RIGHT":
  351. addGlobalStyle(`
  352. .header__left{
  353. margin-left: auto;
  354. margin-right: 0;
  355. }
  356. `);
  357. break;
  358. }
  359.  
  360. addGlobalStyle(`
  361. .header__logo{
  362. margin-top: ${logoTopMargin};
  363. opacity: ${logoOpacity};
  364. }
  365. `);
  366. }
  367. else{
  368. addGlobalStyle(`
  369. .header__left{
  370. margin-left: 0;
  371. }
  372. .header__logo{
  373. margin-top: auto;
  374. opacity: 1;
  375. }
  376. `);
  377. }
  378. }
  379.  
  380. // CHANGE FLAGS
  381. function changeFlags(){
  382. let flags = document.getElementsByClassName("pin__image");
  383. if (flags.length >= 5) {
  384. Array.prototype.forEach.call(flags, (img, n) => {
  385. img.src = IMAGES[n];
  386. });
  387. }
  388. else if(flags){
  389. Array.prototype.forEach.call(flags, (img, n) => {
  390. img.src = "https://www.geoguessr.com/_next/static/images/correct-location-5bdcd0a4eabbbb9e42feb5c54e54f4a1.png";
  391. });
  392. }
  393. }
  394.  
  395. // TRANSPARENT FLAGS
  396. function makePinsTransparent(){
  397. let pins = document.getElementsByClassName("map-pin");
  398. Array.prototype.forEach.call(pins, (pin, n) => {
  399. pin.addEventListener("mouseover", () => {
  400. pin.style.opacity = 0.25;
  401. });
  402. pin.addEventListener("mouseout", () => {
  403. pin.style.opacity = 1;
  404. });
  405. });
  406. }
  407.  
  408. // GLOBAL STYLES INJECTOR
  409. function addGlobalStyle(css) {
  410. let head;
  411. let style;
  412. head = document.getElementsByTagName('head')[0];
  413. if (!head) { return; }
  414. style = document.createElement('style');
  415. style.type = 'text/css';
  416. style.innerHTML = css.replace(/;/g, ' !important;');
  417. head.appendChild(style);
  418. }
  419.  
  420. // LISTEN FOR PAGE CHANGES
  421. let currentTab = "";
  422. let oldTab = "";
  423.  
  424. window.addEventListener("click", (event) => {
  425. for (let x = 0; x < 1250; x+=250){
  426. setTimeout(() => {
  427. lookForURLChange(event);
  428. }, x);
  429. }
  430. });
  431.  
  432. function lookForURLChange(event) {
  433. if(event.explicitOriginalTarget){
  434. currentTab = event.explicitOriginalTarget.baseURI;
  435. }
  436. else if(event.path){
  437. event.path.forEach((element) => {
  438. if(element.hasOwnProperty("URL") && element.hasOwnProperty("location")){
  439. currentTab = element.location.pathname;
  440. }
  441. });
  442. }
  443.  
  444. if(oldTab != currentTab){
  445. oldTab = currentTab;
  446. setTimeout(executeRealTime, 0);
  447. }
  448. }
  449.  
  450. function myLog(data) {
  451. if(debug){
  452. console.log(data);
  453. }
  454. }
  455.  
  456. })();