Split MariaDB message storage out into its own library.
This commit is contained in:
parent
8eff4127b5
commit
f1d4051fb5
23 changed files with 255 additions and 228 deletions
SharpChatCommon/Messages
35
SharpChatCommon/Messages/Message.cs
Normal file
35
SharpChatCommon/Messages/Message.cs
Normal 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}";
|
||||
}
|
10
SharpChatCommon/Messages/MessageFlags.cs
Normal file
10
SharpChatCommon/Messages/MessageFlags.cs
Normal 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,
|
||||
}
|
20
SharpChatCommon/Messages/MessageStorage.cs
Normal file
20
SharpChatCommon/Messages/MessageStorage.cs
Normal 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);
|
||||
}
|
63
SharpChatCommon/Messages/VirtualMessageStorage.cs
Normal file
63
SharpChatCommon/Messages/VirtualMessageStorage.cs
Normal 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>);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue