refactor: extract Netch.Utils.Subscription

This commit is contained in:
ChsBuffer
2020-11-05 16:13:30 +08:00
parent cfc070b1ef
commit 21f2f8da5e
3 changed files with 73 additions and 49 deletions

View File

@@ -100,9 +100,7 @@ namespace Netch.Forms
}
private readonly object _serverLock = new object();
public async Task UpdateServersFromSubscribe()
private async Task UpdateServersFromSubscribe()
{
void DisableItems(bool v)
{
@@ -126,9 +124,11 @@ namespace Netch.Forms
StatusText(i18N.Translate("Starting update subscription"));
DisableItems(false);
var useProxyToUpdateSubscription = Global.Settings.UseProxyToUpdateSubscription;
try
{
if (Global.Settings.UseProxyToUpdateSubscription)
string proxyServer = null;
if (useProxyToUpdateSubscription)
{
var mode = new Models.Mode
{
@@ -136,50 +136,10 @@ namespace Netch.Forms
Type = 5
};
await MainController.Start(ServerComboBox.SelectedItem as Server, mode);
proxyServer = $"http://127.0.0.1:{Global.Settings.HTTPLocalPort}";
}
await Task.WhenAll(Global.Settings.SubscribeLink.Select(async item => await Task.Run(() =>
{
try
{
var request = WebUtil.CreateRequest(item.Link);
if (!string.IsNullOrEmpty(item.UserAgent)) request.UserAgent = item.UserAgent;
if (Global.Settings.UseProxyToUpdateSubscription)
request.Proxy = new WebProxy($"http://127.0.0.1:{Global.Settings.HTTPLocalPort}");
List<Server> servers;
var result = WebUtil.DownloadString(request, out var rep);
if (rep.StatusCode == HttpStatusCode.OK)
{
servers = ShareLink.ParseText(result);
}
else
{
throw new Exception($"{item.Remark} Response Status Code: {rep.StatusCode}");
}
foreach (var server in servers)
{
server.Group = item.Remark;
}
lock (_serverLock)
{
Global.Settings.Server.RemoveAll(server => server.Group.Equals(item.Remark));
Global.Settings.Server.AddRange(servers);
}
NotifyTip(i18N.TranslateFormat("Update {1} server(s) from {0}", item.Remark, servers.Count));
}
catch (Exception e)
{
NotifyTip($"{i18N.TranslateFormat("Update servers error from {0}", item.Remark)}\n{e.Message}", info: false);
Logging.Error(e.ToString());
}
})).ToArray());
await Subscription.UpdateServersAsync(proxyServer);
InitServer();
Configuration.Save();
@@ -191,9 +151,16 @@ namespace Netch.Forms
}
finally
{
if (Global.Settings.UseProxyToUpdateSubscription)
if (useProxyToUpdateSubscription)
{
await MainController.Stop();
try
{
await MainController.Stop();
}
catch
{
// ignored
}
}
DisableItems(true);

View File

@@ -472,7 +472,7 @@ namespace Netch.Forms
Activate();
}
private void NotifyTip(string text, int timeout = 0, bool info = true)
public void NotifyTip(string text, int timeout = 0, bool info = true)
{
// 会阻塞线程 timeout 秒
NotifyIcon.ShowBalloonTip(timeout,

View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Netch.Models;
namespace Netch.Utils
{
public static class Subscription
{
private static readonly object ServerLock = new object();
public static async Task UpdateServersAsync(string proxyServer = default)
{
await Task.WhenAll(
Global.Settings.SubscribeLink.Select(item =>
Task.Run(() => UpdateServer(item, proxyServer))
).ToArray()
);
}
public static void UpdateServer(SubscribeLink item, string proxyServer)
{
try
{
var request = WebUtil.CreateRequest(item.Link);
if (!string.IsNullOrEmpty(item.UserAgent)) request.UserAgent = item.UserAgent;
if (!string.IsNullOrEmpty(proxyServer)) request.Proxy = new WebProxy(proxyServer);
List<Server> servers;
var result = WebUtil.DownloadString(request, out var rep);
if (rep.StatusCode == HttpStatusCode.OK)
servers = ShareLink.ParseText(result);
else
throw new Exception($"{item.Remark} Response Status Code: {rep.StatusCode}");
foreach (var server in servers) server.Group = item.Remark;
lock (ServerLock)
{
Global.Settings.Server.RemoveAll(server => server.Group.Equals(item.Remark));
Global.Settings.Server.AddRange(servers);
}
Global.MainForm.NotifyTip(i18N.TranslateFormat("Update {1} server(s) from {0}", item.Remark, servers.Count));
}
catch (Exception e)
{
Global.MainForm.NotifyTip($"{i18N.TranslateFormat("Update servers error from {0}", item.Remark)}\n{e.Message}", info: false);
Logging.Error(e.ToString());
}
}
}
}