[Script] Simple Queue Low Time Alert

Discussion in 'mTurk Scripts & Resources' started by slothbear, Jan 27, 2018.

  1. slothbear

    slothbear Survey Slinger

    Messages:
    10,821
    Gender:
    Male
    Ratings:
    +22,069
    Here's a dirty little script that runs on the queue and will make a magical sound when the shortest timer falls under a certain threshold (default: 10 minutes).

    https://greasyfork.org/en/scripts/37877-simple-queue-low-time-alert

    Code:
    // ==UserScript==
    // @name         Simple Queue Low Time Alert
    // @version      1.1
    // @description  Alert if time is running out on HITs
    // @author       slothbear
    // @icon         http://i.imgur.com/yptTSAh.gif
    // @include      https://worker.mturk.com/tasks*
    
    // @namespace https://greasyfork.org/users/64880
    // ==/UserScript==
    
    
    // This script watches the shortest timer in the queue
    // and plays an audio alert if it falls under a certain
    // number of minutes (default is 10).
    //
    // The script will reload the queue every 15 seconds while
    // a timer is going off so it can reset and not be annoying.
    
    
    
    
    //alert time in minutes
    //set to 100 to test or debug
    const WARNING_TIMER = 10;
    
    
    
    function watchTimer(timer, audioElement) {
        var warningClock = 0;
        let originalTitle = document.title;
    
        setInterval(function(){
            let time = extractMinutesFromTime(timer.innerText);
            let visualTrigger = false;
            if (checkMinutesLeft(time)) {
                if (warningClock === 0) audioAlert(audioElement);
                if (warningClock === 14) window.location.reload();
                warningClock++;
                visualTrigger = true;
            } else {
                visualTrigger = false;
            }
            if (visualTrigger) visualAlert(warningClock, originalTitle);
        }, 1000);
    }
    
    function extractMinutesFromTime(time) {
        let length = time.length;
        let minutes;
        if (length > 5) minutes = 99; // this happens if over 1 hour left
        if (length === 5) minutes = time.substring(length-5,length-3);
        if (length < 5) minutes = time.substring(length-4,length-3);
        return minutes;
    }
    
    function visualAlert(count, originalTitle) {
        let firstRow = document.querySelector('li.table-row');
        if (count %2 === 0)    {
            document.title = "█████████████████████";
            firstRow.style.backgroundColor = "#D66462";
        } else {
            document.title = originalTitle;
            firstRow.style.backgroundColor = "#DCC784";
        }
    }
    
    function init_audio() {
        let audioElement = [];
        audioElement[0] = document.createElement('audio');
        audioElement[0].setAttribute('src', 'http://themushroomkingdom.net/sounds/wav/smb/smb_warning.wav');
        return audioElement;
    }
    
    function audioAlert(audioElement) {
        console.log("Tasks are about to expire. HURRY!");
        audioElement[0].play();
    }
    
    function grabFocus() {
        let quickFocus = window.open("https://www.chronicle.com/blogs/linguafranca/files/2017/11/Nothing-to-See-15a34a2fc727c8.jpg", "_blank");
        quickFocus.close();
    }
    
    function getTimer(pos) {
        return document.querySelectorAll('span.completion-timer')[pos];
    }
    
    function minutesToSeconds(minutes) {
        return minutes * 60;
    }
    
    function checkMinutesLeft(time) {
        return (time < WARNING_TIMER);
    }
    
    
    
    (function main() {
    
        //checks for a completion timer,
        //then stops if none found.
        let shortestTimer = getTimer(0);
        if (!shortestTimer) return false;
    
        //get the audio setup so the file is ready
        //and then start watching the shortest timer
        let audioElement = init_audio();
        watchTimer(shortestTimer, audioElement);
    
    })();
    
     
    • Today I Learned Today I Learned x 6
    • Like Like x 1