diff options
| author | Michalis Adamidis <gsnerf@gsnerf.de> | 2014-08-30 02:05:33 +0200 |
|---|---|---|
| committer | Michalis Adamidis <gsnerf@gsnerf.de> | 2014-08-30 02:05:33 +0200 |
| commit | 7c5613fc51738cb3af1ce3e7ada9eb19a54b3aed (patch) | |
| tree | dfd23a717d87e1da776a74f9952a5fae8f215b4a /MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs | |
| parent | 5740a4c22d676d0050e875b0bd5455f5a303f5bd (diff) | |
| parent | 6a9dbf6ae85b4e7abcf06f7f29ef9d8b0b890876 (diff) | |
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Diffstat (limited to 'MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Connect/ConnectEntryPoint.cs | 125 |
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 0000000000..2ee78ba01c --- /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; + } + } + } +} |
