// // MatesSkillResponder.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using Microsoft.Extensions.Logging; using NosSmooth.Core.Extensions; using NosSmooth.Core.Packets; using NosSmooth.Data.Abstractions; using NosSmooth.Game.Data.Characters; using NosSmooth.Game.Data.Mates; using NosSmooth.Game.Events.Core; using NosSmooth.Game.Events.Mates; using NosSmooth.Packets.Server.Skills; using Remora.Results; namespace NosSmooth.Game.PacketHandlers.Skills; /// /// Responds to petski and pski packets. /// public class MatesSkillResponder : IPacketResponder, IPacketResponder { private readonly Game _game; private readonly EventDispatcher _eventDispatcher; private readonly IInfoService _infoService; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// The game. /// The event dispatcher. /// The info service. /// The logger. public MatesSkillResponder ( Game game, EventDispatcher eventDispatcher, IInfoService infoService, ILogger logger ) { _game = game; _eventDispatcher = eventDispatcher; _infoService = infoService; _logger = logger; } /// public async Task Respond(PacketEventArgs packetArgs, CancellationToken ct = default) { var packet = packetArgs.Packet; Skill? skill = null; if (packet.SkillVNum is not null) { var skillInfoResult = await _infoService.GetSkillInfoAsync(packet.SkillVNum.Value, ct); if (!skillInfoResult.IsDefined(out var skillInfo)) { _logger.LogWarning ( "Could not obtain skill info for vnum {vnum}: {error}", packet.SkillVNum.Value, skillInfoResult.ToFullString() ); } skill = new Skill(packet.SkillVNum.Value, null, skillInfo); } var mates = await _game.CreateOrUpdateMatesAsync ( () => new Mates { PetSkill = skill }, m => { m.PetSkill = skill; return m; }, ct: ct ); return await _eventDispatcher.DispatchEvent ( new PetSkillReceivedEvent(mates?.CurrentPet?.Pet, skill), ct ); } /// public async Task Respond(PacketEventArgs packetArgs, CancellationToken ct = default) { var packet = packetArgs.Packet; var skills = new List(); foreach (var skillVNum in packet.SkillVNums) { if (skillVNum is null) { continue; } var skillInfoResult = await _infoService.GetSkillInfoAsync(skillVNum.Value, ct); if (!skillInfoResult.IsDefined(out var skillInfo)) { _logger.LogWarning ( "Could not obtain skill info for vnum {vnum}: {error}", skillVNum, skillInfoResult.ToFullString() ); } skills.Add(new Skill(skillVNum.Value, null, skillInfo)); } if (skills.Count == 0) { skills = null; } var mates = await _game.CreateOrUpdateMatesAsync ( () => new Mates { PartnerSkills = skills }, m => { m.PartnerSkills = skills; return m; }, ct: ct ); return await _eventDispatcher.DispatchEvent ( new PartnerSkillsReceivedEvent(mates?.CurrentPartner?.Partner, skills ?? Array.Empty().ToList()), ct ); } }