diff --git a/HDRezkaMirror.sln b/HDRezkaMirror.sln index 4d7ca03..48a584d 100644 --- a/HDRezkaMirror.sln +++ b/HDRezkaMirror.sln @@ -3,11 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32922.545 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HdrezkaMirrorLauncher", "HdrezkaMirrorLauncher\HdrezkaMirrorLauncher.csproj", "{4A7E6064-CD91-43A9-AB95-169E6253262B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HdrezkaMirrorSite", "HdrezkaMirrorSite\HdrezkaMirrorSite.csproj", "{91A2AAFC-93D5-4215-AE11-8733AF1597B8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HdrezkaMirrorSite", "HdrezkaMirrorSite\HdrezkaMirrorSite.csproj", "{9844558C-9965-4EBD-A4E3-78F9F2A8F3F7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HdrezkaMirrorConfigLauncher", "HdrezkaMirrorConfigLauncher\HdrezkaMirrorConfigLauncher.csproj", "{1050A713-995F-4505-80D9-2E5DDB9F6769}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HdrezkaMirrorConfigLauncher", "HdrezkaMirrorConfigLauncher\HdrezkaMirrorConfigLauncher.csproj", "{57E755E4-B9BA-4771-B752-5F77CD2991B2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HdrezkaMirrorLauncher", "HdrezkaMirrorLauncher\HdrezkaMirrorLauncher.csproj", "{09E0E9AD-EAFD-4A03-94D0-29C60FEC3547}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,18 +15,18 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4A7E6064-CD91-43A9-AB95-169E6253262B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A7E6064-CD91-43A9-AB95-169E6253262B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A7E6064-CD91-43A9-AB95-169E6253262B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A7E6064-CD91-43A9-AB95-169E6253262B}.Release|Any CPU.Build.0 = Release|Any CPU - {9844558C-9965-4EBD-A4E3-78F9F2A8F3F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9844558C-9965-4EBD-A4E3-78F9F2A8F3F7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9844558C-9965-4EBD-A4E3-78F9F2A8F3F7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9844558C-9965-4EBD-A4E3-78F9F2A8F3F7}.Release|Any CPU.Build.0 = Release|Any CPU - {57E755E4-B9BA-4771-B752-5F77CD2991B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {57E755E4-B9BA-4771-B752-5F77CD2991B2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {57E755E4-B9BA-4771-B752-5F77CD2991B2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {57E755E4-B9BA-4771-B752-5F77CD2991B2}.Release|Any CPU.Build.0 = Release|Any CPU + {91A2AAFC-93D5-4215-AE11-8733AF1597B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91A2AAFC-93D5-4215-AE11-8733AF1597B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91A2AAFC-93D5-4215-AE11-8733AF1597B8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91A2AAFC-93D5-4215-AE11-8733AF1597B8}.Release|Any CPU.Build.0 = Release|Any CPU + {1050A713-995F-4505-80D9-2E5DDB9F6769}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1050A713-995F-4505-80D9-2E5DDB9F6769}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1050A713-995F-4505-80D9-2E5DDB9F6769}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1050A713-995F-4505-80D9-2E5DDB9F6769}.Release|Any CPU.Build.0 = Release|Any CPU + {09E0E9AD-EAFD-4A03-94D0-29C60FEC3547}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09E0E9AD-EAFD-4A03-94D0-29C60FEC3547}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09E0E9AD-EAFD-4A03-94D0-29C60FEC3547}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09E0E9AD-EAFD-4A03-94D0-29C60FEC3547}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/HDrezka.ico b/HDrezka.ico new file mode 100644 index 0000000..544af3b Binary files /dev/null and b/HDrezka.ico differ diff --git a/HdrezkaMirrorConfigLauncher/App.config b/HdrezkaMirrorConfigLauncher/App.config deleted file mode 100644 index 9f05536..0000000 --- a/HdrezkaMirrorConfigLauncher/App.config +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/HdrezkaMirrorConfigLauncher/HDrezka.ico b/HdrezkaMirrorConfigLauncher/HDrezka.ico new file mode 100644 index 0000000..544af3b Binary files /dev/null and b/HdrezkaMirrorConfigLauncher/HDrezka.ico differ diff --git a/HdrezkaMirrorConfigLauncher/HdrezkaMirrorConfigLauncher.csproj b/HdrezkaMirrorConfigLauncher/HdrezkaMirrorConfigLauncher.csproj index 53c3d2d..1d7d64d 100644 --- a/HdrezkaMirrorConfigLauncher/HdrezkaMirrorConfigLauncher.csproj +++ b/HdrezkaMirrorConfigLauncher/HdrezkaMirrorConfigLauncher.csproj @@ -1,122 +1,23 @@ - - - + + - Debug - AnyCPU - {57E755E4-B9BA-4771-B752-5F77CD2991B2} Exe - HdrezkaMirrorConfigLauncher - HdrezkaMirrorConfigLauncher - v4.8 - 512 - true - true - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 1 - 1.0.0.%2a - false - true - true + net8.0 + enable + enable + HDrezka.ico - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - BECE6C5F35F3E51AD875A86A5BB593CA89312B69 - - - HdrezkaMirrorConfigLauncher_TemporaryKey.pfx - - - true - - - true - - - - ..\packages\Microsoft.Extensions.Configuration.8.0.0\lib\net462\Microsoft.Extensions.Configuration.dll - - - ..\packages\Microsoft.Extensions.Configuration.Abstractions.8.0.0\lib\net462\Microsoft.Extensions.Configuration.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Primitives.8.0.0\lib\net462\Microsoft.Extensions.Primitives.dll - - - - ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - - ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll - - - ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - - ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll - - - ..\packages\YamlDotNet.15.1.2\lib\net47\YamlDotNet.dll - - - - - - + - - - + + - - {9844558C-9965-4EBD-A4E3-78F9F2A8F3F7} - HdrezkaMirrorSite - + + - - False - Microsoft .NET Framework 4.8 %28x86 и x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - + - - \ No newline at end of file + + diff --git a/HdrezkaMirrorConfigLauncher/HdrezkaMirrorConfigLauncher.csproj.user b/HdrezkaMirrorConfigLauncher/HdrezkaMirrorConfigLauncher.csproj.user new file mode 100644 index 0000000..17ba516 --- /dev/null +++ b/HdrezkaMirrorConfigLauncher/HdrezkaMirrorConfigLauncher.csproj.user @@ -0,0 +1,6 @@ + + + + <_LastSelectedProfileId>C:\Users\nikit\OneDrive\Рабочий стол\save\C#\HDRezkaMirror\HdrezkaMirrorConfigLauncher\Properties\PublishProfiles\FolderProfile1.pubxml + + \ No newline at end of file diff --git a/HdrezkaMirrorConfigLauncher/Program.cs b/HdrezkaMirrorConfigLauncher/Program.cs index 1db9fe3..703a9c3 100644 --- a/HdrezkaMirrorConfigLauncher/Program.cs +++ b/HdrezkaMirrorConfigLauncher/Program.cs @@ -1,33 +1,30 @@ -using System.IO; -using HdrezkaMirrorSite; +using HdrezkaMirrorSite; using YamlDotNet.RepresentationModel; -namespace HdrezkaMirrorConfigLauncher +YamlMappingNode yaml = ReadingYaml(); + +MirrorSiteOpener mirrorSiteOpener; + +if (yaml["EmailIsSorted"].ToString() == "yes") { - class Program - { - static void Main() - { - YamlMappingNode yaml = ReadingYaml(); - if (yaml["EmailIsSorted"].ToString() == "yes") - { - new MirrorSiteOpener(yaml["Login"].ToString(), yaml["Password"].ToString()); - } - else - { - new MirrorSiteOpenerUnsorted(yaml["Login"].ToString(), yaml["Password"].ToString()); - } - } + mirrorSiteOpener = new(yaml["Login"].ToString(), yaml["Password"].ToString()); +} +else +{ + mirrorSiteOpener = new MirrorSiteOpenerUnsorted(yaml["Login"].ToString(), yaml["Password"].ToString()); +} + +await mirrorSiteOpener.Open(); - static YamlMappingNode ReadingYaml() - { - using (StreamReader reader = new StreamReader("config.yml")) - { - YamlStream yaml = new YamlStream(); - yaml.Load(reader); - YamlMappingNode root = (YamlMappingNode)yaml.Documents[0].RootNode; - return root; - } - } - } +await Task.Delay(1000); + +Environment.Exit(0); + +static YamlMappingNode ReadingYaml() +{ + using StreamReader reader = new("config.yml"); + YamlStream yaml = []; + yaml.Load(reader); + YamlMappingNode root = (YamlMappingNode)yaml.Documents[0].RootNode; + return root; } \ No newline at end of file diff --git a/HdrezkaMirrorConfigLauncher/Properties/AssemblyInfo.cs b/HdrezkaMirrorConfigLauncher/Properties/AssemblyInfo.cs deleted file mode 100644 index 3cd380b..0000000 --- a/HdrezkaMirrorConfigLauncher/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Общие сведения об этой сборке предоставляются следующим набором -// набора атрибутов. Измените значения этих атрибутов для изменения сведений, -// связанные с этой сборкой. -[assembly: AssemblyTitle("HdrezkaMirrorConfigLauncher")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("HdrezkaMirrorConfigLauncher")] -[assembly: AssemblyCopyright("Copyright © 2024")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми -// для компонентов COM. Если необходимо обратиться к типу в этой сборке через -// из модели COM задайте для атрибута ComVisible этого типа значение true. -[assembly: ComVisible(false)] - -// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM -[assembly: Guid("57e755e4-b9ba-4771-b752-5f77cd2991b2")] - -// Сведения о версии сборки состоят из указанных ниже четырех значений: -// -// Основной номер версии -// Дополнительный номер версии -// Номер сборки -// Номер редакции -// -// Можно задать все значения или принять номера сборки и редакции по умолчанию -// используя "*", как показано ниже: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/HdrezkaMirrorConfigLauncher/packages.config b/HdrezkaMirrorConfigLauncher/packages.config deleted file mode 100644 index 2a63ad9..0000000 --- a/HdrezkaMirrorConfigLauncher/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj b/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj index 6b0af7b..3917b7b 100644 --- a/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj +++ b/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj @@ -1,94 +1,19 @@ - - - + + - latest - Debug - AnyCPU - {4A7E6064-CD91-43A9-AB95-169E6253262B} Exe - HdrezkaMirrorLauncher - HdrezkaMirrorLauncher - v4.8 - 512 - true - true - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - HdrezkaMirrorLauncher.Program - - + net8.0 + enable + enable HDrezka.ico - - - - - - - - - - - + + - - False - Microsoft .NET Framework 4.8 %28x86 и x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - {9844558C-9965-4EBD-A4E3-78F9F2A8F3F7} - HdrezkaMirrorSite - - - - + - - \ No newline at end of file + + diff --git a/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj.user b/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj.user index 729e852..9c7ee02 100644 --- a/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj.user +++ b/HdrezkaMirrorLauncher/HdrezkaMirrorLauncher.csproj.user @@ -1,13 +1,6 @@  - publish\ - - - - - - ru-RU - false + <_LastSelectedProfileId>C:\Users\nikit\OneDrive\Рабочий стол\Programs\C#\HDRezkaMirror\HdrezkaMirrorLauncher\Properties\PublishProfiles\FolderProfile.pubxml \ No newline at end of file diff --git a/HdrezkaMirrorLauncher/Program.cs b/HdrezkaMirrorLauncher/Program.cs index 9f67a4b..532c151 100644 --- a/HdrezkaMirrorLauncher/Program.cs +++ b/HdrezkaMirrorLauncher/Program.cs @@ -1,16 +1,10 @@ -using System; -using System.Diagnostics; -using System.Text; +using System.Text; using HdrezkaMirrorSite; -namespace HdrezkaMirrorLauncher; +Console.OutputEncoding = Encoding.Unicode; +MirrorSiteOpener mirrorSiteOpener = new("адрес", "пароль"); +await mirrorSiteOpener.Open(); -class Program -{ - public static void Main() - { - Console.OutputEncoding = Encoding.Unicode; - new MirrorSiteOpener("адрес", "пароль для внешних приложений"); - Process.GetCurrentProcess().Kill(); - } -} \ No newline at end of file +await Task.Delay(1000); + +Environment.Exit(0); \ No newline at end of file diff --git a/HdrezkaMirrorLauncher/Properties/AssemblyInfo.cs b/HdrezkaMirrorLauncher/Properties/AssemblyInfo.cs deleted file mode 100644 index 9430a22..0000000 --- a/HdrezkaMirrorLauncher/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// Общие сведения об этой сборке предоставляются следующим набором -// набора атрибутов. Измените значения этих атрибутов для изменения сведений, -// связанные с этой сборкой. -[assembly: AssemblyTitle("MirrorHDrezka")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MirrorHDrezka")] -[assembly: AssemblyCopyright("Copyright © 2022")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми -// для компонентов COM. Если необходимо обратиться к типу в этой сборке через -// из модели COM задайте для атрибута ComVisible этого типа значение true. -[assembly: ComVisible(false)] - -// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM -[assembly: Guid("4a7e6064-cd91-43a9-ab95-169e6253262b")] - -// Сведения о версии сборки состоят из указанных ниже четырех значений: -// -// Основной номер версии -// Дополнительный номер версии -// Номер сборки -// Номер редакции -// -// Можно задать все значения или принять номера сборки и редакции по умолчанию -// используя "*", как показано ниже: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/HdrezkaMirrorLauncher/app.config b/HdrezkaMirrorLauncher/app.config deleted file mode 100644 index 9e86718..0000000 --- a/HdrezkaMirrorLauncher/app.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/HdrezkaMirrorSite/Configuration.cs b/HdrezkaMirrorSite/Configuration.cs new file mode 100644 index 0000000..ae41599 --- /dev/null +++ b/HdrezkaMirrorSite/Configuration.cs @@ -0,0 +1,34 @@ +using System.Runtime.InteropServices; + +namespace HdrezkaMirrorSite; + +public class Configuration +{ + public static readonly string emailHDrezka = "mirror@hdrezka.org"; + + public static readonly List gTLD = ["net", "org"]; + + public static readonly string UserAgent = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36"; + + public static string LineEndings { get; } = LineEndingsProvider(); + + static string LineEndingsProvider() + { + string lineEndings; + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + lineEndings = "\r"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + lineEndings = "\n"; + } + else + { + lineEndings = "\r\n"; + } + + return lineEndings; + } +} \ No newline at end of file diff --git a/HdrezkaMirrorSite/Email.cs b/HdrezkaMirrorSite/Email.cs new file mode 100644 index 0000000..12b56f5 --- /dev/null +++ b/HdrezkaMirrorSite/Email.cs @@ -0,0 +1,69 @@ +using System.Net; +using System.Net.Mail; +using MailKit; +using MailKit.Net.Imap; +using MailKit.Search; +using SmtpClient = System.Net.Mail.SmtpClient; + +namespace HdrezkaMirrorSite; + +public class Email +{ + public delegate Task ClientOperation(ImapClient imapClient); + + public delegate Task FolderOperation(IMailFolder folder); + + public delegate Task InboxOperation(IList uids, IMailFolder inbox); + + public static SmtpClient Smtp(string from, string password) + { + return new() + { + UseDefaultCredentials = false, + Port = 25, + EnableSsl = true, + DeliveryFormat = SmtpDeliveryFormat.International, + DeliveryMethod = SmtpDeliveryMethod.Network, + Host = "smtp.mail.ru", + Timeout = 300000, + Credentials = new NetworkCredential(from, password) + }; + } + + public static async Task ImapClientAction(string from, string password, ClientOperation operation) + { + using ImapClient client = new(); + await client.ConnectAsync("imap.mail.ru", 993, true); + + await client.AuthenticateAsync(from, password); + + await operation(client); + + await client.DisconnectAsync(true); + } + + + public static async Task FolderAction(string from, string password, FolderOperation operation) + { + await ImapClientAction(from, password, async client => + { + IMailFolder folder = await client.GetFolderAsync("INBOX/HDrezka"); + await folder.OpenAsync(FolderAccess.ReadOnly); + + await operation(folder); + }); + } + + public static async Task InboxAction(string from, string password, InboxOperation operation) + { + await ImapClientAction(from, password, async client => + { + await client.Inbox.OpenAsync(FolderAccess.ReadOnly); + + TextSearchQuery query = SearchQuery.FromContains(Configuration.emailHDrezka); + IList uids = await client.Inbox.SearchAsync(query); + + await operation(uids, client.Inbox); + }); + } +} \ No newline at end of file diff --git a/HdrezkaMirrorSite/HdrezkaMirrorSite.csproj b/HdrezkaMirrorSite/HdrezkaMirrorSite.csproj index 89545c7..0f4f8da 100644 --- a/HdrezkaMirrorSite/HdrezkaMirrorSite.csproj +++ b/HdrezkaMirrorSite/HdrezkaMirrorSite.csproj @@ -1,68 +1,14 @@ - - - + + - 10.0 - Debug - AnyCPU - {9844558C-9965-4EBD-A4E3-78F9F2A8F3F7} - Library - Properties - HdrezkaMirrorSite - HdrezkaMirrorSite - v4.8 - 512 - true + net8.0 + enable + enable - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\BouncyCastle.Cryptography.2.3.0\lib\net461\BouncyCastle.Cryptography.dll - - - ..\packages\MailKit.4.3.0\lib\net48\MailKit.dll - - - ..\packages\MimeKit.4.3.0\lib\net48\MimeKit.dll - - - ..\packages\ShellProgressBar.5.2.0\lib\net461\ShellProgressBar.dll - - - - ..\packages\System.Formats.Asn1.8.0.0\lib\net462\System.Formats.Asn1.dll - - - ..\packages\System.Text.Encoding.CodePages.8.0.0\lib\net462\System.Text.Encoding.CodePages.dll - - - - - - - - - - - + - + + - - \ No newline at end of file + + diff --git a/HdrezkaMirrorSite/HdrezkaMirrorSite.csproj.user b/HdrezkaMirrorSite/HdrezkaMirrorSite.csproj.user new file mode 100644 index 0000000..ebb47cb --- /dev/null +++ b/HdrezkaMirrorSite/HdrezkaMirrorSite.csproj.user @@ -0,0 +1,6 @@ + + + + <_LastSelectedProfileId>C:\Users\nikit\OneDrive\Рабочий стол\Programs\C#\HDRezkaMirror\HdrezkaMirrorSite\Properties\PublishProfiles\FolderProfile.pubxml + + \ No newline at end of file diff --git a/HdrezkaMirrorSite/MirrorSiteOpener.cs b/HdrezkaMirrorSite/MirrorSiteOpener.cs index a451062..8aba807 100644 --- a/HdrezkaMirrorSite/MirrorSiteOpener.cs +++ b/HdrezkaMirrorSite/MirrorSiteOpener.cs @@ -1,82 +1,78 @@ -using System; -using System.Diagnostics; -using System.Net; -using System.Net.Http; +using System.Diagnostics; using System.Net.Mail; -using System.Threading; -using System.Threading.Tasks; -using MailKit; -using MailKit.Net.Imap; +using System.Runtime.InteropServices; using MimeKit; using ShellProgressBar; namespace HdrezkaMirrorSite; -public class MirrorSiteOpener +public class MirrorSiteOpener(string from, string password) { - protected readonly string emailHDrezka = "mirror@hdrezka.org"; - - protected readonly string extension1 = "net"; - - protected readonly string extension2 = "org"; - - public MirrorSiteOpener(string from, string password) + public async Task Open() { - OpenAsync(from, password).Wait(); - } - - async Task OpenAsync(string from, string password) - { - string address = Get(from, password); + using var main = new ProgressBar(2, "Получаем закэшированный адрес...", ProgressBarTheme.MainTheme()); + string? address = await Get(); if (address != null) { - bool websiteWorking = await IsMirrorWork("http://" + address); - if (websiteWorking) + main.Tick("Проверяем работоспособность зеркала..."); + address = "http://" + address; + bool isWebsiteWorking = await IsMirrorWork(address); + if (isWebsiteWorking) { - Process.Start(new ProcessStartInfo("http://" + address) { UseShellExecute = true }); + main.Tick("Открываем актулаьное зеркало..."); + OpenBrowser(address); return; } } - await SendAsync(from, password); - int countMsg = CountMessage(from, password); - Console.WriteLine("Запрос зеркала..."); - ProgressBarOptions options = new() - { - ProgressCharacter = '─', - ProgressBarOnBottom = true - }; - using ProgressBar progressBar = new(20, "Получение зеркала", options); + main.Tick("Запрашиваем зеркало..."); + using var child = main.Spawn(20, "Ждём ответ", ProgressBarTheme.SubTheme()); + await Send(); + int initialMessageCount = await MessageNumber(); for (int i = 0; i < 20; i++) { - if (countMsg != CountMessage(from, password)) + if (initialMessageCount != await MessageNumber()) { - address = Get(from, password); + address = await Get(); if (address != null) { - Process.Start(new ProcessStartInfo("http://" + address) { UseShellExecute = true }); + OpenBrowser("http://" + address); } return; } - progressBar.Tick(); - Thread.Sleep(250); + child.Tick(); + await Task.Delay(250); } } - async Task IsMirrorWork(string url) + + static void OpenBrowser(string address) { - string userAgent = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36"; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Process.Start(new ProcessStartInfo(address) { UseShellExecute = true }); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Process.Start("xdg-open", address); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + Process.Start("open", address); + } + } + static async Task IsMirrorWork(string url) + { using HttpClient client = new(); - client.DefaultRequestHeaders.UserAgent.ParseAdd(userAgent); + client.Timeout = TimeSpan.FromMinutes(10); + client.DefaultRequestHeaders.UserAgent.ParseAdd(Configuration.UserAgent); try { HttpResponseMessage result = await client.GetAsync(url); - return result.RequestMessage.RequestUri.OriginalString == url; } catch (HttpRequestException) @@ -85,71 +81,44 @@ async Task IsMirrorWork(string url) } } - protected virtual int CountMessage(string from, string password) + protected virtual async Task MessageNumber() { - using ImapClient client = new(); - client.Connect("imap.mail.ru", 993, true); - - client.Authenticate(from, password); - - IMailFolder folder = client.GetFolder("INBOX/HDrezka"); - folder.Open(FolderAccess.ReadOnly); - - client.Disconnect(true); - return folder.Count; + int messageCount = 0; + await Email.FolderAction(from, password, folder => + { + messageCount = folder.Count; + return Task.CompletedTask; + }); + return messageCount; } - protected virtual string Get(string from, string password) + protected virtual async Task Get() { - using ImapClient client = new(); - client.Connect("imap.mail.ru", 993, true); - - client.Authenticate(from, password); - - IMailFolder folder = client.GetFolder("INBOX/HDrezka"); - folder.Open(FolderAccess.ReadOnly); - if (folder.Count > 0) + string? foundWord = null; + await Email.FolderAction(from, password, async folder => { - MimeMessage message = folder.GetMessage(folder.Count - 1); - - string bodyMailText = message.TextBody; - bodyMailText = bodyMailText.Replace("\r\n", " "); - - foreach (string word in bodyMailText.Split(' ')) + if (folder.Count > 0) { - if (word.Contains("." + extension1) || word.Contains("." + extension2)) - { - client.Disconnect(true); - return word; - } - } - } + MimeMessage message = await folder.GetMessageAsync(folder.Count - 1); + string bodyMailText = message.TextBody.Replace(Configuration.LineEndings, " "); - client.Disconnect(true); - return null; + foundWord = bodyMailText.Split(' ') + .FirstOrDefault(word => Configuration.gTLD.Any(tld => word.Contains("." + tld))); + } + }); + return foundWord; } - async Task SendAsync(string from, string password) + async Task Send() { - SmtpClient client = new() - { - UseDefaultCredentials = false, - Port = 25, - EnableSsl = true, - DeliveryFormat = SmtpDeliveryFormat.International, - DeliveryMethod = SmtpDeliveryMethod.Network, - Host = "smtp.mail.ru", - Timeout = 300000, - Credentials = new NetworkCredential(from, password) - }; + using SmtpClient client = Email.Smtp(from, password); MailMessage mailMessage = new() { - From = new MailAddress(from) + From = new(from) }; - mailMessage.To.Add(emailHDrezka); + mailMessage.To.Add(Configuration.emailHDrezka); await client.SendMailAsync(mailMessage); - client.Dispose(); } } \ No newline at end of file diff --git a/HdrezkaMirrorSite/MirrorSiteOpenerUnsorted.cs b/HdrezkaMirrorSite/MirrorSiteOpenerUnsorted.cs index ccd3ee6..f647f87 100644 --- a/HdrezkaMirrorSite/MirrorSiteOpenerUnsorted.cs +++ b/HdrezkaMirrorSite/MirrorSiteOpenerUnsorted.cs @@ -1,64 +1,41 @@ -using System.Collections.Generic; -using System.Linq; -using MailKit; -using MailKit.Net.Imap; +using MailKit; using MailKit.Search; using MimeKit; namespace HdrezkaMirrorSite; -public class MirrorSiteOpenerUnsorted : MirrorSiteOpener +public class MirrorSiteOpenerUnsorted(string from, string password) : MirrorSiteOpener(from, password) { - public MirrorSiteOpenerUnsorted(string from, string password) : base(from, password) + protected override async Task Get() { - } - - protected override string Get(string from, string password) - { - using ImapClient client = new(); - client.Connect("imap.mail.ru", 993, true); - - client.Authenticate(from, password); - - client.Inbox.Open(FolderAccess.ReadOnly); - - TextSearchQuery query = SearchQuery.FromContains(emailHDrezka); - IList uids = client.Inbox.Search(query); - - foreach (UniqueId uid in uids.Reverse()) + string? foundWord = null; + await Email.InboxAction(from, password, async (uids, inbox) => { - MimeMessage message = client.Inbox.GetMessage(uid); - string bodyMailText = message.TextBody; - bodyMailText = bodyMailText.Replace("\r\n", " "); - - foreach (string word in bodyMailText.Split(' ')) + foreach (UniqueId uid in uids.Reverse()) { - if (word.Contains("." + extension1) || word.Contains("." + extension2)) - { - client.Disconnect(true); - return word; - } - } - - break; - } + MimeMessage message = await inbox.GetMessageAsync(uid); + string bodyMailText = message.TextBody; + bodyMailText = bodyMailText.Replace("\r\n", " "); - client.Disconnect(true); - return null; + foundWord = bodyMailText.Split(' ') + .FirstOrDefault(word => Configuration.gTLD.Any(tld => word.Contains("." + tld))); + } + }); + return foundWord; } - protected override int CountMessage(string from, string password) + protected override async Task MessageNumber() { - using ImapClient client = new(); - client.Connect("imap.mail.ru", 993, true); - - client.Authenticate(from, password); - - client.Inbox.Open(FolderAccess.ReadOnly); - - TextSearchQuery query = SearchQuery.FromContains(emailHDrezka); - IList uids = client.Inbox.Search(query); - - return uids.Count; + int messageNumber = 0; + await Email.InboxAction(from, password, (uids, inbox) => + { + inbox.Open(FolderAccess.ReadOnly); + + TextSearchQuery query = SearchQuery.FromContains(Configuration.emailHDrezka); + uids = inbox.Search(query); + messageNumber = uids.Count; + return null; + }); + return messageNumber; } } \ No newline at end of file diff --git a/HdrezkaMirrorSite/ProgressBarTheme.cs b/HdrezkaMirrorSite/ProgressBarTheme.cs new file mode 100644 index 0000000..422477e --- /dev/null +++ b/HdrezkaMirrorSite/ProgressBarTheme.cs @@ -0,0 +1,26 @@ +using ShellProgressBar; + +namespace HdrezkaMirrorSite; + +public static class ProgressBarTheme +{ + public static ProgressBarOptions MainTheme() + { + return new() + { + ForegroundColor = ConsoleColor.Yellow, + BackgroundColor = ConsoleColor.DarkYellow, + ProgressCharacter = '─' + }; + } + + public static ProgressBarOptions SubTheme() + { + return new() + { + ForegroundColor = ConsoleColor.Green, + BackgroundColor = ConsoleColor.DarkGreen, + ProgressCharacter = '─' + }; + } +} \ No newline at end of file diff --git a/HdrezkaMirrorSite/app.config b/HdrezkaMirrorSite/app.config deleted file mode 100644 index 269425d..0000000 --- a/HdrezkaMirrorSite/app.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/HdrezkaMirrorSite/packages.config b/HdrezkaMirrorSite/packages.config deleted file mode 100644 index f1bd644..0000000 --- a/HdrezkaMirrorSite/packages.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file