using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; namespace SharpChat.EventStorage { public class VirtualEventStorage : IEventStorage { private readonly Dictionary Events = new(); public void AddEvent( long id, string type, object? data = null, StoredEventFlags flags = StoredEventFlags.None ) { AddEvent(id, type, null, 0, null, ChatColour.None, 0, null, 0, data, flags); } public void AddEvent( long id, string type, string? channelName, object? data = null, StoredEventFlags flags = StoredEventFlags.None ) { AddEvent(id, type, channelName, 0, null, ChatColour.None, 0, null, 0, data, flags); } public void AddEvent( long id, string type, long senderId, string? senderName, ChatColour senderColour, int senderRank, string? senderNick, ChatUserPermissions senderPerms, object? data = null, StoredEventFlags flags = StoredEventFlags.None ) { AddEvent(id, type, null, senderId, senderName, senderColour, senderRank, senderNick, senderPerms, data, flags); } public void AddEvent( long id, string type, string? channelName, long senderId, string? senderName, ChatColour senderColour, int senderRank, string? senderNick, ChatUserPermissions senderPerms, object? data = null, StoredEventFlags flags = StoredEventFlags.None ) { if(type == null) throw new ArgumentNullException(nameof(type)); // VES is meant as an emergency fallback but this is something else JsonDocument hack = JsonDocument.Parse(data == null ? "{}" : JsonSerializer.Serialize(data)); Events.Add(id, new(id, type, senderId < 1 ? null : new ChatUser( senderId, senderName, senderColour, senderRank, senderPerms, senderNick ), DateTimeOffset.Now, null, channelName, hack, flags)); } public long AddEvent(string type, ChatUser user, ChatChannel channel, object? data = null, StoredEventFlags flags = StoredEventFlags.None) { if(type == null) throw new ArgumentNullException(nameof(type)); long id = SharpId.Next(); AddEvent( id, type, channel?.Name, user?.UserId ?? 0, user?.UserName, user?.Colour ?? ChatColour.None, user?.Rank ?? 0, user?.NickName, user?.Permissions ?? 0, data, flags ); return id; } public StoredEventInfo? GetEvent(long seqId) { return Events.TryGetValue(seqId, out StoredEventInfo? evt) ? evt : null; } public void RemoveEvent(StoredEventInfo evt) { Events.Remove(evt.Id); } public IEnumerable GetChannelEventLog(string channelName, int amount = 20, int offset = 0) { IEnumerable subset = Events.Values.Where(ev => ev.ChannelName == channelName); int start = subset.Count() - offset - amount; if(start < 0) { amount += start; start = 0; } return subset.Skip(start).Take(amount).ToArray(); } } }