Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // HOF extractor script
- //
- // To be run at https://www.duolingo.com/comment/2933824
- //
- //
- // The `user` object:
- // user = {
- // name : '<name>',
- // streak: <streak duration>,
- // levels: {
- // <language>:<level>,
- // ...
- // }
- // }
- // Sort list of `user` objects first by streak
- // duration, then by username.
- function sortByStreak(users){
- return users.sort(function(a, b){
- var c = b.streak - a.streak;
- if(c===0)
- c = b.name < a.name ? -1 : 1;
- return c;
- });
- }
- // `node` must be a <header> element with a
- // child <a class=username>.
- function extractUserName(node){
- return node.querySelector('a.username').innerHTML;
- }
- // `node` must be a <header> element.
- function extractLevels(node){
- return undefined;
- }
- // `node` must be a <header> element.
- function extractStreak(node){
- var streakIcon = node.querySelector('.icon-streak-micro');
- if(streakIcon)
- return parseInt(
- streakIcon
- .parentNode
- .textContent
- , 10);
- else
- return 0;
- }
- // Print segment of HOF. `users` is the list of user objects,
- // `q` is the streak length required to qualify for this HOF segment,
- // `start` is where to start looking in the `users` list.
- // When it encounters a user that does not qualify, it returns
- // the current list position.
- function printHOFsegment(users,q,start){
- for (var i = start, m = users.length; i < m; i++){
- var user = users[i];
- if(user.streak < q)
- return i;
- console.log(user.streak,user.name);
- }
- }
- function printHallOfFame(users){
- var gold_q = 500;
- var silver_q = 400;
- var bronze_q = 365;
- var soon_to_be_q = 300;
- sortByStreak(users);
- console.log('Gold');
- var i = printHOFsegment(users,gold_q,0);
- console.log('Silver');
- i = printHOFsegment(users,silver_q, i);
- console.log('Bronze');
- i = printHOFsegment(users,bronze_q, i);
- console.log("Soon to be's");
- i = printHOFsegment(users,soon_to_be_q, i);
- }
- //
- // Get the headers from all posts in this thread.
- var nodeList = document.querySelectorAll('header > a.username');
- var headers = [];
- for(var i=0,m=nodeList.length; i<m;i++){
- headers.push(nodeList.item(i).parentNode);
- }
- // Just an object containing the usernames of users
- // we already processed.
- processed_users={};
- // List of user objects.
- users=[];
- // Iterate through the headers, collecting data for
- // each user as we go along.
- for(var i=0,m=headers.length;i<m;i++){
- var n = headers[i];
- var name = extractUserName(n);
- if(name in processed_users) continue;
- var userData = {};
- var streak = extractStreak(n);
- userData.name = name;
- userData.streak = streak;
- users.push(userData);
- processed_users[name] = undefined;
- }
- printHallOfFame(users);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement