koishi-plugin-emojiluna
Version:
Smart emoji management plugin with AI categorization
83 lines (82 loc) • 3.8 kB
TypeScript
import { Context, Service } from 'koishi';
import { Config } from '../config';
import { UploadManager } from '../storage';
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 _emojiStorage;
private _categories;
private _isInitialized;
private _readyPromise;
private _readyResolve;
private _isDisposed;
private _uploadManager;
private _aiAnalyzer;
constructor(ctx: Context, config: Config);
get ready(): Promise<void>;
get uploadManager(): UploadManager;
private initializeStorage;
get isInitialized(): boolean;
categorizeEmoji(imageBase64: string): Promise<AICategorizeResult | null>;
analyzeEmoji(imageBase64: string): Promise<AIAnalyzeResult | null>;
filterImageByType(imageBase64: string): Promise<AIImageFilterResult | null>;
addEmoji(options: EmojiAddOptions, source: Buffer | {
path: string;
}, aiAnalysis?: boolean): Promise<EmojiItem>;
addEmojis(emojis: {
options: EmojiAddOptions;
buffer: Buffer;
}[], aiAnalysis: boolean): Promise<EmojiItem[]>;
getEmojiByName(name: string): Promise<EmojiItem | null>;
getEmojisByName(name: string): Promise<EmojiItem[]>;
getEmojiById(id: string): Promise<EmojiItem | null>;
private filterEmojis;
getEmojiList(options?: EmojiSearchOptions): Promise<EmojiItem[]>;
getEmojiPage(options?: EmojiSearchOptions): Promise<PaginatedResult<EmojiItem>>;
searchEmoji(keyword: string): Promise<EmojiItem[]>;
deleteEmoji(id: string): Promise<boolean>;
deleteAllEmojis(): Promise<boolean>;
updateEmojiInfo(id: string, updates: Partial<Pick<EmojiItem, 'name' | 'category' | 'tags'>>): Promise<boolean>;
updateEmojiName(id: string, name: string): Promise<boolean>;
updateEmojiTags(id: string, tags: string[]): Promise<boolean>;
updateEmojiCategory(id: string, category: string): 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>;
cleanupEmptyCategories(): Promise<number>;
private buildTagUsageMap;
getAllTags(): Promise<string[]>;
getTagsPage(options?: TagSearchOptions): Promise<PaginatedResult<TagInfo>>;
cleanupEmptyTags(): Promise<number>;
categorizeExistingEmojis(): Promise<{
success: number;
failed: number;
}>;
private static readonly SUPPORTED_EXTENSIONS;
scanFolder(folderPath: string): Promise<FolderScanResult>;
private scanFolderRecursive;
private emojiNameExists;
importFromFolder(options: FolderImportOptions): Promise<FolderImportResult>;
private updateCategoryEmojiCount;
private loadEmojis;
private loadCategories;
getEmojiCount(): number;
getCategoryCount(): number;
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[];
}