koishi-plugin-emojiluna
Version:
Smart emoji management plugin with AI categorization
97 lines (96 loc) • 4.17 kB
TypeScript
import { Context, Service } from 'koishi';
import { Config } from './config';
import { AIAnalyzeResult, AICategorizeResult, AIImageFilterResult, AITaskDetail, Category, CategorySearchOptions, EmojiAddOptions, EmojiItem, EmojiSearchOptions, FolderImportOptions, FolderImportResult, FolderScanResult, PaginatedResult, TagInfo, TagSearchOptions } from './types';
export declare class EmojiLunaService extends Service {
config: Config;
private static readonly AI_FRAME_SAMPLES;
private _emojiStorage;
private _categories;
private _model;
private _isInitialized;
private _readyPromise;
private _readyResolve;
private _isDisposed;
private _uploadManager;
constructor(ctx: Context, config: Config);
get ready(): Promise<void>;
private initializeStorage;
get isInitialized(): boolean;
initializeAI(): Promise<void>;
private parseAIResult;
private buildAIImages;
categorizeEmoji(imageBase64: string): Promise<AICategorizeResult | null>;
analyzeEmoji(imageBase64: string): Promise<AIAnalyzeResult | null>;
filterImageByType(imageBase64: string): Promise<AIImageFilterResult | null>;
private calculateFileHash;
addEmojiFromPath(options: EmojiAddOptions, sourcePath: string, aiAnalysis?: boolean): Promise<EmojiItem>;
addEmoji(options: EmojiAddOptions, imageData: Buffer, aiAnalysis?: boolean): Promise<EmojiItem>;
addEmojis(emojis: {
options: EmojiAddOptions;
buffer: Buffer;
}[], aiAnalysis: boolean): Promise<EmojiItem[]>;
private runAiAnalysisInBackground;
private updateEmojiInfo;
getEmojiByName(name: string): Promise<EmojiItem | null>;
getEmojisByName(name: string): Promise<EmojiItem[]>;
categorizeExistingEmojis(): Promise<{
success: number;
failed: number;
}>;
private filterEmojis;
getEmojiList(options?: EmojiSearchOptions): Promise<EmojiItem[]>;
getEmojiPage(options?: EmojiSearchOptions): Promise<PaginatedResult<EmojiItem>>;
searchEmoji(keyword: string): Promise<EmojiItem[]>;
getEmojiById(id: string): Promise<EmojiItem | null>;
deleteEmoji(id: string): Promise<boolean>;
deleteAllEmojis(): Promise<boolean>;
addCategory(name: string, description?: string): Promise<Category>;
getCategories(): Promise<Category[]>;
getCategoriesPage(options?: CategorySearchOptions): Promise<PaginatedResult<Category>>;
getCategoryByName(name: string): Promise<Category | null>;
deleteCategory(id: string, deleteEmojis?: boolean): Promise<boolean>;
getAllTags(): Promise<string[]>;
getTagsPage(options?: TagSearchOptions): Promise<PaginatedResult<TagInfo>>;
cleanupEmptyCategories(): Promise<number>;
cleanupEmptyTags(): Promise<number>;
updateEmojiTags(id: string, tags: string[]): Promise<boolean>;
updateEmojiName(id: string, name: string): Promise<boolean>;
updateEmojiCategory(id: string, category: string): Promise<boolean>;
private loadEmojis;
private loadCategories;
getEmojiCount(): number;
getCategoryCount(): number;
private static readonly SUPPORTED_EXTENSIONS;
/**
* Scan a folder and return information about its contents
*/
scanFolder(folderPath: string): Promise<FolderScanResult>;
/**
* Recursively scan a folder and collect all image files
*/
private scanFolderRecursive;
/**
* Check if an emoji with the same name already exists
*/
private emojiNameExists;
/**
* Import emojis from a local folder
*/
importFromFolder(options: FolderImportOptions): Promise<FolderImportResult>;
private updateCategoryEmojiCount;
getAiTaskStats(): Promise<{
pending: number;
processing: number;
succeeded: number;
failed: number;
paused: boolean;
}>;
getFailedAiEmojiIds(): Promise<string[]>;
setAiPaused(paused: boolean): void;
retryFailedTasks(): Promise<number>;
reanalyzeBatch(ids: string[]): Promise<number>;
getAiTasksAll(): Promise<AITaskDetail[]>;
deleteAiTask(emojiId: string): Promise<void>;
retryAiTask(emojiId: string): Promise<void>;
static inject: string[];
}