Reddit Show User Age

Shows account age next to usernames in subreddits that you moderate

  1. // ==UserScript==
  2. // @name Reddit Show User Age
  3. // @namespace dub4u
  4. // @description Shows account age next to usernames in subreddits that you moderate
  5. // @include http://www.reddit.com/r/*
  6. // @include https://www.reddit.com/r/*
  7. // @require //code.jquery.com/jquery-2.2.4.min.js
  8. // @require //cdnjs.cloudflare.com/ajax/libs/protonet-jquery.inview/1.1.2/jquery.inview.min.js
  9. // @require //cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.min.js
  10. // @grant unsafeWindow
  11. // @version 1.4
  12. // ==/UserScript==
  13. // @require //raw.githubusercontent.com/protonet/jquery.inview/5a4dc9f2537016a9dcf0acc4a2c469500021586c/jquery.inview.min.js
  14.  
  15. var seen = new Object(),
  16. queue = new Array(),
  17. store = unsafeWindow.localStorage,
  18. cache = store.getItem('user_age_cache'),
  19. cache_is_dirty = false,
  20. offset = (new Date).getTimezoneOffset()*60,
  21. WAIT = 2100; // ms
  22.  
  23. if (cache) {
  24. cache = JSON.parse(cache);
  25. } else {
  26. cache = {};
  27. }
  28.  
  29. $.get('/subreddits/mine/moderator.json', function(data) {
  30.  
  31. if (!data.data) {
  32. return;
  33. }
  34.  
  35. var url = window.location.pathname.split('/', 3).join('/') + '/';
  36.  
  37. var moderated = $.map(data.data.children, function(e, i) {
  38. return e.data.url;
  39. });
  40.  
  41. moderated.push('/r/mod/');
  42.  
  43. $.each(moderated, function(i, e) {
  44. if (e == url) {
  45. loadKarma();
  46. return false;
  47. }
  48. });
  49. });
  50.  
  51. function loadKarma() {
  52. $('.sitetable .tagline .author').bind('inview', function(e, isInView) {
  53. if (isInView && !seen[this]) {
  54. var user = this.toString().match(/\/([^\/]+)$/)[1];
  55. seen[this] = 1;
  56. queue.push(user);
  57. }
  58. });
  59.  
  60. setTimeout(processQueue, 1000);
  61. }
  62.  
  63. function processQueue() {
  64. if (cache_is_dirty) {
  65. store.setItem('user_age_cache', JSON.stringify(cache));
  66. cache_is_dirty = false;
  67. }
  68.  
  69. var i = 0,
  70. url;
  71.  
  72. while (user = queue.shift()) {
  73. if (cache[user]) {
  74. showUserAge(cache[user]);
  75. } else {
  76. getAboutJson(user, i*WAIT);
  77. i++;
  78. }
  79. }
  80.  
  81. i++;
  82.  
  83. setTimeout(processQueue, i*WAIT);
  84. }
  85.  
  86. function getAboutJson(user, delay) {
  87. setTimeout(function() {
  88. $.get('/user/' + user + '/about.json', function(response) {
  89. if (!response.data) {
  90. return;
  91. }
  92. cache[user] = {
  93. i: response.data.id,
  94. c: response.data.created
  95. };
  96. cache_is_dirty = true;
  97. showUserAge(cache[user]);
  98. });
  99. }, delay);
  100. }
  101.  
  102. function showUserAge(user) {
  103. var created = moment((user.c+offset)*1000),
  104. text = 'redditor for ' + created.fromNow(true);
  105.  
  106. if (created.isAfter(moment().subtract(30, 'days'))) {
  107. $('.sitetable .author.id-t2_' + user.i).closest('.entry')
  108. .css('background', '#dfc');
  109. }
  110.  
  111.  
  112. $('.sitetable .tagline .author.id-t2_' + user.i + ' ~ .userattrs')
  113. .after(' (<span class="userkarma">' + text + '</span>)');
  114. }