OpenUserJS Bullshit Filter

Hides scripts for popular browser games and social networks as well as scripts that use "foreign" characters in descriptions.

2015-09-10 기준 버전입니다. 최신 버전을 확인하세요.

  1. // ==UserScript==
  2. // @name OpenUserJS Bullshit Filter
  3. // @author darkred
  4. // @description Hides scripts for popular browser games and social networks as well as scripts that use "foreign" characters in descriptions.
  5. // @version 1
  6. // @icon https://s3.amazonaws.com/uso_ss/icon/97145/large.png
  7. // @grant none
  8. // @include https://openuserjs.org/
  9. // @include https://openuserjs.org/?*p=*
  10. // @include https://openuserjs.org/?*q=*
  11. // This is an edited version of this script (http://userscripts-mirror.org/scripts/show/97145) by kuehlschrank.
  12. // Thanks a lot to kuehlschrank for making another great script.
  13. // @namespace https://greatest.deepsurf.us/users/2160
  14. // ==/UserScript==
  15.  
  16.  
  17. (function() {
  18. var filters = {
  19. 'Games': /AntiGame|Astro\s*Empires|^\s*Attack|^\s*Battle|BiteFight|Blood\s*Wars|Bots4|Brawler|\bBvS\b|Business\s*Tycoon|Castle\s*Age|City\s*Ville|Comunio|Conquer\s*Club|CosmoPulse|Dark\s*Orbit|Dead\s*Frontier|\bDOA\b|Dossergame|Dragons\s*of\s*Atlantis|Dugout|\bDS[a-z]+\n|Empire\s*Board|eRep(ublik)?|Epic.*War|ExoPlanet|Falcon Tools|Feuerwache|Farming|FarmVille|Fightinfo|Frontier\s*Ville|Ghost\s*Trapper|Gladiatus|Goalline|Gondal|Grepolis|Hobopolis|\bhwm(\b|_)|Ikariam|\bIT2\b|Jellyneo|Kapi\s*Hospital|Kings\s*Age|Kingdoms?\s*of|knastv(ö|oe)gel|Knight\s*Fight|\b(Power)?KoC(Atta?ck)?\b|\bKOL\b|Kongregate|Last\s*Emperor|Legends?\s*of|Light\s*Rising|Lockerz|\bLoU\b|Mafia\s*(Wars|Mofo)|Menelgame|Mob\s*Wars|Mouse\s*Hunt|Molehill\s*Empire|NeoQuest|MyFreeFarm|Neopets|Nemexia|\bOGame\b|Pardus|Pennergame|Pigskin\s*Empire|PlayerScripts|Popmundo|Po?we?r\s*(Bot|Tools)|PsicoTSI|Ravenwood|Schulterglatze|SpaceWars|\bSW_[a-z]+\n|\bSnP\b|The\s*Crims|The\s*West|Travian|Treasure\s*Isl(and|e)|Tribal\s*Wars|TW.?PRO|Vampire\s*Wars|War\s*of\s*Ninja|West\s*Wars|\bWoD\b|World\s*of\s*Dungeons|wtf\s*battles|Wurzelimperium/i,
  20. 'Social Networks': /Face\s*book|Google(\+| Plus)|\bHabbo|Kaskus|\bLepra|Leprosorium|MySpace|meinVZ|odnoklassniki|Одноклассники|Orkut|sch(ue|ü)ler(VZ|\.cc)?|studiVZ|Unfriend|Valenth|vkontakte|ВКонтакте|Qzone|Twitter/i,
  21. 'Non-ASCII':/[^\x00-\x80\s]+/i,
  22. 'Clutter':/^\s*(.{1,3})\1+\n|^\s*(.+?)\n+\2\n*$|^\s*.{1,5}\n|do\s*n('|o)?t (install|download)|nicht installieren|just(\s*a)?\s*test|^\s*.{0,4}test.{0,4}\n|\ntest(ing)?\s*|^\s*(\{@|Smolka|Hacks)|\[\d{4,5}\]|free\s*download/i
  23. };
  24. if(typeof GM_getValue == 'undefined' || (typeof GM_getValue.toString == 'function' && GM_getValue.toString().indexOf('not supported') > -1)) {
  25. GM_getValue = my_GM_getValue;
  26. GM_setValue = my_GM_setValue;
  27. }
  28. insertStyle();
  29. insertStatus();
  30. filterScripts();
  31. insertSwitches();
  32. var flag;
  33. // ADD A NEWLINE AT THE END OF EACH FILTER
  34. if (document.querySelector('.filter-status').parentNode.childNodes[5].childNodes[0].innerHTML == 'Games' ) {
  35. flag = 5; }
  36. else {flag = 9}
  37. for (i=0; i<4; i++){
  38. document.querySelector('.filter-status').parentNode.childNodes[flag].childNodes[i].innerHTML += '<br>';
  39. }
  40. // Note: you may uncomment line 45 and comment out line 46, in order the filtered scripts to be highlighted yellow -instead of hiding them- so that you can check which scripts have been filtered
  41. function insertStyle() {
  42. var style = document.createElement('style');
  43. // style.textContent = 'tr.filtered { background-color:yellow; !important; } .filter-status { margin-left: 6px; } .filter-switches { display:none; } *:hover > .filter-switches { display:inline; } .filter-switches a { text-decoration:none !important; color:inherit; cursor:pointer; } .filter-switches a { margin-left: 8px; padding: 0 4px; } a.filter-on { background-color:#ffcccc; color:#333333 } a.filter-off { background-color:#ccffcc; color:#333333 } ';
  44. style.textContent = 'tr.filtered { display:none; !important; } .filter-status { margin-left: 6px; } .filter-switches { display:none; } *:hover > .filter-switches { display:inline; } .filter-switches a { text-decoration:none !important; color:inherit; cursor:pointer; } .filter-switches a { margin-left: 8px; padding: 0 4px; } a.filter-on { background-color:#ffcccc; color:#333333 } a.filter-off { background-color:#ccffcc; color:#333333 } ';
  45. style.type = 'text/css';
  46. document.querySelector('head').appendChild(style);
  47. }
  48. function insertStatus() {
  49. var p = document.querySelector('.col-sm-4');
  50. if(p) {
  51. var status = document.createElement('span');
  52. status.className = 'filter-status';
  53. p.appendChild(status);
  54. }
  55. p.innerHTML += '<br>'; // ADDS A NEWLINE AT THE END OF THE 'STATUS' ENTRY
  56. }
  57. function filterScripts() {
  58. var activeFilters = [];
  59. for(var filter in filters) {
  60. if(filters.hasOwnProperty(filter) && GM_getValue(filter, 'on') == 'on') {
  61. activeFilters.push(filters[filter]);
  62. }
  63. }
  64. var nodes = document.querySelectorAll('tr'), numActiveFilters = activeFilters.length, numFiltered = 0;
  65. for(var i = 1, numNodes = nodes.length-6, td = null; i < numNodes && (td = nodes[i]); i++) {
  66. td.className = '';
  67. for(var j = 0; j < numActiveFilters; j++) {
  68. if(typeof (td.childNodes[1].childNodes[9]) !== "undefined"){ // Check whether the current script disctription" element is not undefined, i.e. it exists
  69. if(td.childNodes[1].childNodes[9].textContent.match(activeFilters[j]) ) {
  70. td.className = 'filtered';
  71. numFiltered++;
  72. break;
  73. }
  74. }
  75. }
  76. }
  77. document.querySelector('.filter-status').textContent = document.querySelectorAll('tr').length-numFiltered-6 + ' scripts (' + numFiltered + ' filtered)';
  78. }
  79. function insertSwitches() {
  80. var span = document.createElement('span');
  81. span.className = 'filter-switches';
  82. for(var filter in filters) {
  83. if(filters.hasOwnProperty(filter)) {
  84. span.appendChild(createSwitch(filter, GM_getValue(filter, 'on') == 'on'));
  85. }
  86. }
  87. document.querySelector('.filter-status').parentNode.appendChild(span);
  88. }
  89. function createSwitch(label, isOn) {
  90. var a = document.createElement('a');
  91. a.className = isOn ? 'filter-on' : 'filter-off';
  92. a.textContent = label;
  93. a.addEventListener('click', function(e) {
  94. if(this.className == 'filter-on') {
  95. this.className = 'filter-off';
  96. GM_setValue(this.textContent, 'off');
  97. } else {
  98. this.className = 'filter-on';
  99. GM_setValue(this.textContent, 'on');
  100. }
  101. filterScripts();
  102. e.preventDefault();
  103. }, false);
  104. return a;
  105. }
  106. function my_GM_setValue(name, value) {
  107. localStorage.setItem(name, value);
  108. }
  109. function my_GM_getValue(name, defaultValue) {
  110. var value;
  111. if (!(value = localStorage.getItem(name))) {
  112. return defaultValue;
  113. }
  114. return value;
  115. }
  116. })();