Made MessageStorage.GetMessages more flexible.
This commit is contained in:
parent
eae379e933
commit
0bc025e5f8
5 changed files with 167 additions and 80 deletions
SharpChat.SQLite
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue