From 184b03f1ce559bbe494666c700135172cc297bec Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Wed, 22 Apr 2020 20:28:33 +0100 Subject: [PATCH 01/13] Add /api/radio/ to SimpleServer.cs --- server/ETS2 Local Radio desktop/SimpleServer.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/server/ETS2 Local Radio desktop/SimpleServer.cs b/server/ETS2 Local Radio desktop/SimpleServer.cs index b7a45626b..6f0f49d8e 100644 --- a/server/ETS2 Local Radio desktop/SimpleServer.cs +++ b/server/ETS2 Local Radio desktop/SimpleServer.cs @@ -273,6 +273,16 @@ private void Process(HttpListenerContext context) context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); context.Response.OutputStream.Flush(); } + else if (context.Request.Url.AbsolutePath == "/api/radio/") + { + string json = "{\"Radio\":\"" + Station.RadioStation + "\",\"Signal\":\"" + Station.RadioSignal+ "\"}"; + string text = Newtonsoft.Json.JsonConvert.SerializeObject(json); + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Flush(); + } else if (context.Request.Url.AbsolutePath == "/commands/") { string text = Newtonsoft.Json.JsonConvert.SerializeObject(Main.commandsData); @@ -357,4 +367,4 @@ private void Initialize(string path, int port) _serverThread.Start(); } } -} \ No newline at end of file +} From a5fac82faee945ebbbd95cbd255b8933cdba1482 Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Wed, 22 Apr 2020 20:29:54 +0100 Subject: [PATCH 02/13] Update station.cs to support API/Radio --- server/ETS2 Local Radio desktop/Station.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/ETS2 Local Radio desktop/Station.cs b/server/ETS2 Local Radio desktop/Station.cs index eb5c1a792..ace88f42c 100644 --- a/server/ETS2 Local Radio desktop/Station.cs +++ b/server/ETS2 Local Radio desktop/Station.cs @@ -40,6 +40,9 @@ public struct Rect public static string NowPlaying = "Now playing:"; public static bool RTL = false; + public static string RadioStation = "-"; + public static string RadioSignal = "1"; + public static int Width = 0; public static int Height = 0; @@ -94,6 +97,10 @@ public static void SetStation(string name, string signal, string logoPath = null var stringSize = g.MeasureString(NowPlaying + " " + name, font); var nowPlayingSize = g.MeasureString(NowPlaying + " ", font); + + RadioStation = name; + RadioSignal = signal; + var nameSize = g.MeasureString(name, font); var topLeft = new PointF((512 / 2) - (stringSize.Width / 2) + 123, (bmp.Height / 2) - (stringSize.Height / 2)); From ca81576e675445e2f657ac7fafd11cdc3a7a32e8 Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Wed, 22 Apr 2020 20:37:37 +0100 Subject: [PATCH 03/13] Update SimpleServer.cs --- server/ETS2 Local Radio desktop/SimpleServer.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server/ETS2 Local Radio desktop/SimpleServer.cs b/server/ETS2 Local Radio desktop/SimpleServer.cs index 6f0f49d8e..1f48144d6 100644 --- a/server/ETS2 Local Radio desktop/SimpleServer.cs +++ b/server/ETS2 Local Radio desktop/SimpleServer.cs @@ -275,12 +275,11 @@ private void Process(HttpListenerContext context) } else if (context.Request.Url.AbsolutePath == "/api/radio/") { - string json = "{\"Radio\":\"" + Station.RadioStation + "\",\"Signal\":\"" + Station.RadioSignal+ "\"}"; - string text = Newtonsoft.Json.JsonConvert.SerializeObject(json); + string json = "{\"Radio\":\"" + Station.RadioStation + "\",\"Signal\":\"" + Station.RadioSignal + "\"}"; context.Response.ContentType = "application/json"; - context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(json).Length; context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(json), 0, Encoding.UTF8.GetBytes(json).Length); context.Response.OutputStream.Flush(); } else if (context.Request.Url.AbsolutePath == "/commands/") From 44332da18e903d7e70cbb3076d1699594230851e Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Sat, 25 Apr 2020 23:00:05 +0100 Subject: [PATCH 04/13] Add files via upload --- .../ETS2 Local Radio desktop/SimpleServer.cs | 749 +++++++++--------- 1 file changed, 390 insertions(+), 359 deletions(-) diff --git a/server/ETS2 Local Radio desktop/SimpleServer.cs b/server/ETS2 Local Radio desktop/SimpleServer.cs index b7a45626b..5b36f488e 100644 --- a/server/ETS2 Local Radio desktop/SimpleServer.cs +++ b/server/ETS2 Local Radio desktop/SimpleServer.cs @@ -1,360 +1,391 @@ -// MIT License - Copyright (c) 2016 Can Güney Aksakalli - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Net.Sockets; -using System.Net; -using System.IO; -using System.Threading; -using System.Diagnostics; -using System.Threading.Tasks; -using System.Windows.Forms; -using System.Text.RegularExpressions; - -namespace ETS2_Local_Radio_server -{ - public class SimpleHTTPServer - { - private readonly string[] _indexFiles = { - "index.html", - "index.htm", - "default.html", - "default.htm" - }; - - private static IDictionary _mimeTypeMappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { - #region extension to MIME type list - {".asf", "video/x-ms-asf"}, - {".asx", "video/x-ms-asf"}, - {".avi", "video/x-msvideo"}, - {".bin", "application/octet-stream"}, - {".cco", "application/x-cocoa"}, - {".crt", "application/x-x509-ca-cert"}, - {".css", "text/css"}, - {".deb", "application/octet-stream"}, - {".der", "application/x-x509-ca-cert"}, - {".dll", "application/octet-stream"}, - {".dmg", "application/octet-stream"}, - {".ear", "application/java-archive"}, - {".eot", "application/octet-stream"}, - {".exe", "application/octet-stream"}, - {".flv", "video/x-flv"}, - {".gif", "image/gif"}, - {".hqx", "application/mac-binhex40"}, - {".htc", "text/x-component"}, - {".htm", "text/html"}, - {".html", "text/html"}, - {".ico", "image/x-icon"}, - {".img", "application/octet-stream"}, - {".iso", "application/octet-stream"}, - {".jar", "application/java-archive"}, - {".jardiff", "application/x-java-archive-diff"}, - {".jng", "image/x-jng"}, - {".jnlp", "application/x-java-jnlp-file"}, - {".jpeg", "image/jpeg"}, - {".jpg", "image/jpeg"}, - {".js", "application/x-javascript"}, - {".json", "application/json"}, - {".mml", "text/mathml"}, - {".mng", "video/x-mng"}, - {".mov", "video/quicktime"}, - {".mp3", "audio/mpeg"}, - {".mpeg", "video/mpeg"}, - {".mpg", "video/mpeg"}, - {".msi", "application/octet-stream"}, - {".msm", "application/octet-stream"}, - {".msp", "application/octet-stream"}, - {".pdb", "application/x-pilot"}, - {".pdf", "application/pdf"}, - {".pem", "application/x-x509-ca-cert"}, - {".pl", "application/x-perl"}, - {".pm", "application/x-perl"}, - {".png", "image/png"}, - {".prc", "application/x-pilot"}, - {".ra", "audio/x-realaudio"}, - {".rar", "application/x-rar-compressed"}, - {".rpm", "application/x-redhat-package-manager"}, - {".rss", "text/xml"}, - {".run", "application/x-makeself"}, - {".sea", "application/x-sea"}, - {".shtml", "text/html"}, - {".sit", "application/x-stuffit"}, - {".svg", "image/svg+xml"}, - {".swf", "application/x-shockwave-flash"}, - {".tcl", "application/x-tcl"}, - {".tk", "application/x-tcl"}, - {".txt", "text/plain"}, - {".war", "application/java-archive"}, - {".wbmp", "image/vnd.wap.wbmp"}, - {".wmv", "video/x-ms-wmv"}, - {".xml", "text/xml"}, - {".xpi", "application/x-xpinstall"}, - {".zip", "application/zip"}, - #endregion - }; - private Thread _serverThread; - private string _rootDirectory; - private HttpListener _listener; - private int _port; - - public int Port - { - get { return _port; } - private set { } - } - - /// - /// Construct server with given port. - /// - /// Directory path to serve. - /// Port of the server. - public SimpleHTTPServer(string path, int port) - { - this.Initialize(path, port); - } - - /// - /// Construct server with suitable port. - /// - /// Directory path to serve. - public SimpleHTTPServer(string path) - { - //get an empty port - TcpListener l = new TcpListener(IPAddress.Loopback, 0); - l.Start(); - int port = ((IPEndPoint)l.LocalEndpoint).Port; - l.Stop(); - this.Initialize(path, port); - } - - /// - /// Stop server and dispose all functions. - /// - public void Stop() - { - _serverThread.Abort(); - _listener.Stop(); - } - - private void Listen() - { - try - { - _listener = new HttpListener(); - _listener.Prefixes.Add("http://+:" + _port.ToString() + "/"); - TimeSpan timeOut = TimeSpan.FromSeconds(2); - /* - _listener.TimeoutManager.DrainEntityBody = timeOut; - _listener.TimeoutManager.EntityBody = timeOut; - _listener.TimeoutManager.HeaderWait = timeOut; - _listener.TimeoutManager.IdleConnection = timeOut; - _listener.TimeoutManager.RequestQueue = timeOut; - */ - _listener.Start(); - while (true) - { - try - { - HttpListenerContext context = _listener.GetContext(); - new Task(() => { Process(context); }).Start(); - //Process(context); - } - catch (Exception ex) - { - Log.Write(ex.ToString()); - } - } - } - catch (Exception ex) - { - Log.Write(ex.ToString()); - } - } - - private void Process(HttpListenerContext context) - { - context.Response.AddHeader("Cache-Control", "no-store, must-revalidate"); - context.Response.AddHeader("Access-Control-Allow-Origin", "http://localradio.koenvh.nl"); - - string filename = context.Request.Url.AbsolutePath; - //Console.WriteLine(filename); - if (filename.Contains("?")) - { - filename = filename.Split("?".ToCharArray())[0]; - } - //filename = filename.Replace("%20", " "); - filename = WebUtility.UrlDecode(filename); - filename = filename.Substring(1); - if (filename.Contains("/")) - filename = filename.Replace("/", @"\"); - if (string.IsNullOrEmpty(filename)) - { - foreach (string indexFile in _indexFiles) - { - if (File.Exists(Path.Combine(_rootDirectory, indexFile))) - { - filename = indexFile; - break; - } - } - } - - filename = Path.Combine(_rootDirectory, filename); - - if (context.Request.Url.AbsolutePath.StartsWith("/favourite/")) - { - string favourite = context.Request.Url.AbsoluteUri; - favourite = WebUtility.UrlDecode(favourite); - favourite = favourite.Split(new string[] { "/favourite/" }, StringSplitOptions.None)[1]; - Console.WriteLine(favourite); - try - { - string[] favouriteArray = favourite.Split(new string[] { "/" }, StringSplitOptions.None); - string text = ""; - if (favouriteArray.Length == 1 && favourite == "") - { - text = Favourites.Get(""); - } - else if (favouriteArray.Length == 1) - { - text = "{\"Name\": \"" + Favourites.Get(favourite) + "\"}"; - } - else - { - Favourites.Set(favouriteArray[0], favouriteArray[1]); - Favourites.Save(); - text = "{\"Success\": true}"; - - } - context.Response.ContentType = "application/json"; - context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, - Encoding.UTF8.GetBytes(text).Length); - context.Response.OutputStream.Flush(); - } - catch (Exception exception) - { - Log.Write(exception.ToString()); - } - } - else if (context.Request.Url.AbsolutePath.StartsWith("/station/")) - { - string station = context.Request.Url.AbsoluteUri; - station = WebUtility.UrlDecode(station); - station = station.Split(new string[] { "/station/" }, StringSplitOptions.None)[1]; - Console.WriteLine(station); - try - { - Station.SetStation(station.Split("/".ToCharArray())[0], station.Split("/".ToCharArray())[1], station.Split("?".ToCharArray())[1]); - } - catch (Exception) - { - Station.SetStation(station.Split("/".ToCharArray())[0], "0"); - } - - string text = "{\"Success\": true}"; - - context.Response.ContentType = "application/json"; - context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); - context.Response.OutputStream.Flush(); - } - else if (context.Request.Url.AbsolutePath == "/api/") - { - string text = Newtonsoft.Json.JsonConvert.SerializeObject(Main.ets2data); - - context.Response.ContentType = "application/json"; - context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); - context.Response.OutputStream.Flush(); - } - else if (context.Request.Url.AbsolutePath == "/commands/") - { - string text = Newtonsoft.Json.JsonConvert.SerializeObject(Main.commandsData); - - context.Response.ContentType = "application/json"; - context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); - context.Response.OutputStream.Flush(); - } - else if (context.Request.Url.AbsolutePath.StartsWith("/eskago/")) - { - string station = context.Request.Url.AbsoluteUri; - station = WebUtility.UrlDecode(station); - station = station.Split(new string[] { "/eskago/" }, StringSplitOptions.None)[1]; - - HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.eskago.pl/radio/" + station); - request.AutomaticDecompression = DecompressionMethods.GZip; - - using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) - using (Stream stream = response.GetResponseStream()) - using (StreamReader reader = new StreamReader(stream)) - { - string data = reader.ReadToEnd(); - - Regex streamRegex = new Regex(@".*streamUrl\s=\s'(.+)';.*"); - string baseUrl = streamRegex.Match(data).Groups[1].Value; - - Regex icsuRegex = new Regex(".*icsu\"\\svalue=\"(.+)\"\\s.*"); - string append = icsuRegex.Match(data).Groups[1].Value; - - context.Response.RedirectLocation = baseUrl + append; - context.Response.StatusCode = 302; - context.Response.OutputStream.Flush(); - } - } - else if (File.Exists(filename)) - { - try - { - Stream input = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - - //Adding permanent http response headers - string mime; - context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) - ? mime - : "application/octet-stream"; - context.Response.ContentLength64 = input.Length; - //context.Response.AddHeader("Date", DateTime.Now.ToString("r")); - //context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r")); - byte[] buffer = new byte[1024 * 16]; - int nbytes; - while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0) - context.Response.OutputStream.Write(buffer, 0, nbytes); - input.Close(); - - context.Response.StatusCode = (int)HttpStatusCode.OK; - context.Response.OutputStream.Flush(); - } - catch (Exception ex) - { - context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - Log.Write(ex.ToString()); - } - - } - else - { - //context.Response.AddHeader("X-Requested-File", filename); - context.Response.StatusCode = (int)HttpStatusCode.NotFound; - Log.Write("Not found: " + filename); - } - - context.Response.OutputStream.Close(); - } - - private void Initialize(string path, int port) - { - this._rootDirectory = path; - this._port = port; - _serverThread = new Thread(this.Listen); - _serverThread.Start(); - } - } +// MIT License - Copyright (c) 2016 Can Güney Aksakalli + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Net.Sockets; +using System.Net; +using System.IO; +using System.Threading; +using System.Diagnostics; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Text.RegularExpressions; + +namespace ETS2_Local_Radio_server +{ + public class SimpleHTTPServer + { + private readonly string[] _indexFiles = { + "index.html", + "index.htm", + "default.html", + "default.htm" + }; + + private static IDictionary _mimeTypeMappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { + #region extension to MIME type list + {".asf", "video/x-ms-asf"}, + {".asx", "video/x-ms-asf"}, + {".avi", "video/x-msvideo"}, + {".bin", "application/octet-stream"}, + {".cco", "application/x-cocoa"}, + {".crt", "application/x-x509-ca-cert"}, + {".css", "text/css"}, + {".deb", "application/octet-stream"}, + {".der", "application/x-x509-ca-cert"}, + {".dll", "application/octet-stream"}, + {".dmg", "application/octet-stream"}, + {".ear", "application/java-archive"}, + {".eot", "application/octet-stream"}, + {".exe", "application/octet-stream"}, + {".flv", "video/x-flv"}, + {".gif", "image/gif"}, + {".hqx", "application/mac-binhex40"}, + {".htc", "text/x-component"}, + {".htm", "text/html"}, + {".html", "text/html"}, + {".ico", "image/x-icon"}, + {".img", "application/octet-stream"}, + {".iso", "application/octet-stream"}, + {".jar", "application/java-archive"}, + {".jardiff", "application/x-java-archive-diff"}, + {".jng", "image/x-jng"}, + {".jnlp", "application/x-java-jnlp-file"}, + {".jpeg", "image/jpeg"}, + {".jpg", "image/jpeg"}, + {".js", "application/x-javascript"}, + {".json", "application/json"}, + {".mml", "text/mathml"}, + {".mng", "video/x-mng"}, + {".mov", "video/quicktime"}, + {".mp3", "audio/mpeg"}, + {".mpeg", "video/mpeg"}, + {".mpg", "video/mpeg"}, + {".msi", "application/octet-stream"}, + {".msm", "application/octet-stream"}, + {".msp", "application/octet-stream"}, + {".pdb", "application/x-pilot"}, + {".pdf", "application/pdf"}, + {".pem", "application/x-x509-ca-cert"}, + {".pl", "application/x-perl"}, + {".pm", "application/x-perl"}, + {".png", "image/png"}, + {".prc", "application/x-pilot"}, + {".ra", "audio/x-realaudio"}, + {".rar", "application/x-rar-compressed"}, + {".rpm", "application/x-redhat-package-manager"}, + {".rss", "text/xml"}, + {".run", "application/x-makeself"}, + {".sea", "application/x-sea"}, + {".shtml", "text/html"}, + {".sit", "application/x-stuffit"}, + {".svg", "image/svg+xml"}, + {".swf", "application/x-shockwave-flash"}, + {".tcl", "application/x-tcl"}, + {".tk", "application/x-tcl"}, + {".txt", "text/plain"}, + {".war", "application/java-archive"}, + {".wbmp", "image/vnd.wap.wbmp"}, + {".wmv", "video/x-ms-wmv"}, + {".xml", "text/xml"}, + {".xpi", "application/x-xpinstall"}, + {".zip", "application/zip"}, + #endregion + }; + private Thread _serverThread; + private string _rootDirectory; + private HttpListener _listener; + private int _port; + private int _radioSignal; + + public int Port + { + get { return _port; } + private set { } + } + public int RadioSignal + { + get { return _radioSignal; } + set { _radioSignal = value; } + } + + /// + /// Construct server with given port. + /// + /// Directory path to serve. + /// Port of the server. + public SimpleHTTPServer(string path, int port) + { + this.Initialize(path, port); + } + + /// + /// Construct server with suitable port. + /// + /// Directory path to serve. + public SimpleHTTPServer(string path) + { + //get an empty port + TcpListener l = new TcpListener(IPAddress.Loopback, 0); + l.Start(); + int port = ((IPEndPoint)l.LocalEndpoint).Port; + l.Stop(); + this.Initialize(path, port); + } + + /// + /// Stop server and dispose all functions. + /// + public void Stop() + { + _serverThread.Abort(); + _listener.Stop(); + } + + private void Listen() + { + try + { + _listener = new HttpListener(); + _listener.Prefixes.Add("http://+:" + _port.ToString() + "/"); + TimeSpan timeOut = TimeSpan.FromSeconds(2); + /* + _listener.TimeoutManager.DrainEntityBody = timeOut; + _listener.TimeoutManager.EntityBody = timeOut; + _listener.TimeoutManager.HeaderWait = timeOut; + _listener.TimeoutManager.IdleConnection = timeOut; + _listener.TimeoutManager.RequestQueue = timeOut; + */ + _listener.Start(); + while (true) + { + try + { + HttpListenerContext context = _listener.GetContext(); + new Task(() => { Process(context); }).Start(); + //Process(context); + } + catch (Exception ex) + { + Log.Write(ex.ToString()); + } + } + } + catch (Exception ex) + { + Log.Write(ex.ToString()); + } + } + + private void Process(HttpListenerContext context) + { + context.Response.AddHeader("Cache-Control", "no-store, must-revalidate"); + context.Response.AddHeader("Access-Control-Allow-Origin", "http://localradio.koenvh.nl"); + + string filename = context.Request.Url.AbsolutePath; + //Console.WriteLine(filename); + if (filename.Contains("?")) + { + filename = filename.Split("?".ToCharArray())[0]; + } + //filename = filename.Replace("%20", " "); + filename = WebUtility.UrlDecode(filename); + filename = filename.Substring(1); + if (filename.Contains("/")) + filename = filename.Replace("/", @"\"); + if (string.IsNullOrEmpty(filename)) + { + foreach (string indexFile in _indexFiles) + { + if (File.Exists(Path.Combine(_rootDirectory, indexFile))) + { + filename = indexFile; + break; + } + } + } + + filename = Path.Combine(_rootDirectory, filename); + + if (context.Request.Url.AbsolutePath.StartsWith("/favourite/")) + { + string favourite = context.Request.Url.AbsoluteUri; + favourite = WebUtility.UrlDecode(favourite); + favourite = favourite.Split(new string[] { "/favourite/" }, StringSplitOptions.None)[1]; + Console.WriteLine(favourite); + try + { + string[] favouriteArray = favourite.Split(new string[] { "/" }, StringSplitOptions.None); + string text = ""; + if (favouriteArray.Length == 1 && favourite == "") + { + text = Favourites.Get(""); + } + else if (favouriteArray.Length == 1) + { + text = "{\"Name\": \"" + Favourites.Get(favourite) + "\"}"; + } + else + { + Favourites.Set(favouriteArray[0], favouriteArray[1]); + Favourites.Save(); + text = "{\"Success\": true}"; + + } + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, + Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Flush(); + } + catch (Exception exception) + { + Log.Write(exception.ToString()); + } + } + else if (context.Request.Url.AbsolutePath.StartsWith("/station/")) + { + string station = context.Request.Url.AbsoluteUri; + station = WebUtility.UrlDecode(station); + station = station.Split(new string[] { "/station/" }, StringSplitOptions.None)[1]; + Console.WriteLine(station); + try + { + Station.SetStation(station.Split("/".ToCharArray())[0], station.Split("/".ToCharArray())[1], station.Split("?".ToCharArray())[1]); + } + catch (Exception) + { + Station.SetStation(station.Split("/".ToCharArray())[0], "0"); + } + + string text = "{\"Success\": true}"; + + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Flush(); + } + else if (context.Request.Url.AbsolutePath == "/api/") + { + string text = Newtonsoft.Json.JsonConvert.SerializeObject(Main.ets2data); + + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Flush(); + } + else if (context.Request.Url.AbsolutePath == "/api/radio/") + { + string json = "{\"Radio\":\"" + Station.RadioStation + "\",\"Signal\":\"" + RadioSignal + "\"}"; + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(json).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(json), 0, Encoding.UTF8.GetBytes(json).Length); + context.Response.OutputStream.Flush(); + } + else if (context.Request.Url.AbsolutePath.StartsWith("/api/radio/set/")) + { + string station = context.Request.Url.AbsoluteUri; + station = WebUtility.UrlDecode(station); + station = station.Split(new string[] { "/api/radio/set/" }, StringSplitOptions.None)[1]; + + RadioSignal = Int32.Parse(station.Split("/".ToCharArray())[0]); + + string text = "{\"Success\": true}"; + + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Flush(); + } + else if (context.Request.Url.AbsolutePath == "/commands/") + { + string text = Newtonsoft.Json.JsonConvert.SerializeObject(Main.commandsData); + + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Flush(); + } + else if (context.Request.Url.AbsolutePath.StartsWith("/eskago/")) + { + string station = context.Request.Url.AbsoluteUri; + station = WebUtility.UrlDecode(station); + station = station.Split(new string[] { "/eskago/" }, StringSplitOptions.None)[1]; + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.eskago.pl/radio/" + station); + request.AutomaticDecompression = DecompressionMethods.GZip; + + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + using (Stream stream = response.GetResponseStream()) + using (StreamReader reader = new StreamReader(stream)) + { + string data = reader.ReadToEnd(); + + Regex streamRegex = new Regex(@".*streamUrl\s=\s'(.+)';.*"); + string baseUrl = streamRegex.Match(data).Groups[1].Value; + + Regex icsuRegex = new Regex(".*icsu\"\\svalue=\"(.+)\"\\s.*"); + string append = icsuRegex.Match(data).Groups[1].Value; + + context.Response.RedirectLocation = baseUrl + append; + context.Response.StatusCode = 302; + context.Response.OutputStream.Flush(); + } + } + else if (File.Exists(filename)) + { + try + { + Stream input = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + + //Adding permanent http response headers + string mime; + context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) + ? mime + : "application/octet-stream"; + context.Response.ContentLength64 = input.Length; + //context.Response.AddHeader("Date", DateTime.Now.ToString("r")); + //context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r")); + byte[] buffer = new byte[1024 * 16]; + int nbytes; + while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0) + context.Response.OutputStream.Write(buffer, 0, nbytes); + input.Close(); + + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Flush(); + } + catch (Exception ex) + { + context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + Log.Write(ex.ToString()); + } + + } + else + { + //context.Response.AddHeader("X-Requested-File", filename); + context.Response.StatusCode = (int)HttpStatusCode.NotFound; + Log.Write("Not found: " + filename); + } + + context.Response.OutputStream.Close(); + } + + private void Initialize(string path, int port) + { + this._rootDirectory = path; + this._port = port; + _serverThread = new Thread(this.Listen); + _serverThread.Start(); + } + } } \ No newline at end of file From f6b624b70959a513d904de1e4eb99d00f51ae342 Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Sun, 26 Apr 2020 00:37:15 +0100 Subject: [PATCH 05/13] Update main.js --- web/lib/js/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/lib/js/main.js b/web/lib/js/main.js index 42f0a3434..8b9f35563 100644 --- a/web/lib/js/main.js +++ b/web/lib/js/main.js @@ -306,6 +306,7 @@ function refresh(data) { */ } else { setWhitenoise(available_countries[g_current_country]["whitenoise"]); + $.post(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise) + "/"); g_countries = available_countries; } From e37f9ed6b1af1fe0228a1e13b73f3be24d187112 Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Sun, 26 Apr 2020 00:39:38 +0100 Subject: [PATCH 06/13] Update main.js --- web/lib/js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/lib/js/main.js b/web/lib/js/main.js index 8b9f35563..5085d753b 100644 --- a/web/lib/js/main.js +++ b/web/lib/js/main.js @@ -79,6 +79,7 @@ function initialise() { $.getJSON(g_api + "/api/", function (data) { refresh(data); }); + $.post(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise) + "/"); }, 1000); setInterval(function () { @@ -306,7 +307,6 @@ function refresh(data) { */ } else { setWhitenoise(available_countries[g_current_country]["whitenoise"]); - $.post(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise) + "/"); g_countries = available_countries; } From 0f48adcd283bfbebf440f9b8f9ea59900e055d96 Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Sun, 26 Apr 2020 00:40:11 +0100 Subject: [PATCH 07/13] Add files via upload --- server/ETS2 Local Radio desktop/SimpleServer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/ETS2 Local Radio desktop/SimpleServer.cs b/server/ETS2 Local Radio desktop/SimpleServer.cs index 5b36f488e..9b53f3db2 100644 --- a/server/ETS2 Local Radio desktop/SimpleServer.cs +++ b/server/ETS2 Local Radio desktop/SimpleServer.cs @@ -98,14 +98,14 @@ public class SimpleHTTPServer private string _rootDirectory; private HttpListener _listener; private int _port; - private int _radioSignal; + private string _radioSignal; public int Port { get { return _port; } private set { } } - public int RadioSignal + public string RadioSignal { get { return _radioSignal; } set { _radioSignal = value; } @@ -294,7 +294,7 @@ private void Process(HttpListenerContext context) station = WebUtility.UrlDecode(station); station = station.Split(new string[] { "/api/radio/set/" }, StringSplitOptions.None)[1]; - RadioSignal = Int32.Parse(station.Split("/".ToCharArray())[0]); + RadioSignal = station.Split("/".ToCharArray())[0]; string text = "{\"Success\": true}"; From 2956f7d361532b08b2fa0817d0f11431dc9610bb Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Sun, 26 Apr 2020 00:55:08 +0100 Subject: [PATCH 08/13] Update main.js --- web/lib/js/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/lib/js/main.js b/web/lib/js/main.js index 42f0a3434..5085d753b 100644 --- a/web/lib/js/main.js +++ b/web/lib/js/main.js @@ -79,6 +79,7 @@ function initialise() { $.getJSON(g_api + "/api/", function (data) { refresh(data); }); + $.post(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise) + "/"); }, 1000); setInterval(function () { From c18082e5c02391ddf531a201f3454ec61d86453d Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Sun, 26 Apr 2020 00:57:15 +0100 Subject: [PATCH 09/13] Update SimpleServer.cs --- .../ETS2 Local Radio desktop/SimpleServer.cs | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/server/ETS2 Local Radio desktop/SimpleServer.cs b/server/ETS2 Local Radio desktop/SimpleServer.cs index 1f48144d6..949a8f3ed 100644 --- a/server/ETS2 Local Radio desktop/SimpleServer.cs +++ b/server/ETS2 Local Radio desktop/SimpleServer.cs @@ -104,6 +104,12 @@ public int Port get { return _port; } private set { } } + + public string RadioSignal + { + get { return _radioSignal; } + set { _radioSignal = value; } + } /// /// Construct server with given port. @@ -275,13 +281,29 @@ private void Process(HttpListenerContext context) } else if (context.Request.Url.AbsolutePath == "/api/radio/") { - string json = "{\"Radio\":\"" + Station.RadioStation + "\",\"Signal\":\"" + Station.RadioSignal + "\"}"; + string json = "{\"Radio\":\"" + Station.RadioStation + "\",\"Signal\":\"" + RadioSignal + "\"}"; context.Response.ContentType = "application/json"; context.Response.ContentLength64 = Encoding.UTF8.GetBytes(json).Length; context.Response.StatusCode = (int)HttpStatusCode.OK; context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(json), 0, Encoding.UTF8.GetBytes(json).Length); context.Response.OutputStream.Flush(); } + else if (context.Request.Url.AbsolutePath.StartsWith("/api/radio/set/")) + { + string station = context.Request.Url.AbsoluteUri; + station = WebUtility.UrlDecode(station); + station = station.Split(new string[] { "/api/radio/set/" }, StringSplitOptions.None)[1]; + + RadioSignal = station.Split("/".ToCharArray())[0]; + + string text = "{\"Success\": true}"; + + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = Encoding.UTF8.GetBytes(text).Length; + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.OutputStream.Write(Encoding.UTF8.GetBytes(text), 0, Encoding.UTF8.GetBytes(text).Length); + context.Response.OutputStream.Flush(); + } else if (context.Request.Url.AbsolutePath == "/commands/") { string text = Newtonsoft.Json.JsonConvert.SerializeObject(Main.commandsData); From ed201f8fc226d7dcbaaeab7ec097a67d9c5ddccb Mon Sep 17 00:00:00 2001 From: N95JPL <37276225+N95JPL@users.noreply.github.com> Date: Sat, 9 May 2020 18:25:48 +0100 Subject: [PATCH 10/13] All working as it should now! --- server/.vs/ETS2 Local Radio desktop/v16/.suo | Bin 203776 -> 203776 bytes .../Capture.csproj.CoreCompileInputs.cache | 1 + .../Capture.csproj.FileListAbsolute.txt | 13 ++++++ .../Capture.csproj.GenerateResource.cache | Bin 954 -> 954 bytes .../Capture.csprojAssemblyReference.cache | Bin 37800 -> 89206 bytes server/Capture/obj/Release/Capture.dll | Bin 107520 -> 107520 bytes server/Capture/obj/Release/Capture.pdb | Bin 230912 -> 230912 bytes .../ETS2 Local Radio desktop.csproj | 2 +- .../ETS2 Local Radio desktop/SimpleServer.cs | 23 +++++++++-- server/ETS2 Local Radio desktop/Station.cs | 7 +++- server/plugins/Ets2SdkClient.dll | Bin 0 -> 37888 bytes server/plugins/LICENSE.txt | 39 ++++++++++++++++++ server/plugins/README.txt | 4 ++ .../ets2-telemetry.dll | Bin 0 -> 20992 bytes .../bin/win_x64/plugins/ets2-telemetry.dll | Bin 0 -> 15872 bytes .../bin/win_x86/plugins/ets2-telemetry.dll | Bin 0 -> 14336 bytes web/lib/js/main.js | 3 +- 17 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 server/Capture/obj/Release/Capture.csproj.CoreCompileInputs.cache create mode 100644 server/plugins/Ets2SdkClient.dll create mode 100644 server/plugins/LICENSE.txt create mode 100644 server/plugins/README.txt create mode 100644 server/plugins/alternative_ets2-telemetry.dll/ets2-telemetry.dll create mode 100644 server/plugins/bin/win_x64/plugins/ets2-telemetry.dll create mode 100644 server/plugins/bin/win_x86/plugins/ets2-telemetry.dll diff --git a/server/.vs/ETS2 Local Radio desktop/v16/.suo b/server/.vs/ETS2 Local Radio desktop/v16/.suo index 091011ad4c5b27fe64d6a35a1da1b938803e495c..abcaf369a7f0f10c3052b644af3829eecc33f596 100644 GIT binary patch delta 16357 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 T@X&s=bfqqsI&{H`Q=0z*WAD~x delta 8200 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 gX?Xz3LD5yhEX6n delta 34 lcmdnRzKeZBD-$E*<~AlpMq&4PH+{E%y4Jxc$jbl$+yKUw31|QS diff --git a/server/Capture/obj/Release/Capture.csprojAssemblyReference.cache b/server/Capture/obj/Release/Capture.csprojAssemblyReference.cache index 92251392a82d5ae475f492d5526e7c0027aa3047..095a15fdf3e81ceb7f1ca7fb6e766a55ce3a52bb 100644 GIT binary patch literal 89206 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 WC!i~2js$ceOdwEbv}KIf8vh^Fs%lRF literal 37800 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 XA+rBu2(T66PA35p+xfxxNd5jFt!OTW diff --git a/server/Capture/obj/Release/Capture.dll b/server/Capture/obj/Release/Capture.dll index c36534210d3f8d22e56e5176da72afa0fdc84aa0..3590b909c885fd1593bf01ca164560664a73bf95 100644 GIT binary patch delta 1606 zcmbVMZA@Eb6n@Vw6sT>-C~YZ}4O(!U^0DC$qOeT@NGB>}j4Wu!pxm~!4En`~8A2<{ zz_7V>_s1Kv3hv8n8a3LvZnCMFW|SEBPArdvwAjB;(GGgMnw=E)WiScc2&vVat z&ilUSIXA}_7W=~DBg3K-SI+xKGU1m0Y@z7=JjOqrEBB29sUf&N1u`u1XDg&LK&1F? z_y~xWt_?sQ*8m$}ihB{f`R9<$F9SXdi6^Zm2|1$#k|cNuNxlf=0^%@QAGZbc!CJ;{ zl`o_ar#oIjoGO)Dq2R){Vn(mvz@82ZoYtPf6f3w#?fGfdJVUF(VMrX~zQx_{W|I$RWAJtSOH`$%@+Vn(N|WE_ zofrRh20!RYPk;&Trni7w>Q_rLbi}!FfDlO{=kjH8TYYk_%ByDf>bNGaQ{Ywpo0E(2 zAnQ|#U?RBxr6MN%l#UR6eH}@>gDRi``l|XJ6=>7$1g{QGO*2Co^o?fN2r@d+43D5$ zY=&|)B_?<{Vl=eh1Sv@}A|ZXGgvjWO4YK32NH4-IEuf^=OhUeZH@hH?%3B}@bJ0=! z&$LWB%0i+jnyI1lP7u>66G-XDEsz#TQPS0WJg|H;kx)O2C$g+?zz_?YFzG!O8X`tX zwPw)8@J=&4h`6vDH1voWBrEPRW`>$rNNj<|6(O5Nkl~mGGLi9{6_amRz!<|7R$)`Y zKVXH2V*byqP!PeMHT-?EqQ5>=$~@dXBkK6R z0}RnLp)*&zKpyRIL=)_dlFoO*w&i;wZ*R0Fo&pEP?;+(qwc%TGKUo@Fa1z5P%kJfq z{<|WpDmSgDu_=PT{2x^c7r{>^vJNWWa{ko*)#iwURT-q1P9{*$C^_JGV=BnwWz)wZBp?7^d)*SYB?>{;^|Al0G z?fRTg1}A*4ogPs9Dedb>oygrT3glR8F28f|mBHWBD<@~Zav#>!n@8{9MJU-N;)8A1%&b7AG?s0J5{LqE6Bq zdX`x-K6B{O&-0GP{O9@cT>hA`-eY!qjCO~owaZxHXz6ML%(-zo8vr&WABDRj=IfHs+7qw<{>=%00sK(8mjD0& delta 1326 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 M!O*wpf#tg` zpX01mrb&eBC#BI!?jlpd_Gg(-r3`zHDN&b5%!Xx6pUD95+;7L0V)<&HBkr5Rwi(8| zm0D^$t4nX@^_ZUgYRvD~f9+qWw@&k3sAlD<@YjR=q+>Rm&KsgpUF^Mu$u%4$J@(Y+ ze$n2(xo&f&%g@FJmR|eeuH5x$T++KCHu;G~XZMI)TJ4FK(&XPvULGIVcyn!4#;sc? zdownNf6z_bP;%a7FfVdNse`ReR^A@AG*ms;d97RRI$et{TefdgG}U@+NYH)RTjZ9! z$bTPrW=lj%ONIHP)b;g?vU~?OB%E~^vext$dF{2`0yoLm%E!XX%a*j$(WxOxYX|IH*dVGaKVmS#=*il>L;fkRDY)a9<=-jfudeCees9_-eMs-l zLCae?U#qIb5gV*>_BI_YBRh2xsOmUBQm~1?BZqcM>uce~8PltPKyIWU#;fl{G z4`avj%DmI(Ti)ATe)ea;h@M^r0dkRZofbOk-I<>G2{v1wCXAf7WPq%9(W|~`-Db}TK<0LSMXx%)~*6)=4%!Fsxr3A z$Yh7CLp=+buZtJl?sq8U;?mP0ee`2T`s@f5)iHlLH^mFU#%IY_IA&c@ox+&rcT)XP^(U_Y=w4UgXfiC zk>jo3kBzG8d&uXf$fBF~jz{-NzP?=DG*msT^XM~)g_o^FZuF(47w-}$5D@ej@vXRG`rpyzW>wndlA1_H#F?Zy#N0C zg!e@g1$`#IR?D{~#`aulJ;2}Kr-i}XQngCy;Z2ggPxAA}zFV&Fz9V4ceXVX-AFIDr z82%})I-#V;N$KNbyH`d%sVQCi(A|Bi-Hb@FbvJj;o;K8N%Hpa@>om^^ukK`;Up*IL zAC~p8&#X(azQ0t6oYB<6z#}*JGAsD}hD@`9QYQ<|*OiS$zTq}c`WUYNO;_YJTocxujPM-7HIn3>!6uS?Px}E>Ar>FK$E#pHTx{rA@{;=JwomtyO z?s%AU@|w*7-OXCw&YUdW)-WgFS>>Woj|*vy@iuYmjvI;G`71YPJG(uVR3!x%@MTx- zo;y&hDC&_Dx%<0pqj~mQ+Xr7SssEEz!=kI)zdBUk%hodL+v_QpV`M)cTHSojL(A3m zqNwkb#fZfd{f8Qc#MJrmm-&@{q+eUu_iMLfHy0aM?AthLm>Bdu_UHFp)hfz7)9g z(wQd5Ym;xC{M9Y3$Ky>2pWc=o7C0MUtC|-3yp#9Vy)iKV!YB8IK|^1oMd>)S7&61QvA)Ot>T!WJO_PolRs1n}zsO}Jxt3qEoRPNpdEws&o<(WJzUW)b?pM?$ z_niEoY_(r&ufaTj&}^T1fb@%<-^JN9f8GD>{aQ~KRhY(%*y<|KIdv?1=S3>9%!Gr zzz;K+<*L6fNcZ>AIwP*`eVr;a(8srXbosK|Z%=-*k(CBp#w6KXe>rybvWk*3w;anF zXRqI>tTbkZFmk`?xE7tf^+os8?9}q-1?hlubvawUQiSMko zXkx#R9H&Q97Fpe19NcW~^R2Z;f7@MG51*ZX!`AlxY=N`$wTfSQDfa9D>s}>m%I1(Y zy<(asd-T-{eQ__TAwIL{i9%E-uPxy;<7zCwv-BF}Utu~nWA`m5|FkE^x+gHr#{Su- zMQ(YgX}W{&TFY)k>91a8@A!Co*ZPW-*e&zDs?!VdPy6o^xdDqk{1g8;6#Ty6uYl^N zDCTL^BR*&9!3(+t|BUOMm@`M@=G@W!G34?g-+lKZ_NVF@$G$LQ-bC9h3eIevcH_H( zeHJ1o*MB~0dcS*@f2jH0EN_q1sf8bVRi=D>`WJ`8_d-HGX{8r??_$2yT+H^g>jB$= z5uQQg;v*IW4WBaEP54JTE_A+hSm^x3g$a?;De>`fiixYN72}qg*hF~-%|$daaeowwKzMLkt@~1(ZIj!=8%R15OReS)Jvd!a{>(i>` z4+nGlw0axp^(y+WpjMl)!ic)Lvu1Kel+EQ`CUQCo_m%YHqGBdzO{d(6A2*pZqinU4 z!av!JQg3d$Hvh|1=n{&t{5+KF%O41#?Z1IEI^p{mNY_+1#g{31lq%i$C9^m^I=xPO zQAbScmr83|{@1abC1r!16dUt36jo`J(}WXrn|-hF1%$HK6m@A5N^9h%>nc1~ccy7K zjEB+GTDwqc^x*TuI4v5r&ok_K-6@;_jbbK_vsdV47|`f-UF*Pa3*?Nc^;Tq<(CB@h z@g=p&_{`2UDtBl0qE*Rvi-1LiVnW}Y>B!HW%IVN5RvgKqGAnl1CI1d|SMVBYy%&Ay zW-uHEE@7byA|n>hiI0!PFNne-u4}2S>=?0lb~LqG2VOcFrYVY#SQx)v*;(psF z5yvp-)^Z4OrJN?j8XR3+TFX!wMyN$oF=4%0N8ZB0RcIA`4H`Ya?AU8i?FGc0oT=t&r^v=YNXk z3~80e=Sn+bbsHMJDS0w}#Te>YU8dNopc*QmSJAAXHHJ(vA&+W+q~r~vG=WT^y@|@Q z&{Eliq{xK0&?WTWjZAT36RjQiz-iR0+d#$2&03N%@sacRXXCixdf}cy3l~HtEC`B) zM~d3b!|D387r$zJ2l_O5i>BfVPqhk~MtZOcG8Bg&#Xw9A;d%87UKqia3GC-DRo=puW1XKIRNxp^YBYrhgY9ZH^;WRZ!{J8+o^u` z3Kf70N0X19&*|sxkjQ-u?cMYU$%Z6eNxFnwhjh`7kRWwJ${{7#$-TSl=c*C%22w+3 zLVS(o-j3=SR)kbr$-V9M3oQxJ?nX$4H6ahJ<=$P@owW(sqAmBfQOnXNq*iftm#N%O zGF=7=sw9Nyb|+*uB)sYk2yrnY#Mp$8L`a!%?`a4E;36R1)*xgE9D&tI32}!CPMH&8 z*_Dt!W`xKg9c2m8;IN5rEeM$eO)-Wik*wU?#PKh9HGMc7D*<)=p&_bQswp9NAW3ux ziPC{aCntf{Tad(SFuZCYM@S*0Jh<1>B4kh7VO$d2UxlQ4Re>feFdkm^QbN)oO^17E zK>IbV{jT+94w$VR5?leozd7*gb&&QO6QbS)OaU*o71Aj%mmOFfuYO>%Y)GGM2r&cm zEP*uLmXH{zX#_m`2GU8me+K3WGzZhDMS!LX#l&4!&NsT4WXPgSl?{YW7TH;5HeVnMZ<8#*C{%^f zej=PSuxC2LXjfE>GF3JTDiql+4ZQ{-iz5J8l&P{fq(yc$XQDF)>L)nX5k{dZj0P0p z7k$s^qGB{GvM5t!agd4ZoxqD+;o=mPc^;WfJ7?M4^}Ho_qM9~dVvk=>iIU@o!= z@C;d$sVde`8N^QOPrpJIXBA{o_L+tL_l56LR6O?FdV7R%PDB`GpW)W|Qe-nWEi^$E z=TT&FE>&gmTNhcoD-SLri*o?7C=*zyU%2pN7vV|AY8(*8$pB%LsVc@VTx5?{W{*G? zzkFm-rpn@UFR~|pU6PM1E(6G-ELj!CDN%$Kt1inB#winFl&P{0tv|Dw_U==W#nl2? zl&P{fn~8es{!CelEY5PkCJR%YDvZ;h2&>&#;)XCzkEj@Bsw_^6A{*NrSc)u8m&l?_ zmBp1tWDnixJ`&kFDcB!j6sp3wJc;mcYbOjr7?&+%QKrh`#4ECVWBog1aY9BGWvXl~ zELkGkIrx{vIoSWWpdySyRXCFU3{TWdEkMP%5+aK-RW?ofnY~hPFacS6c!n&>R9RdR z#6~19Tj5)YFfJ7cqfiybB~pY(?3gD^uef9)i!xQV+UhfFAG(A?y||}97G8R6sp3wg8*1y8?%0oMizG%$f8V@#Wh@H=Y28cKC-yBBa1Rs_9O%L z7vYyprx=8B%|#g3TU8jhHzM0SP-8x_xa~m}WvVQ$>mnOe-A@=lxZWd+vUV2ghi%no zxaf}l9#o9mEre0l4#VHL_YoDR82n&rn5XX$vWc!#YUnDX~EbFGHj9J8ZYB4d&y{i~bAX1t4 zENiBr{4SlD$uU(*wKdEP33FQ+n$1|?-z##MA`ad|mdBXtGD*teyO>f5yWd#(&mLy8 z8JlXV%ss)ZRcEr4-OezX>P)V3?*(RzA#+su{5JD|V~IprUBmS1hIOcaV4kV7{S1_^ zS@vfMo77eLqXrwsvV%J-ZM4~kotOrtRyTH^1iC?4V$HH@&=1O^_H1_v>#VJ;c4XB# ztguGLj#fi`j_&Mj7TToNkIn4F8k;CLjACD?vxSz*)CufRZRVNs>@@bKE-TSd?ucUb zjj^J`OWDILlcNk?!ERJzf|O5FS&w9PzOmAt<&F+d{vAdLUgu!y=*E3caqs~J!SfT4 zuYiwK19EqmJ1yZJ(;twkfZqXI(2cNcrNA^b67Ju_eH`d=1-+QQhwsH2rn~P!*8^bG zVGN&P2?>V$wmy6xE>Ped6ifkl8jRV_APj&)2B5?g3dF$Qi$Osd6qpAU9s>p&hK)d_ z|57NFbyb5^0a6VlFW3d-Kza(v3zoQDkUl^P)P%vLY1e_cgSPkp3Wo^((8a@U3KUOg zgi{m>w(W3%>U_10Z9O8O(2b5i3QX03Oo6w1KPlL@7K=wG6eZBi7y?0o{>uqTQKHSw zVo9SNj{_-Gwi)m983IL_R-Z{1zHS_+;2oF0W(0}2*~gBYGcL8E2yu#gfpkW)EO+Yj+6)V8*_H42Cdw^m?a79ILI zD2jqdD+?h46s&mgM1kVh4~OAxhscx#go9xURQP>qiXr|Vat0ED6O`myu{FvyJl_;q0f*OkUTLQ^0b>_5CR?;c6_AqtTi z@<{sDE83#5{zId%C_gc(V|BT=#!Pi=E)p!~mEFp&FIkAH z>3C-d;W8aB<|h%uUifWs)FV!&Xp3jzKXt57=Z?3~p8sJk{r8H2B~<$nq0<-6qw7au z*@B>t4z?bP@q^;&rrNfp(SZLxo~|FDz~|@-s(~()5W^|DCNCd4_*#qk_xI0nEknSK zMjnGdtlmfbY#6a$9iv^@Y3<5+LLn_~XE3M{MAz&lB<}@YA6W_X+sy&354>!|0{nZRid2E#KIoXY1#Q;w0RAT6k0Y^AD;yh=ZlJ&(a#MI{ z4*4votrz6x-~@Dn{5YJ{eF^y+PzY@xW5F>9b&xGkp)2H9K@S}8l64>)0QnT)`$N6~ z$~!|o6r6~LcraiCe}EHEcq?!YlKr3v>L%a9L-bZZhUR)eeguSYLO?R1!C0mYYU=^{ zDrg`aXA^JW;i#Id1HK>Rnb0t(lZ=9L;M6B-U?KE&_l5?#Kt2v!sb7qOo0rfc8RQQ^ z5gap<3-G4BA(w!Ofg$0L144@74@bx=L6H>lbVzVZO5jb5N?o<3%;rQ+)8q-fHNNOh zI8MMEujLNP?upzfhOb}9Ijfh$8>$oDB#A3w4)bS|xLC%Ymo4IMDm52#Z#k{0AP<1# g&ucB`_Ax2=|F - F:\Downloads\ets2-sdk-plugin-master\ets2-client\C#\Ets2SdkClient\bin\Release\Ets2SdkClient.dll + ..\plugins\Ets2SdkClient.dll ..\packages\MouseKeyHook.5.6.0\lib\net40\Gma.System.MouseKeyHook.dll diff --git a/server/ETS2 Local Radio desktop/SimpleServer.cs b/server/ETS2 Local Radio desktop/SimpleServer.cs index 9b53f3db2..39f687681 100644 --- a/server/ETS2 Local Radio desktop/SimpleServer.cs +++ b/server/ETS2 Local Radio desktop/SimpleServer.cs @@ -110,6 +110,12 @@ public string RadioSignal get { return _radioSignal; } set { _radioSignal = value; } } + private string _radioStation; + public string RadioStation + { + get { return _radioStation; } + set { _radioStation = value; } + } /// /// Construct server with given port. @@ -255,6 +261,8 @@ private void Process(HttpListenerContext context) try { Station.SetStation(station.Split("/".ToCharArray())[0], station.Split("/".ToCharArray())[1], station.Split("?".ToCharArray())[1]); + RadioStation = station.Split("/".ToCharArray())[0]; + RadioSignal = station.Split("/".ToCharArray())[1]; } catch (Exception) { @@ -281,7 +289,7 @@ private void Process(HttpListenerContext context) } else if (context.Request.Url.AbsolutePath == "/api/radio/") { - string json = "{\"Radio\":\"" + Station.RadioStation + "\",\"Signal\":\"" + RadioSignal + "\"}"; + string json = "{\"Radio\":\"" + RadioStation + "\",\"Signal\":\"" + RadioSignal + "\"}"; context.Response.ContentType = "application/json"; context.Response.ContentLength64 = Encoding.UTF8.GetBytes(json).Length; context.Response.StatusCode = (int)HttpStatusCode.OK; @@ -292,9 +300,18 @@ private void Process(HttpListenerContext context) { string station = context.Request.Url.AbsoluteUri; station = WebUtility.UrlDecode(station); + //station = station.Split(new string[] { "/station/" }, StringSplitOptions.None)[1]; station = station.Split(new string[] { "/api/radio/set/" }, StringSplitOptions.None)[1]; - - RadioSignal = station.Split("/".ToCharArray())[0]; + try + { + RadioSignal = station.Split("/".ToCharArray())[0]; + Console.WriteLine("Radio Signal: " + RadioSignal); + } + catch(Exception ex) + { + Console.WriteLine("Radio Signal: " + ex); + } + //RadioSignal = station; string text = "{\"Success\": true}"; diff --git a/server/ETS2 Local Radio desktop/Station.cs b/server/ETS2 Local Radio desktop/Station.cs index eb5c1a792..15b734407 100644 --- a/server/ETS2 Local Radio desktop/Station.cs +++ b/server/ETS2 Local Radio desktop/Station.cs @@ -24,13 +24,14 @@ namespace ETS2_Local_Radio_server { - static class Station + public class Station { [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle); public struct Rect { + //public string RadioStation; public int Left { get; set; } public int Top { get; set; } public int Right { get; set; } @@ -38,6 +39,7 @@ public struct Rect } public static string NowPlaying = "Now playing:"; + public static bool RTL = false; public static int Width = 0; @@ -48,6 +50,7 @@ public struct Rect public static System.Timers.Timer Timer = new System.Timers.Timer(); public static void SetStation(string name, string signal, string logoPath = null) + { try { @@ -62,7 +65,7 @@ public static void SetStation(string name, string signal, string logoPath = null return; } } - + Rect rectangle = new Rect(); GetWindowRect(CaptureProcess.Process.MainWindowHandle, ref rectangle); Width = rectangle.Right - rectangle.Left; diff --git a/server/plugins/Ets2SdkClient.dll b/server/plugins/Ets2SdkClient.dll new file mode 100644 index 0000000000000000000000000000000000000000..658f18d5d94eb5cb80c1bf1b87706a92b007d97f GIT binary patch literal 37888 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�M z-}&9W9MQlY+!~#E%J*kEnl{7frL28EqsNZP4$JP2&y4Z9pob{`)@RGv+ngP9l#R>^ zWM|=GbZ%>`5qGn-OIN2%SH%cV-PCns(wuIjbGO$GaV$?W_kTUr*sgBw3A?f}UDX_A zUK3q=MykD8TSv{`&YmOK%%ez78+#U=7WS-}=4FYg)`}+mjibZqGL>eV?$NaA3zLJl z%e7y!7x-xBWqWm{<4Mh;LUMHOAQsN0m+gXX|NQpDnvxpRIU3pDnpP zpRJg#&lXZ0pRM^jJzLG_?d$*y7Ib}v4U|K*N1V>r!3WUVd7%057SYRvOJ9o#XODH46lf+?U~_~a1==k$dbJB zxGd6X4hv#++7y0GVOGkYjmq#TVf4WOPkcY z>y@w)Qx`FDt*W$Op-aqNhLnu9VgVbT2}ne?>MON67Gd0h$#$$+(M2k{BW7)HN6(sG zU%nZut6HKJW~qQK`&@xfrqT9!34Czb8c%G(=i)?cgRa|ivqU%QSMa*Vt~!~FwrptL zz9NP-hp9l{&g_1E{ArJEh&AIIg_Mdv&w!p@6xohNeJQVFpAlii5IASJ>iw zp=;oH67bgO`4^$NOX75Co4fpsYvbIZy&}4;9pBE@$61w5UMpA3n~pDW+tC$TdulD4 zaV(FvHAk@0aYZ85BGrjRWII}s)Janhv$VNMce^t;;oH_IwtHz}X9%-QrZst~L8p(`I%=+ttEpw#A(&og_C1aaoS~ypSI4sh6BpqLqIx`;)Ql&kYVgES3uezKtSC}gB8q31 zw&VG#70~pT!!8+q@b%D!?Mtp~tgyfLK+&Hi^vL<^R}GokeVLsT3gi@p_^?AzAC}O^ zJ|(D6CYo7#_EYH7tid8hv7*01pMVYy zR18uKR+IpCPF^5qXfHdb0B;3$POn~J%PtD_3fop`Ne+nLOqw4K77xUG@sLueR`EbP zr|*RSPA3G1pr$}h@ld>~0%7SJL@|Al2x$VqqmnGS3;~5q6(Ti?sZn;0{t+BYo76X? zO)4!O3$-jzE`9L|11;)*Cd2fGHCfJNxh5wt zIYE<^Ojc@gDw9)l(So9a;u&bdbi795Rf<;_uX4O5;8ls&R5UFQFI$^8T`^Kost7B} z6%!Pdim7OLfi}DVnUIj71zO+G0*HWAVTZw~`^OsE3l&VnYce|}uNR*5#;*ylwD9Y} zhxXD83@d8U;G&&5%8twIVL^LXm5pCZIV=>+wQW0)i=B{*{?E0F%X*7l+;Oe*zo5_x z;L-VED0CPGn^jzxmm4fD)PJ^`qtqOw|Jc=iw1VP}TYKf&#X~iqsGyffamO9G;XvP^ zy+R@FveM#?gUF^mhoOXO^YF5@>gkG+ic&>bQLdPvs8ndzqau&uJEoE zCYaOOsruJ{Cg4oH5p&+D&cj2Ntmr$yi`4n6IkH{99UZPkggqrZHSA;voBYLiAWJWn zaS?4EL&8H`IHK_Il@xm?{qXnh3x}svPR1|%9c#(RhWg{9$Di2HFmcMXhRTUkqtj2A zxM5?oe&Y10)2Brv(T&j)D)IZg3h>nKWc-~X{1g1u7s+M0Na$Q6f1*R;Ji}k< zy|m6^#OqeJGq#miZA(DCQq$j>a3-5O79qZoxo4wC+Hi%ZEyr&vVY{+@ zVLS;P#=j|O&tyE!ufKOi%UNpjY47P3q}v~A{ny(xgMGOSWyR4>eKNisqr)xXv$jir zAC2~5dfv>Q%HN*SYxoJ@9`3=@-b$ literal 0 HcmV?d00001 diff --git a/server/plugins/LICENSE.txt b/server/plugins/LICENSE.txt new file mode 100644 index 000000000..5205c327e --- /dev/null +++ b/server/plugins/LICENSE.txt @@ -0,0 +1,39 @@ +The MIT License (MIT) + +Copyright (c) 2014 Hans + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Copyright (c) 2015 Michael "MiKo" Koch, miko@mikoweb.de + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgement in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/server/plugins/README.txt b/server/plugins/README.txt new file mode 100644 index 000000000..8b4e10add --- /dev/null +++ b/server/plugins/README.txt @@ -0,0 +1,4 @@ +This folder contains the ETS2 SDK plugin by nlhans (https://github.com/nlhans/ets2-sdk-plugin) +Once you run ETS2 Local Radio for the first time, +it should automatically ask you for the ETS2 folder and copy the files. +If it does not work, please copy the plugins manually to the ETS2 installation folder. \ No newline at end of file diff --git a/server/plugins/alternative_ets2-telemetry.dll/ets2-telemetry.dll b/server/plugins/alternative_ets2-telemetry.dll/ets2-telemetry.dll new file mode 100644 index 0000000000000000000000000000000000000000..6ac2cf86b120313246a2eeb3898058b199e50d4e GIT binary patch literal 20992 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 X>r);<0WDZZgH-Io&!^Y_nh5+iKEb(u literal 0 HcmV?d00001 diff --git a/server/plugins/bin/win_x86/plugins/ets2-telemetry.dll b/server/plugins/bin/win_x86/plugins/ets2-telemetry.dll new file mode 100644 index 0000000000000000000000000000000000000000..c6b2805c3157bc7ad4885294d445e5a09b0aca8c GIT binary patch literal 14336 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 WHdezJeb2 Date: Sat, 9 May 2020 19:25:45 +0100 Subject: [PATCH 11/13] Update .suo --- server/.vs/ETS2 Local Radio desktop/v16/.suo | Bin 203776 -> 203776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/server/.vs/ETS2 Local Radio desktop/v16/.suo b/server/.vs/ETS2 Local Radio desktop/v16/.suo index abcaf369a7f0f10c3052b644af3829eecc33f596..755e3a316fef98424437e4a4c7e4c799988204d7 100644 GIT binary patch delta 5662 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 Date: Sat, 9 May 2020 19:27:19 +0100 Subject: [PATCH 12/13] Update .suo --- server/.vs/ETS2 Local Radio desktop/v16/.suo | Bin 203776 -> 203776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/server/.vs/ETS2 Local Radio desktop/v16/.suo b/server/.vs/ETS2 Local Radio desktop/v16/.suo index 755e3a316fef98424437e4a4c7e4c799988204d7..4403f6adcfcc12fed9815472b17f4bffc0478dbe 100644 GIT binary patch delta 2176 zcmd6oU2GIp6vy}6&TePR7U-w7t#k{vVlDlkwM7DU>1tA;(6wo*Hb?{dP!%i11)F_< zTC|#`2D+Cp2_aa=W($7BbWE2A1N};I)bHE+!?k^?#$3!1peJ%>)Tx4M+mZKsm?;c7Vs(k^#ca=7#UI`uAIQ4l}v% zRr#ip@#G`$iUE&ui?^cI!p>SgkC(#tSp7#~e*@P*7D$mp&t*9);c=u3y^Q#!R<9cN zJ6T-v#$&s!kyl}x!E0a-XaRe{>%b58fmXn4aqHvNS)raw7g-^PMhDX|&pT#axUs&h z7yEb9>;cS0HRG5P^jS0ZS+o0q1H^(fz?$U&){HfdYR2(hWRvfxDW-DV=a!EcR;~y{ zmE(I@C7$=dvQq4GW98WX2g>!wRmCd2KRMO8TKW^}lme?0w-wIxeq3zE{Ibn-_bA#b zZzLV0Ib&b)M2wyIyUOv-eCbcCkt3qmh@`nCudZRV4J4LeCU>uBxvU`U=rs;3a;J^cVWnO$g%8$SXVf zM5@3h=St4YQBh<>N?jCOKc-Y$Ax31qi?r@h@{lk#m7Swt(TLN`5&ov;_98`-((9`* zMCCl$390Fj#qmiF72Z0VT;WPJl(=!yJ@?*+-Q0&U>y32<>qnJUyfW((sjpM`C@!k- zOpTNH^)svy*GV|$(So_X#in!Az4L_g6vj@2Aq~}`v2Gad2sjUTjc6M~|0{3-Tm<9b zYcK&O!4#MV9RCgMw}2Dodsz8wR%XtR*5qZ&a^TN*_`krvBCjb)bywm23RYXQWtP1T z`#Xq$8{iMX$BS3ub`yT0)i*1Q<#Q2~*&DsGprYIeZ0Mk1gV#JJ{sy1Q#mNg;IU~~G zBK>ipZx{Wws_1^{=>Jch+Ne7Garv$Py*hHf@k8SSeg_^*(>{zaZP6A^JnY4bSszlbwWdl&3M_lWempO^0J89gBWIYIeHa7Ti61>bFz zt(n#87L1#TZ+?+XWZ90tB~t68963-SMW9mU%9&toQ~CpS3KyEibPG(WspxQB&`P4q*&)^e6w!nho!(0&r3VNyb^uw$?RQU<1IaH%oa wc|dvd@3el!gY4>i5j|0VjwYQkhH-B;R#n7qC*LHI7Gl1a*JDk0yKvIhX4Qo delta 2316 zcmd6oe@vBC7{~8(?#uN;Z&!XQ3E|a<@QMVAs7P|{QZg!|LL+UKZjdY2#K@EoZsvft zyNU0q-mO23Ug(V#ZH%|>%cdy`Hs>sVm47-dHp{i<3b%e3^nLEVBvG@!YMt$KpL3q) zob#UZJXNTT#2|3+y{8| zBwtZ7)_76-8vKSHc`-X3b|K(V!!bJ>wlr2}KbK>%cG?vGz4DTha_3#}s*@u3qy8nR zoaB2>$NpcX?QG`fzJ$omShNxLWzYn6fo9MGf`H`;x`tRTmrgC2aPjh4BrYsAi^uh; z0w%@$`LGiLmY~i8x&RBv=GCNeh8Jxjfw34BC;uB#dBi%covg+hODj zt!UWI=j{j4r4*^8?;9q+?!Q1mYjCNbG;K%@EyS8{x(X_i*A|~s_y$EMDppC(c|0KV z*DtXe*S3=0_k>XO!^bE=_N>dbR;)WphF=(^!YEg@tbiO^UM6>Et&~HeP>yC*x%n>e zy^Cz3VOOYsgIlCI2@eB^0~5Kslplmsv~O#wRyC|V#6z%CIa*b%aLPur4c-MNcptF-6Gis;yb3Qyp7doF9zgUU z_yimRhruA21tvzYEk^rOa3*q((=JR2pGVumn=rfZVk~kAHaAuuflZFpd9rU%{}x;U zS21cP{lsIvW0U%DKfXR(1mt6@)dXZ9^Bx(jDUYPo4D^qlUX4mxhS%~wd6Bf>O;al2 zMoP)Cja{xSFVrq~tkmn9DZ@ItX$AGyRgl6DYGmSuXF@`&3&c4R*u&@4Q1`_jVTo`g z`)p+2AZfnz|MG|yO;PKAaYTQ*L&o#McvcwOTz_-TgOjegHM&z3I6vua?TUAlV_*D4 zMNhU>rGD)nAC3K_hZ!c4fTd0Zct{(X7#Im5h)uLN4Pi zmrU;LwR-ngFEew!u_0W*wcC1s`_G2S4)2^PdIH&FIw&wvb1!KScF5e)f{tNW%P%T>8^x zB1!kG7m51r Date: Sat, 9 May 2020 19:38:48 +0100 Subject: [PATCH 13/13] Fixed --- server/.vs/ETS2 Local Radio desktop/v16/.suo | Bin 203776 -> 203776 bytes web/lib/js/main.js | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/server/.vs/ETS2 Local Radio desktop/v16/.suo b/server/.vs/ETS2 Local Radio desktop/v16/.suo index 4403f6adcfcc12fed9815472b17f4bffc0478dbe..fec788ae728a74ba910ef15be55868da12de3b22 100644 GIT binary patch delta 1489 zcmZXUaZFWJ9LL}9y!##(xDii5h)3`qV(Nnk77}O#gch+C&!T#)R@1en<{z=4DG}gw zh7Fy*W1Ou&)Sh}{{ZZSy#dEWaqE`OVA5PS*auux}D>Zn1e~*i~I@@R8-|zf> z=XcKi-E(jMDWm_CajK5BGKSBMrjU%M8?u2@6 zn^(DQ`yN)gQ!nnzqJQgg2Jgp%b+w&c30(uKZU27gD)1Tj+@8yYt_2O?0l;To2dx7S z0c-jPF1z;G~xn+OwOsvy`oP1+zQtNH_FV&;wory`T^DgJ?!j z({k}FvfUV_Icqj+f@DiUxlClYr4t{DThGmvU7mJ1F3PFJn(<^7g=@yO3Oi&aY7B~0 zh)A^-35dvQ5%w0!!kiFYmD_UKbUt07ol1T=lha2&xh=QPwFLWW*0uVy{BR)OcpWJN zU>~QJ27=W`U>pUbL=LP62?-A?4=48vxFlsPr&|6VzM#mnS~wWja3>t{+#p_DFqrE2 za-K-NxAl8;aXUPWa44>qK$idxT8WTB(*Ja`ta#==tNVq$&Tv6o#}5ekYcy2B#3TltCliI$=ps=sRD%pF1qKC&w zHWyT7<{-+K4Z}(vil+|d;tx=_uI)?Hqlf#aNyK*TrareqxY25Se3ZKuXV^pdd$7s~t zL1GBS)l`#MtKQmA>($Foiu#ymn%<-1qtB6=+)rNl{qxJrZqlfBWSq(bb)@S3uWq68 zeMxTRn;_#hZU+BB4B%92CTN`wD>YQGL*(&cHoCvc;2D{=scz`9SZQtEq{y7aQ}vSD z{0904_!e9tLtXk%Y>90-PeY`7ei2!*tV{Gend77lWjl4%YKfoKfm!i^8vcVqhc;Bk dDzDSz(l?{do>)(|*hA{Y>ikMB%CQ*o1ky%n{A9ikxi!S`$`QLN?=f1zJvzMR)$LGdC}6j4M(eFVL1PRvytfmu;! zHZik}nTHf3{Ru%HjA~dEv(XlqN15J`q|23tA(+QKyuPcQ@4I+dq%I7?Jj2XxW}Z{h zofBdr<^i_z$EU-3Vhe_Oxcih5Kg(RaC(+2&M4`Bsh=cpO+BVvqW)HO&nF%IElIdE9 zTMp}^VR>$>k@xk-_^YvIzM|#a<&=~gk_E9+8v*Yac#^pmQbeeK3Yp;${#pBO#uT|6 zY1>puqDHI^xR{>G@~lVW?N_JuYOnB)F1RuyS@3N8vCM64$ck8iitg0JFwX z$q{X_Tb^PTmIaT|`wYD{eQv?JOooqSOoG|S!Ov{}H@tzBf`S?w&)I;}9{kQ;JB`>f z9$IfvV3giR5U^WEFypkofN`zLZN$H#+V;K2e6jI)o~cI33kWfDz7^Jw|6iv4q&ow4 UU=6vQmde;2l}*}{UUu^5Unimpr~m)} diff --git a/web/lib/js/main.js b/web/lib/js/main.js index 3922d2ced..401c1a5a7 100644 --- a/web/lib/js/main.js +++ b/web/lib/js/main.js @@ -79,7 +79,7 @@ function initialise() { $.getJSON(g_api + "/api/", function (data) { refresh(data); }); - $.post(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise) + "/"); + //$.post(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise) + "/"); }, 1000); setInterval(function () { @@ -298,6 +298,7 @@ function refresh(data) { //If they don't contain the same keys (ie. a country update) g_countries = available_countries; refreshStations(); + $.get(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise) + "/"); /* for(var key in g_countries){ $.getJSON("/favourite/" + key, function (data) { @@ -307,6 +308,7 @@ function refresh(data) { */ } else { setWhitenoise(available_countries[g_current_country]["whitenoise"]); + $.get(g_api + "/api/radio/set/" + calculateReception(g_countries[country].whitenoise)+ "/"); g_countries = available_countries; }