NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name GeoGuessr Profile Activities // @namespace dreifachpunkt. // @author dreifachpunkt. // @description Displays the activities of friends in their GeoGuessr profile. Website might lag shortly when entering a users profile. // @version 0.0.1 // @include https://www.geoguessr.com/* // @run-at document-start // @license MIT // @updateURL https://openuserjs.org/meta/dreifachpunkt./GeoGuessr_Profile_Activities.meta.js // ==/UserScript== /*jshint esversion: 6 */ // --------------------------------------------------------------------------------------- // If you encounter any bugs or errors, please contact me on discord: dreifachpunkt.#9954 // --------------------------------------------------------------------------------------- const timeStrOptions = { hour: "numeric", minute: "numeric", }; const dateStrOptions = { month: "numeric", day: "numeric", }; var oldHref = document.location.href; window.onload = (event) => { showActivities(); var bodyList = document.querySelector("body"), observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (oldHref != document.location.href) { oldHref = document.location.href; showActivities(); } }); }); var config = { childList: true, subtree: true, }; observer.observe(bodyList, config); }; function showActivities() { if (!location.pathname.includes("/user/")) { return false; } var data; var xmlhttp = new XMLHttpRequest(); xmlhttp.open( "GET", "https://www.geoguessr.com/api/v3/social/feed/" + location.pathname.substring(6) + "?count=100", false ); xmlhttp.send(); if (xmlhttp.status === 200) { data = JSON.parse(xmlhttp.responseText); } else { //alert("An error occured, while getting user's activities."); return false; } var style = "a.customhref {\n" + " color: white;\n" + "}\n" + "table.custom-table {\n" + " border: 1px solid #e2e2e2;\n" + " width: 50%;\n" + " border-collapse: collapse;\n" + " margin-bottom: 40px;\n" + " font-size: 12px;\n" + "}\n" + "\n" + "table.custom-table td, table.custom-table th {\n" + " padding: 5px 10px;\n" + " border: 1px solid #e2e2e2;\n" + "}\n" + "\n" + "table.custom-table th {\n" + " text-transform: uppercase;\n" + " font-size: 10px;\n" + " color: black;\n" + " background-color: #FCFAF9;\n" + " opacity: 0.9;\n" + "}\n" + "\n" + "table.custom-table td:nth-child(3) {\n" + " max-width: 500px;\n" + " word-break: break-word;\n" + " text-align: center;\n" + "}\n" + "\n" + "table.custom-table td:nth-child(2) {\n" + " text-align: center;\n" + "}\n" + "\n" + "table.custom-table td:nth-child(1),\n" + "table.custom-table td:nth-child(4),\n" + "table.custom-table td:nth-child(5),\n" + "table.custom-table td:nth-child(6) {\n" + " text-align: center;\n" + "}\n" + "\n"; var nicestyle = document.createElement("style"); nicestyle.innerHTML = style; var activitiesTable = document.createElement("table"); activitiesTable.setAttribute("class", "custom-table center"); activitiesTable.setAttribute("style", "margin-bottom: 15px"); activitiesTable.innerHTML = "<tr><th>Date</th><th>Activity Type</th><th>Map / User</th><th>Score</th></tr>"; data.forEach((el) => { var date = Date.parse(el.dateTime); var trueDate = new Date(date); var tableRow = "<tr><td>" + trueDate.toLocaleDateString(undefined, dateStrOptions) + " at " + trueDate.toLocaleTimeString(undefined, timeStrOptions) + "</td>"; switch (el.activityType) { case 1: //become friends tableRow += '<td>friends</td><td><a class="customhref" href="https://www.geoguessr.com/user/' + el.payload.user.id + '">' + el.payload.user.nick + "</a></td>"; break; case 2: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 3: //play game tableRow += '<td>game</td><td><a class="customhref" href="https://www.geoguessr.com/maps/' + el.payload.map.slug + '">' + el.payload.map.name + '</a></td><td><a class="customhref" href="https://www.geoguessr.com/results/' + el.payload.map.gameToken + '">' + el.payload.map.score + "</a></td>"; break; case 4: //create map tableRow += '<td>map creation</td><td><a class="customhref" href="https://www.geoguessr.com/maps/' + el.payload.map.slug + '">' + el.payload.map.name + "</a></td>"; break; case 5: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 6: //like map tableRow += '<td>like</td><td><a class="customhref" href="https://www.geoguessr.com/maps/' + el.payload.map.slug + '">' + el.payload.map.name + "</a></td>"; break; case 7: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 8: //play challenge tableRow += '<td>challenge</td><td><a class="customhref" href="https://www.geoguessr.com/maps/' + el.payload.map.slug + '">' + el.payload.map.name + '</a></td><td><a class="customhref" href="https://www.geoguessr.com/results/' + el.payload.challenge.token + '">' + el.payload.challenge.score + "</a></td>"; break; case 9: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 10: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 11: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 12: //unlock achievement tableRow += "<td>achievement</td><td>" + el.payload.name + "</td>"; break; case 13: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 14: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 15: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 16: tableRow += "<td>UNKNOWN TYPE</td><td></td><td></td>"; break; case 17: //play streak game tableRow += '<td>streak</td><td></td><td><a class="customhref" href="https://www.geoguessr.com/results/' + el.payload.streak.gameToken + '">' + el.payload.streak.streak + "</a></td>"; } activitiesTable.innerHTML += tableRow + "</tr>"; }); document.getElementsByTagName("main")[0].appendChild(nicestyle); document.getElementsByTagName("main")[0].appendChild(activitiesTable); }