Reddit domain share user list

Compile list of users who have shared links from a domain on Reddit. Useful for spammer busting

  1. // ==UserScript==
  2. // @name Reddit domain share user list
  3. // @namespace org.thorlancaster.redditdomainuserparser
  4. // @version 0.1
  5. // @description Compile list of users who have shared links from a domain on Reddit. Useful for spammer busting
  6. // @author Thor Lancaster
  7. // @match https://www.reddit.com/domain*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13. var helpText =
  14. "<ol style='list-style: initial'><li>Go to a reddit.com domain page</li>"+
  15. "<li>Click \"Add this page\" button for each page of posts</li>"+
  16. "<li>When finished, click \"Expor\"</li><li>Remember to clear pages when done to prevent old, possibly banned users.</li></ol>";
  17. // Utility Functions
  18. var DGE = function(name){
  19. return document.getElementById(name);
  20. }
  21. var DCE = function(name){
  22. return document.createElement(name);
  23. }
  24. // UI functions
  25. // Show a modal message box
  26. var showMessageBox = function(titleTxt, txt){
  27. var root = DCE("div");
  28. var rs = root.style;
  29. root.id = "fpe-alert";
  30. rs.position = "fixed";
  31. rs.zIndex = "9999999";
  32. rs.width = "100%";
  33. rs.height = "100%";
  34. rs.top = "0px";
  35. rs.background = "#0A2132";
  36. rs.color = "#FFF";
  37. rs.fontSize = "1.2em";
  38. var title = DCE("div");
  39. title.innerHTML = titleTxt;
  40. var ts = title.style;
  41. ts.fontSize = "1.5em";
  42. ts.padding = "0.5em";
  43. root.appendChild(title);
  44. var msg = DCE("div");
  45. msg.innerHTML = txt;
  46. var mss = msg.style;
  47. mss.padding = "2%";
  48. mss.border = "1px solid #777";
  49. mss.width = "95%";
  50. mss.maxHeight = "90%";
  51. mss.maxHeight = "calc(100% - 6rem)";
  52. mss.overflowY = "auto";
  53. root.appendChild(msg);
  54. var exit = DCE("button");
  55. var bts = exit.style;
  56. bts.position = "fixed";
  57. bts.bottom = "1rem";
  58. bts.color = "#000";
  59. bts.background = "#1CD798";
  60. bts.padding = "0.5em";
  61. bts.borderRadius = "0.2rem";
  62. bts.border = "none";
  63. bts.fontSize = "1.1rem";
  64. exit.innerText = "Back to site";
  65. exit.onclick = function(){
  66. DGE("fpe-alert").parentElement.removeChild(DGE("fpe-alert"));
  67. }
  68. root.appendChild(exit);
  69. document.body.appendChild(root);
  70. }
  71. // Create and return the UI element
  72. var createUIPane = function(){
  73. var root = DCE("div");
  74. var rs = root.style;
  75. rs.position = "fixed";
  76. rs.bottom = "0px";
  77. rs.width = "10rem";
  78. rs.right = "0px";
  79. rs.borderRadius = "0.5rem";
  80. rs.background = "#0A2132";
  81. rs.color = "#FFF";
  82. rs.textAlign = "center";
  83. ////////
  84. var title = DCE("div");
  85. title.innerHTML = "Reddit Domain<br/>Exporter<br/>";
  86. var ts = title.style;
  87. ts.fontSize = "1.5em";
  88. ts.padding = "0.3em";
  89. ts.background = "#FF9204";
  90. ts.borderTopLeftRadius = ts.borderTopRightRadius = "0.5rem";
  91. root.appendChild(title);
  92. ////////
  93. var status = DCE("div");
  94. status.id = "fpe-status";
  95. var ss = status.style;
  96. ss.display = "none";
  97. ss.position = "absolute";
  98. ss.top = "2rem";
  99. ss.left = "10rem";
  100. ss.width = "10rem";
  101. ss.minHeight = "3rem";
  102. ss.borderRadius = "0.5em";
  103. ss.background = "#0A2132";
  104. root.appendChild(status);
  105. ////////
  106. for(var x = 0; x < 4; x++){
  107. var txt = "Button " + x;
  108. if(x == 0) txt = "Add this page";
  109. if(x == 1) txt = "Clear pages";
  110. if(x == 2) txt = "Export list";
  111. if(x == 3) txt = "How to use";
  112. var btn = DCE("button");
  113. var bts = btn.style;
  114. bts.color = "#000";
  115. bts.padding = "0.5em";
  116. bts.borderRadius = "0.2rem";
  117. bts.border = "none";
  118. bts.fontSize = "1.1rem";
  119. if(x == 3){
  120. bts.fontSize = "0.8rem";
  121. }
  122. if(x == 2) { // Emphasized
  123. bts.background = "#1CD798";
  124. btn.nNmBg = "#1CD798";
  125. btn.nHvBg = "#15AE7A";
  126. } else { // Normal
  127. bts.background = "#1C98D7";
  128. btn.nNmBg = "#1C98D7";
  129. btn.nHvBg = "#157AAE";
  130. }
  131. btn.dataset.btnNum = x;
  132. btn.onmouseover = function(){this.style.background = this.nHvBg;}
  133. btn.onmouseout = function(){this.style.background = this.nNmBg;}
  134. btn.onclick = onButtonClick;
  135. var bdiv = DCE("div");
  136. var bs = bdiv.style;
  137. bs.height = "3rem";
  138. bs.display = "flex";
  139. bs.alignItems = "center";
  140. bs.justifyContent = "center";
  141. btn.innerHTML = txt;
  142. bdiv.appendChild(btn);
  143. root.appendChild(bdiv);
  144. }
  145. return root;
  146. }
  147. var stTimer = null;
  148. var setStatusText = function(stTxt){
  149. clearTimeout(stTimer);
  150. stTimer = setTimeout(function(){
  151. DGE("fpe-status").style.display = "none";
  152. }, 2200);
  153. var el = DGE("fpe-status");
  154. el.style.display = "block";
  155. el.innerHTML = stTxt;
  156. }
  157. var onButtonClick = function(){
  158. var num = this.dataset.btnNum;
  159. if(num == 0){
  160. addThisPage();
  161. } else if(num == 1){
  162. clearPages();
  163. } else if(num == 2){
  164. exportData();
  165. } else if(num == 3){
  166. showHelp();
  167. }
  168. }
  169. // Data parsing functions
  170. var addThisPage = function(){
  171. var fpeDatabase = fpeDatabase = JSON.parse(sessionStorage.getItem("fpe-database"));
  172. if(fpeDatabase == null){
  173. fpeDatabase = {};
  174. }
  175. //////////////// BEGIN DATA SCRAPING
  176. var rows = document.getElementsByClassName("top-matter");
  177. for(var x = 0; x < rows.length; x++){
  178. var row = rows[x];
  179. var user = row.getElementsByClassName("author")[0];
  180. if(!user) continue;
  181. user = "u/" + user.textContent;
  182.  
  183. var count = fpeDatabase[user] | 0;
  184.  
  185. Object.defineProperty(fpeDatabase, user, {
  186. value: count + 1,
  187. writable: true,
  188. enumerable: true
  189. });
  190. }
  191. //////////////// END DATA SCRAPING
  192. sessionStorage.setItem("fpe-database", JSON.stringify(fpeDatabase));
  193. }
  194. var clearPages = function(){
  195. sessionStorage.removeItem("fpe-database");
  196. }
  197. var exportData = function(){
  198. var fpeDatabase = JSON.parse(sessionStorage.getItem("fpe-database"));
  199. if(fpeDatabase != null){
  200. showMessageBox("List of accounts", "<pre>" + formatOutput(fpeDatabase) + "</pre>");
  201. } else {
  202. setStatusText("No data yet. Add some pages first.");
  203. }
  204. }
  205. var formatOutput = function(db){
  206. console.log(db);
  207. var rtn = "";
  208. for(var key in db){
  209. rtn += key + " " + db[key] + "<br/>";
  210. }
  211. return rtn;
  212. }
  213. var showHelp = function(){
  214. showMessageBox("How to use", helpText);
  215. }
  216. // Main function
  217. var init = function(){
  218. var ui = createUIPane();
  219. document.body.appendChild(ui);
  220. }
  221. init();
  222. })();