Skip to content

Commit

Permalink
feat: handle admin port version 4 (#21)
Browse files Browse the repository at this point in the history
* feat: Get admin port version

currently do nothing with ti

* feat: remove shares

* fix: build errors

* feat: Company update message also cannot go out of bounds

* fix: remove code relying on removed code

* fix: tests

---------

Co-authored-by: Damian Laczak <shoter@users.noreply.github.com>
  • Loading branch information
shoter and shoter committed Jul 1, 2023
1 parent 5cc3ffe commit 56e4fcd
Show file tree
Hide file tree
Showing 12 changed files with 83 additions and 87 deletions.
24 changes: 11 additions & 13 deletions OpenTTDAdminPort.Tests/Cusomizations/StateCusomizations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,17 @@ public void Customize(IFixture fixture)
fixture.Customize<ConnectedData>(
c => c
.FromFactory(
() =>
{
return new ConnectedData(
null!,
fixture.Create<ServerInfo>(),
fixture.Create<string>(),
null,
new Dictionary<AdminUpdateType, AdminUpdateSetting>(),
fixture.Create<AdminServerInfo>(),
new Dictionary<uint, Player>(),
new Dictionary<byte, Company>(),
new Dictionary<uint, Player>());
})
() => new ConnectedData(
null!,
fixture.Create<ServerInfo>(),
fixture.Create<string>(),
null,
new Dictionary<AdminUpdateType, AdminUpdateSetting>(),
fixture.Create<AdminServerInfo>(),
4,
new Dictionary<uint, Player>(),
new Dictionary<byte, Company>(),
new Dictionary<uint, Player>()))
.OmitAutoProperties());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,15 @@ public void BeCreated_WhenClient_ExceptionallyQuits()
private ConnectedData CreateConnectedData()
{
var connectingData = new ConnectingData(
probe,
probe,
fix.Create<ServerInfo>(),
"clientName");
connectingData.AdminServerInfo = fix.Create<AdminServerInfo>();
probe,
probe,
fix.Create<ServerInfo>(),
"clientName") with
{
AdminServerInfo = fix.Create<AdminServerInfo>(),
AdminPortNetworkVersion = 4,
};

return new ConnectedData(connectingData, probe);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,15 @@ public void RemovePlayer_AndDoNotModifyPlayerListInInput()
private ConnectedData CreateData()
{
var connectingData = new ConnectingData(
probe,
probe,
fix.Create<ServerInfo>(),
"client");
probe,
probe,
fix.Create<ServerInfo>(),
"client") with
{
AdminServerInfo = fix.Create<AdminServerInfo>(),
AdminPortNetworkVersion = 4,
};

connectingData.AdminServerInfo = fix.Create<AdminServerInfo>();
return new ConnectedData(connectingData, probe);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,6 @@ public void TransformPacketIntoMessage()
packet.SendByte(1); // is AI
packet.SendByte(55); // months of bankruptcy

packet.SendByte(9);
packet.SendByte(8);
packet.SendByte(7);
packet.SendByte(6);

packet.PrepareToSend();
packet.ReadByte();

Expand All @@ -47,10 +42,6 @@ public void TransformPacketIntoMessage()
Assert.False(msg.HasPassword);
Assert.True(msg.IsAi);
Assert.Equal(55, msg.MonthsOfBankruptcy);
Assert.Equal(9, msg.ShareOwnersIds[0]);
Assert.Equal(8, msg.ShareOwnersIds[1]);
Assert.Equal(7, msg.ShareOwnersIds[2]);
Assert.Equal(6, msg.ShareOwnersIds[3]);
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,6 @@ public void TransformPacketIntoMessage()
Assert.Equal(5, msg.Color);
Assert.True(msg.HasPassword);
Assert.Equal(3, msg.MonthsOfBankruptcy);
Assert.Equal(9, msg.ShareOwnersIds[0]);
Assert.Equal(8, msg.ShareOwnersIds[1]);
Assert.Equal(7, msg.ShareOwnersIds[2]);
Assert.Equal(6, msg.ShareOwnersIds[3]);
}

[Fact]
Expand Down
36 changes: 24 additions & 12 deletions OpenTTDAdminPort/MainActor/AdminPortClientActor_Connecting.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Akka.Actor;

using Microsoft.Extensions.Logging;
Expand Down Expand Up @@ -54,35 +55,46 @@ public void ConnectingState()
{
var msg = (AdminServerProtocolMessage)message;
Dictionary<AdminUpdateType, AdminUpdateSetting> adminUpdateSettings = new();
foreach (var s in msg.AdminUpdateSettings)
{
data.AdminUpdateSettings.Add(s.Key, new AdminUpdateSetting(true, s.Key, s.Value));
adminUpdateSettings.Add(s.Key, new AdminUpdateSetting(true, s.Key, s.Value));
}
return Stay();
return Stay()
.Using(
data with
{
AdminUpdateSettings = adminUpdateSettings,
AdminPortNetworkVersion = msg.NetworkVersion,
});
}
case AdminMessageType.ADMIN_PACKET_SERVER_WELCOME:
{
var msg = (AdminServerWelcomeMessage)message;
data.AdminServerInfo = new AdminServerInfo(
msg.ServerName,
msg.NetworkRevision,
msg.IsDedicated,
msg.MapName,
msg.CurrentDate,
msg.Landscape,
msg.MapWidth,
msg.MapHeight);
var newData = data with
{
AdminServerInfo = new AdminServerInfo(
msg.ServerName,
msg.NetworkRevision,
msg.IsDedicated,
msg.MapName,
msg.CurrentDate,
msg.Landscape,
msg.MapWidth,
msg.MapHeight),
};
IActorRef watchdog = actorFactory.CreateWatchdog(Context, data.TcpClient, 5.Seconds());
logger.LogTrace($"Moving {data.Initiator} to Connected state");
data.Initiator.Tell(SuccessResponse.Instance);
this.Messager.Tell(new AdminServerConnected());
SendUpdateFreqs(data.TcpClient);
return GoTo(MainState.Connected).Using(new ConnectedData(data, watchdog));
return GoTo(MainState.Connected).Using(new ConnectedData(newData, watchdog));
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion OpenTTDAdminPort/MainActor/StateData/ConnectedData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public record ConnectedData(
[property: JsonIgnore] IActorRef Watchdog,
IReadOnlyDictionary<AdminUpdateType, AdminUpdateSetting> AdminUpdateSettings,
AdminServerInfo AdminServerInfo,
byte AdminPortNetworkVersion,
IReadOnlyDictionary<uint, Player> Players,
IReadOnlyDictionary<byte, Company> Companies,
IReadOnlyDictionary<uint, Player> PastPlayers) : IMainData
Expand All @@ -25,8 +26,9 @@ public ConnectedData(ConnectingData data, IActorRef watchdog)
data.ServerInfo,
data.ClientName,
watchdog,
data.AdminUpdateSettings,
data.AdminUpdateSettings!,
data.AdminServerInfo!,
data.AdminPortNetworkVersion!.Value,
new Dictionary<uint, Player>(),
new Dictionary<byte, Company>(),
new Dictionary<uint, Player>())
Expand Down
54 changes: 28 additions & 26 deletions OpenTTDAdminPort/MainActor/StateData/ConnectingData.cs
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

using Akka.Actor;

using OpenTTDAdminPort.Game;
using OpenTTDAdminPort.MainActor.Messages;

namespace OpenTTDAdminPort.MainActor.StateData
{
public class ConnectingData : IMainData
/// <summary>
/// Initiator of connect process to which we will send a message informing about successfull connect
/// </summary>
public record ConnectingData(
IActorRef TcpClient,
IActorRef Initiator,
ServerInfo ServerInfo,
string ClientName,
IReadOnlyDictionary<AdminUpdateType, AdminUpdateSetting>? AdminUpdateSettings,
AdminServerInfo? AdminServerInfo,
Guid UniqueConnectingIdentifier,
byte? AdminPortNetworkVersion) : IMainData
{
public IActorRef TcpClient { get; }

/// <summary>
/// Initiator of connect process to which we will send a message informing about successfull connect
/// </summary>
public IActorRef Initiator { get; }

public ServerInfo ServerInfo { get; }

public string ClientName { get; }

public Dictionary<AdminUpdateType, AdminUpdateSetting> AdminUpdateSettings { get; } = new();

public AdminServerInfo? AdminServerInfo { get; set; }

public Guid UniqueConnectingIdentifier { get; } = Guid.NewGuid();

public ConnectingData(IActorRef tcpClient, IActorRef initiator, ServerInfo serverInfo, string clientName)
public ConnectingData(
IActorRef tcpClient,
IActorRef initiator,
ServerInfo serverInfo,
string clientName)
: this(
tcpClient,
initiator,
serverInfo,
clientName,
null,
null,
Guid.NewGuid(),
null
)
{
this.TcpClient = tcpClient;
this.Initiator = initiator;
this.ServerInfo = serverInfo;
this.ClientName = clientName;
}
}
}
}
2 changes: 0 additions & 2 deletions OpenTTDAdminPort/Messages/AdminServerCompanyInfoMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,5 @@ internal class AdminServerCompanyInfoMessage : IAdminMessage
/// I do not know what this value represents. I will not need it right now but if there is a nice soul that would like to leave better comment - please do! :)
/// </summary>
public byte MonthsOfBankruptcy { get; internal set; }

public byte[] ShareOwnersIds { get; } = new byte[4];
}
}
2 changes: 0 additions & 2 deletions OpenTTDAdminPort/Messages/AdminServerCompanyUpdateMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,5 @@ internal class AdminServerCompanyUpdateMessage : IAdminMessage
public bool HasPassword { get; internal set; }

public byte MonthsOfBankruptcy { get; internal set; }

public byte[] ShareOwnersIds { get; } = new byte[4];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ public IAdminMessage Transform(Packet packet)
m.CreationDate = new OttdDate(packet.ReadU32());
m.IsAi = packet.ReadBool();
m.MonthsOfBankruptcy = packet.ReadByte();
for (int i = 0; i < m.ShareOwnersIds.Length; ++i)
{
m.ShareOwnersIds[i] = packet.ReadByte();
}

return m;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ public IAdminMessage Transform(Packet packet)
m.Color = packet.ReadByte();
m.HasPassword = packet.ReadBool();
m.MonthsOfBankruptcy = packet.ReadByte();
for (int i = 0; i < m.ShareOwnersIds.Length; ++i)
{
m.ShareOwnersIds[i] = packet.ReadByte();
}

return m;
}
Expand Down

0 comments on commit 56e4fcd

Please sign in to comment.