DashPlus - Follow Back Checker

Checks if the blogs you're following also follow you

  1. // ==UserScript==
  2. // @name DashPlus - Follow Back Checker
  3. // @namespace http://www.dashpl.us/
  4. // @description Checks if the blogs you're following also follow you
  5. // @include *www.tumblr.com/following
  6. // @include *www.tumblr.com/following/*
  7. // @version 2.0.2
  8. // @grant none
  9. // @run-at document-end
  10. // ==/UserScript==
  11.  
  12.  
  13.  
  14. //var check_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYBQTFRFUqhUttq2XK1ePHs9TqJQ/f799fr1LFstyuXLvd6+KVUq6vTqUKZSHjMfSJZKRpFIZbJn8/nzXq5gT6RRTZ5PcLhyS5tMRZBHdLp2VqtYHj8fFSsVk8mUcrhzi8WM3+/fUKVSqNSputy7WKtas9m0Y7FlqdSqv9/AQolEqNOpZ7NpQohDgY2BU2NTuNy5Nkk3iMSK1+PX7vDuJzwo3uPe1OnU7/fviMOJkb6TN3I43O3cLl8wqtWrmMuZnM6dl6GX0uXT5/PnQmtDqbGqMmczxM7EwuDCv8zAv86/Xo5fNFs1WqlcWaxbn8+g2ezZoaqhtcO1sdizzubPaJRpQ4xFQYZChL+F1trXSI5Kt9q4jcaOcrl0+fz6YLBie718ms2b6Oro2ufaP4NB3eTdSnpLOXU6kMeRj8eQZnRmaXdpeLR6bXtud7t4m82cXHRcjLeNm6mblriX8fXy8Pfw8/fzeZZ6U6lV6PPo7PXsaLRqbbZvS1xMQWFC0ejSUahT////lfBh+AAAAIB0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wA4BUtnAAABLUlEQVR42mKoxwIYwCRrsRUHp5K6qRmSoGBtpGJumpxcVLoeG0yQW11TLlpAiCm2UlTWwBEiWBFpl8NUVgcEDJJCQhKCIMEYpXhZZYY6MGBirGKxAAqy+vnG+UDFZOXVyoQjEusZuAPlVKFi5mwydQwKIYWCDEG2EsoQMZl6GSCpIO5pyMAYJlAG0QsWAwqmeDCoyTKBxbTY1MG0sLZTAIONgCSTokpdnbw8xBCR1BpXBjdVBiaOehnFelmIIJ91nglDeRgLDxMbdz1Ecx0Ls5Q/0PEOfCLCmvX1WnUQa7j0jUDezNfm865XgdjCby3tDPZ7SXCqRpYwSJlYEpe0DjSUikrZLTX4xPhCXaR47eHhyeqe58XOziVlnBmOFPL1yQUZ1brZzgkQHkCAAQAJGIOAIXi03wAAAABJRU5ErkJggg==";
  15. //var check_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXBJREFUeNqslcsvA1EYxWfGNN6jqkK9QmvjESwEW2Fr4X9lZ2mHSNio1KaxIBJCCVU1zpFzk5smw1z6Jb%2F0tjP3zPked%2BrHcey1M3x9zoNNMPxHnSo4gLlqgEUH2P2HGGMK7HARgj6Qcdj8Bi5BDcRiCBSMoGucgyMJMgbAujEVOIrdSvAevMpdCcwYcy6CDXAM7kBTeym2ACJzk4vglajL2ThYUjMDV8EnuWPdPkEWLIPJ1obaTWmqgw393qMH8vsZuAYfoFNpzuoeL0mQYmVtjJQOO3gDTsG7DkIRLNp1SxJkXR7UxUizxaE%2FUVcZI2AV5JPKZQt2a0OvRqKimpV1nQdgDUz8dBDsp9DNoJ7O9C%2FAodYZpTmnGnppBBn9YFTrupyGOqsboOu3cWgVZNfGlJ4v1zmwpbr6roKh6liUm7xea4U0YkbgWbNmCs3uboMVucqlHP6acciB3gMv1kWmPO0g9gj2v9%2FY7f4L%2BBJgAK%2B%2FTCvBclH%2BAAAAAElFTkSuQmCC";
  16. //var question_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP5JREFUeNqslVELgjAQx91a9iBiUfggPfT9P1f0EIRICBVT%2B1%2FcYJm6uTw4ps773f%2B2m4qu66IlTfCYwLfwdSDnCS8h7iEZevgDRraB7%2BlCwVeWUtvucI2s1VdJQmQYUo79qVaNZLwA9BqaoASAUrKiF%2F8ByhFgMlUfoC1X4K0wYxUpw%2Bk9gpwZRjZYgZoQcuzdawtGFs8F2lYBVlobI1l9ELC0dxqwmNtMhQDbHoxaZjcVIF1AC6ZcMB%2BFCqDTnCPjAmr4lZqc1y53xbhKrs2J4bF2KZTRwuYCJlyqaZfUZw0bqmjki0PzBWA%2B4hqjkGA38yDQNDMisfQv4C3AAHp3Vn27XeuSAAAAAElFTkSuQmCC";
  17.  
  18. var idPrefix = "dashplus_follow_back_";
  19. var classPrefix = idPrefix;
  20.  
  21. var followBackCss = '.'+classPrefix+'status{ float: left; font-family: tumblr-icons; font-size: 30px !important; font-weight: normal; height: 27px !important; margin: 4px 11px 4px 0; padding: 0 10px 0 6px !important; text-align: center; width: 13px; } .follower .info{ width: 358px; } .viewhide{ visibility: hidden; } .'+classPrefix+'sideblog{ padding: 0 14px 0 1px !important } .follower .poptica_header.popover_standalone{ margin-left: 42px; } .'+classPrefix+'status ~ .poptica_header.popover_standalone{ margin-left: 0px; }';
  22.  
  23. function run(){
  24. document.getElementsByTagName('head')[0].insertAdjacentHTML('beforeend','<style type="text/css">' + followBackCss + '</style>');
  25.  
  26. blogTabs = document.querySelectorAll('.tab_blogs .tab_blog:not(.tab_dashboard)');
  27. blogs = new Array();
  28. Array.prototype.forEach.call(blogTabs, function(blogTab){
  29. blogs.push(blogTab.getAttribute('id').slice(9));
  30. });
  31.  
  32. me = blogs[0]; //Use the first blog from the user's sidebar by default
  33. drop_down_menu(blogs,me);
  34. run_check(me);
  35. }
  36. function drop_down_menu(blogs,me){
  37. //Construct a link
  38. var blogLink = document.createElement('div');
  39. blogLink.insertAdjacentHTML('beforeend', '<a href="//www.tumblr.com/blog/'+me+'">'+me+'</a>');
  40.  
  41. //Create a container for the text and the link
  42. container = document.createElement('div');
  43. container.insertAdjacentHTML('beforeend',
  44. 'You are seeing blogs that follow ' + blogLink.outerHTML
  45. );
  46.  
  47. //And put that container in another box
  48. div = document.createElement('div');
  49. div.insertAdjacentHTML('beforeend',container.outerHTML);
  50. div.className += ' grey_note';
  51. div.style.overflow = 'hidden';
  52. div.style.marginTop = '20px';
  53. div.setAttribute('id',idPrefix + 'sidebar_box');
  54.  
  55. //And then add it to the sidebar
  56. document.getElementById('right_column').insertAdjacentHTML('beforeend',div.outerHTML);
  57. }
  58. function run_check(me){
  59. followerDivs = document.querySelectorAll('div#following div.follower');
  60. Array.prototype.forEach.call(followerDivs, function(followerDiv){
  61. if(followerDiv.className.indexOf(classPrefix + "checked") < 0){
  62. followerDiv.className += " " + classPrefix + "checked";
  63.  
  64. var nameLink = followerDiv.querySelector('.info .name > a');
  65. if(nameLink !== null && 'null' !== nameLink){ //Because JavaScript fails at having a "continue" operator.
  66. var name = nameLink.innerHTML;
  67. console.log(name);
  68.  
  69. if(name !== null && name !== ''){
  70. //Okay, now let's do an Ajax POST request
  71. var xhr = new XMLHttpRequest();
  72. xhr.open('GET',encodeURI('/svc/blog/followed_by?' + encodeURI('tumblelog='+me+'&query='+name)));
  73. xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  74. xhr.onload = function(){
  75. var icon = document.createElement('div');
  76. icon.className += " " + classPrefix + "status";
  77.  
  78. //The response has finished, let's check the response
  79. if(xhr.status == 200){ //If the response status is OK
  80. var data = JSON.parse(xhr.responseText); //Parse the JSON response
  81. //console.log(data);
  82.  
  83. var followerRow = followerDiv.querySelector('.info');
  84.  
  85.  
  86. if(data.response.is_friend == 1){
  87. //The user is following back
  88. icon.className += " chrome green big";
  89. icon.innerHTML = "";
  90. }
  91. else{
  92. //The user is not following back
  93. icon.className += " chrome red big";
  94. icon.innerHTML = "";
  95. }
  96.  
  97. }
  98. else if(xhr.status == 400){
  99. //The blog in question is a side-blog, and therefore cannot follow back.
  100. icon.className += " chrome big viewhide";
  101. icon.innerHTML = "";
  102. }
  103. else{ //If the response is anything other than OK.
  104. console.log("DashPlus Follow Back: Error fetching follow-back status.");
  105. console.log(xhr);
  106. }
  107. followerDiv.querySelector('.info').insertAdjacentHTML('afterend',icon.outerHTML);
  108. }
  109. xhr.send();
  110. }
  111. }
  112. }
  113. });
  114. }
  115.  
  116. run();