feat(wip): 更加抽象的获取历史消息的方式
* 从某处作为锚点吗......
This commit is contained in:
@@ -121,7 +121,7 @@ export default class ChatApi extends BaseApi {
|
|||||||
code: 200,
|
code: 200,
|
||||||
msg: "成功",
|
msg: "成功",
|
||||||
data: {
|
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),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ export default class MessagesManager {
|
|||||||
protected getTableName() {
|
protected getTableName() {
|
||||||
return `messages_${this.chat.bean.id}`.replaceAll('-', '_')
|
return `messages_${this.chat.bean.id}`.replaceAll('-', '_')
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 添加一条消息
|
||||||
|
*/
|
||||||
addMessage({
|
addMessage({
|
||||||
text,
|
text,
|
||||||
user_id,
|
user_id,
|
||||||
@@ -55,19 +58,58 @@ export default class MessagesManager {
|
|||||||
time || Date.now()
|
time || Date.now()
|
||||||
).lastInsertRowid
|
).lastInsertRowid
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 添加一条无用户信息的系统消息
|
||||||
|
*/
|
||||||
addSystemMessage(text: string) {
|
addSystemMessage(text: string) {
|
||||||
this.addMessage({
|
this.addMessage({
|
||||||
text
|
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[]
|
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) => ({
|
return ls.map((v) => ({
|
||||||
...v,
|
...v,
|
||||||
chat_id: this.chat.bean.id,
|
chat_id: this.chat.bean.id,
|
||||||
}))
|
})).reverse()
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 从最新消息开始偏移某些量向**前**获取第 n 页消息 (顺序: 从新到旧)
|
||||||
|
* @param limit 获取消息的数量
|
||||||
|
* @param page 页数
|
||||||
|
*/
|
||||||
getMessagesWithPage(limit: number | undefined | null, page: number = 0) {
|
getMessagesWithPage(limit: number | undefined | null, page: number = 0) {
|
||||||
return this.getMessagesWithOffset(limit, (limit || PageFetchMaxLimit) * page)
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user