61 lines
1.7 KiB
C#
61 lines
1.7 KiB
C#
using System.Text.Json;
|
|
|
|
namespace SharpChat.Messages;
|
|
|
|
public class VirtualMessageStorage : MessageStorage {
|
|
private readonly Dictionary<long, Message> Messages = [];
|
|
|
|
public Task LogMessage(
|
|
long id,
|
|
string type,
|
|
string channelName,
|
|
string senderId,
|
|
string senderName,
|
|
ColourInheritable senderColour,
|
|
int senderRank,
|
|
string senderNick,
|
|
UserPermissions senderPerms,
|
|
object? data = null
|
|
) {
|
|
Messages.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))
|
|
)
|
|
);
|
|
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
public Task<Message?> GetMessage(long seqId) {
|
|
return Task.FromResult(Messages.TryGetValue(seqId, out Message? evt) ? evt : null);
|
|
}
|
|
|
|
public Task DeleteMessage(Message evt) {
|
|
Messages.Remove(evt.Id);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
public Task<IEnumerable<Message>> GetMessages(string channelName, int amount = 20, int offset = 0) {
|
|
IEnumerable<Message> subset = Messages.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<Message>);
|
|
}
|
|
}
|