Skip to content
This repository was archived by the owner on Feb 14, 2022. It is now read-only.

Commit 2d60b73

Browse files
committed
Added unlisted rank image
1 parent 3f9d14a commit 2d60b73

2 files changed

Lines changed: 108 additions & 96 deletions

File tree

content.js

Lines changed: 107 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,205 +1,216 @@
11
function getData(url, callback) {
2-
var request = new XMLHttpRequest();
3-
request.open('GET', url, true);
2+
var request = new XMLHttpRequest()
3+
request.open('GET', url, true)
44
request.onload = function () {
55
if (request.status >= 200 && request.status < 400) {
6-
callback(request.responseText);
6+
callback(request.responseText)
77
}
8-
};
9-
request.send();
8+
}
9+
request.send()
1010
}
1111

1212
function getJson(url, callback) {
13-
var request = new XMLHttpRequest();
14-
request.open('GET', url, true);
13+
var request = new XMLHttpRequest()
14+
request.open('GET', url, true)
1515
request.onload = function () {
1616
if (request.status >= 200 && request.status < 400) {
17-
var data = JSON.parse(request.responseText);
18-
callback(data);
17+
var data = JSON.parse(request.responseText)
18+
callback(data)
1919
}
20-
};
21-
request.send();
20+
}
21+
request.send()
2222
}
2323

2424
function getDom(url, callback) {
25-
var request = new XMLHttpRequest();
26-
request.open('GET', url, true);
25+
var request = new XMLHttpRequest()
26+
request.open('GET', url, true)
2727
request.onload = function () {
2828
if (request.status >= 200 && request.status < 400) {
29-
var el = document.createElement('html');
30-
el.innerHTML = request.responseText;
31-
callback(el);
29+
var el = document.createElement('html')
30+
el.innerHTML = request.responseText
31+
callback(el)
3232
} else {
3333
// TODO
3434
}
35-
};
35+
}
3636
request.onerror = function () {
3737
// TODO
38-
};
39-
request.send();
38+
}
39+
request.send()
4040
}
4141

4242
function initializeVoting(token, problemId, votedFlag) {
4343
var params = {
4444
"token": token
45-
};
46-
var xhr = new XMLHttpRequest();
47-
xhr.open('POST', 'https://api.solved.ac/validate_token.php', true);
48-
xhr.setRequestHeader('Content-type', 'application/json');
45+
}
46+
var xhr = new XMLHttpRequest()
47+
xhr.open('POST', 'https://api.solved.ac/validate_token.php', true)
48+
xhr.setRequestHeader('Content-type', 'application/json')
4949
xhr.onload = function () {
5050
if (this.status == 200) {
51-
var response = JSON.parse(this.responseText);
51+
var response = JSON.parse(this.responseText)
5252
if (response.success) {
53-
var user = response.user;
53+
var user = response.user
5454
if (user.level >= 16) {
5555
if (document.querySelector(".label-success")) {
56-
const bottom = document.querySelector(".col-md-12:nth-child(4)");
57-
const toggleFunction = "var o=document.getElementById('problem_difficulty');if(o.className==='poll_shown'){o.className='poll_hidden';}else{o.className='poll_shown';}";
58-
var visibleState = "poll_shown";
59-
if (votedFlag == true) visibleState = "poll_hidden";
60-
bottom.outerHTML += "<div class=\"col-md-12\"><section id=\"problem_difficulty\" class=\"" + visibleState + "\"><div class=\"headline\" onclick=\"" + toggleFunction + "\"><h2>난이도 투표 <small>펼치기/접기</small></h2></div></section></div>";
56+
const bottom = document.querySelector(".col-md-12:nth-child(4)")
57+
const toggleFunction = "var o=document.getElementById('problem_difficulty');if(o.className==='poll_shown'){o.className='poll_hidden';}else{o.className='poll_shown';}"
58+
var visibleState = "poll_shown"
59+
if (votedFlag == true) visibleState = "poll_hidden"
60+
bottom.outerHTML += "<div class=\"col-md-12\"><section id=\"problem_difficulty\" class=\"" + visibleState + "\"><div class=\"headline\" onclick=\"" + toggleFunction + "\"><h2>난이도 투표 <small>펼치기/접기</small></h2></div></section></div>"
6161

62-
const difficultySection = document.getElementById("problem_difficulty");
62+
const difficultySection = document.getElementById("problem_difficulty")
6363
for (var i = 1; i <= 30; i++) {
6464
const func = "var params={'token':'"+token+"','id':"+problemId+",'level':"+i+"};" +
6565
"var o=new XMLHttpRequest;" +
6666
"o.open('POST','https://api.solved.ac/vote_difficulty.php',!0)," +
6767
"o.onload=function(){if(o.status>=200&&o.status<400){location.reload()}else{alert(JSON.parse(o.responseText).error)}}," +
68-
"o.send(JSON.stringify(params))";
69-
difficultySection.innerHTML += "<span onclick=\"" + func + "\">" + levelLabel(i) + "</a>";
70-
if (i % 5 == 0) difficultySection.innerHTML += "<br>";
68+
"o.send(JSON.stringify(params))"
69+
difficultySection.innerHTML += "<span onclick=\"" + func + "\">" + levelLabel(i) + "</a>"
70+
if (i % 5 == 0) difficultySection.innerHTML += "<br>"
7171
}
72-
difficultySection.innerHTML += "<br>";
72+
difficultySection.innerHTML += "<br>"
7373
}
7474
}
7575
}
7676
}
77-
};
78-
xhr.send(JSON.stringify(params));
77+
}
78+
xhr.send(JSON.stringify(params))
7979
}
8080

8181
function formatPercentage(x) {
8282
if (x > 100) {
83-
return "100.0";
83+
return "100.0"
8484
} else if (x > 20) {
85-
return x.toFixed(1);
85+
return x.toFixed(1)
8686
} else if (x > 2) {
87-
return x.toFixed(2);
87+
return x.toFixed(2)
8888
} else if (x > 0.2) {
89-
return x.toFixed(3);
89+
return x.toFixed(3)
9090
} else if (x > 0.02) {
91-
return x.toFixed(4);
91+
return x.toFixed(4)
9292
} else if (x > 0.002) {
93-
return x.toFixed(5);
93+
return x.toFixed(5)
9494
} else {
95-
return x.toFixed(6);
95+
return x.toFixed(6)
9696
}
9797
}
9898

9999
function levelName(level) {
100-
const prefix = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond', 'Ruby'];
101-
const roman = ['I', 'II', 'III', 'IV', 'V'];
100+
const prefix = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond', 'Ruby']
101+
const roman = ['I', 'II', 'III', 'IV', 'V']
102102

103-
return prefix[Math.floor((level - 1) / 5)] + ' ' + roman[4 - (level - 1) % 5];
103+
return prefix[Math.floor((level - 1) / 5)] + ' ' + roman[4 - (level - 1) % 5]
104104
}
105105

106106
function levelShortDisplayName(level) {
107-
const prefix = ['B', 'S', 'G', 'P', 'D', 'R'];
108-
const roman = ['I', 'II', 'III', 'IV', 'V'];
107+
const prefix = ['B', 'S', 'G', 'P', 'D', 'R']
108+
const roman = ['I', 'II', 'III', 'IV', 'V']
109109

110-
return '<b>' + prefix[Math.floor((level - 1) / 5)] + '</b> ' + roman[4 - (level - 1) % 5];
110+
return '<b>' + prefix[Math.floor((level - 1) / 5)] + '</b> ' + roman[4 - (level - 1) % 5]
111111
}
112112

113113
function levelCssClass(level) {
114-
const prefix = ['bronze', 'silver', 'gold', 'platinum', 'diamond', 'ruby'];
114+
const prefix = ['bronze', 'silver', 'gold', 'platinum', 'diamond', 'ruby']
115115

116-
return prefix[Math.floor((level - 1) / 5)];
116+
return prefix[Math.floor((level - 1) / 5)]
117117
}
118118

119119
function levelText(level) {
120-
if (level == 0) return "<span>Unranked</span>";
121-
return "<span class=\"text-" + levelCssClass(level) + "\">" + levelName(level) + "</span>";
120+
if (level == 0) return "<span>Unranked</span>"
121+
return "<span class=\"text-" + levelCssClass(level) + "\">" + levelName(level) + "</span>"
122122
}
123123

124124
function kudekiLevelText(level) {
125-
const roman = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII'];
126-
return "<span class=\"text-kudeki\">Kudeki " + roman[level - 1] + "</span>";
125+
const roman = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']
126+
return "<span class=\"text-kudeki\">Kudeki " + roman[level - 1] + "</span>"
127+
}
128+
129+
function levelLabelUnlisted() {
130+
return "<span class=\"level_hidden\">00"
131+
+ "</span><img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome.extension.getURL("svg/unlisted.svg") + "\">"
127132
}
128133

129134
function levelLabel(level) {
130-
if (level == -1) level = 0;
135+
if (level === null) return levelLabelUnlisted()
136+
if (level == -1) level = 0
131137
return "<span class=\"level_hidden\">" + ('0' + level).slice(-2)
132-
+ "</span><img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome.extension.getURL("svg/" + level + ".svg") + "\">";
138+
+ "</span><img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome.extension.getURL("svg/" + level + ".svg") + "\">"
133139
}
134140

135141
function kudekiLevelLabel(level) {
136-
return "<img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome.extension.getURL("svg/ka" + level + ".svg") + "\">";
142+
return "<img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome.extension.getURL("svg/ka" + level + ".svg") + "\">"
137143
}
138144

139145
if (document.getElementById("problem-body") || document.getElementById("chart_div")) {
140-
const problemId = document.querySelector("ul.problem-menu li a").innerText.replace(/[^0-9.]/g, "");
146+
const problemId = document.querySelector("ul.problem-menu li a").innerText.replace(/[^0-9.]/g, "")
147+
const problemInfo = document.querySelector("div.page-header")
148+
141149
getJson("https://api.solved.ac/problem_level.php?id=" + problemId, function(levelData) {
142-
if (levelData.level == null) return;
150+
if (levelData.level == null) {
151+
var description = document.createElement("span")
152+
description.innerText = "아직 solved.ac 데이터베이스에 등록되지 않은 문제입니다. 내일 오전 6시부터 난이도 의견 제출이 가능합니다."
153+
problemInfo.appendChild(description)
154+
return
155+
}
143156
getJson("https://api.solved.ac/question_level_votes.php?id=" + problemId, function(difficultyVotes) {
144-
const nick = document.querySelector("ul.loginbar li:first-child a").innerText.trim();
145-
var votedFlag = false;
146-
147-
const problemInfo = document.querySelector("div.page-header");
157+
const nick = document.querySelector("ul.loginbar li:first-child a").innerText.trim()
158+
var votedFlag = false
148159

149-
var titleBadge = document.createElement("span");
150-
titleBadge.className = "title_badge";
151-
titleBadge.innerHTML = levelLabel(levelData.level) + " " + levelText(levelData.level);
152-
problemInfo.appendChild(titleBadge);
160+
var titleBadge = document.createElement("span")
161+
titleBadge.className = "title_badge"
162+
titleBadge.innerHTML = levelLabel(levelData.level) + " " + levelText(levelData.level)
163+
problemInfo.appendChild(titleBadge)
153164

154165
if (levelData.kudeki_level) {
155-
var titleBadge = document.createElement("span");
156-
titleBadge.className = "title_badge";
157-
titleBadge.innerHTML = " / " + kudekiLevelLabel(levelData.kudeki_level) + " " + kudekiLevelText(levelData.kudeki_level);
158-
problemInfo.appendChild(titleBadge);
166+
var titleBadge = document.createElement("span")
167+
titleBadge.className = "title_badge"
168+
titleBadge.innerHTML = " / " + kudekiLevelLabel(levelData.kudeki_level) + " " + kudekiLevelText(levelData.kudeki_level)
169+
problemInfo.appendChild(titleBadge)
159170
}
160171

161172
if (levelData.level != 0) {
162-
problemInfo.appendChild(document.createElement("br"));
163-
problemInfo.appendChild(document.createElement("br"));
164-
var difficultyVotesHeader = document.createElement("b");
165-
difficultyVotesHeader.innerText = "난이도 의견";
166-
problemInfo.appendChild(difficultyVotesHeader);
167-
problemInfo.appendChild(document.createElement("br"));
173+
problemInfo.appendChild(document.createElement("br"))
174+
problemInfo.appendChild(document.createElement("br"))
175+
var difficultyVotesHeader = document.createElement("b")
176+
difficultyVotesHeader.innerText = "난이도 의견"
177+
problemInfo.appendChild(difficultyVotesHeader)
178+
problemInfo.appendChild(document.createElement("br"))
168179

169180
for (var i = 0; i < difficultyVotes.length; i++) {
170-
var vote = difficultyVotes[i];
171-
if (vote.user_id === nick) votedFlag = true;
181+
var vote = difficultyVotes[i]
182+
if (vote.user_id === nick) votedFlag = true
172183

173-
var difficultyVote = document.createElement("span");
174-
difficultyVote.className = "difficulty_vote";
175-
difficultyVote.innerHTML = "<span class=\"text-" + levelCssClass(vote.user_level) + "\">" + levelLabel(vote.user_level) + vote.user_id + "</span> ➔ " + levelLabel(vote.voted_level);
176-
problemInfo.appendChild(difficultyVote);
184+
var difficultyVote = document.createElement("span")
185+
difficultyVote.className = "difficulty_vote"
186+
difficultyVote.innerHTML = "<span class=\"text-" + levelCssClass(vote.user_level) + "\">" + levelLabel(vote.user_level) + vote.user_id + "</span> ➔ " + levelLabel(vote.voted_level)
187+
problemInfo.appendChild(difficultyVote)
177188
}
178189
}
179190

180191
chrome.storage.local.get('token', function(items) {
181-
initializeVoting(items.token, problemId, votedFlag);
182-
});
183-
});
184-
});
192+
initializeVoting(items.token, problemId, votedFlag)
193+
})
194+
})
195+
})
185196
} else {
186197
var pattern = /^[/]problem[/][0-9]+$/i
187-
var problemLinks = document.getElementsByTagName("a");
188-
problemLinks = [].slice.call(problemLinks, 0);
198+
var problemLinks = document.getElementsByTagName("a")
199+
problemLinks = [].slice.call(problemLinks, 0)
189200
problemLinks
190201
.filter(function (item) {
191202
return item.getAttribute("href") && pattern.test(item.getAttribute("href"))
192203
})
193204
.forEach(function (item, index) {
194-
const problemId = item.getAttribute("href").split("/")[2];
205+
const problemId = item.getAttribute("href").split("/")[2]
195206

196207
getJson("https://api.solved.ac/problem_level.php?id=" + problemId, function(levelData) {
197208
if (levelData.kudeki_level) {
198-
item.insertAdjacentHTML('afterbegin', kudekiLevelLabel(levelData.kudeki_level));
209+
item.insertAdjacentHTML('afterbegin', kudekiLevelLabel(levelData.kudeki_level))
199210
}
200-
item.insertAdjacentHTML('afterbegin', levelLabel(levelData.level));
201-
});
211+
item.insertAdjacentHTML('afterbegin', levelLabel(levelData.level))
212+
})
202213
})
203214
}
204215

205-
$('.dropdown-toggle').dropdown();
216+
$('.dropdown-toggle').dropdown()

svg/unlisted.svg

Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)