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