sharp-chat/SharpChat/EventStorage/VirtualEventStorage.cs

63 lines
1.9 KiB
C#

using System.Text.Json;
namespace SharpChat.EventStorage;
public class VirtualEventStorage : EventStorage {
private readonly Dictionary<long, StoredEventInfo> Events = [];
public Task AddEvent(
long id,
string type,
string channelName,
string senderId,
string senderName,
ColourInheritable senderColour,
int senderRank,
string senderNick,
UserPermissions senderPerms,
object? data = null,
StoredEventFlags flags = StoredEventFlags.None
) {
Events.Add(
id,
new(
id,
type,
long.TryParse(senderId, out long senderId64) && senderId64 > 0 ? senderId : null,
senderName,
senderColour,
senderRank,
senderPerms,
senderNick,
DateTimeOffset.Now,
null,
channelName,
JsonDocument.Parse(data == null ? "{}" : JsonSerializer.Serialize(data)),
flags
)
);
return Task.CompletedTask;
}
public Task<StoredEventInfo?> GetEvent(long seqId) {
return Task.FromResult(Events.TryGetValue(seqId, out StoredEventInfo? evt) ? evt : null);
}
public Task RemoveEvent(StoredEventInfo evt) {
Events.Remove(evt.Id);
return Task.CompletedTask;
}
public Task<IEnumerable<StoredEventInfo>> GetChannelEventLog(string channelName, int amount = 20, int offset = 0) {
IEnumerable<StoredEventInfo> subset = Events.Values.Where(ev => ev.ChannelName == channelName);
int start = subset.Count() - offset - amount;
if(start < 0) {
amount += start;
start = 0;
}
return Task.FromResult(subset.Skip(start).Take(amount).ToArray() as IEnumerable<StoredEventInfo>);
}
}