GitHub Top Reacted

Show and sort top reacted comments on GitHub

  1. // ==UserScript==
  2. // @name GitHub Top Reacted
  3. // @version 0.1
  4. // @description Show and sort top reacted comments on GitHub
  5. // @author Drazen Bjelovuk
  6. // @include /^https?://github.com/.*/issues/.+/
  7. // @grant none
  8. // @namespace https://greasyfork.org/users/11679
  9. // @contributionURL https://goo.gl/dYIygm
  10. // @run-at document-end
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. var comments = document.querySelectorAll('.timeline-comment-wrapper');
  15. var reacted = [];
  16.  
  17. comments.forEach(function(el) {
  18. if (el.querySelectorAll('.has-reactions').length) {
  19. reacted.push(el);
  20. }
  21. });
  22.  
  23. if (!reacted.length) {
  24. return;
  25. }
  26.  
  27. function countReactions(comment) {
  28. var count = 0;
  29. var reactions = comment.querySelectorAll('button.reaction-summary-item');
  30. reactions.forEach(function(el) {
  31. count += parseInt(el.innerText.split(' ')[1]);
  32. });
  33. return count;
  34. }
  35.  
  36. reacted.sort(function(a, b) {
  37. return countReactions(b) - countReactions(a);
  38. });
  39.  
  40. var container = document.createElement('div');
  41. container.className = 'top-reacted';
  42. container.setAttribute('hidden', '');
  43. reacted.forEach(function(el) {
  44. container.appendChild(el.cloneNode(true));
  45. });
  46.  
  47. var discussion = document.querySelector('.discussion-timeline');
  48. discussion.insertBefore(container, discussion.firstChild);
  49.  
  50. var showTopBtn = document.createElement('button');
  51. showTopBtn.className = 'btn btn-lg';
  52. showTopBtn.style = 'margin-bottom: 20px;';
  53. showTopBtn.innerText = 'Show top reacted';
  54. showTopBtn.addEventListener('click', function() {
  55. if (container.hasAttribute('hidden')) {
  56. container.removeAttribute('hidden');
  57. showTopBtn.innerText = 'Hide top reacted';
  58. }
  59. else {
  60. container.setAttribute('hidden', '');
  61. showTopBtn.innerText = 'Show top reacted';
  62. }
  63. });
  64.  
  65. var bucket = document.querySelector('#discussion_bucket');
  66. bucket.parentNode.insertBefore(showTopBtn, bucket);
  67. })();