From d66abc1f07acc1a52c61f540ece908d5d8062a8c Mon Sep 17 00:00:00 2001 From: JonatanRek Date: Mon, 9 Sep 2024 11:48:57 -0700 Subject: [PATCH] Small Tweaks and changes --- FakeeDeck/ButtonType/Button.cs | 27 +++ FakeeDeck/ButtonType/HelldiversTwoMacro.cs | 17 +- FakeeDeck/FakeeDeck.csproj | 10 + FakeeDeck/HttpServer.cs | 210 ++++++++++++++++++--- FakeeDeck/StaticFiles/app.js | 38 ++++ 5 files changed, 275 insertions(+), 27 deletions(-) create mode 100644 FakeeDeck/ButtonType/Button.cs create mode 100644 FakeeDeck/StaticFiles/app.js diff --git a/FakeeDeck/ButtonType/Button.cs b/FakeeDeck/ButtonType/Button.cs new file mode 100644 index 0000000..a127e91 --- /dev/null +++ b/FakeeDeck/ButtonType/Button.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FakeeDeck.ButtonType +{ + internal class Button + { + public static string getButton(string Key) + { + return + "
" + + "
" + + " " + + " " + + "
" + + "
"; + } + + public static bool invokeAction(string Key) + { + return false; + } + } +} diff --git a/FakeeDeck/ButtonType/HelldiversTwoMacro.cs b/FakeeDeck/ButtonType/HelldiversTwoMacro.cs index 05fdba9..09e63ec 100644 --- a/FakeeDeck/ButtonType/HelldiversTwoMacro.cs +++ b/FakeeDeck/ButtonType/HelldiversTwoMacro.cs @@ -7,7 +7,7 @@ using static System.Net.WebRequestMethods; namespace FakeeDeck.ButtonType { - class HelldiversTwoMacro + class HelldiversTwoMacro : Button { //https://helldivers.wiki.gg/wiki/Stratagems //https://helldivers.fandom.com/wiki/Stratagems_(Helldivers_2) @@ -51,19 +51,24 @@ namespace FakeeDeck.ButtonType { return "
" + - "
" + + " " + " " + - " " + + " " + "
" + "
"; } - public static bool invokeAction(string Key) + public static bool invokeAction(string stratogem) { - return false; + foreach (var key in stratogems[stratogem]) + { + KeyboardMacro.SendKey(key); + Console.WriteLine(key); + } + return true; } - public static string FirstLetterToUpper(string str) + private static string FirstLetterToUpper(string str) { if (str == null) return null; diff --git a/FakeeDeck/FakeeDeck.csproj b/FakeeDeck/FakeeDeck.csproj index 2150e37..e6c7a7a 100644 --- a/FakeeDeck/FakeeDeck.csproj +++ b/FakeeDeck/FakeeDeck.csproj @@ -7,4 +7,14 @@ enable + + + + + + + PreserveNewest + + + diff --git a/FakeeDeck/HttpServer.cs b/FakeeDeck/HttpServer.cs index 604068e..42d668d 100644 --- a/FakeeDeck/HttpServer.cs +++ b/FakeeDeck/HttpServer.cs @@ -12,11 +12,83 @@ using System.Threading.Tasks; using FakeeDeck.ButtonType; using System.Web; using static System.Net.WebRequestMethods; +using File = System.IO.File; +using System.Reflection.Metadata; +using System.Xml.Linq; +using System.Reflection; +using System.Text.Json; namespace FakeeDeck { internal class HttpServer { + private static IDictionary mimeTypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { + {".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"}, + {".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"}, + {".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"}, + }; + public static HttpListener listener; public static string url = "http://*:8000/"; public static int pageViews = 0; @@ -30,22 +102,23 @@ namespace FakeeDeck " " + " " + " " + - " "+ + " " + "
" + "
" + - "

Page Views: {0}

" + + "

Page Views: {0}

" + "
"; public static string pageFooter = "
" + - " " + - "
"+ + "
" + " " + + " " + " " + ""; public static string pageData = ""; - + public static async Task HandleIncomingConnections() @@ -69,9 +142,10 @@ namespace FakeeDeck Console.WriteLine(req.UserHostName); Console.WriteLine(req.UserAgent); Console.WriteLine(); - + Dictionary postParams = new Dictionary(); - if(req.HttpMethod == "POST"){ + if (req.HttpMethod == "POST") + { using (var reader = new StreamReader(req.InputStream, req.ContentEncoding)) { string postData = reader.ReadToEnd(); @@ -91,25 +165,86 @@ namespace FakeeDeck } // If `shutdown` url requested w/ POST, then shutdown the server after serving the page - if ((req.HttpMethod == "POST") && (req.Url.AbsolutePath == "/keyboard/stratogem")) + if ((req.HttpMethod == "POST") && (req.Url.AbsolutePath.StartsWith("/button"))) { - - - //new uint[] { 0x65, 0x68, 0x62, 0x66, 0x64, 0x68, 0x0D, 0x0D, } - foreach (var key in HelldiversTwoMacro.stratogems[postParams["stratogem"]]) + try { - KeyboardMacro.SendKey(key); - Console.WriteLine(key); + string module = req.Url.AbsolutePath.Replace("/button", ""); + Console.WriteLine("Call module " + module); + Console.WriteLine(postParams["stratogem"]); + + callButtonAction(module, postParams); + + resp.StatusCode = (int)HttpStatusCode.OK; } - resp.Redirect("/"); + 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; } + if (req.Url.AbsolutePath.Contains(".")) + { + string filename = Path.Combine("./", req.Url.AbsolutePath.Substring(1)); + if (File.Exists(filename)) + { + try + { + Stream input = new FileStream(filename, FileMode.Open); + + string mime; + resp.ContentType = mimeTypes.TryGetValue(Path.GetExtension(filename), out mime) + ? mime + : "application/octet-stream"; + resp.ContentLength64 = input.Length; + resp.AddHeader("Date", DateTime.Now.ToString("r")); + resp.AddHeader("Last-Modified", File.GetLastWriteTime(filename).ToString("r")); + + byte[] buffer = new byte[1024 * 32]; + int nbytes; + while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0) + resp.OutputStream.Write(buffer, 0, nbytes); + input.Close(); + resp.OutputStream.Flush(); + + 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; + } + } + + // Make sure we don't increment the page views counter if `favicon.ico` is requested if (req.Url.AbsolutePath != "/favicon.ico") { pageViews += 1; } + + // Write the response info string disableSubmit = !runServer ? "disabled" : ""; byte[] data = Encoding.UTF8.GetBytes(String.Format((pageHeader + pageData + pageFooter), pageViews, disableSubmit)); @@ -123,7 +258,6 @@ namespace FakeeDeck } } - public static void serv() { foreach (var stratogem in HelldiversTwoMacro.stratogems) @@ -131,9 +265,8 @@ namespace FakeeDeck pageData += HelldiversTwoMacro.getButton(stratogem.Key); } - - // Create a Http server and start listening for incoming connections - listener = new HttpListener(); + // Create a Http server and start listening for incoming connections + listener = new HttpListener(); listener.Prefixes.Add(url); listener.Start(); Console.WriteLine("Listening for connections on {0}", url); @@ -146,6 +279,41 @@ namespace FakeeDeck listener.Close(); } - + private static void callButtonAction(string module, Dictionary postParams) + { + string cleanClass = module.Trim('/'); + + Type buttonClass = Type.GetType("FakeeDeck.ButtonType." + cleanClass, true); + MethodInfo method = buttonClass.GetMethod("invokeAction"); + + ParameterInfo[] pars = method.GetParameters(); + List parameters = new List(); + Console.WriteLine(module); + foreach (ParameterInfo p in pars) + { + if (p == null) + { + continue; + } + + Console.WriteLine(p.Name); + Console.WriteLine(postParams[p.Name]); + + if (p.Name != null && postParams.ContainsKey(p.Name)) + { + + parameters.Insert(p.Position, postParams[p.Name]); + Console.WriteLine(postParams[p.Name]); + } + else if (p.IsOptional && p.DefaultValue != null) + { + parameters.Insert(p.Position, p.DefaultValue); + } + } + Console.WriteLine(JsonSerializer.Serialize(parameters)); + + Console.WriteLine(method); + Console.WriteLine(method.Invoke(null, parameters.ToArray()).ToString()); + } } } diff --git a/FakeeDeck/StaticFiles/app.js b/FakeeDeck/StaticFiles/app.js new file mode 100644 index 0000000..65c69c1 --- /dev/null +++ b/FakeeDeck/StaticFiles/app.js @@ -0,0 +1,38 @@ +[].forEach.call(document.querySelectorAll('form'), function (form) { + form.addEventListener('submit', function (event) { + event.preventDefault(); + const target = event.currentTarget; + + console.log(target.method, target.action); + console.log(form.method, form.action); + console.log(form === target); + + var formData = new FormData(form); + + const xhttp = new XMLHttpRequest(); + xhttp.onload = function () { } + xhttp.onreadystatechange = function () { + if (xhttp.readyState === 4) { + if (xhttp.status === 200) { + console.log('successful'); + } else { + console.log('failed'); + } + } + } + + xhttp.open(target.method, target.action, true); + xhttp.send(urlencodeFormData(formData)); + }); +}); + +function urlencodeFormData(fd){ + var s = ''; + function encode(s){ return encodeURIComponent(s).replace(/%20/g,'+'); } + for(var pair of fd.entries()){ + if(typeof pair[1]=='string'){ + s += (s?'&':'') + encode(pair[0])+'='+encode(pair[1]); + } + } + return s; +} \ No newline at end of file