Files

149 lines
4.0 KiB
C#

#nullable enable
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using Microsoft.Win32;
public class TrayApp : ApplicationContext
{
private NotifyIcon trayIcon;
private Telemetry telemetry;
private System.Windows.Forms.Timer timer;
private bool telemetryPaused = false;
public TrayApp()
{
telemetry = new Telemetry();
telemetry.Initialize();
trayIcon = new NotifyIcon()
{
Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath),
Visible = true,
Text = "Telemetry Running (UDP)"
};
var menu = new ContextMenuStrip();
// Show config.json
menu.Items.Add("Show Config", null, OnShowConfig);
// Reload config
menu.Items.Add("Reload Config", null, OnReloadConfig);
// Separator
menu.Items.Add(new ToolStripSeparator());
// Exit
menu.Items.Add("Exit", null, OnExit);
trayIcon.ContextMenuStrip = menu;
// Main telemetry timer
timer = new System.Windows.Forms.Timer();
timer.Interval = 1000;
timer.Tick += (s, e) =>
{
if (!telemetryPaused)
telemetry.UpdateAndSend();
};
timer.Start();
// Detect system sleep/wake
SystemEvents.PowerModeChanged += OnPowerModeChanged;
}
private void OnPowerModeChanged(object? sender, PowerModeChangedEventArgs e)
{
if (e.Mode == PowerModes.Suspend)
{
telemetryPaused = true;
}
else if (e.Mode == PowerModes.Resume)
{
telemetryPaused = true;
// Give Windows time to restore networking
var resumeTimer = new System.Windows.Forms.Timer();
resumeTimer.Interval = 3000; // 3 seconds
resumeTimer.Tick += (s, ev) =>
{
telemetryPaused = false;
resumeTimer.Stop();
resumeTimer.Dispose();
};
resumeTimer.Start();
}
}
// Show config.json in Explorer
private void OnShowConfig(object? sender, EventArgs e)
{
try
{
string exeDir = AppContext.BaseDirectory;
string cfgPath = Path.Combine(exeDir, "config.json");
if (File.Exists(cfgPath))
{
Process.Start("explorer.exe", $"/select,\"{cfgPath}\"");
}
else
{
MessageBox.Show(
"config.json not found.",
"Show Config",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
}
}
catch (Exception ex)
{
MessageBox.Show(
$"Failed to open config.json:\n{ex.Message}",
"Show Config Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
}
// Reload config handler
private void OnReloadConfig(object? sender, EventArgs e)
{
try
{
telemetry.Dispose();
telemetry = new Telemetry();
telemetry.Initialize();
MessageBox.Show(
"Configuration reloaded successfully.",
"Reload Config",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
}
catch (Exception ex)
{
MessageBox.Show(
$"Failed to reload configuration:\n{ex.Message}",
"Reload Config Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
}
private void OnExit(object? sender, EventArgs e)
{
telemetry.Dispose();
trayIcon.Visible = false;
Application.Exit();
}
}