Created
May 24, 2017 11:56
-
-
Save vladd/bd3338bbfa8163530e63717f2305a4d1 to your computer and use it in GitHub Desktop.
Турнирная таблица для вопроса о талантливых криптографах на ru.SO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function getAnswers(questionId, answer_filter, page) { | |
return jQuery.ajax({ | |
url: '//api.stackexchange.com/2.2/questions/' + questionId + '/answers?page=' + page + '&pagesize=100&order=desc&sort=activity&site=ru.stackoverflow&filter=' + answer_filter, | |
method: "get" | |
}).then(function(data) { | |
if (data.has_more) { | |
return getAnswers(questionId, answer_filter, page + 1).then(function(d) { | |
return data.items.concat(d.items); | |
}) | |
} | |
return data.items; | |
}); | |
} | |
function getAuthorName(e) { | |
return e.owner.display_name | |
} | |
function twodig(n) { | |
return (n < 10) ? ("0" + n) : n; | |
} | |
function getExpiryDate(e, now) { | |
var expiry = e.creation_date + 3 * 24 * 60 * 60; | |
var totalsec = Math.floor(expiry - now); | |
if (totalsec <= 0) return "Оконч."; | |
var totalmin = Math.floor(totalsec / 60); var sec = totalsec % 60; | |
var totalhr = Math.floor(totalmin / 60); var min = totalmin % 60; | |
var totalday = Math.floor(totalhr / 24); var hr = totalhr % 24; | |
var daypart = totalday > 0 ? "" + totalday + " д. " : ""; | |
return daypart + hr + ":" + twodig(min) + ":" + twodig(sec); | |
} | |
function process(items) { | |
var now = Date.now() / 1000; | |
return items.map(function(item) { | |
var matched = item.body.match(/<h\d+>\s*(.+?)\s*?,.*?(\d+).*?(\s\(.*\))?<\/h/); | |
let hackLink = item.body.match(/<a[^>]+href="([^"]+)"[^>]*>ссылка<\/a>\.<\/p>\s*$/i); | |
if (hackLink) | |
hackLink = hackLink[1]; | |
if (matched) { | |
var ishacked = matched[3] == " (взломан)"; | |
var isinvalid = matched[3] == " (не подходит)"; | |
return { | |
lang: matched[1], | |
tokens: +matched[2], | |
hacked: +ishacked, | |
invalid: +isinvalid, | |
parsed: +1, | |
link: item.share_link, | |
hackLink, | |
author: getAuthorName(item), | |
expires: getExpiryDate(item, now) | |
}; | |
} else { | |
return { | |
lang: "N/A", | |
tokens: "N/A", | |
hacked: "N/A", | |
invalid: "N/A", | |
parsed: +0, | |
link: item.share_link, | |
hackLink, | |
author: getAuthorName(item), | |
expires: getExpiryDate(item, now) | |
} | |
} | |
}); | |
} | |
function sort(items) { | |
return items.sort(function(a, b) { | |
if (a.parsed != b.parsed) return b.parsed - a.parsed; | |
if (a.invalid != b.invalid) return a.invalid - b.invalid; | |
if (a.hacked != b.hacked) return a.hacked - b.hacked; | |
if (a.tokens != b.tokens) return a.tokens - b.tokens; | |
return 0; | |
}) | |
} | |
function fillTemplate(sortedItems) { | |
$('#leadership').append(sortedItems.map(function(item, index) { | |
return $('<tr>').append($('<td>').html(index + 1)) | |
.append($('<td>').html(item.author)) | |
.append($('<td>').html(item.lang)) | |
.append($('<td>').html(item.tokens)) | |
.append($('<td>').html(item.hacked == 1 ? item.hackLink ? `<a href='${item.hackLink}'>да</a>` : 'да' : 'нет')) | |
.append($('<td>').html(item.hacked == 1 ? 'N/A' : item.expires)) | |
.append($('<td>').html(item.invalid == 1 ? 'нет' : 'да')) | |
.append($('<td>').append($('<a>').attr('href', item.link).text('Link'))); | |
})); | |
return sortedItems; | |
} | |
var QUESTION_ID = 669381, | |
ANSWER_FILTER = "!t)HnY7IrqT(diXnBu5U_KKzmPtYPTxi", | |
startPage = 1; | |
getAnswers(QUESTION_ID, ANSWER_FILTER, startPage) | |
.then(process) | |
.then(sort) | |
.then(fillTemplate); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment