Iceshrimp.NET/Iceshrimp.Frontend/Core/Services/MessageService.cs
2024-11-20 00:48:29 +01:00

86 lines
No EOL
2.1 KiB
C#

using Iceshrimp.Shared.Schemas.Web;
namespace Iceshrimp.Frontend.Core.Services;
internal class MessageService
{
public event EventHandler<NoteResponse>? AnyNoteChanged;
public event EventHandler<NoteResponse>? AnyNoteDeleted;
private readonly Dictionary<(string, Type), EventHandler<NoteResponse>> _noteChangedHandlers = new();
public enum Type
{
Updated,
Deleted
}
public NoteMessageHandler Register(string id, EventHandler<NoteResponse> 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<NoteResponse> 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<NoteResponse> _handler;
private readonly string _id;
private readonly Type _type;
private readonly MessageService _messageService;
public NoteMessageHandler(
EventHandler<NoteResponse> 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;
}
}