Split MariaDB message storage out into its own library.

This commit is contained in:
flash 2025-04-27 01:54:46 +00:00
parent 8eff4127b5
commit f1d4051fb5
Signed by: flash
GPG key ID: 2C9C2C574D47FE3E
23 changed files with 255 additions and 228 deletions

View file

@ -0,0 +1,35 @@
using System.Text.Json;
namespace SharpChat.Messages;
public class Message(
long id,
string type,
string? senderId,
string senderName,
ColourInheritable senderColour,
int senderRank,
UserPermissions senderPermissions,
string senderNickName,
DateTimeOffset created,
DateTimeOffset? deleted,
string? channelName,
JsonDocument data,
MessageFlags flags
) {
public long Id { get; } = id;
public string Type { get; } = type;
public string? SenderId { get; } = senderId;
public string SenderName { get; } = senderName;
public ColourInheritable SenderColour { get; } = senderColour;
public int SenderRank { get; } = senderRank;
public UserPermissions SenderPermissions { get; } = senderPermissions;
public string SenderNickName { get; } = senderNickName;
public DateTimeOffset Created { get; } = created;
public DateTimeOffset? Deleted { get; } = deleted;
public string? ChannelName { get; } = channelName;
public MessageFlags Flags { get; } = flags;
public JsonDocument Data { get; } = data;
public string SenderLegacyName => string.IsNullOrWhiteSpace(SenderNickName) ? SenderName : $"~{SenderNickName}";
}

View file

@ -0,0 +1,10 @@
namespace SharpChat.Messages;
[Flags]
public enum MessageFlags {
None = 0,
Action = 1,
Broadcast = 1 << 1,
Log = 1 << 2,
Private = 1 << 3,
}

View file

@ -0,0 +1,20 @@
namespace SharpChat.Messages;
public interface MessageStorage {
Task LogMessage(
long msgId,
string type,
string channelName,
string senderId,
string senderName,
ColourInheritable senderColour,
int senderRank,
string senderNick,
UserPermissions senderPerms,
object? data = null,
MessageFlags flags = MessageFlags.None
);
Task DeleteMessage(Message evt);
Task<Message?> GetMessage(long msgId);
Task<IEnumerable<Message>> GetMessages(string channelName, int amount = 20, int offset = 0);
}

View file

@ -0,0 +1,63 @@
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,
MessageFlags flags = MessageFlags.None
) {
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)),
flags
)
);
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>);
}
}