From d35ce7a255bd2aac3e30cd872d3b56170d7f2d92 Mon Sep 17 00:00:00 2001 From: CrescentLeaf Date: Sat, 17 Jan 2026 00:32:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(wip):=20=E6=9B=B4=E5=8A=A0=E6=8A=BD?= =?UTF-8?q?=E8=B1=A1=E7=9A=84=E8=8E=B7=E5=8F=96=E5=8E=86=E5=8F=B2=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E6=96=B9=E5=BC=8F=20*=20=E4=BB=8E=E6=9F=90?= =?UTF-8?q?=E5=A4=84=E4=BD=9C=E4=B8=BA=E9=94=9A=E7=82=B9=E5=90=97......?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/ChatApi.ts | 2 +- server/data/MessagesManager.ts | 46 ++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/server/api/ChatApi.ts b/server/api/ChatApi.ts index 6ffecb9..403e209 100644 --- a/server/api/ChatApi.ts +++ b/server/api/ChatApi.ts @@ -121,7 +121,7 @@ export default class ChatApi extends BaseApi { code: 200, msg: "成功", data: { - messages: MessagesManager.getInstanceForChat(chat)[args.page ? 'getMessagesWithPage' : 'getMessagesWithOffset'](args.limit as number | undefined, (args.page ? args.page : args.offset) as number).reverse(), + messages: MessagesManager.getInstanceForChat(chat)[args.page ? 'getMessagesWithPage' : 'getMessagesWithOffset'](args.limit as number | undefined, (args.page ? args.page : args.offset) as number), }, } }) diff --git a/server/data/MessagesManager.ts b/server/data/MessagesManager.ts index 46d7fd5..f916db3 100644 --- a/server/data/MessagesManager.ts +++ b/server/data/MessagesManager.ts @@ -36,6 +36,9 @@ export default class MessagesManager { protected getTableName() { return `messages_${this.chat.bean.id}`.replaceAll('-', '_') } + /** + * 添加一条消息 + */ addMessage({ text, user_id, @@ -55,19 +58,58 @@ export default class MessagesManager { time || Date.now() ).lastInsertRowid } + /** + * 添加一条无用户信息的系统消息 + */ addSystemMessage(text: string) { this.addMessage({ text }) } - getMessagesWithOffset(limit: number | undefined | null, offset: number = 0) { + /** + * 从最新消息开始偏移某些量向**前**获取 n 条消息 (顺序: 从新到旧) + * @param limit 获取消息的数量 + * @param offset 偏移量 + */ + getMessagesWithOffset(limit: number | undefined | null, offset: number = 0): MessageBean[] { const ls = MessagesManager.database.prepare(`SELECT * FROM ${this.getTableName()} ORDER BY id DESC LIMIT ? OFFSET ?;`).all(limit || PageFetchMaxLimit, offset) as unknown as MessageBean[] return ls.map((v) => ({ ...v, chat_id: this.chat.bean.id, - })) + })).reverse() } + /** + * 从最新消息开始偏移某些量向**前**获取第 n 页消息 (顺序: 从新到旧) + * @param limit 获取消息的数量 + * @param page 页数 + */ getMessagesWithPage(limit: number | undefined | null, page: number = 0) { return this.getMessagesWithOffset(limit, (limit || PageFetchMaxLimit) * page) } + /** + * 获取最新的消息的 ID + */ + getNewestMessageId() { + return MessagesManager.database.prepare(`SELECT id FROM ${this.getTableName()} ORDER BY id DESC LIMIT 1;`).all()[0].id as number | undefined + } + /** + * 从某消息开始获取包括其在内往**前**的 n 条消息 (顺序: 从新到旧) + * @param limit 获取消息的数量 + * @param msg_id 从哪条开始? (-1 = 最新) + */ + getMessagesEndWith(limit: number | undefined | null, msg_id: number) { + const newestMessageId = this.getNewestMessageId() + const offset = (msg_id == -1 || newestMessageId == null) ? 0 : (newestMessageId - msg_id) + return this.getMessagesWithOffset(limit, offset) + } + /** + * 从某消息开始获取包括其在内往**后**的 n 条消息 (顺序: 从新到旧) + * @param limit 获取消息的数量 + * @param msg_id 从哪条开始? (-1 = 最新) + */ + getMessagesBeginWith(limit: number | undefined | null, msg_id: number) { + const newestMessageId = this.getNewestMessageId() + const offset = (msg_id == -1 || newestMessageId == null) ? 0 : (newestMessageId - msg_id) + return this.getMessagesWithOffset(limit, offset) + } }