Skip to content

Instantly share code, notes, and snippets.

@vladd
Created May 23, 2017 21:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vladd/ba8cbd4e04dc9ab4487ba951849af77a to your computer and use it in GitHub Desktop.
Save vladd/ba8cbd4e04dc9ab4487ba951849af77a to your computer and use it in GitHub Desktop.
Турнирная таблица для вопроса о талантливых криптографах на ru.SO
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