// // 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.Errors; 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 (!_browserManager.SceneManager.TryGet(out var sceneManager)) { return new OptionalNotPresentError(nameof(SceneManager)); } if (message.EntityId is not null) { var entityResult = 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) { return _hookManager.EntityUnfollow.MapResult ( unfollow => unfollow.WrapperFunction.MapResult ( wrapper => { wrapper(); return Result.FromSuccess(); } ) ); } return _hookManager.EntityFollow.MapResult ( unfollow => unfollow.WrapperFunction.MapResult ( wrapper => { wrapper(entity); return Result.FromSuccess(); } ) ); }, ct ); } }