// ==UserScript== // @name CF Get Problems // @namespace http://tampermonkey.net/ // @version 1.0 // @description Add contest problems altogether with rating. // @author Dhanraj Chaurasia (coderdhanraj) // @license GPLv3 // @match https://*.codeforces.com/* // ==/UserScript== (function () { const ACshowrating = 1; const url = window.location.href; const match1 = url.match(/contest\/(\d+)/); const match2 = url.match(/problemset\/problem\/(\d+)/); var contestNumber = null if (match1) contestNumber = match1[1]; else if (match2) contestNumber = match2[1]; else contestNumber = -1 if (contestNumber != -1 || contestNumber.toString().length == 4) { const requestURL = `https://codeforces.com/api/contest.standings?contestId=${contestNumber}&from=1&count=1`; var userHandle = document.querySelector(".lang-chooser").childNodes[3].children[0].textContent; var requestURL2 = `https://codeforces.com/api/contest.status?contestId=${contestNumber}&handle=${userHandle}`;; fetchData(); async function fetchData() { const Verdict = { AC: "rgb(64, 255, 64)", WA: "rgb(255, 0, 0)", NA: "#0d9aff", }; const problems = [], verdicts = {}; try { const response = await fetch(requestURL); const data = await response.json(); const problemsList = data.result.problems; const response2 = await fetch(requestURL2); const data2 = await response2.json(); if (data2.status === "OK") { const res = data2.result; for (var k = 0; k < res.length; k++) { const index = res[k].problem.index; const curVerdict = (res[k].verdict == "OK" ? Verdict["AC"] : Verdict["WA"]); if (!(index in verdicts) || (index in verdicts && verdicts[index] != Verdict["AC"])) verdicts[index] = curVerdict; } } if (data.status == "OK") { for (var i = 0; i < problemsList.length; i++) { const index = problemsList[i].index; const title = index + " - " + problemsList[i].name; const rating = problemsList[i].rating; const verdict = (index in verdicts ? verdicts[index] : Verdict["NA"]) const problemUrl = `https://codeforces.com/contest/${contestNumber}/problem/${index}`; problems.push({ index: index, url: problemUrl, title: title, rating: (ACshowrating ? ((verdict == "rgb(64, 255, 64)") ? rating : null) : rating), verdict: verdict }); } } } catch (e) { } var toInsert; if (problems) { toInsert = ` <div class="roundbox sidebox" style=""> <div class="roundbox-lt"> </div> <div class="roundbox-rt"> </div> <div class="caption titled">→ Contest Problems <i class="sidebar-caption-icon las la-angle-down" onclick=" if (this.classList.contains('la-angle-right')) { document.getElementById('Tagblock').style.display = 'block'; this.classList.add('la-angle-down'); this.classList.remove('la-angle-right'); } else { document.getElementById('Tagblock').style.display = 'none'; this.classList.add('la-angle-right'); this.classList.remove('la-angle-down'); }"> </i> <div class="top-links"></div> </div> <div id="Tagblock" style="display: block;"> <div style="display: flex; margin: 8px auto; flex-wrap: wrap; justify-content: center; align-items: center; text-align: center;"> ` problems.forEach(e => { toInsert += ` <span style="width:3em; margin: 2px; text-align: center; box-sizing: border-box;"> <a title="${e.title}" href="${e.url}" style="color:${e.verdict}">${e.index}</a> <br><span class="small" title="Problem Rating">${e.rating == null ? '-' : e.rating}</span> </span> ` }); toInsert += '</div></div>' } const getProblemBox = document.createElement("div"); getProblemBox.innerHTML = toInsert; document.querySelector("#sidebar").prepend(getProblemBox); } } })();