LRM VS Solution
This commit is contained in:
parent
f60d76db9a
commit
77cd0ca4eb
12 changed files with 214 additions and 161 deletions
25
ServerProject-DONT-IMPORT-INTO-UNITY/LRM.sln
Normal file
25
ServerProject-DONT-IMPORT-INTO-UNITY/LRM.sln
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 16
|
||||||
|
VisualStudioVersion = 16.0.31129.286
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LRM", "LRM\LRM.csproj", "{BA0E55C8-6B24-4690-AC55-1DDDB4F7C05F}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{BA0E55C8-6B24-4690-AC55-1DDDB4F7C05F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{BA0E55C8-6B24-4690-AC55-1DDDB4F7C05F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{BA0E55C8-6B24-4690-AC55-1DDDB4F7C05F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{BA0E55C8-6B24-4690-AC55-1DDDB4F7C05F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {3B4C70D2-0DA3-4638-9D5E-03F35729DC2B}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
|
|
@ -1,60 +1,60 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace LightReflectiveMirror.Compression
|
namespace LightReflectiveMirror.Compression
|
||||||
{
|
{
|
||||||
internal static class StringCompressor
|
internal static class StringCompressor
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Compresses the string.
|
/// Compresses the string.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="text">The text.</param>
|
/// <param name="text">The text.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string Compress(this string text)
|
public static string Compress(this string text)
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.UTF8.GetBytes(text);
|
byte[] buffer = Encoding.UTF8.GetBytes(text);
|
||||||
var memoryStream = new MemoryStream();
|
var memoryStream = new MemoryStream();
|
||||||
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
|
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
|
||||||
{
|
{
|
||||||
gZipStream.Write(buffer, 0, buffer.Length);
|
gZipStream.Write(buffer, 0, buffer.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
memoryStream.Position = 0;
|
memoryStream.Position = 0;
|
||||||
|
|
||||||
var compressedData = new byte[memoryStream.Length];
|
var compressedData = new byte[memoryStream.Length];
|
||||||
memoryStream.Read(compressedData, 0, compressedData.Length);
|
memoryStream.Read(compressedData, 0, compressedData.Length);
|
||||||
|
|
||||||
var gZipBuffer = new byte[compressedData.Length + 4];
|
var gZipBuffer = new byte[compressedData.Length + 4];
|
||||||
Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
|
Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
|
||||||
Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
|
Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
|
||||||
return Convert.ToBase64String(gZipBuffer);
|
return Convert.ToBase64String(gZipBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Decompresses the string.
|
/// Decompresses the string.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="compressedText">The compressed text.</param>
|
/// <param name="compressedText">The compressed text.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string Decompress(this string compressedText)
|
public static string Decompress(this string compressedText)
|
||||||
{
|
{
|
||||||
byte[] gZipBuffer = Convert.FromBase64String(compressedText);
|
byte[] gZipBuffer = Convert.FromBase64String(compressedText);
|
||||||
using (var memoryStream = new MemoryStream())
|
using (var memoryStream = new MemoryStream())
|
||||||
{
|
{
|
||||||
int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
|
int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
|
||||||
memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);
|
memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);
|
||||||
|
|
||||||
var buffer = new byte[dataLength];
|
var buffer = new byte[dataLength];
|
||||||
|
|
||||||
memoryStream.Position = 0;
|
memoryStream.Position = 0;
|
||||||
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
|
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
|
||||||
{
|
{
|
||||||
gZipStream.Read(buffer, 0, buffer.Length);
|
gZipStream.Read(buffer, 0, buffer.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Encoding.UTF8.GetString(buffer);
|
return Encoding.UTF8.GetString(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,101 +1,101 @@
|
||||||
using Grapevine;
|
using Grapevine;
|
||||||
using LightReflectiveMirror.Compression;
|
using LightReflectiveMirror.Compression;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace LightReflectiveMirror.Endpoints
|
namespace LightReflectiveMirror.Endpoints
|
||||||
{
|
{
|
||||||
[Serializable]
|
[Serializable]
|
||||||
struct RelayStats
|
struct RelayStats
|
||||||
{
|
{
|
||||||
public int ConnectedClients;
|
public int ConnectedClients;
|
||||||
public int RoomCount;
|
public int RoomCount;
|
||||||
public int PublicRoomCount;
|
public int PublicRoomCount;
|
||||||
public TimeSpan Uptime;
|
public TimeSpan Uptime;
|
||||||
}
|
}
|
||||||
|
|
||||||
[RestResource]
|
[RestResource]
|
||||||
public class Endpoint
|
public class Endpoint
|
||||||
{
|
{
|
||||||
private List<Room> _rooms { get => Program.instance.GetRooms(); }
|
private List<Room> _rooms { get => Program.instance.GetRooms(); }
|
||||||
|
|
||||||
private RelayStats _stats { get => new RelayStats
|
private RelayStats _stats { get => new RelayStats
|
||||||
{
|
{
|
||||||
ConnectedClients = Program.instance.GetConnections(),
|
ConnectedClients = Program.instance.GetConnections(),
|
||||||
RoomCount = Program.instance.GetRooms().Count,
|
RoomCount = Program.instance.GetRooms().Count,
|
||||||
PublicRoomCount = Program.instance.GetPublicRoomCount(),
|
PublicRoomCount = Program.instance.GetPublicRoomCount(),
|
||||||
Uptime = Program.instance.GetUptime()
|
Uptime = Program.instance.GetUptime()
|
||||||
}; }
|
}; }
|
||||||
|
|
||||||
[RestRoute("Get", "/api/stats")]
|
[RestRoute("Get", "/api/stats")]
|
||||||
public async Task Stats(IHttpContext context)
|
public async Task Stats(IHttpContext context)
|
||||||
{
|
{
|
||||||
string json = JsonConvert.SerializeObject(_stats, Formatting.Indented);
|
string json = JsonConvert.SerializeObject(_stats, Formatting.Indented);
|
||||||
await context.Response.SendResponseAsync(json);
|
await context.Response.SendResponseAsync(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
[RestRoute("Get", "/api/servers")]
|
[RestRoute("Get", "/api/servers")]
|
||||||
public async Task ServerList(IHttpContext context)
|
public async Task ServerList(IHttpContext context)
|
||||||
{
|
{
|
||||||
if (Program.conf.EndpointServerList)
|
if (Program.conf.EndpointServerList)
|
||||||
{
|
{
|
||||||
string json = JsonConvert.SerializeObject(_rooms, Formatting.Indented);
|
string json = JsonConvert.SerializeObject(_rooms, Formatting.Indented);
|
||||||
await context.Response.SendResponseAsync(json);
|
await context.Response.SendResponseAsync(json);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
await context.Response.SendResponseAsync(HttpStatusCode.Forbidden);
|
await context.Response.SendResponseAsync(HttpStatusCode.Forbidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
[RestRoute("Get", "/api/compressed/servers")]
|
[RestRoute("Get", "/api/compressed/servers")]
|
||||||
public async Task ServerListCompressed(IHttpContext context)
|
public async Task ServerListCompressed(IHttpContext context)
|
||||||
{
|
{
|
||||||
if (Program.conf.EndpointServerList)
|
if (Program.conf.EndpointServerList)
|
||||||
{
|
{
|
||||||
string json = JsonConvert.SerializeObject(_rooms);
|
string json = JsonConvert.SerializeObject(_rooms);
|
||||||
await context.Response.SendResponseAsync(json.Compress());
|
await context.Response.SendResponseAsync(json.Compress());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
await context.Response.SendResponseAsync(HttpStatusCode.Forbidden);
|
await context.Response.SendResponseAsync(HttpStatusCode.Forbidden);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EndpointServer
|
public class EndpointServer
|
||||||
{
|
{
|
||||||
public bool Start(ushort port = 8080)
|
public bool Start(ushort port = 8080)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var config = new ConfigurationBuilder()
|
var config = new ConfigurationBuilder()
|
||||||
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
|
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
|
||||||
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
|
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
var server = new RestServerBuilder(new ServiceCollection(), config,
|
var server = new RestServerBuilder(new ServiceCollection(), config,
|
||||||
(services) =>
|
(services) =>
|
||||||
{
|
{
|
||||||
services.AddLogging(configure => configure.AddConsole());
|
services.AddLogging(configure => configure.AddConsole());
|
||||||
services.Configure<LoggerFilterOptions>(options => options.MinLevel = LogLevel.None);
|
services.Configure<LoggerFilterOptions>(options => options.MinLevel = LogLevel.None);
|
||||||
}, (server) =>
|
}, (server) =>
|
||||||
{
|
{
|
||||||
server.Prefixes.Add($"http://*:{port}/");
|
server.Prefixes.Add($"http://*:{port}/");
|
||||||
}).Build();
|
}).Build();
|
||||||
|
|
||||||
server.Router.Options.SendExceptionMessages = false;
|
server.Router.Options.SendExceptionMessages = false;
|
||||||
server.Start();
|
server.Start();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
3
ServerProject-DONT-IMPORT-INTO-UNITY/LRM/FodyWeavers.xml
Normal file
3
ServerProject-DONT-IMPORT-INTO-UNITY/LRM/FodyWeavers.xml
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
|
||||||
|
<Costura />
|
||||||
|
</Weavers>
|
||||||
25
ServerProject-DONT-IMPORT-INTO-UNITY/LRM/LRM.csproj
Normal file
25
ServerProject-DONT-IMPORT-INTO-UNITY/LRM/LRM.csproj
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Costura.Fody" Version="5.1.0">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Grapevine" Version="5.0.0-rc.5" />
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
Loading…
Reference in a new issue