// ==UserScript== // @name mmmturkeybacon Ghost HIT Buster for Forums // @author mmmturkeybacon // @description Searches forum posts for HIT links, follows them, determines if the HIT is still available, and strikes the post if the HIT is ghost or changes the link text to show the automatic approval time if the HIT is available. Using this script will increase the number of page requests you make to mturk and may cause Page Monitor to give false alarms. // @namespace http://userscripts.org/users/523367 // @match http://mturkgrind.com/threads/* // @match http://www.mturkgrind.com/threads/* // @match http://mturkforum.com/showthread.php?* // @match http://www.mturkforum.com/showthread.php?* // @match http://turkernation.com/showthread.php?* // @match http://www.turkernation.com/showthread.php?* // @require http://code.jquery.com/jquery-latest.min.js // @version 1.28 // @grant GM_xmlhttpRequest // @downloadURL none // ==/UserScript== var REQUEST_DELAY = 800; // milliseconds var posts_dict = {}; $(document).ready(function () { var $preview_links = $('a[href*="/mturk/preview?"]'); var $hit_posts = $('div[id^="post_message_"]').has('a[href*="/mturk/preview?"]'); $hit_posts.each(function() { var num_links = $(this).find('a[href*="/mturk/preview?"]').length; posts_dict[$(this).attr('id')] = {num_links: num_links, link_cnt: 0, strike_all: false, strike_all_override: false}; }); function bustin_makes_me_feel_good($link) { GM_xmlhttpRequest( { method: "GET", url: $link.attr('href'), onerror: function(){alert('failed');}, onload: function (response) { var $src = $(response.responseText); var id = $link.closest('div[id^="post_message_"]').attr('id'); var maxpagerate = $src.find('td[class="error_title"]:contains("You have exceeded the maximum allowed page request rate for this website.")'); if (maxpagerate.length == 0) { var is_a_HIT = $src.find('input[type="hidden"][name="isAccepted"]').length > 0; if (is_a_HIT) { var hitAutoAppDelayInSeconds = $src.find('input[type="hidden"][name="hitAutoAppDelayInSeconds"]').val(); // time formatting code modified from http://userscripts.org/scripts/show/169154 var days = Math.floor((hitAutoAppDelayInSeconds/(60*60*24))); var hours = Math.floor((hitAutoAppDelayInSeconds/(60*60)) % 24); var mins = Math.floor((hitAutoAppDelayInSeconds/60) % 60); var secs = hitAutoAppDelayInSeconds % 60; var time_str = (days == 0 ? '' : days + (days > 1 ? ' days ' : ' day ')) + (hours == 0 ? '' : hours + (hours > 1 ? ' hours ' : ' hour ')) + (mins == 0 ? '' : mins + (mins > 1 ? ' minutes ' : ' minute ')) + (secs == 0 ? '' : secs + (secs > 1 ? ' seconds ' : ' second ')); time_str = time_str.replace(/\s+$/, ''); if (hitAutoAppDelayInSeconds == 0) { time_str = "0 seconds"; } $link.text('[AA: '+time_str+'] -- ' + $link.text()); posts_dict[id].link_cnt++; posts_dict[id].strike_all_override = true; } else { var $hit_container = $link.closest('table[class^="cms_table"],[class^="ctaBbcodeTable"]'); if ($hit_container.length > 0) { $hit_container.css('text-decoration', 'line-through'); posts_dict[id].link_cnt++; } else { $link.css('text-decoration', 'line-through'); posts_dict[id].link_cnt++; posts_dict[id].strike_all = true; } } } else { $link.text('[Page Request Rate Error] -- ' + $link.text()); posts_dict[id].link_cnt++; posts_dict[id].strike_all_override = true; } if ((posts_dict[id].strike_all_override == false) && (posts_dict[id].strike_all == true) && (posts_dict[id].link_cnt == posts_dict[id].num_links)) { $link.closest('div[id^="'+id+'"]').css('text-decoration', 'line-through'); } } }); } function preview_links_loop(i) { var $next_link = $preview_links.eq(i); i++; if ($next_link.length > 0) { bustin_makes_me_feel_good($next_link); // Slow don't page request rate. // This won't make the script immune to page request // errors. Retrying after an error would take to long. setTimeout(function(){preview_links_loop(i)}, REQUEST_DELAY); } } if ($preview_links.length > 0) { preview_links_loop(0); } });