MTurk Dashboard Change Notifier (with 12-value mod)

Shows changes since last page load for 12 values in Earnings To Date, Your HIT Status for Today, and HITs You Have Submitted.

目前为 2014-11-13 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name MTurk Dashboard Change Notifier (with 12-value mod)
  3. // @namespace clickhappier
  4. // @author clickhappier + ThirdClassInternationalMasterTurker
  5. // @description Shows changes since last page load for 12 values in Earnings To Date, Your HIT Status for Today, and HITs You Have Submitted.
  6. // @include https://www.mturk.com/mturk/dashboard
  7. // @version 2.1c
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. // 2014-07-14 2.1c - Improved Today-change handling for negative value changes in Rejected/Pending, and fractional bonus handling, by clickhappier.
  12. // 2014-07-04 2.0c - Modified extensively by clickhappier to add tracking a lot more values. Also cleaned up some oddly-written parts.
  13. // Previously tracked 4 values:
  14. // Total Earnings section: Approved dollars, Bonuses dollars, Total dollars.
  15. // Your HIT Status section: Today's Submitted.
  16. // Now tracks 12 values:
  17. // Total Earnings section: Approved dollars, Bonuses dollars, Total dollars, Earnings Available for Transfer dollars.
  18. // Your HIT Status section: Today's Submitted, Today's Approved, Today's Rejected, Today's Pending.
  19. // HITs You Have Submitted section: HITs Submitted, ... Approved, ... Rejected, ... Pending.
  20.  
  21. // 2012-09-09 First public release by ThirdClassInternationalMasterTurker
  22. // 2012-09-20 1.0 First vorking version
  23. // 2012-12-02 1.1 Added @downloadURL and @updateURL
  24.  
  25.  
  26. // replacement for inconsistently-rounding built-in toFixed function, from stackoverflow, for better fractional bonus handling
  27.  
  28. function toFixed ( number, precision ) {
  29. var multiplier = Math.pow( 10, precision + 1 ),
  30. wholeNumber = Math.floor( number * multiplier );
  31. return Math.round( wholeNumber / 10 ) * 10 / multiplier;
  32. }
  33.  
  34. // TCIMT's calling of toFixed plus comma removal
  35.  
  36. function to_fixed(str) {
  37. str = str.slice(1).replace(',', '');
  38. return parseFloat(str).toFixed(2);
  39. }
  40.  
  41.  
  42. var rows = document.evaluate('//tr[@class]',
  43. document,
  44. null,
  45. XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  46.  
  47.  
  48. // initial definitions of variables from localStorage items
  49.  
  50. // Total Earnings section
  51.  
  52. if (localStorage['prev_approvedDollars'] === undefined)
  53. prev_approvedDollars = "$0";
  54. else
  55. prev_approvedDollars = localStorage.getItem('prev_approvedDollars');
  56.  
  57. if (localStorage['prev_bonusesDollars'] === undefined)
  58. prev_bonusesDollars = "$0";
  59. else
  60. prev_bonusesDollars = localStorage.getItem('prev_bonusesDollars');
  61.  
  62. if (localStorage['prev_totalDollars'] === undefined)
  63. prev_totalDollars = "$0";
  64. else
  65. prev_totalDollars = localStorage.getItem('prev_totalDollars');
  66.  
  67. if (localStorage['prev_transferDollars'] === undefined)
  68. prev_transferDollars = "$0";
  69. else
  70. prev_transferDollars = localStorage.getItem('prev_transferDollars');
  71.  
  72. // Your HIT Status section
  73.  
  74. if (localStorage['prev_submittedToday'] === undefined)
  75. prev_submittedToday = 0;
  76. else
  77. prev_submittedToday = parseInt(localStorage.getItem('prev_submittedToday'));
  78.  
  79. if (localStorage['prev_approvedToday'] === undefined)
  80. prev_approvedToday = 0;
  81. else
  82. prev_approvedToday = parseInt(localStorage.getItem('prev_approvedToday'));
  83.  
  84. if (localStorage['prev_rejectedToday'] === undefined)
  85. prev_rejectedToday = 0;
  86. else
  87. prev_rejectedToday = parseInt(localStorage.getItem('prev_rejectedToday'));
  88.  
  89. if (localStorage['prev_pendingToday'] === undefined)
  90. prev_pendingToday = 0;
  91. else
  92. prev_pendingToday = parseInt(localStorage.getItem('prev_pendingToday'));
  93.  
  94. // HITs You Have Submitted section
  95.  
  96. if (localStorage['prev_submittedHITs'] === undefined)
  97. prev_submittedHITs = 0;
  98. else
  99. prev_submittedHITs = parseInt(localStorage.getItem('prev_submittedHITs'));
  100.  
  101. if (localStorage['prev_approvedHITs'] === undefined)
  102. prev_approvedHITs = 0;
  103. else
  104. prev_approvedHITs = parseInt(localStorage.getItem('prev_approvedHITs'));
  105.  
  106. if (localStorage['prev_rejectedHITs'] === undefined)
  107. prev_rejectedHITs = 0;
  108. else
  109. prev_rejectedHITs = parseInt(localStorage.getItem('prev_rejectedHITs'));
  110.  
  111. if (localStorage['prev_pendingHITs'] === undefined)
  112. prev_pendingHITs = 0;
  113. else
  114. prev_pendingHITs = parseInt(localStorage.getItem('prev_pendingHITs'));
  115.  
  116. // perform comparisons and update localStorage items
  117.  
  118. for (var i=0; i<rows.snapshotLength; i++) {
  119. var row = rows.snapshotItem(i);
  120. // Total Earnings section
  121.  
  122. if (row.cells.length == 2) {
  123.  
  124. if (row.cells[0].textContent.match('Approved HITs'))
  125. {
  126. var new_approvedDollars = row.cells[1].childNodes[0].textContent;
  127. if (new_approvedDollars != prev_approvedDollars)
  128. {
  129. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+$" + (to_fixed(new_approvedDollars) - to_fixed(prev_approvedDollars)).toFixed(2) + "</span>";
  130. }
  131. localStorage.setItem('prev_approvedDollars', new_approvedDollars);
  132. }
  133.  
  134. if (row.cells[0].textContent.match('Bonuses'))
  135. {
  136. var new_bonusesDollars = row.cells[1].childNodes[0].textContent;
  137. if (new_bonusesDollars != prev_bonusesDollars)
  138. {
  139. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+$" + (to_fixed(new_bonusesDollars) - to_fixed(prev_bonusesDollars)).toFixed(2) + "</span>";
  140. }
  141. localStorage.setItem('prev_bonusesDollars', new_bonusesDollars);
  142. }
  143.  
  144. if (row.cells[0].textContent.match('Total Earnings'))
  145. {
  146. var new_totalDollars = row.cells[1].childNodes[0].textContent;
  147. if (new_totalDollars != prev_totalDollars)
  148. {
  149. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+$" + (to_fixed(new_totalDollars) - to_fixed(prev_totalDollars)).toFixed(2) + "</span>";
  150. }
  151. localStorage.setItem('prev_totalDollars', new_totalDollars);
  152. }
  153.  
  154. if (row.cells[0].textContent.match('Earnings Available for Transfer'))
  155. {
  156. var new_transferDollars = row.cells[1].childNodes[0].textContent;
  157. if (new_transferDollars > prev_transferDollars)
  158. {
  159. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+$" + (to_fixed(new_transferDollars) - to_fixed(prev_transferDollars)).toFixed(2) + "</span>";
  160. }
  161. else if (new_transferDollars < prev_transferDollars)
  162. {
  163. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">$" + (to_fixed(new_transferDollars) - to_fixed(prev_transferDollars)).toFixed(2) + "</span>";
  164. }
  165. localStorage.setItem('prev_transferDollars', new_transferDollars);
  166. }
  167. }
  168. // Your HIT Status section
  169.  
  170. if (row.cells.length == 6) {
  171.  
  172. if (row.cells[0].textContent.match('Today'))
  173. {
  174. var new_submittedToday = parseInt(row.cells[1].textContent);
  175. if (new_submittedToday > prev_submittedToday)
  176. {
  177. row.cells[1].innerHTML = "<span style=\"color:grey;float:left;\">+" + (new_submittedToday - prev_submittedToday) + "</span>" + row.cells[1].innerHTML;
  178. }
  179. localStorage.setItem('prev_submittedToday', new_submittedToday);
  180. }
  181. if (row.cells[0].textContent.match('Today'))
  182. {
  183. var new_approvedToday = parseInt(row.cells[2].textContent);
  184. if (new_approvedToday > prev_approvedToday)
  185. {
  186. row.cells[2].innerHTML = "<span style=\"color:grey;float:left;\">+" + (new_approvedToday - prev_approvedToday) + "</span>" + row.cells[2].innerHTML;
  187. }
  188. localStorage.setItem('prev_approvedToday', new_approvedToday);
  189. }
  190. if (row.cells[0].textContent.match('Today'))
  191. {
  192. var new_rejectedToday = parseInt(row.cells[3].textContent);
  193. if (new_rejectedToday > prev_rejectedToday)
  194. {
  195. row.cells[4].innerHTML = "<span style=\"color:grey;float:left;\">+" + (new_rejectedToday - prev_rejectedToday) + "</span>" + row.cells[4].innerHTML;
  196. }
  197. else if (new_submittedToday < prev_submittedToday)
  198. {
  199. // don't display negative value change if rejected amount went down only because the 'Today' date changed
  200. }
  201. else if (new_rejectedToday < prev_rejectedToday)
  202. {
  203. row.cells[4].innerHTML = "<span style=\"color:grey;float:left;\">" + (new_rejectedToday - prev_rejectedToday) + "</span>" + row.cells[4].innerHTML;
  204. }
  205. localStorage.setItem('prev_rejectedToday', new_rejectedToday);
  206. }
  207.  
  208. if (row.cells[0].textContent.match('Today'))
  209. {
  210. var new_pendingToday = parseInt(row.cells[4].textContent);
  211. if (new_pendingToday > prev_pendingToday)
  212. {
  213. row.cells[4].innerHTML = "<span style=\"color:grey;float:left;\">+" + (new_pendingToday - prev_pendingToday) + "</span>" + row.cells[4].innerHTML;
  214. }
  215. else if (new_submittedToday < prev_submittedToday)
  216. {
  217. // don't display negative value change if pending amount went down only because the 'Today' date changed
  218. }
  219. else if (new_pendingToday < prev_pendingToday)
  220. {
  221. row.cells[4].innerHTML = "<span style=\"color:grey;float:left;\">" + (new_pendingToday - prev_pendingToday) + "</span>" + row.cells[4].innerHTML;
  222. }
  223. localStorage.setItem('prev_pendingToday', new_pendingToday);
  224. }
  225. }
  226. // HITs You Have Submitted section
  227.  
  228. if (row.cells.length == 3) {
  229.  
  230. if (row.cells[0].textContent.match('HITs Submitted'))
  231. {
  232. var new_submittedHITs = row.cells[1].childNodes[0].textContent;
  233. if (new_submittedHITs > prev_submittedHITs)
  234. {
  235. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+" + (new_submittedHITs - prev_submittedHITs) + "</span>";
  236. }
  237. localStorage.setItem('prev_submittedHITs', new_submittedHITs);
  238. }
  239.  
  240. if (row.cells[0].textContent.match('... Approved'))
  241. {
  242. var new_approvedHITs = row.cells[1].childNodes[0].textContent;
  243. if (new_approvedHITs > prev_approvedHITs)
  244. {
  245. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+" + (new_approvedHITs - prev_approvedHITs) + "</span>";
  246. }
  247. localStorage.setItem('prev_approvedHITs', new_approvedHITs);
  248. }
  249.  
  250. if (row.cells[0].textContent.match('... Rejected'))
  251. {
  252. var new_rejectedHITs = row.cells[1].childNodes[0].textContent;
  253. if (new_rejectedHITs > prev_rejectedHITs)
  254. {
  255. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+" + (new_rejectedHITs - prev_rejectedHITs) + "</span>";
  256. }
  257. else if (new_rejectedHITs < prev_rejectedHITs)
  258. {
  259. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">" + (new_rejectedHITs - prev_rejectedHITs) + "</span>";
  260. }
  261. localStorage.setItem('prev_rejectedHITs', new_rejectedHITs);
  262. }
  263.  
  264. if (row.cells[0].textContent.match('... Pending'))
  265. {
  266. var new_pendingHITs = row.cells[1].childNodes[0].textContent;
  267. if (new_pendingHITs > prev_pendingHITs)
  268. {
  269. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">+" + (new_pendingHITs - prev_pendingHITs) + "</span>";
  270. }
  271. else if (new_pendingHITs < prev_pendingHITs)
  272. {
  273. row.cells[0].innerHTML += "<span style=\"color:grey;float:right;\">" + (new_pendingHITs - prev_pendingHITs) + "</span>";
  274. }
  275. localStorage.setItem('prev_pendingHITs', new_pendingHITs);
  276. }
  277. }
  278. }