display the client location in a lobby tooltip

This commit is contained in:
Matthias Mailänder
2013-08-08 09:40:40 +02:00
parent 781c680ad3
commit feb7f80a39
5 changed files with 38 additions and 7 deletions

View File

@@ -479,6 +479,10 @@
<Project>{F33337BE-CB69-4B24-850F-07D23E408DDF}</Project> <Project>{F33337BE-CB69-4B24-850F-07D23E408DDF}</Project>
<Name>OpenRA.Utility</Name> <Name>OpenRA.Utility</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\GeoIP\GeoIP.csproj">
<Project>{021DDD6A-A608-424C-9A9A-252D8A9989E0}</Project>
<Name>GeoIP</Name>
</ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5"> <BootstrapperPackage Include="Microsoft.Net.Client.3.5">

View File

@@ -30,6 +30,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var ip = widget.Get<LabelWidget>("IP"); var ip = widget.Get<LabelWidget>("IP");
var ipFont = Game.Renderer.Fonts[ip.Font]; var ipFont = Game.Renderer.Fonts[ip.Font];
var location = widget.Get<LabelWidget>("LOCATION");
var locationFont = Game.Renderer.Fonts[location.Font];
var locationOffset = location.Bounds.Y;
var ipOffset = ip.Bounds.Y; var ipOffset = ip.Bounds.Y;
var latencyOffset = latency.Bounds.Y; var latencyOffset = latency.Bounds.Y;
var tooltipHeight = widget.Bounds.Height; var tooltipHeight = widget.Bounds.Height;
@@ -39,27 +43,33 @@ namespace OpenRA.Mods.RA.Widgets.Logic
tooltipContainer.IsVisible = () => (orderManager.LobbyInfo.ClientWithIndex(clientIndex) != null); tooltipContainer.IsVisible = () => (orderManager.LobbyInfo.ClientWithIndex(clientIndex) != null);
tooltipContainer.BeforeRender = () => tooltipContainer.BeforeRender = () =>
{ {
var width = Math.Max(adminFont.Measure(admin.GetText()).X, Math.Max(ipFont.Measure(ip.GetText()).X, latencyFont.Measure(latency.GetText()).X)); var width = Math.Max(locationFont.Measure(location.GetText()).X, (Math.Max(adminFont.Measure(admin.GetText()).X,
widget.Bounds.Width = width + 2*margin; Math.Max(ipFont.Measure(ip.GetText()).X, latencyFont.Measure(latency.GetText()).X))));
widget.Bounds.Width = width + 2 * margin;
latency.Bounds.Width = widget.Bounds.Width; latency.Bounds.Width = widget.Bounds.Width;
ip.Bounds.Width = widget.Bounds.Width; ip.Bounds.Width = widget.Bounds.Width;
admin.Bounds.Width = widget.Bounds.Width; admin.Bounds.Width = widget.Bounds.Width;
location.Bounds.Width = widget.Bounds.Width;
ip.Bounds.Y = ipOffset; ip.Bounds.Y = ipOffset;
latency.Bounds.Y = latencyOffset; latency.Bounds.Y = latencyOffset;
location.Bounds.Y = locationOffset;
widget.Bounds.Height = tooltipHeight; widget.Bounds.Height = tooltipHeight;
if (admin.IsVisible()) if (admin.IsVisible())
{ {
ip.Bounds.Y += admin.Bounds.Height; ip.Bounds.Y += admin.Bounds.Height;
latency.Bounds.Y += admin.Bounds.Height; latency.Bounds.Y += admin.Bounds.Height;
location.Bounds.Y += admin.Bounds.Height;
widget.Bounds.Height += admin.Bounds.Height; widget.Bounds.Height += admin.Bounds.Height;
} }
}; };
admin.IsVisible = () => orderManager.LobbyInfo.ClientWithIndex(clientIndex).IsAdmin; admin.IsVisible = () => orderManager.LobbyInfo.ClientWithIndex(clientIndex).IsAdmin;
latency.GetText = () => "Latency: {0}".F(LobbyUtils.LatencyDescription(orderManager.LobbyInfo.ClientWithIndex(clientIndex).Latency)); latency.GetText = () => "Latency: {0}".F(LobbyUtils.LatencyDescription(orderManager.LobbyInfo.ClientWithIndex(clientIndex).Latency));
ip.GetText = () => LobbyUtils.DescriptiveIpAddress(orderManager.LobbyInfo.ClientWithIndex(clientIndex).IpAddress); var ipAddress = orderManager.LobbyInfo.ClientWithIndex(clientIndex).IpAddress;
ip.GetText = () => LobbyUtils.DescriptiveIpAddress(ipAddress);
location.GetText = () => LobbyUtils.LookupCountry(ipAddress);
} }
} }
} }

View File

@@ -194,6 +194,13 @@ namespace OpenRA.Mods.RA.Widgets.Logic
return ip; return ip;
} }
public static string LookupCountry(string ip)
{
var ip2geo = new GeoIP.LookupService("GeoIP.dat", GeoIP.LookupService.GEOIP_MEMORY_CACHE);
var country = ip2geo.getCountry(ip);
return country.getName();
}
public static void SetupClientWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, bool visible) public static void SetupClientWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, bool visible)
{ {
parent.Get("ADMIN_INDICATOR").IsVisible = () => c.IsAdmin; parent.Get("ADMIN_INDICATOR").IsVisible = () => c.IsAdmin;

View File

@@ -130,7 +130,7 @@ Background@SPAWN_TOOLTIP:
Background@CLIENT_TOOLTIP: Background@CLIENT_TOOLTIP:
Logic:ClientTooltipLogic Logic:ClientTooltipLogic
Background:panel-black Background:panel-black
Height:35 Height:47
Width:5 Width:5
Children: Children:
Label@ADMIN: Label@ADMIN:
@@ -145,8 +145,13 @@ Background@CLIENT_TOOLTIP:
Height:10 Height:10
Font:TinyBold Font:TinyBold
Align:Center Align:Center
Label@LATENCY: Label@LOCATION:
Y:17 Y:17
Height:10 Height:10
Font:TinyBold Font:TinyBold
Align:Center Align:Center
Label@LATENCY:
Y:29
Height:10
Font:TinyBold
Align:Center

View File

@@ -60,7 +60,7 @@ Background@SPAWN_TOOLTIP:
Background@CLIENT_TOOLTIP: Background@CLIENT_TOOLTIP:
Logic:ClientTooltipLogic Logic:ClientTooltipLogic
Background:dialog4 Background:dialog4
Height:39 Height:51
Width:7 Width:7
Children: Children:
Label@ADMIN: Label@ADMIN:
@@ -75,8 +75,13 @@ Background@CLIENT_TOOLTIP:
Height:10 Height:10
Font:TinyBold Font:TinyBold
Align:Center Align:Center
Label@LATENCY: Label@LOCATION:
Y:19 Y:19
Height:10 Height:10
Font:TinyBold Font:TinyBold
Align:Center Align:Center
Label@LATENCY:
Y:31
Height:10
Font:TinyBold
Align:Center