diff --git a/.old 6/DTLib/Color.cs b/.old 6/DTLib/Color.cs deleted file mode 100644 index e451099..0000000 --- a/.old 6/DTLib/Color.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace DTLib -{ - public class Color - { - public record RGBA(byte R, byte G, byte B, byte A) - { - public RGBA(byte[] arrayRGBA) : this(arrayRGBA[0], arrayRGBA[1], arrayRGBA[2], arrayRGBA[3]) - { - if (arrayRGBA.Length != 4) throw new Exception("Color.RGBA(byte[] arrayRGBA) error: arrayRGBA.Length != 4\n"); - } - } - - public record RGB(byte R, byte G, byte B) - { - public RGB(byte[] arrayRGB) : this(arrayRGB[0], arrayRGB[1], arrayRGB[2]) - { - if (arrayRGB.Length != 3) throw new Exception("Color.RGB(byte[] arrayRGB) error: arrayRGB.Length != 3\n"); - } - } - } -} diff --git a/.old 6/DTLib/ColoredConsole.cs b/.old 6/DTLib/ColoredConsole.cs deleted file mode 100644 index d0f9a17..0000000 --- a/.old 6/DTLib/ColoredConsole.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; - -namespace DTLib -{ - // - // вывод и ввод цветного текста в консоли - // работает медленнее чем хотелось бы - // - public static class ColoredConsole - { - // парсит название цвета в ConsoleColor - public static ConsoleColor ParseColor(string color) - { - return color switch - { - //case "magneta": - "m" => ConsoleColor.Magenta, - //case "green": - "g" => ConsoleColor.Green, - //case "red": - "r" => ConsoleColor.Red, - //case "yellow": - "y" => ConsoleColor.Yellow, - //case "white": - "w" => ConsoleColor.White, - //case "blue": - "b" => ConsoleColor.Blue, - //case "cyan": - "c" => ConsoleColor.Cyan, - //case "gray": - "gray" => ConsoleColor.Gray, - //case "black": - "black" => ConsoleColor.Black, - _ => throw new Exception($"ColoredConsole.ParseColor({color}) error: incorrect color"), - }; - } - - // вывод цветного текста - public static void Write(params string[] input) - { - if (input.Length == 1) - { - if (Console.ForegroundColor != ConsoleColor.Gray) Console.ForegroundColor = ConsoleColor.Gray; - Console.Write(input[0]); - } - else if (input.Length % 2 == 0) - { - string str = ""; - for (ushort i = 0; i < input.Length; i++) - { - var c = ParseColor(input[i]); - if (Console.ForegroundColor != c) - { - Console.Write(str); - Console.ForegroundColor = c; - str = ""; - } - str += input[++i]; - } - if (str != "") Console.Write(str); - } - else throw new Exception("ColoredConsole.Write() error: every text string must have color string before"); - } - - // ввод цветного текста - public static string Read(string color) - { - var c = ParseColor(color); - if (Console.ForegroundColor != c) Console.ForegroundColor = c; - return Console.ReadLine(); - } - } -} \ No newline at end of file diff --git a/.old 6/DTLib/CompressedArray.cs b/.old 6/DTLib/CompressedArray.cs deleted file mode 100644 index 8b6b69e..0000000 --- a/.old 6/DTLib/CompressedArray.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; - -namespace DTLib -{ - public class CompressedArray - { - public class Array1D where T : IComparable - { - byte[] Description; - T[] Memory; - - public Array1D() { } - public Array1D(T[] sourceArray) - { - CompressArray(sourceArray); - } - - public void CompressArray(T[] sourceArray) - { - var listMem = new List(); - var listDesc = new List(); - T prevElement = sourceArray[0]; - listMem.Add(sourceArray[0]); - listDesc.Add(1); - byte repeats = 1; - for (int i = 1; i < sourceArray.Length; i++) - { - if (prevElement.CompareTo(sourceArray[i]) == 0) repeats++; - else - { - listMem.Add(sourceArray[i]); - listDesc.Add(1); - if (repeats > 1) - { - listDesc[listDesc.Count - 2] = repeats; - repeats = 1; - } - } - prevElement = sourceArray[i]; - } - Memory = listMem.ToArray(); - Description = listDesc.ToArray(); - ColoredConsole.Write("b", "listMem.Count: ", "c", listMem.Count.ToString(), "b", " listDesc.Count: ", "c", listDesc.Count + "\n"); - for (short i = 0; i < listDesc.Count; i++) - { - ColoredConsole.Write("y", $"{Description[i]}:{Memory[i]}\n"); - } - } - - // блокирует обращение к памяти из нескольких потоков - Mutex storageUsing = new(); - - // возвращает элемент по индексу так, как если бы шло обращение к обычном массиву - public T GetElement(int index) - { - storageUsing.WaitOne(); - T output = default; - int sum = 0; - for (int i = 0; i < Description.Length; i++) - { - if (sum < index) sum += Description[i]; - else if (sum == index) output = Memory[i]; - else output = Memory[i - 1]; - } - storageUsing.ReleaseMutex(); - return output; - } - } - } -} diff --git a/.old 6/DTLib/DTLib.csproj b/.old 6/DTLib/DTLib.csproj deleted file mode 100644 index e38372d..0000000 --- a/.old 6/DTLib/DTLib.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Debug - AnyCPU - {CE793497-2D5C-42D8-B311-E9B32AF9CDFB} - Library - Properties - DTLib - DTLib - v4.8 - 9.0 - 512 - true - - - none - true - bin\ - TRACE - prompt - 4 - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.old 6/DTLib/Dtsod.cs b/.old 6/DTLib/Dtsod.cs deleted file mode 100644 index 8a3f66d..0000000 --- a/.old 6/DTLib/Dtsod.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace DTLib -{ - // - // это как json но не совсем - // - public class Dtsod - { - string Text; - public Dictionary Values { get; } - public Dtsod(string text) - { - Text = text; - Values = Parse(text); - } - - // выдаёт Exception - public dynamic this[string key] - { - get - { - if (TryGet(key, out dynamic value)) return value; - else throw new Exception($"Dtsod[{key}] key not found"); - } - } - - // не выдаёт KeyNotFoundException - public bool TryGet(string key, out dynamic value) - { - try - { - value = Values[key]; - return true; - } - catch (KeyNotFoundException) - { - //PublicLog.Log("y", $"key {key} not found\n"); - value = null; - return false; - } - } - - public override string ToString() => Text; - - - Dictionary Parse(string text) - { - Dictionary output = new(); - StringBuilder nameStrB = new(); - StringBuilder valStrB = new(); - dynamic value = null; - bool readValue = false; - bool readString = false; - bool readListElem = false; - bool isList = false; - - dynamic StringToElse(string str) - { - if (readString) return str; - //PublicLog.Log("m", $"value: <{value}>\n"); - // bool - if (str == "true") return true; - else if (str == "false") return false; - // double - else if (str.Contains(".")) return SimpleConverter.ToDouble(str); - // ushort, uint, ulong - else if (str.Length > 2 && str[str.Length - 2] == 'u') - return str[str.Length - 1] switch - { - 's' => SimpleConverter.ToUShort(str.Remove(str.Length - 2)), - 'i' => SimpleConverter.ToUInt(str.Remove(str.Length - 2)), - 'l' => SimpleConverter.ToULong(str.Remove(str.Length - 2)), - _ => throw new Exception($"ParseConfig() error: unknown data type "), - }; - // short, int, long - else return str[str.Length - 1] switch - { - 's' => SimpleConverter.ToShort(str.Remove(str.Length - 1)), - 'l' => SimpleConverter.ToLong(str.Remove(str.Length - 1)), - _ => SimpleConverter.ToInt(str), - }; - } - - for (int i = 0; i < text.Length; i++) - { - switch (text[i]) - { - case '{': - i++; - for (; text[i] != '}'; i++) valStrB.Append(text[i]); - value = Parse(valStrB.ToString()); - valStrB.Clear(); - break; - case '}': - throw new Exception("ParseConfig() error: unexpected '}' at " + i + "char"); - case '<': - readString = true; - short balance = 1; - while (balance != 0) - { - i++; - if (text[i] == '>') balance--; - else if (text[i] == '<') balance++; - valStrB.Append(text[i]); - } - valStrB.Remove(valStrB.Length - 1, 1); - break; - case '"': - readString = true; - while (text[i] != '"' && text[i--] != '\\') - { - i++; - valStrB.Append(text[i]); - } - break; - case ':': - readValue = true; - break; - case ' ': - case '\t': - case '\r': - case '\n': - break; - case '[': - isList = true; - value = new List(); - break; - case ',': - case ']': - if (isList) value.Add(StringToElse(valStrB.ToString())); - else throw new Exception($"unexpected {text[i]}"); - valStrB.Clear(); - break; - case ';': - // конвертация value в нужный тип данных - if (!isList) value = StringToElse(valStrB.ToString()); - if (readListElem) - { - if (!output.ContainsKey(nameStrB.ToString())) output.Add(nameStrB.ToString(), new List()); - output[nameStrB.ToString()].Add(value); - } - else output.Add(nameStrB.ToString(), value); - nameStrB.Clear(); - valStrB.Clear(); - value = null; - readValue = false; - readString = false; - readListElem = false; - isList = false; - break; - // коммент - case '#': - for (; i < text.Length && text[i] != '\n'; i++) ; - break; - // если $ перед названием параметра поставить, значение (value) добавится в лист с таким названием (nameStrB.ToString()) - case '$': - if (nameStrB.ToString().Length != 0) throw new Exception("unexpected usage of '$' at char " + i.ToString()); - readListElem = true; - break; - default: - if (readValue) valStrB.Append(text[i]); - else nameStrB.Append(text[i]); - break; - }; - } - return output; - } - - - } -} diff --git a/.old 6/DTLib/FileWork.cs b/.old 6/DTLib/FileWork.cs deleted file mode 100644 index efdaa67..0000000 --- a/.old 6/DTLib/FileWork.cs +++ /dev/null @@ -1,202 +0,0 @@ -using System.Collections.Generic; -using System.IO; - -namespace DTLib -{ - // - // методы для работы с файловой системой - // - public static class FileWork - { - // записывает текст в файл и закрывает файл - public static void Log(string logfile, string msg) - { - lock (new object()) - { - if (logfile.Contains("\\")) DirCreate(logfile.Remove(logfile.LastIndexOf('\\'))); - var st = File.Open(logfile, FileMode.Append); - var writer = new StreamWriter(st, SimpleConverter.UTF8); - writer.Write(msg); - writer.Close(); - st.Close(); - } - } - - // создает папку если её не существует - public static void DirCreate(string dir) - { - if (!Directory.Exists(dir)) - { - // проверяет существование папки, в которой нужно создать dir - if (dir.Contains("\\") && !Directory.Exists(dir.Remove(dir.LastIndexOf('\\')))) - DirCreate(dir.Remove(dir.LastIndexOf('\\'))); - Directory.CreateDirectory(dir); - } - } - - // создаёт файл, сохдаёт папки из его пути - public static void FileCreate(string path) - { - if (!File.Exists(path)) - { - if (path.Contains("\\")) DirCreate(path.Remove(path.LastIndexOf('\\'))); - using var s = File.Create(path); - s.Close(); - } - } - - // чтение параметров из конфига - public static string ReadFromConfig(string configfile, string key) - { - lock (new object()) - { - key += ": "; - using var reader = new StreamReader(configfile); - while (!reader.EndOfStream) - { - string st = reader.ReadLine(); - if (st.StartsWith(key)) - { - string value = ""; - for (int i = key.Length; i < st.Length; i++) - { - if (st[i] == '#') return value; - if (st[i] == '%') - { - bool stop = false; - string placeholder = ""; - i++; - while (!stop) - { - if (st[i] == '%') - { - stop = true; - value += ReadFromConfig(configfile, placeholder); - } - else - { - placeholder += st[i]; - i++; - } - } - } - else value += st[i]; - } - reader.Close(); - //if (value == "") throw new System.Exception($"ReadFromConfig({configfile}, {key}) error: key not found"); - return value; - } - } - reader.Close(); - throw new System.Exception($"ReadFromConfig({configfile}, {key}) error: key not found"); - } - } - - // копирует все файли и папки - public static void DirCopy(string source_dir, string new_dir, bool Override) - { - DirCreate(new_dir); - List subdirs = new List(); - List files = GetAllFiles(source_dir, ref subdirs); - for (int i = 0; i < subdirs.Count; i++) - { - DirCreate(subdirs[i].Replace(source_dir, new_dir)); - } - for (int i = 0; i < files.Count; i++) - { - string f = files[i].Replace(source_dir, new_dir); - File.Copy(files[i], f, Override); - //PublicLog.Log(new string[] {"g", $"file <", "c", files[i], "b", "> have copied to <", "c", newfile, "b", ">\n'" }); - } - } - - // копирует все файли и папки и выдаёт список конфликтующих файлов - public static void DirCopy(string source_dir, string new_dir, bool owerwrite, out List conflicts) - { - conflicts = new List(); - var subdirs = new List(); - var files = GetAllFiles(source_dir, ref subdirs); - DirCreate(new_dir); - for (int i = 0; i < subdirs.Count; i++) - { - DirCreate(subdirs[i].Replace(source_dir, new_dir)); - } - for (int i = 0; i < files.Count; i++) - { - string newfile = files[i].Replace(source_dir, new_dir); - if (File.Exists(newfile)) conflicts.Add(newfile); - File.Copy(files[i], newfile, owerwrite); - //PublicLog.Log(new string[] {"g", $"file <", "c", files[i], "b", "> have copied to <", "c", newfile, "b", ">\n'" }); - } - } - - // выдает список всех файлов - public static List GetAllFiles(string dir) - { - List all_files = new List(); - string[] cur_files = Directory.GetFiles(dir); - for (int i = 0; i < cur_files.Length; i++) - { - all_files.Add(cur_files[i]); - //PublicLog.Log(new string[] { "b", "file found: <", "c", cur_files[i], "b", ">\n" }); - } - string[] cur_subdirs = Directory.GetDirectories(dir); - for (int i = 0; i < cur_subdirs.Length; i++) - { - //PublicLog.Log(new string[] { "b", "subdir found: <", "c", cur_subdirs[i], "b", ">\n" }); - all_files.AddRange(GetAllFiles(cur_subdirs[i])); - } - return all_files; - } - - // выдает список всех файлов и подпапок в папке - public static List GetAllFiles(string dir, ref List all_subdirs) - { - List all_files = new List(); - string[] cur_files = Directory.GetFiles(dir); - for (int i = 0; i < cur_files.Length; i++) - { - all_files.Add(cur_files[i]); - //PublicLog.Log(new string[] { "b", "file found: <", "c", cur_files[i], "b", ">\n" }); - } - string[] cur_subdirs = Directory.GetDirectories(dir); - for (int i = 0; i < cur_subdirs.Length; i++) - { - all_subdirs.Add(cur_subdirs[i]); - //PublicLog.Log(new string[] { "b", "subdir found: <", "c", cur_subdirs[i], "b", ">\n" }); - all_files.AddRange(GetAllFiles(cur_subdirs[i], ref all_subdirs)); - } - return all_files; - } - - // удаляет папку со всеми подпапками и файлами - public static void DirDelete(string dir) - { - var subdirs = new List(); - var files = GetAllFiles(dir, ref subdirs); - for (int i = 0; i < files.Count; i++) - File.Delete(files[i]); - for (int i = subdirs.Count - 1; i >= 0; i--) - Directory.Delete(subdirs[i]); - Directory.Delete(dir); - } - - // вычисляет и записывает в manifest.dtsod хеши файлов из files_list.dtsod - public static void CreateManifest(string dir) - { - if (!dir.EndsWith("\\")) dir += "\\"; - var dtsod = new Dtsod(File.ReadAllText(dir + "files_list.dtsod")); - System.Text.StringBuilder manifestBuilder = new(); - Hasher hasher = new(); - for (int i = 0; i < dtsod["files"].Count; i++) - { - manifestBuilder.Append(dtsod["files"][i]); - manifestBuilder.Append(": \""); - byte[] hash = hasher.HashFile(dir + dtsod["files"][i]); - manifestBuilder.Append(hash.HashToString()); - manifestBuilder.Append("\";\n"); - } - File.WriteAllText(dir + "manifest.dtsod", manifestBuilder.ToString()); - } - } -} diff --git a/.old 6/DTLib/Hasher.cs b/.old 6/DTLib/Hasher.cs deleted file mode 100644 index 05b3c87..0000000 --- a/.old 6/DTLib/Hasher.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Security.Cryptography; - -namespace DTLib -{ - // - // хеширует массивы байтов алшоритмом SHA256 и файлы алгоримом XXHash32 - // - public class Hasher - { - readonly HashAlgorithm sha256 = SHA256.Create(); - readonly HashAlgorithm xxh32 = XXHash32.Create(); - - public Hasher() { } - - // хеш массива - public byte[] Hash(byte[] input) - => sha256.ComputeHash(input); - - // хеш из двух массивов - public byte[] Hash(byte[] input, byte[] salt) - { - List rez = new List(); - rez.AddRange(input); - rez.AddRange(salt); - return sha256.ComputeHash(rez.ToArray()); - } - - // хеш двух массивов зацикленный - public byte[] HashCycled(byte[] input, byte[] salt, ushort cycles) - { - for (uint i = 0; i < cycles; i++) - { - input = Hash(input, salt); - } - return input; - } - // хеш зацикленный - public byte[] HashCycled(byte[] input, ushort cycles) - { - for (uint i = 0; i < cycles; i++) - { - input = Hash(input); - } - return input; - } - - // хеш файла - public byte[] HashFile(string filename) - { - using var fileStream = File.OpenRead(filename); - //var then = DateTime.Now.Hour * 3600 + DateTime.Now.Minute * 60 + DateTime.Now.Second; - var hash = xxh32.ComputeHash(fileStream); - //var now = DateTime.Now.Hour * 3600 + DateTime.Now.Minute * 60 + DateTime.Now.Second; - //PublicLog.Log($"xxh32 hash: {hash.HashToString()} time: {now - then}\n"); - fileStream.Close(); - return hash; - } - } -} diff --git a/.old 6/DTLib/NetWork.cs b/.old 6/DTLib/NetWork.cs deleted file mode 100644 index 5da9ee8..0000000 --- a/.old 6/DTLib/NetWork.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Threading; -using static DTLib.PublicLog; - -namespace DTLib -{ - // - // весь униврсальный неткод тут - // большинство методов предназначены для работы с TCP сокетами (Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) - // - public static class NetWork - { - // скачивание файла с фтп сервера - public static void FtpDownload(string address, string login, string password, string outfile) - { - try - { - // debug - Log(new string[] { "y", "file on server: <", "c", address, "y", ">\nfile on client: <", "c", outfile, "y", ">\n" }); - // создание запроса - // "ftp://m1net.keenetic.pro:20000/" + @infile - FtpWebRequest request = (FtpWebRequest)WebRequest.Create(address); - request.Credentials = new NetworkCredential(login, password); - request.Method = WebRequestMethods.Ftp.DownloadFile; - // получение ответа на запрос - FtpWebResponse response = (FtpWebResponse)request.GetResponse(); - Stream responseStream = response.GetResponseStream(); - FileStream fs = new FileStream(@Directory.GetCurrentDirectory() + '\\' + @outfile, FileMode.Create); - byte[] buffer = new byte[64]; - int size = 0; - - while ((size = responseStream.Read(buffer, 0, buffer.Length)) > 0) - fs.Write(buffer, 0, size); - fs.Close(); - response.Close(); - } - catch (WebException e) { throw new Exception("ftp error:\n" + ((FtpWebResponse)e.Response).StatusDescription + '\n'); } - } - - // пингует айпи с помощью встроенной в винду проги, возвращает задержку - public static string PingIP(string address) - { - Process proc = new Process(); - proc.StartInfo.FileName = "cmd.exe"; - proc.StartInfo.Arguments = "/c @echo off & chcp 65001 >nul & ping -n 5 " + address; - proc.StartInfo.CreateNoWindow = true; - proc.StartInfo.UseShellExecute = false; - proc.StartInfo.RedirectStandardOutput = true; - proc.Start(); - var outStream = proc.StandardOutput; - var rezult = outStream.ReadToEnd(); - rezult = rezult.Remove(0, rezult.LastIndexOf('=') + 2); - return rezult.Remove(rezult.Length - 4); - } - - // скачивает файл с помощью FSP протокола - public static void FSP_Download(this Socket mainSocket, string filePath_server, string filePath_client) - { - FileWork.FileCreate(filePath_client); - using var fileStream = File.OpenWrite(filePath_client); - mainSocket.SendPackage("requesting file download".ToBytes()); - Log("c", $"requesting file download: {filePath_server}\n"); - mainSocket.SendPackage(filePath_server.ToBytes()); - var fileSize = Convert.ToUInt32(mainSocket.GetPackage().ToStr()); - var hashstr = mainSocket.GetPackage().HashToString(); - mainSocket.SendPackage("ready".ToBytes()); - int packagesCount = 0; - byte[] buffer = new byte[5120]; - int fullPackagesCount = SimpleConverter.Truncate(fileSize / buffer.Length); - // рассчёт скорости - int seconds = 0; - var speedCounter = new Timer(true, 1000, () => - { - seconds++; - Log("c", $"speed= {packagesCount * buffer.Length / (seconds * 1000)} kb/s\n"); - }); - // получение файла - for (; packagesCount < fullPackagesCount; packagesCount++) - { - buffer = mainSocket.GetPackage(); - fileStream.Write(buffer, 0, buffer.Length); - fileStream.Flush(); - } - speedCounter.Stop(); - // получение остатка - mainSocket.SendPackage("remain request".ToBytes()); - buffer = mainSocket.GetPackage(); - fileStream.Write(buffer, 0, buffer.Length); - fileStream.Flush(); - fileStream.Close(); - Log(new string[] { "g", $" downloaded {packagesCount * 5120 + buffer.Length} of {fileSize} bytes\n" }); - - } - - // отдаёт файл с помощью FSP протокола - public static void FSP_Upload(this Socket mainSocket, string filePath) - { - using var fileStream = File.OpenRead(filePath); - Log("b", $"uploading file {filePath}\n"); - var fileSize = new FileInfo(filePath).Length; - var fileHash = new Hasher().HashFile(filePath); - mainSocket.SendPackage(fileSize.ToString().ToBytes()); - mainSocket.SendPackage(fileHash); - if (mainSocket.GetPackage().ToStr() != "ready") throw new Exception("user socket isn't ready"); - byte[] buffer = new byte[5120]; - var hashstr = fileHash.HashToString(); - int packagesCount = 0; - int seconds = 0; - // рассчёт скорости - var speedCounter = new Timer(true, 1000, () => - { - seconds++; - Log("c", $"speed= {packagesCount * buffer.Length / (seconds * 1000)} kb/s\n"); - }); - // отправка файла - int fullPackagesCount = SimpleConverter.Truncate(fileSize / buffer.Length); - for (; packagesCount < fullPackagesCount; packagesCount++) - { - fileStream.Read(buffer, 0, buffer.Length); - mainSocket.SendPackage(buffer); - } - speedCounter.Stop(); - // досылка остатка - if (mainSocket.GetPackage().ToStr() != "remain request") - throw new Exception("FSP_Upload() error: didn't get remain request"); - buffer = new byte[Convert.ToInt32(fileSize - fileStream.Position)]; - fileStream.Read(buffer, 0, buffer.Length); - mainSocket.SendPackage(buffer); - fileStream.Close(); - Log(new string[] { "g", $" uploaded {packagesCount * 5120 + buffer.Length} of {fileSize} bytes\n" }); - - } - - // ждёт пакет заданного размера с заданным началом и концом - public static byte[] GetPackage(this Socket socket) - { - int packageSize = 0; - byte[] data = new byte[2]; - // цикл выполняется пока не пройдёт 1000 мс - for (ushort s = 0; s < 200; s += 1) - { - if (packageSize == 0 && socket.Available >= 2) - { - socket.Receive(data, data.Length, 0); - packageSize = data.BytesToInt(); - - } - if (packageSize != 0 && socket.Available >= packageSize) - { - data = new byte[packageSize]; - socket.Receive(data, data.Length, 0); - return data; - } - else Thread.Sleep(5); - } - throw new Exception($"GetPackage() error: timeout. socket.Available={socket.Available}\n"); - } - - // отправляет пакет заданного размера, добавля в конец нули если длина data меньше чем packageSize - public static void SendPackage(this Socket socket, byte[] data) - { - if (data.Length > 65536) throw new Exception($"SendPackage() error: package is too big ({data.Length} bytes)"); - if (data.Length == 0) throw new Exception($"SendPackage() error: package has zero size"); - var list = new List(); - byte[] packageSize = data.Length.IntToBytes(); - if (packageSize.Length == 1) list.Add(0); - list.AddRange(packageSize); - list.AddRange(data); - socket.Send(list.ToArray()); - } - - // получает с сайта публичный ip - public static string GetPublicIP() => new WebClient().DownloadString("https://ipv4bot.whatismyipaddress.com/"); - } -} diff --git a/.old 6/DTLib/Properties/AssemblyInfo.cs b/.old 6/DTLib/Properties/AssemblyInfo.cs deleted file mode 100644 index c0201c5..0000000 --- a/.old 6/DTLib/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// Общие сведения об этой сборке предоставляются следующим набором -// набора атрибутов. Измените значения этих атрибутов для изменения сведений, -// связанные со сборкой. -[assembly: AssemblyTitle("DTLib")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DTLib")] -[assembly: AssemblyCopyright("Copyright © 2021")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми -// для компонентов COM. Если необходимо обратиться к типу в этой сборке через -// COM, задайте атрибуту ComVisible значение TRUE для этого типа. -[assembly: ComVisible(false)] - -// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM -[assembly: Guid("ce793497-2d5c-42d8-b311-e9b32af9cdfb")] - -// Сведения о версии сборки состоят из указанных ниже четырех значений: -// -// Основной номер версии -// Дополнительный номер версии -// Номер сборки -// Редакция -// -// Можно задать все значения или принять номера сборки и редакции по умолчанию -// используя "*", как показано ниже: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/.old 6/DTLib/PublicLog.cs b/.old 6/DTLib/PublicLog.cs deleted file mode 100644 index 5b38768..0000000 --- a/.old 6/DTLib/PublicLog.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace DTLib -{ - // - // вывод логов со всех классов в библиотеке - // - public static class PublicLog - { - public delegate void LogDelegate(string[] msg); - // вот к этому объекту подключайте методы для вывода логов - public static LogDelegate LogDel; - - // этот метод вызывается в библиотеке - public static void Log(params string[] msg) - => LogDel(msg); - } -} diff --git a/.old 6/DTLib/SecureRandom.cs b/.old 6/DTLib/SecureRandom.cs deleted file mode 100644 index f00bac9..0000000 --- a/.old 6/DTLib/SecureRandom.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Security.Cryptography; - -namespace DTLib -{ - // - // Вычисление псевдослучайного числа из множества параметров. - // Работает медленнее чем класс System.Random, но выдаёт более случайные значения - // - public class SecureRandom - { - private RNGCryptoServiceProvider crypt = new(); - - // получение массива случайных байтов - public byte[] GenBytes(uint length) - { - byte[] output = new byte[length]; - crypt.GetNonZeroBytes(output); - return output; - } - - // получение случайного числа от 0 до 2147483647 - /*public int NextInt(uint from, int to) - { - int output = 0; - int rez = 0; - while (true) - { - rez = output * 10 + NextBytes(1)[0]; - if (rez < to && rez > from) - { - output = rez; - return output; - } - } - }*/ - } -} diff --git a/.old 6/DTLib/SimpleConverter.cs b/.old 6/DTLib/SimpleConverter.cs deleted file mode 100644 index 7184635..0000000 --- a/.old 6/DTLib/SimpleConverter.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace DTLib -{ - // - // содержит методы расширения для различных операций и преобразований - // - public static class SimpleConverter - { - public static Encoding UTF8 = new UTF8Encoding(false); - // байты в кодировке UTF8 в строку - public static string ToStr(this byte[] bytes) => UTF8.GetString(bytes); - public static string ToStr(this List bytes) => UTF8.GetString(bytes.ToArray()); - - // хеш в виде массива байт в строку (хеш изначально не в кодировке UTF8, так что метод выше не работает с ним) - public static string HashToString(this byte[] hash) - { - var builder = new StringBuilder(); - for (int i = 0; i < hash.Length; i++) - { - builder.Append(hash[i].ToString("x2")); - } - return builder.ToString(); - } - - // строку в байты - public static byte[] ToBytes(this string str) => UTF8.GetBytes(str); - - // эти методы работают как надо, в отличии от стандартных, которые иногда дуркуют - public static bool StartsWith(this byte[] source, byte[] startsWith) - { - for (int i = 0; i < startsWith.Length; i++) - { - if (source[i] != startsWith[i]) return false; - } - return true; - } - - public static bool EndsWith(this byte[] source, byte[] endsWith) - { - for (int i = 0; i < endsWith.Length; i++) - { - if (source[source.Length - endsWith.Length + i] != endsWith[i]) return false; - } - return true; - } - - // Math.Truncate принимает как decimal, так и doublе, - // из-за чего вызов метода так: Math.Truncate(10/3) выдаст ошибку "неоднозначный вызов" - public static int Truncate(this double number) => Convert.ToInt32(Math.Truncate(number)); - - // сортирует в порядке возрастания элементы если это возможно, используя стандартный метод list.Sort(); - public static T[] Sort(this T[] array) - { - var list = array.ToList(); - list.Sort(); - return list.ToArray(); - } - - // массив в лист - public static List ToList(this T[] input) - { - var list = new List(); - list.AddRange(input); - return list; - } - - // удаление нескольких элементов массива - public static T[] RemoveRange(this T[] input, int startIndex, int count) - { - List list = input.ToList(); - list.RemoveRange(startIndex, count); - return list.ToArray(); - } - public static T[] RemoveRange(this T[] input, int startIndex) => input.RemoveRange(startIndex, input.Length - startIndex); - - // метод как у листов - public static bool Contains(this T[] array, T value) - { - for (int i = 0; i < array.Length; i++) - if (array[i].Equals(value)) return true; - return false; - } - - // конвертирует массив в строку - public static string MergeToString(this T[] array, string separator) - { - var b = new StringBuilder(); - for (int i = 0; i < array.Length; i++) - { - b.Append(array[i].ToString()); - b.Append(separator); - } - return b.ToString(); - } - public static string MergeToString(this List list, string separator) - { - var b = new StringBuilder(); - b.Append(list[0].ToString()); - for (int i = 1; i < list.Count; i++) - { - b.Append(separator); - b.Append(list[i].ToString()); - } - return b.ToString(); - } - - // сокращение конвертации - public static int ToInt(this T input) => Convert.ToInt32(input); - public static uint ToUInt(this T input) => Convert.ToUInt32(input); - public static long ToLong(this T input) => Convert.ToInt64(input); - public static ulong ToULong(this T input) => Convert.ToUInt64(input); - public static short ToShort(this T input) => Convert.ToInt16(input); - public static ushort ToUShort(this T input) => Convert.ToUInt16(input); - public static double ToDouble(this T input) => Convert.ToDouble(input, System.Globalization.CultureInfo.InvariantCulture); - public static byte ToByte(this T input) => Convert.ToByte(input); - public static sbyte ToSByte(this T input) => Convert.ToSByte(input); - public static bool ToBool(this T input) => Convert.ToBoolean(input); - - public static string AutoBuild(params object[] parts) - { - var builder = new StringBuilder(); - for (int i = 0; i < parts.Length; i++) - builder.Append(parts[i]); - return builder.ToString(); - } - - public static int BytesToInt(this byte[] bytes) - { - int output = 0; - for (ushort i = 0; i < bytes.Length; i++) output = output * 256 + bytes[i]; - return output; - } - - public static byte[] IntToBytes(this int num) - { - List output = new(); - while (num != 0) - { - output.Add(ToByte(num % 256)); - num = Truncate(num / 256); - } - output.Reverse(); - return output.ToArray(); - } - - public static string ToString(this IEnumerable collection, string separator) - { - StringBuilder builder = new(); - foreach (T elem in collection) - { - builder.Append(elem.ToString()); - builder.Append(separator); - } - builder.Remove(builder.Length - separator.Length, separator.Length); - return builder.ToString(); - } - } -} \ No newline at end of file diff --git a/.old 6/DTLib/TImer.cs b/.old 6/DTLib/TImer.cs deleted file mode 100644 index cb154ec..0000000 --- a/.old 6/DTLib/TImer.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Threading; - -namespace DTLib -{ - // - // простой и понятный класс для выполнения каких-либо действий в отдельном потоке раз в некоторое время - // - public class Timer - { - Thread TimerThread; - bool Repeat; - - // таймер сразу запускается - public Timer(bool repeat, int delay, Action method) - { - Repeat = repeat; - TimerThread = new Thread(() => - { - do - { - Thread.Sleep(delay); - method(); - } while (Repeat); - }); - TimerThread.Start(); - } - - // завершение потока - public void Stop() - { - Repeat = false; - TimerThread.Abort(); - } - } -} diff --git a/.old 6/DTLib/XXHash.cs b/.old 6/DTLib/XXHash.cs deleted file mode 100644 index 08c7c24..0000000 --- a/.old 6/DTLib/XXHash.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Security.Cryptography; -namespace DTLib -{ - // - // честно взятый с гитхаба алгоритм хеширования - // выдаёт хеш в виде массива четырёх байтов - // - sealed class XXHash32 : HashAlgorithm - { - private const uint PRIME32_1 = 2654435761U; - private const uint PRIME32_2 = 2246822519U; - private const uint PRIME32_3 = 3266489917U; - private const uint PRIME32_4 = 668265263U; - private const uint PRIME32_5 = 374761393U; - private static readonly Func FuncGetLittleEndianUInt32; - private static readonly Func FuncGetFinalHashUInt32; - private uint _Seed32; - private uint _ACC32_1; - private uint _ACC32_2; - private uint _ACC32_3; - private uint _ACC32_4; - private uint _Hash32; - private int _RemainingLength; - private long _TotalLength = 0; - private int _CurrentIndex; - private byte[] _CurrentArray; - - static XXHash32() - { - if (BitConverter.IsLittleEndian) - { - FuncGetLittleEndianUInt32 = new Func((x, i) => - { - unsafe - { - fixed (byte* array = x) - { - return *(uint*)(array + i); - } - } - }); - FuncGetFinalHashUInt32 = new Func(i => (i & 0x000000FFU) << 24 | (i & 0x0000FF00U) << 8 | (i & 0x00FF0000U) >> 8 | (i & 0xFF000000U) >> 24); - } - else - { - FuncGetLittleEndianUInt32 = new Func((x, i) => - { - unsafe - { - fixed (byte* array = x) - { - return (uint)(array[i++] | (array[i++] << 8) | (array[i++] << 16) | (array[i] << 24)); - } - } - }); - FuncGetFinalHashUInt32 = new Func(i => i); - } - } - - // Creates an instance of class by default seed(0). - // - public static new XXHash32 Create() => new XXHash32(); - - // Initializes a new instance of the class by default seed(0). - public XXHash32() => Initialize(0); - - // Initializes a new instance of the class, and sets the to the specified value. - // Represent the seed to be used for xxHash32 computing. - public XXHash32(uint seed) => Initialize(seed); - - // Gets the value of the computed hash code. - // Hash computation has not yet completed. - public uint HashUInt32 => State == 0 ? _Hash32 : throw new InvalidOperationException("Hash computation has not yet completed."); - - // Gets or sets the value of seed used by xxHash32 algorithm. - // Hash computation has not yet completed. - public uint Seed - { - get => _Seed32; - set - { - if (value != _Seed32) - { - if (State != 0) throw new InvalidOperationException("Hash computation has not yet completed."); - _Seed32 = value; - Initialize(); - } - } - } - - // Initializes this instance for new hash computing. - public override void Initialize() - { - _ACC32_1 = _Seed32 + PRIME32_1 + PRIME32_2; - _ACC32_2 = _Seed32 + PRIME32_2; - _ACC32_3 = _Seed32 + 0; - _ACC32_4 = _Seed32 - PRIME32_1; - } - - // Routes data written to the object into the hash algorithm for computing the hash. - // The input to compute the hash code for. - // The offset into the byte array from which to begin using data. - // The number of bytes in the byte array to use as data. - protected override void HashCore(byte[] array, int ibStart, int cbSize) - { - if (State != 1) State = 1; - var size = cbSize - ibStart; - _RemainingLength = size & 15; - if (cbSize >= 16) - { - var limit = size - _RemainingLength; - do - { - _ACC32_1 = Round32(_ACC32_1, FuncGetLittleEndianUInt32(array, ibStart)); - ibStart += 4; - _ACC32_2 = Round32(_ACC32_2, FuncGetLittleEndianUInt32(array, ibStart)); - ibStart += 4; - _ACC32_3 = Round32(_ACC32_3, FuncGetLittleEndianUInt32(array, ibStart)); - ibStart += 4; - _ACC32_4 = Round32(_ACC32_4, FuncGetLittleEndianUInt32(array, ibStart)); - ibStart += 4; - } while (ibStart < limit); - } - _TotalLength += cbSize; - if (_RemainingLength != 0) - { - _CurrentArray = array; - _CurrentIndex = ibStart; - } - } - - // Finalizes the hash computation after the last data is processed by the cryptographic stream object. - // The computed hash code. - protected override byte[] HashFinal() - { - if (_TotalLength >= 16) - { - _Hash32 = RotateLeft32(_ACC32_1, 1) + RotateLeft32(_ACC32_2, 7) + RotateLeft32(_ACC32_3, 12) + RotateLeft32(_ACC32_4, 18); - } - else - { - _Hash32 = _Seed32 + PRIME32_5; - } - _Hash32 += (uint)_TotalLength; - while (_RemainingLength >= 4) - { - _Hash32 = RotateLeft32(_Hash32 + FuncGetLittleEndianUInt32(_CurrentArray, _CurrentIndex) * PRIME32_3, 17) * PRIME32_4; - _CurrentIndex += 4; - _RemainingLength -= 4; - } - unsafe - { - fixed (byte* arrayPtr = _CurrentArray) - { - while (_RemainingLength-- >= 1) - { - _Hash32 = RotateLeft32(_Hash32 + arrayPtr[_CurrentIndex++] * PRIME32_5, 11) * PRIME32_1; - } - } - } - _Hash32 = (_Hash32 ^ (_Hash32 >> 15)) * PRIME32_2; - _Hash32 = (_Hash32 ^ (_Hash32 >> 13)) * PRIME32_3; - _Hash32 ^= _Hash32 >> 16; - _TotalLength = State = 0; - return BitConverter.GetBytes(FuncGetFinalHashUInt32(_Hash32)); - } - - private static uint Round32(uint input, uint value) => RotateLeft32(input + (value * PRIME32_2), 13) * PRIME32_1; - - private static uint RotateLeft32(uint value, int count) => (value << count) | (value >> (32 - count)); - - private void Initialize(uint seed) - { - HashSizeValue = 32; - _Seed32 = seed; - Initialize(); - } - } -} diff --git a/.old 6/DTLib/cs9somefix.cs b/.old 6/DTLib/cs9somefix.cs deleted file mode 100644 index 8d037c0..0000000 --- a/.old 6/DTLib/cs9somefix.cs +++ /dev/null @@ -1,8 +0,0 @@ -// включает init и record из c# 9.0 -using System.ComponentModel; - -namespace System.Runtime.CompilerServices -{ - [EditorBrowsable(EditorBrowsableState.Never)] - internal class IsExternalInit { } -} diff --git a/.old 6/dtlauncher-client-win/App.config b/.old 6/dtlauncher-client-win/App.config deleted file mode 100644 index 193aecc..0000000 --- a/.old 6/dtlauncher-client-win/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.old 6/dtlauncher-client-win/App.xaml b/.old 6/dtlauncher-client-win/App.xaml deleted file mode 100644 index 98da277..0000000 --- a/.old 6/dtlauncher-client-win/App.xaml +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.old 6/dtlauncher-client-win/App.xaml.cs b/.old 6/dtlauncher-client-win/App.xaml.cs deleted file mode 100644 index 93baef8..0000000 --- a/.old 6/dtlauncher-client-win/App.xaml.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Diagnostics; -using System.Windows; - -namespace dtlauncher_client_win -{ - /// - /// Логика взаимодействия для App.xaml - /// - public partial class App : Application - { - protected override void OnStartup(StartupEventArgs e) - { - base.OnStartup(e); - string[] args = e.Args; - try - { - if (args.Length > 0 || args[0] == "updated") - { - LoginWindow window = new(); - window.ShowDialog(); - } - else - { - Process.Start("cmd", "/c timeout 1 && start dtlauncher.exe"); - } - } - catch (Exception ex) - { - MessageBox.Show($"STARTUP ERROR:\n{ex.Message}\n{ex.Source}"); - } - Current.Shutdown(); - } - } -} diff --git a/.old 6/dtlauncher-client-win/LauncherWindow.xaml b/.old 6/dtlauncher-client-win/LauncherWindow.xaml deleted file mode 100644 index f639199..0000000 --- a/.old 6/dtlauncher-client-win/LauncherWindow.xaml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -