// // FollowResponder.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 NosSmooth.Comms.Data.Responders; using NosSmooth.Comms.Inject.Messages; using NosSmooth.LocalBinding; using NosSmooth.LocalBinding.Hooks; using NosSmooth.LocalBinding.Structs; using Remora.Results; namespace NosSmooth.Comms.Inject.MessageResponders; /// /// A responder to . /// public class FollowResponder : IMessageResponder { private readonly NosBrowserManager _browserManager; private readonly NosThreadSynchronizer _synchronizer; private readonly IHookManager _hookManager; /// /// Initializes a new instance of the class. /// /// The browser manager. /// The synchronizer. /// The hook manager. public FollowResponder (NosBrowserManager browserManager, NosThreadSynchronizer synchronizer, IHookManager hookManager) { _browserManager = browserManager; _synchronizer = synchronizer; _hookManager = hookManager; } /// public async Task Respond(FollowMessage message, CancellationToken ct = default) { MapBaseObj? entity = null; if (message.EntityId is not null) { var entityResult = _browserManager.SceneManager.FindEntity(message.EntityId.Value); if (!entityResult.IsDefined(out entity)) { return Result.FromError(new NotFoundError($"Entity with id {message.EntityId} not found.")); } } return await _synchronizer.SynchronizeAsync ( () => { if (entity is null) { _hookManager.EntityUnfollow.WrapperFunction(); } else { _hookManager.EntityFollow.WrapperFunction(entity); } return Result.FromSuccess(); }, ct ); } }