diff --git a/src/Void.Proxy-before/Network/Protocol/Packets/Clientbound/PlayerInfoUpdatePacket.cs b/src/Void.Proxy-before/Network/Protocol/Packets/Clientbound/PlayerInfoUpdatePacket.cs index ff876aa..7f3cc4d 100644 --- a/src/Void.Proxy-before/Network/Protocol/Packets/Clientbound/PlayerInfoUpdatePacket.cs +++ b/src/Void.Proxy-before/Network/Protocol/Packets/Clientbound/PlayerInfoUpdatePacket.cs @@ -12,7 +12,8 @@ public struct PlayerInfoUpdatePacket : IMinecraftPacket public void Encode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion) { // if no players available, notchian server still send actions bitset, we dont? - var actions = Players.SelectMany(player => player.Actions.Select(action => action.Type)).ToArray(); + var actions = Players.SelectMany(player => player.Actions.Select(action => action.Type)) + .ToArray(); var actionsFlags = (byte)actions.Aggregate(0, (current, action) => current | (byte)action); buffer.WriteUnsignedByte(actionsFlags); @@ -20,7 +21,8 @@ public void Encode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion) foreach (var player in Players) { - var missingActions = actions.Where(actionType => player.Actions.All(action => action.Type != actionType)).ToArray(); + var missingActions = actions.Where(actionType => player.Actions.All(action => action.Type != actionType)) + .ToArray(); if (missingActions.Any()) throw new Exception($"Player {player.Guid} has missing actions: {string.Join(", ", missingActions)}"); diff --git a/src/Void.Proxy.API/Events/Handshake/CreateChannelBuilderEvent.cs b/src/Void.Proxy.API/Events/Handshake/CreateChannelBuilderEvent.cs new file mode 100644 index 0000000..992dba1 --- /dev/null +++ b/src/Void.Proxy.API/Events/Handshake/CreateChannelBuilderEvent.cs @@ -0,0 +1,10 @@ +using System.Net.Sockets; +using Void.Proxy.API.Network.IO.Channels; + +namespace Void.Proxy.API.Events.Handshake; + +public class CreateChannelBuilderEvent : IEventWithResult>> +{ + public required Memory Buffer { get; init; } + public Func>? Result { get; set; } +} \ No newline at end of file diff --git a/src/Void.Proxy.API/Events/Handshake/SearchProtocolCodec.cs b/src/Void.Proxy.API/Events/Handshake/SearchProtocolCodec.cs deleted file mode 100644 index d43591c..0000000 --- a/src/Void.Proxy.API/Events/Handshake/SearchProtocolCodec.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Net.Sockets; -using Void.Proxy.API.Network.IO.Channels; - -namespace Void.Proxy.API.Events.Handshake; - -public class SearchProtocolCodec : IEventWithResult -{ - public required Memory Buffer { get; init; } - public Data? Result { get; set; } - - public class Data - { - public required Func> ChannelBuilder { get; set; } - } -} \ No newline at end of file diff --git a/src/Void.Proxy.API/Events/Proxy/ProxyStart.cs b/src/Void.Proxy.API/Events/Proxy/ProxyStartedEvent.cs similarity index 51% rename from src/Void.Proxy.API/Events/Proxy/ProxyStart.cs rename to src/Void.Proxy.API/Events/Proxy/ProxyStartedEvent.cs index d145114..84ca07f 100644 --- a/src/Void.Proxy.API/Events/Proxy/ProxyStart.cs +++ b/src/Void.Proxy.API/Events/Proxy/ProxyStartedEvent.cs @@ -1,5 +1,3 @@ namespace Void.Proxy.API.Events.Proxy; -public class ProxyStart : IEvent -{ -} \ No newline at end of file +public class ProxyStartedEvent : IEvent; \ No newline at end of file diff --git a/src/Void.Proxy.API/Events/Proxy/ProxyStartingEvent.cs b/src/Void.Proxy.API/Events/Proxy/ProxyStartingEvent.cs new file mode 100644 index 0000000..64aefbd --- /dev/null +++ b/src/Void.Proxy.API/Events/Proxy/ProxyStartingEvent.cs @@ -0,0 +1,3 @@ +namespace Void.Proxy.API.Events.Proxy; + +public class ProxyStartingEvent : IEvent; \ No newline at end of file diff --git a/src/Void.Proxy.API/Events/Proxy/ProxyStop.cs b/src/Void.Proxy.API/Events/Proxy/ProxyStoppedEvent.cs similarity index 51% rename from src/Void.Proxy.API/Events/Proxy/ProxyStop.cs rename to src/Void.Proxy.API/Events/Proxy/ProxyStoppedEvent.cs index ed695b0..5f99776 100644 --- a/src/Void.Proxy.API/Events/Proxy/ProxyStop.cs +++ b/src/Void.Proxy.API/Events/Proxy/ProxyStoppedEvent.cs @@ -1,5 +1,3 @@ namespace Void.Proxy.API.Events.Proxy; -public class ProxyStop : IEvent -{ -} \ No newline at end of file +public class ProxyStoppedEvent : IEvent; \ No newline at end of file diff --git a/src/Void.Proxy.API/Events/Proxy/ProxyStoppingEvent.cs b/src/Void.Proxy.API/Events/Proxy/ProxyStoppingEvent.cs new file mode 100644 index 0000000..fd28e5b --- /dev/null +++ b/src/Void.Proxy.API/Events/Proxy/ProxyStoppingEvent.cs @@ -0,0 +1,3 @@ +namespace Void.Proxy.API.Events.Proxy; + +public class ProxyStoppingEvent : IEvent; \ No newline at end of file diff --git a/src/Void.Proxy.API/Network/IO/Messages/BinaryPacket.cs b/src/Void.Proxy.API/Network/IO/Messages/BinaryPacket.cs index 3f517a5..b5232b3 100644 --- a/src/Void.Proxy.API/Network/IO/Messages/BinaryPacket.cs +++ b/src/Void.Proxy.API/Network/IO/Messages/BinaryPacket.cs @@ -7,7 +7,7 @@ namespace Void.Proxy.API.Network.IO.Messages; public readonly struct BinaryPacket( int id, Memory memory, - IMemoryOwner owner) : IMinecraftPacket, IDisposable + IMemoryOwner owner) : IMinecraftPacket { public int Id => id; public Memory Memory => memory; diff --git a/src/Void.Proxy.API/Network/IO/Messages/BufferedBinaryMessage.cs b/src/Void.Proxy.API/Network/IO/Messages/BufferedBinaryMessage.cs index 865022e..2c4aa6f 100644 --- a/src/Void.Proxy.API/Network/IO/Messages/BufferedBinaryMessage.cs +++ b/src/Void.Proxy.API/Network/IO/Messages/BufferedBinaryMessage.cs @@ -4,7 +4,7 @@ namespace Void.Proxy.API.Network.IO.Messages; public readonly struct BufferedBinaryMessage( Memory memory, - IMemoryOwner owner) : IMinecraftMessage, IDisposable + IMemoryOwner owner) : IMinecraftMessage { public Memory Memory => memory; diff --git a/src/Void.Proxy.API/Network/IO/Messages/CompleteBinaryMessage.cs b/src/Void.Proxy.API/Network/IO/Messages/CompleteBinaryMessage.cs index a3bf9c8..31ab15f 100644 --- a/src/Void.Proxy.API/Network/IO/Messages/CompleteBinaryMessage.cs +++ b/src/Void.Proxy.API/Network/IO/Messages/CompleteBinaryMessage.cs @@ -4,7 +4,7 @@ namespace Void.Proxy.API.Network.IO.Messages; public readonly struct CompleteBinaryMessage( Memory memory, - IMemoryOwner owner) : IMinecraftMessage, IDisposable + IMemoryOwner owner) : IMinecraftMessage { public Memory Memory => memory; diff --git a/src/Void.Proxy.API/Network/IO/Messages/IMinecraftMessage.cs b/src/Void.Proxy.API/Network/IO/Messages/IMinecraftMessage.cs index d6ba844..cc1ea74 100644 --- a/src/Void.Proxy.API/Network/IO/Messages/IMinecraftMessage.cs +++ b/src/Void.Proxy.API/Network/IO/Messages/IMinecraftMessage.cs @@ -1,3 +1,3 @@ namespace Void.Proxy.API.Network.IO.Messages; -public interface IMinecraftMessage; \ No newline at end of file +public interface IMinecraftMessage : IDisposable; \ No newline at end of file diff --git a/src/Void.Proxy.Plugins.ExamplePlugin/ExamplePlugin.cs b/src/Void.Proxy.Plugins.ExamplePlugin/ExamplePlugin.cs index 06380c3..bc427b6 100644 --- a/src/Void.Proxy.Plugins.ExamplePlugin/ExamplePlugin.cs +++ b/src/Void.Proxy.Plugins.ExamplePlugin/ExamplePlugin.cs @@ -15,14 +15,14 @@ public Task ExecuteAsync(CancellationToken cancellationToken) } [Subscribe] - public void OnProxyStart(ProxyStart @event) + public void OnProxyStarting(ProxyStartingEvent @event) { - logger.LogInformation("Received ProxyStart event"); + logger.LogInformation("Received ProxyStarting event"); } [Subscribe] - public void OnProxyStop(ProxyStop @event) + public void OnProxyStopping(ProxyStoppingEvent @event) { - logger.LogInformation("Received ProxyStop event"); + logger.LogInformation("Received ProxyStopping event"); } } \ No newline at end of file diff --git a/src/Void.Proxy.Plugins.ModsSupport.Forge/Void.Proxy.Plugins.ModsSupport.Forge.csproj b/src/Void.Proxy.Plugins.ModsSupport.Forge/Void.Proxy.Plugins.ModsSupport.Forge.csproj index 125f4c9..6dc9720 100644 --- a/src/Void.Proxy.Plugins.ModsSupport.Forge/Void.Proxy.Plugins.ModsSupport.Forge.csproj +++ b/src/Void.Proxy.Plugins.ModsSupport.Forge/Void.Proxy.Plugins.ModsSupport.Forge.csproj @@ -1,9 +1,25 @@  - - net9.0 - enable - enable - + + net9.0 + enable + enable + true + - + + none + + + + none + + + + + false + runtime + + + + \ No newline at end of file diff --git a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_13_to_1_20_1/ProtocolSupportPlugin.cs b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_13_to_1_20_1/ProtocolSupportPlugin.cs index 7d77de8..3fed376 100644 --- a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_13_to_1_20_1/ProtocolSupportPlugin.cs +++ b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_13_to_1_20_1/ProtocolSupportPlugin.cs @@ -20,17 +20,17 @@ public Task ExecuteAsync(CancellationToken cancellationToken) } [Subscribe] - public void OnProxyStart(ProxyStart @event) + public void OnProxyStarting(ProxyStartingEvent @event) { } [Subscribe] - public void OnProxyStop(ProxyStop @event) + public void OnProxyStopping(ProxyStoppingEvent @event) { } [Subscribe] - public void OnSearchProtocolCodec(SearchProtocolCodec @event) + public void OnCreateChannelBuilder(CreateChannelBuilderEvent @event) { } } \ No newline at end of file diff --git a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/Packets/Serverbound/HandshakePacket.cs b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/Packets/Serverbound/HandshakePacket.cs index 0587afa..f07888e 100644 --- a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/Packets/Serverbound/HandshakePacket.cs +++ b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/Packets/Serverbound/HandshakePacket.cs @@ -19,7 +19,7 @@ public void Encode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion) buffer.WriteVarInt(NextState); } - public async Task HandleAsync(HandshakeState state) + public readonly async Task HandleAsync(HandshakeState state) { return await state.HandleAsync(this); } @@ -33,4 +33,8 @@ public void Decode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion) ServerPort = buffer.ReadUnsignedShort(); NextState = buffer.ReadVarInt(); } + + public void Dispose() + { + } } \ No newline at end of file diff --git a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/ProtocolSupportPlugin.cs b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/ProtocolSupportPlugin.cs index 560a01d..04b1ef8 100644 --- a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/ProtocolSupportPlugin.cs +++ b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_20_2_to_latest/ProtocolSupportPlugin.cs @@ -21,29 +21,26 @@ public Task ExecuteAsync(CancellationToken cancellationToken) } [Subscribe] - public void OnProxyStart(ProxyStart @event) + public void OnProxyStarting(ProxyStartingEvent @event) { } [Subscribe] - public void OnProxyStop(ProxyStop @event) + public void OnProxyStopping(ProxyStoppingEvent @event) { } [Subscribe] - public void OnSearchProtocolCodec(SearchProtocolCodec @event) + public void OnCreateChannelBuilder(CreateChannelBuilderEvent @event) { if (!IsSupportedHandshake(@event.Buffer)) return; - @event.Result = new SearchProtocolCodec.Data + @event.Result = stream => { - ChannelBuilder = stream => - { - var channel = new SimpleMinecraftChannel(new SimpleNetworkStream(stream)); - // channel.Add(); - return Task.FromResult(channel); - } + var channel = new SimpleMinecraftChannel(new SimpleNetworkStream(stream)); + // channel.Add(); + return Task.FromResult(channel); }; } diff --git a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_7_2_to_1_12_2/ProtocolSupportPlugin.cs b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_7_2_to_1_12_2/ProtocolSupportPlugin.cs index 27d81bc..1b31262 100644 --- a/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_7_2_to_1_12_2/ProtocolSupportPlugin.cs +++ b/src/Void.Proxy.Plugins.ProtocolSupport.Java.v1_7_2_to_1_12_2/ProtocolSupportPlugin.cs @@ -20,17 +20,17 @@ public Task ExecuteAsync(CancellationToken cancellationToken) } [Subscribe] - public void OnProxyStart(ProxyStart @event) + public void OnProxyStarting(ProxyStartingEvent @event) { } [Subscribe] - public void OnProxyStop(ProxyStop @event) + public void OnProxyStopping(ProxyStoppingEvent @event) { } [Subscribe] - public void OnSearchProtocolCodec(SearchProtocolCodec @event) + public void OnCreateChannelBuilder(CreateChannelBuilderEvent @event) { } } \ No newline at end of file diff --git a/src/Void.Proxy/Links/Link.cs b/src/Void.Proxy/Links/Link.cs index 5c1d537..03e027f 100644 --- a/src/Void.Proxy/Links/Link.cs +++ b/src/Void.Proxy/Links/Link.cs @@ -16,11 +16,11 @@ public class Link : ILink private readonly CancellationTokenSource _ctsPlayerToServerForce; private readonly CancellationTokenSource _ctsServerToPlayer; private readonly CancellationTokenSource _ctsServerToPlayerForce; - - private readonly ILogger _logger; private readonly IEventService _events; private readonly AsyncLock _lock; + private readonly ILogger _logger; + private readonly Task _playerToServerTask; private readonly Task _serverToPlayerTask; @@ -111,8 +111,7 @@ protected async Task ExecuteAsync(IMinecraftChannel sourceChannel, IMinecraftCha if (cancellationToken.IsCancellationRequested || forceCancellationToken.IsCancellationRequested) break; - // TODO add dispose - var message = await sourceChannel.ReadMessageAsync(); + using var message = await sourceChannel.ReadMessageAsync(); if (message is BinaryPacket packet) _logger.LogDebug("{Direction} packet id {PacketId}", direction, packet.Id); diff --git a/src/Void.Proxy/Links/LinkService.cs b/src/Void.Proxy/Links/LinkService.cs index 3bb172a..5d492b2 100644 --- a/src/Void.Proxy/Links/LinkService.cs +++ b/src/Void.Proxy/Links/LinkService.cs @@ -10,18 +10,18 @@ namespace Void.Proxy.Links; public class LinkService : ILinkService, IEventListener { - private readonly List _links =[]; - + private readonly IEventService _events; + private readonly List _links = []; + private readonly ILogger _logger; private readonly IServerService _servers; - private readonly IEventService _events; public LinkService(ILogger logger, IServerService servers, IEventService events) { _logger = logger; _servers = servers; _events = events; - + events.RegisterListeners(this); } @@ -33,7 +33,7 @@ public async ValueTask ConnectPlayerAnywhereAsync(IPlayer player) var serverChannel = await player.BuildServerChannelAsync(server); var link = await CreateLinkAsync(player, server, playerChannel, serverChannel); - + _events.RegisterListeners(link); _links.Add(link); @@ -44,8 +44,11 @@ public async ValueTask ConnectPlayerAnywhereAsync(IPlayer player) [Subscribe] public async ValueTask OnStopLinkEvent(LinkStoppingEvent @event) { - if (!_links.Remove(@event.Link)) - return; + lock (_links) + { + if (!_links.Remove(@event.Link)) + return; + } await @event.Link.DisposeAsync(); @@ -58,18 +61,12 @@ public async ValueTask OnStopLinkEvent(LinkStoppingEvent @event) private async ValueTask CreateLinkAsync(IPlayer player, IServer server, IMinecraftChannel playerChannel, IMinecraftChannel serverChannel) { - var @event = new CreateLinkEvent - { - Player = player, - Server = server, - PlayerChannel = playerChannel, - ServerChannel = serverChannel - }; + var @event = new CreateLinkEvent { Player = player, Server = server, PlayerChannel = playerChannel, ServerChannel = serverChannel }; await _events.ThrowAsync(@event); var link = @event.Result ?? new Link(player, server, playerChannel, serverChannel, _events); - + await _events.ThrowAsync(new LinkStartingEvent { Link = link }); return link; diff --git a/src/Void.Proxy/Network/Protocol/Services/ChannelBuilderService.cs b/src/Void.Proxy/Network/Protocol/Services/ChannelBuilderService.cs index 1d7dfc7..e47e4f0 100644 --- a/src/Void.Proxy/Network/Protocol/Services/ChannelBuilderService.cs +++ b/src/Void.Proxy/Network/Protocol/Services/ChannelBuilderService.cs @@ -29,11 +29,11 @@ public async ValueTask SearchChannelBuilderAsync(IPlayer player, CancellationTok var buffer = new byte[MaxHandshakeSize]; var length = await stream.ReadAsync(buffer, cancellationToken); - var searchProtocolCodec = new SearchProtocolCodec { Buffer = buffer[..length] }; + var searchProtocolCodec = new CreateChannelBuilderEvent { Buffer = buffer[..length] }; await events.ThrowAsync(searchProtocolCodec, cancellationToken); if (searchProtocolCodec.Result is not null) - _builder = searchProtocolCodec.Result.ChannelBuilder; + _builder = searchProtocolCodec.Result; _buffer = searchProtocolCodec.Buffer; _found = true; diff --git a/src/Void.Proxy/Platform.cs b/src/Void.Proxy/Platform.cs index 64fc66a..d383f86 100644 --- a/src/Void.Proxy/Platform.cs +++ b/src/Void.Proxy/Platform.cs @@ -38,7 +38,7 @@ public async Task StartAsync(CancellationToken cancellationToken) servers.RegisterServer(server); await plugins.LoadAsync(cancellationToken: cancellationToken); - await events.ThrowAsync(cancellationToken); + await events.ThrowAsync(cancellationToken); _listener = new TcpListener(settings.Address, settings.Port); _listener.Start(); @@ -50,6 +50,7 @@ public async Task StartAsync(CancellationToken cancellationToken) public async Task StopAsync(CancellationToken cancellationToken) { + await events.ThrowAsync(cancellationToken); logger.LogInformation("Stopping proxy"); // TODO disconnect everyone here @@ -72,12 +73,14 @@ await _backgroundTask.ContinueWith(backgroundTask => _listener?.Stop(); await settings.SaveAsync(cancellationToken: cancellationToken); - await events.ThrowAsync(cancellationToken); + + await events.ThrowAsync(cancellationToken); await plugins.UnloadAsync(cancellationToken); } public async Task ExecuteAsync(CancellationToken cancellationToken) { + await events.ThrowAsync(cancellationToken); ArgumentNullException.ThrowIfNull(_listener); while (!cancellationToken.IsCancellationRequested) await players.AcceptPlayerAsync(await _listener.AcceptTcpClientAsync(cancellationToken));