mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2024-11-21 09:36:35 +00:00
feat: file by element id
This commit is contained in:
parent
b8fa1e163e
commit
5f30e4c252
@ -1,4 +1,4 @@
|
||||
import { NapCatCore } from '@/core';
|
||||
import { ChatType, FileElement, NapCatCore } from '@/core';
|
||||
import { NapCatLaanaAdapter } from '..';
|
||||
import { File as LaanaFile } from '../types/entity/file';
|
||||
import path from 'path';
|
||||
@ -18,10 +18,6 @@ export class LaanaFileUtils {
|
||||
|
||||
async resolveCacheIdFromLaanaFile(laanaFile: LaanaFile) {
|
||||
if (laanaFile.uri.oneofKind === 'cacheId') {
|
||||
const cacheFilePath = path.join(this.cacheDir, laanaFile.uri.cacheId);
|
||||
if (!fs.existsSync(cacheFilePath)) {
|
||||
throw Error(`请求的缓存不存在: ${laanaFile.uri.cacheId}`);
|
||||
}
|
||||
return laanaFile.uri.cacheId;
|
||||
} else if (laanaFile.uri.oneofKind === 'url') {
|
||||
return this.createCacheFromUrl(laanaFile.uri.url);
|
||||
@ -32,7 +28,24 @@ export class LaanaFileUtils {
|
||||
}
|
||||
}
|
||||
|
||||
toLocalPath(cacheId: string) {
|
||||
async toLocalPath(cacheId: string, forceRevalidate = false) {
|
||||
const cacheFilePath = path.join(this.cacheDir, cacheId);
|
||||
if (!fs.existsSync(cacheFilePath) || forceRevalidate) {
|
||||
if (cacheId.startsWith('@QQFileElement')) {
|
||||
const { msgId, chatType, peerUid, fileElementId } = this.decodeFileElementCacheId(cacheId);
|
||||
const downloadPath = await this.core.apis.FileApi.downloadMedia(
|
||||
msgId,
|
||||
chatType,
|
||||
peerUid,
|
||||
fileElementId,
|
||||
'',
|
||||
'',
|
||||
);
|
||||
await fsPromises.symlink(downloadPath, cacheFilePath);
|
||||
} else {
|
||||
throw Error(`请求的缓存不存在: ${cacheId}`);
|
||||
}
|
||||
}
|
||||
return path.join(this.cacheDir, cacheId);
|
||||
}
|
||||
|
||||
@ -48,4 +61,26 @@ export class LaanaFileUtils {
|
||||
async createCacheFromUrl(url: string) {
|
||||
return this.createCacheFromBytes(await httpDownload({ url }));
|
||||
}
|
||||
|
||||
encodeFileElementToCacheId(
|
||||
msgId: string,
|
||||
chatType: ChatType,
|
||||
peerUid: string,
|
||||
fileElementId: string
|
||||
) {
|
||||
return `QQFileElement@${msgId}@${chatType}@${peerUid}@${fileElementId}`;
|
||||
}
|
||||
|
||||
decodeFileElementCacheId(cacheId: string) {
|
||||
if (!cacheId.startsWith('QQFileElement')) {
|
||||
throw Error('不支持的缓存 ID');
|
||||
}
|
||||
const [, msgId, chatType, peerUid, fileElementId] = cacheId.split('@');
|
||||
return {
|
||||
msgId,
|
||||
chatType: parseInt(chatType),
|
||||
peerUid,
|
||||
fileElementId
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { AtType, ChatType, ElementType, NapCatCore, Peer, SendMessageElement, SendTextElement } from '@/core';
|
||||
import { NapCatLaanaAdapter } from '..';
|
||||
import { OutgoingMessage, SendMessagePing } from '../types/action/message';
|
||||
import { Peer as LaanaPeer, Peer_Type } from '../types/entity/message';
|
||||
import { Bubble, Message as LaanaMessage, Peer as LaanaPeer, Peer_Type } from '../types/entity/message';
|
||||
import faceConfig from '@/core/external/face_config.json';
|
||||
|
||||
type Laana2RawConverters = {
|
||||
@ -143,7 +143,7 @@ export class LaanaMessageUtils {
|
||||
} else if (content.oneofKind === 'image') {
|
||||
const cacheId = await this.laana.utils.file.resolveCacheIdFromLaanaFile(content.image);
|
||||
elements.push(await this.core.apis.FileApi.createValidSendPicElement(
|
||||
this.laana.utils.file.toLocalPath(cacheId)
|
||||
await this.laana.utils.file.toLocalPath(cacheId)
|
||||
));
|
||||
fileCacheIds.push(cacheId);
|
||||
} else {
|
||||
@ -159,7 +159,7 @@ export class LaanaMessageUtils {
|
||||
return {
|
||||
elements: [
|
||||
await this.core.apis.FileApi.createValidSendFileElement(
|
||||
this.laana.utils.file.toLocalPath(cacheId),
|
||||
await this.laana.utils.file.toLocalPath(cacheId),
|
||||
msgContent.name,
|
||||
),
|
||||
],
|
||||
@ -172,7 +172,7 @@ export class LaanaMessageUtils {
|
||||
return {
|
||||
elements: [
|
||||
await this.core.apis.FileApi.createValidSendPicElement(
|
||||
this.laana.utils.file.toLocalPath(cacheId),
|
||||
await this.laana.utils.file.toLocalPath(cacheId),
|
||||
msgContent.displayText, // TODO: make display text optional
|
||||
// TODO: add 'sub type' field
|
||||
)
|
||||
@ -199,7 +199,7 @@ export class LaanaMessageUtils {
|
||||
return {
|
||||
elements: [
|
||||
await this.core.apis.FileApi.createValidSendVideoElement(
|
||||
this.laana.utils.file.toLocalPath(cacheId),
|
||||
await this.laana.utils.file.toLocalPath(cacheId),
|
||||
// TODO: add file name and thumb path
|
||||
),
|
||||
],
|
||||
@ -212,7 +212,7 @@ export class LaanaMessageUtils {
|
||||
return {
|
||||
elements: [
|
||||
await this.core.apis.FileApi.createValidSendPttElement(
|
||||
this.laana.utils.file.toLocalPath(cacheId),
|
||||
await this.laana.utils.file.toLocalPath(cacheId),
|
||||
)
|
||||
],
|
||||
fileCacheIds: [cacheId],
|
||||
|
Loading…
x
Reference in New Issue
Block a user