mmmturkeybacon Add Hidden Stats to Dashboard

Adds submission, return, and abandonment_rates to the dashboard. Saves stats and only updates them when "Update stats" is clicked to reduce page requests.

  1. // ==UserScript==
  2. // @name mmmturkeybacon Add Hidden Stats to Dashboard
  3. // @version 2.00
  4. // @description Adds submission, return, and abandonment_rates to the dashboard. Saves stats and only updates them when "Update stats" is clicked to reduce page requests.
  5. // @author mmmturkeybacon
  6. // @namespace http://userscripts.org/users/523367
  7. // @include https://www.mturk.com/mturk/dashboard
  8. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
  9. // @grant GM_getValue
  10. // @grant GM_setValue
  11. // ==/UserScript==
  12.  
  13. // Thanks to TheFrostlixen for showing me an alternative way to get the stats.
  14.  
  15. $(document).ready(function()
  16. {
  17. var MPRE_CNT_MAX = 5;
  18. var qualification_dict = {};
  19. qualification_dict['submission_rate'] = {'qualificationId': '00000000000000000000', 'value': GM_getValue('submission_rate', '?%')};
  20. qualification_dict['return_rate'] = {'qualificationId': '000000000000000000E0', 'value': GM_getValue('return_rate', '?%')};
  21. qualification_dict['abandonment_rate'] = {'qualificationId': '00000000000000000070', 'value': GM_getValue('abandonment_rate', '?%')};
  22. var qualification_names = ['submission_rate', 'return_rate', 'abandonment_rate'];
  23. var request_loop_running = false;
  24. var stat_request_running = false;
  25. var success = false;
  26. var mpre_cnt = 0;
  27. var error = false;
  28.  
  29. function stat_request(qualification_name)
  30. {
  31. stat_request_running = true;
  32. success = false;
  33.  
  34. $.ajax(
  35. {
  36. url: 'https://www.mturk.com/mturk/requestqualification?qualificationId='+qualification_dict[qualification_name].qualificationId,
  37. type: 'GET',
  38. success: function(data)
  39. {
  40. var $src = $(data);
  41. var maxpagerate = $src.find('td[class="error_title"]:contains("You have exceeded the maximum allowed page request rate for this website.")');
  42. if (maxpagerate.length == 0)
  43. {
  44. qualification_dict[qualification_name].value = $src.find('td[id="qualification_score"]:contains("Qualification Value")').next().text().trim() + '%';
  45. $('td[id="'+qualification_name+'"]').html('&#10004');
  46. success = true;
  47. }
  48. else
  49. {
  50. $('td[id="'+qualification_name+'"]').html('&#10006');
  51. mpre_cnt++;
  52. if (mpre_cnt >= MPRE_CNT_MAX)
  53. {
  54. error = true;
  55. alert('mmmturkeybacon Add Hidden Stats to Dashboard: too many max page request rate errors');
  56. }
  57. }
  58. stat_request_running = false;
  59. },
  60. error: function(xhr, status, error)
  61. {
  62. $('td[id="'+qualification_name+'"]').html('&#10006');
  63. error = true;
  64. alert('mmmturkeybacon Add Hidden Stats to Dashboard: timeout error');
  65. stat_request_running = false;
  66. },
  67. timeout: 3000
  68. });
  69. }
  70.  
  71. function request_loop(i)
  72. {
  73. request_loop_running = true;
  74.  
  75. if (error == false)
  76. {
  77. if (stat_request_running == false)
  78. {
  79. if (success == true)
  80. {
  81. i++;
  82. if (i < qualification_names.length)
  83. {
  84. stat_request(qualification_names[i]);
  85. setTimeout(function(){request_loop(i)}, 500);
  86. }
  87. else
  88. {
  89. GM_setValue('submission_rate', qualification_dict['submission_rate'].value);
  90. GM_setValue('return_rate', qualification_dict['return_rate'].value);
  91. GM_setValue('abandonment_rate', qualification_dict['abandonment_rate'].value);
  92. var $submitted_table = $('th[id="hit_totals.desc_dolumn_header.tooltop.1"]').parents('td[width="50%"]');
  93.  
  94. $('td[id="submission_rate"]').text(qualification_dict['submission_rate'].value);
  95. $('td[id="return_rate"]').text(qualification_dict['return_rate'].value);
  96. $('td[id="abandonment_rate"]').text(qualification_dict['abandonment_rate'].value);
  97. request_loop_running = false;
  98. }
  99. }
  100. else
  101. {
  102. stat_request(qualification_names[i]);
  103. setTimeout(function(){request_loop(i)}, 500);
  104. }
  105. }
  106. }
  107. else
  108. {
  109. request_loop_running = false;
  110. }
  111. }
  112.  
  113. var $submitted_table = $('th[id="hit_totals.desc_dolumn_header.tooltop.1"]').parents('td[width="50%"]');
  114.  
  115. $submitted_table.before('<td width="50%"><table class="metrics-table" width="100%" style="display: inline-block"><tr class="metrics-table-header-row"><th class="metrics-table-first-header"><a id="hit_totals.desc_dolumn_header.tooltop.2" class="metrics-table-first-header">HITs You Have Accepted</a>&nbsp;<a id="mtb_update_stats" class="whatis" style="display: inline-block; cursor: pointer">(Update stats)</a></th><th id="user_metrics.rate_column_header.tooltip.2">Rate</th><tr class="odd"><td class="metrics-table-first-value">HITs Accepted</td><td>&mdash;</td></tr><tr class="even"><td class="metrics-table-first-value">... Submitted</td><td id="submission_rate">'+qualification_dict['submission_rate'].value+'</td></tr><tr class="odd"><td class="metrics-table-first-value">... Returned</td><td id="return_rate">'+qualification_dict['return_rate'].value+'</td></tr><tr class="even"><td class="metrics-table-first-value">... Abandoned</td><td id="abandonment_rate">'+qualification_dict['abandonment_rate'].value+'</td></tr></table></td>');
  116.  
  117. $('a[id="mtb_update_stats"]').bind('click', function()
  118. {
  119. if (request_loop_running == false)
  120. {
  121. request_loop_running = true;
  122. stat_request_running = false;
  123. success = false;
  124. mpre_cnt = 0;
  125. error = false;
  126. $('td[id="submission_rate"]').text('?%');
  127. $('td[id="return_rate"]').text('?%');
  128. $('td[id="abandonment_rate"]').text('?%');
  129. request_loop(0);
  130. }
  131. });
  132. });