DTLib added as nuget packages

This commit is contained in:
timerix 2023-11-17 17:58:27 +06:00
parent e3a3fb5e5e
commit 518ac74dc7
17 changed files with 155 additions and 137 deletions

View File

@ -1,5 +1,6 @@
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Threading; using Avalonia.Threading;
using DTLib.Logging;
namespace Launcher.Client.Avalonia.GUI; namespace Launcher.Client.Avalonia.GUI;
@ -10,9 +11,9 @@ public partial class LauncherWindow : Window
InitializeComponent(); InitializeComponent();
LogBox.Text = Logger.Buffer; LogBox.Text = Logger.Buffer;
Logger.MessageSent += LogHandler; Logger.MessageSent += LogHandler;
LogfileLabel.Content = Logger.LogfileName.Remove(0,Logger.LogfileName.LastIndexOf(Путь.Разд)+1); LogfileLabel.Content = Logger.LogfileName.Remove(0,Logger.LogfileName.LastIndexOf(Path.Sep)+1);
LogfileLabel.PointerPressed += (_,_)=> LogfileLabel.PointerPressed += (_,_)=>
Process.Start("explorer.exe", LauncherLogger.LogfileDir); Process.Start("explorer.exe", LauncherLogger.LogfileDir.ToString()!);
LogfileLabel.PointerEnter += (_,_)=>LogfileLabel.Foreground=App.MySelectionColor; LogfileLabel.PointerEnter += (_,_)=>LogfileLabel.Foreground=App.MySelectionColor;
LogfileLabel.PointerLeave += (_,_)=>LogfileLabel.Foreground=App.MyWhite; LogfileLabel.PointerLeave += (_,_)=>LogfileLabel.Foreground=App.MyWhite;
LibraryButton.TabGrid = LibraryGrid; LibraryButton.TabGrid = LibraryGrid;
@ -26,14 +27,14 @@ public partial class LauncherWindow : Window
ProgramGrid.IsVisible = false; ProgramGrid.IsVisible = false;
SelectTab(LibraryButton, null); SelectTab(LibraryButton, null);
FillProgramsPanel(); FillProgramsPanel();
Logger.Log("launcher started"); Logger.LogInfo(nameof(LauncherWindow),"launcher started");
try try
{ {
throw new Exception("aaa"); throw new Exception("aaa");
} }
catch (Exception ex) catch (Exception ex)
{ {
LogError("main window", ex); LogError(nameof(LauncherWindow), ex);
} }
} }
@ -58,15 +59,15 @@ public partial class LauncherWindow : Window
private void FillProgramsPanel() private void FillProgramsPanel()
{ {
Logger.Log("reading descriptors..."); Logger.LogInfo(nameof(LauncherWindow),"reading descriptors...");
string[] descriptors = Directory.GetFiles("descriptors"); var descriptors = Directory.GetFiles("descriptors");
Programs = new Program[descriptors.Length]; Programs = new Program[descriptors.Length];
for (ushort i = 0; i < descriptors.Length; i++) for (ushort i = 0; i < descriptors.Length; i++)
{ {
string descriptor = descriptors[i]; var descriptor = descriptors[i];
if(descriptor.EndsWith(".descriptor")) if(descriptor.EndsWith(".descriptor"))
{ {
Logger.Log('\t'+descriptor); Logger.LogInfo(nameof(LauncherWindow), descriptor.ToString());
Programs[i] = new Program(descriptors[i]); Programs[i] = new Program(descriptors[i]);
ProgramsPanel.Children.Add(Programs[i].ProgramLabel); ProgramsPanel.Children.Add(Programs[i].ProgramLabel);
Programs[i].ProgramSelectedEvent += SelectProgram; Programs[i].ProgramSelectedEvent += SelectProgram;
@ -92,7 +93,7 @@ public partial class LauncherWindow : Window
NameLabel.Content = selectedProg.Name; NameLabel.Content = selectedProg.Name;
DescriptionBox.Text = selectedProg.Description; DescriptionBox.Text = selectedProg.Description;
BackgroundImage.Source = new Bitmap( BackgroundImage.Source = new Bitmap(
$"{Directory.GetCurrent()}{Путь.Разд}backgrounds{Путь.Разд}{selectedProg.BackgroundFile}"); $"{Directory.GetCurrent()}{Path.Sep}backgrounds{Path.Sep}{selectedProg.BackgroundFile}");
ProgramSettingsViever.Content = selectedProg.SettingsPanel; ProgramSettingsViever.Content = selectedProg.SettingsPanel;
DisplayingProgram = selectedProg; DisplayingProgram = selectedProg;
} }

View File

@ -9,6 +9,6 @@ public partial class ProgramLabel : UserControl
InitializeComponent(); InitializeComponent();
NameLabel.Content = label; NameLabel.Content = label;
IconImage.Source = new Bitmap( IconImage.Source = new Bitmap(
$"{Directory.GetCurrent()}{Путь.Разд}icons{Путь.Разд}{icon}"); $"{Directory.GetCurrent()}{Path.Sep}icons{Path.Sep}{icon}");
} }
} }

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<RootNamespace>Launcher.Client.Avalonia</RootNamespace> <RootNamespace>Launcher.Client.Avalonia</RootNamespace>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings> <ImplicitUsings>disable</ImplicitUsings>
<Nullable>disable</Nullable> <Nullable>disable</Nullable>
<DebugType>full</DebugType> <DebugType>full</DebugType>
@ -24,9 +24,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\DTLib\DTLib.Network\DTLib.Network.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib.Dtsod\DTLib.Dtsod.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" />
<ProjectReference Include="..\Launcher.Client\Launcher.Client.csproj" /> <ProjectReference Include="..\Launcher.Client\Launcher.Client.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -11,6 +11,8 @@ global using DTLib.Extensions;
global using Launcher.Client; global using Launcher.Client;
global using static Launcher.Client.LauncherClient; global using static Launcher.Client.LauncherClient;
global using static Launcher.Client.Avalonia.LauncherMain; global using static Launcher.Client.Avalonia.LauncherMain;
using DTLib.Ben.Demystifier;
using DTLib.Logging;
using Launcher.Client.Avalonia.GUI; using Launcher.Client.Avalonia.GUI;
namespace Launcher.Client.Avalonia; namespace Launcher.Client.Avalonia;
@ -43,8 +45,8 @@ public static class LauncherMain
public static void LogError(string context, Exception ex) public static void LogError(string context, Exception ex)
{ {
string errmsg = $"{ex.Message}\n{ex.StackTrace}"; string errmsg = ex.ToStringDemystified();
MessageBox.Show($"{context} ERROR", errmsg); MessageBox.Show($"{context} ERROR", errmsg);
Logger.Log(errmsg); Logger.LogError("Main", errmsg);
} }
} }

View File

@ -23,7 +23,7 @@ public class Program
public event Action<Program> ProgramSelectedEvent; public event Action<Program> ProgramSelectedEvent;
public Program(string descriptorFile) public Program(IOPath descriptorFile)
{ {
DtsodV23 descriptor= new(File.ReadAllText(descriptorFile)); DtsodV23 descriptor= new(File.ReadAllText(descriptorFile));
Name = descriptor["name"]; Name = descriptor["name"];
@ -38,7 +38,7 @@ public class Program
ProgramLabel = new ProgramLabel(Name, IconFile); ProgramLabel = new ProgramLabel(Name, IconFile);
ProgramLabel.PointerPressed += (_, _) => ProgramSelectedEvent?.Invoke(this); ProgramLabel.PointerPressed += (_, _) => ProgramSelectedEvent?.Invoke(this);
SettingsFile = $"settings{Путь.Разд}{Directory}.settings"; SettingsFile = $"settings{Path.Sep}{Directory}.settings";
Settings = File.Exists(SettingsFile) Settings = File.Exists(SettingsFile)
? DtsodConverter.UpdateByDefault( ? DtsodConverter.UpdateByDefault(
new DtsodV23(File.ReadAllText(SettingsFile)), new DtsodV23(File.ReadAllText(SettingsFile)),

View File

@ -1,4 +1,5 @@
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using DTLib.Logging;
namespace Launcher.Client.WPF.GUI; namespace Launcher.Client.WPF.GUI;
@ -9,9 +10,9 @@ public partial class LauncherWindow : Window
InitializeComponent(); InitializeComponent();
LogBox.Text = Logger.Buffer; LogBox.Text = Logger.Buffer;
Logger.MessageSent += LogHandler; Logger.MessageSent += LogHandler;
LogfileLabel.Content = Logger.LogfileName.Remove(0,Logger.LogfileName.LastIndexOf(Путь.Разд)+1); LogfileLabel.Content = Logger.LogfileName.Remove(0,Logger.LogfileName.LastIndexOf(Path.Sep)+1);
LogfileLabel.MouseLeftButtonDown += (_,_)=> LogfileLabel.MouseLeftButtonDown += (_,_)=>
Process.Start("explorer.exe", LauncherLogger.LogfileDir); Process.Start("explorer.exe", LauncherLogger.LogfileDir.ToString()!);
LogfileLabel.MouseEnter += (_,_)=>LogfileLabel.Foreground=App.MySelectionColor; LogfileLabel.MouseEnter += (_,_)=>LogfileLabel.Foreground=App.MySelectionColor;
LogfileLabel.MouseLeave += (_,_)=>LogfileLabel.Foreground=App.MyWhite; LogfileLabel.MouseLeave += (_,_)=>LogfileLabel.Foreground=App.MyWhite;
LibraryButton.TabGrid = LibraryGrid; LibraryButton.TabGrid = LibraryGrid;
@ -25,7 +26,7 @@ public partial class LauncherWindow : Window
ProgramGrid.Visibility = Visibility.Hidden; ProgramGrid.Visibility = Visibility.Hidden;
SelectTab(LibraryButton, null); SelectTab(LibraryButton, null);
FillProgramsPanel(); FillProgramsPanel();
Logger.Log("launcher started"); Logger.LogInfo(nameof(LauncherWindow),"launcher started");
} }
void LogHandler(string m) => Dispatcher.Invoke(()=>LogBox.Text += m); void LogHandler(string m) => Dispatcher.Invoke(()=>LogBox.Text += m);
@ -49,15 +50,15 @@ public partial class LauncherWindow : Window
private void FillProgramsPanel() private void FillProgramsPanel()
{ {
Logger.Log("reading descriptors..."); Logger.LogInfo(nameof(LauncherWindow),"reading descriptors...");
string[] descriptors = Directory.GetFiles("descriptors"); var descriptors = Directory.GetFiles("descriptors");
Programs = new Program[descriptors.Length]; Programs = new Program[descriptors.Length];
for (ushort i = 0; i < descriptors.Length; i++) for (ushort i = 0; i < descriptors.Length; i++)
{ {
string descriptor = descriptors[i]; var descriptor = descriptors[i];
if(descriptor.EndsWith(".descriptor")) if(descriptor.EndsWith(".descriptor"))
{ {
Logger.Log('\t'+descriptor); Logger.LogInfo(nameof(LauncherWindow),descriptor.ToString());
Programs[i] = new Program(descriptors[i]); Programs[i] = new Program(descriptors[i]);
ProgramsPanel.Children.Add(Programs[i].ProgramLabel); ProgramsPanel.Children.Add(Programs[i].ProgramLabel);
Programs[i].ProgramSelectedEvent += SelectProgram; Programs[i].ProgramSelectedEvent += SelectProgram;
@ -84,7 +85,7 @@ public partial class LauncherWindow : Window
DescriptionBox.Text = selectedProg.Description; DescriptionBox.Text = selectedProg.Description;
BackgroundImage.Source = BackgroundImage.Source =
new BitmapImage(new Uri( new BitmapImage(new Uri(
$"{Directory.GetCurrent()}{Путь.Разд}backgrounds{Путь.Разд}{selectedProg.BackgroundFile}", $"{Directory.GetCurrent()}{Path.Sep}backgrounds{Path.Sep}{selectedProg.BackgroundFile}",
UriKind.Absolute)); UriKind.Absolute));
ProgramSettingsViever.Content = selectedProg.SettingsPanel; ProgramSettingsViever.Content = selectedProg.SettingsPanel;
DisplayingProgram = selectedProg; DisplayingProgram = selectedProg;

View File

@ -10,7 +10,7 @@ public partial class ProgramLabel : UserControl
InitializeComponent(); InitializeComponent();
NameLabel.Content = label; NameLabel.Content = label;
IconImage.Source = new BitmapImage(new Uri( IconImage.Source = new BitmapImage(new Uri(
$"{Directory.GetCurrent()}{Путь.Разд}icons{Путь.Разд}{icon}", $"{Directory.GetCurrent()}{Path.Sep}icons{Path.Sep}{icon}",
UriKind.Absolute)); UriKind.Absolute));
} }
} }

View File

@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net7.0-windows</TargetFramework>
<RootNamespace>Launcher.Client.WPF</RootNamespace> <RootNamespace>Launcher.Client.WPF</RootNamespace>
<ImplicitUsings>disable</ImplicitUsings> <ImplicitUsings>disable</ImplicitUsings>
<Nullable>disable</Nullable> <Nullable>disable</Nullable>
@ -22,9 +22,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\DTLib\DTLib.Network\DTLib.Network.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib.Dtsod\DTLib.Dtsod.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" />
<ProjectReference Include="..\Launcher.Client\Launcher.Client.csproj" /> <ProjectReference Include="..\Launcher.Client\Launcher.Client.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -12,6 +12,8 @@ global using System.Windows;
global using Launcher.Client; global using Launcher.Client;
global using static Launcher.Client.LauncherClient; global using static Launcher.Client.LauncherClient;
global using static Launcher.Client.WPF.LauncherMain; global using static Launcher.Client.WPF.LauncherMain;
using DTLib.Ben.Demystifier;
using DTLib.Logging;
using Launcher.Client.WPF.GUI; using Launcher.Client.WPF.GUI;
namespace Launcher.Client.WPF; namespace Launcher.Client.WPF;
@ -22,6 +24,8 @@ public static class LauncherMain
public static void _Main(string[] args) public static void _Main(string[] args)
{ {
Console.WriteLine("aaa\nbbb\nccc");
return;
LauncherClient.Init(); LauncherClient.Init();
CurrentLauncherWindow = new LauncherWindow(); CurrentLauncherWindow = new LauncherWindow();
CurrentLauncherWindow.Show(); CurrentLauncherWindow.Show();
@ -29,8 +33,8 @@ public static class LauncherMain
public static void LogError(string context, Exception ex) public static void LogError(string context, Exception ex)
{ {
string errmsg = $"{context} ERROR:\n{ex}"; string errmsg = ex.ToStringDemystified();
MessageBox.Show(errmsg); MessageBox.Show(errmsg);
Logger.Log(errmsg); Logger.LogError(context, errmsg);
} }
} }

View File

@ -24,7 +24,7 @@ public class Program
public event Action<Program> ProgramSelectedEvent; public event Action<Program> ProgramSelectedEvent;
public Program(string descriptorFile) public Program(IOPath descriptorFile)
{ {
DtsodV23 descriptor= new(File.ReadAllText(descriptorFile)); DtsodV23 descriptor= new(File.ReadAllText(descriptorFile));
Name = descriptor["name"]; Name = descriptor["name"];
@ -39,7 +39,7 @@ public class Program
ProgramLabel = new ProgramLabel(Name, IconFile); ProgramLabel = new ProgramLabel(Name, IconFile);
ProgramLabel.MouseLeftButtonDown += (_, _) => ProgramSelectedEvent?.Invoke(this); ProgramLabel.MouseLeftButtonDown += (_, _) => ProgramSelectedEvent?.Invoke(this);
SettingsFile = $"settings{Путь.Разд}{Directory}.settings"; SettingsFile = $"settings{Path.Sep}{Directory}.settings";
Settings = File.Exists(SettingsFile) Settings = File.Exists(SettingsFile)
? DtsodConverter.UpdateByDefault( ? DtsodConverter.UpdateByDefault(
new DtsodV23(File.ReadAllText(SettingsFile)), new DtsodV23(File.ReadAllText(SettingsFile)),

View File

@ -0,0 +1,38 @@
using DTLib.Logging;
namespace Launcher.Client;
public class BufferedLogger : ILogger
{
public bool DebugLogEnabled { get; set; } =
#if DEBUG
true;
#else
false;
#endif
public bool InfoLogEnabled { get; set; } = true;
public bool WarnLogEnabled { get; set; } = true;
public bool ErrorLogEnabled { get; set; } = true;
public ILogFormat Format { get; set; } = new DefaultLogFormat();
private readonly StringBuilder _buffer = new();
public string Buffer
{
get { lock (_buffer) return _buffer.ToString(); }
}
public event Action<string> MessageSent;
public void Log(string context, LogSeverity severity, object message, ILogFormat format)
{
string msgConnected = Format.CreateMessage(context, severity, message);
MessageSent?.Invoke(msgConnected);
lock (_buffer) _buffer.Append(msgConnected);
}
public void Dispose()
{
}
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings> <ImplicitUsings>disable</ImplicitUsings>
<Nullable>disable</Nullable> <Nullable>disable</Nullable>
<RootNamespace>Launcher.Client</RootNamespace> <RootNamespace>Launcher.Client</RootNamespace>
@ -10,12 +10,6 @@
<Platforms>AnyCPU</Platforms> <Platforms>AnyCPU</Platforms>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\DTLib\DTLib.Network\DTLib.Network.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib.Dtsod\DTLib.Dtsod.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Remove="Resources\**\*" /> <Compile Remove="Resources\**\*" />
<EmbeddedResource Include="Resources\**\*" /> <EmbeddedResource Include="Resources\**\*" />
@ -23,4 +17,10 @@
<None Update="debug_assets\**\*" CopyToOutputDirectory="Always" Condition="'$(Configuration)' == 'Debug'" /> <None Update="debug_assets\**\*" CopyToOutputDirectory="Always" Condition="'$(Configuration)' == 'Debug'" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<PackageReference Include="DTLib.Dtsod" Version="1.3.0" />
<PackageReference Include="DTLib.Logging" Version="1.3.0" />
<PackageReference Include="DTLib.Network" Version="1.3.0" />
</ItemGroup>
</Project> </Project>

View File

@ -8,6 +8,7 @@ global using DTLib;
global using DTLib.Dtsod; global using DTLib.Dtsod;
global using DTLib.Filesystem; global using DTLib.Filesystem;
global using DTLib.Extensions; global using DTLib.Extensions;
using DTLib.Logging;
namespace Launcher.Client; namespace Launcher.Client;
@ -18,14 +19,14 @@ public static class LauncherClient
public static void Init() public static void Init()
{ {
Logger.Log("launcher starting..."); Logger.LogInfo(nameof(LauncherClient),"launcher starting...");
Config = new LauncherConfig(); Config = new LauncherConfig();
#if DEBUG #if DEBUG
const string debug_assets = "debug_assets"; const string debug_assets = "debug_assets";
foreach (string file in Directory.GetFiles(debug_assets)) foreach (string file in Directory.GetFiles(debug_assets))
File.Copy(file, file.Remove(0, file.LastIndexOf(Путь.Разд) + 1), true); File.Copy(file, file.Remove(0, file.LastIndexOf(Path.Sep) + 1), true);
foreach (string subdir in Directory.GetDirectories(debug_assets)) foreach (string subdir in Directory.GetDirectories(debug_assets))
Directory.Copy(subdir, subdir.Remove(0, subdir.LastIndexOf(Путь.Разд) + 1), true); Directory.Copy(subdir, subdir.Remove(0, subdir.LastIndexOf(Path.Sep) + 1), true);
Directory.Delete(debug_assets); Directory.Delete(debug_assets);
#endif #endif
Directory.Create("descriptors"); Directory.Create("descriptors");
@ -33,7 +34,7 @@ public static class LauncherClient
Directory.Create("backgrounds"); Directory.Create("backgrounds");
Directory.Create("installed"); Directory.Create("installed");
Directory.Create("settings"); Directory.Create("settings");
File.WriteAllText($"descriptors{Путь.Разд}default.descriptor.template", File.WriteAllText($"descriptors{Path.Sep}default.descriptor.template",
EmbeddedResources.ReadText("Launcher.Client.Resources.default.descriptor.template")); EmbeddedResources.ReadText("Launcher.Client.Resources.default.descriptor.template"));
} }
} }

View File

@ -2,30 +2,22 @@
namespace Launcher.Client; namespace Launcher.Client;
public class LauncherLogger : FileLogger public class LauncherLogger : CompositeLogger
{ {
public const string LogfileDir = "launcher-logs"; public static readonly IOPath LogfileDir = "launcher-logs";
public LauncherLogger() : base(LogfileDir,"launcher-client") {} public readonly string LogfileName;
private readonly StringBuilder _buffer = new();
public string Buffer
{
get { lock (_buffer) return _buffer.ToString(); }
}
public event Action<string> MessageSent; public event Action<string> MessageSent;
public string Buffer => _bufferedLogger.Buffer;
public override void Log(params string[] msg)
FileLogger _fileLogger = new(LogfileDir,"launcher-client");
ConsoleLogger _consoleLogger = new();
BufferedLogger _bufferedLogger = new BufferedLogger();
public LauncherLogger()
{ {
base.Log(msg); _loggers = new ILogger[] { _fileLogger, _consoleLogger, _bufferedLogger };
StringBuilder strb = new(); LogfileName = _fileLogger.LogfileName.Str;
strb.Append('[').Append(LastLogMessageTime).Append("]: "); _bufferedLogger.MessageSent += s => MessageSent?.Invoke(s);
if (msg.Length == 1) strb.Append(msg[0]);
else for (int i = 1; i < msg.Length; i += 2)
strb.Append(msg[i]);
strb.Append('\n');
string msgConnected = strb.ToString();
MessageSent?.Invoke(msgConnected);
lock (_buffer) _buffer.Append(msgConnected);
} }
} }

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<RootNamespace>Launcher.Server</RootNamespace> <RootNamespace>Launcher.Server</RootNamespace>
<ImplicitUsings>disable</ImplicitUsings> <ImplicitUsings>disable</ImplicitUsings>
<Nullable>disable</Nullable> <Nullable>disable</Nullable>
@ -11,16 +11,16 @@
<Platforms>AnyCPU</Platforms> <Platforms>AnyCPU</Platforms>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\DTLib\DTLib.Network\DTLib.Network.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib.Dtsod\DTLib.Dtsod.csproj" />
<ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<None Update="launcher-server.dtsod"> <None Update="launcher-server.dtsod">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup>
<PackageReference Include="DTLib.Dtsod" Version="1.3.0" />
<PackageReference Include="DTLib.Logging" Version="1.3.0" />
<PackageReference Include="DTLib.Network" Version="1.3.0" />
</ItemGroup>
</Project> </Project>

View File

@ -9,7 +9,6 @@ global using System.Net.Sockets;
global using System.Text; global using System.Text;
global using System.Threading; global using System.Threading;
global using System.Linq; global using System.Linq;
using System.Globalization;
using DTLib.Logging; using DTLib.Logging;
namespace Launcher.Server; namespace Launcher.Server;
@ -18,7 +17,9 @@ static class Server
{ {
static readonly Socket mainSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); static readonly Socket mainSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static DtsodV23 config; static DtsodV23 config;
private static readonly ConsoleLogger Logger = new("logs", "launcher-server"); private static readonly CompositeLogger Logger = new(
new ConsoleLogger(),
new FileLogger("logs", "launcher-server"));
static readonly object manifestLocker = new(); static readonly object manifestLocker = new();
@ -29,40 +30,42 @@ static class Server
Console.Title = "Launcher.Server"; Console.Title = "Launcher.Server";
Console.InputEncoding = Encoding.Unicode; Console.InputEncoding = Encoding.Unicode;
Console.OutputEncoding = Encoding.Unicode; Console.OutputEncoding = Encoding.Unicode;
PublicLog.LogEvent += Logger.Log; DTLibInternalLogging.SetLogger(Logger);
config = new DtsodV23(File.ReadAllText("launcher-server.dtsod")); config = new DtsodV23(File.ReadAllText("launcher-server.dtsod"));
Logger.Log("b", "local address: <", "c", config["local_ip"], "b", Logger.LogInfo("Main", $"""
">\npublic address: <", "c", OldNetwork.GetPublicIP(), "b", local address: {config["local_ip"]}
">\nport: <", "c", config["local_port"].ToString(), "b", ">"); public address: {OldNetwork.GetPublicIP()}
port: {config["local_port"]}
""");
mainSocket.Bind(new IPEndPoint(IPAddress.Parse(config["local_ip"]), config["local_port"])); mainSocket.Bind(new IPEndPoint(IPAddress.Parse(config["local_ip"]), config["local_port"]));
mainSocket.Listen(1000); mainSocket.Listen(1000);
CreateManifests(); CreateManifests();
Logger.Log("g", "server started succesfully"); Logger.LogInfo("Main", "server started succesfully");
// запуск отдельного потока для каждого юзера // запуск отдельного потока для каждого юзера
Logger.Log("b", "waiting for users"); Logger.LogInfo("Main", "waiting for users");
while (true) while (true)
{ {
var userSocket = mainSocket.Accept(); var userSocket = mainSocket.Accept();
var userThread = new Thread((obj) => UserHandle((Socket)obj)); var userThread = new Thread((obj) => HandleUser((Socket)obj));
userThread.Start(userSocket); userThread.Start(userSocket);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log("r", ex.ToString()); Logger.LogError("Main", ex);
if (mainSocket.Connected) if (mainSocket.Connected)
{ {
mainSocket.Shutdown(SocketShutdown.Both); mainSocket.Shutdown(SocketShutdown.Both);
mainSocket.Close(); mainSocket.Close();
} }
} }
Logger.Log("gray", ""); Console.ResetColor();
} }
// запускается для каждого юзера в отдельном потоке // запускается для каждого юзера в отдельном потоке
static void UserHandle(Socket handlerSocket) static void HandleUser(Socket handlerSocket)
{ {
Logger.Log("b", "user connecting... "); Logger.LogInfo("HandleUser", "user connecting...");
try try
{ {
// запрос хеша пароля и логина // запрос хеша пароля и логина
@ -73,7 +76,7 @@ static class Server
// запрос от апдейтера // запрос от апдейтера
if (hash == hasher.HashCycled("updater".ToBytes(),64)) if (hash == hasher.HashCycled("updater".ToBytes(),64))
{ {
Logger.Log("b", "user is ", "c", "updater"); Logger.LogInfo("HandleUser", "user is updater");
handlerSocket.SendPackage("updater".ToBytes()); handlerSocket.SendPackage("updater".ToBytes());
// обработка запросов // обработка запросов
while (true) while (true)
@ -84,19 +87,19 @@ static class Server
switch (request) switch (request)
{ {
case "requesting launcher update": case "requesting launcher update":
Logger.Log("b", "updater requested client.exe"); Logger.LogInfo("HandleUser", "updater requested client.exe");
fsp.UploadFile("share\\launcher.exe"); fsp.UploadFile("share\\launcher.exe");
break; break;
case "register new user": case "register new user":
Logger.Log("b", "new user registration requested"); Logger.LogInfo("HandleUser", "new user registration requested");
handlerSocket.SendPackage("ready".ToBytes()); handlerSocket.SendPackage("ready".ToBytes());
string req = StringConverter.MergeToString( string req = StringConverter.MergeToString(
hasher.HashCycled(handlerSocket.GetPackage(), 64).HashToString(), hasher.HashCycled(handlerSocket.GetPackage(), 64).HashToString(),
":\n{\n\tusername: \"", handlerSocket.GetPackage().ToString(), ":\n{\n\tusername: \"", handlerSocket.GetPackage().ToString(),
"\";\n\tuuid: \"null\";\n};"); "\";\n\tuuid: \"null\";\n};");
string filepath = $"registration_requests\\{DateTime.Now.ToString(CultureInfo.InvariantCulture).НормализоватьДляПути()}.req"; var filepath = Path.Concat("registration_requests", DateTime.Now.ToString(MyTimeFormat.ForFileNames), ".req");
File.WriteAllText(filepath, req); File.WriteAllText(filepath, req);
Logger.Log("b", $"text wrote to file <", "c", $"registration_requests\\{filepath}", "b", ">"); Logger.LogInfo("HandleUser", $"text wrote to file <{filepath}>");
break; break;
default: default:
throw new Exception("unknown request: " + request); throw new Exception("unknown request: " + request);
@ -108,7 +111,7 @@ static class Server
// запрос от юзера // запрос от юзера
else if (FindUser(hash, out var user)) else if (FindUser(hash, out var user))
{ {
Logger.Log("b", $"user is ", "c", user.name); Logger.LogInfo("HandleUser", "user is " + user.name);
handlerSocket.SendPackage("launcher".ToBytes()); handlerSocket.SendPackage("launcher".ToBytes());
// обработка запросов // обработка запросов
while (true) while (true)
@ -119,27 +122,26 @@ static class Server
switch (request) switch (request)
{ {
case "requesting file download": case "requesting file download":
var file = handlerSocket.GetPackage().ToString(); var requestedFile = Path.Concat("share",handlerSocket.GetPackage().ToString());
Logger.Log("b", $"user ", "c", user.name, "b", " requested file ", "c", file); Logger.LogInfo("HandleUser", $"user {user.name} requested file {requestedFile}");
if (file == "manifest.dtsod") if (requestedFile == "share/manifest.dtsod")
{ lock (manifestLocker)
lock (manifestLocker) fsp.UploadFile("share\\manifest.dtsod"); fsp.UploadFile(requestedFile.ToString());
} else fsp.UploadFile(requestedFile.ToString());
else fsp.UploadFile($"share\\{file}");
break; break;
case "requesting uuid": case "requesting uuid":
Logger.Log("b", $"user ", "c", user.name, "b", " requested uuid"); Logger.LogInfo("HandleUser", "user " + user.name + " requested uuid");
handlerSocket.SendPackage(user.uuid.ToBytes()); handlerSocket.SendPackage(user.uuid.ToBytes());
break; break;
case "excess files found": case "excess files found":
Logger.Log("b", $"user ", "c", user.name, "b", " sent excess files list"); Logger.LogInfo("HandleUser", "user " + user.name + " sent excess files list");
fsp.DownloadFile($"excesses\\{user.name}-" + fsp.DownloadFile(Path.Concat(
$"{DateTime.Now.ToString(CultureInfo.InvariantCulture).НормализоватьДляПути()}.txt"); "excesses",user.name, DateTime.Now.ToString(MyTimeFormat.ForFileNames),".txt")
.ToString());
break; break;
case "sending launcher error": case "sending launcher error":
Logger.Log("y", "user ", "c", user.name, "y", "is sending error:");
string error = handlerSocket.GetPackage().ToString(); string error = handlerSocket.GetPackage().ToString();
Logger.Log("y", error + '\n'); Logger.LogWarn("HandleUser", "user "+ user.name + "is sending error:\n"+error);
break; break;
default: default:
throw new Exception("unknown request: " + request); throw new Exception("unknown request: " + request);
@ -151,13 +153,13 @@ static class Server
// неизвестный юзер // неизвестный юзер
else else
{ {
Logger.Log("y", $"user with hash <{hash.HashToString()}> not found"); Logger.LogWarn("HandleUser", $"user with hash {hash.HashToString()} not found");
handlerSocket.SendPackage("user not found".ToBytes()); handlerSocket.SendPackage("user not found".ToBytes());
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log("y", $"UserStart() error:\n message:\n {ex}"); Logger.LogWarn("HandleUser", ex);
if (mainSocket.Connected) if (mainSocket.Connected)
{ {
mainSocket.Shutdown(SocketShutdown.Both); mainSocket.Shutdown(SocketShutdown.Both);
@ -166,9 +168,10 @@ static class Server
} }
finally finally
{ {
if (handlerSocket.Connected) handlerSocket.Shutdown(SocketShutdown.Both); if (handlerSocket.Connected)
handlerSocket.Shutdown(SocketShutdown.Both);
handlerSocket.Close(); handlerSocket.Close();
Logger.Log("g", "user disconnected"); Logger.LogInfo("HandleUser", "user disconnected");
} }
} }
@ -176,19 +179,19 @@ static class Server
{ {
lock (manifestLocker) lock (manifestLocker)
{ {
Directory.Create($"share\\download_if_not_exist"); Directory.Create("share\\download_if_not_exist");
Directory.Create($"share\\sync_always"); Directory.Create("share\\sync_always");
Directory.Create($"share\\sync_and_remove"); Directory.Create("share\\sync_and_remove");
FSP.CreateManifest($"share\\download_if_not_exist"); FSP.CreateManifest("share\\download_if_not_exist");
FSP.CreateManifest($"share\\sync_always"); FSP.CreateManifest("share\\sync_always");
foreach (string dir in Directory.GetDirectories("share\\sync_and_remove")) foreach (string dir in Directory.GetDirectories("share\\sync_and_remove"))
FSP.CreateManifest(dir); FSP.CreateManifest(dir);
File.WriteAllText($"share\\sync_and_remove\\dirlist.dtsod", File.WriteAllText("share\\sync_and_remove\\dirlist.dtsod",
$"dirs: [\""+ "dirs: [\""+
Directory.GetDirectories("share\\sync_and_remove") Directory.GetDirectories("share\\sync_and_remove")
.MergeToString("\",\"") .MergeToString("\",\"")
.Replace($"share\\sync_and_remove\\", "")+ .Replace("share\\sync_and_remove\\", "")+
"\"];"); "\"];");
} }
} }

View File

@ -17,12 +17,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher.Client.Avalonia",
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher.Client", "Launcher.Client\Launcher.Client.csproj", "{87427137-840D-4D09-A101-9481110682BD}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher.Client", "Launcher.Client\Launcher.Client.csproj", "{87427137-840D-4D09-A101-9481110682BD}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DTLib", "..\DTLib\DTLib\DTLib.csproj", "{E27F82A6-B58F-4C07-8DAB-F1556F24F5E0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DTLib.Dtsod", "..\DTLib\DTLib.Dtsod\DTLib.Dtsod.csproj", "{507C97A8-47ED-4271-952F-49883E508EA7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DTLib.Network", "..\DTLib\DTLib.Network\DTLib.Network.csproj", "{5F53F49F-FFEA-4C2E-B21D-8E11363EA969}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -45,18 +39,6 @@ Global
{87427137-840D-4D09-A101-9481110682BD}.Debug|Any CPU.Build.0 = Debug|Any CPU {87427137-840D-4D09-A101-9481110682BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{87427137-840D-4D09-A101-9481110682BD}.Release|Any CPU.ActiveCfg = Release|Any CPU {87427137-840D-4D09-A101-9481110682BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{87427137-840D-4D09-A101-9481110682BD}.Release|Any CPU.Build.0 = Release|Any CPU {87427137-840D-4D09-A101-9481110682BD}.Release|Any CPU.Build.0 = Release|Any CPU
{E27F82A6-B58F-4C07-8DAB-F1556F24F5E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E27F82A6-B58F-4C07-8DAB-F1556F24F5E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E27F82A6-B58F-4C07-8DAB-F1556F24F5E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E27F82A6-B58F-4C07-8DAB-F1556F24F5E0}.Release|Any CPU.Build.0 = Release|Any CPU
{507C97A8-47ED-4271-952F-49883E508EA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{507C97A8-47ED-4271-952F-49883E508EA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{507C97A8-47ED-4271-952F-49883E508EA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{507C97A8-47ED-4271-952F-49883E508EA7}.Release|Any CPU.Build.0 = Release|Any CPU
{5F53F49F-FFEA-4C2E-B21D-8E11363EA969}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F53F49F-FFEA-4C2E-B21D-8E11363EA969}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5F53F49F-FFEA-4C2E-B21D-8E11363EA969}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F53F49F-FFEA-4C2E-B21D-8E11363EA969}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE