Files
HellionChat/ChatTwo/Http/ServerCore.cs
T
Infi 2ababa82b0 - Implement better start/stop for the webinterface
- Save session tokens between startups
2024-08-28 14:09:09 +02:00

136 lines
3.5 KiB
C#

using ChatTwo.Http.MessageProtocol;
namespace ChatTwo.Http;
public class ServerCore : IAsyncDisposable
{
private readonly Plugin Plugin;
private readonly HostContext HostContext;
public ServerCore(Plugin plugin)
{
Plugin = plugin;
HostContext = new HostContext(plugin);
}
#region SSE Helper
internal void SendNewMessage(Message message)
{
if (!HostContext.IsActive)
return;
try
{
Plugin.Framework.RunOnTick(() =>
{
var bundledResponse = new NewMessageEvent(new Messages([HostContext.Processing.ReadMessageContent(message)]));
foreach (var eventServer in HostContext.EventConnections)
eventServer.OutboundQueue.Enqueue(bundledResponse);
});
}
catch (Exception ex)
{
Plugin.Log.Error(ex, "Sending message over SSE failed.");
}
}
internal void SendBulkMessageList()
{
if (!HostContext.IsActive)
return;
try
{
Plugin.Framework.RunOnTick(() =>
{
foreach (var eventServer in HostContext.EventConnections)
eventServer.OutboundQueue.Enqueue(new BulkMessagesEvent(new Messages(HostContext.Processing.ReadMessageList().Result)));
});
}
catch (Exception ex)
{
Plugin.Log.Error(ex, "Sending channel switch over SSE failed.");
}
}
internal void SendChannelSwitch(Chunk[] channelName)
{
if (!HostContext.IsActive)
return;
try
{
Plugin.Framework.RunOnTick(() =>
{
var bundledResponse = new SwitchChannelEvent(new SwitchChannel(HostContext.Processing.ReadChannelName(channelName)));
foreach (var eventServer in HostContext.EventConnections)
eventServer.OutboundQueue.Enqueue(bundledResponse);
});
}
catch (Exception ex)
{
Plugin.Log.Error(ex, "Sending channel switch over SSE failed.");
}
}
internal void SendChannelList()
{
if (!HostContext.IsActive)
return;
try
{
Plugin.Framework.RunOnTick(() =>
{
var channels = Plugin.ChatLogWindow.GetAvailableChannels();
var bundledResponse = new ChannelListEvent(new ChannelList(channels.ToDictionary(pair => pair.Key, pair => (uint)pair.Value)));
foreach (var eventServer in HostContext.EventConnections)
eventServer.OutboundQueue.Enqueue(bundledResponse);
});
}
catch (Exception ex)
{
Plugin.Log.Error(ex, "Sending channel switch over SSE failed.");
}
}
#endregion
public void InvalidateSessions()
{
if (!HostContext.IsActive)
return;
Plugin.Config.SessionTokens.Clear();
Plugin.SaveConfig();
}
public bool IsActive()
{
return HostContext is { IsActive: true, Host.IsListening: true };
}
public bool IsStopping()
{
return HostContext is { IsActive: false, IsStopping: true };
}
public bool Start()
{
return HostContext.Start();
}
public void Run()
{
HostContext.Run();
}
public async ValueTask<bool> Stop()
{
return await HostContext.Stop();
}
public async ValueTask DisposeAsync()
{
await HostContext.DisposeAsync();
}
}