using DTLib; using System; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; namespace updater { class Updater { static readonly string logfile = $"logs\\updater-{DateTime.Now}.log".Replace(':', '-').Replace(' ', '_'); static Socket mainSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); static readonly string server_domain = "timerix.cf"; static readonly int server_port = 4000; static void Main(string[] args) { try { Console.Title = "dtlauncher updater"; Console.InputEncoding = Encoding.Unicode; Console.OutputEncoding = Encoding.Unicode; PublicLog.Log += Log; // подключение к центральному серверу while (true) { try { Log("b", "server address: <", "c", server_domain, "b", ">\nserver port: <", "c", server_port.ToString(), "b", ">\n"); mainSocket.Connect(new IPEndPoint(Dns.GetHostAddresses(server_domain)[0], server_port)); Log("g", "connected to server\n"); break; } catch (SocketException ex) { Log("r", $"updater.Main() error:\n{ex.Message}\n{ex.StackTrace}\n"); } } var recieved = mainSocket.GetPackage().ToStr(); if (recieved != "requesting hash") throw new Exception("invalid server request"); mainSocket.SendPackage(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }); recieved = mainSocket.GetPackage().ToStr(); if (recieved != "updater") throw new Exception($"invalid central server answer <{recieved}>"); // обновление апдейтера if (args.Length == 0 || args[0] != "updated") { mainSocket.FSP_Download("dtlauncher.exe", "TEMP\\dtlauncher.exe"); Log("g", "dtlauncher.exe downloaded\n"); mainSocket.FSP_Download("DTLib.dll", "TEMP\\DTLib.dll"); Log("g", "DTLib.dll downloaded\n"); Process.Start("cmd", "/c timeout 0 && copy TEMP\\dtlauncher.exe dtlauncher.exe && copy TEMP\\DTLib.dll DTLib.dll && start dtlauncher.exe updated"); } else { // установка шрифтов Log("installing fonts\n"); Process.Start("fonts\\fontinst.exe"); Filework.Directory.Delete("TEMP"); Log("deleted TEMP\n"); Process.Start("dtlauncher-client-win.exe", "updated"); } } catch (Exception ex) { Log("r", $"updater.Main() error:\n{ex.Message}\n{ex.StackTrace}\n", "gray", "press any key to close..."); Console.ReadKey(); } Log("gray", " \n"); } // вывод лога в консоль и файл public static void Log(params string[] msg) { if (msg.Length == 1) msg[0] = "[" + DateTime.Now.ToString() + "]: " + msg[0]; else msg[1] = "[" + DateTime.Now.ToString() + "]: " + msg[1]; LogNoTime(msg); } public static void LogNoTime(params string[] msg) { lock (new object()) { if (msg.Length == 1) Filework.LogToFile(logfile, msg[0]); else if (msg.Length % 2 != 0) throw new Exception("incorrect array to log\n"); else Filework.LogToFile(logfile, SimpleConverter.AutoBuild(msg)); ColoredConsole.Write(msg); } } } }