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