aboutsummaryrefslogtreecommitdiff
path: root/Source/Assistant
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Assistant')
-rw-r--r--Source/Assistant/HttpClientUtil.cs40
-rw-r--r--Source/Assistant/IProduct.cs2
-rw-r--r--Source/Assistant/ParseUtil.cs44
-rw-r--r--Source/Assistant/RequestModifier.cs67
-rw-r--r--Source/Assistant/SkuAssist.cs96
-rw-r--r--Source/Assistant/SkuExtensions.cs12
-rw-r--r--Source/Assistant/StoreResponse.cs2
7 files changed, 140 insertions, 123 deletions
diff --git a/Source/Assistant/HttpClientUtil.cs b/Source/Assistant/HttpClientUtil.cs
index 3ad5d85..316ea07 100644
--- a/Source/Assistant/HttpClientUtil.cs
+++ b/Source/Assistant/HttpClientUtil.cs
@@ -1,19 +1,18 @@
-using AngleSharp;
-using AngleSharp.Dom;
-using System;
+using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
-using System.Text;
-namespace Rehau.Sku.Assist
+namespace RehauSku.Assistant
{
static class HttpClientUtil
{
private static HttpClient _httpClient = AddIn.httpClient;
- public async static Task<string> GetContentByUriAsync(Uri uri)
+ public async static Task<string> GetContentByRequest(string request)
{
+ Uri uri = request.ConvertToUri();
+
ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11 |
@@ -22,22 +21,14 @@ namespace Rehau.Sku.Assist
return await _httpClient.GetStringAsync(uri);
}
- public async static Task<IDocument> ContentToDocAsync(Task<string> content)
- {
- IConfiguration config = Configuration.Default;
- IBrowsingContext context = BrowsingContext.New(config);
-
- return await context.OpenAsync(req => req.Content(content.Result));
- }
-
- public static Uri ConvertToUri(this string request, ResponseOrder order)
+ private static Uri ConvertToUri(this string request)
{
UriBuilder baseUri = new UriBuilder("https", "shop-rehau.ru");
baseUri.Path = "/catalogsearch/result/index/";
- string cleanedRequest = request._CleanRequest();
+ string cleanedRequest = request.CleanRequest();
- switch (order)
+ switch (RegistryUtil.StoreResponseOrder)
{
case ResponseOrder.Relevance:
baseUri.Query = "dir=asc&order=relevance&q=" + cleanedRequest;
@@ -51,25 +42,12 @@ namespace Rehau.Sku.Assist
case ResponseOrder.Series:
baseUri.Query = "dir=asc&order=sch_product_series&q=" + cleanedRequest;
break;
- case ResponseOrder.NoSettings:
+ default:
baseUri.Query = "q=" + cleanedRequest;
break;
- default:
- throw new ArgumentException();
}
return baseUri.Uri;
}
-
- private static string _CleanRequest(this string input)
- {
- return new StringBuilder(input)
- .Replace("+", " plus ")
- .Replace("РХ", "")
- .Replace("º", " ")
- .Replace(".", " ")
- .Replace("Ø", " ")
- .ToString();
- }
}
} \ No newline at end of file
diff --git a/Source/Assistant/IProduct.cs b/Source/Assistant/IProduct.cs
index d5db286..9494eeb 100644
--- a/Source/Assistant/IProduct.cs
+++ b/Source/Assistant/IProduct.cs
@@ -1,4 +1,4 @@
-namespace Rehau.Sku.Assist
+namespace RehauSku.Assistant
{
interface IProduct
{
diff --git a/Source/Assistant/ParseUtil.cs b/Source/Assistant/ParseUtil.cs
new file mode 100644
index 0000000..a93c658
--- /dev/null
+++ b/Source/Assistant/ParseUtil.cs
@@ -0,0 +1,44 @@
+using AngleSharp;
+using AngleSharp.Dom;
+using Newtonsoft.Json;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace RehauSku.Assistant
+{
+ static class ParseUtil
+ {
+ public async static Task<IDocument> ContentToDocAsync(string content)
+ {
+ IConfiguration config = Configuration.Default;
+ IBrowsingContext context = BrowsingContext.New(config);
+
+ return await context.OpenAsync(req => req.Content(content));
+ }
+
+ public static IProduct GetProduct(IDocument document)
+ {
+ string script = document
+ .Scripts
+ .Where(s => s.InnerHtml.Contains("dataLayer"))
+ .FirstOrDefault()
+ .InnerHtml;
+
+ string json = script
+ .Substring(script.IndexOf("push(") + 5)
+ .TrimEnd(new[] { ')', ';', '\n', ' ' });
+
+ if (!json.Contains("impressions"))
+ return null;
+
+ StoreResponce storeResponse = JsonConvert.DeserializeObject<StoreResponce>(json);
+ IProduct product = storeResponse
+ .Ecommerce
+ .Impressions
+ .Where(p => p.Id.IsRehauSku())
+ .FirstOrDefault();
+
+ return product;
+ }
+ }
+} \ No newline at end of file
diff --git a/Source/Assistant/RequestModifier.cs b/Source/Assistant/RequestModifier.cs
new file mode 100644
index 0000000..9f42e71
--- /dev/null
+++ b/Source/Assistant/RequestModifier.cs
@@ -0,0 +1,67 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace RehauSku.Assistant
+{
+ public static class RequestModifier
+ {
+ public static string CleanRequest(this string input)
+ {
+ string replace = new StringBuilder(input)
+ .Replace("+", " plus ")
+ .Replace("РХ", "")
+ .Replace("º", " ")
+ .Replace(".", " ")
+ .Replace("Ø", " ")
+ .ToString();
+
+ return replace._tPieceNormalize();
+ }
+
+ private static string _tPieceNormalize(this string line)
+ {
+ Regex regex = new Regex(@"\d{2}.\d{2}.\d{2}");
+
+ if (!regex.IsMatch(line))
+ return line;
+
+ string match = regex.Match(line).Value;
+
+ int side = int.Parse($"{match[3]}{match[4]}");
+ int[] endFaces = new int[]
+ {
+ int.Parse($"{match[0]}{match[1]}"),
+ int.Parse($"{match[6]}{match[7]}")
+ };
+
+ if (new[] { endFaces[0], endFaces[1], side }.Any(x => x == 45 || x == 90 || x == 87))
+ return line;
+
+ List<string> additions = new List<string>();
+
+ if (endFaces.All(x => x < side))
+ additions.Add("увеличенный боковой");
+
+ else
+ {
+ if (new[] { endFaces[0], endFaces[1], side }.Distinct().Count() == 1)
+ additions.Add("равнопроходной");
+ else
+ additions.Add("уменьшенный");
+
+ if (endFaces.Any(x => x > side))
+ additions.Add("боковой");
+
+ if (endFaces[0] != endFaces[1])
+ additions.Add("торцевой");
+ }
+
+ string piece = $" {endFaces.Max()}-{side}-{endFaces.Min()} ";
+ string modifiedMatch = string.Join(" ", additions) + piece;
+
+ return line.Replace(match, modifiedMatch);
+ }
+ }
+} \ No newline at end of file
diff --git a/Source/Assistant/SkuAssist.cs b/Source/Assistant/SkuAssist.cs
index e8ce789..6c68288 100644
--- a/Source/Assistant/SkuAssist.cs
+++ b/Source/Assistant/SkuAssist.cs
@@ -1,24 +1,7 @@
-using AngleSharp.Dom;
-using ExcelDna.Integration;
-using Newtonsoft.Json;
-using System;
-using System.Globalization;
-using System.Linq;
-using System.Runtime.Caching;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
-namespace Rehau.Sku.Assist
+namespace RehauSku.Assistant
{
- public enum ResponseOrder
- {
- NoSettings,
- Relevance,
- Name,
- Price,
- Series
- }
-
public enum ProductField
{
Name,
@@ -28,79 +11,12 @@ namespace Rehau.Sku.Assist
static class SkuAssist
{
- public static async Task<IProduct> GetProduct(string request)
+ public static async Task<IProduct> GetProductAsync(string request)
{
- Uri uri = request.ConvertToUri(ResponseOrder.NoSettings);
-
- Task<string> contentTask = Task.Run(() => HttpClientUtil.GetContentByUriAsync(uri));
- Task<IDocument> documentTask = await contentTask.ContinueWith(content => HttpClientUtil.ContentToDocAsync(content));
-
- return GetProduct(documentTask.Result);
- }
-
- public static IProduct GetProduct(IDocument d)
- {
- string script = d.Scripts
- .Where(s => s.InnerHtml.Contains("dataLayer"))
- .First()
- .InnerHtml;
-
- string json = script
- .Substring(script.IndexOf("push(") + 5)
- .TrimEnd(new[] { ')', ';', '\n', ' ' });
-
- if (!json.Contains("impressions"))
- return null;
-
- StoreResponce storeResponse = JsonConvert.DeserializeObject<StoreResponce>(json);
- IProduct product = storeResponse
- .Ecommerce
- .Impressions
- .Where(p => Regex.IsMatch(p.Id, @"\d{11}", RegexOptions.None))
- .FirstOrDefault();
-
- return product;
- }
-
- public static object GetProduct(string request, ProductField field)
- {
- IProduct product;
-
- if (MemoryCache.Default.Contains(request))
- {
- product = MemoryCache.Default[request] as IProduct;
- }
-
- else
- {
- object result = ExcelAsyncUtil.Run("RauName", new[] { request },
- delegate
- {
- Task<IProduct> p = Task.Run(() => GetProduct(request));
- return p.Result;
- });
-
- if (result == null)
- return "Не найдено :(";
-
- if (result.Equals(ExcelError.ExcelErrorNA))
- return "Загрузка...";
-
- product = result as IProduct;
- MemoryCache.Default.Add(request, product, DateTime.Now.AddMinutes(10));
- }
+ var content = await HttpClientUtil.GetContentByRequest(request);
+ var document = await ParseUtil.ContentToDocAsync(content);
- switch (field)
- {
- case ProductField.Name:
- return product.Name;
- case ProductField.Id:
- return product.Id;
- case ProductField.Price:
- return double.Parse((string)product.Price, CultureInfo.InvariantCulture);
- default:
- return ExcelError.ExcelErrorValue;
- }
+ return ParseUtil.GetProduct(document);
}
}
} \ No newline at end of file
diff --git a/Source/Assistant/SkuExtensions.cs b/Source/Assistant/SkuExtensions.cs
new file mode 100644
index 0000000..e39807b
--- /dev/null
+++ b/Source/Assistant/SkuExtensions.cs
@@ -0,0 +1,12 @@
+using System.Text.RegularExpressions;
+
+namespace RehauSku.Assistant
+{
+ static class SkuExtensions
+ {
+ public static bool IsRehauSku(this string line)
+ {
+ return Regex.IsMatch(line, @"^[1]\d{6}[1]\d{3}$");
+ }
+ }
+} \ No newline at end of file
diff --git a/Source/Assistant/StoreResponse.cs b/Source/Assistant/StoreResponse.cs
index 78fe846..8e1759d 100644
--- a/Source/Assistant/StoreResponse.cs
+++ b/Source/Assistant/StoreResponse.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
-namespace Rehau.Sku.Assist
+namespace RehauSku.Assistant
{
public class StoreResponce
{