kewlncguy

Untitled

Dec 14th, 2017
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 90.74 KB | None | 0 0
  1. // ==UserScript==
  2. // @name HIT Finder Beta (Worker PANDA)
  3. // @namespace http://kadauchi.com/
  4. // @version 0.18.0
  5. // @description Monitors mturk.com for HITs
  6. // @author Kadauchi
  7. // @icon http://i.imgur.com/oGRQwPN.png
  8. // @include https://worker.mturk.com/?finder_beta
  9. // @include https://www.mturk.com/mturk/findhits?match=true?finder_beta
  10. // @grant GM_log
  11. // @grant GM_setClipboard
  12. // @require https://code.jquery.com/jquery-3.1.0.min.js
  13. // ==/UserScript==
  14.  
  15. var worker = document.URL.match(/https:\/\/worker.mturk.com\//) ? true : false;
  16.  
  17. var _config = JSON.parse(localStorage.getItem('_finder')) || {};
  18. var blocklist = JSON.parse(localStorage.getItem('_finder_bl')) || {};
  19. var includelist = JSON.parse(localStorage.getItem('_finder_il')) || {};
  20.  
  21. // Compatability check
  22. if (_config.version !== '1.1') { _config = {}; }
  23.  
  24. var config = {
  25. version : _config.version || '1.1',
  26. delay : _config.delay || '3',
  27. type : _config.type || 'LastUpdatedTime%3A1&pageSize=',
  28. size : _config.size || '25',
  29. rew : _config.rew || '0.00',
  30. avail : _config.avail || '0',
  31. mto : _config.mto || '0.00',
  32. alert : _config.alert || '0',
  33. qual : _config.hasOwnProperty('qual') ? _config.qual : true,
  34. new : _config.hasOwnProperty('new') ? _config.new : true,
  35. newaudio : _config.newaudio || 'beep',
  36. pb : _config.hasOwnProperty('pb') ? _config.pb : false,
  37. to : _config.hasOwnProperty('to') ? _config.to : true,
  38. nl : _config.hasOwnProperty('nl') ? _config.nl : false,
  39. bl : _config.hasOwnProperty('bl') ? _config.bl : false,
  40. m : _config.hasOwnProperty('m') ? _config.m : false,
  41. push : _config.push || 'access_token_here',
  42. theme : _config.theme || 'default',
  43. custom : _config.custom || {main: 'FFFFFF', primary: 'CCCCCC', secondary: '111111', text: '000000', link: '0000EE', visited: '551A8B', prop : false},
  44. to_theme : _config.to_theme || '1'
  45. };
  46.  
  47. var themes = {
  48. 'default' : {main: 'F2F2F2', primary: 'CCCCCC', secondary: '111111', text: '000000', link: '0000EE', visited: '551A8B', prop : true},
  49. 'dark' : {main: '404040', primary: '666666', secondary: 'FFFFFF', text: 'FFFFFF', link: 'FFFFFF', visited: 'B3B3B3', prop : true},
  50. 'darker' : {main: '000000', primary: '262626', secondary: 'FFFFFF', text: 'FFFFFF', link: 'FFFFFF', visited: 'B3B3B3', prop : true},
  51. 'custom' : config.custom
  52. };
  53.  
  54. var hitdb = { db: null };
  55.  
  56. window.indexedDB.open('HITDB').onsuccess = function() {
  57. hitdb.db = this.result;
  58. };
  59.  
  60. var searches = 0,
  61. logged = 0,
  62. hitlog = {},
  63. noti_delay = [],
  64. push_delay = [];
  65.  
  66. // Adjust stuff depending on what site we are on.
  67. var url, upd, num, rew, minrew;
  68.  
  69. if (!worker) {
  70. url = 'https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&sortType=';
  71. upd = 'LastUpdatedTime%3A1&pageSize=';
  72. num = 'NumHITs%3A1&pageSize=';
  73. rew = 'Reward%3A1&pageSize=';
  74. minrew = '&minReward=';
  75. }
  76. else {
  77. url = 'https://worker.mturk.com/?';
  78. upd = '&sort=updated_desc&page_size=';
  79. num = '&sort=num_hits_desc&page_size=';
  80. rew = '&sort=reward_desc&page_size=';
  81. minrew = '&filters%5Bmin_reward%5D=';
  82. }
  83.  
  84. $('head').html(
  85. '<title>HIT Finder Beta</title>' +
  86. '<link rel="icon" type="image/jpg" href="http://kadauchi.com/avatar4.jpg">' +
  87. '<base target="_blank">' +
  88.  
  89. '<audio id="audio_1"><source src="http://www.soundjay.com/button/sounds/button-1.mp3" type="audio/mpeg"></audio>' +
  90. '<audio id="audio_2"><source src="http://www.soundjay.com/button/sounds/button-3.mp3" type="audio/mpeg"></audio>' +
  91. '<audio id="audio_3"><source src="http://www.soundjay.com/button/sounds/button-4.mp3" type="audio/mpeg"></audio>' +
  92. '<audio id="audio_4"><source src="http://www.soundjay.com/button/sounds/button-5.mp3" type="audio/mpeg"></audio>' +
  93.  
  94. //'<audio id="audio_default"><source src="http://www.soundjay.com/button/sounds/button-5.mp3" type="audio/mpeg"></audio>' +
  95. '<audio id="audio_beep"><source src="http://www.soundjay.com/button/sounds/beep-21.mp3" type="audio/mpeg"></audio>' +
  96. '<audio id="audio_beepbeep"><source src="http://www.soundjay.com/button/sounds/beep-24.mp3" type="audio/mpeg"></audio>' +
  97. //'<audio id="audio_ding"><source src="data:audio/ogg;base64,T2dnUwACAAAAAAAAAAB8mpoRAAAAAFLKt9gBHgF2b3JiaXMAAAAAARErAAAAAAAAkGUAAAAAAACZAU9nZ1MAAAAAAAAAAAAAfJqaEQEAAACHYsq6Cy3///////////+1A3ZvcmJpcx0AAABYaXBoLk9yZyBsaWJWb3JiaXMgSSAyMDA1MDMwNAAAAAABBXZvcmJpcxJCQ1YBAAABAAxSFCElGVNKYwiVUlIpBR1jUFtHHWPUOUYhZBBTiEkZpXtPKpVYSsgRUlgpRR1TTFNJlVKWKUUdYxRTSCFT1jFloXMUS4ZJCSVsTa50FkvomWOWMUYdY85aSp1j1jFFHWNSUkmhcxg6ZiVkFDpGxehifDA6laJCKL7H3lLpLYWKW4q91xpT6y2EGEtpwQhhc+211dxKasUYY4wxxsXiUyiC0JBVAAABAABABAFCQ1YBAAoAAMJQDEVRgNCQVQBABgCAABRFcRTHcRxHkiTLAkJDVgEAQAAAAgAAKI7hKJIjSZJkWZZlWZameZaouaov+64u667t6roOhIasBADIAAAYhiGH3knMkFOQSSYpVcw5CKH1DjnlFGTSUsaYYoxRzpBTDDEFMYbQKYUQ1E45pQwiCENInWTOIEs96OBi5zgQGrIiAIgCAACMQYwhxpBzDEoGIXKOScggRM45KZ2UTEoorbSWSQktldYi55yUTkompbQWUsuklNZCKwUAAAQ4AAAEWAiFhqwIAKIAABCDkFJIKcSUYk4xh5RSjinHkFLMOcWYcowx6CBUzDHIHIRIKcUYc0455iBkDCrmHIQMMgEAAAEOAAABFkKhISsCgDgBAIMkaZqlaaJoaZooeqaoqqIoqqrleabpmaaqeqKpqqaquq6pqq5seZ5peqaoqp4pqqqpqq5rqqrriqpqy6ar2rbpqrbsyrJuu7Ks256qyrapurJuqq5tu7Js664s27rkearqmabreqbpuqrr2rLqurLtmabriqor26bryrLryratyrKua6bpuqKr2q6purLtyq5tu7Ks+6br6rbqyrquyrLu27au+7KtC7vourauyq6uq7Ks67It67Zs20LJ81TVM03X9UzTdVXXtW3VdW1bM03XNV1XlkXVdWXVlXVddWVb90zTdU1XlWXTVWVZlWXddmVXl0XXtW1Vln1ddWVfl23d92VZ133TdXVblWXbV2VZ92Vd94VZt33dU1VbN11X103X1X1b131htm3fF11X11XZ1oVVlnXf1n1lmHWdMLqurqu27OuqLOu+ruvGMOu6MKy6bfyurQvDq+vGseu+rty+j2rbvvDqtjG8um4cu7Abv+37xrGpqm2brqvrpivrumzrvm/runGMrqvrqiz7uurKvm/ruvDrvi8Mo+vquirLurDasq/Lui4Mu64bw2rbwu7aunDMsi4Mt+8rx68LQ9W2heHVdaOr28ZvC8PSN3a+AACAAQcAgAATykChISsCgDgBAAYhCBVjECrGIIQQUgohpFQxBiFjDkrGHJQQSkkhlNIqxiBkjknIHJMQSmiplNBKKKWlUEpLoZTWUmotptRaDKG0FEpprZTSWmopttRSbBVjEDLnpGSOSSiltFZKaSlzTErGoKQOQiqlpNJKSa1lzknJoKPSOUippNJSSam1UEproZTWSkqxpdJKba3FGkppLaTSWkmptdRSba21WiPGIGSMQcmck1JKSamU0lrmnJQOOiqZg5JKKamVklKsmJPSQSglg4xKSaW1kkoroZTWSkqxhVJaa63VmFJLNZSSWkmpxVBKa621GlMrNYVQUgultBZKaa21VmtqLbZQQmuhpBZLKjG1FmNtrcUYSmmtpBJbKanFFluNrbVYU0s1lpJibK3V2EotOdZaa0ot1tJSjK21mFtMucVYaw0ltBZKaa2U0lpKrcXWWq2hlNZKKrGVklpsrdXYWow1lNJiKSm1kEpsrbVYW2w1ppZibLHVWFKLMcZYc0u11ZRai621WEsrNcYYa2415VIAAMCAAwBAgAlloNCQlQBAFAAAYAxjjEFoFHLMOSmNUs45JyVzDkIIKWXOQQghpc45CKW01DkHoZSUQikppRRbKCWl1losAACgwAEAIMAGTYnFAQoNWQkARAEAIMYoxRiExiClGIPQGKMUYxAqpRhzDkKlFGPOQcgYc85BKRljzkEnJYQQQimlhBBCKKWUAgAAChwAAAJs0JRYHKDQkBUBQBQAAGAMYgwxhiB0UjopEYRMSielkRJaCylllkqKJcbMWomtxNhICa2F1jJrJcbSYkatxFhiKgAA7MABAOzAQig0ZCUAkAcAQBijFGPOOWcQYsw5CCE0CDHmHIQQKsaccw5CCBVjzjkHIYTOOecghBBC55xzEEIIoYMQQgillNJBCCGEUkrpIIQQQimldBBCCKGUUgoAACpwAAAIsFFkc4KRoEJDVgIAeQAAgDFKOSclpUYpxiCkFFujFGMQUmqtYgxCSq3FWDEGIaXWYuwgpNRajLV2EFJqLcZaQ0qtxVhrziGl1mKsNdfUWoy15tx7ai3GWnPOuQAA3AUHALADG0U2JxgJKjRkJQCQBwBAIKQUY4w5h5RijDHnnENKMcaYc84pxhhzzjnnFGOMOeecc4wx55xzzjnGmHPOOeecc84556CDkDnnnHPQQeicc845CCF0zjnnHIQQCgAAKnAAAAiwUWRzgpGgQkNWAgDhAACAMZRSSimllFJKqKOUUkoppZRSAiGllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimVUkoppZRSSimllFJKKaUAIN8KBwD/BxtnWEk6KxwNLjRkJQAQDgAAGMMYhIw5JyWlhjEIpXROSkklNYxBKKVzElJKKYPQWmqlpNJSShmElGILIZWUWgqltFZrKam1lFIoKcUaS0qppdYy5ySkklpLrbaYOQelpNZaaq3FEEJKsbXWUmuxdVJSSa211lptLaSUWmstxtZibCWlllprqcXWWkyptRZbSy3G1mJLrcXYYosxxhoLAOBucACASLBxhpWks8LR4EJDVgIAIQEABDJKOeecgxBCCCFSijHnoIMQQgghREox5pyDEEIIIYSMMecghBBCCKGUkDHmHIQQQgghhFI65yCEUEoJpZRSSucchBBCCKWUUkoJIYQQQiillFJKKSGEEEoppZRSSiklhBBCKKWUUkoppYQQQiillFJKKaWUEEIopZRSSimllBJCCKGUUkoppZRSQgillFJKKaWUUkooIYRSSimllFJKCSWUUkoppZRSSikhlFJKKaWUUkoppQAAgAMHAIAAI+gko8oibDThwgMQAAAAAgACTACBAYKCUQgChBEIAAAAAAAIAPgAAEgKgIiIaOYMDhASFBYYGhweICIkAAAAAAAAAAAAAAAABE9nZ1MABAgkAAAAAAAAfJqaEQIAAAB89IOyJjhEQUNNRE5TRENHS0xTRllHSEpISUdORk1GSEdISUNHP0ZHS1IhquPYHv5OAgC/7wFATp2pUBdX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" type="audio/mpeg"></audio>' +
  98. //'<audio id="audio_squee"><source src="data:audio/mp3;base64,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VVVVVVVVVVVVVQBqs0jMnBWmgKng1FRU32lmZmb+N6/V+w+MygnAXTBSU3/Ffjw4KGwvhYijgbg038TRQL8U3//xv5cO4FZf/z8bdj8V3CpuILkwNl5P8KE+53G3eCoQUAIQxdpeAGCps5MdqtGpNehUFBQFS2qx1bDEzNSDATAKKlIBjsJGEQBFZnmMUrStzKW+pXKVDOZ+hnQ2jloarUNK2iGVjPlUVcHRF4NCI9e2HcNCJ4NQ0eEQlnbmh0FYaUxBTUUzLjk5LjNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kkScD/K0GL+QyBnCYEgHsjBlXAAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=" type="audio/mpeg"></audio>' +
  99. '<audio id="audio_click"><source src="http://www.soundjay.com/button/sounds/button-20.mp3" type="audio/mpeg"></audio>' +
  100.  
  101. '<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">' +
  102. '<style id="css" type="text/css">'
  103. );
  104.  
  105. $('body').html(
  106. // Main
  107. '<div style="margin-bottom: 5px;">' +
  108. '<button id="scan_button" style="margin-right: 5px;">Start</button>' +
  109. '<button id="bloc_button" style="margin-right: 5px;">Block List</button>' +
  110. '<button id="incl_button" style="margin-right: 5px;">Include List</button>' +
  111. '<button id="sett_button" style="margin-right: 5px;">Advanced Settings</button>' +
  112. '<button id="conf_button" style="margin-right: 5px;">Hide Config</button>' +
  113. '<button id="logg_button" style="margin-right: 0px;">Hide Logged HITs</button>' +
  114. '</div>' +
  115.  
  116. // Config
  117. '<div id="config" style="margin-bottom: 5px;">' +
  118.  
  119. '<div style="margin-bottom: 5px;">' +
  120. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Delay in seconds between searches.">Search Delay: ' +
  121. '<input id="delay" style="width: 50px;" type="number" step="1" min="1" value="' + config.delay + '">' +
  122. '</label>' +
  123.  
  124. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Filter HITs by minimum reward.">Min Reward: ' +
  125. '<input id="min_rew" style="width: 50px;" type="number" step="0.01" min="0" value="' + config.rew + '">' +
  126. '</label>' +
  127.  
  128. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Filter HITs by minimum available.">Min Avail: ' +
  129. '<input id="min_avail" style="width: 50px;" type="number" step="1" min="0" value="' + config.avail + '">' +
  130. '</label>' +
  131.  
  132. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Filter HITs by minimum TO pay.">Min TO: ' +
  133. '<input id="min_to" style="width: 50px;" type="number" step="0.1" min="0" max="5" value="' + config.mto + '">' +
  134. '</label>' +
  135.  
  136. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Search for this many HITs.">Size: ' +
  137. '<input id="size" style="width: 50px;" type="number" step="1" min="1" max="100" value="' + config.size + '">' +
  138. '</label>' +
  139.  
  140. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Sort HITs by (Latest / Most Available / Highest Reward)">Sort by: ' +
  141. '<select id="type" value="' + config.type + '">' +
  142. '<option value="' + upd + '">Latest</option>' +
  143. '<option value="' + num + '">Most Available</option>' +
  144. '<option value="' + rew + '">Reward (Most)</option>' +
  145. '</select>' +
  146. '</label>' +
  147.  
  148. '<label style="margin-right: 0px; display: inline-block; border-bottom: 1px solid;" title="Only show HITs that you are qualified for.">Qualified' +
  149. '<input id="qual" type="checkbox" ' + (config.qual ? 'checked' : '') + '>' +
  150. '</label>' +
  151. '</div>' +
  152.  
  153. '<div style="margin-bottom: 5px;">' +
  154. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Delay in seconds between desktop notifications and sound alerts for an include list match.">Alert Delay: ' +
  155. '<input id="alert_delay" style="width: 50px;" type="number" step="1" min="0" value="' + config.alert + '">' +
  156. '</label>' +
  157.  
  158. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Make a sound when a new HIT is found.">Sound On New HIT ' +
  159. '<input id="new_sound" type="checkbox" ' + (config.new ? 'checked' : '') + '>' +
  160. '<select id="new_audio" value="' + config.newaudio + '">' +
  161. //'<option value="default">Default</option>' +
  162. '<option value="beep">Beep</option>' +
  163. '<option value="beepbeep">Beep Beep</option>' +
  164. //'<option value="ding">Ding</option>' +
  165. //'<option value="squee">Squee</option>' +
  166. '<option value="click">Click</option>' +
  167. '</select>' +
  168. '</label>' +
  169.  
  170. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Allow inludelist matches to send Pushbullet notifications if enabled for that match.">Pushbullet ' +
  171. '<input id="pb" type="checkbox" ' + (config.pb ? 'checked' : '') + '>' +
  172. '</label>' +
  173.  
  174. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Use turkopticon.">Enable TO ' +
  175. '<input id="to" type="checkbox" ' + (config.to ? 'checked' : '') + '>' +
  176. '</label>' +
  177.  
  178. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Hide all HITs that do not match your include list.">Hide Non Include List ' +
  179. '<input id="nl_hide" type="checkbox" ' + (config.nl ? 'checked' : '') + '>' +
  180. '</label>' +
  181.  
  182. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;" title="Hide HITs that match your block list.">Hide Block List ' +
  183. '<input id="bl_hide" type="checkbox" ' + (config.bl ? 'checked' : '') + '>' +
  184. '</label>' +
  185.  
  186. '<label style="margin-right: 0px; display: inline-block; border-bottom: 1px solid;" title="Hide masters HITs.">Hide Masters ' +
  187. '<input id="m_hide" type="checkbox" ' + (config.m ? 'checked' : '') + '>' +
  188. '</label>' +
  189. '</div>' +
  190.  
  191. '</div>' +
  192.  
  193. // HITs
  194. '<div id="latest_hits">' +
  195. '<div style="border-bottom: 3px solid; margin-bottom: 5px;">' +
  196. '<span style="font-size: 20px; font-weight: bold;">HITs</span>' +
  197. '<span id="hits_data" style="font-size: 11px;"></span>' +
  198. '</div>' +
  199.  
  200. '<div>' +
  201. '<div style="overflow: hidden; white-space: nowrap;">' +
  202. '<div style="float: left; width: calc(100% - 270px);">' +
  203. '<span style="width: 34%; float: left; display:inline-block; overflow: hidden;">Requester</span>' +
  204. '<span style="width: 64%; float: right; display:inline-block; overflow: hidden;">Project</span>' +
  205. '</div>' +
  206. '<div style="float: right;">' +
  207. '<span style="width: 60px; display:inline-block; text-align: center;">Tasks</span>' +
  208. '<span style="width: 60px; display:inline-block; text-align: center;">Accept</span>' +
  209. '<span style="width: 60px; display:inline-block; text-align: center;">TO</span>' +
  210. '<span style="width: 30px; display:inline-block; text-align: center;">M</span>' +
  211. '<span style="width: 60px; display:inline-block; text-align: center;">HIT DB</span>' +
  212. '</div>' +
  213. '</div>' +
  214. '</div>' +
  215. '<div id="new_hits"></div>' +
  216. '</div>' +
  217.  
  218. '<br>' +
  219.  
  220. //Logged HITs
  221. '<div id="logged_hits">' +
  222. '<div style="border-bottom: 3px solid; margin-bottom: 5px;">' +
  223. '<span style="font-size: 20px; font-weight: bold;">Logged HITs</span>' +
  224. '<span id="logged_hits_data" style="font-size: 11px;"></span>' +
  225. '</div>' +
  226.  
  227. '<div>' +
  228. '<div style="overflow: hidden; white-space: nowrap;">' +
  229.  
  230. '<div style="float: left;">' +
  231. '<span style="width: 80px; display:inline-block;">Time</span>' +
  232. '</div>' +
  233.  
  234. '<div style="float: left; width: calc(100% - 290px);">' +
  235. '<span style="width: 34%; float: left; display:inline-block; overflow: hidden;">Requester</span>' +
  236. '<span style="width: 64%; float: right; display:inline-block; overflow: hidden;">Project</span>' +
  237.  
  238. '</div>' +
  239. '<div style="float: right;">' +
  240. '<span style="width: 60px; display:inline-block; text-align: center;">Accept</span>' +
  241. '<span style="width: 60px; display:inline-block; text-align: center;">TO</span>' +
  242. '<span style="width: 30px; display:inline-block; text-align: center;">M</span>' +
  243. '<span style="width: 60px; display:inline-block; text-align: center;">HIT DB</span>' +
  244. '</div>' +
  245. '</div>' +
  246. '</div>' +
  247. '<div id="log_hits"></div>' +
  248. '</div>' +
  249.  
  250. // Block List
  251. '<div id="bl_div" style="z-index: 99; position: fixed; width: 80%; height: 80%; left: 10%; top: 300px; margin-top: -250px; display: none;">' +
  252. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Block List</div>' +
  253. '<div id="bl_items"></div>' +
  254. '<div style="text-align: center;">' +
  255. '<button id="bl_add" style="margin-right: 5px;">Add</button>' +
  256. '<button id="bl_close" style="margin-right: 5px;">Close</button>' +
  257. '<button id="bl_import" style="margin-right: 5px;">Import</button>' +
  258. '<button id="bl_export" style="margin-right: 0px;">Export</button>' +
  259. '</div>' +
  260. '</div>' +
  261.  
  262. // Add Block List Popup
  263. '<div id="bl" class="add" style="z-index: 100; position: fixed; width: 520px; top: 300px; left: 50%; margin: -250px; padding: 5px; text-align: center; display: none;">' +
  264. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Add To Block List</div>' +
  265.  
  266. '<div>' +
  267. '<p><label>Term: </label><input id="bl_term" value=""></p>' +
  268. '<p><label>Name: </label><input id="bl_name" value=""></p>' +
  269. '</div>' +
  270.  
  271. '<div>' +
  272. '<button id="bl_add_save" style="margin-right: 5px;">Save</button>' +
  273. '<button id="bl_add_cancel" style="margin-right: 0px;">Cancel</button>' +
  274. '</div>' +
  275. '</div>' +
  276.  
  277. // Edit Block List Popup
  278. '<div id="edit_bl" class="add" class="add" style="z-index: 100; position: fixed; width: 520px; top: 300px; left: 50%; margin: -250px; padding: 5px; text-align: center; display: none;">' +
  279. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Edit Block List Item</div>' +
  280.  
  281. '<div>' +
  282. '<p><label>Term: </label><input id="edit_bl_term" value=""disabled></p>' +
  283. '<p><label>Name: </label><input id="edit_bl_name" value=""></p>' +
  284. '</div>' +
  285.  
  286. '<div>' +
  287. '<button id="edit_bl_save" style="margin-right: 5px;">Save</button>' +
  288. '<button id="edit_bl_delete" style="margin-right: 5px;">Delete</button>' +
  289. '<button id="edit_bl_cancel" style="margin-right: 0px;">Cancel</button>' +
  290. '</div>' +
  291. '</div>' +
  292.  
  293. // Include List
  294. '<div id="il_div" style="z-index: 99; position: fixed; width: 80%; height: 80%; left: 10%; top: 300px; margin-top: -250px; display: none;">' +
  295. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Include List</div>' +
  296. '<div id="il_items"></div>' +
  297. '<div style="text-align: center;">' +
  298. '<button id="il_add" style="margin-right: 5px;">Add</button>' +
  299. '<button id="il_close" style="margin-right: 5px;">Close</button>' +
  300. '<button id="il_import" style="margin-right: 5px;">Import</button>' +
  301. '<button id="il_export" style="margin-right: 0px;">Export</button>' +
  302. '</div>' +
  303. '</div>' +
  304.  
  305. // Add Include List Popup
  306. '<div id="il" class="add" style="z-index: 100; position: fixed; width: 520px; top: 300px; left: 50%; margin: -250px; padding: 5px; text-align: center; display: none;">' +
  307. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Add To Include List</div>' +
  308.  
  309. '<div>' +
  310. '<p><label>Term: </label><input id="il_term" value=""></p>' +
  311. '<p><label>Name: </label><input id="il_name" value=""></p>' +
  312. '</div>' +
  313.  
  314. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Alerts</div>' +
  315.  
  316. '<p>' +
  317. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Sound: ' +
  318. '<select id="il_sound">' +
  319. '<option value="1">Sound 1</option>' +
  320. '<option value="2">Sound 2</option>' +
  321. '<option value="3">Sound 3</option>' +
  322. '<option value="4">Sound 4</option>' +
  323. '</select>' +
  324. '</label>' +
  325.  
  326. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Desktop Notifications' +
  327. '<input id="il_noti_cb" type="checkbox">' +
  328. '</label>' +
  329.  
  330. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Play Sound' +
  331. '<input id="il_sound_cb" type="checkbox">' +
  332. '</label>' +
  333.  
  334. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Send Pushbullet' +
  335. '<input id="il_push_cb" type="checkbox">' +
  336. '</label>' +
  337. '</p>' +
  338.  
  339. '<div>' +
  340. '<button id="il_add_save" style="margin-right: 5px;">Save</button>' +
  341. '<button id="il_add_cancel" style="margin-right: 0px;">Cancel</button>' +
  342. '</div>' +
  343. '</div>' +
  344.  
  345. // Edit Include List Popup
  346. '<div id="edit_il" class="add" style="z-index: 100; position: fixed; width: 520px; top: 300px; left: 50%; margin: -250px; padding: 5px; text-align: center; display: none;">' +
  347. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Edit Include List Item</div>' +
  348.  
  349. '<div>' +
  350. '<p><label>Term: </label><input id="edit_il_term" value="" disabled></p>' +
  351. '<p><label>Name: </label><input id="edit_il_name" value=""></p>' +
  352. '</div>' +
  353.  
  354. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;"">Alerts</div>' +
  355.  
  356. '<p>' +
  357. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Sound: ' +
  358. '<select id="edit_il_sound">' +
  359. '<option value="1">Sound 1</option>' +
  360. '<option value="2">Sound 2</option>' +
  361. '<option value="3">Sound 3</option>' +
  362. '<option value="4">Sound 4</option>' +
  363. '</select>' +
  364. '</label>' +
  365.  
  366. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Desktop Notifications' +
  367. '<input id="edit_il_noti_cb" type="checkbox">' +
  368. '</label>' +
  369.  
  370. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Play Sound' +
  371. '<input id="edit_il_sound_cb" type="checkbox">' +
  372. '</label>' +
  373.  
  374. '<label style="margin-right: 0px; display: inline-block; border-bottom: 1px solid;">Send Pushbullet' +
  375. '<input id="edit_il_push_cb" type="checkbox">' +
  376. '</label>' +
  377. '</p>' +
  378.  
  379. '<div>' +
  380. '<button id="edit_il_save" style="margin-right: 5px;">Save</button>' +
  381. '<button id="edit_il_delete" style="margin-right: 5px;">Delete</button>' +
  382. '<button id="edit_il_cancel" style="margin-right: 0px;">Cancel</button>' +
  383. '</div>' +
  384. '</div>' +
  385.  
  386. // Advanced Settings
  387. '<div id="sett" class="add" style="z-index: 100; position: fixed; width: 520px; top: 300px; left: 50%; margin: -250px; padding: 5px; text-align: center; display: none;">' +
  388. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Advanced Settings</div>' +
  389.  
  390. '<div>' +
  391. '<p><label>Pushbullet Token: </label><input id="push" value="' + config.push + '"></p>' +
  392. '</div>' +
  393.  
  394. '<div style="position: relative; width: 80%; left: 10%; border-bottom: 3px solid; padding: 2px; text-align: center;">Theme</div>' +
  395.  
  396. '<p>' +
  397. '<label style="margin-right: 5px; display: inline-block; border-bottom: 1px solid;">Theme: ' +
  398. '<select id="adv_theme" value="' + config.theme + '">' +
  399. '<option value="default">Default (Light)</option>' +
  400. '<option value="dark">Dark</option>' +
  401. '<option value="darker">Darker</option>' +
  402. '<option value="custom">Custom</option>' +
  403. '</select>' +
  404. '</label>' +
  405.  
  406. '<label style="margin-right: 0px; display: inline-block; border-bottom: 1px solid;">TO Theme: ' +
  407. '<select id="to_theme" value="' + config.to_theme + '">' +
  408. '<option value="1">Default</option>' +
  409. '<option value="2">Column Only</option>' +
  410. '<option value="3">Text Only</option>' +
  411. '</select>' +
  412. '</label>' +
  413. '</p>' +
  414.  
  415. '<p>' +
  416. '<label style="width: 150px; margin-right: 5px; display: inline-block; border-bottom: 1px solid; text-align: left;">Main: #' +
  417. '<input id="theme_main" style="width: 55px; float: right;" maxlength="6">' +
  418. '</label>' +
  419.  
  420. '<label style="width: 150px; margin-right: 5px; display: inline-block; border-bottom: 1px solid; text-align: left;">Primary: #' +
  421. '<input id="theme_primary" style="width: 55px; float: right;" maxlength="6">' +
  422. '</label>' +
  423.  
  424. '<label style="width: 150px; margin-right: 0px; display: inline-block; border-bottom: 1px solid; text-align: left;">Secondary: #' +
  425. '<input id="theme_secondary" style="width: 55px; float: right;" maxlength="6">' +
  426. '</label>' +
  427. '</p>' +
  428.  
  429. '<p>' +
  430. '<label style="width: 150px; margin-right: 5px; display: inline-block; border-bottom: 1px solid; text-align: left;">Text: #' +
  431. '<input id="theme_text" style="width: 55px; float: right;" maxlength="6">' +
  432. '</label>' +
  433.  
  434. '<label style="width: 150px; margin-right: 5px; display: inline-block; border-bottom: 1px solid; text-align: left;">Link: #' +
  435. '<input id="theme_link" style="width: 55px; float: right;" maxlength="6">' +
  436. '</label>' +
  437.  
  438. '<label style="width: 150px; margin-right: 0px; display: inline-block; border-bottom: 1px solid; text-align: left;">Visited: #' +
  439. '<input id="theme_visited" style="width: 55px; float: right;" maxlength="6">' +
  440. '</label>' +
  441. '</p>' +
  442.  
  443. '<div>' +
  444. '<button id="sett_save" style="margin-right: 5px;">Save</button>' +
  445. '<button id="sett_close" style="margin-right: 0px;">Close</button>' +
  446. '</div>' +
  447. '</div>'
  448. );
  449.  
  450. // Click functions
  451. $('#scan_button').click(function () {
  452. if ($(this).text() === 'Start') {
  453. $(this).text('Stop');
  454. _scan();
  455. }
  456. else {
  457. $(this).text('Start');
  458. }
  459. });
  460.  
  461. $('#sett_button').click(function () {
  462. $('#sett').toggle();
  463. });
  464.  
  465. $('#conf_button').click(function () {
  466. if ($(this).text() === 'Hide Config') {
  467. $(this).text('Show Config');
  468. }
  469. else {
  470. $(this).text('Hide Config');
  471. }
  472. $('#config').toggleClass('hidden');
  473. });
  474.  
  475. $('#logg_button').click(function () {
  476. if ($(this).text() === 'Hide Logged HITs') {
  477. $(this).text('Show Logged HITs');
  478. $('#logged_hits').hide();
  479. }
  480. else {
  481. $(this).text('Hide Logged HITs');
  482. $('#logged_hits').show();
  483. }
  484. });
  485.  
  486. $('#bloc_button').click(function () {
  487. $('#bl_div').toggle();
  488. });
  489.  
  490. $('#bl_add').click(function () {
  491. $('#bl').show();
  492. });
  493.  
  494. $('#bl_close').click(function () {
  495. $('#bl_div').hide();
  496. });
  497.  
  498. $('#bl_import').click(function () {
  499. _import_block();
  500. });
  501.  
  502. $('#bl_export').click(function () {
  503. _export_block();
  504. });
  505.  
  506. $('#bl_add_save').click(function () {
  507. var obj = {
  508. term : $('#bl_term').val(),
  509. name : $('#bl_name').val() === '' ? $('#bl_term').val() : $('#bl_name').val()
  510. };
  511.  
  512. _add_block(obj);
  513.  
  514. $('#bl_term, #bl_name').val('');
  515. $('#bl').hide();
  516. });
  517.  
  518. $('#bl_add_cancel').click(function () {
  519. $('#bl_term, #bl_name').val('');
  520. $('#bl').hide();
  521. });
  522.  
  523. $('#edit_bl_save').click(function () {
  524. _update_block($(this).val());
  525. $('#edit_bl_term, #edit_bl_name').val('');
  526. $('#edit_bl').hide();
  527. });
  528.  
  529. $('#edit_bl_delete').click(function () {
  530. _delete_block($(this).val());
  531. $('#edit_bl_term, #edit_bl_name').val('');
  532. $('#edit_bl').hide();
  533. });
  534.  
  535. $('#edit_bl_cancel').click(function () {
  536. $('#edit_bl_term, #edit_bl_name').val('');
  537. $('#edit_bl').hide();
  538. });
  539.  
  540. $('#incl_button').click(function () {
  541. $('#il_div').toggle();
  542. });
  543.  
  544. $('#il_add').click(function () {
  545. $('#il').show();
  546. });
  547.  
  548. $('#il_close').click(function () {
  549. $('#il_div').hide();
  550. });
  551.  
  552. $('#il_import').click(function () {
  553. _import_include();
  554. });
  555.  
  556. $('#il_export').click(function () {
  557. _export_include();
  558. });
  559.  
  560. $('#il_add_save').click(function () {
  561. var obj = {
  562. term : $('#il_term').val().trim(),
  563. name : $('#il_name').val().trim() === '' ? $('#il_term').val().trim() : $('#il_name').val().trim(),
  564. sound : $('#il_sound').val(),
  565. noti_cb : $('#il_noti_cb').prop('checked'),
  566. sound_cb : $('#il_sound_cb').prop('checked'),
  567. push_cb : $('#il_push_cb').prop('checked')
  568. };
  569.  
  570. _add_include(obj);
  571.  
  572. $('#il_term, #il_name').val('');
  573. $('#il').hide();
  574. });
  575.  
  576. $('#il_add_cancel').click(function () {
  577. $('#il_term, #il_name').val('');
  578. $('#il').hide();
  579. });
  580.  
  581. $('#edit_il_save').click(function () {
  582. _update_include($(this).val());
  583. $('#edit_il_term, #edit_il_name, #edit_il_sound').val('');
  584. $('#edit_il_noti_cb, #edit_il_sound_cb, #edit_il_push_cb').prop('checked', false);
  585. $('#edit_il').hide();
  586. });
  587.  
  588. $('#edit_il_delete').click(function () {
  589. _delete_include($(this).val());
  590. $('#edit_il_term, #edit_il_name, #edit_il_sound').val('');
  591. $('#edit_il_noti_cb, #edit_il_sound_cb, #edit_il_push_cb').prop('checked', false);
  592. $('#edit_il').hide();
  593. });
  594.  
  595. $('#edit_il_cancel').click(function () {
  596. $('#edit_il_term, #edit_il_name, #edit_il_sound').val('');
  597. $('#edit_il_noti_cb, #edit_il_sound_cb, #edit_il_push_cb').prop('checked', false);
  598. $('#edit_il').hide();
  599. });
  600.  
  601. $('.on, .off').click(function () {
  602. $(this).toggleClass('on off');
  603. _save();
  604. });
  605.  
  606. $('#sett_save').click(function () {
  607. _save('custom');
  608. _theme();
  609. });
  610.  
  611. $('#sett_close').click(function () {
  612. $('#sett').hide();
  613. });
  614.  
  615. $('#time').click(function () {
  616. $('.new').removeClass('new');
  617. });
  618.  
  619. // Delegated click functions
  620. $('body').on('click', '.blockit', function () {
  621. _edit_block($(this).val());
  622. });
  623.  
  624. $('body').on('click', '.includeit', function () {
  625. _edit_include($(this).val());
  626. });
  627.  
  628. $('body').on('click', '.rt', function () {
  629. _block($(this).data('term'), $(this).data('name'));
  630. });
  631.  
  632. $('body').on('click', '.vb', function () {
  633. _export_vb($(this).val());
  634. });
  635.  
  636. $('body').on('click', '.irc', function () {
  637. _export_irc($(this).val());
  638. });
  639.  
  640. $('body').on('click', '.details', function () {
  641. $(this).toggleClass('fa-plus-circle fa-minus-circle');
  642. $('.info[value="' + $(this).val() + '"]').toggle();
  643. });
  644.  
  645. // Delegated mouseover functions
  646. $('body').on('mouseover', '.new', function () {
  647. $(this).removeClass('new');
  648. });
  649.  
  650. // On change events
  651. $('#new_audio').change(function () {
  652. _save();
  653. _sound('new');
  654. });
  655.  
  656. $('#il_sound').change(function () {
  657. _sound('il');
  658. });
  659.  
  660. $('#edit_il_sound').change(function () {
  661. _sound('il_edit');
  662. });
  663.  
  664. $('#type, #size, #adv_theme, #to_theme, :checkbox').change(function () {
  665. _save();
  666. });
  667.  
  668. $('#adv_theme, #to_theme').change(function () {
  669. _theme();
  670. });
  671.  
  672. // On input events
  673. $('#delay, #min_rew, #min_avail, #min_to, #alert_delay').on('input', function () {
  674. _save();
  675. });
  676.  
  677. function _scan () {
  678. if ($('#scan_button').text() === 'Stop') {
  679. var _url = url + $('#type').val() + $('#size').val() + minrew + $('#min_rew').val() + '&qualifiedFor=' + (config.qual ? 'on' : 'off');
  680.  
  681. var date = new Date(), h = date.getHours(), m = date.getMinutes(), s = date.getSeconds(), ampm = h >= 12 ? 'pm' : 'am';
  682. h = h % 12; h = h ? h : 12; m = m < 10 ? '0' + m : m; s = s < 10 ? '0' + s : s;
  683. var timeis = [h, m, s, ampm];
  684.  
  685. $.get(_url, function (data) {
  686. if (!worker) { _scrape_old(data, timeis); }
  687. else { _scrape_new(data, timeis); }
  688. }).fail(function () {
  689. setTimeout(function () { _scan(); }, 2500);
  690. });
  691. }
  692. }
  693.  
  694. function _scrape_old (data, timeis) {
  695. var keys = [], log_keys = [], to = [], logged_in;
  696.  
  697. var $hits = $(data).find('table[cellpadding="0"][cellspacing="5"][border="0"]').eq(0).children('tbody').children('tr');
  698.  
  699. for (var i = 0; i < $hits.length; i ++) {
  700. var $hit = $hits.eq(i);
  701.  
  702. var req_name, req_id, req_link, con_link, to_link;
  703.  
  704. var req = $hit.find('a[href^="/mturk/searchbar?selectedSearchType=hitgroups&requesterId="]');
  705. if (req.length) {
  706. logged_in = true;
  707. req_name = $hit.find('span.requesterIdentity').text().trim();
  708. req_id = req.prop('href').split('requesterId=')[1];
  709. req_link = 'https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId=' + req_id;
  710. con_link = 'https://www.mturk.com/mturk/contact?requesterId=' + req_id;
  711. to_link = 'https://turkopticon.ucsd.edu/' + req_id;
  712. }
  713. else {
  714. logged_in = false;
  715. req_name = $hit.find('span.requesterIdentity').text().trim();
  716. req_id = $hit.find('span.requesterIdentity').text().trim();
  717. req_link = 'https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&searchWords=' + req_id.replace(/ /g, '+');
  718. con_link = 'https://#';
  719. to_link = 'https://turkopticon.ucsd.edu/main/php_search?field=name&query=' + req_id.replace(/ /g, '+');
  720. }
  721.  
  722. var group_id, prev_link, pand_link;
  723.  
  724. //var prev = $hit.find('a[href^="/mturk/preview?groupId="]');
  725. var prev = $hit.find('a[href*="groupId="]');
  726. if (prev.length) {
  727. //group_id = prev.prop('href').split('groupId=')[1];
  728. group_id = prev.prop('href').split('groupId=')[1].split('&')[0];
  729. //prev_link = 'https://www.mturk.com/mturk/preview?groupId=' + group_id;
  730. //pand_link = 'https://www.mturk.com/mturk/previewandaccept?groupId=' + group_id;
  731. prev_link = `https://worker.mturk.com/projects/${group_id}/tasks?ref=w_pl_prvw`;
  732. pand_link = `https://worker.mturk.com/projects/${group_id}/tasks/accept_random?ref=w_pl_prvw`;
  733. }
  734. else {
  735. group_id = 'na';
  736. prev_link = req_link;
  737. pand_link = req_link;
  738. }
  739.  
  740. var title = $hit.find('a.capsulelink').text();
  741. var desc = $hit.find('td[class="capsule_field_title"]:contains(Description:)').next().text();
  742. var time = $hit.find('td[class="capsule_field_title"]:contains(Time Allotted:)').next().text();
  743. var reward = $hit.find('td[class="capsule_field_title"]:contains(Reward:)').next().text();
  744. var avail = $hit.find('td[class="capsule_field_title"]:contains(HITs Available:)').next().text() || 'N/A';
  745.  
  746. var quals = $hit.find('td[style="padding-right: 2em; white-space: nowrap;"]');
  747. var qualif = 'None';
  748. var masters = 'N';
  749.  
  750. if (quals.length) {
  751. qualif = '';
  752. for (var j = 0; j < quals.length; j ++) {
  753. qualif += quals.eq(j).text().trim().replace(/\s+/g, ' ') + '; ';
  754. }
  755. if (qualif.indexOf('Masters has been granted') !== -1) {
  756. masters = 'Y';
  757. }
  758. }
  759.  
  760. var key = req_id.trim() + title.trim() + reward.trim() + group_id.trim();
  761. keys.push(key);
  762.  
  763. if (!hitlog[key]) {
  764. hitlog[key] = {
  765. reqname : req_name.trim(),
  766. reqid : req_id.trim(),
  767. reqlink : req_link.trim(),
  768. conlink : con_link.trim(),
  769. groupid : group_id.trim(),
  770. prevlink : prev_link.trim(),
  771. pandlink : pand_link.trim(),
  772. title : title.trim(),
  773. desc : desc.trim(),
  774. time : time.trim(),
  775. reward : reward.trim(),
  776. avail : avail.trim(),
  777. quals : qualif.trim(),
  778. masters : masters.trim(),
  779. key : key.trim(),
  780. tolink : to_link.trim(),
  781. to : { comm : 'N/A', fair : 'N/A', fast : 'N/A', pay : 'N/A' },
  782. rcolor : '#F08080',
  783. tcolor : '#F08080'
  784. };
  785. to.push([key, req_id]);
  786. log_keys.push(key);
  787. _color_db(hitlog[key]);
  788. }
  789. else {
  790. hitlog[key].avail = avail.trim();
  791. }
  792. }
  793. if ($hits.length) {
  794. _to(keys, log_keys, logged_in, to, timeis);
  795. }
  796. else {
  797. setTimeout(function () { _scan(); }, 2500);
  798. }
  799. }
  800.  
  801. function _scrape_new (data, timeis) {
  802. var keys = [], log_keys = [], to = [], logged_in = true;
  803.  
  804. var hits = data.results;
  805.  
  806. for (var i = 0; i < hits.length; i ++) {
  807. var hit = hits[i],
  808. req_name = hit.requester_name,
  809. req_id = hit.requester_id,
  810. //req_link = hit.requester_url,
  811. req_link = 'https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId=' + hit.requester_id,
  812. con_link = 'https://www.mturk.com/mturk/contact?requesterId=' + hit.requester_id,
  813. group_id = hit.hit_set_id,
  814. //prev_link = hit.project_tasks_url,
  815. //prev_link = 'https://www.mturk.com/mturk/preview?groupId=' + hit.hit_set_id,
  816. //pand_link = hit.accept_project_task_url,
  817. //pand_link = 'https://www.mturk.com/mturk/previewandaccept?groupId=' + hit.hit_set_id,
  818. prev_link = `https://worker.mturk.com/projects/${group_id}/tasks?ref=w_pl_prvw`,
  819. pand_link = `https://worker.mturk.com/projects/${group_id}/tasks/accept_random?ref=w_pl_prvw`,
  820. title = hit.title,
  821. desc = hit.description,
  822. time = _convert_seconds(hit.assignment_duration_in_seconds),
  823. reward = '$' + hit.monetary_reward.amount_in_dollars.toFixed(2),
  824. avail = hit.assignable_hits_count;
  825.  
  826. var key = req_id + title + reward + group_id;
  827. keys.push(key);
  828.  
  829.  
  830. var qualif = 'None';
  831. var quals = hit.project_requirements;
  832.  
  833. if (quals.length) {
  834. qualif = ''
  835. for (var j = 0; j < quals.length; j ++) {
  836. var q_comp = quals[j].comparator + ' ';
  837. var q_name = quals[j].qualification_type.name + ' ';
  838.  
  839. var q_valu = quals[j].qualification_values;
  840. var q_values = '';
  841. for (var k = 0; k < quals.length; k ++) {
  842. if (quals[j].qualification_values[k]) {
  843. q_values += quals[j].qualification_values[k];
  844. q_values += k === quals.length ? ', ' : '';
  845. }
  846. }
  847. qualif += (q_name + q_comp + q_values).trim() + '; ';
  848. }
  849. }
  850.  
  851. console.log(qualif);
  852.  
  853.  
  854. if (!hitlog[key]) {
  855. hitlog[key] = {
  856. reqname : req_name,
  857. reqid : req_id,
  858. reqlink : req_link,
  859. conlink : con_link,
  860. groupid : group_id,
  861. prevlink : prev_link,
  862. pandlink : pand_link,
  863. title : title,
  864. desc : desc,
  865. time : time,
  866. reward : reward,
  867. avail : avail,
  868. quals : qualif.trim(),
  869. masters : '?',
  870. key : key,
  871. tolink : 'https://turkopticon.ucsd.edu/' + req_id,
  872. to : { comm : 'N/A', fair : 'N/A', fast : 'N/A', pay : 'N/A' },
  873. rcolor : '#F08080',
  874. tcolor : '#F08080'
  875. };
  876. to.push([key, req_id]);
  877. log_keys.push(key);
  878. }
  879. else {
  880. hitlog[key].avail = avail;
  881. }
  882. }
  883. _to(keys, log_keys, logged_in, to, timeis);
  884. }
  885.  
  886. function _to (keys, log_keys, logged_in, to, timeis) {
  887. var ids = [];
  888.  
  889. if (logged_in && to.length && config.to) {
  890. for (var i = 0; i < to.length; i++) {
  891. ids.push(to[i][1]);
  892. }
  893. $.get('https://turkopticon.ucsd.edu/api/multi-attrs.php?ids=' + ids, function (data) {
  894. var to_data = JSON.parse(data);
  895.  
  896. for (i = 0; i < to.length; i++) {
  897. if (!to_data[to[i][1]].length && typeof to_data[to[i][1]].attrs != 'undefined') {
  898. hitlog[to[i][0]].to = to_data[to[i][1]].attrs;
  899. }
  900. }
  901. }).always(function () {
  902. _build(keys, log_keys, timeis);
  903. });
  904. }
  905. else {
  906. _build(keys, log_keys, timeis);
  907. }
  908. }
  909.  
  910. function _build (keys, log_keys, timeis) {
  911. var hit_html = '', log_html = '';
  912.  
  913. for (var i = 0; i < keys.length; i++) {
  914. var hit = hitlog[keys[i]], blocked = _check_block(hit), included = _check_include(hit), classes = _color_to(hit), remove = false;
  915.  
  916. if (hit.masters === 'Y') {
  917. classes += config.m ? ' m_hidden' : ' m';
  918. }
  919.  
  920. if (Number(config.avail) > Number(hit.avail) || Number(config.mto) > Number(hit.to.pay)) {
  921. classes += ' hidden';
  922. remove = true;
  923. }
  924.  
  925. if (blocked) {
  926. classes += config.bl ? ' bl_hidden' : ' bl';
  927. remove = true;
  928. }
  929. if (included) {
  930. classes += ' il';
  931. _included(included, hit);
  932. }
  933. else {
  934. classes += config.nl ? ' nl_hidden' : ' nl';
  935. }
  936.  
  937. hit_html +=
  938. '<div class="cont" style="margin-bottom: 2px;">' +
  939. '<div class="' + classes + ' " style="overflow: hidden; white-space: nowrap; margin-bottom: 2px;">' +
  940.  
  941. '<div style="float: left; width: calc(100% - 270px);">' +
  942.  
  943. '<span style="width: 34%; float: left; display:inline-block; overflow: hidden;">' +
  944. '<button data-term="' + hit.reqid + '" data-name="' + hit.reqname + '" class="rt">R</button>' +
  945. '<button data-term="' + hit.title + '" data-name="' + hit.title + '" class="rt">T</button>' +
  946. '<a href="' + hit.reqlink + '">' + hit.reqname + '</a>' +
  947. '</span>' +
  948.  
  949. '<span style="width: 64%; float: right; display:inline-block; overflow: hidden;">' +
  950. '<button value="' + hit.key + '" class="vb">vB</button>' +
  951. '<button value="' + hit.key + '" class="irc">IRC</button>' +
  952. '<a href="' + hit.prevlink + '">' + hit.title + '</a>' +
  953. '</span>' +
  954.  
  955. '</div>' +
  956.  
  957. '<div style="float: right;">' +
  958.  
  959. '<span style="width: 60px; display:inline-block; text-align: center;">' +
  960. hit.avail +
  961. '</span>' +
  962.  
  963. '<span style="width: 60px; display:inline-block; text-align: center;">' +
  964. '<a href="' + hit.pandlink + '">' + hit.reward + '</a>' +
  965. '</span>' +
  966.  
  967. '<span class="to" style="width: 60px; display:inline-block; text-align: center;">' +
  968. '<a href="' + hit.tolink + '">' + hit.to.pay + '</a>' +
  969. '</span>' +
  970.  
  971. '<span style="width: 30px; display:inline-block; text-align: center;">' +
  972. hit.masters +
  973. '</span>' +
  974.  
  975. '<span style="width: 60px; display:inline-block; text-align: center;">' +
  976. '<button style="width: 20px; height: 20px; color: #000000; background-color: ' + hit.rcolor + '; margin: 1px; border: 1px solid; font-size: 80%; padding: 1px;">R</button>' +
  977. '<button style="width: 20px; height: 20px; color: #000000; background-color: ' + hit.tcolor + '; margin: 1px; border: 1px solid; font-size: 80%; padding: 1px;">T</button>' +
  978. '</span>' +
  979.  
  980. '</div>' +
  981. '</div>' +
  982. '</div>'
  983. ;
  984.  
  985. if (remove) {
  986. var index = log_keys.indexOf(keys[i]);
  987.  
  988. if (index > -1) {
  989. log_keys.splice(index, 1);
  990. }
  991. }
  992. }
  993.  
  994. if (log_keys.length) {
  995. for (var j = 0; j < log_keys.length; j ++) {
  996. var hit_log = hitlog[log_keys[j]], included_log = _check_include(hit_log), classes_log = _color_to(hit_log);
  997.  
  998. if (hit_log.masters === 'Y') {
  999. classes_log += config.m ? ' m_hidden' : ' m';
  1000. }
  1001.  
  1002. if (included_log) {
  1003. classes_log += ' il';
  1004. }
  1005. else {
  1006. classes_log += config.nl ? ' nl_hidden' : ' nl';
  1007. }
  1008.  
  1009. var quals = hit_log.quals.split(';');
  1010. var qualif = '';
  1011.  
  1012. for (var k = 0; k < quals.length; k ++) {
  1013. if (quals[k] !== '') {
  1014. qualif += '<li style="padding: 2px;">' + quals[k] + '</li>';
  1015. }
  1016. }
  1017.  
  1018. log_html +=
  1019. '<div class="cont" style="margin-bottom: 2px;">' +
  1020. '<div class="' + classes_log + '" style="overflow: hidden; white-space: nowrap;">' +
  1021.  
  1022. '<div style="float: left;">' +
  1023. '<span style="width: 80px; display:inline-block;">' +
  1024. '<button class="fa fa-plus-circle fa-2 details" aria-hidden="true" value="' + hit_log.key + '" style="background-color: transparent; border: 0px; padding: 1px;"></button>' +
  1025. timeis[0] + ':' + timeis[1] + timeis[3] + '</span>' +
  1026. '</div>' +
  1027.  
  1028. '<div style="float: left; width: calc(100% - 290px);">' +
  1029.  
  1030. '<span style="width: 34%; float: left; display:inline-block; overflow: hidden;">' +
  1031. '<button data-term="' + hit_log.reqid + '" data-name="' + hit_log.reqname + '" class="rt">R</button>' +
  1032. '<button data-term="' + hit_log.title + '" data-name="' + hit_log.title + '" class="rt">T</button>' +
  1033. '<a href="' + hit_log.reqlink + '">' + hit_log.reqname + '</a>' +
  1034. '</span>' +
  1035.  
  1036. '<span style="width: 64%; float: right; display:inline-block; overflow: hidden;">' +
  1037. '<button value="' + hit_log.key + '" class="vb">vB</button>' +
  1038. '<button value="' + hit_log.key + '" class="irc">IRC</button>' +
  1039. '<a href="' + hit_log.prevlink + '">' + hit_log.title + '</a>' +
  1040. '</span>' +
  1041.  
  1042. '</div>' +
  1043.  
  1044. '<div style="float: right;">' +
  1045.  
  1046. '<span style="width: 60px; display: inline-block; text-align: center;">' +
  1047. '<a href="' + hit_log.pandlink + '">' + hit_log.reward + '</a>' +
  1048. '</span>' +
  1049.  
  1050. '<span class="to" style="width: 60px; display:inline-block; text-align: center;">' +
  1051. '<a href="' + hit_log.tolink + '">' + hit_log.to.pay + '</a>' +
  1052. '</span>' +
  1053.  
  1054. '<span style="width: 30px; display:inline-block; text-align: center;">' +
  1055. hit_log.masters +
  1056. '</span>' +
  1057.  
  1058. '<span style="width: 60px; display:inline-block; text-align: center;">' +
  1059. '<button style="width: 20px; height: 20px; color: #000000; background-color: ' + hit_log.rcolor + '; margin: 1px; border: 1px solid; font-size: 80%; padding: 1px;">R</button>' +
  1060. '<button style="width: 20px; height: 20px; color: #000000; background-color: ' + hit_log.tcolor + '; margin: 1px; border: 1px solid; font-size: 80%; padding: 1px;">T</button>' +
  1061. '</span>' +
  1062.  
  1063. '</div>' +
  1064. '</div>'+
  1065.  
  1066. '<div class="info ' + _color_to(hit_log) + '" value="' + hit_log.key + '" style="overflow: hidden; display: none; font-size: 11px;">' +
  1067.  
  1068. '<div style="border-bottom: 1px solid #000000;"></div>' +
  1069.  
  1070. '<span style="width: 33%; float: left; display:inline-block; padding: 5px;">' +
  1071. '<span style="text-decoration: underline;">Description</span>' +
  1072. '<div style="padding: 2px;">' + hit_log.desc +'</div>' +
  1073. '<span style="text-decoration: underline;">Time</span>' +
  1074. '<div style="padding: 2px;">' + hit_log.time +'</div>' +
  1075. '</span>' +
  1076.  
  1077. '<span style="width: 33%; float: left; display:inline-block; padding: 5px;">' +
  1078. '<span style="text-decoration: underline;">Qualifications</span>' +
  1079. qualif +
  1080. '</span>' +
  1081.  
  1082. '<span style="width: calc(34% - 30px); float: right; display:inline-block; padding: 5px;">' +
  1083. '<span style="text-decoration: underline;">Turkopticon</span>' +
  1084. '<br>' +
  1085. '<span style="width: 70px; display:inline-block; padding: 2px;">Pay : ' + hit_log.to.pay +'</span>' +
  1086. '<span style="width: 70px; display:inline-block; padding: 2px;">Fair : ' + hit_log.to.fair +'</span>' +
  1087. '<br>' +
  1088. '<span style="width: 70px; display:inline-block; padding: 2px;">Comm : ' + hit_log.to.comm +'</span>' +
  1089. '<span style="width: 70px; display:inline-block; padding: 2px;">Fast : ' + hit_log.to.fast +'</span>' +
  1090. '</span>' +
  1091.  
  1092. '</div>' +
  1093. '</div>';
  1094.  
  1095. logged ++;
  1096. }
  1097. if (config.new) {
  1098. _sound('new');
  1099. }
  1100. }
  1101. $('#new_hits').html(hit_html);
  1102. $('#log_hits').prepend(log_html);
  1103.  
  1104. searches ++;
  1105. var hits_data = '<span> ' + timeis[0] + ':' + timeis[1] + ':' + timeis[2] + timeis[3] + ' Scanned HITs: ' + keys.length + '</span><span style="float: right;">' + searches + '</span>';
  1106. var logged_hits_data = '<span style="float: right;">' + logged + '</span>';
  1107.  
  1108. $('#hits_data').html(hits_data);
  1109. $('#logged_hits_data').html(logged_hits_data);
  1110.  
  1111. if ($('#scan_button').text() === 'Stop') {
  1112. setTimeout(function () {
  1113. _scan();
  1114. }, $('#delay').val() * 1000);
  1115. }
  1116. }
  1117.  
  1118. function _sound (sound) {
  1119. if (sound === 'new') { $('#audio_' + config.newaudio) [0].play(); }
  1120. if (sound === 'include') { $('#audio_' + config.newaudio) [0].play(); }
  1121. if (sound === 'il') { $('#audio_' + $('#il_sound').val()) [0].play(); }
  1122. if (sound === 'il_edit') { $('#audio_' + $('#edit_il_sound').val()) [0].play(); }
  1123. }
  1124.  
  1125. function _check_block (hit) {
  1126. for (var key in blocklist) {
  1127. var obj = blocklist[key];
  1128. if (obj.term.toLowerCase() === hit.reqname.toLowerCase() || obj.term.toLowerCase() === hit.title.toLowerCase() || obj.term.toLowerCase() === hit.reqid.toLowerCase() || obj.term.toLowerCase() === hit.groupid.toLowerCase()) {
  1129. return obj;
  1130. }
  1131. }
  1132. }
  1133.  
  1134. function _check_include (hit) {
  1135. for (var key in includelist) {
  1136. var obj = includelist[key];
  1137. if (obj.term.toLowerCase() === hit.reqname.toLowerCase() || obj.term.toLowerCase() === hit.title.toLowerCase() || obj.term.toLowerCase() === hit.reqid.toLowerCase() || obj.term.toLowerCase() === hit.groupid.toLowerCase()) {
  1138. return obj;
  1139. }
  1140. }
  1141. }
  1142.  
  1143. function _included (obj, hit) {
  1144. var check = noti_delay.indexOf(hit.key) !== -1;
  1145. var pushcheck = push_delay.indexOf(hit.key) !== -1;
  1146.  
  1147. if (!check) {
  1148. noti_delay.unshift(hit.key);
  1149. setTimeout(function () { noti_delay.pop(); }, config.alert * 1000);
  1150. }
  1151. if (obj.noti_cb && !check) {
  1152. Notification.requestPermission();
  1153. var n = new Notification(hit.reqname + ' | ' + hit.reward, {
  1154. icon : 'http://kadauchi.com/avatar4.jpg',
  1155. body : hit.title,
  1156. });
  1157. setTimeout(n.close.bind(n), 5000);
  1158.  
  1159. n.onclick = function(e) {
  1160. e.preventDefault();
  1161. window.open(hit.prevlink, '_blank');
  1162. };
  1163.  
  1164. }
  1165. if (obj.sound_cb && !check) {
  1166. $('#audio_' + obj.sound)[0].play();
  1167. }
  1168. if (obj.push_cb && !pushcheck && config.pb) {
  1169. push_delay.unshift(hit.key);
  1170. setTimeout(function () { push_delay.pop(); }, 900000);
  1171.  
  1172. var push = {};
  1173.  
  1174. push['type'] = 'note';
  1175. push['title'] = 'HIT Finder';
  1176. push['body'] = '[' + hit.reqname + ']\n[' + hit.title + ']\n[' + hit.reward + ']\n[' + hit.prevlink + ']';
  1177.  
  1178. $.ajax({
  1179. type : 'POST',
  1180. headers : {'Authorization': 'Bearer ' + config.push},
  1181. url : 'https://api.pushbullet.com/v2/pushes',
  1182. data : push
  1183. });
  1184.  
  1185. }
  1186. }
  1187.  
  1188. function _color_to (hit) {
  1189. var to = hit.to.pay;
  1190. if (to > 4) { return 'toHigh'; }
  1191. else if (to > 3) { return 'toGood'; }
  1192. else if (to > 2) { return 'toAverage'; }
  1193. else if (to > 1) { return 'toLow'; }
  1194. else if (to > 0) { return 'toPoor'; }
  1195. else { return 'toNone'; }
  1196. }
  1197.  
  1198. function _color_db (hit) {
  1199. if (hitdb.db && hitdb.db.objectStoreNames.contains('HIT')) {
  1200. hitdb.db.transaction('HIT', 'readonly').objectStore('HIT').index('title').get(hit.title).onsuccess = function (e) {
  1201. if (e.target.result) {
  1202. hitlog[hit.key].tcolor = '#90EE90';
  1203. }
  1204. };
  1205. hitdb.db.transaction('HIT', 'readonly').objectStore('HIT').index('requesterId').get(hit.reqid).onsuccess = function (e) {
  1206. if (e.target.result) {
  1207. hitlog[hit.key].rcolor = '#90EE90';
  1208. }
  1209. };
  1210. }
  1211. }
  1212.  
  1213. function _convert_seconds (seconds) {
  1214. seconds = Number(seconds);
  1215. var h = Math.floor(seconds / 3600);
  1216. var m = Math.floor(seconds % 3600 / 60);
  1217. var s = Math.floor(seconds % 3600 % 60);
  1218. var time = '';
  1219. if (h > 0) { time += h + ' hour(s) '; }
  1220. if (m > 0) { time += m + ' minutes(s) '; }
  1221. if (s > 0) { time += s + ' seconds(s)'; }
  1222. return time;
  1223. }
  1224.  
  1225. function _block (term, name) {
  1226. $('#bl_term') .val(term);
  1227. $('#bl_name') .val(name);
  1228. $('#bl') .show();
  1229. }
  1230.  
  1231. function _add_block (obj) {
  1232. if (!blocklist[obj.term]) {
  1233. blocklist[obj.term] = obj;
  1234. _init_lists();
  1235. }
  1236. }
  1237.  
  1238. function _edit_block (term) {
  1239. var obj = blocklist[term];
  1240. $('#edit_bl_term') .val(obj.term) .text(obj.term);
  1241. $('#edit_bl_name') .val(obj.name);
  1242. $('#edit_bl_save') .val(obj.term);
  1243. $('#edit_bl_delete') .val(obj.term);
  1244. $('#edit_bl') .show();
  1245. }
  1246.  
  1247. function _update_block (block) {
  1248. var obj = blocklist[block];
  1249. obj.name = $('#edit_bl_name').val();
  1250. _init_lists();
  1251. }
  1252.  
  1253. function _delete_block (block) {
  1254. delete blocklist[block];
  1255. _init_lists();
  1256. }
  1257.  
  1258. function _add_include (obj) {
  1259. if (!includelist[obj.term]) {
  1260. includelist[obj.term] = obj;
  1261. _init_lists();
  1262. }
  1263. }
  1264.  
  1265. function _edit_include (term) {
  1266. var obj = includelist[term];
  1267.  
  1268. $('#edit_il_term') .val(obj.term) .text(obj.term);
  1269. $('#edit_il_name') .val(obj.name);
  1270. $('#edit_il_sound') .val(obj.sound);
  1271.  
  1272. $('#edit_il_noti_cb') .prop('checked', obj.noti_cb);
  1273. $('#edit_il_sound_cb') .prop('checked', obj.sound_cb);
  1274. $('#edit_il_push_cb') .prop('checked', obj.push_cb);
  1275.  
  1276. $('#edit_il_save') .val(obj.term);
  1277. $('#edit_il_delete') .val(obj.term);
  1278.  
  1279. $('#edit_il').show();
  1280. }
  1281.  
  1282. function _update_include (term) {
  1283. var obj = includelist[term];
  1284. obj.name = $('#edit_il_name') .val().trim();
  1285. obj.sound = $('#edit_il_sound') .val().trim();
  1286. obj.noti_cb = $('#edit_il_noti_cb') .prop('checked');
  1287. obj.sound_cb = $('#edit_il_sound_cb') .prop('checked');
  1288. obj.push_cb = $('#edit_il_push_cb') .prop('checked');
  1289. _init_lists();
  1290. }
  1291.  
  1292. function _delete_include (term) {
  1293. delete includelist[term];
  1294. _init_lists();
  1295. }
  1296.  
  1297. function _init_lists () {
  1298. var bl_sort = [], il_sort = [], bl_html = '', il_html = '';
  1299.  
  1300. for (var bl_key in blocklist) {
  1301. bl_sort.push([bl_key, blocklist[bl_key].name]);
  1302. }
  1303.  
  1304. bl_sort.sort(function (a, b) {
  1305. if (a[1].toLowerCase() < b[1].toLowerCase()) return -1;
  1306. if (a[1].toLowerCase() > b[1].toLowerCase()) return 1;
  1307. return 0;
  1308. });
  1309.  
  1310. for (var i = 0; i < bl_sort.length; i ++) {
  1311. var bl_obj = blocklist[bl_sort[i][0]];
  1312. bl_html += '<button class="blockit" style="margin: 2px;" value="' + bl_obj.term + '" title="' + bl_obj.term + '">' + bl_obj.name + '</button>';
  1313. }
  1314.  
  1315. for (var il_key in includelist) {
  1316. il_sort.push([il_key, includelist[il_key].name]);
  1317. }
  1318.  
  1319. il_sort.sort(function (a, b) {
  1320. if (a[1].toLowerCase() < b[1].toLowerCase()) return -1;
  1321. if (a[1].toLowerCase() > b[1].toLowerCase()) return 1;
  1322. return 0;
  1323. });
  1324.  
  1325. for (var j = 0; j < il_sort.length; j ++) {
  1326. var il_obj = includelist[il_sort[j][0]];
  1327. il_html += '<button class="includeit" style="margin: 2px;" value="' + il_obj.term + '" title="' + il_obj.term + '">' + il_obj.name + '</button>';
  1328. }
  1329.  
  1330. $('#bl_items') .html(bl_html);
  1331. $('#il_items') .html(il_html);
  1332. _save('init');
  1333. }
  1334.  
  1335. function _import_block () {
  1336. var import_bl = prompt(
  1337. 'Block List Import\n\n' +
  1338. 'You can import from HIT Finder or HIT Scraper.\n\n' +
  1339. 'This will not delete your current block list, only add to it.\n\n' +
  1340. 'Please enter your block list here.',
  1341. ''
  1342. );
  1343.  
  1344. if (import_bl) {
  1345. var json = _json_validator(import_bl);
  1346.  
  1347. if (json) {
  1348. var _bl_obj = JSON.parse(import_bl);
  1349. for (var key in _bl_obj) {
  1350. if (_bl_obj[key].hasOwnProperty('term') && _bl_obj[key].hasOwnProperty('name') && !_bl_obj[key].hasOwnProperty('sound')) {
  1351. if (!blocklist[key]) {
  1352. blocklist[key] = {
  1353. term : _bl_obj[key].term,
  1354. name : _bl_obj[key].name
  1355. };
  1356. }
  1357. }
  1358. else {
  1359. alert('An error occured while importing.\n\n Please check if you have a valid import and try again.');
  1360. break;
  1361. }
  1362. }
  1363. _init_lists();
  1364. }
  1365. else if (import_bl.match(/^/)) {
  1366. var _bl_arr = import_bl.trim().split('^');
  1367. for (var i = 0; i < _bl_arr.length; i ++) {
  1368. if (!blocklist[_bl_arr[i]]) {
  1369. blocklist[_bl_arr[i]] = {
  1370. term : _bl_arr[i],
  1371. name : _bl_arr[i]
  1372. };
  1373. }
  1374. }
  1375. _init_lists();
  1376. }
  1377. }
  1378. else {
  1379. alert('An error occured while importing.\n\n Please check if you have a valid import and try again.');
  1380. }
  1381. }
  1382.  
  1383. function _export_block () {
  1384. GM_setClipboard(localStorage.getItem('_finder_bl'));
  1385. alert('Your block list has been copied to your clipboard.');
  1386. }
  1387.  
  1388. function _import_include () {
  1389. var import_il = prompt(
  1390. 'Include List Import\n\n' +
  1391. 'You can import from HIT Finder or HIT Scraper.\n\n' +
  1392. 'This will not delete your current include list, only add to it.\n\n' +
  1393. 'Please enter your include list here.',
  1394. ''
  1395. );
  1396.  
  1397. if (import_il) {
  1398. var json = _json_validator(import_il);
  1399.  
  1400. if (json) {
  1401. var _il_obj = JSON.parse(import_il);
  1402.  
  1403. for (var key in _il_obj) {
  1404. if (_il_obj[key].hasOwnProperty('term') && _il_obj[key].hasOwnProperty('name') && _il_obj[key].hasOwnProperty('sound')) {
  1405. if (!includelist[key]) {
  1406. includelist[key] = {
  1407. term : _il_obj[key].term,
  1408. name : _il_obj[key].name,
  1409. sound : _il_obj[key].sound,
  1410. noti_cb : _il_obj[key].noti_cb,
  1411. sound_cb : _il_obj[key].sound_cb,
  1412. push_cb : _il_obj[key].push_cb
  1413. };
  1414. }
  1415. }
  1416. else {
  1417. alert('An error occured while importing.\n\n Please check that you have a valid import and try again.');
  1418. break;
  1419. }
  1420. }
  1421. _init_lists();
  1422. }
  1423. else if (import_il.match(/^/)) {
  1424. var _il_arr = import_il.split('^');
  1425.  
  1426. for (var i = 0; i < _il_arr.length; i ++) {
  1427. if (!includelist[_il_arr[i]]) {
  1428. includelist[_il_arr[i]] = {
  1429. term : _il_arr[i],
  1430. name : _il_arr[i],
  1431. sound : '1',
  1432. noti_cb : true,
  1433. sound_cb : true,
  1434. push_cb : false
  1435. };
  1436. }
  1437. }
  1438. _init_lists();
  1439. }
  1440. }
  1441. else {
  1442. alert('An error occured while importing.\n\n Please check that you have a valid import and try again.');
  1443. }
  1444. }
  1445.  
  1446. function _export_include () {
  1447. GM_setClipboard(localStorage.getItem('_finder_il'));
  1448. alert('Your include list has been copied to your clipboard.');
  1449. }
  1450.  
  1451. function _export_vb (key) {
  1452. var hit = hitlog[key];
  1453.  
  1454. var pay = hit.to.pay, _pay = '#B30000';
  1455. if (pay > 3.99) { _pay = '#00B300'; }
  1456. else if (pay > 2.99) { _pay = '#B3B300'; }
  1457. else if (pay > 1.99) { _pay = '#B37400'; }
  1458.  
  1459. var fair = hit.to.fair, _fair = '#B30000';
  1460. if (fair > 3.99) { _fair = '#00B300'; }
  1461. else if (fair > 2.99) { _fair = '#B3B300'; }
  1462. else if (fair > 1.99) { _fair = '#B37400'; }
  1463.  
  1464. var comm = hit.to.comm, _comm = '#B30000';
  1465. if (comm > 3.99) { _comm = '#00B300'; }
  1466. else if (comm > 2.99) { _comm = '#B3B300'; }
  1467. else if (comm > 1.99) { _comm = '#B37400'; }
  1468.  
  1469. var fast = hit.to.fast, _fast = '#B30000';
  1470. if (fast > 3.99) { _fast = '#00B300'; }
  1471. else if (fast > 2.99) { _fast = '#B3B300'; }
  1472. else if (fast > 1.99) { _fast = '#B37400'; }
  1473.  
  1474. var exportcode = '[table][tr][td]'+
  1475. '[b]Title:[/b] [URL=' + hit.prevlink + ']' + hit.title + '[/URL] | [URL=' + hit.pandlink + ']PANDA[/URL]\n' +
  1476. '[b]Requester:[/b] [URL=' + hit.reqlink + ']' + hit.reqname + '[/URL] [' + hit.reqid + '] ([URL=' + hit.conlink + ']Contact[/URL])\n' +
  1477. '([URL='+hit.tolink+']TO[/URL]):'+
  1478. '[b] \[Pay: [COLOR=' + _pay + ']' + pay + '[/COLOR]\][/b]'+
  1479. '[b] \[Fair: [COLOR=' + _fair + ']' + fair + '[/COLOR]\][/b]' +
  1480. '[b] \[Comm: [COLOR=' + _comm +']' + comm + '[/COLOR]\][/b]' +
  1481. '[b] \[Fast: [COLOR=' + _fast + ']' + fast + '[/COLOR]\][/b]\n' +
  1482. '[b]Description:[/b] ' + hit.desc + '\n' +
  1483. '[b]Time:[/b] ' + hit.time + '\n' +
  1484. '[b]HITs Available:[/b] ' + hit.avail + '\n' +
  1485. '[b]Reward:[/b] [COLOR=green][b] ' + hit.reward + '[/b][/COLOR]\n' +
  1486. '[b]Qualifications:[/b] ' + hit.quals + '\n' +
  1487. '[/td][/tr][/table]';
  1488.  
  1489. GM_setClipboard(exportcode);
  1490. alert('Forum export has been copied to your clipboard.');
  1491. }
  1492.  
  1493. function _export_irc (key) {
  1494. var hit = hitlog[key];
  1495.  
  1496. $.get('https://ns4t.net/yourls-api.php?action=bulkshortener&title=MTurk&signature=39f6cf4959&urls[]=' + hit.prevlink + '&urls[]=' + hit.pandlink, function (data) {
  1497. var urls = data.split(';'),
  1498. preview = urls[0],
  1499. panda = urls[1];
  1500.  
  1501. var exportcode = hit.masters === 'Y' ? 'MASTERS ■ Req: ' + hit.reqname + ' ■ Title: ' + hit.title + ' ■ Reward: ' + hit.reward : 'Req: ' + hit.reqname + ' ■ Title: ' + hit.title + ' ■ Reward: ' + hit.reward;
  1502. exportcode += preview !== panda ? ' ■ Prev: ' + preview + ' ■ PandA: '+ panda : ' ■ Search: ' + preview;
  1503. exportcode += ' ■ TO: (Pay: ' + hit.to.pay + ') (Fair: ' + hit.to.fair + ') (Comm: ' + hit.to.comm + ') (Fast: ' + hit.to.fast + ')';
  1504.  
  1505. GM_setClipboard(exportcode);
  1506. alert('IRC export has been copied to your clipboard.');
  1507.  
  1508. }).fail(function () {
  1509. alert('Failed to shorten links.');
  1510. });
  1511. }
  1512.  
  1513. function _json_validator (data) {
  1514. try {
  1515. JSON.parse(data);
  1516. return true;
  1517. }
  1518. catch (e) {
  1519. return false;
  1520. }
  1521. }
  1522.  
  1523. function _save (type) {
  1524. if (type !== 'init' && type !== 'custom') {
  1525. config.delay = $('#delay') .val();
  1526. config.rew = $('#min_rew') .val();
  1527. config.avail = $('#min_avail') .val();
  1528. config.mto = $('#min_to') .val();
  1529. config.alert = $('#alert_delay') .val();
  1530. config.type = $('#type') .val();
  1531. config.size = $('#size') .val();
  1532. config.newaudio = $('#new_audio') .val();
  1533. config.theme = $('#adv_theme') .val();
  1534. config.to_theme = $('#to_theme') .val();
  1535.  
  1536. config.new = $('#new_sound') .prop('checked');
  1537. config.pb = $('#pb') .prop('checked');
  1538. config.to = $('#to') .prop('checked');
  1539. config.qual = $('#qual') .prop('checked');
  1540. config.nl = $('#nl_hide') .prop('checked');
  1541. config.bl = $('#bl_hide') .prop('checked');
  1542. config.m = $('#m_hide') .prop('checked');
  1543. console.log($('#push').val());
  1544.  
  1545. }
  1546. if (type === 'custom' && $('#adv_theme').val() === 'custom') {
  1547. config.custom = {
  1548. main : $('#theme_main') .val(),
  1549. primary : $('#theme_primary') .val(),
  1550. secondary : $('#theme_secondary') .val(),
  1551. text : $('#theme_text') .val(),
  1552. link : $('#theme_link') .val(),
  1553. visited : $('#theme_visited') .val(),
  1554. prop : false
  1555. };
  1556. themes.custom = config.custom;
  1557. }
  1558. config.push = $('#push').val();
  1559.  
  1560. localStorage.setItem('_finder', JSON.stringify(config));
  1561. localStorage.setItem('_finder_bl', JSON.stringify(blocklist));
  1562. localStorage.setItem('_finder_il', JSON.stringify(includelist));
  1563.  
  1564. if (config.nl) { $('.nl').toggleClass('nl nl_hidden'); }
  1565. else { $('.nl_hidden').toggleClass('nl nl_hidden'); }
  1566.  
  1567. if (config.bl) { $('.bl').toggleClass('bl bl_hidden'); }
  1568. else { $('.bl_hidden').toggleClass('bl bl_hidden'); }
  1569.  
  1570. if (config.m) { $('.m').toggleClass('m m_hidden'); }
  1571. else { $('.m_hidden').toggleClass('m m_hidden'); }
  1572. }
  1573.  
  1574. function _theme () {
  1575. var theme = themes[config.theme];
  1576.  
  1577. $('#theme_main') .val(theme.main) .prop('disabled', theme.prop);
  1578. $('#theme_primary') .val(theme.primary) .prop('disabled', theme.prop);
  1579. $('#theme_secondary') .val(theme.secondary) .prop('disabled', theme.prop);
  1580. $('#theme_text') .val(theme.text) .prop('disabled', theme.prop);
  1581. $('#theme_link') .val(theme.link) .prop('disabled', theme.prop);
  1582. $('#theme_visited') .val(theme.visited) .prop('disabled', theme.prop);
  1583. _write_theme();
  1584. }
  1585.  
  1586. function _write_theme () {
  1587. var css = _to_theme(), theme = themes[config.theme];
  1588.  
  1589. css +=
  1590. 'html {color: #' + theme.text + '; background-color: #' + theme.main + '; line-height: 1.5; font-family: "Roboto", sans-serif; font-size: 15px; font-weight: normal;}' +
  1591.  
  1592. '#bl_items, #il_items {background-color: #'+theme.main+'; height: calc(100% - 64px); overflow-y: scroll;}' +
  1593. '#bl_div, #il_div {background-color: #'+theme.primary+'; border: 2px solid #'+theme.secondary+';}' +
  1594.  
  1595. '.add {background-color: #'+theme.primary+'; border: 2px solid #'+theme.secondary+';}' +
  1596.  
  1597. '.bl {border: 2px solid #FF0000;}' +
  1598. '.il {border: 2px solid #009900;}' +
  1599. '.hidden, .nl_hidden, .bl_hidden, .m_hidden {display: none;}' +
  1600.  
  1601. 'button:focus {outline: none !important;}';
  1602. $('#css').html(css);
  1603. }
  1604.  
  1605. function _to_theme () {
  1606. var to, theme = themes[config.theme], color = '';
  1607.  
  1608. if (config.theme === 'default') {
  1609. color = 'd9d9d9';
  1610. }
  1611. else {
  1612. color = '262626';
  1613. }
  1614.  
  1615. switch (config.to_theme) {
  1616. case '1':
  1617. to =
  1618. 'td {font-weight: bold;}' +
  1619. '.cont, .hit, .details {color: #000000;}' +
  1620. '.toHigh {background-color: #33cc59;}' +
  1621. '.toGood {background-color: #a6cc33;}' +
  1622. '.toAverage {background-color: #cccc33;}' +
  1623. '.toLow {background-color: #cca633;}' +
  1624. '.toPoor {background-color: #cc3333;}' +
  1625. '.toNone {background-color: #cccccc;}' +
  1626. '.rt {width: 20px; height: 20px; background-color: transparent; margin: 1px; border: 1px solid #000000; font-size: 80%; padding: 1px;}' +
  1627. '.vb, .irc {width: 25px; height: 20px; background-color: transparent; margin: 1px; border: 1px solid #000000; font-size: 80%; padding: 1px;}'
  1628. ;
  1629. return to;
  1630. case '2':
  1631. to =
  1632. 'a {color: #'+theme.link+';}' +
  1633. 'a:visited {color: #'+theme.visited+';}' +
  1634. 'tbody td {color: #'+theme.text+';}' +
  1635. '.to a {color: #000000;}' +
  1636.  
  1637. '.cont, .details {color: #'+theme.text+';}' +
  1638. '.toHigh {background-color: #'+color+';}' +
  1639. '.toGood {background-color: #'+color+';}' +
  1640. '.toAverage {background-color: #'+color+';}' +
  1641. '.toLow {background-color: #'+color+';}' +
  1642. '.toPoor {background-color: #'+color+';}' +
  1643. '.toNone {background-color: #'+color+';}' +
  1644.  
  1645. '.toHigh .to {background-color: #33cc59;}' +
  1646. '.toGood .to {background-color: #a6cc33;}' +
  1647. '.toAverage .to {background-color: #cccc33;}' +
  1648. '.toLow .to {background-color: #cca633;}' +
  1649. '.toPoor .to {background-color: #cc3333;}' +
  1650. '.toNone .to {background-color: #cccccc;}' +
  1651. '.rt {width: 20px; height: 20px; color: #'+theme.text+'; background-color: transparent; margin: 1px; border: 1px solid #'+theme.text+'; font-size: 80%; padding: 1px;}' +
  1652. '.vb, .irc {width: 25px; height: 20px; color: #'+theme.text+'; background-color: transparent; margin: 1px; border: 1px solid #'+theme.text+'; font-size: 80%; padding: 1px;}'
  1653. ;
  1654. return to;
  1655. case '3':
  1656. to =
  1657. 'a {color: #'+theme.link+';}' +
  1658. 'a:visited {color: #'+theme.visited+';}' +
  1659. 'tbody td {color: #'+theme.text+';}' +
  1660.  
  1661. '.cont, .details {color: #'+theme.text+';}' +
  1662. '.toHigh {background-color: #'+color+';}' +
  1663. '.toGood {background-color: #'+color+';}' +
  1664. '.toAverage {background-color: #'+color+';}' +
  1665. '.toLow {background-color: #'+color+';}' +
  1666. '.toPoor {background-color: #'+color+';}' +
  1667. '.toNone {background-color: #'+color+';}' +
  1668.  
  1669. '.toHigh .to a {color: #33cc59;}' +
  1670. '.toGood .to a {color: #a6cc33;}' +
  1671. '.toAverage .to a {color: #cccc33;}' +
  1672. '.toLow .to a {color: #cca633;}' +
  1673. '.toPoor .to a {color: #cc3333;}' +
  1674. '.toNone .to a {color: #cccccc;}' +
  1675. '.rt {width: 20px; height: 20px; color: #'+theme.text+'; background-color: transparent; margin: 1px; border: 1px solid #'+theme.text+'; font-size: 80%; padding: 1px;}' +
  1676. '.vb, .irc {width: 25px; height: 20px; color: #'+theme.text+'; background-color: transparent; margin: 1px; border: 1px solid #'+theme.text+'; font-size: 80%; padding: 1px;}'
  1677. ;
  1678. return to;
  1679. }
  1680. }
  1681.  
  1682. $('#type option[value="' + config.type + '"]') .prop('selected', true);
  1683. $('#size option[value="' + config.size + '"]') .prop('selected', true);
  1684. $('#new_audio option[value="' + config.newaudio + '"]') .prop('selected', true);
  1685. $('#adv_theme option[value="' + config.theme + '"]') .prop('selected', true);
  1686. $('#to_theme option[value="' + config.to_theme + '"]') .prop('selected', true);
  1687.  
  1688. _theme();
  1689. _init_lists();
Add Comment
Please, Sign In to add comment