Automatic Offer Retraction

By garrettfoster Last update May 24, 2010 — Installed 531 times.

There are 1 previous version of this script.

// ==UserScript==
// @name           Automatic Offer Retraction
// @namespace      goallineblitz.com
// @description    Will check to see how many players are signed and retract remaining offers at that position if a user defined quota has been met.
// @include        http://goallineblitz.com/game/*
// @copyright      2010, garrettFoster
// @version        2010.05.24
// ==/UserScript==

//needed by greasmonkey
window.setTimeout( 
	function() {
		main();
	}, 
	10
);

function main(){
    debug('script started');
    
    document.title = '()'+document.title;
    
    //check the cookie every 10 seconds and see if time has elapsed   
    setInterval(checkCookie,1000*6);
    
    var parseDiv = document.createElement('div');
    parseDiv.setAttribute('style','visibility:hidden; display:none;');
    parseDiv.setAttribute('id','parseDiv');
    
    var location = document.getElementById('body_container');
    location.parentNode.insertBefore(parseDiv,location);
    
    //create a button to set uptions if we are on a roster page
    if(window.location.href.indexOf('http://goallineblitz.com/game/roster.pl?team_id=') != -1){
        
        const teamId = parseInt(window.location.href.split('team_id=')[1]); //get the team id so we know which data to pull from the cookies
        
        if(document.getElementById('tab_team_offers') != null){ //make sure you have rights to send offers for this team
            
            //grab the current settings
            var retractionSettings = getSettings(teamId);     
            
             //build a button to let the user modify the settings
            location = document.getElementById('tab_roster');
            
            var tab = document.createElement('div');
            tab.setAttribute('id','retractionSettingsTab');
            tab.setAttribute('class','tab_off');
            
            var a = document.createElement('a');
            a.setAttribute('style','cursor:pointer;cursor:hand;');
            a.addEventListener('click',toggleSettings,false);
            a.innerHTML = 'Retraction Settings';
            
            tab.appendChild(a);
            
            location.parentNode.insertBefore(tab,location.nextSibling);
            
            //add a div
            var div = document.createElement('div');
            div.setAttribute('id','retractionSettings');
            div.setAttribute('class','off');
            div.setAttribute('style','visibility:hidden; display:none;');
            div.innerHTML = '';
            
            document.getElementById('page_roster').appendChild(div); 
            
            var table = '<table>'+
                            '<tbody'+
                                '<tr style="text-align: center; font-weight: bold;">'+
                                    '<td>QB</td>'+
                                    '<td>HB</td>'+
                                    '<td>FB</td>'+
                                    '<td>C</td>'+
                                    '<td>G</td>'+
                                    '<td>OT</td>'+
                                    '<td>TE</td>'+
                                    '<td>WR</td>'+
                                    '<td>DT</td>'+
                                    '<td>DE</td>'+
                                    '<td>LB</td>'+
                                    '<td>CB</td>'+
                                    '<td>SS</td>'+
                                    '<td>FS</td>'+
                                    '<td>K</td>'+
                                    '<td>P</td>'+
                                    '<td />'+
                                    '<td />'+
                                '</tr>'+
                                '<tr id="retractionInputs">'+
                                    '<td><input id="qb" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="hb" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="fb" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="c" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="g" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="ot" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="te" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="wr" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="dt" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="de" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="lb" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="cb" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="ss" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="fs" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="k" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="p" size="2" value="1" type="text" /></td>'+
                                    '<td><input id="updateButton" value="Update Retraction Settings" type="button" /></td>'+
                                    '<td><input id="removeButton" value="Remove Team from script" type="button" /></td>'+
                                '</tr>'+
                            '</tbody>'+
                        '</table>';            
                       
            
            document.getElementById('retractionSettings').innerHTML = table;
            document.getElementById('removeButton').setAttribute('style','visibility:hidden; display:none;');
            document.getElementById('updateButton').addEventListener('click',function(){
                                                                                        var settings = getValues();
                                                                                        var cookie = [teamId,1].concat(settings);
                                                                                        updateCookie(cookie,teamId);
                                                                                        alert('Team #'+teamId+' updated in the script.');
                                                                                        document.getElementById('removeButton').removeAttribute         ('style','visibility:hidden; display:none;');  
                                                                                        },false);
            document.getElementById('removeButton').addEventListener('click',function(){
                                                                                        deleteCookie(teamId);
                                                                                        alert('Team #'+teamId+' removed the script.');
                                                                                        document.getElementById('removeButton').setAttribute         ('style','visibility:hidden; display:none;');  
                                                                                        },false);
            
            if(teamExists(teamId)){
                document.getElementById('removeButton').removeAttribute('style','visibility:hidden; display:none;');                
            }             
            
            //update values
            setValues(retractionSettings);          
        }
    }    
}

function checkCookie(){
    var title = document.title.split(')')[1];
    var cookie = toArray(getCookie('glbOfferCheck'));
    var teams = new Array();
    for(var i=0;i<cookie.length;i++){
        cookie[i][1] -= 0.1;      
        if(cookie[i][1] < 0.1){
            teams.push(cookie[i][0]); //time has expired so add this team to the list to check
            cookie[i][1] = 15;
        }
        updateCookie(cookie[i],cookie[i][0]);
    }
    title = '('+cookie[0][1].toFixed(1)+')'+title;
    if(teams.length != 0){ //only run this part if we have teams to check
        for(var i=0;i<teams.length;i++){
            document.title = 'Checking team ' + teams[i];
            var rosterPage = getResponseText('http://goallineblitz.com/game/roster.pl?team_id=' + teams[i]);
            var roster = parseRoster(rosterPage);
            var settings = getSettings(teams[i]);
            
            //compare settings to roster and see if we need to retract some offers
            const position = ['QB','HB','FB','C','G','OT','TE','WR','DT','DE','LB','CB','SS','FS','K','P'];
            var retractPosition = new Array(); //array to hold positions to be retracted
            for(var j=2;j<settings.length;j++){
                if(roster[j-2] >= settings[j]){
                    retractPosition.push(position[j-2]);
                }
            }
            if(retractPosition.length != 0){ //then we have contracts to retract
                document.title = 'Retracting offers for team ' + teams[i];
                var offersPage = getResponseText('http://goallineblitz.com/game/team_offers.pl?team_id=' + teams[i]);
                for(var j=0; j<retractPosition.length; j++){
                    var offerId = parseOffers(offersPage,retractPosition[j]);
                    if(offerId.length != 0){ //retract offers
                        for(var k=0; k<offerId.length; k++){
                            getResponseText('http://goallineblitz.com/game/team_offers.pl?team_id=' + teams[i] + '&delete_offer='+ offerId[k]);
                        }
                    }
                }
            }
        }        
    }
    document.title = title;
}

function parseOffers(page,position){
    var div = document.getElementById('parseDiv');
    div.innerHTML = page;
    
    var offerId = new Array();
    var offers = div.getElementsByClassName('player_name');
    for(var i=0; i<offers.length; i++){
        var pos = offers[i].getElementsByTagName('b')[0].innerHTML.split(' ')[2];
        if(pos == position){
            var id = offers[i].parentNode.parentNode.innerHTML.split("deleteOffer('")[1].split("')")[0];
            offerId.push(id);
        }
    }
    return offerId;    
}        

function parseRoster(page){
    var div = document.getElementById('parseDiv');
    div.innerHTML = page;
    var position = div.getElementsByClassName('position');
    const positions = ['QB','HB','FB','C','G','OT','TE','WR','DT','DE','LB','CB','SS','FS','K','P'];
    var roster = new Array();
    for(var i=0; i<positions.length; i++){
        var count = div.getElementsByClassName(positions[i]).length;
        roster.push(count);
    }
    return roster;
}    

function setValues(retractionSettings){
    var input = document.getElementById('retractionInputs').getElementsByTagName('input');
    for(var i=0;i<input.length-2;i++){
        input[i].value = retractionSettings[i+2];
    }
} 

function toggleSettings(){
    var div = document.getElementById('retractionSettings');
    var state = div.className;
    if(state == 'off'){
        div.setAttribute('class','on');
        div.removeAttribute('style','visibility:hidden; display:none;');
    }else{
        div.setAttribute('class','off');
        div.setAttribute('style','visibility:hidden; display:none;');
    }
}

// used to grab page data
function getResponseText(url){
    var xmlhttp = new XMLHttpRequest();    
    xmlhttp.open('GET',url,false);
    xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    xmlhttp.send('');
    return xmlhttp.responseText;
}

//more universal debugging command
function debug(text) {
    try{
        console.log(text);
    }catch(e){
        try{
            opera.postError(text);
        }catch(e){
            alert(text);
        }
    }
}

//functions for cookies
function setCookie(id,value,days) {
    var expire = new Date();
    if (days==null || days==0) days=30;
    expire.setTime(expire.getTime() + 3600000*24*days);
    document.cookie = id+"="+escape(value)+ ";expires="+expire.toGMTString(); //+exdate.toUTCString());
}

function getCookie(id){
    if (document.cookie.length>0){
        var start = document.cookie.indexOf(id + "=");
        if (start != -1){
            start= start + id.length +1;
            var end = document.cookie.indexOf(";",start);
            if(end == -1){
                end = document.cookie.length;
            }
            return unescape(document.cookie.substring(start,end));
        }
    }
    return '';
}

function toCookie(array){
    var cookie = '';    
    for(var i=0; i<array.length; i++){
        var team = array[i];
        for(var j=0; j<team.length; j++){
            cookie += team[j]+'%item';
        }
        cookie += '%team';
    }
    return cookie;
}

function toArray(cookie){
    var array = new Array();    
    var teams = cookie.split('%team');
    for(var i=0;i<teams.length-1;i++){ //ignore the last of the teams as it is empty
        var team = new Array();
        var items = teams[i].split('%item');
        for(var j=0;j<items.length-1;j++){ //ignore the last of the items as it is empty
            if(j==1){
                team=team.concat(parseFloat(items[j])); //time uses decimal points
                continue;
            }
            team = team.concat(parseInt(items[j]));
        }
        array.push(team);
    }    
    return array;
}

function getSettings(teamId){
    var settings = new Array();
    var team = toArray(getCookie('glbOfferCheck'));
                            //qb,hb,fb,c,g,ot,te,wr,dt,de,lb,cb,ss,fs,k,p
    var defaults = [teamId, 15, 3, 6, 3,3,6, 6, 3,15, 6, 6,12,15, 3, 3,3,3];
    for(var i=0;i<team.length;i++){
        if(team[i][0] == teamId){
            settings = team[i];
            break; //don't need to look throught the rest of the data
        }
    }
    if(settings == ''){ //no previouse settings were found
         return defaults;
    }
    return settings;
}

function updateCookie(settings,teamId){
    var cookie = toArray(getCookie('glbOfferCheck'));
    var found = false;
    //see if the team exists
    for(var i=0;i<cookie.length;i++){
        if(cookie[i][0] == teamId){
            cookie[i] = settings;
            found = true;
            break; //don't need to look throught the rest of the data
        }
    }
    if(!found){   
        cookie.push(settings);
    }
    setCookie('glbOfferCheck',toCookie(cookie));
}

function deleteCookie(teamId){
    if(teamId == null){
        setCookie('glbOfferCheck','',-1);
    }else{
        var cookie = toArray(getCookie('glbOfferCheck'));
        var newCookie = new Array();
        //see if the team exists
        for(var i=0;i<cookie.length;i++){
            if(cookie[i][0] == teamId){
                continue;
            }
            newCookie.push(cookie[i]);
        }
        setCookie('glbOfferCheck',toCookie(newCookie))
    }
}

function getValues(){
    var array = new Array();
    var input = document.getElementById('retractionInputs').getElementsByTagName('input');
    for(var i=0;i<input.length-2;i++){
        array.push(parseInt(input[i].value));
    } 
    return array; 
}

function teamExists(teamId){
    var cookie = toArray(getCookie('glbOfferCheck'));
    //see if the team exists
    for(var i=0;i<cookie.length;i++){
        if(cookie[i][0] == teamId){
            return true;
        }
    }
    return false;
}