Files
linker/cmonitor/server/service/messengers/screen/ScreenMessenger.cs
2023-11-20 16:07:55 +08:00

101 lines
3.9 KiB
C#

using cmonitor.server.api;
using cmonitor.server.client.reports.screen;
using cmonitor.server.service.messengers.sign;
using MemoryPack;
namespace cmonitor.server.service.messengers.screen
{
public sealed class ScreenMessenger : IMessenger
{
private readonly ScreenReport screenReport;
private readonly IClientServer clientServer;
private readonly Config config;
private readonly SignCaching signCaching;
public ScreenMessenger(ScreenReport screenReport, IClientServer clientServer, Config config, SignCaching signCaching)
{
this.screenReport = screenReport;
this.clientServer = clientServer;
this.config = config;
this.signCaching = signCaching;
}
[MessengerId((ushort)ScreenMessengerIds.CaptureFull)]
public void CaptureFull(IConnection connection)
{
ScreenReportFullType reportType = ScreenReportFullType.Trim;
if (connection.ReceiveRequestWrap.Payload.Length > 0)
{
reportType = (ScreenReportFullType)connection.ReceiveRequestWrap.Payload.Span[0];
}
screenReport.CaptureFull(reportType);
}
[MessengerId((ushort)ScreenMessengerIds.CaptureFullReport)]
public void CaptureFullReport(IConnection connection)
{
if (signCaching.Get(connection.Name, out SignCacheInfo cache))
{
if (cache.Version == config.Version)
{
clientServer.Notify("/notify/report/screen/full", connection.Name, connection.ReceiveRequestWrap.Payload);
}
else
{
string base64 = MemoryPackSerializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
clientServer.Notify("/notify/report/screen/full", new { connection.Name, Img = base64 });
}
}
}
[MessengerId((ushort)ScreenMessengerIds.CaptureClip)]
public void CaptureClip(IConnection connection)
{
screenReport.CaptureClip(MemoryPackSerializer.Deserialize<ScreenClipInfo>(connection.ReceiveRequestWrap.Payload.Span));
}
[MessengerId((ushort)ScreenMessengerIds.CaptureRegion)]
public void CaptureRegion(IConnection connection)
{
screenReport.CaptureRegion();
}
[MessengerId((ushort)ScreenMessengerIds.CaptureRegionReport)]
public void CaptureRegionReport(IConnection connection)
{
clientServer.Notify("/notify/report/screen/region", connection.Name, connection.ReceiveRequestWrap.Payload);
}
[MessengerId((ushort)ScreenMessengerIds.CaptureRectangles)]
public void CaptureRectangles(IConnection connection)
{
Rectangle[] rectangles = MemoryPackSerializer.Deserialize<Rectangle[]>(connection.ReceiveRequestWrap.Payload.Span);
clientServer.Notify("/notify/report/screen/rectangles", new { Name = connection.Name, Rectangles = rectangles });
}
[MessengerId((ushort)ScreenMessengerIds.DisplayState)]
public void DisplayState(IConnection connection)
{
if (connection.ReceiveRequestWrap.Payload.Length == 1)
{
byte state = connection.ReceiveRequestWrap.Payload.Span[0];
screenReport.DisplayState(state == 1);
}
}
[MessengerId((ushort)ScreenMessengerIds.ScreenShare)]
public void ScreenShare(IConnection connection)
{
screenReport.ScreenShare(connection.ReceiveRequestWrap.Payload);
}
[MessengerId((ushort)ScreenMessengerIds.ScreenShareState)]
public void ScreenShareState(IConnection connection)
{
screenReport.ScreenShareState((ScreenShareStates)connection.ReceiveRequestWrap.Payload.Span[0]);
}
}
}