// // SingleHookManager.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.Options; using NosSmooth.LocalBinding; using NosSmooth.LocalBinding.Hooks; using NosSmooth.LocalBinding.Options; using Remora.Results; namespace NosSmooth.Extensions.SharedBinding.Hooks; /// /// A hook manager for a single NosSmooth instance using shared data. /// public class SingleHookManager : IHookManager { private readonly SharedHookManager _sharedHookManager; private readonly HookManagerOptions _options; private Dictionary _hooks; /// /// Initializes a new instance of the class. /// /// The shared hook manager. /// The hook options. public SingleHookManager(SharedHookManager sharedHookManager, IOptions options) { _hooks = new Dictionary(); _sharedHookManager = sharedHookManager; _options = options.Value; } /// public IPacketSendHook PacketSend => GetHook(IHookManager.PacketSendName); /// public IPacketReceiveHook PacketReceive => GetHook(IHookManager.PacketReceiveName); /// public IPlayerWalkHook PlayerWalk => GetHook(IHookManager.CharacterWalkName); /// public IEntityFollowHook EntityFollow => GetHook(IHookManager.EntityFollowName); /// public IEntityUnfollowHook EntityUnfollow => GetHook(IHookManager.EntityUnfollowName); /// public IPetWalkHook PetWalk => GetHook(IHookManager.PetWalkName); /// public IEntityFocusHook EntityFocus => GetHook(IHookManager.EntityFocusName); /// public IPeriodicHook Periodic => GetHook(IHookManager.PeriodicName); /// public IReadOnlyList Hooks => _hooks.Values.ToList(); /// public IResult Initialize(NosBindingManager bindingManager, NosBrowserManager browserManager) { var hooksResult = _sharedHookManager.InitializeInstance(bindingManager, browserManager, _options); if (!hooksResult.IsDefined(out var hooks)) { return hooksResult; } _hooks = hooks; return Result.FromSuccess(); } /// public void Enable(IEnumerable names) { foreach (var name in names) { var hook = GetHook(name); hook.Enable(); } } /// public void Disable(IEnumerable names) { foreach (var name in names) { var hook = GetHook(name); hook.Disable(); } } /// public void DisableAll() { foreach (var hook in _hooks.Values) { hook.Disable(); } } /// public void EnableAll() { foreach (var hook in _hooks.Values) { hook.Enable(); } } private T GetHook(string name) where T : INostaleHook { if (!_hooks.ContainsKey(name) || _hooks[name] is not T typed) { throw new InvalidOperationException ($"Could not load hook {name}. Did you forget to call IHookManager.Initialize?"); } return typed; } }