diff --git a/FakeDeckUI/FakeDeck/ButtonType/HelldiversTwoMacro.cs b/FakeDeckUI/FakeDeck/ButtonType/HelldiversTwoMacro.cs index 19e41dc..e162191 100644 --- a/FakeDeckUI/FakeDeck/ButtonType/HelldiversTwoMacro.cs +++ b/FakeDeckUI/FakeDeck/ButtonType/HelldiversTwoMacro.cs @@ -1,6 +1,7 @@ using FakeeDeck.Class; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -83,7 +84,7 @@ namespace FakeeDeck.ButtonType foreach (var key in stratogems[stratogem]) { KeyboardMacro.SendKey(key); - Console.WriteLine(key); + Debug.WriteLine(key); } return true; } diff --git a/FakeDeckUI/FakeDeck/Class/AutoUpdateHelper.cs b/FakeDeckUI/FakeDeck/Class/AutoUpdateHelper.cs index 208957f..7bf6ca0 100644 --- a/FakeDeckUI/FakeDeck/Class/AutoUpdateHelper.cs +++ b/FakeDeckUI/FakeDeck/Class/AutoUpdateHelper.cs @@ -2,20 +2,26 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Linq; +using System.Net; using System.Net.Http.Json; +using System.Reflection; using System.Text; using System.Text.Json; using System.Threading.Tasks; +using System.Windows; namespace FakeeDeck.Class { - internal class AutoUpdateHelper + public class AutoUpdateHelper { public AutoUpdateHelper() { AutoUpdater.ParseUpdateInfoEvent += AutoUpdaterOnParseUpdateInfoEvent; AutoUpdater.Synchronous = true; AutoUpdater.ShowRemindLaterButton = false; + AutoUpdater.ReportErrors = Debugger.IsAttached; + AutoUpdater.HttpUserAgent = ("FakeDeck-v" + Assembly.GetExecutingAssembly().GetName().Version); AutoUpdater.Start("https://api.github.com/repos/ravibpatel/AutoUpdater.NET/releases/latest"); } private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) @@ -23,11 +29,10 @@ namespace FakeeDeck.Class JsonElement json = JsonDocument.Parse(args.RemoteData).RootElement; args.UpdateInfo = new UpdateInfoEventArgs { - CurrentVersion = json.GetProperty("tag_name").ToString().TrimStart('v'), + CurrentVersion = json.GetProperty("tag_name").ToString().TrimStart('v')+ ".0", DownloadURL = json.GetProperty("zipball_url").ToString(), }; - - Debug.WriteLine(json.ToString()); + Debug.WriteLine("calling Updater"); } } } diff --git a/FakeDeckUI/FakeDeck/Class/FakeDeckMain.cs b/FakeDeckUI/FakeDeck/Class/FakeDeckMain.cs index 98ff66a..dd14957 100644 --- a/FakeDeckUI/FakeDeck/Class/FakeDeckMain.cs +++ b/FakeDeckUI/FakeDeck/Class/FakeDeckMain.cs @@ -1,21 +1,39 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using YamlDotNet.Serialization.NamingConventions; -using YamlDotNet.Serialization; -using System.Diagnostics; -using System.IO; -using System.Text.Json; +using System.Diagnostics; +using System.Net; using System.Reflection; -using FakeeDeck.ButtonType; -using YamlDotNet.Serialization; +using System.Reflection.PortableExecutable; +using System.Text; +using System.Text.Json; namespace FakeeDeck.Class { internal class FakeDeckMain { + public static string pageHeader = + "" + + "" + + " " + + " HttpListener Example" + + " " + + " " + + " " + + " " + + " " + + "
" + + "
" + + "

Page Views: {0}

" + + "
"; + public static string pageFooter = + "
" + + " " + + "
" + + "
" + + " " + + " " + + ""; + public string pageData = ""; public FakeDeckMain(YamlHelper yaml) { HttpServer server = new HttpServer(yaml.getData().GetProperty("server").GetProperty("port").ToString()); @@ -25,10 +43,13 @@ namespace FakeeDeck.Class Debug.WriteLine("PAGE: " + item.GetProperty("page")); foreach (JsonElement button in item.GetProperty("buttons").EnumerateArray()) { - server.pageData += AbstractionHelper.getButtonVisual(button); + pageData += AbstractionHelper.getButtonVisual(button); } } + server.addRoute(servViewResponseAsync, "GET", "/"); + server.addRoute(servButtonResponseAsync, "POST", "/button/"); + /*foreach (var stratogem in HelldiversTwoMacro.stratogems) { server.pageData += HelldiversTwoMacro.getButton(stratogem.Key); @@ -41,5 +62,72 @@ namespace FakeeDeck.Class server.serv(); } + + private static void callButtonAction(string module, Dictionary postParams) + { + string cleanClass = "FakeeDeck.ButtonType." + module.Trim('/'); + + Type? buttonClass = Type.GetType(cleanClass, true); + + if (buttonClass is null) + return; + + MethodInfo? method = buttonClass.GetMethod("invokeAction"); + + if (method is null) + return; + + ParameterInfo[] pars = method.GetParameters(); + List parameters = new List(); + + foreach (ParameterInfo p in pars) + { + if (p == null) + { + continue; + } + + if (p.Name != null && postParams.ContainsKey(p.Name)) + { + parameters.Insert(p.Position, postParams[p.Name]); + } + else if (p.IsOptional && p.DefaultValue != null) + { + parameters.Insert(p.Position, p.DefaultValue); + } + } + + _ = method.Invoke(null, [.. parameters]).ToString(); + } + + private async Task servViewResponseAsync(HttpListenerRequest req, HttpListenerResponse resp) + { + string disableSubmit = false ? "disabled" : ""; + byte[] data = Encoding.UTF8.GetBytes(string.Format(pageHeader + this.pageData + pageFooter, 0, disableSubmit)); + resp.ContentType = "text/html"; + resp.ContentEncoding = Encoding.UTF8; + resp.ContentLength64 = data.LongLength; + await resp.OutputStream.WriteAsync(data, 0, data.Length); + } + + private async Task servButtonResponseAsync(HttpListenerRequest req, HttpListenerResponse resp, Dictionary postParams) + { + try + { + string module = req.Url.AbsolutePath.Replace("/button", ""); + Console.WriteLine("Call module " + module); + callButtonAction(module, postParams); + resp.StatusCode = (int)HttpStatusCode.OK; + } + catch (Exception ex) + { + byte[] errorData = Encoding.UTF8.GetBytes(ex.Message); + resp.ContentType = "text/html"; + resp.ContentEncoding = Encoding.UTF8; + resp.ContentLength64 = errorData.LongLength; + resp.StatusCode = (int)HttpStatusCode.InternalServerError; + await resp.OutputStream.WriteAsync(errorData, 0, errorData.Length); + } + } } } diff --git a/FakeDeckUI/FakeDeck/Class/HttpServer.cs b/FakeDeckUI/FakeDeck/Class/HttpServer.cs index c5d8ebf..99f4680 100644 --- a/FakeDeckUI/FakeDeck/Class/HttpServer.cs +++ b/FakeDeckUI/FakeDeck/Class/HttpServer.cs @@ -18,6 +18,8 @@ using System.Xml.Linq; using System.Reflection; using System.Text.Json; using System.Collections; +using System.Diagnostics; +using System.Text.RegularExpressions; namespace FakeeDeck.Class { @@ -95,36 +97,21 @@ namespace FakeeDeck.Class {".xpi", "application/x-xpinstall"}, {".zip", "application/zip"}, }; + private Dictionary> routes = new Dictionary>(); public static HttpListener listener; public static int pageViews = 0; public static int requestCount = 0; - public static string pageHeader = - "" + - "" + - " " + - " HttpListener Example" + - " " + - " " + - " " + - " " + - " " + - "
" + - "
" + - "

Page Views: {0}

" + - "
"; - public static string pageFooter = - "
" + - " " + - "
" + - "
" + - " " + - " " + - ""; - public string pageData = ""; - private Dictionary> routes; + + public void addRoute(Delegate callback, string method = "GET", string route = "/") + { + if (!routes.ContainsKey(method)) + { + routes.Add(method, new Dictionary()); + } + + routes[method].Add(route, callback); + } public async Task HandleIncomingConnections() { bool runServer = true; @@ -140,61 +127,45 @@ namespace FakeeDeck.Class HttpListenerResponse resp = ctx.Response; // Print out some info about the request - Console.WriteLine("Request #: {0}", ++requestCount); - Console.WriteLine(req.Url.ToString()); - Console.WriteLine(req.HttpMethod); - Console.WriteLine(req.UserHostName); - Console.WriteLine(req.UserAgent); - Console.WriteLine(); + /*Debug.WriteLine("Request #: {0}", ++requestCount); + Debug.WriteLine(req.Url.ToString()); + Debug.WriteLine(req.HttpMethod); + Debug.WriteLine(req.UserHostName); + Debug.WriteLine(req.UserAgent);*/ - if (req.HttpMethod == "POST") + if (req.HttpMethod == "GET" && req.Url.AbsolutePath.Contains(".")) { - //Parse Port Parameters - Dictionary postParams = parsePostRequestParameters(req); - // If `shutdown` url requested w/ POST, then shutdown the server after serving the page - if (req.Url.AbsolutePath == "/shutdown") + await servFileResponseAsync(req, resp); + } + else + { + bool isMatch = false; + foreach (var route in routes[req.HttpMethod]) { - Console.WriteLine("Shutdown requested"); - runServer = false; + isMatch = Regex.IsMatch(req.Url.AbsolutePath, route.Key, RegexOptions.IgnoreCase); + if (isMatch) + { + Debug.WriteLine(route.Key); + Delegate gelegate = route.Value; + if (req.HttpMethod == "POST") + { + Dictionary postParams = parsePostRequestParameters(req); + gelegate.DynamicInvoke([req, resp, postParams]); + } + else + { + gelegate.DynamicInvoke([req, resp]); + } + } } - else if (req.Url.AbsolutePath.StartsWith("/button")) + + if (!isMatch) { - try - { - string module = req.Url.AbsolutePath.Replace("/button", ""); - Console.WriteLine("Call module " + module); - callButtonAction(module, postParams); - resp.StatusCode = (int)HttpStatusCode.OK; - } - catch (Exception ex) - { - byte[] errorData = Encoding.UTF8.GetBytes(ex.Message); - resp.ContentType = "text/html"; - resp.ContentEncoding = Encoding.UTF8; - resp.ContentLength64 = errorData.LongLength; - resp.StatusCode = (int)HttpStatusCode.InternalServerError; - await resp.OutputStream.WriteAsync(errorData, 0, errorData.Length); - } - finally - { - resp.Close(); - } - continue; + resp.StatusCode = (int)HttpStatusCode.NotFound; + await resp.OutputStream.FlushAsync(); } } - else if (req.HttpMethod == "GET") - { - if (req.Url.AbsolutePath.Contains(".")) - { - await servFileResponseAsync(req, resp); - } - else - { - await servViewResponseAsync(req, resp); - } - resp.Close(); - continue; - } + resp.Close(); } } @@ -215,50 +186,13 @@ namespace FakeeDeck.Class listener.Close(); } - private static void callButtonAction(string module, Dictionary postParams) - { - string cleanClass = "FakeeDeck.ButtonType." + module.Trim('/'); - - Type? buttonClass = Type.GetType(cleanClass, true); - - if (buttonClass is null) - return; - - MethodInfo? method = buttonClass.GetMethod("invokeAction"); - - if (method is null) - return; - - ParameterInfo[] pars = method.GetParameters(); - List parameters = new List(); - - foreach (ParameterInfo p in pars) - { - if (p == null) - { - continue; - } - - if (p.Name != null && postParams.ContainsKey(p.Name)) - { - parameters.Insert(p.Position, postParams[p.Name]); - } - else if (p.IsOptional && p.DefaultValue != null) - { - parameters.Insert(p.Position, p.DefaultValue); - } - } - - _ = method.Invoke(null, [.. parameters]).ToString(); - } - private static async Task servFileResponseAsync(HttpListenerRequest req, HttpListenerResponse resp) { string filename = Path.Combine("./", req.Url.AbsolutePath.Substring(1)); if (!File.Exists(filename)) { resp.StatusCode = (int)HttpStatusCode.NotFound; - resp.Close(); + return; } try @@ -292,16 +226,6 @@ namespace FakeeDeck.Class } } - private async Task servViewResponseAsync(HttpListenerRequest req, HttpListenerResponse resp) - { - string disableSubmit = false ? "disabled" : ""; - byte[] data = Encoding.UTF8.GetBytes(string.Format(pageHeader + this.pageData + pageFooter, pageViews, disableSubmit)); - resp.ContentType = "text/html"; - resp.ContentEncoding = Encoding.UTF8; - resp.ContentLength64 = data.LongLength; - await resp.OutputStream.WriteAsync(data, 0, data.Length); - } - private static Dictionary parsePostRequestParameters(HttpListenerRequest req) { Dictionary postParams = new Dictionary(); diff --git a/FakeDeckUI/FakeDeck/MainWindow.xaml.cs b/FakeDeckUI/FakeDeck/MainWindow.xaml.cs index 514750c..f38b24c 100644 --- a/FakeDeckUI/FakeDeck/MainWindow.xaml.cs +++ b/FakeDeckUI/FakeDeck/MainWindow.xaml.cs @@ -16,6 +16,7 @@ using static QRCoder.QRCodeGenerator; using static System.Runtime.CompilerServices.RuntimeHelpers; using System.Drawing; using Color = System.Drawing.Color; +using AutoUpdaterDotNET; namespace FakeDeck { @@ -39,7 +40,7 @@ namespace FakeDeck QRCodeData qrCodeData = qrCodeGenerator.CreateQrCode(qrCodePayload.ToString(), 0); QRCode qrCode = new QRCode(qrCodeData); qr_code.Source = GeneralHelper.BitmapToImageSource(qrCode.GetGraphic(20, Color.Black, Color.White, false)); - + AutoUpdateHelper updater = new AutoUpdateHelper(); } } diff --git a/FakeeDeck.sln b/FakeeDeck.sln index 2f152b4..5cd68ea 100644 --- a/FakeeDeck.sln +++ b/FakeeDeck.sln @@ -3,9 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.11.35219.272 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FakeeDeck", "FakeeDeck\FakeeDeck.csproj", "{D8C79B08-1920-426A-9138-CF0C8BAE0EF7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FakeDeck", "FakeDeckUI\FakeDeck\FakeDeck.csproj", "{D04AFC99-A929-4336-BD2C-1D49D149DB18}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FakeDeck", "FakeDeckUI\FakeDeck\FakeDeck.csproj", "{D04AFC99-A929-4336-BD2C-1D49D149DB18}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -13,10 +11,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D8C79B08-1920-426A-9138-CF0C8BAE0EF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D8C79B08-1920-426A-9138-CF0C8BAE0EF7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D8C79B08-1920-426A-9138-CF0C8BAE0EF7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D8C79B08-1920-426A-9138-CF0C8BAE0EF7}.Release|Any CPU.Build.0 = Release|Any CPU {D04AFC99-A929-4336-BD2C-1D49D149DB18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D04AFC99-A929-4336-BD2C-1D49D149DB18}.Debug|Any CPU.Build.0 = Debug|Any CPU {D04AFC99-A929-4336-BD2C-1D49D149DB18}.Release|Any CPU.ActiveCfg = Release|Any CPU