diff --git a/GLOKON.Baiters.Core/BaitersServer.cs b/GLOKON.Baiters.Core/BaitersServer.cs index 3ff6193..1aa018a 100644 --- a/GLOKON.Baiters.Core/BaitersServer.cs +++ b/GLOKON.Baiters.Core/BaitersServer.cs @@ -11,6 +11,7 @@ using Steamworks.Data; using System.Collections.Concurrent; using GLOKON.Baiters.Core.Enums.Networking; +using GLOKON.Baiters.Core.Models.Game; namespace GLOKON.Baiters.Core { @@ -169,7 +170,6 @@ public bool TryGetPlayer(ulong steamId, out Player? player) public void KickPlayer(ulong steamId) { - SendPacket(new("kick"), DataChannel.GameState, steamId); SendPacket(new("peer_was_kicked") { ["user_id"] = (long)steamId, @@ -269,6 +269,65 @@ public void SendPacket(Packet packet, DataChannel channel, ulong? steamId = null } } + public void SetPlayerCosmetics(ulong steamId, Cosmetics cosmetics) + { + if (TryGetPlayer(steamId, out var player) && player != null) + { + player.Cosmetics = cosmetics; + var cosmeticsPkt = new Dictionary() + { + ["title"] = cosmetics.Title, + ["eye"] = cosmetics.Eye, + ["nose"] = cosmetics.Nose, + ["mouth"] = cosmetics.Mouth, + ["undershirt"] = cosmetics.Undershirt, + ["overshirt"] = cosmetics.Overshirt, + ["legs"] = cosmetics.Legs, + ["hat"] = cosmetics.Hat, + ["species"] = cosmetics.Species, + ["accessory"] = cosmetics.Accessory, + ["pattern"] = cosmetics.Pattern, + ["primary_color"] = cosmetics.PrimaryColor, + ["secondary_color"] = cosmetics.SecondaryColor, + ["tail"] = cosmetics.Tail, + }; + + if (!string.IsNullOrWhiteSpace(cosmetics.Bobber)) + { + cosmeticsPkt.Add("bobber", cosmetics.Bobber); + } + + SendPacket(new("actor_action") + { + ["action"] = "_update_cosmetics", + ["actor_id"] = (long)steamId, + ["params"] = new object[] { cosmeticsPkt, }, + }, DataChannel.ActorAction); + } + } + + public void SetPlayerHeldItem(ulong steamId, HeldItem? item = null) + { + if (TryGetPlayer(steamId, out var player) && player != null) + { + player.HeldItem = item; + var heldItemPkt = new Dictionary(); + if (item != null) + { + heldItemPkt.Add("id", item.Id); + heldItemPkt.Add("size", item.Size); + heldItemPkt.Add("quality", item.Quality); + } + + SendPacket(new("actor_action") + { + ["action"] = "_update_held_item", + ["actor_id"] = (long)steamId, + ["params"] = new object[] { heldItemPkt, }, + }, DataChannel.ActorAction); + } + } + public bool IsAdmin(ulong steamId) { return options.Admins.Contains(steamId); @@ -302,7 +361,7 @@ internal void JoinPlayerLobby(ulong steamId, string playerName) internal virtual void JoinPlayer(ulong steamId, long actorId, Player player) { AddActor(actorId, player); - player.SetActorId(actorId); + player.ActorId = actorId; Log.Information("[{0}] {1} joined the server", steamId, player.FisherName); SendWebLobbyPacket(steamId); UpdatePlayerCount(); @@ -349,7 +408,7 @@ internal void SendActor(long actorId, Actor actor, ulong? steamId = null) instanceActorParams["rot"] = Vector3.Zero; } - instanceActorParams["zone"] = "main_zone"; + instanceActorParams["zone"] = actor.Zone; instanceActorParams["zone_owner"] = -1; instanceActorParams["actor_id"] = actorId; instanceActorParams["creator_id"] = (long)ServerId; @@ -388,7 +447,7 @@ internal void OnPlayerChat(ulong sender, string message) OnChatMessage?.Invoke(sender, message); } - Log.Information("[{sender}] {fisherName}: {message}", sender, fisherName, message); + Log.ForContext("Scope", "ChatLog").Information("[{sender}] {fisherName}: {message}", sender, fisherName, message); } protected abstract void ReceivePackets(); diff --git a/GLOKON.Baiters.Core/Enums/Game/ItemQuality.cs b/GLOKON.Baiters.Core/Enums/Game/ItemQuality.cs new file mode 100644 index 0000000..19876cb --- /dev/null +++ b/GLOKON.Baiters.Core/Enums/Game/ItemQuality.cs @@ -0,0 +1,12 @@ +namespace GLOKON.Baiters.Core.Enums.Game +{ + public enum ItemQuality + { + Normal = 0, + Shining = 1, + Glistening = 2, + Opulent = 3, + Radiant = 4, + Alpha = 5, + } +} diff --git a/GLOKON.Baiters.Core/Models/Actor/Actor.cs b/GLOKON.Baiters.Core/Models/Actor/Actor.cs index 543d7ea..ebcf6a8 100644 --- a/GLOKON.Baiters.Core/Models/Actor/Actor.cs +++ b/GLOKON.Baiters.Core/Models/Actor/Actor.cs @@ -12,6 +12,8 @@ public abstract class Actor(string type, ulong ownerId = 0) public ulong OwnerId { get; } = ownerId; + public string Zone { get; set; } = "main_zone"; + public uint? DespawnTime { get { return _despawnTime; } diff --git a/GLOKON.Baiters.Core/Models/Actor/Player.cs b/GLOKON.Baiters.Core/Models/Actor/Player.cs index f979127..d0237fd 100644 --- a/GLOKON.Baiters.Core/Models/Actor/Player.cs +++ b/GLOKON.Baiters.Core/Models/Actor/Player.cs @@ -1,4 +1,5 @@ using GLOKON.Baiters.Core.Constants; +using GLOKON.Baiters.Core.Models.Game; using System.Numerics; namespace GLOKON.Baiters.Core.Models.Actor @@ -11,11 +12,10 @@ public sealed class Player(ulong steamId, string fisherName, bool isAdmin = fals public bool IsAdmin { get; } = isAdmin; - public long? ActorId { get; private set; } + public long? ActorId { get; set; } - public void SetActorId(long actorId) - { - ActorId = actorId; - } + public Cosmetics? Cosmetics { get; set; } + + public HeldItem? HeldItem { get; set; } } } diff --git a/GLOKON.Baiters.Core/Models/Game/Cosmetics.cs b/GLOKON.Baiters.Core/Models/Game/Cosmetics.cs new file mode 100644 index 0000000..9ed4d28 --- /dev/null +++ b/GLOKON.Baiters.Core/Models/Game/Cosmetics.cs @@ -0,0 +1,35 @@ +namespace GLOKON.Baiters.Core.Models.Game +{ + public sealed class Cosmetics + { + public required string Title { get; set; } + + public required string Eye { get; set; } + + public required string Nose { get; set; } + + public required string Mouth { get; set; } + + public required string Undershirt { get; set; } + + public required string Overshirt { get; set; } + + public required string Legs { get; set; } + + public required string Hat { get; set; } + + public required string Species { get; set; } + + public required string[] Accessory { get; set; } + + public required string Pattern { get; set; } + + public required string PrimaryColor { get; set; } + + public required string SecondaryColor { get; set; } + + public required string Tail { get; set; } + + public string? Bobber { get; set; } + } +} diff --git a/GLOKON.Baiters.Core/Models/Game/HeldItem.cs b/GLOKON.Baiters.Core/Models/Game/HeldItem.cs new file mode 100644 index 0000000..a5ebd80 --- /dev/null +++ b/GLOKON.Baiters.Core/Models/Game/HeldItem.cs @@ -0,0 +1,13 @@ +using GLOKON.Baiters.Core.Enums.Game; + +namespace GLOKON.Baiters.Core.Models.Game +{ + public sealed class HeldItem + { + public required string Id { get; set; } + + public required float Size { get; set; } + + public ItemQuality Quality { get; set; } = ItemQuality.Normal; + } +} diff --git a/GLOKON.Baiters.Core/Packets/Handlers/ActorActionHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/ActorActionHandler.cs index 4b044dd..3fa62b8 100644 --- a/GLOKON.Baiters.Core/Packets/Handlers/ActorActionHandler.cs +++ b/GLOKON.Baiters.Core/Packets/Handlers/ActorActionHandler.cs @@ -1,4 +1,5 @@ using GLOKON.Baiters.Core.Constants; +using GLOKON.Baiters.Core.Enums.Game; using GLOKON.Baiters.Core.Models.Networking; using Serilog; @@ -8,14 +9,74 @@ internal class ActorActionHandler(BaitersServer server) : IPacketHandler { public void Handle(ulong sender, Packet data) { - switch ((string)data["action"]) + string action = (string)data["action"]; + long actorId = (long)data["actor_id"]; + Array actionParams = (Array)data["params"]; + + switch (action) { + case "_update_cosmetics": + return; // TODO: Needs testing + var cosmeticsPkt = (Dictionary)(actionParams.GetValue(0) ?? new Dictionary()); + + if (server.TryGetPlayer(sender, out var playerCosmetic) && playerCosmetic != null) + { + playerCosmetic.Cosmetics = new() + { + Title = (string)cosmeticsPkt["title"], + Eye = (string)cosmeticsPkt["eye"], + Nose = (string)cosmeticsPkt["nose"], + Mouth = (string)cosmeticsPkt["mouth"], + Undershirt = (string)cosmeticsPkt["undershirt"], + Overshirt = (string)cosmeticsPkt["overshirt"], + Legs = (string)cosmeticsPkt["legs"], + Hat = (string)cosmeticsPkt["hat"], + Species = (string)cosmeticsPkt["species"], + Accessory = ((Array)cosmeticsPkt["accessory"]).OfType().ToArray(), + Pattern = (string)cosmeticsPkt["pattern"], + PrimaryColor = (string)cosmeticsPkt["primary_color"], + SecondaryColor = (string)cosmeticsPkt["secondary_color"], + Tail = (string)cosmeticsPkt["tail"], + Bobber = (string?)cosmeticsPkt.GetValueOrDefault("bobber"), + }; + } + break; + case "_update_held_item": + return; // TODO: Needs testing + var heldItemPkt = (Dictionary)(actionParams.GetValue(0) ?? new Dictionary()); + + if (server.TryGetPlayer(sender, out var playerHeldItem) && playerHeldItem != null) + { + playerHeldItem.HeldItem = new() { + Id = (string)heldItemPkt["id"], + Size = (float)heldItemPkt["size"], + Quality = (ItemQuality)heldItemPkt["quality"] + }; + } + break; + case "_sync_sound": + case "_talk": + case "_face_emote": + case "_play_particle": + case "_play_sfx": + case "_sync_strum": + case "_sync_hammer": + case "_sync_punch": + case "queue_free": + case "_change_id": + case "_set_state": + case "_flush": + // TODO: Shall we do something with this? + break; + case "_set_zone": + // TODO: Set actor zone + break; case "_sync_create_bubble": - string chatMssage = (string)(((Array)data["params"]).GetValue(0) ?? -1); + string chatMssage = (string)(actionParams.GetValue(0) ?? -1); server.OnPlayerChat(sender, chatMssage); break; case "_wipe_actor": - long wipeActorId = (long)(((Array)data["params"]).GetValue(0) ?? -1); + long wipeActorId = (long)(actionParams.GetValue(0) ?? -1); if (server.TryGetActor(wipeActorId, out var actor) && actor != null) { if (ActorType.ServerOnly.Contains(actor.Type)) @@ -27,6 +88,11 @@ public void Handle(ulong sender, Packet data) server.RemoveActor(wipeActorId); } break; + + + default: + Log.Verbose("Unknown actor action {0}", action); + break; } } } diff --git a/GLOKON.Baiters.Core/Packets/Handlers/LetterReceivedHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/LetterReceivedHandler.cs new file mode 100644 index 0000000..717e8be --- /dev/null +++ b/GLOKON.Baiters.Core/Packets/Handlers/LetterReceivedHandler.cs @@ -0,0 +1,12 @@ +using GLOKON.Baiters.Core.Models.Networking; + +namespace GLOKON.Baiters.Core.Packets.Handlers +{ + internal class LetterReceivedHandler(BaitersServer server) : IPacketHandler + { + public void Handle(ulong sender, Packet packet) + { + // TODO: Do we need to do anything? + } + } +} diff --git a/GLOKON.Baiters.Core/Packets/Handlers/LetterWasAcceptedHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/LetterWasAcceptedHandler.cs new file mode 100644 index 0000000..64961ef --- /dev/null +++ b/GLOKON.Baiters.Core/Packets/Handlers/LetterWasAcceptedHandler.cs @@ -0,0 +1,12 @@ +using GLOKON.Baiters.Core.Models.Networking; + +namespace GLOKON.Baiters.Core.Packets.Handlers +{ + internal class LetterWasAcceptedHandler(BaitersServer server) : IPacketHandler + { + public void Handle(ulong sender, Packet packet) + { + // TODO: Do we need to do anything? + } + } +} diff --git a/GLOKON.Baiters.Core/Packets/Handlers/LetterWasDeniedHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/LetterWasDeniedHandler.cs new file mode 100644 index 0000000..91f25ed --- /dev/null +++ b/GLOKON.Baiters.Core/Packets/Handlers/LetterWasDeniedHandler.cs @@ -0,0 +1,12 @@ +using GLOKON.Baiters.Core.Models.Networking; + +namespace GLOKON.Baiters.Core.Packets.Handlers +{ + internal class LetterWasDeniedHandler(BaitersServer server) : IPacketHandler + { + public void Handle(ulong sender, Packet packet) + { + // TODO: Do we need to do anything? + } + } +} diff --git a/GLOKON.Baiters.Core/Packets/Handlers/PlayerPunchHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/PlayerPunchHandler.cs new file mode 100644 index 0000000..a693734 --- /dev/null +++ b/GLOKON.Baiters.Core/Packets/Handlers/PlayerPunchHandler.cs @@ -0,0 +1,12 @@ +using GLOKON.Baiters.Core.Models.Networking; + +namespace GLOKON.Baiters.Core.Packets.Handlers +{ + internal class PlayerPunchHandler(BaitersServer server) : IPacketHandler + { + public void Handle(ulong sender, Packet packet) + { + // Nothing to do + } + } +} diff --git a/GLOKON.Baiters.Core/Packets/Handlers/ReceiveWebLobbyHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/ReceiveWebLobbyHandler.cs new file mode 100644 index 0000000..a697cd9 --- /dev/null +++ b/GLOKON.Baiters.Core/Packets/Handlers/ReceiveWebLobbyHandler.cs @@ -0,0 +1,12 @@ +using GLOKON.Baiters.Core.Models.Networking; + +namespace GLOKON.Baiters.Core.Packets.Handlers +{ + internal class ReceiveWebLobbyHandler(BaitersServer server) : IPacketHandler + { + public void Handle(ulong sender, Packet packet) + { + // Nothing to do + } + } +} diff --git a/GLOKON.Baiters.Core/Packets/Handlers/UserJoinedWebLobbyHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/UserJoinedWebLobbyHandler.cs new file mode 100644 index 0000000..9ad6173 --- /dev/null +++ b/GLOKON.Baiters.Core/Packets/Handlers/UserJoinedWebLobbyHandler.cs @@ -0,0 +1,12 @@ +using GLOKON.Baiters.Core.Models.Networking; + +namespace GLOKON.Baiters.Core.Packets.Handlers +{ + internal class UserJoinedWebLobbyHandler(BaitersServer server) : IPacketHandler + { + public void Handle(ulong sender, Packet packet) + { + // Nothing to do + } + } +} diff --git a/GLOKON.Baiters.Core/Packets/PacketManager.cs b/GLOKON.Baiters.Core/Packets/PacketManager.cs index c4e0054..42e6ae8 100644 --- a/GLOKON.Baiters.Core/Packets/PacketManager.cs +++ b/GLOKON.Baiters.Core/Packets/PacketManager.cs @@ -31,7 +31,13 @@ public void Setup() handlers.Add("request_actors", new RequestActorsHandler(server)); handlers.Add("chalk_packet", new ChalkPacketHandler(server)); handlers.Add("message", new MessageHandler(server)); + handlers.Add("letter_recieved", new LetterReceivedHandler(server)); + handlers.Add("letter_was_accepted", new LetterWasAcceptedHandler(server)); + handlers.Add("letter_was_denied", new LetterWasDeniedHandler(server)); + handlers.Add("player_punch", new PlayerPunchHandler(server)); + handlers.Add("user_joined_weblobby", new UserJoinedWebLobbyHandler(server)); handlers.Add("user_left_weblobby", new UserLeftWebLobbyHandler(server)); + handlers.Add("receive_weblobby", new ReceiveWebLobbyHandler(server)); } private void Server_OnPacket(ulong sender, Packet packet) @@ -40,7 +46,14 @@ private void Server_OnPacket(ulong sender, Packet packet) if (handlers.TryGetValue(packet.Type, out var handler) && handler != null) { - handler.Handle(sender, packet); + try + { + handler.Handle(sender, packet); + } + catch (Exception ex) + { + Log.Error(ex, "Failed to handle packet {0} from {1}", packet.Type, sender); + } } else { diff --git a/GLOKON.Baiters.Plugins.BanManager/BanManagerPlugin.cs b/GLOKON.Baiters.Plugins.BanManager/BanManagerPlugin.cs index aebc9f0..3cffc3e 100644 --- a/GLOKON.Baiters.Plugins.BanManager/BanManagerPlugin.cs +++ b/GLOKON.Baiters.Plugins.BanManager/BanManagerPlugin.cs @@ -78,6 +78,28 @@ public override void OnInit() GM.Server.SendMessage(string.Format("[{0}] {1}: {2}", playerBan.Key, playerBan.Value.FisherName, playerBan.Value.Reason ?? "(No Reason Given)"), MessageColour.Information, sender); } }); + GM.Chat.ListenFor("unban", "Un-Ban a player by passing their SteamID", (sender, commandParams) => + { + if (!GM.Server.IsAdmin(sender)) + { + return; + } + + if (commandParams.Length < 1) + { + GM.Server.SendMessage("Invalid unban command, not enough parameters", MessageColour.Error, sender); + return; + } + + bool didParseSteamId = ulong.TryParse(commandParams[0], out var steamId); + if (!didParseSteamId) + { + GM.Server.SendMessage("Invalid SteamID, could not be parsed", MessageColour.Error, sender); + return; + } + + _playerBans.TryRemove(steamId, out _); + }); } public override void OnDestroy() @@ -86,6 +108,7 @@ public override void OnDestroy() GM.Chat.StopListening("ban"); GM.Chat.StopListening("ban.list"); + GM.Chat.StopListening("unban"); File.WriteAllText(_bansFilePath, JsonConvert.SerializeObject(_playerBans)); } diff --git a/GLOKON.Baiters.Server/GLOKON.Baiters.Server.csproj b/GLOKON.Baiters.Server/GLOKON.Baiters.Server.csproj index b966f81..52e80d5 100644 --- a/GLOKON.Baiters.Server/GLOKON.Baiters.Server.csproj +++ b/GLOKON.Baiters.Server/GLOKON.Baiters.Server.csproj @@ -39,6 +39,7 @@ + diff --git a/GLOKON.Baiters.Server/Program.cs b/GLOKON.Baiters.Server/Program.cs index 611920c..cd5b8f1 100644 --- a/GLOKON.Baiters.Server/Program.cs +++ b/GLOKON.Baiters.Server/Program.cs @@ -1,36 +1,16 @@ -using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.AspNetCore; -using Microsoft.Extensions.Logging.Console; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using System.Text.Json.Serialization; using System.Net; using GLOKON.Baiters.Server.Configuration; using Serilog; -using Serilog.Events; -using Serilog.Core; namespace GLOKON.Baiters.Server { public class Program { - public static readonly LoggingLevelSwitch LoggingLevel = new(); - public static void Main(string[] args) { - Log.Logger = new LoggerConfiguration() - .MinimumLevel.ControlledBy(LoggingLevel) - .MinimumLevel.Override("Microsoft.AspNetCore.Mvc.Internal", LogEventLevel.Warning) - .MinimumLevel.Override("Microsoft.AspNetCore.DataProtection", LogEventLevel.Warning) - .MinimumLevel.Override("Microsoft.AspNetCore.Authentication", LogEventLevel.Warning) - .MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning) - .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning) - .MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning) - .WriteTo.Console() - .WriteTo.File("logs/server-.log", rollingInterval: RollingInterval.Day) - .CreateLogger(); - var builder = WebHost.CreateDefaultBuilder(args) .SuppressStatusMessages(true) .ConfigureKestrel((context, kestrelOptions) => diff --git a/GLOKON.Baiters.Server/Server.cs b/GLOKON.Baiters.Server/Server.cs index d17e37c..895bac1 100644 --- a/GLOKON.Baiters.Server/Server.cs +++ b/GLOKON.Baiters.Server/Server.cs @@ -9,21 +9,36 @@ using GLOKON.Baiters.Server.HostedServices; using GLOKON.Baiters.Core.Packets; using GLOKON.Baiters.Core.Chat; +using Serilog.Events; namespace GLOKON.Baiters.Server { - public class Server(IConfiguration configuration) + public class Server { - public IConfiguration Configuration { get; } = configuration; + private readonly IConfiguration _configuration; + + public Server(IConfiguration configuration) + { + _configuration = configuration; + Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(_configuration) + .MinimumLevel.Override("Microsoft.AspNetCore.Mvc.Internal", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore.DataProtection", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore.Authentication", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning) + .CreateLogger(); + } public void ConfigureServices(IServiceCollection services) { services.AddSerilog(); - var serverSection = Configuration.GetRequiredSection("Server"); + var serverSection = _configuration.GetRequiredSection("Server"); ServerOptions serverOptions = serverSection.Get() ?? new(); services.Configure(serverSection); - services.Configure(Configuration.GetRequiredSection("WebFishing")); + services.Configure(_configuration.GetRequiredSection("WebFishing")); services.AddCors(options => { @@ -70,7 +85,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IOptions if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); - Program.LoggingLevel.MinimumLevel = Serilog.Events.LogEventLevel.Debug; } else { diff --git a/GLOKON.Baiters.Server/appsettings.Development.json b/GLOKON.Baiters.Server/appsettings.Development.json index ca31369..0675e21 100644 --- a/GLOKON.Baiters.Server/appsettings.Development.json +++ b/GLOKON.Baiters.Server/appsettings.Development.json @@ -1,6 +1,6 @@ { "Serilog": { - "MinimumLevel": "Debug" + "MinimumLevel": "Verbose" }, "Server": { "LetsEncrypt": { diff --git a/GLOKON.Baiters.Server/appsettings.json b/GLOKON.Baiters.Server/appsettings.json index 957ca14..a1a0783 100644 --- a/GLOKON.Baiters.Server/appsettings.json +++ b/GLOKON.Baiters.Server/appsettings.json @@ -1,6 +1,7 @@ { "Serilog": { "Using": [ + "Serilog.Expressions", "Serilog.Sinks.Console", "Serilog.Sinks.File" ], @@ -10,10 +11,53 @@ "Name": "Console" }, { - "Name": "File", + "Name": "Logger", "Args": { - "path": "Logs/server-.log", - "rollingInterval": "Day" + "configureLogger": { + "Filter": [ + { + "Name": "ByExcluding", + "Args": { + "expression": "Scope = 'ChatLog'" + } + } + ], + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "logs/server-.log", + "rollingInterval": "Day", + "retainedFileCountLimit": 7 + } + } + ] + } + } + }, + { + "Name": "Logger", + "Args": { + "configureLogger": { + "Filter": [ + { + "Name": "ByIncludingOnly", + "Args": { + "expression": "Scope = 'ChatLog'" + } + } + ], + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "logs/chat-.log", + "rollingInterval": "Day", + "retainedFileCountLimit": 7 + } + } + ] + } } } ], diff --git a/GLOKON.Baiters.Server/packages.lock.json b/GLOKON.Baiters.Server/packages.lock.json index 8d45039..5eb9bee 100644 --- a/GLOKON.Baiters.Server/packages.lock.json +++ b/GLOKON.Baiters.Server/packages.lock.json @@ -45,6 +45,15 @@ "Serilog.Sinks.File": "6.0.0" } }, + "Serilog.Expressions": { + "type": "Direct", + "requested": "[5.0.0, )", + "resolved": "5.0.0", + "contentHash": "QhZjXtUcA2QfQRA60m+DfyIfidKsQV7HBstbYEDqzJKMbJH/KnKthkkjciRuYrmFE+scWv1JibC5LlXrdtOUmw==", + "dependencies": { + "Serilog": "4.0.0" + } + }, "Serilog.Settings.Configuration": { "type": "Direct", "requested": "[9.0.0, )",