diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 77fd66493a..c875403264 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -15,7 +15,6 @@ using System.IO; using System.Linq; using System.Net; using System.Threading; -using MaxMind.GeoIP2; using OpenRA.FileSystem; using OpenRA.Graphics; using OpenRA.Network; @@ -44,8 +43,6 @@ namespace OpenRA public static Renderer Renderer; public static bool HasInputFocus = false; - public static DatabaseReader GeoIpDatabase; - public static OrderManager JoinServer(string host, int port, string password, bool recordReplay = true) { IConnection connection = new NetworkConnection(host, port); @@ -216,14 +213,7 @@ namespace OpenRA Settings.Server.AllowPortForward = false; } - try - { - GeoIpDatabase = new DatabaseReader("GeoLite2-Country.mmdb"); - } - catch (Exception e) - { - Log.Write("geoip", "DatabaseReader failed: {0}", e); - } + GeoIP.Initialize(); GlobalFileSystem.Mount(Platform.GameDir); // Needed to access shaders var renderers = new[] { Settings.Graphics.Renderer, "Sdl2", null }; diff --git a/OpenRA.Game/Network/GeoIP.cs b/OpenRA.Game/Network/GeoIP.cs new file mode 100644 index 0000000000..fb42d78051 --- /dev/null +++ b/OpenRA.Game/Network/GeoIP.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.IO; +using ICSharpCode.SharpZipLib.Core; +using ICSharpCode.SharpZipLib.GZip; +using MaxMind.GeoIP2; + +namespace OpenRA.Network +{ + public class GeoIP + { + static DatabaseReader database; + + public static void Initialize() + { + try + { + using (var fileStream = new FileStream("GeoLite2-Country.mmdb.gz", FileMode.Open, FileAccess.Read)) + using (var gzipStream = new GZipInputStream(fileStream)) + database = new DatabaseReader(gzipStream); + } + catch (Exception e) + { + Log.Write("geoip", "DatabaseReader failed: {0}", e); + } + } + + public static string LookupCountry(string ip) + { + const string Unknown = "Unknown Location"; + + try + { + return database.Country(ip).Country.Name ?? Unknown; + } + catch (Exception e) + { + Log.Write("geoip", "LookupCountry failed: {0}", e); + return Unknown; + } + } + } +} \ No newline at end of file diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index a1e1d691a3..3b803ee298 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -128,6 +128,7 @@ + diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/ClientTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/ClientTooltipLogic.cs index f028d99dc1..c6b48fb265 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/ClientTooltipLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/ClientTooltipLogic.cs @@ -85,7 +85,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic address = UPnP.NatDevice.GetExternalIP().ToString(); var cachedDescriptiveIP = LobbyUtils.DescriptiveIpAddress(address); ip.GetText = () => cachedDescriptiveIP; - var cachedCountryLookup = LobbyUtils.LookupCountry(address); + var cachedCountryLookup = GeoIP.LookupCountry(address); location.GetText = () => cachedCountryLookup; } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs index cc61b42482..13f6ebaf57 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs @@ -235,21 +235,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic return ip; } - public static string LookupCountry(string ip) - { - const string Unknown = "Unknown Location"; - - try - { - return Game.GeoIpDatabase.Country(ip).Country.Name ?? Unknown; - } - catch (Exception e) - { - Log.Write("geoip", "LookupCountry failed: {0}", e); - return Unknown; - } - } - public static void SetupClientWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, bool visible) { parent.Get("ADMIN_INDICATOR").IsVisible = () => c.IsAdmin; diff --git a/OpenRA.Mods.Common/Widgets/Logic/ServerBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ServerBrowserLogic.cs index a18dc9d68a..a00fb47a80 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ServerBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ServerBrowserLogic.cs @@ -252,7 +252,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var location = item.GetOrNull("LOCATION"); if (location != null) { - var cachedServerLocation = LobbyUtils.LookupCountry(game.Address.Split(':')[0]); + var cachedServerLocation = GeoIP.LookupCountry(game.Address.Split(':')[0]); location.GetText = () => cachedServerLocation; location.GetColor = () => !compatible ? Color.DarkGray : !canJoin ? Color.LightGray : location.TextColor; }