added project files
This commit is contained in:
69
minecraft-launcher-server/Manifests.cs
Normal file
69
minecraft-launcher-server/Manifests.cs
Normal file
@@ -0,0 +1,69 @@
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DTLib;
|
||||
using DTLib.Extensions;
|
||||
using DTLib.Filesystem;
|
||||
using static launcher_server.Server;
|
||||
|
||||
namespace launcher_server;
|
||||
|
||||
public static class Manifests
|
||||
{
|
||||
static object manifestLocker = new();
|
||||
|
||||
public static void CreateManifest(IOPath dir)
|
||||
{
|
||||
if(!Directory.Exists(dir))
|
||||
{
|
||||
Directory.Create(dir);
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder manifestBuilder = new();
|
||||
Hasher hasher = new();
|
||||
var manifestPath = Path.Concat(dir, "manifest.dtsod");
|
||||
if (Directory.GetFiles(dir).Contains(manifestPath))
|
||||
File.Delete(manifestPath);
|
||||
foreach (var fileInDir in Directory.GetAllFiles(dir))
|
||||
{
|
||||
var fileRelative = fileInDir.RemoveBase(dir);
|
||||
manifestBuilder.Append(fileRelative);
|
||||
manifestBuilder.Append(": \"");
|
||||
byte[] hash = hasher.HashFile(Path.Concat(fileInDir));
|
||||
manifestBuilder.Append(hash.HashToString());
|
||||
manifestBuilder.Append("\";\n");
|
||||
}
|
||||
File.WriteAllText(manifestPath, manifestBuilder.ToString().Replace('\\','/'));
|
||||
}
|
||||
|
||||
public static void CreateAllManifests()
|
||||
{
|
||||
lock (manifestLocker)
|
||||
{
|
||||
var sync_and_remove_dir = Path.Concat(shared_dir, "sync_and_remove");
|
||||
CreateManifest(Path.Concat(shared_dir, "download_if_not_exist"));
|
||||
CreateManifest(Path.Concat(shared_dir, "sync_always"));
|
||||
if (!Directory.Exists(sync_and_remove_dir))
|
||||
Directory.Create(sync_and_remove_dir);
|
||||
else foreach (var dir in Directory.GetDirectories(sync_and_remove_dir))
|
||||
CreateManifest(dir);
|
||||
StringBuilder dirlist_content_builder = new("dirs: [\n");
|
||||
|
||||
var dirs = Directory.GetDirectories(sync_and_remove_dir);
|
||||
for (var i = 0; i < dirs.Length-1; i++)
|
||||
{
|
||||
dirlist_content_builder
|
||||
.Append("\t\"")
|
||||
.Append(dirs[i].RemoveBase(sync_and_remove_dir).Str.Replace('\\','/'))
|
||||
.Append("\",\n");
|
||||
}
|
||||
dirlist_content_builder
|
||||
.Append("\t\"")
|
||||
.Append(dirs[dirs.Length-1].RemoveBase(sync_and_remove_dir).Str.Replace('\\','/'))
|
||||
.Append("\"\n");
|
||||
|
||||
dirlist_content_builder.Append("];");
|
||||
File.WriteAllText(Path.Concat(sync_and_remove_dir, "dirlist.dtsod"), dirlist_content_builder.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
118
minecraft-launcher-server/Server.cs
Normal file
118
minecraft-launcher-server/Server.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using DTLib.Dtsod;
|
||||
using DTLib.Extensions;
|
||||
using DTLib.Filesystem;
|
||||
using DTLib.Logging;
|
||||
using DTLib.Network;
|
||||
|
||||
namespace launcher_server;
|
||||
|
||||
static class Server
|
||||
{
|
||||
private static ILogger logger = new CompositeLogger(
|
||||
new FileLogger("logs","launcher-server"),
|
||||
new ConsoleLogger());
|
||||
static readonly Socket mainSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
static DtsodV23 config = null!;
|
||||
public static readonly IOPath shared_dir = "public";
|
||||
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.Title = "minecraft_launcher_server";
|
||||
Console.InputEncoding = Encoding.Unicode;
|
||||
Console.OutputEncoding = Encoding.Unicode;
|
||||
|
||||
config = new DtsodV23(File.ReadAllText("minecraft-launcher-server.dtsod"));
|
||||
|
||||
logger.LogInfo("Main", $"local address: {config["local_ip"]}");
|
||||
logger.LogInfo("Main", $"public address: {Functions.GetPublicIP()}");
|
||||
logger.LogInfo("Main", $"port: {config["local_port"]}");
|
||||
mainSocket.Bind(new IPEndPoint(IPAddress.Parse(config["local_ip"]), config["local_port"]));
|
||||
mainSocket.Listen(1000);
|
||||
Manifests.CreateAllManifests();
|
||||
logger.LogInfo("Main", "server started succesfully");
|
||||
// запуск отдельного потока для каждого юзера
|
||||
logger.LogInfo("Main", "waiting for users");
|
||||
while (true)
|
||||
{
|
||||
var userSocket = mainSocket.Accept();
|
||||
var userThread = new Thread(obj => HandleUser((Socket)obj!));
|
||||
userThread.Start(userSocket);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError("Main", ex);
|
||||
mainSocket.Close();
|
||||
}
|
||||
logger.LogInfo("Main", "");
|
||||
}
|
||||
|
||||
// запускается для каждого юзера в отдельном потоке
|
||||
static void HandleUser(Socket handlerSocket)
|
||||
{
|
||||
logger.LogInfo(nameof(HandleUser), "user connecting... ");
|
||||
try
|
||||
{
|
||||
// тут запрос пароля заменён запросом заглушки
|
||||
handlerSocket.SendPackage("requesting user name");
|
||||
string connectionString = handlerSocket.GetPackage().BytesToString();
|
||||
FSP fsp = new(handlerSocket);
|
||||
|
||||
// запрос от апдейтера
|
||||
if (connectionString == "minecraft-launcher")
|
||||
{
|
||||
logger.LogInfo(nameof(HandleUser), "incoming connection from minecraft-launcher");
|
||||
handlerSocket.SendPackage("minecraft-launcher OK");
|
||||
// обработка запросов
|
||||
while (true)
|
||||
{
|
||||
if (handlerSocket.Available >= 2)
|
||||
{
|
||||
string request = handlerSocket.GetPackage().BytesToString();
|
||||
switch (request)
|
||||
{
|
||||
case "requesting launcher update":
|
||||
logger.LogInfo(nameof(HandleUser), "updater requested launcher update");
|
||||
// ReSharper disable once InconsistentlySynchronizedField
|
||||
fsp.UploadFile(Path.Concat(shared_dir, "minecraft-launcher.exe"));
|
||||
break;
|
||||
case "requesting file download":
|
||||
var file = handlerSocket.GetPackage().BytesToString();
|
||||
logger.LogInfo(nameof(HandleUser), $"updater requested file {file}");
|
||||
// ReSharper disable once InconsistentlySynchronizedField
|
||||
fsp.UploadFile(Path.Concat(shared_dir, file));
|
||||
break;
|
||||
default:
|
||||
throw new Exception("unknown request: " + request);
|
||||
}
|
||||
}
|
||||
else Thread.Sleep(50);
|
||||
}
|
||||
}
|
||||
// неизвестный юзер
|
||||
|
||||
logger.LogWarn(nameof(HandleUser),$"invalid connection string: '{connectionString}'");
|
||||
handlerSocket.SendPackage("invalid connection string");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogWarn(nameof(HandleUser), ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (handlerSocket.Connected) handlerSocket.Shutdown(SocketShutdown.Both);
|
||||
handlerSocket.Close();
|
||||
logger.LogInfo(nameof(HandleUser), "user disconnected");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
16
minecraft-launcher-server/launcher-server.csproj
Normal file
16
minecraft-launcher-server/launcher-server.csproj
Normal file
@@ -0,0 +1,16 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>launcher_server</RootNamespace>
|
||||
<AssemblyName>minecraft-launcher-server</AssemblyName>
|
||||
<ApplicationIcon>launcher.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DTLib.Dtsod" Version="1.3.1" />
|
||||
<PackageReference Include="DTLib.Logging" Version="1.3.1" />
|
||||
<PackageReference Include="DTLib.Network" Version="1.3.3" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
BIN
minecraft-launcher-server/launcher.ico
Normal file
BIN
minecraft-launcher-server/launcher.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 37 KiB |
@@ -0,0 +1,2 @@
|
||||
local_ip: "127.0.0.1";
|
||||
local_port: 25000;
|
||||
11
minecraft-launcher-server/minecraft-launcher-server.service
Normal file
11
minecraft-launcher-server/minecraft-launcher-server.service
Normal file
@@ -0,0 +1,11 @@
|
||||
# put this file in /etc/systemd/system/
|
||||
[Unit]
|
||||
Description=minecraft launcher backend in c#
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/minecraft-launcher/minecraft-launcher-server/bin/publish
|
||||
ExecStart=/opt/minecraft-launcher/minecraft-launcher-server/bin/publish/minecraft-launcher-server
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
10
minecraft-launcher-server/publish.sh
Normal file
10
minecraft-launcher-server/publish.sh
Normal file
@@ -0,0 +1,10 @@
|
||||
dotnet publish -c release -o bin/publish \
|
||||
--self-contained \
|
||||
--use-current-runtime \
|
||||
-p:PublishSingleFile=true \
|
||||
-p:PublishTrimmed=true \
|
||||
-p:TrimMode=partial \
|
||||
-p:EnableCompressionInSingleFile=true \
|
||||
-p:OptimizationPreference=Size \
|
||||
-p:InvariantGlobalization=true \
|
||||
-p:DebugType=none
|
||||
Reference in New Issue
Block a user