iRacing Session Manager

Save and load session (testing/hosted) settings on www.iRacing.com

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         iRacing Session Manager
// @namespace    http://www.math.kit.edu/ianm2/~maier
// @version      0.1
// @description  Save and load session (testing/hosted) settings on www.iRacing.com
// @author       Markus Maier
// @match        http://members.iracing.com/membersite/member/*
// @grant    GM_getValue
// @grant    GM_setValue
// ==/UserScript==

var params = {
    timeout: 2500,
    switchToWeather: false,
};

var sessions;
init();

function init()
{
    // First UI
	UI_addElements();   
    UI_css();
    
    // Get saved sessions from GM 
    var sessions_JSON = GM_getValue('sessions');
    if(sessions_JSON === undefined)
        sessions = new Object();
    else
        sessions = JSON.parse(sessions_JSON);


    //and finally refresh list
    UI_refreshSessions();
}



function saveSession() {
    var sessionName = document.getElementById('mm_ism_savesessionname').value;
    if(sessions.hasOwnProperty(sessionName))
    {
    	var r = confirm("Are you sure you want to overwrite session \"" + sessionName + "\"?");
    	if (!r) return; 
    }
    var new_session = {
        name: sessionName,
        car: parseInt(document.getElementById('carSelectorDropdown').value), 
        track: {
        	id: parseInt(document.getElementById('trackSelectorDropdown').value), 
            config: parseInt(document.getElementById('configSelectorDropdown').value),
            night: ( (document.getElementById('testingpanel_nightMode') === undefined) ? 0 : document.getElementById('testingpanel_nightMode').checked),
        },
        weather: {
        	temp: parseInt(document.getElementById('weatherTestWeatherTemp').value), 
            tempUnit: parseInt(document.getElementById('weatherTestweatherTempChoice').value),
            humidity: parseInt(document.getElementById('testHumiditySliderValue').value), 
            fog: parseInt(document.getElementById('testingFog').value),
            windSpeed: parseInt(document.getElementById('weatherTestweatherWindSpeed').value), 
            windSpeedUnit: parseInt(document.getElementById('weatherTestweatherWindSpeedChoice').value), 
            windDirection: parseInt(document.getElementById('weatherTestweatherWindDirection').value), 
            cloudCover: parseInt(document.getElementById('testCloudCover').value), 
			random: document.getElementById('testRandomWeather').checked,             
        },
	};
    sessions[sessionName] = new_session;
    // save it
    GM_setValue('sessions', JSON.stringify(sessions));
    
    // finally refresh UI
    UI_refreshSessions();
    document.getElementById('mm_ism_sessionlist').value = sessionName;
}

function removeSession() {
    var name = document.getElementById('mm_ism_sessionlist').value;
    
    var r = confirm("Are you sure you want to delete session \"" + name + "\"?");
    if (!r) return;
    
    delete sessions[name];
    
    // save it for after refresh
    GM_setValue('sessions', JSON.stringify(sessions));
    
    //refresh UI
    UI_refreshSessions();
}

function loadSession() {    
    document.getElementById('mm_ism_info').style.display = 'block';
    
    var name = document.getElementById('mm_ism_sessionlist').value;
    
    document.getElementById('mm_ism_savesessionname').value = name;
    
	var session = sessions[name];
    
    // ONLY ADJUST INPUT VALUES
    //car
    document.getElementById('carSelectorDropdown').value = session.car;
    dispEvent(document.getElementById('carSelectorDropdown'),'HTMLEvents','change');
    //track
    document.getElementById('trackSelectorDropdown').value = session.track.id;
    dispEvent(document.getElementById('trackSelectorDropdown'),'HTMLEvents','change');
    document.getElementById('configSelectorDropdown').value = session.track.config;
    dispEvent(document.getElementById('configSelectorDropdown'),'HTMLEvents','change');
    
    window.setTimeout(loadSession_part2,params.timeout);
}

function loadSession_part2() {
    var name = document.getElementById('mm_ism_sessionlist').value;
	var session = sessions[name];
    
    if(params.switchToWeather)
        dispEvent(document.getElementById('weatherTestToggle'),'MouseEvent','click');
    
    //Night Mode
    document.getElementById('testingpanel_nightMode').checked = session.track.night;
    //weather
    
    //temp
    document.getElementById('weatherTestweatherTempChoice').value = session.weather.tempUnit
    document.getElementById('weatherTestWeatherTemp').value = session.weather.temp;
    var minTemp, maxTemp, numTemp;
    var tempSliderVal;
    if(session.weather.tempUnit == 0){ //Celcius
		minTemp = 65.0;
        maxTemp = 90.0;
    }
    if(session.weather.tempUnit == 1) { //Fahrenheit
    	minTemp = 18.0;
        maxTemp = 32.0;
    }
    numTemp = session.weather.temp;
    tempSliderVal = (100.0/(maxTemp-minTemp))*(numTemp-minTemp);
    document.getElementById('testTempSlider').childNodes[0].style.height = tempSliderVal.toString() + "%";
    document.getElementById('testTempSlider').childNodes[1].style.bottom = tempSliderVal.toString() + "%";
    

    //humidity
    document.getElementById('testHumiditySliderValue').value = session.weather.humidity;
    document.getElementById('testingFog').value = session.weather.fog;
    document.getElementById('testHumiditySliderValue').value = session.weather.humidity;
    document.getElementById('testingFog').value = session.weather.fog;
    sliderVal = 0.5*(session.weather.humidity + session.weather.fog);
    document.getElementById('testHumiditySlider').childNodes[0].style.height = sliderVal.toString() + "%";
    document.getElementById('testHumiditySlider').childNodes[1].style.bottom = sliderVal.toString() + "%";
    var fog = session.weather.fog;
    var testFogWarning = document.getElementById('testFogWarning');
    var testFogValue = document.getElementById('testFogValue');
    if(fog > 0) {
        testFogValue.style.display = "block";
        testFogValue.innerHTML = "Fog: " + fog + "%";
    } else {
    	testFogValue.style.display = "none";  
    }
    
    if(fog <= 25) {
        testFogWarning.className  = 'testwarning';
        testFogWarning.title = '';
    } else if(26 <= fog && fog <= 39) {
        testFogWarning.className  = 'testwarning low';
        testFogWarning.title = 'You have selected a fog level that may be dangerous to drive in.';
    } else {
        testFogWarning.className  = 'testwarning high';
        testFogWarning.title = 'You have selected a level of fog that highly impairs vision. Use with caution!';
    };
    
    //Wind speed
    
    //workaround to fix iracing hpp
    document.getElementById('weatherTestweatherWindSpeedChoice').value = 0;
    dispEvent(document.getElementById('weatherTestweatherWindSpeedChoice'),'HTMLEvents','change');
	document.getElementById('weatherTestweatherWindSpeedChoice').value = 1;
    dispEvent(document.getElementById('weatherTestweatherWindSpeedChoice'),'HTMLEvents','change');

    document.getElementById('weatherTestweatherWindSpeedChoice').value = session.weather.windSpeedUnit;
    dispEvent(document.getElementById('weatherTestweatherWindSpeedChoice'),'HTMLEvents','change');
    document.getElementById('weatherTestweatherWindSpeed').value = session.weather.windSpeed;

    var maxWSpeed, numWSpeed;
    var windSliderVal;
    if(session.weather.windSpeedUnit== 0) //mph
		maxWSpeed = 30;
    else //kph
    	maxWSpeed = 48;
    numWSpeed =  session.weather.windSpeed;
    windSliderVal = (100.0/maxWSpeed)*numWSpeed;
    document.getElementById('testWindSlider').childNodes[0].style.height = windSliderVal.toString() + "%";
    document.getElementById('testWindSlider').childNodes[1].style.bottom = windSliderVal.toString() + "%";   
    
    
    //winddir and cloudcover
    document.getElementById('weatherTestweatherWindDirection').value = session.weather.windDirection;
    document.getElementById('testCloudCover').value = session.weather.cloudCover;
    
    //random weather
    if(document.getElementById('testRandomWeather').checked != session.weather.random)
    	dispEvent(document.getElementById('testRandomWeather'),'MouseEvent','click');
    
    document.getElementById('mm_ism_info').style.display = 'none';
}


function dispEvent(elem,evType1,evType2) {
    var event = document.createEvent(evType1);
    event.initEvent(evType2, true, true ); 
    elem.dispatchEvent(event);
}



function UI_showFrame() {
    document.getElementById('mm_ism_mainframe').style.display = "block";
}

function UI_hideFrame() {
    document.getElementById('mm_ism_mainframe').style.display = "none";
}

function UI_refreshSessions() {   
    //First, remove all entries
    var sessionList = document.getElementById('mm_ism_sessionlist');
    while (sessionList.firstChild) {
    	sessionList.removeChild(sessionList.firstChild);
	}
    //Then add new ones
    for(var name in sessions) {
    	var new_li = document.createElement('option');
    	new_li.appendChild(document.createTextNode(name));
    	new_li.value = name;
        sessionList.appendChild(new_li);
    }
}

function UI_addElements() {
    //create Elements
    var testingpanel_testcar_button = document.getElementById('green_racepanel_btn');
    var mm_ism_mainbutton = testingpanel_testcar_button.cloneNode(true);
    mm_ism_mainbutton.id ="mainbutton";
    mm_ism_mainbutton.firstElementChild.innerHTML='Manage Sessions';
    mm_ism_mainbutton.addEventListener('click',UI_showFrame,false);
    
    var mainframe = document.createElement('div');
    mainframe.id = "mm_ism_mainframe";
    
    mainframe.innerHTML = "" + 
        "<div>"+
        	"<a id=\"mm_ism_closebutton\">[Close]</a>"+
        "</div>"+
        "<div>"+
        "Save:<br/>"+
        	"<input id=\"mm_ism_savesessionname\" />"+
        	"<input id=\"mm_ism_savesessionbutton\" type=\"button\" value=\"Save\" />"+
        "</div>"+
        "<div>"+
        "Load:<br/>"+	
        	"<select id=\"mm_ism_sessionlist\">"+
        	"</select>"+
        	"<input id=\"mm_ism_loadsessionbutton\" type=\"button\" value=\"Load\" />"+
        	"<input id=\"mm_ism_deletesessionbutton\" type=\"button\" value=\"X\" />"+
        "</div>"+
        "<div id=\"mm_ism_info\">Loading session...</div>";
    
    var testingpanel_session = document.getElementById('testingpanel_session').parentNode;
 	testingpanel_session.appendChild(mm_ism_mainbutton);
    testingpanel_session.insertBefore(mainframe, testingpanel_session.firstChild);
    
    document.getElementById('mm_ism_closebutton').addEventListener('click',UI_hideFrame,false);
    document.getElementById('mm_ism_savesessionbutton').addEventListener('click',saveSession,false);
    document.getElementById('mm_ism_loadsessionbutton').addEventListener('click',loadSession,false);
    document.getElementById('mm_ism_deletesessionbutton').addEventListener('click',removeSession,false);
}

function UI_css() {
    css_string = "" +
        "#mm_ism_mainframe {" +
        "	display:none;"+
        "	position:relative;"+
        "	margin:0px 0px 50px 0px;"+
        "	padding:5px;"+
        "	height:125px;"+
        "	border: 1px solid black;"+
        "	background-color:white" +
        "}"+
        "#mm_ism_info {"+
        "	display:none"+
        "}";
    
    var css = document.createElement("style");
    css.type = "text/css";
	css.innerHTML = css_string;
	document.body.appendChild(css);
}