Synapse-OS-Assistant-And-AI.../AI C2 Server/MainForm.cs
0% [█ █ █ █ █ █ █ █ █ █] 100% ace1e61285 First commit!
2026-06-04 20:36:13 -05:00

287 lines
9.3 KiB
C#

// File: MainForm.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text.Json.Nodes;
using System.Windows.Forms;
namespace AI_C2_Server
{
public partial class MainForm : Form
{
[DllImport("user32.dll", SetLastError = true)]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
public MainForm()
{
InitializeComponent();
Logger.LogReceived += Logger_LogReceived;
}
private void MainForm_Load(object sender, EventArgs e)
{
notifyIcon.Visible = false;
// Load initial OpenAI settings
chkEnableOpenAI.Checked = OperationCenter.Instance.UseOpenAIMode;
txtOpenAIUrl.Text = OperationCenter.Instance.OpenAIApiUrl;
txtOpenAIKey.Text = OperationCenter.Instance.OpenAIApiKey;
WebServer.Instance.Start();
timerUpdateInstances.Start();
this.Deactivate += MainForm_Deactivate;
}
private void MainForm_Deactivate(object? sender, EventArgs e)
{
if (!this.Disposing && !this.IsDisposed)
{
notifyIcon?.Visible = true;
this.Hide();
}
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
timerUpdateInstances.Stop();
WebServer.Instance.Stop();
}
private void Logger_LogReceived(string message)
{
if (rtbConsole.InvokeRequired)
{
rtbConsole.Invoke(new Action(() => Logger_LogReceived(message)));
return;
}
rtbConsole.AppendText($"[{DateTime.Now:HH:mm:ss}] {message}" + Environment.NewLine);
if (rtbConsole.Lines.Length > 1000)
{
int excessLines = rtbConsole.Lines.Length - 1000;
int indexToCut = rtbConsole.GetFirstCharIndexFromLine(excessLines);
rtbConsole.Select(0, indexToCut);
rtbConsole.SelectedText = "";
}
rtbConsole.ScrollToCaret();
}
private void RestartServer()
{
Logger.Log("[SYSTEM] Restarting server and clearing state...");
WebServer.Instance.Stop();
OperationCenter.Instance.ClearAll();
listViewInstances.Items.Clear();
// Reset UI state for OpenAI
chkEnableOpenAI.Checked = false;
WebServer.Instance.Start();
}
private void btnRestart_Click(object sender, EventArgs e)
{
RestartServer();
}
private void MainForm_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
notifyIcon.Visible = true;
this.Hide();
}
}
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
RestoreForm();
}
private void notifyIcon_Click(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
RestoreForm();
}
}
private void showServerToolStripMenuItem_Click(object sender, EventArgs e)
{
RestoreForm();
}
private void RestoreForm()
{
this.Show();
//this.WindowState = FormWindowState.Normal;
this.BringToFront();
notifyIcon.Visible = false;
SwitchToThisWindow(this.Handle, true);
}
private void restartServerToolStripMenuItem_Click(object sender, EventArgs e)
{
RestartServer();
}
private void exitShutdownToolStripMenuItem_Click(object sender, EventArgs e)
{
WebServer.Instance.Stop();
OperationCenter.Instance.ClearAll();
Close();
}
private void timerUpdateInstances_Tick(object sender, EventArgs e)
{
var instances = OperationCenter.Instance.GetActiveInstances();
listViewInstances.BeginUpdate();
// Remove stale items
var keysToRemove = new List<ListViewItem>();
foreach (ListViewItem item in listViewInstances.Items)
{
if (!instances.ContainsKey(item.Name)) keysToRemove.Add(item);
}
foreach (var item in keysToRemove) listViewInstances.Items.Remove(item);
// Add or update items
foreach (var kvp in instances)
{
string id = kvp.Key;
var data = kvp.Value as JsonObject;
string platform = data?["platform"]?.ToString() ?? "Unknown";
string status = (data?["is_busy"]?.GetValue<bool>() ?? false) ? "Busy" : "Idle";
DateTime lastSeenTime;
string lastSeenStr = data?["last_seen"]?.ToString() ?? "";
if (DateTime.TryParse(lastSeenStr, out lastSeenTime))
{
lastSeenStr = lastSeenTime.ToString("HH:mm:ss");
}
if (listViewInstances.Items.ContainsKey(id))
{
var item = listViewInstances.Items[id];
item.SubItems[0].Text = platform;
item.SubItems[1].Text = id;
item.SubItems[2].Text = status;
item.SubItems[3].Text = lastSeenStr;
}
else
{
var item = new ListViewItem(new[] { platform, id, status, lastSeenStr }) { Name = id };
listViewInstances.Items.Add(item);
}
}
listViewInstances.EndUpdate();
// Keep the checkbox in sync if the OpenAI instance was shut down via the list view
if (chkEnableOpenAI.Checked && !OperationCenter.Instance.UseOpenAIMode)
{
chkEnableOpenAI.Checked = false;
}
}
private void ResetSelectedInstanceChat()
{
if (listViewInstances.SelectedItems.Count > 0)
{
string instanceId = listViewInstances.SelectedItems[0].Name;
if (OperationCenter.Instance.IsOpenAIInstance(instanceId))
{
OperationCenter.Instance.ClearChatHistory(instanceId);
Logger.Log($"[ADMIN] Reset chat history for OpenAI instance {instanceId}");
}
else
{
OperationCenter.Instance.QueueCommand(new JsonObject { ["type"] = "NEW_CHAT" }, instanceId);
Logger.Log($"[ADMIN] Sent NEW_CHAT command to {instanceId}");
}
}
}
private void ShutdownSelectedInstance()
{
if (listViewInstances.SelectedItems.Count > 0)
{
string instanceId = listViewInstances.SelectedItems[0].Name;
OperationCenter.Instance.ShutdownInstance(instanceId);
Logger.Log($"[ADMIN] Sent SHUTDOWN command to {instanceId} and removed from active list.");
listViewInstances.Items.RemoveByKey(instanceId);
}
}
private void btnResetChat_Click(object sender, EventArgs e)
{
ResetSelectedInstanceChat();
}
private void btnShutdown_Click(object sender, EventArgs e)
{
ShutdownSelectedInstance();
}
private void resetChatToolStripMenuItem_Click(object sender, EventArgs e)
{
ResetSelectedInstanceChat();
}
private void shutdownHarnessToolStripMenuItem_Click(object sender, EventArgs e)
{
ShutdownSelectedInstance();
}
private void chkEnableOpenAI_CheckedChanged(object sender, EventArgs e)
{
if (chkEnableOpenAI.Checked)
{
OperationCenter.Instance.EnableOpenAIMode(txtOpenAIUrl.Text, txtOpenAIKey.Text);
Logger.Log($"[SYSTEM] OpenAI API Mode: Enabled");
}
else
{
OperationCenter.Instance.DisableOpenAIMode();
Logger.Log($"[SYSTEM] OpenAI API Mode: Disabled");
}
}
private void txtOpenAIUrl_TextChanged(object sender, EventArgs e)
{
if (OperationCenter.Instance.UseOpenAIMode)
{
OperationCenter.Instance.OpenAIApiUrl = txtOpenAIUrl.Text;
OperationCenter.Instance.UpdateOpenAIUrl(txtOpenAIUrl.Text);
}
}
private void txtOpenAIKey_TextChanged(object sender, EventArgs e)
{
if (OperationCenter.Instance.UseOpenAIMode)
{
OperationCenter.Instance.OpenAIApiKey = txtOpenAIKey.Text;
}
}
private void restartApplicationToolStripMenuItem_Click(object sender, EventArgs e)
{
// Start a new instance of the current executable
Process.Start(new ProcessStartInfo
{
FileName = Environment.ProcessPath,
UseShellExecute = true
});
WebServer.Instance.Stop();
OperationCenter.Instance.ClearAll();
Close();
}
}
}