Skip to content

Commit 1c54b75

Browse files
PJB3005DebugOk
authored andcommitted
Dependency update / fixes / skrungle bungle (#23745)
* Give .props files 2-space indents. * Move to Central Package Management. Allows us to store NuGet package versions all in one place. Yay! * Update NuGet packages and fix code for changes. Notable: Changes to ILVerify. Npgsql doesn't need hacks for inet anymore, now we need hacks to make the old code work with this new reality. NUnit's analyzers are already complaining and I didn't even update it to 4.x yet. TerraFX changed to GetLastSystemError so error handling had to be changed. Buncha APIs have more NRT annotations. * Remove dotnet-eng NuGet package source. I genuinely don't know what this was for, and Central Package Management starts throwing warnings about it, so YEET. * Remove Robust.Physics project. Never used. * Remove erroneous NVorbis reference. Should be VorbisPizza and otherwise wasn't used. * Sandbox fixes * Remove unused unit test package references. Castle.Core and NUnit.ConsoleRunner. * Update NUnit to 4.0.1 This requires replacing all the old assertion methods because they removed them 🥲 * Oh so that's what dotnet-eng was used for. Yeah ok that makes sense. * Add Robust.Analyzers.Test * Update submodule * commit to re-run CI (cherry picked from commit a6c9c36b688a1ba78ff4c12502e81661cf607b6c)
1 parent 54a9bea commit 1c54b75

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+265
-292
lines changed

.editorconfig

+4-1
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,10 @@ dotnet_naming_symbols.type_parameters_symbols.applicable_kinds = type_parameter
338338
resharper_braces_for_ifelse = required_for_multiline
339339
resharper_keep_existing_attribute_arrangement = true
340340

341-
[*.{csproj,xml,yml,yaml,dll.config,msbuildproj,targets}]
341+
[*.{csproj,xml,yml,yaml,dll.config,msbuildproj,targets,props}]
342+
indent_size = 2
343+
344+
[nuget.config]
342345
indent_size = 2
343346

344347
[{*.yaml,*.yml}]

Content.Benchmarks/Content.Benchmarks.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<LangVersion>12</LangVersion>
1212
</PropertyGroup>
1313
<ItemGroup>
14-
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
14+
<PackageReference Include="BenchmarkDotNet" />
1515
</ItemGroup>
1616
<ItemGroup>
1717
<ProjectReference Include="..\Content.Client\Content.Client.csproj" />

Content.Client/Content.Client.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
<Platforms>AnyCPU</Platforms>
1414
</PropertyGroup>
1515
<ItemGroup>
16-
<PackageReference Include="Nett" Version="0.15.0" />
17-
<PackageReference Include="JetBrains.Annotations" Version="2022.1.0" PrivateAssets="All" />
16+
<PackageReference Include="Nett" />
17+
<PackageReference Include="JetBrains.Annotations" PrivateAssets="All" />
1818
</ItemGroup>
1919
<ItemGroup>
2020
<ProjectReference Include="..\RobustToolbox\Lidgren.Network\Lidgren.Network.csproj" />

Content.IntegrationTests/Content.IntegrationTests.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
<LangVersion>11</LangVersion>
99
</PropertyGroup>
1010
<ItemGroup>
11-
<PackageReference Include="NUnit" Version="3.13.3" />
12-
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
13-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
11+
<PackageReference Include="NUnit" />
12+
<PackageReference Include="NUnit3TestAdapter" />
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" />
1414
</ItemGroup>
1515
<ItemGroup>
1616
<ProjectReference Include="..\Content.Client\Content.Client.csproj" />

Content.IntegrationTests/Pair/TestPair.Recycle.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#nullable enable
1+
#nullable enable
22
using System.IO;
33
using System.Linq;
44
using Content.Server.GameTicking;
@@ -203,17 +203,17 @@ public void ValidateSettings(PoolSettings settings)
203203

204204
if (settings.InLobby)
205205
{
206-
Assert.Null(session.AttachedEntity);
206+
Assert.That(session.AttachedEntity, Is.Null);
207207
return;
208208
}
209209

210-
Assert.NotNull(session.AttachedEntity);
210+
Assert.That(session.AttachedEntity, Is.Not.Null);
211211
Assert.That(entMan.EntityExists(session.AttachedEntity));
212212
Assert.That(entMan.HasComponent<MindContainerComponent>(session.AttachedEntity));
213213
var mindCont = entMan.GetComponent<MindContainerComponent>(session.AttachedEntity!.Value);
214-
Assert.NotNull(mindCont.Mind);
215-
Assert.True(entMan.TryGetComponent(mindCont.Mind, out MindComponent? mind));
216-
Assert.Null(mind!.VisitingEntity);
214+
Assert.That(mindCont.Mind, Is.Not.Null);
215+
Assert.That(entMan.TryGetComponent(mindCont.Mind, out MindComponent? mind));
216+
Assert.That(mind!.VisitingEntity, Is.Null);
217217
Assert.That(mind.OwnedEntity, Is.EqualTo(session.AttachedEntity!.Value));
218218
Assert.That(mind.UserId, Is.EqualTo(session.UserId));
219219
}

Content.IntegrationTests/PoolManager.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -337,10 +337,10 @@ private static void DieIfPoolFailure()
337337
{
338338
// If the _poolFailureReason is not null, we can assume at least one test failed.
339339
// So we say inconclusive so we don't add more failed tests to search through.
340-
Assert.Inconclusive(@"
340+
Assert.Inconclusive(@$"
341341
In a different test, the pool manager had an exception when trying to create a server/client pair.
342342
Instead of risking that the pool manager will fail at creating a server/client pairs for every single test,
343-
we are just going to end this here to save a lot of time. This is the exception that started this:\n {0}", _poolFailureReason);
343+
we are just going to end this here to save a lot of time. This is the exception that started this:\n {_poolFailureReason}");
344344
}
345345

346346
if (_dead)

Content.IntegrationTests/Tests/Actions/ActionsAddedTest.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public async Task TestCombatActionsAdded()
2929
var cActionSystem = client.System<SharedActionsSystem>();
3030

3131
// Dummy ticker is disabled - client should be in control of a normal mob.
32-
Assert.NotNull(serverSession.AttachedEntity);
32+
Assert.That(serverSession.AttachedEntity, Is.Not.Null);
3333
var serverEnt = serverSession.AttachedEntity!.Value;
3434
var clientEnt = clientSession!.AttachedEntity!.Value;
3535
Assert.That(sEntMan.EntityExists(serverEnt));
@@ -57,8 +57,8 @@ public async Task TestCombatActionsAdded()
5757
var sAct = sActions[0].Comp;
5858
var cAct = cActions[0].Comp;
5959

60-
Assert.NotNull(sAct);
61-
Assert.NotNull(cAct);
60+
Assert.That(sAct, Is.Not.Null);
61+
Assert.That(cAct, Is.Not.Null);
6262

6363
// Finally, these two actions are not the same object
6464
// required, because integration tests do not respect the [NonSerialized] attribute and will simply events by reference.

Content.IntegrationTests/Tests/Buckle/BuckleTest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ await server.WaitAssertion(() =>
111111
// Side effects of buckling for the strap
112112
Assert.That(strap.BuckledEntities, Does.Contain(human));
113113
Assert.That(strap.OccupiedSize, Is.EqualTo(buckle.Size));
114-
Assert.Positive(strap.OccupiedSize);
114+
Assert.That(strap.OccupiedSize, Is.Positive);
115115
});
116116

117117
#pragma warning disable NUnit2045 // Interdependent asserts.

Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ await server.WaitAssertion(() =>
103103

104104
await server.WaitAssertion(() =>
105105
{
106-
CollectionAssert.AreEquivalent(deviceNetTestSystem.LastPayload, payload);
106+
Assert.That(payload, Is.EquivalentTo(deviceNetTestSystem.LastPayload));
107107
});
108108
await pair.CleanReturnAsync();
109109
}
@@ -170,7 +170,7 @@ await server.WaitAssertion(() =>
170170

171171
await server.WaitAssertion(() =>
172172
{
173-
CollectionAssert.AreEqual(deviceNetTestSystem.LastPayload, payload);
173+
Assert.That(payload, Is.EqualTo(deviceNetTestSystem.LastPayload).AsCollection);
174174

175175
payload = new NetworkPayload
176176
{
@@ -187,7 +187,7 @@ await server.WaitAssertion(() =>
187187

188188
await server.WaitAssertion(() =>
189189
{
190-
CollectionAssert.AreNotEqual(deviceNetTestSystem.LastPayload, payload);
190+
Assert.That(payload, Is.Not.EqualTo(deviceNetTestSystem.LastPayload).AsCollection);
191191
});
192192

193193
await pair.CleanReturnAsync();
@@ -270,7 +270,7 @@ await server.WaitAssertion(() =>
270270

271271
await server.WaitAssertion(() =>
272272
{
273-
CollectionAssert.AreEqual(deviceNetTestSystem.LastPayload, payload);
273+
Assert.That(payload, Is.EqualTo(deviceNetTestSystem.LastPayload).AsCollection);
274274
});
275275

276276
await pair.CleanReturnAsync();

Content.IntegrationTests/Tests/Minds/GhostRoleTests.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ await server.WaitPost(() =>
6060
Assert.That(session.AttachedEntity, Is.EqualTo(originalMob));
6161
var originalMind = entMan.GetComponent<MindComponent>(originalMindId);
6262
Assert.That(originalMind.OwnedEntity, Is.EqualTo(originalMob));
63-
Assert.Null(originalMind.VisitingEntity);
63+
Assert.That(originalMind.VisitingEntity, Is.Null);
6464

6565
// Use the ghost command
6666
conHost.ExecuteCommand("ghost");
@@ -90,11 +90,11 @@ await server.WaitPost(() =>
9090
Assert.That(newMindId, Is.Not.EqualTo(originalMindId));
9191
Assert.That(session.AttachedEntity, Is.EqualTo(ghostRole));
9292
Assert.That(newMind.OwnedEntity, Is.EqualTo(ghostRole));
93-
Assert.Null(newMind.VisitingEntity);
93+
Assert.That(newMind.VisitingEntity, Is.Null);
9494

9595
// Original mind should be unaffected, but the ghost will have deleted itself.
9696
Assert.That(originalMind.OwnedEntity, Is.EqualTo(originalMob));
97-
Assert.Null(originalMind.VisitingEntity);
97+
Assert.That(originalMind.VisitingEntity, Is.Null);
9898
Assert.That(entMan.Deleted(ghost));
9999

100100
// Ghost again.
@@ -113,11 +113,11 @@ await server.WaitPost(() =>
113113
await pair.RunTicksSync(10);
114114
Assert.That(session.AttachedEntity, Is.EqualTo(originalMob));
115115
Assert.That(originalMind.OwnedEntity, Is.EqualTo(originalMob));
116-
Assert.Null(originalMind.VisitingEntity);
116+
Assert.That(originalMind.VisitingEntity, Is.Null);
117117

118118
// the ghost-role mind is unaffected, though the ghost will have deleted itself
119119
Assert.That(newMind.OwnedEntity, Is.EqualTo(ghostRole));
120-
Assert.Null(newMind.VisitingEntity);
120+
Assert.That(newMind.VisitingEntity, Is.Null);
121121
Assert.That(entMan.Deleted(otherGhost));
122122

123123
await pair.CleanReturnAsync();

Content.IntegrationTests/Tests/Minds/MindTest.DeleteAllThenGhost.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public async Task DeleteAllThenGhost()
3636
await pair.RunTicksSync(5);
3737

3838
// Client is not attached to anything
39-
Assert.Null(pair.Client.Player?.ControlledEntity);
40-
Assert.Null(pair.PlayerData?.Mind);
39+
Assert.That(pair.Client.Player?.ControlledEntity, Is.Null);
40+
Assert.That(pair.PlayerData?.Mind, Is.Null);
4141

4242
// Attempt to ghost
4343
var cConHost = pair.Client.ResolveDependency<IConsoleHost>();

Content.IntegrationTests/Tests/Minds/MindTests.ReconnectTests.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Linq;
1+
using System.Linq;
22
using Content.Shared.Ghost;
33
using Content.Shared.Mind;
44
using Robust.Server.Player;
@@ -127,7 +127,7 @@ public async Task TestVisitingReconnect()
127127
var mindSys = entMan.System<SharedMindSystem>();
128128
var mind = GetMind(pair);
129129

130-
Assert.Null(mind.Comp.VisitingEntity);
130+
Assert.That(mind.Comp.VisitingEntity, Is.Null);
131131

132132
// Make player visit a new mob
133133
var original = mind.Comp.OwnedEntity;
@@ -165,8 +165,8 @@ public async Task TestReconnect()
165165
await using var pair = await SetupPair();
166166
var mind = GetMind(pair);
167167

168-
Assert.Null(mind.Comp.VisitingEntity);
169-
Assert.NotNull(mind.Comp.OwnedEntity);
168+
Assert.That(mind.Comp.VisitingEntity, Is.Null);
169+
Assert.That(mind.Comp.OwnedEntity, Is.Not.Null);
170170
var entity = mind.Comp.OwnedEntity;
171171

172172
await pair.RunTicksSync(5);
@@ -175,7 +175,7 @@ public async Task TestReconnect()
175175

176176
var newMind = GetMind(pair);
177177

178-
Assert.Null(newMind.Comp.VisitingEntity);
178+
Assert.That(newMind.Comp.VisitingEntity, Is.Null);
179179
Assert.That(newMind.Comp.OwnedEntity, Is.EqualTo(entity));
180180
Assert.That(newMind.Id, Is.EqualTo(mind.Id));
181181

Content.IntegrationTests/Tests/PostMapInitTest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ public async Task AllMapsTested()
305305

306306
Assert.That(gameMaps.Remove(PoolManager.TestMap));
307307

308-
CollectionAssert.AreEquivalent(GameMaps.ToHashSet(), gameMaps, "Game map prototype missing from test cases.");
308+
Assert.That(gameMaps, Is.EquivalentTo(GameMaps.ToHashSet()), "Game map prototype missing from test cases.");
309309

310310
await pair.CleanReturnAsync();
311311
}

Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public async Task TestUserDoesNotExist()
8383
var pair = await PoolManager.GetServerClient();
8484
var db = GetDb(pair.Server);
8585
// Database should be empty so a new GUID should do it.
86-
Assert.Null(await db.GetPlayerPreferencesAsync(NewUserId()));
86+
Assert.That(await db.GetPlayerPreferencesAsync(NewUserId()), Is.Null);
8787

8888
await pair.CleanReturnAsync();
8989
}

Content.IntegrationTests/Tests/Serialization/SerializationTest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public async Task SerializeGenericEnums()
2626

2727
var node = seriMan.WriteValue(value, notNullableOverride:true);
2828
var valueNode = node as ValueDataNode;
29-
Assert.NotNull(valueNode);
29+
Assert.That(valueNode, Is.Not.Null);
3030

3131
var expected = refMan.GetEnumReference(value);
3232
Assert.That(valueNode!.Value, Is.EqualTo(expected));

Content.IntegrationTests/Tests/Toolshed/ToolshedTest.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#nullable enable
1+
#nullable enable
22
using System.Collections.Generic;
33
using Content.IntegrationTests.Pair;
44
using Content.Server.Administration.Managers;
@@ -38,7 +38,7 @@ public async Task TearDownInternal()
3838

3939
protected virtual async Task TearDown()
4040
{
41-
Assert.IsEmpty(_expectedErrors);
41+
Assert.That(_expectedErrors, Is.Empty);
4242
ClearErrors();
4343
}
4444

Content.MapRenderer/Content.MapRenderer.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
</ItemGroup>
1414

1515
<ItemGroup>
16-
<PackageReference Include="NUnit" Version="3.13.3" />
17-
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.3" />
16+
<PackageReference Include="NUnit" />
17+
<PackageReference Include="SixLabors.ImageSharp" />
1818
</ItemGroup>
1919

2020
<Import Project="..\RobustToolbox\MSBuild\Robust.Properties.targets" />

Content.MapRenderer/Painters/EntityPainter.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public void Run(Image canvas, EntityData entity, SharedTransformSystem xformSyst
115115
var (x, y, width, height) = GetRsiFrame(rsi, image, entity, layer, dir);
116116

117117
var rect = new Rectangle(x, y, width, height);
118-
if (!new Rectangle(Point.Empty, image.Size()).Contains(rect))
118+
if (!new Rectangle(Point.Empty, image.Size).Contains(rect))
119119
{
120120
Console.WriteLine($"Invalid layer {rsi!.Path}/{layer.RsiState.Name}.png for entity {_sEntityManager.ToPrettyString(entity.Owner)} at ({entity.X}, {entity.Y})");
121121
return;

Content.Packaging/Content.Packaging.csproj

-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
<ServerGarbageCollection>True</ServerGarbageCollection>
77
</PropertyGroup>
88

9-
<ItemGroup>
10-
<PackageReference Include="NVorbis" Version="0.10.5" PrivateAssets="compile" />
11-
</ItemGroup>
129
<ItemGroup>
1310
<ProjectReference Include="..\RobustToolbox\Robust.Packaging\Robust.Packaging.csproj" />
1411
</ItemGroup>

Content.PatreonParser/Content.PatreonParser.csproj

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
<TargetFramework>net7.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
8+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
89
</PropertyGroup>
910

1011
<ItemGroup>
11-
<PackageReference Include="CsvHelper" Version="30.0.1" />
12+
<PackageReference Include="CsvHelper" />
1213
</ItemGroup>
1314

1415
</Project>

Content.Replay/Content.Replay.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
<Nullable>enable</Nullable>
1111
</PropertyGroup>
1212
<ItemGroup>
13-
<PackageReference Include="Nett" Version="0.15.0" />
14-
<PackageReference Include="JetBrains.Annotations" Version="2020.1.0" PrivateAssets="All" />
13+
<PackageReference Include="Nett" />
14+
<PackageReference Include="JetBrains.Annotations" PrivateAssets="All" />
1515
</ItemGroup>
1616
<ItemGroup>
1717
<ProjectReference Include="..\RobustToolbox\Lidgren.Network\Lidgren.Network.csproj" />

Content.Server.Database/Content.Server.Database.csproj

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<!-- Work around https://github.com/dotnet/project-system/issues/4314 -->
44
<TargetFramework>$(TargetFramework)</TargetFramework>
@@ -12,16 +12,16 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.4">
15+
<PackageReference Include="Microsoft.EntityFrameworkCore.Design">
1616
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1717
<PrivateAssets>all</PrivateAssets>
1818
</PackageReference>
19-
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="7.0.4" />
20-
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.3" />
19+
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" />
20+
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
2121

2222
<!-- Necessary at design time -->
23-
<PackageReference Include="SQLitePCLRaw.provider.e_sqlite3" Version="2.1.4" Condition="'$(UseSystemSqlite)' != 'True' and '$(Configuration)' != 'Release'" />
24-
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.4" Condition="'$(UseSystemSqlite)' != 'True' and '$(Configuration)' != 'Release'" />
23+
<PackageReference Include="SQLitePCLRaw.provider.sqlite3" Condition="'$(UseSystemSqlite)' == 'True' and '$(Configuration)' != 'Release'" />
24+
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Condition="'$(UseSystemSqlite)' != 'True' and '$(Configuration)' != 'Release'" />
2525
</ItemGroup>
2626

2727
<ItemGroup>

Content.Server.Database/Model.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Text.Json;
88
using Content.Shared.Database;
99
using Microsoft.EntityFrameworkCore;
10+
using NpgsqlTypes;
1011

1112
namespace Content.Server.Database
1213
{
@@ -550,7 +551,7 @@ public interface IBanCommon<TUnban> where TUnban : IUnbanCommon
550551
{
551552
int Id { get; set; }
552553
Guid? PlayerUserId { get; set; }
553-
(IPAddress, int)? Address { get; set; }
554+
NpgsqlInet? Address { get; set; }
554555
byte[]? HWId { get; set; }
555556
DateTime BanTime { get; set; }
556557
DateTime? ExpirationTime { get; set; }
@@ -618,8 +619,7 @@ public class ServerBan : IBanCommon<ServerUnban>
618619
/// <summary>
619620
/// CIDR IP address range of the ban. The whole range can match the ban.
620621
/// </summary>
621-
[Column(TypeName = "inet")]
622-
public (IPAddress, int)? Address { get; set; }
622+
public NpgsqlInet? Address { get; set; }
623623

624624
/// <summary>
625625
/// Hardware ID of the banned player.
@@ -808,7 +808,7 @@ public sealed class ServerRoleBan : IBanCommon<ServerRoleUnban>
808808
public Round? Round { get; set; }
809809
public Guid? PlayerUserId { get; set; }
810810
[Required] public TimeSpan PlaytimeAtNote { get; set; }
811-
[Column(TypeName = "inet")] public (IPAddress, int)? Address { get; set; }
811+
public NpgsqlInet? Address { get; set; }
812812
public byte[]? HWId { get; set; }
813813

814814
public DateTime BanTime { get; set; }

0 commit comments

Comments
 (0)