Greasy Fork

MTurk Wage Reporter

Tracks a best-estimate hourly wage on active HITs being worked.

当前为 2014-07-15 提交的版本,查看 最新版本

// ==UserScript==
// @name				MTurk Wage Reporter
// @namespace			localhost
// @description			Tracks a best-estimate hourly wage on active HITs being worked.
// @include				https://www.mturk.com/mturk/accept?*
// @include				https://www.mturk.com/mturk/previewandaccept?*
// @include				https://www.mturk.com/mturk/dashboard*
// @include				https://www.mturk.com/mturk/submit*
// @version				0.2
// @grant				GM_setValue
// @grant				GM_getValue
// @require				http://code.jquery.com/jquery-2.1.1.js
// @downloadURL
// @updateURL
// @author				DeliriumTremens 2014
// ==/UserScript==

//
// 2014-07-10	0.1b	Beginning development.  Creating timer and tab tracker, as well as initial IndexedDB for storage of data.
//

// ------------------------------------------------------------------------------------------------------------------------------------------------

//	First, create indexedDB variables. 
// Parts borrowed from HITdb
var indexedDB = window.indexedDB || window.webkidIndexedDB || window.mozIndexedDB;

var WageStorage = {};

window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.mozIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.mozIDBKeyRange;

WageStorage.IDBTransactionModes = { "READ_ONLY": "readonly", "READ_WRITE": "readwrite", "VERSION_CHANGE": "versionchange" };

var idbKeyRange = window.IDBKeyRange;

WageStorage.indexedDB = {};
WageStorage.indexedDB.db = null;

// Global catch for indexedDB errors
WageStorage.indexedDB.onerror = function(e) {
	console.log(e);
}

// Check if database exists.  If no database, create one.  
// Parts borrowed from HITdb.
var dbExists = true;
var v = 5;

WageStorage.indexedDB.create = function () {
	var request = indexedDB.open("WageDB", v);
	
	request.onupgradeneeded = function (e) {
		WageStorage.indexedDB.db = e.target.result;
		
		var db = WageStorage.indexedDB.db;
		var newDB = false;
		
		if(!db.objectStoreNames.contains("Wage")) {
			var store = db.createObjectStore("Wage", { keyPath: "hitId" });
			
			store.createIndex("date", "date", {unique: false});
			store.createIndex("reqName", "reqName", {unique: false});
			store.createIndex("reqId", "reqId", {unique: false});
			store.createIndex("reward", "reward", {unique: false});
			store.createIndex("start", "start", {unique: false});
			store.createIndex("stop", "stop", {unique: false});
			
			newDB = true;	
		}	
	db.close();
	}
	request.onsuccess = function(e) {
		WageStorage.indexedDB.db = e.target.result;
		var db = WageStorage.indexedDB.db;
		db.close();
	}
	request.onerror = WageStorage.indexedDB.onerror;
}

// Function for adding HIT data into database
WageStorage.indexedDB.addhit = function () {
	var request = indexedDB.open("WageDB", v);
	
	request.onsuccess = function (e) {
		WageStorage.indexedDB.db = e.target.result;
		
		var db = WageStorage.indexedDB.db;
		var newDB = false;
		
		if(!db.objectStoreNames.contains("Wage")) {
			db.close();
		}
		else {
			var trans = db.transaction(["Wage"],WageStorage.IDBTransactionModes.READ_WRITE);
			var store = trans.objectStore("Wage");

			var request;
			request = store.put({ hitId: hitId[1], date: date, reqName: reqName, reqId: reqId[1], reward: reward, start: wageStart, stop: wageEnd });
		}	
	db.close();
	}
	request.onerror = WageStorage.indexedDB.onerror;
}

// Script Variables
var wageLost = false;
var wageNix = false;
var wageStart = null;
var wageEnd = null;
var reqId = document.URL.match(/requesterId=(.*?)&/i);

if (reqId) {
	GM_setValue("reqId", reqId);
	}
else {
	reqId = GM_getValue("reqId");
	}

// HIT Data
var hitId = document.URL.match(/hitId=(.*?)&/i);
var reward = parseFloat($('span[class="reward"]:eq(1)').text().replace('$',''));
var reqName = $('input[name="prevRequester"]').val();
var date = new Date();
date = date.toLocaleDateString().replace(/\//g,'-');

// Timestamp when the HIT is accepted
$(window).ready( function() {
	if (document.URL === "https://www.mturk.com/mturk/dashboard" ) {} // Don't record anything on dashboard
	else {
		wageStart = new Date().getTime();
		console.log("Wage Starting!");
	}
});

// Detect if 'Return HIT' button has been clicked to record timer as zero-earnings. 
// Timestamp when button was clicked to end time spent.
$('a[href*="/mturk/return?"]').on('click', function() {
	wageLost = true;
	wageEnd = new Date().getTime();
});

$('img[name="/submit"]').on('click', function() {
	wageLost = false;
});

// Create database if not created yet
WageStorage.indexedDB.create();

// Detect the page unloading and react accordingly.  
// If return button was clicked, record zero wage earnings, otherwise record earnings.
// Timestamp if submitted to end time spent.
$(window).on('beforeunload', function() {
	if (wageLost) {
		// ***** DO STUFF WHEN RETURN CLICKED *****
		reward = 0;
		WageStorage.indexedDB.addhit();
	}
	else {
		// ***** DO STUFF WHEN SUBMITTED *****
		wageEnd = new Date().getTime();
		WageStorage.indexedDB.addhit();
	}
});