· 4 years ago · Apr 12, 2021, 08:18 AM
1// ==UserScript==
2// @name Region Streak Counter (Automated, Enabled on Challenges)
3// @include /^(https?)?(\:)?(\/\/)?([^\/]*\.)?geoguessr\.com($|\/.*)/
4// @description Adds a region streak counter to the GeoGuessr website
5// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
6// @require http://code.jquery.com/jquery-3.4.1.min.js
7// @grant GM_addStyle
8// ==/UserScript==
9
10let API_Key = 'ENTER_API_KEY_HERE'; //Replace ENTER_API_KEY_HERE with your API Key (so keep the quote marks)
11
12var $ = window.jQuery
13let streak = parseInt(sessionStorage.getItem("Streak"), 10);
14let streakBackup = parseInt(sessionStorage.getItem("StreakBackup"), 10);
15let checked = parseInt(sessionStorage.getItem("Checked"), 10);
16let last_guess = [0,0];
17let guess_btn = null;
18let check_result = null;
19
20if(sessionStorage.getItem("Streak") == null) {
21 sessionStorage.setItem("Streak", 0);
22 streak = 0;
23};
24
25if(sessionStorage.getItem("StreakBackup") == null) {
26 sessionStorage.setItem("StreakBackup", 0);
27 streakBackup = 0;
28};
29
30if(sessionStorage.getItem("Checked") == null) {
31 sessionStorage.setItem("Checked", 0);
32 checked = 0;
33};
34
35
36function updateStreak(newVariable) {
37 streak = newVariable;
38 if(document.getElementById("region-streak") != null) {
39 document.getElementById("region-streak").innerHTML = `<div id="region-streak"><font size="5"><h6>${streak}</h6></font></div>`;
40 };
41 if(document.getElementById("region-streak2") != null && document.getElementsByClassName("stack__item").length >= 3) {
42 document.getElementById("region-streak2").innerHTML = `<h2>Region Streak : ${streak}</h2><br>`;
43 };
44 if(document.getElementById("region-streak2") != null && !!document.querySelector('.result__more')) {
45 document.getElementById("region-streak2").innerHTML = `<h2>Region Streak : ${streak}</h2>`;
46 };
47};
48
49function addCounter(newDiv0) {
50 if(document.getElementsByClassName("game-status").length == 3) {
51 newDiv0 = document.createElement("div")
52 newDiv0.className = 'game-status';
53 document.getElementsByClassName("game-statuses")[0].appendChild(newDiv0);
54 newDiv0.innerHTML = `<div class="game-status__heading">Streak <small>(R)</small></div><div id="region-streak"><font size="5"><h6>${streak}</h6></font></div>`;
55 };
56 if(document.getElementsByClassName("game-status").length == 4 && document.getElementsByClassName("game-status__heading")[3].innerText == "TIME LEFT") {
57 newDiv0 = document.createElement("div")
58 newDiv0.className = 'game-status';
59 document.getElementsByClassName("game-statuses")[0].appendChild(newDiv0);
60 newDiv0.innerHTML = `<div class="game-status__heading">Streak <small>(R)</small></div><div id="region-streak"><font size="5"><h6>${streak}</h6></font></div>`;
61 };
62};
63
64function addCounterOnRefresh() {
65 setTimeout(function(){
66 addCounter();
67 },50);
68 setTimeout(function(){
69 addCounter();
70 },300);
71};
72
73function addCounter2() {
74 addCounter();
75 if(document.getElementsByClassName("game-status").length == 0) {
76 setTimeout(function() {
77 addCounter();
78 if(document.getElementsByClassName("game-status").length == 0) {
79 setTimeout(function() {
80 addCounter();
81 if(document.getElementsByClassName("game-status").length == 0) {
82 setTimeout(function() {
83 addCounter();
84 if(document.getElementsByClassName("game-status").length == 0) {
85 setTimeout(function() {
86 addCounter();
87 if(document.getElementsByClassName("game-status").length == 0) {
88 setTimeout(function() {
89 addCounter();
90 }, 4000);
91 };
92 }, 3000);
93 };
94 }, 2000);
95 };
96 }, 1200);
97 };
98 }, 400);
99 };
100};
101
102async function getUserAsync(location) {
103 if(location[0] <= -85.05) {
104 return 'AQ';
105 }
106 else{
107 let api = "https://api.bigdatacloud.net/data/reverse-geocode?latitude="+location[0]+"&longitude="+location[1]+"&localityLanguage=en&key="+API_Key
108 let response = await fetch(api)
109 .then(res => res.json())
110 .then((out) => {
111 let T = out.localityInfo.administrative
112 for (var i = 0; i < T.length; i++) {
113 if ((T[i].adminLevel == 4)) {
114 return T[i].wikidataId
115 }
116 }
117 })
118 return response;
119 };
120};
121
122function check(){
123 const game_tag = window.location.href.substring(window.location.href.lastIndexOf('/') + 1)
124 let api_url = ""
125 if (location.pathname.startsWith("/game/")) {
126 api_url = "https://www.geoguessr.com/api/v3/games/"+game_tag
127 }
128 else if (location.pathname.startsWith("/challenge/")) {
129 api_url = "https://www.geoguessr.com/api/v3/challenges/"+game_tag+"/game"
130 };
131 let rounds_tab = document.getElementsByClassName("game-status__body")
132 let current_round = rounds_tab[1].innerHTML.substr(0, rounds_tab[1].innerHTML.indexOf('/')).trim();
133 fetch(api_url)
134 .then(res => res.json())
135 .then((out) => {
136 rounds_tab = document.getElementsByClassName("game-status__body")
137 current_round = rounds_tab[1].innerHTML.substr(0, rounds_tab[1].innerHTML.indexOf('/')).trim();
138 let guess_counter = out.player.guesses.length
139 let guess = [out.player.guesses[guess_counter-1].lat,out.player.guesses[guess_counter-1].lng]
140 if (guess[0] == last_guess[0] && guess[1] == last_guess[1]) {
141 return;
142 };
143 last_guess = guess
144 let location = [out.rounds[guess_counter-1].lat,out.rounds[guess_counter-1].lng]
145 getUserAsync(guess)
146 .then(gue => {
147 getUserAsync(location)
148 .then(loc => {
149 if (gue == loc){
150 updateStreak(streak + 1);
151 sessionStorage.setItem("Streak", streak);
152 streakBackup = streak;
153 sessionStorage.setItem("StreakBackup", streak);
154 }
155 else {
156 if(streak == 0){
157 streakBackup = 0;
158 sessionStorage.setItem("StreakBackup", 0);
159 };
160 if(streak == 1){
161 updateStreak(0);
162 sessionStorage.setItem("Streak", 0);
163 document.getElementById("region-streak2").innerHTML = `<h2>Region Streak : ${streak}</h2>Fin de la streak après <b>${streakBackup}</b> régions.<br><br>`;
164 };
165 if(streak > 1){
166 updateStreak(0);
167 sessionStorage.setItem("Streak", 0);
168 document.getElementById("region-streak2").innerHTML = `<h2>Region Streak : ${streak}</h2>Fin de la streak après <b>${streakBackup}</b> régions.<br><br>`;
169 };
170 };
171 });
172 });
173 })
174.catch(err => { throw err });
175
176};
177
178function addStreak1(newDiv1) {
179 if(document.getElementById("region-streak2") == null && document.getElementsByClassName("stack__item").length >= 3 && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/"))) {
180 newDiv1 = document.createElement("div")
181 document.getElementsByClassName("stack__item")[0].appendChild(newDiv1);
182 newDiv1.innerHTML = `<div id="region-streak2" style="text-align:center"><h2>Region Streak : ${streak}</h2><br></div>`;
183 };
184};
185
186function addStreak2(newDiv2) {
187 if(document.getElementById("region-streak2") == null && !!document.querySelector('.result__more') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/"))) {
188 newDiv2 = document.createElement("div")
189 document.getElementsByClassName("margin--bottom")[0].appendChild(newDiv2);
190 newDiv2.innerHTML = `<div id="region-streak2" style="text-align:center"><h2>Region Streak : ${streak}</h2></div>`;
191 };
192};
193
194function addStreak() {
195 if (!!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") == 0){
196 check();
197 checked = checked + 1;
198 sessionStorage.setItem("Checked", checked);
199 }
200 else if (!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") != 0) {
201 checked = 0;
202 sessionStorage.setItem("Checked", checked)
203 };
204 setTimeout(function() {
205 if (!!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") == 0){
206 check();
207 checked = checked + 1;
208 sessionStorage.setItem("Checked", checked);
209 }
210 else if (!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") != 0) {
211 checked = 0;
212 sessionStorage.setItem("Checked", checked)
213 };
214 }, 250);
215 setTimeout(function() {
216 if (!!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") == 0){
217 check();
218 checked = checked + 1;
219 sessionStorage.setItem("Checked", checked);
220 }
221 else if (!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") != 0) {
222 checked = 0;
223 sessionStorage.setItem("Checked", checked)
224 };
225 }, 500);
226 setTimeout(function() {
227 if (!!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") == 0){
228 check();
229 checked = checked + 1;
230 sessionStorage.setItem("Checked", checked);
231 }
232 else if (!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") != 0) {
233 checked = 0;
234 sessionStorage.setItem("Checked", checked)
235 };
236 }, 1200);
237 setTimeout(function() {
238 if (!!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") == 0){
239 check();
240 checked = checked + 1;
241 sessionStorage.setItem("Checked", checked);
242 }
243 else if (!document.querySelector('.result') && (location.pathname.startsWith("/game/") || location.pathname.startsWith("/challenge/")) && sessionStorage.getItem("Checked") != 0) {
244 checked = 0;
245 sessionStorage.setItem("Checked", checked)
246 };
247 }, 2000);
248 setTimeout(function(){
249 addStreak1();
250 },300);
251 setTimeout(function(){
252 addStreak1();
253 },500);
254 setTimeout(function(){
255 addStreak2();
256 },200);
257 setTimeout(function(){
258 addStreak2();
259 },400);
260 setTimeout(function(){
261 addStreak1();
262 addStreak2();
263 },1200);
264 setTimeout(function(){
265 addStreak1();
266 addStreak2();
267 },2000);
268};
269
270document.addEventListener('keypress', (e) => {
271 switch (e.key) {
272 case '1':
273 updateStreak(streak + 1);
274 sessionStorage.setItem("Streak", streak);
275 streakBackup = streak;
276 sessionStorage.setItem("StreakBackup", streak);
277 break;
278 case '2':
279 updateStreak(streak - 1);
280 sessionStorage.setItem("Streak", streak);
281 streakBackup = streak;
282 sessionStorage.setItem("StreakBackup", streak);
283 break;
284 case '8':
285 updateStreak(streakBackup + 1);
286 sessionStorage.setItem("Streak", streak);
287 streakBackup = streak;
288 sessionStorage.setItem("StreakBackup", streak);
289 break;
290 case '0':
291 updateStreak(0);
292 sessionStorage.setItem("Streak", 0);
293 streakBackup = 0;
294 sessionStorage.setItem("StreakBackup", 0);
295 break;
296 };
297});
298
299document.addEventListener('click', addCounter2, false);
300document.addEventListener('click', addStreak, false);
301document.addEventListener('load', addCounterOnRefresh(), false);