aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs125
1 files changed, 125 insertions, 0 deletions
diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
new file mode 100644
index 000000000..2ee78ba01
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs
@@ -0,0 +1,125 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Connect;
+using MediaBrowser.Controller.Plugins;
+using MediaBrowser.Model.Logging;
+using System;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Threading;
+
+namespace MediaBrowser.Server.Implementations.Connect
+{
+ public class ConnectEntryPoint : IServerEntryPoint
+ {
+ private Timer _timer;
+ private readonly IHttpClient _httpClient;
+ private readonly IApplicationPaths _appPaths;
+ private readonly ILogger _logger;
+ private readonly IConnectManager _connectManager;
+
+ private readonly INetworkManager _networkManager;
+
+ public ConnectEntryPoint(IHttpClient httpClient, IApplicationPaths appPaths, ILogger logger, INetworkManager networkManager, IConnectManager connectManager)
+ {
+ _httpClient = httpClient;
+ _appPaths = appPaths;
+ _logger = logger;
+ _networkManager = networkManager;
+ _connectManager = connectManager;
+ }
+
+ public void Run()
+ {
+ LoadCachedAddress();
+
+ _timer = new Timer(TimerCallback, null, TimeSpan.FromSeconds(30), TimeSpan.FromHours(24));
+ }
+
+ private async void TimerCallback(object state)
+ {
+ try
+ {
+ using (var stream = await _httpClient.Get(new HttpRequestOptions
+ {
+ Url = "http://bot.whatismyipaddress.com/"
+
+ }).ConfigureAwait(false))
+ {
+ using (var reader = new StreamReader(stream))
+ {
+ var address = await reader.ReadToEndAsync().ConfigureAwait(false);
+
+ if (IsValid(address))
+ {
+ ((ConnectManager) _connectManager).OnWanAddressResolved(address);
+ CacheAddress(address);
+ }
+ }
+ }
+ }
+ catch
+ {
+ }
+ }
+
+ private string CacheFilePath
+ {
+ get { return Path.Combine(_appPaths.DataPath, "wan.txt"); }
+ }
+
+ private void CacheAddress(string address)
+ {
+ var path = CacheFilePath;
+
+ try
+ {
+ Directory.CreateDirectory(Path.GetDirectoryName(path));
+ File.WriteAllText(path, address, Encoding.UTF8);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error saving data", ex);
+ }
+ }
+
+ private void LoadCachedAddress()
+ {
+ var path = CacheFilePath;
+
+ try
+ {
+ var endpoint = File.ReadAllText(path, Encoding.UTF8);
+
+ if (IsValid(endpoint))
+ {
+ ((ConnectManager)_connectManager).OnWanAddressResolved(endpoint);
+ }
+ }
+ catch (IOException)
+ {
+ // File isn't there. no biggie
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error loading data", ex);
+ }
+ }
+
+ private bool IsValid(string address)
+ {
+ IPAddress ipAddress;
+ return IPAddress.TryParse(address, out ipAddress);
+ }
+
+ public void Dispose()
+ {
+ if (_timer != null)
+ {
+ _timer.Dispose();
+ _timer = null;
+ }
+ }
+ }
+}