// ==UserScript== // @name mmmturkeybacon Expected Earnings - Pending Approval Earnings // @author mmmturkeybacon // @description Shows the total earnings from all HITs over the past 30 days which have not yet been approved nor rejected. // @namespace http://userscripts.org/users/523367 // @match https://www.mturk.com/mturk/dashboard // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js // @version 1.01 // @grant GM_log // @downloadURL none // ==/UserScript== var DATE_LIST_DELAY = 500; var STATUSDETAIL_DELAY = 500; var MPRE_DELAY = 2000; var PENDING_EARNINGS_LINK_TEXT = 'Pending Approval Earnings'; var global_run = false; var statusdetail_loop_finished = false; var total = 0; var page_num = 1; var pending_earnings_link = document.createElement("A"); var pending_earnings_field = document.createElement("TD"); pending_earnings_field.title = 'Don\'t count your turkeys before they\'ve hatched.'; function set_progress_report(text, force) { if (global_run == true || force == true) { pending_earnings_link.innerHTML = text; } } function wait_until_finished() { if (global_run == true) { if (statusdetail_loop_finished == true) { global_run = false; pending_earnings_link.innerHTML = PENDING_EARNINGS_LINK_TEXT; pending_earnings_field.innerHTML = '$' + (total/100).toFixed(2); setCookie('mmmturkeybacon_pending_earnings_total', total, 1); } else { setTimeout(function(){wait_until_finished();}, 500); } } } function scrape($src) { var $reward = $src.find('td[class="statusdetailAmountColumnValue"]'); for (var j = 0; j < $reward.length; j++) { // I"m worried if I use parseFloat errors will accumulate because floats are inexact var reward = parseInt($reward.eq(j).text().replace(/[^0-9]/g,''), 10); total += reward; } } function statusdetail_loop(next_URL) { if (global_run == true) { if (next_URL.length != 0) { $.get(next_URL, function(data) { var $src = $(data); 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 date_header = $src.find("td[class='white_text_14_bold']:contains('HITs You Worked On For')").text().replace(/HITs You Worked On For|\(What\'s this\?\)/g, '').trim(); set_progress_report('Processing ' + date_header + ' - page ' + page_num); page_num++; scrape($src); $next_URL = $src.find('a[href^="/mturk/statusdetail"]:contains("Next")'); next_URL = ($next_URL.length != 0) ? $next_URL.attr("href") : ""; setTimeout(function(){statusdetail_loop(next_URL);}, STATUSDETAIL_DELAY); } else { setTimeout(function(){statusdetail_loop(next_URL);}, MPRE_DELAY); } }); } else { statusdetail_loop_finished = true; } } } function date_list_loop(date_URLs) { if (global_run == true) { if (date_URLs.length != 0) { if (statusdetail_loop_finished == true) { page_num = 1; statusdetail_loop_finished = false; var next_URL = date_URLs.pop() + '&sortType=Pending&pageNumber=1'; statusdetail_loop(next_URL); setTimeout(function(){date_list_loop(date_URLs);}, DATE_LIST_DELAY); } else { setTimeout(function(){date_list_loop(date_URLs);}, DATE_LIST_DELAY); } } else { wait_until_finished(); } } } function draw_interface() { var new_row = document.createElement("tr"); new_row.id = 'pending_earnings'; var pending_earnings_clear_cookies_link = document.createElement('A'); pending_earnings_clear_cookies_link.innerHTML = 'x'; pending_earnings_clear_cookies_link.title = 'Click to clear and recalculate.'; pending_earnings_clear_cookies_link.href = '#'; pending_earnings_clear_cookies_link.onclick = function(){clearCookies(); start_running(); return false;}; // return false so href isn't followed pending_earnings_link.title = 'Speculative earnings from HITs that have not been approved yet. Click to calculate/stop.'; pending_earnings_link.href = '#'; pending_earnings_link.onclick = function(){start_running(); return false}; // return false so href isn't followed var pending_earnings_link_cell = document.createElement("td"); pending_earnings_link_cell.className = 'metrics-table-first-value'; pending_earnings_link_cell.style.paddingLeft = '3px'; pending_earnings_link_cell.appendChild(pending_earnings_clear_cookies_link); pending_earnings_link_cell.appendChild(document.createTextNode(' ')); pending_earnings_link_cell.appendChild(pending_earnings_link); new_row.appendChild(pending_earnings_link_cell); new_row.appendChild(pending_earnings_field); var $expected_earnings_header = $('tr[id="expected_earnings_row"]'); if ($expected_earnings_header.length > 0) { // Approved, Pending, Projected Month, Projected Week, Projected Today var $approved_pending_earnings_row = $('tr[id="approved_pending_earnings"]'); if ($approved_pending_earnings_row.length > 0) { $approved_pending_earnings_row.after(new_row); } else { $expected_earnings_header.after(new_row); } $expected_earnings_header.nextAll('tr').each(function(index) { $(this).attr('class', ((index % 2 == 0) ? 'odd' : 'even')); }); } else { var $transfer_earnings_row = $('a[href="/mturk/transferearnings"]:contains("Transfer Earnings")').parent().parent(); $transfer_earnings_row.after('