diff --git a/Directory.Build.props b/Directory.Build.props index 68c66af..a514080 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,11 +1,11 @@ true - $(NoWarn);CS1591,MA0048,MA0011,MA0015,MA0051,MA0002,MA0005,MA0004,MA0016,MA0069,MA0006,MA0076,MA0003,MA0004,MA0064 + $(NoWarn),CS1591,MA0048,MA0011,MA0015,MA0051,MA0002,MA0005,MA0004,MA0016,MA0069,MA0006,MA0076,MA0003,MA0004,MA0064 - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Fragment.NetSlum.Console/Fragment.NetSlum.Console.csproj b/src/Fragment.NetSlum.Console/Fragment.NetSlum.Console.csproj index c2e122b..75ae876 100644 --- a/src/Fragment.NetSlum.Console/Fragment.NetSlum.Console.csproj +++ b/src/Fragment.NetSlum.Console/Fragment.NetSlum.Console.csproj @@ -7,9 +7,9 @@ - + - + diff --git a/src/Fragment.NetSlum.Core/Fragment.NetSlum.Core.csproj b/src/Fragment.NetSlum.Core/Fragment.NetSlum.Core.csproj index 3b61508..bae9fdd 100644 --- a/src/Fragment.NetSlum.Core/Fragment.NetSlum.Core.csproj +++ b/src/Fragment.NetSlum.Core/Fragment.NetSlum.Core.csproj @@ -8,16 +8,16 @@ - + IPNetwork2 - - - + + + - + diff --git a/src/Fragment.NetSlum.Networking/Packets/Request/BaseRequest.cs b/src/Fragment.NetSlum.Networking/Packets/Request/BaseRequest.cs index 83c5af0..631687e 100644 --- a/src/Fragment.NetSlum.Networking/Packets/Request/BaseRequest.cs +++ b/src/Fragment.NetSlum.Networking/Packets/Request/BaseRequest.cs @@ -21,8 +21,7 @@ public abstract class BaseRequest protected static ValueTask> SingleMessage(FragmentMessage response) => ValueTask.FromResult(SingleMessageAsync(response)); - protected static ICollection SingleMessageAsync(FragmentMessage response) => - new[] { response }; + protected static ICollection SingleMessageAsync(FragmentMessage response) => [response]; protected static ValueTask> NoResponse() => ValueTask.FromResult>(Array.Empty()); diff --git a/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/GetGuildDonationSettingsRequest.cs b/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/GetGuildDonationSettingsRequest.cs index a35c7d9..b84c77c 100644 --- a/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/GetGuildDonationSettingsRequest.cs +++ b/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/GetGuildDonationSettingsRequest.cs @@ -28,7 +28,7 @@ public override async ValueTask> GetResponse(Fragme .AsNoTracking() .FirstOrDefaultAsync(g => g.Id == session.GuildId); - var isGuildMaster = guild != null && guild.LeaderId == session.GuildId; + var isGuildMaster = guild != null && guild.LeaderId == session.CharacterId; _logger.LogInformation("Guild donation settings requested for guild ID {GuildId} by player {PlayerId}({PlayerName}). Is Guild Master? {IsGuildMaster}", session.GuildId, session.CharacterId, session.CharacterInfo!.CharacterName, isGuildMaster); diff --git a/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/UpdateGuildShopItemRequest.cs b/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/UpdateGuildShopItemRequest.cs index bc93376..d889e0a 100644 --- a/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/UpdateGuildShopItemRequest.cs +++ b/src/Fragment.NetSlum.Networking/Packets/Request/Guilds/UpdateGuildShopItemRequest.cs @@ -10,6 +10,7 @@ using Fragment.NetSlum.Networking.Sessions; using Fragment.NetSlum.Persistence; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; namespace Fragment.NetSlum.Networking.Packets.Request.Guilds; @@ -17,33 +18,45 @@ namespace Fragment.NetSlum.Networking.Packets.Request.Guilds; public class UpdateGuildShopItemRequest : BaseRequest { private readonly FragmentContext _database; + private readonly ILogger _logger; - public UpdateGuildShopItemRequest(FragmentContext database) + public UpdateGuildShopItemRequest(FragmentContext database, ILogger logger) { _database = database; + _logger = logger; } - public override ValueTask> GetResponse(FragmentTcpSession session, FragmentMessage request) + public override async ValueTask> GetResponse(FragmentTcpSession session, FragmentMessage request) { var reader = new SpanReader(request.Data.Span); var guildId = reader.ReadUInt16(); var itemId = reader.ReadInt32(); var generalPrice = reader.ReadUInt32(); var memberPrice = reader.ReadUInt32(); - var allowGeneral = reader.ReadBool(); - var allowMember = reader.ReadBool(); - - _database.GuildShopItems - .Where(gsi => gsi.Id == itemId && gsi.GuildId == guildId) - .ExecuteUpdate(e => - e - .SetProperty(p => p.Price, v => generalPrice) - .SetProperty(p => p.MemberPrice, v => memberPrice) - .SetProperty(p => p.AvailableForGeneral, v => allowGeneral) - .SetProperty(p => p.AvailableForMember, v => allowMember) - .SetProperty(p => p.UpdatedAt, v => DateTime.UtcNow) - ); - - return SingleMessage(new UpdateGuildShopItemResponse().Build()); + var allowGeneral = reader.ReadByte() == 0x01; + var allowMember = reader.ReadByte() == 0x01; + + + var gsi = _database.GuildShopItems.FirstOrDefault(gsi => gsi.ItemId == itemId && gsi.GuildId == guildId); + + if (gsi == null) + { + _logger.LogWarning("Player {PlayerId} ({PlayerName}) attempted to update unknown guild item {ItemId} for guild {GuildId}", + session.CharacterId, session.CharacterInfo!.CharacterName, itemId, guildId); + + return SingleMessageAsync(new UpdateGuildShopItemResponse().Build()); + } + + gsi.Price = generalPrice; + gsi.MemberPrice = memberPrice; + gsi.AvailableForGeneral = allowGeneral; + gsi.AvailableForMember = allowMember; + + _logger.LogWarning("Player {PlayerId} ({PlayerName}) updated availability/price to: General: {GeneralPrice}({AvailableGeneral}) Member: {MemberPrice}({AvailableMember}) for item {ItemId} in guild {GuildId}", + session.CharacterId, session.CharacterInfo!.CharacterName, generalPrice, allowGeneral, memberPrice, allowMember, itemId, guildId); + + await _database.SaveChangesAsync(); + + return SingleMessageAsync(new UpdateGuildShopItemResponse().Build()); } } diff --git a/src/Fragment.NetSlum.Networking/Packets/Response/Guilds/UpdateGuildItemPricingAvailabilityRequest.cs b/src/Fragment.NetSlum.Networking/Packets/Response/Guilds/UpdateGuildItemPricingAvailabilityRequest.cs index 76aa8a0..ae81964 100644 --- a/src/Fragment.NetSlum.Networking/Packets/Response/Guilds/UpdateGuildItemPricingAvailabilityRequest.cs +++ b/src/Fragment.NetSlum.Networking/Packets/Response/Guilds/UpdateGuildItemPricingAvailabilityRequest.cs @@ -41,7 +41,7 @@ public override async ValueTask> GetResponse(Fragme .AsNoTracking() .FirstOrDefaultAsync(g => g.Id == session.GuildId); - var isGuildMaster = guild != null && guild.LeaderId == session.GuildId; + var isGuildMaster = guild != null && guild.LeaderId == session.CharacterId; var donatedItem = _guildShopContextAccessor.Current.Donation; @@ -70,6 +70,9 @@ public override async ValueTask> GetResponse(Fragme if (isGuildMaster) { + _logger.LogWarning("Player {PlayerId} ({PlayerName}) is guild master for guild {GuildId}. Setting availability/price to: General: {GeneralPrice}({AvailableGeneral}) Member: {MemberPrice}({AvailableMember})", + session.CharacterId, session.CharacterInfo!.CharacterName, session.GuildId, generalPrice, isGeneral, memberPrice, isMember); + guildItem.Price = generalPrice; guildItem.MemberPrice = memberPrice; guildItem.AvailableForGeneral = isGeneral; diff --git a/src/Fragment.NetSlum.Networking/Sessions/FragmentTcpSession.cs b/src/Fragment.NetSlum.Networking/Sessions/FragmentTcpSession.cs index e6b021e..a10f25a 100644 --- a/src/Fragment.NetSlum.Networking/Sessions/FragmentTcpSession.cs +++ b/src/Fragment.NetSlum.Networking/Sessions/FragmentTcpSession.cs @@ -11,6 +11,7 @@ using Fragment.NetSlum.Networking.Objects; using Fragment.NetSlum.Networking.Pipeline; using Fragment.NetSlum.Networking.Stores; +using Fragment.NetSlum.Persistence; using Fragment.NetSlum.TcpServer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -134,6 +135,9 @@ protected override async Task OnReceived(Memory data, CancellationToken ca /// protected internal void Send(List data) { + // To keep entities from becoming stale and save memory, clear the EF change tracker. + ServiceScope.ServiceProvider.GetRequiredService().ChangeTracker.Clear(); + var respData = _packetPipeline.Encode(data, CancellationToken.None).Span; Send(respData); diff --git a/src/Fragment.NetSlum.Persistence/Fragment.NetSlum.Persistence.csproj b/src/Fragment.NetSlum.Persistence/Fragment.NetSlum.Persistence.csproj index 5a06f3b..bfed382 100644 --- a/src/Fragment.NetSlum.Persistence/Fragment.NetSlum.Persistence.csproj +++ b/src/Fragment.NetSlum.Persistence/Fragment.NetSlum.Persistence.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Fragment.NetSlum.Server/Fragment.NetSlum.Server.csproj b/src/Fragment.NetSlum.Server/Fragment.NetSlum.Server.csproj index 3652c5b..50516c1 100644 --- a/src/Fragment.NetSlum.Server/Fragment.NetSlum.Server.csproj +++ b/src/Fragment.NetSlum.Server/Fragment.NetSlum.Server.csproj @@ -11,29 +11,29 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - + + + + + + + - + diff --git a/test/Fragment.NetSlum.Networking.Test/Fragment.NetSlum.Networking.Test.csproj b/test/Fragment.NetSlum.Networking.Test/Fragment.NetSlum.Networking.Test.csproj index 8dcea23..8dc4758 100644 --- a/test/Fragment.NetSlum.Networking.Test/Fragment.NetSlum.Networking.Test.csproj +++ b/test/Fragment.NetSlum.Networking.Test/Fragment.NetSlum.Networking.Test.csproj @@ -7,14 +7,14 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all