sharp-chat/SharpChat/ChatEventManager.cs

101 lines
2.6 KiB
C#
Raw Normal View History

2022-08-30 15:00:58 +00:00
using SharpChat.Events;
using SharpChat.Packet;
using System;
using System.Collections.Generic;
using System.Linq;
namespace SharpChat {
public class ChatEventManager : IDisposable {
private readonly List<IChatEvent> Events = null;
public readonly ChatContext Context;
public bool IsDisposed { get; private set; }
public ChatEventManager(ChatContext context) {
Context = context;
2023-02-07 15:01:56 +00:00
if(!Database.HasDatabase)
Events = new();
2022-08-30 15:00:58 +00:00
}
public void Add(IChatEvent evt) {
2023-02-07 15:01:56 +00:00
if(evt == null)
2022-08-30 15:00:58 +00:00
throw new ArgumentNullException(nameof(evt));
if(Events != null)
lock(Events)
Events.Add(evt);
if(Database.HasDatabase)
Database.LogEvent(evt);
}
public void Remove(IChatEvent evt) {
2023-02-07 15:01:56 +00:00
if(evt == null)
2022-08-30 15:00:58 +00:00
return;
2023-02-07 15:01:56 +00:00
if(Events != null)
lock(Events)
2022-08-30 15:00:58 +00:00
Events.Remove(evt);
2023-02-07 15:01:56 +00:00
if(Database.HasDatabase)
2022-08-30 15:00:58 +00:00
Database.DeleteEvent(evt);
Context.Send(new ChatMessageDeletePacket(evt.SequenceId));
}
public IChatEvent Get(long seqId) {
2023-02-07 15:01:56 +00:00
if(seqId < 1)
2022-08-30 15:00:58 +00:00
return null;
2023-02-07 15:01:56 +00:00
if(Database.HasDatabase)
2022-08-30 15:00:58 +00:00
return Database.GetEvent(seqId);
2023-02-07 15:01:56 +00:00
if(Events != null)
lock(Events)
2022-08-30 15:00:58 +00:00
return Events.FirstOrDefault(e => e.SequenceId == seqId);
return null;
}
public IEnumerable<IChatEvent> GetTargetLog(IPacketTarget target, int amount = 20, int offset = 0) {
2023-02-07 15:01:56 +00:00
if(Database.HasDatabase)
2022-08-30 15:00:58 +00:00
return Database.GetEvents(target, amount, offset).Reverse();
2023-02-07 15:01:56 +00:00
if(Events != null)
lock(Events) {
2022-08-30 15:00:58 +00:00
IEnumerable<IChatEvent> subset = Events.Where(e => e.Target == target || e.Target == null);
int start = subset.Count() - offset - amount;
if(start < 0) {
amount += start;
start = 0;
}
return subset.Skip(start).Take(amount).ToList();
}
return Enumerable.Empty<IChatEvent>();
}
2023-02-07 15:01:56 +00:00
~ChatEventManager() {
DoDispose();
}
2022-08-30 15:00:58 +00:00
2023-02-07 15:01:56 +00:00
public void Dispose() {
DoDispose();
GC.SuppressFinalize(this);
}
2022-08-30 15:00:58 +00:00
2023-02-07 15:01:56 +00:00
private void DoDispose() {
if(IsDisposed)
2022-08-30 15:00:58 +00:00
return;
IsDisposed = true;
Events?.Clear();
}
}
}