Skip to content

Commit ec435ee

Browse files
committed
style: apply ReSharper ReformatAndReorder (CI format gate)
1 parent abeee87 commit ec435ee

10 files changed

Lines changed: 118 additions & 41 deletions

File tree

src/RustPlusBot.Features.Connections/Listening/HeartbeatResult.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ internal enum HeartbeatKind
2020
/// and <see cref="AuthRejected"/> are constants.</remarks>
2121
internal readonly record struct HeartbeatResult(HeartbeatKind Kind, int PlayerCount)
2222
{
23-
/// <summary>A healthy heartbeat carrying the player count.</summary>
24-
/// <param name="playerCount">The number of players currently online.</param>
25-
public static HeartbeatResult Ok(int playerCount) => new(HeartbeatKind.Ok, playerCount);
26-
2723
/// <summary>An unreachable heartbeat.</summary>
2824
public static HeartbeatResult Unreachable { get; } = new(HeartbeatKind.Unreachable, 0);
2925

3026
/// <summary>An auth-rejected heartbeat.</summary>
3127
public static HeartbeatResult AuthRejected { get; } = new(HeartbeatKind.AuthRejected, 0);
28+
29+
/// <summary>A healthy heartbeat carrying the player count.</summary>
30+
/// <param name="playerCount">The number of players currently online.</param>
31+
public static HeartbeatResult Ok(int playerCount) => new(HeartbeatKind.Ok, playerCount);
3232
}

src/RustPlusBot.Features.Connections/Listening/RustPlusSocketSource.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public IRustServerConnection Create(string ip, int port, ulong steamId, string p
1313
{
1414
if (!int.TryParse(playerToken, CultureInfo.InvariantCulture, out var token))
1515
{
16-
throw new ArgumentException($"playerToken is not a valid numeric token: '{playerToken}'.", nameof(playerToken));
16+
throw new ArgumentException($"playerToken is not a valid numeric token: '{playerToken}'.",
17+
nameof(playerToken));
1718
}
1819

1920
return new RustPlusServerConnection(ip, port, steamId, token, logger);
@@ -29,8 +30,8 @@ public IRustServerConnection Create(string ip, int port, ulong steamId, string p
2930
/// </summary>
3031
private sealed partial class RustPlusServerConnection : IRustServerConnection
3132
{
32-
private readonly RustPlus _rustPlus;
3333
private readonly ILogger _logger;
34+
private readonly RustPlus _rustPlus;
3435

3536
public RustPlusServerConnection(string ip, int port, ulong steamId, int playerToken, ILogger logger)
3637
{
@@ -86,7 +87,8 @@ public async Task<HeartbeatResult> GetInfoAsync(TimeSpan timeout, CancellationTo
8687
// Response<T>.IsSuccess and Response<T>.Data are the accessors.
8788
// CONFIRMED: ServerInfo.PlayerCount is uint? (not int, not .Players).
8889
// .WaitAsync guarantees we return within the timeout even if GetInfoAsync doesn't internally honor the token (unverified beta).
89-
var response = await _rustPlus.GetInfoAsync(timeoutCts.Token).WaitAsync(timeoutCts.Token).ConfigureAwait(false);
90+
var response = await _rustPlus.GetInfoAsync(timeoutCts.Token).WaitAsync(timeoutCts.Token)
91+
.ConfigureAwait(false);
9092
if (!response.IsSuccess)
9193
{
9294
// VERIFY: detect the specific auth/token-rejected error shape from response or error message

src/RustPlusBot.Features.Workspace/Hosting/WorkspaceHostedService.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ internal sealed class WorkspaceHostedService(
2020
ILogger<WorkspaceHostedService> logger) : IHostedService, IDisposable
2121
{
2222
private readonly CancellationTokenSource _cts = new();
23-
private Task? _serverRegisteredLoop;
2423
private Task? _connectionStatusLoop;
24+
private Task? _serverRegisteredLoop;
2525
private bool _startupDone;
2626

2727
/// <inheritdoc />
@@ -43,7 +43,10 @@ public async Task StopAsync(CancellationToken cancellationToken)
4343
client.Ready -= OnReadyAsync;
4444
client.ChannelDestroyed -= OnChannelDestroyedAsync;
4545
await _cts.CancelAsync().ConfigureAwait(false);
46-
foreach (var loop in new[] { _serverRegisteredLoop, _connectionStatusLoop })
46+
foreach (var loop in new[]
47+
{
48+
_serverRegisteredLoop, _connectionStatusLoop
49+
})
4750
{
4851
if (loop is null)
4952
{

src/RustPlusBot.Features.Workspace/Messages/ServerInfoMessageRenderer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ internal sealed class ServerInfoMessageRenderer(
2323
public string MessageKey => WorkspaceMessageKeys.ServerInfo;
2424

2525
/// <inheritdoc />
26-
public async ValueTask<MessagePayload> RenderAsync(MessageRenderContext context, CancellationToken cancellationToken)
26+
public async ValueTask<MessagePayload> RenderAsync(MessageRenderContext context,
27+
CancellationToken cancellationToken)
2728
{
2829
ArgumentNullException.ThrowIfNull(context);
2930
if (context.ServerId is not Guid serverId)

src/RustPlusBot.Persistence/Connections/ConnectionStore.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,10 @@ public async Task MarkInvalidAsync(Guid credentialId, CancellationToken cancella
133133
{
134134
var rows = await context.PlayerCredentials
135135
.Where(c => c.Status != CredentialStatus.Invalid)
136-
.Select(c => new { c.GuildId, c.RustServerId })
136+
.Select(c => new
137+
{
138+
c.GuildId, c.RustServerId
139+
})
137140
.Distinct()
138141
.ToListAsync(cancellationToken)
139142
.ConfigureAwait(false);

tests/RustPlusBot.Features.Connections.Tests/ConnectionRegistrationTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ public async Task Services_Resolve()
2828
services.AddOptions<ConnectionOptions>();
2929
services.AddConnections();
3030

31-
await using var provider = services.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = true });
31+
await using var provider = services.BuildServiceProvider(new ServiceProviderOptions
32+
{
33+
ValidateScopes = true
34+
});
3235

3336
Assert.NotNull(provider.GetRequiredService<IConnectionSupervisor>());
3437
await using var scope = provider.CreateAsyncScope();

tests/RustPlusBot.Features.Connections.Tests/ConnectionSupervisorTests.cs

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ private static Harness CreateHarness(FakeRustSocketSource source)
4343
services.AddScoped(sp => new BotDbContext(
4444
new DbContextOptionsBuilder<BotDbContext>().UseSqlite(sp.GetRequiredService<SqliteConnection>()).Options));
4545
services.AddScoped<IConnectionStore, ConnectionStore>();
46-
services.AddScoped<RustPlusBot.Persistence.Servers.IServerService, RustPlusBot.Persistence.Servers.ServerService>();
46+
services
47+
.AddScoped<RustPlusBot.Persistence.Servers.IServerService, RustPlusBot.Persistence.Servers.ServerService>();
4748

4849
services.AddSingleton<IRustSocketSource>(source);
4950
services.AddSingleton(Options.Create(new ConnectionOptions
@@ -57,33 +58,50 @@ private static Harness CreateHarness(FakeRustSocketSource source)
5758
services.AddSingleton<ConnectionSupervisor>();
5859

5960
var provider = services.BuildServiceProvider();
60-
return new Harness { Provider = provider, Dm = dm, Supervisor = provider.GetRequiredService<ConnectionSupervisor>() };
61+
return new Harness
62+
{
63+
Provider = provider, Dm = dm, Supervisor = provider.GetRequiredService<ConnectionSupervisor>()
64+
};
6165
}
6266

6367
private static async Task<(Guid ServerId, Guid CredA, Guid CredB)> SeedAsync(
64-
ServiceProvider provider, CredentialStatus bStatus = CredentialStatus.Standby)
68+
ServiceProvider provider,
69+
CredentialStatus bStatus = CredentialStatus.Standby)
6570
{
6671
using var scope = provider.CreateScope();
6772
var context = scope.ServiceProvider.GetRequiredService<BotDbContext>();
68-
var server = new RustServer { GuildId = 10UL, Name = "S", Ip = "1.1.1.1", Port = 28015 };
73+
var server = new RustServer
74+
{
75+
GuildId = 10UL, Name = "S", Ip = "1.1.1.1", Port = 28015
76+
};
6977
context.RustServers.Add(server);
7078
var a = new PlayerCredential
7179
{
72-
GuildId = 10UL, RustServerId = server.Id, OwnerUserId = 1UL, SteamId = 100UL,
73-
ProtectedPlayerToken = "111", Status = CredentialStatus.Active,
80+
GuildId = 10UL,
81+
RustServerId = server.Id,
82+
OwnerUserId = 1UL,
83+
SteamId = 100UL,
84+
ProtectedPlayerToken = "111",
85+
Status = CredentialStatus.Active,
7486
};
7587
var b = new PlayerCredential
7688
{
77-
GuildId = 10UL, RustServerId = server.Id, OwnerUserId = 2UL, SteamId = 200UL,
78-
ProtectedPlayerToken = "222", Status = bStatus,
89+
GuildId = 10UL,
90+
RustServerId = server.Id,
91+
OwnerUserId = 2UL,
92+
SteamId = 200UL,
93+
ProtectedPlayerToken = "222",
94+
Status = bStatus,
7995
};
8096
await context.PlayerCredentials.AddRangeAsync(a, b);
8197
await context.SaveChangesAsync();
8298
return (server.Id, a.Id, b.Id);
8399
}
84100

85101
private static async Task<ConnectionState?> WaitForStateAsync(
86-
ServiceProvider provider, Guid serverId, Func<ConnectionState, bool> predicate)
102+
ServiceProvider provider,
103+
Guid serverId,
104+
Func<ConnectionState, bool> predicate)
87105
{
88106
var deadline = DateTimeOffset.UtcNow.AddSeconds(20);
89107
while (DateTimeOffset.UtcNow < deadline)
@@ -130,7 +148,7 @@ public async Task Connect_AuthRejected_FailsOverToNextStandbyAndDmsOwner()
130148
{
131149
var source = new FakeRustSocketSource();
132150
source.EnqueueConnect(SocketConnectOutcome.AuthRejected); // credential A
133-
source.EnqueueConnect(SocketConnectOutcome.Connected); // credential B
151+
source.EnqueueConnect(SocketConnectOutcome.Connected); // credential B
134152
source.EnqueueHeartbeat(HeartbeatResult.Ok(3));
135153
await using var h = CreateHarness(source);
136154
var (serverId, credA, credB) = await SeedAsync(h.Provider);
@@ -181,8 +199,8 @@ public async Task Heartbeat_Unreachable_ReconnectsAndRecovers()
181199
{
182200
var source = new FakeRustSocketSource();
183201
source.EnqueueConnect(SocketConnectOutcome.Connected);
184-
source.EnqueueHeartbeat(HeartbeatResult.Ok(2)); // first heartbeat -> Connected
185-
source.EnqueueHeartbeat(HeartbeatResult.Unreachable); // next heartbeat -> drop
202+
source.EnqueueHeartbeat(HeartbeatResult.Ok(2)); // first heartbeat -> Connected
203+
source.EnqueueHeartbeat(HeartbeatResult.Unreachable); // next heartbeat -> drop
186204
source.EnqueueConnect(SocketConnectOutcome.Connected); // reconnect
187205
source.EnqueueHeartbeat(HeartbeatResult.Ok(4));
188206
await using var h = CreateHarness(source);

tests/RustPlusBot.Features.Connections.Tests/Fakes/FakeRustSocketSource.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ internal sealed class FakeRustSocketSource : IRustSocketSource
2929
/// <summary>The Steam ID passed to the most recent <see cref="Create"/> call. Read after the operation under test has settled.</summary>
3030
public ulong LastSteamId { get; private set; }
3131

32-
public void EnqueueConnect(SocketConnectOutcome outcome) => _connectOutcomes.Enqueue(outcome);
33-
34-
public void EnqueueHeartbeat(HeartbeatResult result) => _heartbeats.Enqueue(result);
35-
3632
public IRustServerConnection Create(string ip, int port, ulong steamId, string playerToken)
3733
{
3834
Interlocked.Increment(ref _createCount);
@@ -42,6 +38,10 @@ public IRustServerConnection Create(string ip, int port, ulong steamId, string p
4238
return new FakeConnection(outcome, _heartbeats);
4339
}
4440

41+
public void EnqueueConnect(SocketConnectOutcome outcome) => _connectOutcomes.Enqueue(outcome);
42+
43+
public void EnqueueHeartbeat(HeartbeatResult result) => _heartbeats.Enqueue(result);
44+
4545
private sealed class FakeConnection(SocketConnectOutcome outcome, ConcurrentQueue<HeartbeatResult> heartbeats)
4646
: IRustServerConnection
4747
{

tests/RustPlusBot.Features.Workspace.Tests/Messages/RendererTests.cs

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,19 +65,37 @@ public async Task ServerInfo_Connected_ShowsStatusActivePlayerAndCount_AndSwapSe
6565
var credId = Guid.NewGuid();
6666
var servers = Substitute.For<IServerService>();
6767
servers.GetAsync(1, serverId, Arg.Any<CancellationToken>())
68-
.Returns(new RustServer { Id = serverId, GuildId = 1, Name = "Rustopia EU", Ip = "1.2.3.4", Port = 28015 });
68+
.Returns(new RustServer
69+
{
70+
Id = serverId,
71+
GuildId = 1,
72+
Name = "Rustopia EU",
73+
Ip = "1.2.3.4",
74+
Port = 28015
75+
});
6976

7077
var connections = Substitute.For<IConnectionStore>();
7178
connections.GetStateAsync(1, serverId, Arg.Any<CancellationToken>())
7279
.Returns(new DomainConnectionState
7380
{
74-
RustServerId = serverId, GuildId = 1, ActiveCredentialId = credId,
75-
Status = ConnectionStatus.Connected, PlayerCount = 12,
81+
RustServerId = serverId,
82+
GuildId = 1,
83+
ActiveCredentialId = credId,
84+
Status = ConnectionStatus.Connected,
85+
PlayerCount = 12,
7686
});
7787
connections.ListPoolAsync(1, serverId, Arg.Any<CancellationToken>())
7888
.Returns(new List<PlayerCredential>
7989
{
80-
new() { Id = credId, GuildId = 1, RustServerId = serverId, OwnerUserId = 7, SteamId = 76561198000000000UL, Status = CredentialStatus.Active },
90+
new()
91+
{
92+
Id = credId,
93+
GuildId = 1,
94+
RustServerId = serverId,
95+
OwnerUserId = 7,
96+
SteamId = 76561198000000000UL,
97+
Status = CredentialStatus.Active
98+
},
8199
});
82100

83101
var renderer = new ServerInfoMessageRenderer(servers, connections, Loc);
@@ -86,7 +104,8 @@ public async Task ServerInfo_Connected_ShowsStatusActivePlayerAndCount_AndSwapSe
86104

87105
Assert.Contains("Rustopia EU", payload.Embed!.Title, StringComparison.Ordinal);
88106
Assert.Contains("12", string.Concat(payload.Embed.Fields.Select(f => f.Value)), StringComparison.Ordinal);
89-
Assert.Contains("76561198000000000", string.Concat(payload.Embed.Fields.Select(f => f.Value)), StringComparison.Ordinal);
107+
Assert.Contains("76561198000000000", string.Concat(payload.Embed.Fields.Select(f => f.Value)),
108+
StringComparison.Ordinal);
90109
var selects = payload.Components!.Components.OfType<ActionRowComponent>()
91110
.SelectMany(r => r.Components).OfType<SelectMenuComponent>();
92111
Assert.Contains(selects, s => s.CustomId == $"workspace:info:swap:{serverId}");
@@ -98,10 +117,20 @@ public async Task ServerInfo_NoCredentials_ShowsNoCredentialsAndNoCount()
98117
var serverId = Guid.NewGuid();
99118
var servers = Substitute.For<IServerService>();
100119
servers.GetAsync(1, serverId, Arg.Any<CancellationToken>())
101-
.Returns(new RustServer { Id = serverId, GuildId = 1, Name = "S", Ip = "1.2.3.4", Port = 28015 });
120+
.Returns(new RustServer
121+
{
122+
Id = serverId,
123+
GuildId = 1,
124+
Name = "S",
125+
Ip = "1.2.3.4",
126+
Port = 28015
127+
});
102128
var connections = Substitute.For<IConnectionStore>();
103129
connections.GetStateAsync(1, serverId, Arg.Any<CancellationToken>())
104-
.Returns(new DomainConnectionState { RustServerId = serverId, GuildId = 1, Status = ConnectionStatus.NoCredentials });
130+
.Returns(new DomainConnectionState
131+
{
132+
RustServerId = serverId, GuildId = 1, Status = ConnectionStatus.NoCredentials
133+
});
105134
connections.ListPoolAsync(1, serverId, Arg.Any<CancellationToken>())
106135
.Returns(new List<PlayerCredential>());
107136

@@ -119,7 +148,14 @@ public async Task ServerInfo_NullState_DefaultsToNoCredentials()
119148
var serverId = Guid.NewGuid();
120149
var servers = Substitute.For<IServerService>();
121150
servers.GetAsync(1, serverId, Arg.Any<CancellationToken>())
122-
.Returns(new RustServer { Id = serverId, GuildId = 1, Name = "S", Ip = "1.2.3.4", Port = 28015 });
151+
.Returns(new RustServer
152+
{
153+
Id = serverId,
154+
GuildId = 1,
155+
Name = "S",
156+
Ip = "1.2.3.4",
157+
Port = 28015
158+
});
123159
var connections = Substitute.For<IConnectionStore>();
124160
connections.GetStateAsync(1, serverId, Arg.Any<CancellationToken>())
125161
.Returns((DomainConnectionState?)null);

tests/RustPlusBot.Persistence.Tests/Connections/ConnectionStoreTests.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,28 @@ private static (ConnectionStore Store, BotDbContext Context, SqliteConnection Co
2121

2222
private static async Task<(Guid ServerId, Guid CredA, Guid CredB)> SeedServerWithPoolAsync(BotDbContext context)
2323
{
24-
var server = new RustServer { GuildId = 10UL, Name = "S", Ip = "1.1.1.1", Port = 28015 };
24+
var server = new RustServer
25+
{
26+
GuildId = 10UL, Name = "S", Ip = "1.1.1.1", Port = 28015
27+
};
2528
context.RustServers.Add(server);
2629
var a = new PlayerCredential
2730
{
28-
GuildId = 10UL, RustServerId = server.Id, OwnerUserId = 1UL, SteamId = 100UL,
29-
ProtectedPlayerToken = "ta", Status = CredentialStatus.Active,
31+
GuildId = 10UL,
32+
RustServerId = server.Id,
33+
OwnerUserId = 1UL,
34+
SteamId = 100UL,
35+
ProtectedPlayerToken = "ta",
36+
Status = CredentialStatus.Active,
3037
};
3138
var b = new PlayerCredential
3239
{
33-
GuildId = 10UL, RustServerId = server.Id, OwnerUserId = 2UL, SteamId = 200UL,
34-
ProtectedPlayerToken = "tb", Status = CredentialStatus.Standby,
40+
GuildId = 10UL,
41+
RustServerId = server.Id,
42+
OwnerUserId = 2UL,
43+
SteamId = 200UL,
44+
ProtectedPlayerToken = "tb",
45+
Status = CredentialStatus.Standby,
3546
};
3647
await context.PlayerCredentials.AddRangeAsync(a, b);
3748
await context.SaveChangesAsync();

0 commit comments

Comments
 (0)