koishi-plugin-emojiluna
Version:
Smart emoji management plugin with AI categorization
183 lines (182 loc) • 5.76 kB
TypeScript
export interface EmojiItem {
id: string;
name: string;
category: string;
path: string;
size: number;
mimeType: string;
createdAt: Date;
tags: string[];
}
export interface Category {
id: string;
name: string;
description?: string;
emojiCount: number;
createdAt: Date;
}
export interface EmojiSearchOptions {
keyword?: string;
category?: string;
tags?: string[];
limit?: number;
offset?: number;
}
export interface CategorySearchOptions {
keyword?: string;
limit?: number;
offset?: number;
}
export interface TagInfo {
name: string;
usage: number;
}
export interface TagSearchOptions {
keyword?: string;
limit?: number;
offset?: number;
}
export interface PaginatedResult<T> {
items: T[];
total: number;
limit: number;
offset: number;
}
export interface EmojiAddOptions {
name: string;
category?: string;
tags?: string[];
description?: string;
imageData?: string;
}
export interface AICategorizeResult {
category: string;
confidence: number;
reason: string;
newCategory?: string;
}
export interface AIAnalyzeResult {
name: string;
category: string;
tags: string[];
description: string;
newCategory?: string;
}
export interface AITaskDetail {
id: string;
emojiId: string;
name?: string;
status: 'pending' | 'processing' | 'succeeded' | 'failed';
error?: string;
createdAt: number;
}
/**
* Options for importing emojis from a local folder
*/
export interface FolderImportOptions {
folderPath: string;
useSubfoldersAsCategories: boolean;
defaultCategory?: string;
recursive: boolean;
aiAnalysis: boolean;
skipExisting: boolean;
}
/**
* Result of a folder import operation
*/
export interface FolderImportResult {
success: boolean;
imported: number;
skipped: number;
failed: number;
errors: string[];
importedEmojis: EmojiItem[];
}
/**
* Information about a scanned folder
*/
export interface FolderScanResult {
folderPath: string;
files: ScannedFile[];
subfolders: string[];
totalFiles: number;
}
/**
* Information about a scanned file
*/
export interface ScannedFile {
path: string;
name: string;
category: string;
size: number;
}
/**
* 图片内容类型(用于过滤无用图片)
*/
export type ImageContentType = 'emoji' | 'sticker' | 'meme' | 'comic' | 'anime' | 'pet' | 'food' | 'scenery' | 'selfie' | 'screenshot_system' | 'screenshot_game' | 'screenshot_chat' | 'screenshot_video' | 'screenshot_web' | 'photo_people' | 'photo_product' | 'artwork' | 'text_only' | 'qrcode' | 'advertisement' | 'document' | 'diagram' | 'news' | 'logo' | 'nsfw' | 'low_quality' | 'other';
/**
* 所有可用的图片类型列表
*/
export declare const IMAGE_CONTENT_TYPES: {
type: ImageContentType;
label: string;
description: string;
}[];
/**
* 默认接受的图片类型(适合作为表情包的类型)
*/
export declare const DEFAULT_ACCEPTED_IMAGE_TYPES: ImageContentType[];
/**
* AI 图片类型过滤结果
*/
export interface AIImageFilterResult {
imageType: ImageContentType;
isAcceptable: boolean;
confidence: number;
reason: string;
}
declare module '@koishijs/console' {
interface Events {
'emojiluna/getEmojiList': (options?: EmojiSearchOptions) => Promise<EmojiItem[]>;
'emojiluna/getEmojiPage': (options?: EmojiSearchOptions) => Promise<PaginatedResult<EmojiItem>>;
'emojiluna/searchEmoji': (keyword: string) => Promise<EmojiItem[]>;
'emojiluna/getCategories': () => Promise<Category[]>;
'emojiluna/getCategoriesPage': (options?: CategorySearchOptions) => Promise<PaginatedResult<Category>>;
'emojiluna/getAllTags': () => Promise<string[]>;
'emojiluna/getTagsPage': (options?: TagSearchOptions) => Promise<PaginatedResult<TagInfo>>;
'emojiluna/updateEmojiName': (id: string, name: string) => Promise<boolean>;
'emojiluna/updateEmojiTags': (id: string, tags: string[]) => Promise<boolean>;
'emojiluna/updateEmojiCategory': (id: string, category: string) => Promise<boolean>;
'emojiluna/deleteEmoji': (id: string) => Promise<boolean>;
'emojiluna/addCategory': (name: string, description: string) => Promise<Category>;
'emojiluna/deleteCategory': (id: string) => Promise<boolean>;
'emojiluna/cleanupEmptyCategories': () => Promise<number>;
'emojiluna/cleanupEmptyTags': () => Promise<number>;
'emojiluna/addEmoji': (emojiData: EmojiAddOptions) => Promise<EmojiItem>;
'emojiluna/getBaseUrl': () => Promise<string>;
'emojiluna/getUploadToken': () => Promise<string>;
'emojiluna/analyzeEmoji': (emojiId: string) => Promise<{
success: boolean;
updates?: string[];
result?: AIAnalyzeResult;
oldData?: {
name: string;
category: string;
tags: string[];
};
newData?: {
name: string;
category: string;
tags: string[];
description: string;
};
message?: string;
}>;
'emojiluna/addEmojis': (emojis: EmojiAddOptions[], aiAnalysis: boolean) => Promise<EmojiItem[]>;
'emojiluna/getAiTasksAll': () => Promise<AITaskDetail[]>;
'emojiluna/deleteAiTask': (emojiId: string) => Promise<void>;
'emojiluna/retryAiTask': (emojiId: string) => Promise<void>;
'emojiluna/scanFolder': (folderPath: string) => Promise<FolderScanResult>;
'emojiluna/importFromFolder': (options: FolderImportOptions) => Promise<FolderImportResult>;
}
}