Greasy Fork 还支持 简体中文。

iRacing Session Manager

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

  1. // ==UserScript==
  2. // @name iRacing Session Manager
  3. // @namespace http://www.math.kit.edu/ianm2/~maier
  4. // @version 0.1
  5. // @description Save and load session (testing/hosted) settings on www.iRacing.com
  6. // @author Markus Maier
  7. // @match http://members.iracing.com/membersite/member/*
  8. // @grant GM_getValue
  9. // @grant GM_setValue
  10. // ==/UserScript==
  11.  
  12. var params = {
  13. timeout: 2500,
  14. switchToWeather: false,
  15. };
  16.  
  17. var sessions;
  18. init();
  19.  
  20. function init()
  21. {
  22. // First UI
  23. UI_addElements();
  24. UI_css();
  25. // Get saved sessions from GM
  26. var sessions_JSON = GM_getValue('sessions');
  27. if(sessions_JSON === undefined)
  28. sessions = new Object();
  29. else
  30. sessions = JSON.parse(sessions_JSON);
  31.  
  32.  
  33. //and finally refresh list
  34. UI_refreshSessions();
  35. }
  36.  
  37.  
  38.  
  39. function saveSession() {
  40. var sessionName = document.getElementById('mm_ism_savesessionname').value;
  41. if(sessions.hasOwnProperty(sessionName))
  42. {
  43. var r = confirm("Are you sure you want to overwrite session \"" + sessionName + "\"?");
  44. if (!r) return;
  45. }
  46. var new_session = {
  47. name: sessionName,
  48. car: parseInt(document.getElementById('carSelectorDropdown').value),
  49. track: {
  50. id: parseInt(document.getElementById('trackSelectorDropdown').value),
  51. config: parseInt(document.getElementById('configSelectorDropdown').value),
  52. night: ( (document.getElementById('testingpanel_nightMode') === undefined) ? 0 : document.getElementById('testingpanel_nightMode').checked),
  53. },
  54. weather: {
  55. temp: parseInt(document.getElementById('weatherTestWeatherTemp').value),
  56. tempUnit: parseInt(document.getElementById('weatherTestweatherTempChoice').value),
  57. humidity: parseInt(document.getElementById('testHumiditySliderValue').value),
  58. fog: parseInt(document.getElementById('testingFog').value),
  59. windSpeed: parseInt(document.getElementById('weatherTestweatherWindSpeed').value),
  60. windSpeedUnit: parseInt(document.getElementById('weatherTestweatherWindSpeedChoice').value),
  61. windDirection: parseInt(document.getElementById('weatherTestweatherWindDirection').value),
  62. cloudCover: parseInt(document.getElementById('testCloudCover').value),
  63. random: document.getElementById('testRandomWeather').checked,
  64. },
  65. };
  66. sessions[sessionName] = new_session;
  67. // save it
  68. GM_setValue('sessions', JSON.stringify(sessions));
  69. // finally refresh UI
  70. UI_refreshSessions();
  71. document.getElementById('mm_ism_sessionlist').value = sessionName;
  72. }
  73.  
  74. function removeSession() {
  75. var name = document.getElementById('mm_ism_sessionlist').value;
  76. var r = confirm("Are you sure you want to delete session \"" + name + "\"?");
  77. if (!r) return;
  78. delete sessions[name];
  79. // save it for after refresh
  80. GM_setValue('sessions', JSON.stringify(sessions));
  81. //refresh UI
  82. UI_refreshSessions();
  83. }
  84.  
  85. function loadSession() {
  86. document.getElementById('mm_ism_info').style.display = 'block';
  87. var name = document.getElementById('mm_ism_sessionlist').value;
  88. document.getElementById('mm_ism_savesessionname').value = name;
  89. var session = sessions[name];
  90. // ONLY ADJUST INPUT VALUES
  91. //car
  92. document.getElementById('carSelectorDropdown').value = session.car;
  93. dispEvent(document.getElementById('carSelectorDropdown'),'HTMLEvents','change');
  94. //track
  95. document.getElementById('trackSelectorDropdown').value = session.track.id;
  96. dispEvent(document.getElementById('trackSelectorDropdown'),'HTMLEvents','change');
  97. document.getElementById('configSelectorDropdown').value = session.track.config;
  98. dispEvent(document.getElementById('configSelectorDropdown'),'HTMLEvents','change');
  99. window.setTimeout(loadSession_part2,params.timeout);
  100. }
  101.  
  102. function loadSession_part2() {
  103. var name = document.getElementById('mm_ism_sessionlist').value;
  104. var session = sessions[name];
  105. if(params.switchToWeather)
  106. dispEvent(document.getElementById('weatherTestToggle'),'MouseEvent','click');
  107. //Night Mode
  108. document.getElementById('testingpanel_nightMode').checked = session.track.night;
  109. //weather
  110. //temp
  111. document.getElementById('weatherTestweatherTempChoice').value = session.weather.tempUnit
  112. document.getElementById('weatherTestWeatherTemp').value = session.weather.temp;
  113. var minTemp, maxTemp, numTemp;
  114. var tempSliderVal;
  115. if(session.weather.tempUnit == 0){ //Celcius
  116. minTemp = 65.0;
  117. maxTemp = 90.0;
  118. }
  119. if(session.weather.tempUnit == 1) { //Fahrenheit
  120. minTemp = 18.0;
  121. maxTemp = 32.0;
  122. }
  123. numTemp = session.weather.temp;
  124. tempSliderVal = (100.0/(maxTemp-minTemp))*(numTemp-minTemp);
  125. document.getElementById('testTempSlider').childNodes[0].style.height = tempSliderVal.toString() + "%";
  126. document.getElementById('testTempSlider').childNodes[1].style.bottom = tempSliderVal.toString() + "%";
  127.  
  128. //humidity
  129. document.getElementById('testHumiditySliderValue').value = session.weather.humidity;
  130. document.getElementById('testingFog').value = session.weather.fog;
  131. document.getElementById('testHumiditySliderValue').value = session.weather.humidity;
  132. document.getElementById('testingFog').value = session.weather.fog;
  133. sliderVal = 0.5*(session.weather.humidity + session.weather.fog);
  134. document.getElementById('testHumiditySlider').childNodes[0].style.height = sliderVal.toString() + "%";
  135. document.getElementById('testHumiditySlider').childNodes[1].style.bottom = sliderVal.toString() + "%";
  136. var fog = session.weather.fog;
  137. var testFogWarning = document.getElementById('testFogWarning');
  138. var testFogValue = document.getElementById('testFogValue');
  139. if(fog > 0) {
  140. testFogValue.style.display = "block";
  141. testFogValue.innerHTML = "Fog: " + fog + "%";
  142. } else {
  143. testFogValue.style.display = "none";
  144. }
  145. if(fog <= 25) {
  146. testFogWarning.className = 'testwarning';
  147. testFogWarning.title = '';
  148. } else if(26 <= fog && fog <= 39) {
  149. testFogWarning.className = 'testwarning low';
  150. testFogWarning.title = 'You have selected a fog level that may be dangerous to drive in.';
  151. } else {
  152. testFogWarning.className = 'testwarning high';
  153. testFogWarning.title = 'You have selected a level of fog that highly impairs vision. Use with caution!';
  154. };
  155. //Wind speed
  156. //workaround to fix iracing hpp
  157. document.getElementById('weatherTestweatherWindSpeedChoice').value = 0;
  158. dispEvent(document.getElementById('weatherTestweatherWindSpeedChoice'),'HTMLEvents','change');
  159. document.getElementById('weatherTestweatherWindSpeedChoice').value = 1;
  160. dispEvent(document.getElementById('weatherTestweatherWindSpeedChoice'),'HTMLEvents','change');
  161.  
  162. document.getElementById('weatherTestweatherWindSpeedChoice').value = session.weather.windSpeedUnit;
  163. dispEvent(document.getElementById('weatherTestweatherWindSpeedChoice'),'HTMLEvents','change');
  164. document.getElementById('weatherTestweatherWindSpeed').value = session.weather.windSpeed;
  165.  
  166. var maxWSpeed, numWSpeed;
  167. var windSliderVal;
  168. if(session.weather.windSpeedUnit== 0) //mph
  169. maxWSpeed = 30;
  170. else //kph
  171. maxWSpeed = 48;
  172. numWSpeed = session.weather.windSpeed;
  173. windSliderVal = (100.0/maxWSpeed)*numWSpeed;
  174. document.getElementById('testWindSlider').childNodes[0].style.height = windSliderVal.toString() + "%";
  175. document.getElementById('testWindSlider').childNodes[1].style.bottom = windSliderVal.toString() + "%";
  176. //winddir and cloudcover
  177. document.getElementById('weatherTestweatherWindDirection').value = session.weather.windDirection;
  178. document.getElementById('testCloudCover').value = session.weather.cloudCover;
  179. //random weather
  180. if(document.getElementById('testRandomWeather').checked != session.weather.random)
  181. dispEvent(document.getElementById('testRandomWeather'),'MouseEvent','click');
  182. document.getElementById('mm_ism_info').style.display = 'none';
  183. }
  184.  
  185.  
  186. function dispEvent(elem,evType1,evType2) {
  187. var event = document.createEvent(evType1);
  188. event.initEvent(evType2, true, true );
  189. elem.dispatchEvent(event);
  190. }
  191.  
  192.  
  193.  
  194. function UI_showFrame() {
  195. document.getElementById('mm_ism_mainframe').style.display = "block";
  196. }
  197.  
  198. function UI_hideFrame() {
  199. document.getElementById('mm_ism_mainframe').style.display = "none";
  200. }
  201.  
  202. function UI_refreshSessions() {
  203. //First, remove all entries
  204. var sessionList = document.getElementById('mm_ism_sessionlist');
  205. while (sessionList.firstChild) {
  206. sessionList.removeChild(sessionList.firstChild);
  207. }
  208. //Then add new ones
  209. for(var name in sessions) {
  210. var new_li = document.createElement('option');
  211. new_li.appendChild(document.createTextNode(name));
  212. new_li.value = name;
  213. sessionList.appendChild(new_li);
  214. }
  215. }
  216.  
  217. function UI_addElements() {
  218. //create Elements
  219. var testingpanel_testcar_button = document.getElementById('green_racepanel_btn');
  220. var mm_ism_mainbutton = testingpanel_testcar_button.cloneNode(true);
  221. mm_ism_mainbutton.id ="mainbutton";
  222. mm_ism_mainbutton.firstElementChild.innerHTML='Manage Sessions';
  223. mm_ism_mainbutton.addEventListener('click',UI_showFrame,false);
  224. var mainframe = document.createElement('div');
  225. mainframe.id = "mm_ism_mainframe";
  226. mainframe.innerHTML = "" +
  227. "<div>"+
  228. "<a id=\"mm_ism_closebutton\">[Close]</a>"+
  229. "</div>"+
  230. "<div>"+
  231. "Save:<br/>"+
  232. "<input id=\"mm_ism_savesessionname\" />"+
  233. "<input id=\"mm_ism_savesessionbutton\" type=\"button\" value=\"Save\" />"+
  234. "</div>"+
  235. "<div>"+
  236. "Load:<br/>"+
  237. "<select id=\"mm_ism_sessionlist\">"+
  238. "</select>"+
  239. "<input id=\"mm_ism_loadsessionbutton\" type=\"button\" value=\"Load\" />"+
  240. "<input id=\"mm_ism_deletesessionbutton\" type=\"button\" value=\"X\" />"+
  241. "</div>"+
  242. "<div id=\"mm_ism_info\">Loading session...</div>";
  243. var testingpanel_session = document.getElementById('testingpanel_session').parentNode;
  244. testingpanel_session.appendChild(mm_ism_mainbutton);
  245. testingpanel_session.insertBefore(mainframe, testingpanel_session.firstChild);
  246. document.getElementById('mm_ism_closebutton').addEventListener('click',UI_hideFrame,false);
  247. document.getElementById('mm_ism_savesessionbutton').addEventListener('click',saveSession,false);
  248. document.getElementById('mm_ism_loadsessionbutton').addEventListener('click',loadSession,false);
  249. document.getElementById('mm_ism_deletesessionbutton').addEventListener('click',removeSession,false);
  250. }
  251.  
  252. function UI_css() {
  253. css_string = "" +
  254. "#mm_ism_mainframe {" +
  255. " display:none;"+
  256. " position:relative;"+
  257. " margin:0px 0px 50px 0px;"+
  258. " padding:5px;"+
  259. " height:125px;"+
  260. " border: 1px solid black;"+
  261. " background-color:white" +
  262. "}"+
  263. "#mm_ism_info {"+
  264. " display:none"+
  265. "}";
  266. var css = document.createElement("style");
  267. css.type = "text/css";
  268. css.innerHTML = css_string;
  269. document.body.appendChild(css);
  270. }
  271.  
  272.  
  273.  
  274.  
  275.