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

Commit 30c3930

Browse files
committed
Add expectation tier function for non-members
Before this function implemented, user cannot know where they are and what are the proper problems without tier This function works following steps 1. Parse the solved problem in user page 2. Get Level information from Api server 3. Calculate the total exp point from level information 4. Display expectation tier Signed-off-by: Seokho Song <0xdevssh@gmail.com>
1 parent b85d76b commit 30c3930

4 files changed

Lines changed: 79 additions & 8 deletions

File tree

src/content/main.js

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -239,19 +239,51 @@ async function addLevelIndicators() {
239239
if (isUserPage()) {
240240
var userId = document.querySelector(".page-header h1").innerText.trim()
241241
var userStaticsTable = document.querySelector("#statics tbody")
242-
242+
const isShowUserTempTier = JSON.parse(await getPrefs('show_userpage_temp_tier', 'false'))
243243
const userData = await (await fetch("https://api.solved.ac/user_information.php?id=" + userId)).json()
244-
if (!userData) return
245244

245+
if (!userData &&!isShowUserTempTier) return
246+
246247
var newRow = document.createElement("tr")
247248
var newRowHeader = document.createElement("th")
248-
newRowHeader.innerText = "solved.ac"
249249
var newRowDescription = document.createElement("td")
250-
newRowDescription.innerHTML = "<a href=\"https://solved.ac/" + userData.user_id + "\">"
251-
+ "<span class=\"text-" + levelCssClass(userData.level) + "\">"
252-
+ levelLabel(userData.level) + "<b>" + userData.user_id + "</b>"
253-
+ "</span>"
254-
+ "</a>"
250+
251+
if(!userData && isShowUserTempTier)
252+
{
253+
var acceptPanel = document.querySelector(".panel.panel-default")
254+
var acceptProblems = acceptPanel.querySelectorAll(".problem_number>a")
255+
var totalExpPoint = 0
256+
var promises = [];
257+
258+
for(i = 0; i< acceptProblems.length;i++){
259+
var problemId = acceptProblems[i].textContent;
260+
promises[i] = fetch("https://api.solved.ac/problem_level.php?id=" + problemId)
261+
}
262+
263+
responses = await Promise.all(promises);
264+
for(i = 0;i<responses.length;i++){
265+
data = await responses[i].json()
266+
totalExpPoint+= getExpPointFromLevel(data.level)
267+
}
268+
269+
var expectLevel = getExpectLevelFromExpPoint(totalExpPoint)
270+
newRowHeader.innerText = "solved.ac 임시티어"
271+
newRowDescription.innerHTML = "<a href=\"https://boj.com/" + userId + "\">"
272+
+ "<span class=\"text-" + levelCssClass(expectLevel) + "\">"
273+
+ levelLabel(expectLevel) + "<b>" +userId + "</b>"
274+
+ "</span>"
275+
+ "</a>"
276+
}
277+
else
278+
{
279+
newRowHeader.innerText = "solved.ac"
280+
newRowDescription.innerHTML = "<a href=\"https://solved.ac/" + userData.user_id + "\">"
281+
+ "<span class=\"text-" + levelCssClass(userData.level) + "\">"
282+
+ levelLabel(userData.level) + "<b>" + userData.user_id + "</b>"
283+
+ "</span>"
284+
+ "</a>"
285+
}
286+
255287
newRow.appendChild(newRowHeader)
256288
newRow.appendChild(newRowDescription)
257289
userStaticsTable.appendChild(newRow)

src/content/utils.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,25 @@ function algorithmToTag(item, showTagsInEnglish) {
103103
algorithm_id: item.algorithm_id
104104
}
105105
}
106+
}
107+
108+
function getExpPointFromLevel(level){
109+
const levelData = [320, 480, 912, 1642, 2791, 4465, 6698, 9913, 14472, 20840, 29593,
110+
41431, 57588, 79472, 108877, 148072, 200638, 270862, 364309, 488174,
111+
651712, 866777, 1148479, 1515993, 1993531, 2611525, 3408040, 4430452,
112+
5737436, 7401292, 9510661]
113+
return levelData[level]
114+
}
115+
116+
function getExpectLevelFromExpPoint(exp){
117+
const expTable = [0, 4800, 15740, 38720, 83400, 163700, 298000, 785400, 1202800, 1795000, 2834700,
118+
4276000, 6261000, 8982000, 12704000, 18796000, 26842000, 37941000, 52792000,
119+
720000000, 152000000, 213000000, 294000000, 380000000, 639000000, 1000000000,
120+
1200000000, 1500000000]
121+
for(i=0;i<expTable.length-1;i++){
122+
if(expTable[i] < exp && exp < expTable[i+1])
123+
return i+1;
124+
}
125+
if(exp>expTable[expTable.length-1])
126+
return expTable.length
106127
}

src/options/options_logged_info.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ <h1 id="user_id">...</h1>
4141
<span class="toggle_knob"></span>
4242
</span>
4343
</div>
44+
45+
<div class="option_item" data-key="show_userpage_temp_tier">
46+
<span class="option_caption">
47+
유저페이지 임시티어 보기
48+
</span>
49+
<span class="option_switch">
50+
<span class="toggle_knob"></span>
51+
</span>
52+
</div>
53+
4454
</div>
4555
<script src="/3rdparty/axios.0.19.0.min.js"></script>
4656
<script src="/src/options/options_logged_info.js"></script>

src/options/options_login.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ <h3 class="input_caption">비밀번호</h3>
4646
<span class="toggle_knob"></span>
4747
</span>
4848
</div>
49+
<div class="option_item" data-key="show_userpage_temp_tier">
50+
<span class="option_caption">
51+
유저페이지 임시티어 보기
52+
</span>
53+
<span class="option_switch">
54+
<span class="toggle_knob"></span>
55+
</span>
56+
</div>
4957
</div>
5058
<script src="/3rdparty/axios.0.19.0.min.js"></script>
5159
<script src="/src/options/options_login.js"></script>

0 commit comments

Comments
 (0)