using Iceshrimp.Shared.Schemas.Web; namespace Iceshrimp.Frontend.Core.Services; internal class MessageService { public event EventHandler? AnyNoteChanged; public event EventHandler? AnyNoteDeleted; private readonly Dictionary<(string, Type), EventHandler> _noteChangedHandlers = new(); public enum Type { Updated, Deleted } public NoteMessageHandler Register(string id, EventHandler func, Type type) { var tuple = (id, type); if (_noteChangedHandlers.ContainsKey(tuple)) { _noteChangedHandlers[tuple] += func; } else { _noteChangedHandlers.Add(tuple, func); } return new NoteMessageHandler(func, id, type, this); } private void Unregister(string id, EventHandler func, Type type) { var tuple = (id, type); if (_noteChangedHandlers.ContainsKey(tuple)) { #pragma warning disable CS8601 _noteChangedHandlers[tuple] -= func; #pragma warning restore CS8601 } else { throw new ArgumentException("Tried to unregister from callback that doesn't exist"); } } public class NoteMessageHandler : IDisposable { private readonly EventHandler _handler; private readonly string _id; private readonly Type _type; private readonly MessageService _messageService; public NoteMessageHandler( EventHandler handler, string id, Type type, MessageService messageService ) { _handler = handler; _id = id; _type = type; _messageService = messageService; } public void Dispose() { _messageService.Unregister(_id, _handler, _type); } } public Task UpdateNoteAsync(NoteResponse note) { AnyNoteChanged?.Invoke(this, note); _noteChangedHandlers.TryGetValue((note.Id, Type.Updated), out var xHandler); xHandler?.Invoke(this, note); return Task.CompletedTask; } public Task DeleteNoteAsync(NoteResponse note) { AnyNoteDeleted?.Invoke(this, note); _noteChangedHandlers.TryGetValue((note.Id, Type.Deleted), out var xHandler); xHandler?.Invoke(this, note); return Task.CompletedTask; } }