Made MessageStorage.GetMessages more flexible.

This commit is contained in:
flash 2025-04-29 12:50:32 +00:00
commit 0bc025e5f8
Signed by: flash
GPG key ID: 2C9C2C574D47FE3E
5 changed files with 167 additions and 80 deletions
SharpChat.SQLite

View file

@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using SharpChat.Data;
using SharpChat.Messages;
using System.Data;
using System.Data.Common;
@ -79,50 +80,57 @@ public class SQLiteMessageStorage(ILogger logger, SQLiteConnection conn) : Messa
new SQLiteParameter("id", id)
);
if(reader is null)
return null;
while(reader.Read()) {
Message evt = ReadMessage(reader);
if(evt != null)
return evt;
}
return reader?.Read() == true ? ReadMessage(reader) : null;
} catch(SQLiteException ex) {
logger.ZLogError($"Error in GetMessage(): {ex}");
return null;
}
return null;
}
public async Task<IEnumerable<Message>> GetMessages(string channelName, int amount = 20, int offset = 0) {
List<Message> msgs = [];
public async Task<IEnumerable<Message>> GetMessages(
string? channelName = null,
int? take = 20,
long? beforeId = null,
bool includeDeleted = false
) {
List<SQLiteParameter> parameters = [];
bool firstParam = true;
StringBuilder qb = new();
qb.Append("SELECT msg_id, msg_type, msg_created, msg_deleted, msg_channel, msg_data");
qb.Append(", msg_sender, msg_sender_name, msg_sender_colour, msg_sender_rank, msg_sender_nick, msg_sender_perms");
qb.Append(" FROM messages");
if(!includeDeleted) {
firstParam = false;
qb.Append(" WHERE msg_deleted IS NULL");
}
if(!string.IsNullOrEmpty(channelName)) {
qb.AppendFormat(" {0} (msg_channel = @channel OR msg_channel IS NULL)", firstParam ? "WHERE" : "AND");
parameters.Add(new SQLiteParameter("channel", channelName));
firstParam = false;
}
if(beforeId.HasValue) {
qb.AppendFormat(" {0} msg_id < @before", firstParam ? "WHERE" : "AND");
parameters.Add(new SQLiteParameter("before", beforeId.Value));
}
qb.Append(" ORDER BY msg_id DESC");
if(take.HasValue) {
qb.Append(" LIMIT @take");
parameters.Add(new SQLiteParameter("take", take.Value));
}
string query = string.Format("SELECT * FROM ({0}) AS _ ORDER BY msg_id ASC", qb);
try {
using DbDataReader? reader = await conn.RunQuery(
"SELECT msg_id, msg_type, msg_created, msg_deleted, msg_channel, msg_sender, msg_sender_name, msg_sender_colour, msg_sender_rank, msg_sender_nick, msg_sender_perms, msg_data"
+ " FROM messages"
+ " WHERE msg_deleted IS NULL AND (msg_channel = @channel OR msg_channel IS NULL)"
+ " AND msg_id > @offset"
+ " ORDER BY msg_id DESC"
+ " LIMIT @amount",
new SQLiteParameter("channel", channelName),
new SQLiteParameter("amount", amount),
new SQLiteParameter("offset", offset)
);
if(reader is null)
return msgs;
while(reader.Read()) {
Message evt = ReadMessage(reader);
if(evt != null)
msgs.Add(evt);
}
DbDataReader? reader = await conn.RunQuery(query, [.. parameters]);
return reader is null ? [] : new DbObjectEnumerable<Message>(reader, ReadMessage);
} catch(SQLiteException ex) {
logger.ZLogError($"Error in GetMessages(): {ex}");
logger.ZLogError($"Error in GetMessages({channelName}, {take}, {beforeId}, {includeDeleted}): {ex}");
return [];
}
msgs.Reverse();
return msgs;
}
}