commit a70a45df8d3888295a02ec60f676eaa1c516a475
Author: retoor <retoor@molodetz.nl>
Date:   Wed Mar 19 20:40:31 2025 +0100

    Initial commit.

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d54cd43
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.r_history
+bin
+obj
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..3cfd777
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,19 @@
+# Author: retoor@molodetz.nl
+
+# Makefile for building WebSocketClient project
+
+.PHONY: all clean linux windows
+
+run: 
+	dotnet run
+
+all: linux windows
+
+linux:
+	dotnet publish -c Release -r linux-x64 --self-contained --framework net9.0
+
+windows:
+	dotnet publish -c Release -r win-x64 --self-contained --framework net9.0
+
+clean:
+	dotnet clean
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..d3f0ce5
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Net.WebSockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using System.Diagnostics;
+
+class Program
+{
+    static async Task Main(string[] args)
+    {
+        string username = Environment.GetEnvironmentVariable("SNEK_USERNAME") ?? "anonymous";
+        string password = Environment.GetEnvironmentVariable("SNEK_PASSWORD") ?? "anonymous";
+
+        using (var client = new ClientWebSocket())
+        {
+            Uri serverUri = new Uri("wss://snek.molodetz.nl/rpc.ws");
+            await client.ConnectAsync(serverUri, CancellationToken.None);
+
+            var jsonMessage = JsonConvert.SerializeObject(new {
+                method = "login",
+                args = new[] { username, password }
+            });
+
+            var bytes = Encoding.UTF8.GetBytes(jsonMessage);
+            var buffer = new ArraySegment<byte>(bytes);
+            await client.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
+
+            Console.WriteLine("Message sent: " + jsonMessage);
+            Boolean isLoggedIn = false;
+            var receiveBuffer = new byte[1024000]; // Increased buffer size
+            while (client.State == WebSocketState.Open)
+            {
+                try
+                {
+                    WebSocketReceiveResult result = await client.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
+                    var responseMessage = Encoding.UTF8.GetString(receiveBuffer, 0, result.Count);
+                    Console.WriteLine("Message received: " + responseMessage);
+
+                    dynamic jsonResponse = JsonConvert.DeserializeObject(responseMessage);
+                    if(!isLoggedIn)
+                    {
+                        isLoggedIn = true;
+                        continue;
+                    }
+                    string receivedUsername = jsonResponse.username != null ? System.Security.SecurityElement.Escape((string)jsonResponse.username) : "Unknown User";
+                    string message = jsonResponse.message != null ? System.Security.SecurityElement.Escape((string)jsonResponse.message) : "No message provided";
+
+                    if (receivedUsername != username)
+                    {
+                        string command = $"notify-send '{receivedUsername}' '{message}'";
+                        await ExecuteCommand(command);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine("Error processing message: " + ex.Message);
+                }
+            }
+        }
+    }
+
+    private static async Task ExecuteCommand(string command)
+    {
+        using (var process = new Process())
+        {
+            process.StartInfo.FileName = "bash";
+            process.StartInfo.Arguments = "-c \"" + command + "\"";
+            process.StartInfo.RedirectStandardOutput = true;
+            process.StartInfo.UseShellExecute = false;
+            process.StartInfo.CreateNoWindow = true;
+            process.Start();
+            await process.WaitForExitAsync();
+        }
+    }
+}
diff --git a/WebSocketClient.csproj b/WebSocketClient.csproj
new file mode 100644
index 0000000..2683a66
--- /dev/null
+++ b/WebSocketClient.csproj
@@ -0,0 +1,12 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net9.0</TargetFramework>
+    <Configuration>Release</Configuration>
+    <PublishSingleFile>true</PublishSingleFile>
+    <PublishTrimmed>true</PublishTrimmed>
+  </PropertyGroup>
+  <ItemGroup>
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
+  </ItemGroup>
+</Project>