Merge branch 'main' of https://git.steelants.cz/JonatanRek/FakeDeck
This commit is contained in:
commit
603a171f1b
9
FakeDeckUI/FakeDeck/App.xaml
Normal file
9
FakeDeckUI/FakeDeck/App.xaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<Application x:Class="FakeDeck.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="clr-namespace:FakeDeck"
|
||||||
|
StartupUri="MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
32
FakeDeckUI/FakeDeck/App.xaml.cs
Normal file
32
FakeDeckUI/FakeDeck/App.xaml.cs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
using FakeeDeck.Class;
|
||||||
|
using Microsoft.VisualBasic.Logging;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using Application = System.Windows.Application;
|
||||||
|
|
||||||
|
namespace FakeDeck
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for App.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public YamlHelper yaml;
|
||||||
|
|
||||||
|
protected override void OnStartup(StartupEventArgs e)
|
||||||
|
{
|
||||||
|
yaml = new YamlHelper();
|
||||||
|
|
||||||
|
new Thread(() =>
|
||||||
|
{
|
||||||
|
Thread.CurrentThread.IsBackground = true;
|
||||||
|
FakeDeckMain fakeDeck = new FakeDeckMain(yaml);
|
||||||
|
}).Start();
|
||||||
|
|
||||||
|
base.OnStartup(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
FakeDeckUI/FakeDeck/AssemblyInfo.cs
Normal file
10
FakeDeckUI/FakeDeck/AssemblyInfo.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
[assembly: ThemeInfo(
|
||||||
|
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// or application resource dictionaries)
|
||||||
|
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// app, or any theme specific resource dictionaries)
|
||||||
|
)]
|
@ -1,6 +1,7 @@
|
|||||||
using FakeeDeck.Class;
|
using FakeeDeck.Class;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -83,7 +84,7 @@ namespace FakeeDeck.ButtonType
|
|||||||
foreach (var key in stratogems[stratogem])
|
foreach (var key in stratogems[stratogem])
|
||||||
{
|
{
|
||||||
KeyboardMacro.SendKey(key);
|
KeyboardMacro.SendKey(key);
|
||||||
Console.WriteLine(key);
|
Debug.WriteLine(key);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
@ -9,6 +9,8 @@ namespace FakeeDeck.ButtonType
|
|||||||
{
|
{
|
||||||
internal class KeyboardMacro
|
internal class KeyboardMacro
|
||||||
{
|
{
|
||||||
|
//https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
|
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
|
||||||
public static extern void keybd_event(uint bVk, uint bScan, uint dwFlags, uint dwExtraInfo);
|
public static extern void keybd_event(uint bVk, uint bScan, uint dwFlags, uint dwExtraInfo);
|
||||||
|
|
@ -12,12 +12,17 @@ namespace FakeeDeck.ButtonType
|
|||||||
{
|
{
|
||||||
{ "play/pause", new uint[] { 0xB3}},
|
{ "play/pause", new uint[] { 0xB3}},
|
||||||
{ "mute", new uint[] { 0xAD }},
|
{ "mute", new uint[] { 0xAD }},
|
||||||
|
{ "next", new uint[] { 0xB0 }},
|
||||||
|
{ "previous", new uint[] { 0xB1 }},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public static Dictionary<string, string> mediaIcons = new Dictionary<string, string>
|
public static Dictionary<string, string> mediaIcons = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
{ "play/pause", "fa-play"},
|
{ "play/pause", "fa-play"},
|
||||||
{ "mute", "fa-volume-xmark"},
|
{ "mute", "fa-volume-xmark"},
|
||||||
|
{ "next", "fa-forward"},
|
||||||
|
{ "previous", "fa-backward"},
|
||||||
};
|
};
|
||||||
|
|
||||||
public static string getButton(string Key)
|
public static string getButton(string Key)
|
38
FakeDeckUI/FakeDeck/Class/AutoUpdateHelper.cs
Normal file
38
FakeDeckUI/FakeDeck/Class/AutoUpdateHelper.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using AutoUpdaterDotNET;
|
||||||
|
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
|
||||||
|
{
|
||||||
|
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/GamerClassN7/FakeDeck/releases/latest");
|
||||||
|
}
|
||||||
|
private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args)
|
||||||
|
{
|
||||||
|
JsonElement json = JsonDocument.Parse(args.RemoteData).RootElement;
|
||||||
|
args.UpdateInfo = new UpdateInfoEventArgs
|
||||||
|
{
|
||||||
|
CurrentVersion = json.GetProperty("tag_name").ToString().TrimStart('v')+ ".0",
|
||||||
|
DownloadURL = json.GetProperty("zipball_url").ToString(),
|
||||||
|
};
|
||||||
|
Debug.WriteLine("calling Updater");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
133
FakeDeckUI/FakeDeck/Class/FakeDeckMain.cs
Normal file
133
FakeDeckUI/FakeDeck/Class/FakeDeckMain.cs
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Net;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Reflection.PortableExecutable;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace FakeeDeck.Class
|
||||||
|
{
|
||||||
|
internal class FakeDeckMain
|
||||||
|
{
|
||||||
|
public static string pageHeader =
|
||||||
|
"<!DOCTYPE>" +
|
||||||
|
"<html>" +
|
||||||
|
" <head>" +
|
||||||
|
" <title>HttpListener Example</title>" +
|
||||||
|
" <link href=\"https://yarnpkg.com/en/package/normalize.css\" rel=\"stylesheet\">" +
|
||||||
|
" <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css\" rel=\"stylesheet\">" +
|
||||||
|
" <link href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css\" rel=\"stylesheet\">" +
|
||||||
|
" </head>" +
|
||||||
|
" <body>" +
|
||||||
|
" <div class=\"d-flex flex-wrap\">" +
|
||||||
|
" <div class=\"m-2\">" +
|
||||||
|
" <p style=\"margin-bottom: 0px; width: 150px;height: 150px;background-color: aquamarine;\" >Page Views: {0}</p>" +
|
||||||
|
" </div>";
|
||||||
|
public static string pageFooter =
|
||||||
|
" <div class=\"m-2\">" +
|
||||||
|
" <button style=\"width: 150px;height: 150px;background-color: aquamarine;\" onclick=\"!document.fullscreenElement ? document.documentElement.requestFullscreen() : document.exitFullscreen();\">" +
|
||||||
|
" <i class=\"fa-solid fa-maximize\"></i>" +
|
||||||
|
" </button>" +
|
||||||
|
" </div>" +
|
||||||
|
" </div>" +
|
||||||
|
" <script src=\"StaticFiles/app.js\"></script>" +
|
||||||
|
" </body>" +
|
||||||
|
"</html>";
|
||||||
|
public string pageData = "";
|
||||||
|
public FakeDeckMain(YamlHelper yaml)
|
||||||
|
{
|
||||||
|
HttpServer server = new HttpServer(yaml.getData().GetProperty("server").GetProperty("port").ToString());
|
||||||
|
|
||||||
|
foreach (JsonElement item in yaml.getData().GetProperty("pages").EnumerateArray())
|
||||||
|
{
|
||||||
|
Debug.WriteLine("PAGE: " + item.GetProperty("page"));
|
||||||
|
foreach (JsonElement button in item.GetProperty("buttons").EnumerateArray())
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var control in MediaMacro.mediaControls)
|
||||||
|
{
|
||||||
|
server.pageData += MediaMacro.getButton(control.Key);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
server.serv();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void callButtonAction(string module, Dictionary<string, string> 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<object> parameters = new List<object>();
|
||||||
|
|
||||||
|
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<string, string> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
28
FakeDeckUI/FakeDeck/Class/GeneralHelper.cs
Normal file
28
FakeDeckUI/FakeDeck/Class/GeneralHelper.cs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
|
||||||
|
namespace FakeDeck.Class
|
||||||
|
{
|
||||||
|
class GeneralHelper
|
||||||
|
{
|
||||||
|
public static BitmapImage BitmapToImageSource(System.Drawing.Bitmap bitmap)
|
||||||
|
{
|
||||||
|
using (MemoryStream memory = new MemoryStream())
|
||||||
|
{
|
||||||
|
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
|
||||||
|
memory.Position = 0;
|
||||||
|
BitmapImage bitmapimage = new BitmapImage();
|
||||||
|
bitmapimage.BeginInit();
|
||||||
|
bitmapimage.StreamSource = memory;
|
||||||
|
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
|
||||||
|
bitmapimage.EndInit();
|
||||||
|
return bitmapimage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,11 +18,19 @@ using System.Xml.Linq;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace FakeeDeck.Class
|
namespace FakeeDeck.Class
|
||||||
{
|
{
|
||||||
internal class HttpServer
|
internal class HttpServer
|
||||||
{
|
{
|
||||||
|
public string port = "8000";
|
||||||
|
public HttpServer(string port)
|
||||||
|
{
|
||||||
|
port = port;
|
||||||
|
}
|
||||||
|
|
||||||
private static IDictionary<string, string> mimeTypes = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) {
|
private static IDictionary<string, string> mimeTypes = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) {
|
||||||
{".asf", "video/x-ms-asf"},
|
{".asf", "video/x-ms-asf"},
|
||||||
{".asx", "video/x-ms-asf"},
|
{".asx", "video/x-ms-asf"},
|
||||||
@ -89,37 +97,21 @@ namespace FakeeDeck.Class
|
|||||||
{".xpi", "application/x-xpinstall"},
|
{".xpi", "application/x-xpinstall"},
|
||||||
{".zip", "application/zip"},
|
{".zip", "application/zip"},
|
||||||
};
|
};
|
||||||
|
private Dictionary<string, Dictionary<string, Delegate>> routes = new Dictionary<string, Dictionary<string, Delegate>>();
|
||||||
|
|
||||||
public static HttpListener listener;
|
public static HttpListener listener;
|
||||||
public static string url = "http://*:8000/";
|
|
||||||
public static int pageViews = 0;
|
public static int pageViews = 0;
|
||||||
public static int requestCount = 0;
|
public static int requestCount = 0;
|
||||||
public static string pageHeader =
|
|
||||||
"<!DOCTYPE>" +
|
public void addRoute(Delegate callback, string method = "GET", string route = "/")
|
||||||
"<html>" +
|
{
|
||||||
" <head>" +
|
if (!routes.ContainsKey(method))
|
||||||
" <title>HttpListener Example</title>" +
|
{
|
||||||
" <link href=\"https://yarnpkg.com/en/package/normalize.css\" rel=\"stylesheet\">" +
|
routes.Add(method, new Dictionary<string, Delegate>());
|
||||||
" <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css\" rel=\"stylesheet\">" +
|
}
|
||||||
" <link href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css\" rel=\"stylesheet\">" +
|
|
||||||
" </head>" +
|
routes[method].Add(route, callback);
|
||||||
" <body>" +
|
}
|
||||||
" <div class=\"d-flex flex-wrap\">" +
|
|
||||||
" <div class=\"m-2\">" +
|
|
||||||
" <p style=\"margin-bottom: 0px; width: 150px;height: 150px;background-color: aquamarine;\" >Page Views: {0}</p>" +
|
|
||||||
" </div>";
|
|
||||||
public static string pageFooter =
|
|
||||||
" <div class=\"m-2\">" +
|
|
||||||
" <button style=\"width: 150px;height: 150px;background-color: aquamarine;\" onclick=\"!document.fullscreenElement ? document.documentElement.requestFullscreen() : document.exitFullscreen();\">" +
|
|
||||||
" <i class=\"fa-solid fa-maximize\"></i>" +
|
|
||||||
" </button>" +
|
|
||||||
" </div>" +
|
|
||||||
" </div>" +
|
|
||||||
" <script src=\"StaticFiles/app.js\"></script>" +
|
|
||||||
" </body>" +
|
|
||||||
"</html>";
|
|
||||||
public string pageData = "";
|
|
||||||
private Dictionary<string, Dictionary<string, Action>> routes;
|
|
||||||
public async Task HandleIncomingConnections()
|
public async Task HandleIncomingConnections()
|
||||||
{
|
{
|
||||||
bool runServer = true;
|
bool runServer = true;
|
||||||
@ -135,66 +127,51 @@ namespace FakeeDeck.Class
|
|||||||
HttpListenerResponse resp = ctx.Response;
|
HttpListenerResponse resp = ctx.Response;
|
||||||
|
|
||||||
// Print out some info about the request
|
// Print out some info about the request
|
||||||
Console.WriteLine("Request #: {0}", ++requestCount);
|
/*Debug.WriteLine("Request #: {0}", ++requestCount);
|
||||||
Console.WriteLine(req.Url.ToString());
|
Debug.WriteLine(req.Url.ToString());
|
||||||
Console.WriteLine(req.HttpMethod);
|
Debug.WriteLine(req.HttpMethod);
|
||||||
Console.WriteLine(req.UserHostName);
|
Debug.WriteLine(req.UserHostName);
|
||||||
Console.WriteLine(req.UserAgent);
|
Debug.WriteLine(req.UserAgent);*/
|
||||||
Console.WriteLine();
|
|
||||||
|
|
||||||
if (req.HttpMethod == "POST")
|
if (req.HttpMethod == "GET" && req.Url.AbsolutePath.Contains("."))
|
||||||
{
|
{
|
||||||
//Parse Port Parameters
|
await servFileResponseAsync(req, resp);
|
||||||
Dictionary<string, string> postParams = parsePostRequestParameters(req);
|
}
|
||||||
// If `shutdown` url requested w/ POST, then shutdown the server after serving the page
|
else
|
||||||
if (req.Url.AbsolutePath == "/shutdown")
|
{
|
||||||
|
bool isMatch = false;
|
||||||
|
foreach (var route in routes[req.HttpMethod])
|
||||||
{
|
{
|
||||||
Console.WriteLine("Shutdown requested");
|
isMatch = Regex.IsMatch(req.Url.AbsolutePath, route.Key, RegexOptions.IgnoreCase);
|
||||||
runServer = false;
|
if (isMatch)
|
||||||
|
{
|
||||||
|
Debug.WriteLine(route.Key);
|
||||||
|
Delegate gelegate = route.Value;
|
||||||
|
if (req.HttpMethod == "POST")
|
||||||
|
{
|
||||||
|
Dictionary<string, string> postParams = parsePostRequestParameters(req);
|
||||||
|
gelegate.DynamicInvoke([req, resp, postParams]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gelegate.DynamicInvoke([req, resp]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (req.Url.AbsolutePath.StartsWith("/button"))
|
|
||||||
|
if (!isMatch)
|
||||||
{
|
{
|
||||||
try
|
resp.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
{
|
await resp.OutputStream.FlushAsync();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (req.HttpMethod == "GET")
|
resp.Close();
|
||||||
{
|
|
||||||
if (req.Url.AbsolutePath.Contains("."))
|
|
||||||
{
|
|
||||||
await servFileResponseAsync(req, resp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await servViewResponseAsync(req, resp);
|
|
||||||
}
|
|
||||||
resp.Close();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void serv()
|
public void serv()
|
||||||
{
|
{
|
||||||
|
string url = "http://*:" + port + "/";
|
||||||
// Create a Http server and start listening for incoming connections
|
// Create a Http server and start listening for incoming connections
|
||||||
listener = new HttpListener();
|
listener = new HttpListener();
|
||||||
listener.Prefixes.Add(url);
|
listener.Prefixes.Add(url);
|
||||||
@ -209,50 +186,13 @@ namespace FakeeDeck.Class
|
|||||||
listener.Close();
|
listener.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void callButtonAction(string module, Dictionary<string, string> 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<object> parameters = new List<object>();
|
|
||||||
|
|
||||||
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)
|
private static async Task servFileResponseAsync(HttpListenerRequest req, HttpListenerResponse resp)
|
||||||
{
|
{
|
||||||
string filename = Path.Combine("./", req.Url.AbsolutePath.Substring(1));
|
string filename = Path.Combine("./", req.Url.AbsolutePath.Substring(1));
|
||||||
if (!File.Exists(filename))
|
if (!File.Exists(filename))
|
||||||
{
|
{
|
||||||
resp.StatusCode = (int)HttpStatusCode.NotFound;
|
resp.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
resp.Close();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -286,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<string, string> parsePostRequestParameters(HttpListenerRequest req)
|
private static Dictionary<string, string> parsePostRequestParameters(HttpListenerRequest req)
|
||||||
{
|
{
|
||||||
Dictionary<string, string> postParams = new Dictionary<string, string>();
|
Dictionary<string, string> postParams = new Dictionary<string, string>();
|
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
@ -8,7 +9,7 @@ using YamlDotNet.Serialization;
|
|||||||
|
|
||||||
namespace FakeeDeck.Class
|
namespace FakeeDeck.Class
|
||||||
{
|
{
|
||||||
internal class YamlHelper
|
public class YamlHelper
|
||||||
{
|
{
|
||||||
JsonDocument jsonObjecz;
|
JsonDocument jsonObjecz;
|
||||||
public YamlHelper()
|
public YamlHelper()
|
@ -1,20 +1,17 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
<ItemGroup>
|
<PackageReference Include="Autoupdater.NET.Official" Version="1.9.2" />
|
||||||
<Folder Include="StaticFiles\" />
|
<PackageReference Include="QRCoder" Version="1.6.0" />
|
||||||
</ItemGroup>
|
<PackageReference Include="YamlDotNet" Version="16.1.0" />
|
||||||
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="YamlDotNet" Version="16.1.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Update="configuration.yaml">
|
<None Update="configuration.yaml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
17
FakeDeckUI/FakeDeck/MainWindow.xaml
Normal file
17
FakeDeckUI/FakeDeck/MainWindow.xaml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<Window x:Name="FakeDeckUI" x:Class="FakeDeck.MainWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:local="clr-namespace:FakeDeck"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="MainWindow" Height="450" Width="270" Activated="FakeDeckUI_Activated" WindowStartupLocation="CenterScreen">
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="270*"/>
|
||||||
|
<RowDefinition Height="50*"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Image x:Name="qr_code" Margin="10,10,10,10"/>
|
||||||
|
<TextBox Margin="10,10,10,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Grid.Row="1"/>
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
47
FakeDeckUI/FakeDeck/MainWindow.xaml.cs
Normal file
47
FakeDeckUI/FakeDeck/MainWindow.xaml.cs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
using FakeDeck.Class;
|
||||||
|
using FakeeDeck.Class;
|
||||||
|
using QRCoder;
|
||||||
|
using System.Reflection.Emit;
|
||||||
|
using System.Text;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
using static QRCoder.QRCodeGenerator;
|
||||||
|
using static System.Runtime.CompilerServices.RuntimeHelpers;
|
||||||
|
using System.Drawing;
|
||||||
|
using Color = System.Drawing.Color;
|
||||||
|
using AutoUpdaterDotNET;
|
||||||
|
|
||||||
|
namespace FakeDeck
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for MainWindow.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FakeDeckUI_Activated(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
string port = ((App)Application.Current).yaml.getData().GetProperty("server").GetProperty("port").ToString();
|
||||||
|
string url = "http://localhost:" + port;
|
||||||
|
|
||||||
|
PayloadGenerator.Url qrCodePayload = new PayloadGenerator.Url(url);
|
||||||
|
QRCodeGenerator qrCodeGenerator = new QRCodeGenerator();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -57,4 +57,22 @@ pages:
|
|||||||
function: MediaMacro
|
function: MediaMacro
|
||||||
parameters:
|
parameters:
|
||||||
- name: Key
|
- name: Key
|
||||||
value: "mute"
|
value: "mute"
|
||||||
|
|
||||||
|
- button: mute
|
||||||
|
function: MediaMacro
|
||||||
|
parameters:
|
||||||
|
- name: Key
|
||||||
|
value: "previous"
|
||||||
|
|
||||||
|
- button: mute
|
||||||
|
function: MediaMacro
|
||||||
|
parameters:
|
||||||
|
- name: Key
|
||||||
|
value: "play/pause"
|
||||||
|
|
||||||
|
- button: mute
|
||||||
|
function: MediaMacro
|
||||||
|
parameters:
|
||||||
|
- name: Key
|
||||||
|
value: "next"
|
@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.11.35219.272
|
VisualStudioVersion = 17.11.35219.272
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FakeeDeck", "FakeeDeck\FakeeDeck.csproj", "{D8C79B08-1920-426A-9138-CF0C8BAE0EF7}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FakeDeck", "FakeDeckUI\FakeDeck\FakeDeck.csproj", "{D04AFC99-A929-4336-BD2C-1D49D149DB18}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -11,10 +11,10 @@ Global
|
|||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{D8C79B08-1920-426A-9138-CF0C8BAE0EF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{D04AFC99-A929-4336-BD2C-1D49D149DB18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{D8C79B08-1920-426A-9138-CF0C8BAE0EF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{D04AFC99-A929-4336-BD2C-1D49D149DB18}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{D8C79B08-1920-426A-9138-CF0C8BAE0EF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{D04AFC99-A929-4336-BD2C-1D49D149DB18}.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}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
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.Reflection;
|
|
||||||
using FakeeDeck.ButtonType;
|
|
||||||
using YamlDotNet.Serialization;
|
|
||||||
|
|
||||||
namespace FakeeDeck.Class
|
|
||||||
{
|
|
||||||
internal class FakeDeck
|
|
||||||
{
|
|
||||||
public FakeDeck()
|
|
||||||
{
|
|
||||||
|
|
||||||
YamlHelper yaml = new YamlHelper();
|
|
||||||
HttpServer server = new HttpServer();
|
|
||||||
|
|
||||||
foreach (JsonElement item in yaml.getData().GetProperty("pages").EnumerateArray())
|
|
||||||
{
|
|
||||||
Debug.WriteLine("PAGE: " + item.GetProperty("page"));
|
|
||||||
foreach (JsonElement button in item.GetProperty("buttons").EnumerateArray())
|
|
||||||
{
|
|
||||||
server.pageData += AbstractionHelper.getButtonVisual(button);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*foreach (var stratogem in HelldiversTwoMacro.stratogems)
|
|
||||||
{
|
|
||||||
server.pageData += HelldiversTwoMacro.getButton(stratogem.Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var control in MediaMacro.mediaControls)
|
|
||||||
{
|
|
||||||
server.pageData += MediaMacro.getButton(control.Key);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
server.serv();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
using FakeeDeck;
|
|
||||||
using FakeeDeck.Class;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Text.Json;
|
|
||||||
|
|
||||||
|
|
||||||
FakeDeck fakeDeck = new FakeDeck();
|
|
Loading…
Reference in New Issue
Block a user