Created
May 23, 2017 21:42
-
-
Save vladd/ba8cbd4e04dc9ab4487ba951849af77a 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/); | |
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, | |
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, | |
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 ? 'да' : 'нет')) | |
.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