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