diff --git a/.github/workflows/nuget.yml b/.github/workflows/nuget.yml index d79fb0e..b00c21b 100644 --- a/.github/workflows/nuget.yml +++ b/.github/workflows/nuget.yml @@ -3,6 +3,7 @@ on: push: branches: - master + - Net6.0 jobs: nuget-1: @@ -15,7 +16,7 @@ jobs: submodules: 'recursive' - uses: actions/setup-dotnet@v3 with: - dotnet-version: 5.0.400 + dotnet-version: 6.0.x source-url: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json env: NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} @@ -23,6 +24,7 @@ jobs: run: | dotnet pack -c Release --output nupkgs BeatTogether.Core.Messaging/BeatTogether.Core.Messaging.csproj dotnet pack -c Release --output nupkgs BeatTogether.Core.Security/BeatTogether.Core.Security.csproj + dotnet pack -c Release --output nupkgs BeatTogether.Core.ServerMessaging/BeatTogether.Core.csproj - name: Publish run: | dotnet nuget push "nupkgs/BeatTogether.Core.*.nupkg" -k ${{secrets.GITHUB_TOKEN}} --skip-duplicate @@ -37,7 +39,7 @@ jobs: submodules: 'recursive' - uses: actions/setup-dotnet@v3 with: - dotnet-version: 5.0.400 + dotnet-version: 6.0.x source-url: https://api.nuget.org/v3/index.json env: NUGET_AUTH_TOKEN: ${{secrets.NUGET_API_KEY}} @@ -45,6 +47,7 @@ jobs: run: | dotnet pack -c Release --output nupkgs BeatTogether.Core.Messaging/BeatTogether.Core.Messaging.csproj dotnet pack -c Release --output nupkgs BeatTogether.Core.Security/BeatTogether.Core.Security.csproj + dotnet pack -c Release --output nupkgs BeatTogether.Core.ServerMessaging/BeatTogether.Core.csproj - name: Publish run: | dotnet nuget push "nupkgs/BeatTogether.Core.*.nupkg" -k ${{secrets.NUGET_API_KEY}} --skip-duplicate diff --git a/.gitmodules b/.gitmodules index a9456de..2e62ac3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "dependencies/NetCoreServer"] - path = dependencies/NetCoreServer - url = https://github.com/chandler14362/NetCoreServer.git +[submodule "dependencies/AsyncUdpServer"] + path = dependencies/AsyncUdpServer + url = https://github.com/cubicgraphics/AsyncUdpServer.git diff --git a/BeatTogether.Core.Messaging/BeatTogether.Core.Messaging.csproj b/BeatTogether.Core.Messaging/BeatTogether.Core.Messaging.csproj index 940b728..b5b8494 100644 --- a/BeatTogether.Core.Messaging/BeatTogether.Core.Messaging.csproj +++ b/BeatTogether.Core.Messaging/BeatTogether.Core.Messaging.csproj @@ -1,13 +1,13 @@  - net5.0 + net6.0 9 icon.png pythonology pythonology https://github.com/pythonology/BeatTogether.Core - 1.10.0 + 1.2.0 enable $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage @@ -17,15 +17,15 @@ - - - + + + - + true - NetCoreServer.dll + AsyncUdpServer.dll diff --git a/BeatTogether.Core.Messaging/Implementations/BaseMessageDispatcher.cs b/BeatTogether.Core.Messaging/Implementations/BaseMessageDispatcher.cs index 898f0de..b7c58e5 100644 --- a/BeatTogether.Core.Messaging/Implementations/BaseMessageDispatcher.cs +++ b/BeatTogether.Core.Messaging/Implementations/BaseMessageDispatcher.cs @@ -133,7 +133,7 @@ public void Send(ISession session, IMessage message) return; } - bufferWriter.WriteBool(false); // IsEncrypted + bufferWriter.WriteBool(false); // NotEncrypted _messageWriter.WriteTo(ref bufferWriter, message, PacketProperty); } else diff --git a/BeatTogether.Core.Messaging/Implementations/BaseUdpClient.cs b/BeatTogether.Core.Messaging/Implementations/BaseUdpClient.cs index ff4b11a..27144f6 100644 --- a/BeatTogether.Core.Messaging/Implementations/BaseUdpClient.cs +++ b/BeatTogether.Core.Messaging/Implementations/BaseUdpClient.cs @@ -1,16 +1,14 @@ using System; using System.Net; -using System.Net.Sockets; using System.Threading.Tasks; +using AsyncUdp; using BeatTogether.Core.Messaging.Abstractions; using BeatTogether.Core.Messaging.Messages; using Serilog; namespace BeatTogether.Core.Messaging.Implementations { - using UdpClient = NetCoreServer.UdpClient; - - public abstract class BaseUdpClient : UdpClient + public abstract class BaseUdpClient : AsyncUdpServer { public ISession Session { get; } @@ -22,7 +20,7 @@ public BaseUdpClient( IPEndPoint endPoint, IMessageSource messageSource, IMessageDispatcher messageDispatcher) - : base(endPoint) + : base(endPoint, false, 1) { Session = GetSession(endPoint); @@ -66,23 +64,17 @@ public BaseUdpClient( #region Protected Methods - protected override void OnConnected() => ReceiveAsync(); - - protected override void OnReceived(EndPoint endPoint, ReadOnlySpan buffer) + protected override void OnReceived(EndPoint endpoint, Memory buffer) { _logger.Verbose( "Handling OnReceived " + - $"(EndPoint='{endPoint}', " + + $"(EndPoint='{endpoint}', " + $"Data='{BitConverter.ToString(buffer.ToArray())}')." - ); +); if (buffer.Length > 0) - _messageSource.Signal(Session, buffer); - ReceiveAsync(); + _messageSource.Signal(Session, buffer.Span); } - protected override void OnError(SocketError error) => - _logger.Error($"Handling OnError (Error={error})."); - #endregion } } diff --git a/BeatTogether.Core.Messaging/Implementations/BaseUdpServer.cs b/BeatTogether.Core.Messaging/Implementations/BaseUdpServer.cs index 0075382..0cd9feb 100644 --- a/BeatTogether.Core.Messaging/Implementations/BaseUdpServer.cs +++ b/BeatTogether.Core.Messaging/Implementations/BaseUdpServer.cs @@ -1,15 +1,14 @@ using System; using System.Net; -using System.Net.Sockets; using System.Threading.Tasks; +using AsyncUdp; using BeatTogether.Core.Messaging.Abstractions; using BeatTogether.Core.Messaging.Messages; -using NetCoreServer; using Serilog; namespace BeatTogether.Core.Messaging.Implementations { - public abstract class BaseUdpServer : UdpServer + public abstract class BaseUdpServer : AsyncUdpServer { private readonly IMessageSource _messageSource; private readonly IMessageDispatcher _messageDispatcher; @@ -19,7 +18,7 @@ public BaseUdpServer( IPEndPoint endPoint, IMessageSource messageSource, IMessageDispatcher messageDispatcher) - : base(endPoint) + : base(endPoint, false, 0) { _messageSource = messageSource; _messageDispatcher = messageDispatcher; @@ -27,12 +26,13 @@ public BaseUdpServer( _messageDispatcher.OnSent += (session, buffer) => { + var data = buffer.ToArray(); _logger.Verbose( "Handling OnSent " + $"(EndPoint='{session.EndPoint}', " + - $"Data='{BitConverter.ToString(buffer.ToArray())}')." + $"Data='{BitConverter.ToString(data)}')." ); - SendAsync(session.EndPoint, buffer); + SendAsync(session.EndPoint, data); }; _messageSource.Subscribe((session, message) => { @@ -59,9 +59,7 @@ public BaseUdpServer( #region Protected Methods - protected override void OnStarted() => ReceiveAsync(); - - protected override void OnReceived(EndPoint endPoint, ReadOnlySpan buffer) + protected override void OnReceived(EndPoint endPoint, Memory buffer) { _logger.Verbose( "Handling OnReceived " + @@ -71,14 +69,10 @@ protected override void OnReceived(EndPoint endPoint, ReadOnlySpan buffer) if (buffer.Length > 0) { var session = GetSession(endPoint); - _messageSource.Signal(session, buffer); + _messageSource.Signal(session, buffer.Span); } - ReceiveAsync(); } - protected override void OnError(SocketError error) => - _logger.Error($"Handling OnError (Error={error})."); - #endregion } } diff --git a/BeatTogether.Core.Security/BeatTogether.Core.Security.csproj b/BeatTogether.Core.Security/BeatTogether.Core.Security.csproj index 74c4d72..36fc822 100644 --- a/BeatTogether.Core.Security/BeatTogether.Core.Security.csproj +++ b/BeatTogether.Core.Security/BeatTogether.Core.Security.csproj @@ -1,13 +1,13 @@ - + - net5.0 + net6.0 9 icon.png pythonology pythonology https://github.com/pythonology/BeatTogether.Core - 1.1.0 + 1.2.0 enable @@ -16,8 +16,8 @@ - - + + diff --git a/BeatTogether.Core.ServerMessaging/Abstractions/ILayer1.cs b/BeatTogether.Core.ServerMessaging/Abstractions/ILayer1.cs new file mode 100644 index 0000000..b3acbc9 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Abstractions/ILayer1.cs @@ -0,0 +1,21 @@ + +using BeatTogether.Core.Abstractions; + +namespace BeatTogether.Core.ServerMessaging +{ + //we will have 3 parts. + //Api is a stage1, it handles only gamelift requests. + //node service is a stage1 and a stage2, it handles the master servers list of servers, extra api requests, and all the node related things + //Dedi server is a stage2, it handles all instance logic + + public interface ILayer1 //Layer 2 calls these to inform layer 1. This is contained in layer 1. If layer2 can find this on layer1, then attatch then to events. + { + public void PlayerJoined(IServerInstance instance, IPlayer player); + public void PlayerLeft(IServerInstance instance, IPlayer player); + public void InstanceClosed(IServerInstance instance); + public void InstanceCreated(IServerInstance instance); + public void InstanceConfigChanged(IServerInstance instance); + public void InstanceStateChanged(IServerInstance instance); + public void InstancePlayersChanged(IServerInstance instance); + } +} diff --git a/BeatTogether.Core.ServerMessaging/Abstractions/ILayer2.cs b/BeatTogether.Core.ServerMessaging/Abstractions/ILayer2.cs new file mode 100644 index 0000000..37ba779 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Abstractions/ILayer2.cs @@ -0,0 +1,29 @@ +using BeatTogether.Core.Enums; + +namespace BeatTogether.Core.Abstractions +{ + //we will have 3 parts. + //Api is a stage1, it handles only gamelift requests. + //node service is a stage1 and a stage2, it handles the master servers list of servers, extra api requests, and all the node related things + //Dedi server is a stage2, it handles all instance logic + + public interface ILayer2 //Layer 1 calls these to control layer 2 + { + //Response from these should be awaited when using node server, instant on single exe server + public Task CreateInstance(IServerInstance serverInstance); + public Task CloseInstance(string InstanceSecret); + public Task SetPlayerSessionData(string InstanceSecret, IPlayer playerSessionData); + public Task DisconnectPlayer(string InstanceSecret, string PlayerUserId); + + public Task GetServer(string secret); + public Task GetServerByCode(string code); + public Task GetAvailablePublicServer( + InvitePolicy invitePolicy, + GameplayServerMode serverMode, + SongSelectionMode songMode, + GameplayServerControlSettings serverControlSettings, + BeatmapDifficultyMask difficultyMask, + GameplayModifiersMask modifiersMask, + string songPackMasks); + } +} diff --git a/BeatTogether.Core.ServerMessaging/Abstractions/IPlayer.cs b/BeatTogether.Core.ServerMessaging/Abstractions/IPlayer.cs new file mode 100644 index 0000000..7c9dbfd --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Abstractions/IPlayer.cs @@ -0,0 +1,14 @@ +using BeatTogether.Core.Enums; + +namespace BeatTogether.Core.Abstractions +{ + public interface IPlayer + { + public string HashedUserId { get; set; } + public string PlatformUserId { get; set; } + public string PlayerSessionId { get; set; } + public Platform PlayerPlatform { get; set; } + public Version PlayerClientVersion { get; set; } + } + +} diff --git a/BeatTogether.Core.ServerMessaging/Abstractions/IServerInstance.cs b/BeatTogether.Core.ServerMessaging/Abstractions/IServerInstance.cs new file mode 100644 index 0000000..3ec73aa --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Abstractions/IServerInstance.cs @@ -0,0 +1,34 @@ +using BeatTogether.Core.Models; +using BeatTogether.Core.Enums; +using System.Net; + +namespace BeatTogether.Core.Abstractions +{ + public interface IServerInstance + { + public string ServerName { get; set; } + public IPEndPoint InstanceEndPoint { get; set; } + public string Secret { get; set; } + public string Code { get; set; } + public MultiplayerGameState GameState { get; set; } + public BeatmapDifficultyMask BeatmapDifficultyMask { get; set; } + public GameplayModifiersMask GameplayModifiersMask { get; set; } + public GameplayServerConfiguration GameplayServerConfiguration { get; set; } + public string SongPackMasks { get; set; } + public HashSet PlayerHashes { get; set; } + public string InstanceId { get; set; } + public string ManagerId { get; set; } + public bool PermanentManager { get; set; } + public long ServerStartJoinTimeout { get; set; } //Milliseconds + public bool NeverCloseServer { get; set; } + public long ResultScreenTime { get; set; } + public long BeatmapStartTime { get; set; } + public long PlayersReadyCountdownTime { get; set; } + public bool AllowPerPlayerModifiers { get; set; } + public bool AllowPerPlayerDifficulties { get; set; } + public bool AllowChroma { get; set; } + public bool AllowME { get; set; } + public bool AllowNE { get; set; } + } + +} diff --git a/BeatTogether.Core.ServerMessaging/BeatTogether.Core.csproj b/BeatTogether.Core.ServerMessaging/BeatTogether.Core.csproj new file mode 100644 index 0000000..5603ede --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/BeatTogether.Core.csproj @@ -0,0 +1,22 @@ + + + + net6.0 + enable + enable + 1.1.0 + icon.png + BeatTogether + BeatTogether + https://github.com/pythonology/BeatTogether.Core + + + + + + + + + + + diff --git a/BeatTogether.Core.ServerMessaging/Enums/BeatmapDifficultyMask.cs b/BeatTogether.Core.ServerMessaging/Enums/BeatmapDifficultyMask.cs new file mode 100644 index 0000000..c3ed0b9 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/BeatmapDifficultyMask.cs @@ -0,0 +1,14 @@ + +namespace BeatTogether.Core.Enums +{ + [Flags] + public enum BeatmapDifficultyMask : byte + { + Easy = 1, + Normal = 2, + Hard = 4, + Expert = 8, + ExpertPlus = 16, + All = 31 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/CountdownState.cs b/BeatTogether.Core.ServerMessaging/Enums/CountdownState.cs new file mode 100644 index 0000000..d2ab5f5 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/CountdownState.cs @@ -0,0 +1,10 @@ +namespace BeatTogether.Core.Enums +{ + public enum CountdownState : byte + { + NotCountingDown = 0, + CountingDown = 1, + StartBeatmapCountdown = 2, + WaitingForEntitlement = 3 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/DiscoveryPolicy.cs b/BeatTogether.Core.ServerMessaging/Enums/DiscoveryPolicy.cs new file mode 100644 index 0000000..9ed46af --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/DiscoveryPolicy.cs @@ -0,0 +1,9 @@ +namespace BeatTogether.Core.Enums +{ + public enum DiscoveryPolicy : byte + { + Hidden = 0, + WithCode = 1, + Public = 2 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/GameplayModifiersMask.cs b/BeatTogether.Core.ServerMessaging/Enums/GameplayModifiersMask.cs new file mode 100644 index 0000000..bce30c6 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/GameplayModifiersMask.cs @@ -0,0 +1,26 @@ + +namespace BeatTogether.Core.Enums +{ + [Flags] + public enum GameplayModifiersMask : ushort + { + None = 0, + BatteryEnergy = 1, + NoFail = 2, + InstaFail = 4, + NoObstacles = 8, + NoBombs = 16, + FastNotes = 32, + StrictAngles = 64, + DisappearingArrows = 128, + FasterSong = 256, + SlowerSong = 512, + NoArrows = 1024, + GhostNotes = 2048, + SuperFastSong = 4096, + ProMode = 8192, + ZenMode = 16384, + SmallCubes = 32768, + All = 65535 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/GameplayServerControlSettings.cs b/BeatTogether.Core.ServerMessaging/Enums/GameplayServerControlSettings.cs new file mode 100644 index 0000000..769d702 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/GameplayServerControlSettings.cs @@ -0,0 +1,11 @@ +namespace BeatTogether.Core.Enums +{ + [Flags] + public enum GameplayServerControlSettings + { + None = 0, + AllowModifierSelection = 1, + AllowSpectate = 2, + All = 3 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/GameplayServerMode.cs b/BeatTogether.Core.ServerMessaging/Enums/GameplayServerMode.cs new file mode 100644 index 0000000..b579671 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/GameplayServerMode.cs @@ -0,0 +1,10 @@ +namespace BeatTogether.Core.Enums +{ + public enum GameplayServerMode + { + Countdown = 0, + Managed = 1, + QuickStartOneSong = 2, + Tournament = 3 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/GameplayState.cs b/BeatTogether.Core.ServerMessaging/Enums/GameplayState.cs new file mode 100644 index 0000000..b620847 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/GameplayState.cs @@ -0,0 +1,11 @@ +namespace BeatTogether.Core.Enums +{ + public enum GameplayState : byte + { + None = 0, + SceneLoad = 1, + SongLoad = 1, + Gameplay = 2, + Results = 3 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/InvitePolicy.cs b/BeatTogether.Core.ServerMessaging/Enums/InvitePolicy.cs new file mode 100644 index 0000000..272b1e9 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/InvitePolicy.cs @@ -0,0 +1,8 @@ +namespace BeatTogether.Core.Enums +{ + public enum InvitePolicy : byte + { + OnlyConnectionOwnerCanInvite = 0, + AnyoneCanInvite = 1 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/MultiplayerGameState.cs b/BeatTogether.Core.ServerMessaging/Enums/MultiplayerGameState.cs new file mode 100644 index 0000000..e4d9f04 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/MultiplayerGameState.cs @@ -0,0 +1,9 @@ +namespace BeatTogether.Core.Enums +{ + public enum MultiplayerGameState : byte + { + None = 0, + Lobby = 1, + Game = 2 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/Platform.cs b/BeatTogether.Core.ServerMessaging/Enums/Platform.cs new file mode 100644 index 0000000..43224da --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/Platform.cs @@ -0,0 +1,18 @@ +namespace BeatTogether.Core.Enums +{ + public enum Platform : byte + { + Test, + OculusRift, + OculusQuest, + Steam, + PS4, + PS4Dev, + PS4Cert, + PS5, + PS5Dev, + PS5Cert, + Oculus = 1, + Pico = 20, + } +} diff --git a/BeatTogether.Core.ServerMessaging/Enums/SongSelectionMode.cs b/BeatTogether.Core.ServerMessaging/Enums/SongSelectionMode.cs new file mode 100644 index 0000000..ca3dce3 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Enums/SongSelectionMode.cs @@ -0,0 +1,11 @@ +namespace BeatTogether.Core.Enums +{ + public enum SongSelectionMode + { + Vote = 0, + Random = 1, + ManagerPicks = 2, + RandomPlayerPicks = 3, + ServerPicks = 4 + } +} diff --git a/BeatTogether.Core.ServerMessaging/Extensions/BinaryBufferReaderExtensions.cs b/BeatTogether.Core.ServerMessaging/Extensions/BinaryBufferReaderExtensions.cs new file mode 100644 index 0000000..d42f8cf --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Extensions/BinaryBufferReaderExtensions.cs @@ -0,0 +1,56 @@ +using BeatTogether.Core.Enums; +using BeatTogether.Core.ServerMessaging.Models; +using BinaryRecords; + +namespace BeatTogether.Core.Extensions +{ + public static class BinaryBufferReaderExtensions + { + public static Player ReadPlayer(this ref BinaryBufferReader bufferReader) + { + var Player = new Player(); + Player.PlayerPlatform = (Platform)bufferReader.ReadUInt8(); + Player.PlayerSessionId = bufferReader.ReadUTF16String(); + Player.PlayerClientVersion = bufferReader.ReadUTF16String(); + Player.HashedUserId = bufferReader.ReadUTF16String(); + Player.PlatformUserId = bufferReader.ReadUTF16String(); + return Player; + } + + public static Server ReadServer(this ref BinaryBufferReader bufferReader) + { + var server = new Server(); + + server.ServerName = bufferReader.ReadUTF16String(); + server.Secret = bufferReader.ReadUTF16String(); + server.Code = bufferReader.ReadUTF16String(); + server.InstanceId = bufferReader.ReadUTF16String(); + + server.GameState = (MultiplayerGameState)bufferReader.ReadUInt8(); + server.BeatmapDifficultyMask = (BeatmapDifficultyMask)bufferReader.ReadUInt8(); + server.GameplayModifiersMask = (GameplayModifiersMask)bufferReader.ReadUInt16(); + server.GameplayServerConfiguration.MaxPlayerCount = bufferReader.ReadInt16(); + server.GameplayServerConfiguration.DiscoveryPolicy = (DiscoveryPolicy)bufferReader.ReadUInt8(); + server.GameplayServerConfiguration.InvitePolicy = (InvitePolicy)bufferReader.ReadUInt8(); + server.GameplayServerConfiguration.GameplayServerMode = (GameplayServerMode)bufferReader.ReadUInt8(); + server.GameplayServerConfiguration.SongSelectionMode = (SongSelectionMode)bufferReader.ReadUInt8(); + server.GameplayServerConfiguration.GameplayServerControlSettings = (GameplayServerControlSettings)bufferReader.ReadUInt8(); + server.SongPackMasks = bufferReader.ReadUTF16String(); + + server.ManagerId = bufferReader.ReadUTF16String(); + server.PermanentManager = bufferReader.ReadBool(); + server.ServerStartJoinTimeout = bufferReader.ReadInt64(); + server.NeverCloseServer = bufferReader.ReadBool(); + server.ResultScreenTime = bufferReader.ReadInt64(); + server.BeatmapStartTime = bufferReader.ReadInt64(); + server.PlayersReadyCountdownTime = bufferReader.ReadInt64(); + server.AllowPerPlayerModifiers = bufferReader.ReadBool(); + server.AllowPerPlayerDifficulties = bufferReader.ReadBool(); + server.AllowChroma = bufferReader.ReadBool(); + server.AllowME = bufferReader.ReadBool(); + server.AllowNE = bufferReader.ReadBool(); + + return server; + } + } +} diff --git a/BeatTogether.Core.ServerMessaging/Extensions/BinaryBufferWriterExtensions.cs b/BeatTogether.Core.ServerMessaging/Extensions/BinaryBufferWriterExtensions.cs new file mode 100644 index 0000000..febefdb --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Extensions/BinaryBufferWriterExtensions.cs @@ -0,0 +1,53 @@ +using BeatTogether.Core.ServerMessaging.Models; +using BinaryRecords; + +namespace BeatTogether.Core.Extensions +{ + public static class BinaryBufferWriterExtensions + { + public static void WritePlayer(this ref BinaryBufferWriter bufferWriter, Player player) + { + bufferWriter.WriteUInt8((byte)player.PlayerPlatform); + bufferWriter.WriteUTF16String(player.PlayerSessionId); + bufferWriter.WriteUTF16String(player.PlayerClientVersion); + bufferWriter.WriteUTF16String(player.HashedUserId); + bufferWriter.WriteUTF16String(player.PlatformUserId); + } + + + public static void WriteServer(this ref BinaryBufferWriter bufferWriter, Server server) + { + bufferWriter.WriteUTF16String(server.ServerName); + bufferWriter.WriteUTF16String(server.Secret); + bufferWriter.WriteUTF16String(server.Code); + bufferWriter.WriteUTF16String(server.InstanceId); + + bufferWriter.WriteUInt8((byte)server.GameState); + bufferWriter.WriteUInt8((byte)server.BeatmapDifficultyMask); + bufferWriter.WriteUInt16((ushort)server.GameplayModifiersMask); + + bufferWriter.WriteUInt16((ushort)server.GameplayServerConfiguration.MaxPlayerCount); + bufferWriter.WriteUInt8((byte)server.GameplayServerConfiguration.DiscoveryPolicy); + bufferWriter.WriteUInt8((byte)server.GameplayServerConfiguration.InvitePolicy); + bufferWriter.WriteUInt8((byte)server.GameplayServerConfiguration.GameplayServerMode); + bufferWriter.WriteUInt8((byte)server.GameplayServerConfiguration.SongSelectionMode); + bufferWriter.WriteUInt8((byte)server.GameplayServerConfiguration.GameplayServerControlSettings); + + bufferWriter.WriteUTF16String(server.SongPackMasks); + + bufferWriter.WriteUTF16String(server.ManagerId); + bufferWriter.WriteBool(server.PermanentManager); + bufferWriter.WriteInt64(server.ServerStartJoinTimeout); + bufferWriter.WriteBool(server.NeverCloseServer); + bufferWriter.WriteInt64(server.ResultScreenTime); + bufferWriter.WriteInt64(server.BeatmapStartTime); + bufferWriter.WriteInt64(server.PlayersReadyCountdownTime); + + bufferWriter.WriteBool(server.AllowPerPlayerModifiers); + bufferWriter.WriteBool(server.AllowPerPlayerDifficulties); + bufferWriter.WriteBool(server.AllowChroma); + bufferWriter.WriteBool(server.AllowME); + bufferWriter.WriteBool(server.AllowNE); + } + } +} diff --git a/BeatTogether.Core.ServerMessaging/Models/GameplayServerConfiguration.cs b/BeatTogether.Core.ServerMessaging/Models/GameplayServerConfiguration.cs new file mode 100644 index 0000000..e729eec --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/Models/GameplayServerConfiguration.cs @@ -0,0 +1,33 @@ +using BeatTogether.Core.Enums; + +namespace BeatTogether.Core.Models +{ + public class GameplayServerConfiguration + { + public int MaxPlayerCount { get; set; } = 5; + public DiscoveryPolicy DiscoveryPolicy { get; set; } + public InvitePolicy InvitePolicy { get; set; } + public GameplayServerMode GameplayServerMode { get; set; } + public SongSelectionMode SongSelectionMode { get; set; } + public GameplayServerControlSettings GameplayServerControlSettings { get; set; } + + public GameplayServerConfiguration( + int maxPlayerCount, + DiscoveryPolicy discoveryPolicy, + InvitePolicy invitePolicy, + GameplayServerMode gameplayServerMode, + SongSelectionMode songSelectionMode, + GameplayServerControlSettings gameplayServerControlSettings) + { + MaxPlayerCount = maxPlayerCount; + DiscoveryPolicy = discoveryPolicy; + InvitePolicy = invitePolicy; + GameplayServerMode = gameplayServerMode; + SongSelectionMode = songSelectionMode; + GameplayServerControlSettings = gameplayServerControlSettings; + } + + public GameplayServerConfiguration() { } + } +} + diff --git a/BeatTogether.Core.ServerMessaging/ServerMessaging/PlayerAutoBusMessage.cs b/BeatTogether.Core.ServerMessaging/ServerMessaging/PlayerAutoBusMessage.cs new file mode 100644 index 0000000..d3e5f75 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/ServerMessaging/PlayerAutoBusMessage.cs @@ -0,0 +1,24 @@ +using BeatTogether.Core.Abstractions; +using BeatTogether.Core.Enums; + +namespace BeatTogether.Core.ServerMessaging.Models +{ + public class Player + { + public Player(IPlayer player) + { + HashedUserId = player.HashedUserId; + PlatformUserId = player.PlatformUserId; + PlayerSessionId = player.PlayerSessionId; + PlayerPlatform = player.PlayerPlatform; + PlayerClientVersion = player.PlayerClientVersion.ToString(); + } + public Player() { } + + public string HashedUserId { get; set; } = string.Empty; + public string PlatformUserId { get; set; } = string.Empty; + public string PlayerSessionId { get; set; } = string.Empty; + public Platform PlayerPlatform { get; set; } + public string PlayerClientVersion { get; set; } = string.Empty; + } +} diff --git a/BeatTogether.Core.ServerMessaging/ServerMessaging/ServerAutobusMessage.cs b/BeatTogether.Core.ServerMessaging/ServerMessaging/ServerAutobusMessage.cs new file mode 100644 index 0000000..17e7206 --- /dev/null +++ b/BeatTogether.Core.ServerMessaging/ServerMessaging/ServerAutobusMessage.cs @@ -0,0 +1,62 @@ +using BeatTogether.Core.Abstractions; +using BeatTogether.Core.Enums; +using BeatTogether.Core.Models; + +namespace BeatTogether.Core.ServerMessaging.Models +{ + public class Server + { + public Server(IServerInstance instance) + { + ServerName = instance.ServerName; + Secret = instance.Secret; + Code = instance.Code; + InstanceId = instance.InstanceId; + + GameState = instance.GameState; + BeatmapDifficultyMask = instance.BeatmapDifficultyMask; + GameplayModifiersMask = instance.GameplayModifiersMask; + GameplayServerConfiguration = instance.GameplayServerConfiguration; + SongPackMasks = instance.SongPackMasks; + + ManagerId = instance.ManagerId; + PermanentManager = instance.PermanentManager; + ServerStartJoinTimeout = instance.ServerStartJoinTimeout; + NeverCloseServer = instance.NeverCloseServer; + ResultScreenTime = instance.ResultScreenTime; + BeatmapStartTime = instance.BeatmapStartTime; + PlayersReadyCountdownTime = instance.PlayersReadyCountdownTime; + + AllowPerPlayerDifficulties = instance.AllowPerPlayerDifficulties; + AllowPerPlayerModifiers = instance.AllowPerPlayerModifiers; + AllowChroma = instance.AllowChroma; + AllowME = instance.AllowME; + AllowNE = instance.AllowNE; + } + public Server() { } + + public string ServerName { get; set; } = string.Empty; + public string Secret { get; set; } = string.Empty; + public string Code { get; set; } = string.Empty; + public string InstanceId { get; set; } = string.Empty; + + public MultiplayerGameState GameState { get; set; } + public BeatmapDifficultyMask BeatmapDifficultyMask { get; set; } + public GameplayModifiersMask GameplayModifiersMask { get; set; } + public GameplayServerConfiguration GameplayServerConfiguration { get; set; } = new(); + public string SongPackMasks { get; set; } = string.Empty; + + public string ManagerId { get; set; } = string.Empty; + public bool PermanentManager { get; set; } + public long ServerStartJoinTimeout { get; set; } + public bool NeverCloseServer { get; set; } + public long ResultScreenTime { get; set; } + public long BeatmapStartTime { get; set; } + public long PlayersReadyCountdownTime { get; set; } + public bool AllowPerPlayerModifiers { get; set; } + public bool AllowPerPlayerDifficulties { get; set; } + public bool AllowChroma { get; set; } + public bool AllowME { get ; set ; } + public bool AllowNE { get; set; } + } +} diff --git a/BeatTogether.Core.sln b/BeatTogether.Core.sln index c396a5e..985de35 100644 --- a/BeatTogether.Core.sln +++ b/BeatTogether.Core.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29926.136 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32819.101 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BeatTogether.Core.Messaging", "BeatTogether.Core.Messaging\BeatTogether.Core.Messaging.csproj", "{E28CDCB2-AA4A-4D2D-8CCB-1F3B3D7A70BE}" EndProject @@ -9,7 +9,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BeatTogether.Core.Security" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dependencies", "dependencies", "{68C43D6A-C8F7-4BE0-96DB-3B576B666C8E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetCoreServer", "dependencies\NetCoreServer\source\NetCoreServer\NetCoreServer.csproj", "{5C1D006F-2301-47A7-9C67-9CF16A888D8B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AsyncUdpServer", "dependencies\AsyncUdpServer\AsyncUdpServer\AsyncUdpServer.csproj", "{B41D53DD-7F1C-447F-9211-BC9A7A2C23E0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeatTogether.Core", "BeatTogether.Core.ServerMessaging\BeatTogether.Core.csproj", "{1D3C46DC-6AD8-4A97-A1A0-E1D8390BB23D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -25,16 +27,20 @@ Global {CBA6EFCD-ABBF-49AA-B9F7-4F3AAC4821CF}.Debug|Any CPU.Build.0 = Debug|Any CPU {CBA6EFCD-ABBF-49AA-B9F7-4F3AAC4821CF}.Release|Any CPU.ActiveCfg = Release|Any CPU {CBA6EFCD-ABBF-49AA-B9F7-4F3AAC4821CF}.Release|Any CPU.Build.0 = Release|Any CPU - {5C1D006F-2301-47A7-9C67-9CF16A888D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5C1D006F-2301-47A7-9C67-9CF16A888D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5C1D006F-2301-47A7-9C67-9CF16A888D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5C1D006F-2301-47A7-9C67-9CF16A888D8B}.Release|Any CPU.Build.0 = Release|Any CPU + {B41D53DD-7F1C-447F-9211-BC9A7A2C23E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B41D53DD-7F1C-447F-9211-BC9A7A2C23E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B41D53DD-7F1C-447F-9211-BC9A7A2C23E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B41D53DD-7F1C-447F-9211-BC9A7A2C23E0}.Release|Any CPU.Build.0 = Release|Any CPU + {1D3C46DC-6AD8-4A97-A1A0-E1D8390BB23D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D3C46DC-6AD8-4A97-A1A0-E1D8390BB23D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D3C46DC-6AD8-4A97-A1A0-E1D8390BB23D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D3C46DC-6AD8-4A97-A1A0-E1D8390BB23D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {5C1D006F-2301-47A7-9C67-9CF16A888D8B} = {68C43D6A-C8F7-4BE0-96DB-3B576B666C8E} + {B41D53DD-7F1C-447F-9211-BC9A7A2C23E0} = {68C43D6A-C8F7-4BE0-96DB-3B576B666C8E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D074D30D-60D5-4042-9867-E4E6F4EAB464} diff --git a/dependencies/AsyncUdpServer b/dependencies/AsyncUdpServer new file mode 160000 index 0000000..c4ae5e7 --- /dev/null +++ b/dependencies/AsyncUdpServer @@ -0,0 +1 @@ +Subproject commit c4ae5e73a04520acc33f3e76c103b13743fb28dc diff --git a/dependencies/NetCoreServer b/dependencies/NetCoreServer deleted file mode 160000 index 0b273fc..0000000 --- a/dependencies/NetCoreServer +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0b273fc15affea09df450f026b2eff72f090e671