Skip to content

Commit

Permalink
refactor events
Browse files Browse the repository at this point in the history
  • Loading branch information
caunt committed Jul 26, 2024
1 parent f8d34d3 commit e4d94c5
Show file tree
Hide file tree
Showing 21 changed files with 92 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,17 @@ public struct PlayerInfoUpdatePacket : IMinecraftPacket<PlayState>
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);
buffer.WriteVarInt(Players.Count);

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)}");
Expand Down
10 changes: 10 additions & 0 deletions src/Void.Proxy.API/Events/Handshake/CreateChannelBuilderEvent.cs
Original file line number Diff line number Diff line change
@@ -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<Func<NetworkStream, Task<IMinecraftChannel>>>
{
public required Memory<byte> Buffer { get; init; }
public Func<NetworkStream, Task<IMinecraftChannel>>? Result { get; set; }
}
15 changes: 0 additions & 15 deletions src/Void.Proxy.API/Events/Handshake/SearchProtocolCodec.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
namespace Void.Proxy.API.Events.Proxy;

public class ProxyStart : IEvent
{
}
public class ProxyStartedEvent : IEvent;
3 changes: 3 additions & 0 deletions src/Void.Proxy.API/Events/Proxy/ProxyStartingEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Void.Proxy.API.Events.Proxy;

public class ProxyStartingEvent : IEvent;
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
namespace Void.Proxy.API.Events.Proxy;

public class ProxyStop : IEvent
{
}
public class ProxyStoppedEvent : IEvent;
3 changes: 3 additions & 0 deletions src/Void.Proxy.API/Events/Proxy/ProxyStoppingEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Void.Proxy.API.Events.Proxy;

public class ProxyStoppingEvent : IEvent;
2 changes: 1 addition & 1 deletion src/Void.Proxy.API/Network/IO/Messages/BinaryPacket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace Void.Proxy.API.Network.IO.Messages;
public readonly struct BinaryPacket(
int id,
Memory<byte> memory,
IMemoryOwner<byte> owner) : IMinecraftPacket, IDisposable
IMemoryOwner<byte> owner) : IMinecraftPacket
{
public int Id => id;
public Memory<byte> Memory => memory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace Void.Proxy.API.Network.IO.Messages;

public readonly struct BufferedBinaryMessage(
Memory<byte> memory,
IMemoryOwner<byte> owner) : IMinecraftMessage, IDisposable
IMemoryOwner<byte> owner) : IMinecraftMessage
{
public Memory<byte> Memory => memory;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace Void.Proxy.API.Network.IO.Messages;

public readonly struct CompleteBinaryMessage(
Memory<byte> memory,
IMemoryOwner<byte> owner) : IMinecraftMessage, IDisposable
IMemoryOwner<byte> owner) : IMinecraftMessage
{
public Memory<byte> Memory => memory;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
namespace Void.Proxy.API.Network.IO.Messages;

public interface IMinecraftMessage;
public interface IMinecraftMessage : IDisposable;
8 changes: 4 additions & 4 deletions src/Void.Proxy.Plugins.ExamplePlugin/ExamplePlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>

</Project>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>none</DebugType>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType>none</DebugType>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Void.Proxy.API\Void.Proxy.API.csproj">
<Private>false</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public void Encode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion)
buffer.WriteVarInt(NextState);
}

public async Task<bool> HandleAsync(HandshakeState state)
public readonly async Task<bool> HandleAsync(HandshakeState state)
{
return await state.HandleAsync(this);
}
Expand All @@ -33,4 +33,8 @@ public void Decode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion)
ServerPort = buffer.ReadUnsignedShort();
NextState = buffer.ReadVarInt();
}

public void Dispose()
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<MinecraftCodecMessageStream>();
return Task.FromResult<IMinecraftChannel>(channel);
}
var channel = new SimpleMinecraftChannel(new SimpleNetworkStream(stream));
// channel.Add<MinecraftCodecMessageStream>();
return Task.FromResult<IMinecraftChannel>(channel);
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}
}
7 changes: 3 additions & 4 deletions src/Void.Proxy/Links/Link.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ public class Link : ILink
private readonly CancellationTokenSource _ctsPlayerToServerForce;
private readonly CancellationTokenSource _ctsServerToPlayer;
private readonly CancellationTokenSource _ctsServerToPlayerForce;

private readonly ILogger<Link> _logger;
private readonly IEventService _events;
private readonly AsyncLock _lock;

private readonly ILogger<Link> _logger;

private readonly Task _playerToServerTask;
private readonly Task _serverToPlayerTask;

Expand Down Expand Up @@ -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);
Expand Down
27 changes: 12 additions & 15 deletions src/Void.Proxy/Links/LinkService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@ namespace Void.Proxy.Links;

public class LinkService : ILinkService, IEventListener
{
private readonly List<ILink> _links =[];

private readonly IEventService _events;
private readonly List<ILink> _links = [];

private readonly ILogger<LinkService> _logger;
private readonly IServerService _servers;
private readonly IEventService _events;

public LinkService(ILogger<LinkService> logger, IServerService servers, IEventService events)
{
_logger = logger;
_servers = servers;
_events = events;

events.RegisterListeners(this);
}

Expand All @@ -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);

Expand All @@ -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();

Expand All @@ -58,18 +61,12 @@ public async ValueTask OnStopLinkEvent(LinkStoppingEvent @event)

private async ValueTask<ILink> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading

0 comments on commit e4d94c5

Please sign in to comment.