import { Context, Dict, Session } from 'koishi';
import { Config } from './config';
import { MembershipSystem } from './membershipSystem';
export interface TaskQueueItem {
    session: Session<'authority', never, Context>;
    options: any;
    input: string;
    resolve: (value: any) => void;
    reject: (reason: any) => void;
    isRedraw?: boolean;
}
export declare class QueueSystem {
    private ctx;
    private config;
    private generateImageFn;
    taskQueue: TaskQueueItem[];
    processingTasks: number;
    userTasks: Dict<number>;
    userCooldowns: Dict<number>;
    userLastTask: Dict<{
        session: Session<'authority'>;
        options: any;
        input: string;
        pointsCost?: number;
    }>;
    private lastRedrawTime;
    private usedTokenIndices;
    private redrawLock;
    private redrawWaitQueue;
    maxConcurrentTasks: number;
    private membershipSystem;
    private tokenPool;
    constructor(ctx: Context, config: Config, generateImageFn: (session: Session<'authority'>, options: any, input: string) => Promise<any>, membershipSystem?: MembershipSystem, initialTokenUsage?: Dict<boolean>);
    acquireRedrawLock(): Promise<void>;
    releaseRedrawLock(): void;
    getUniqueTokenIndex(currentIndex: number, tokenCount: number): number;
    private acquireTokenIndex;
    private releaseTokenIndex;
    borrowTokenIndex(): number | null;
    returnTokenIndex(index: number): void;
    processQueue(): Promise<void>;
    addTask(task: TaskQueueItem): Promise<any>;
    getQueueStatus(userId: string): {
        totalWaiting: number;
        userQueue: number;
    };
    canAddTask(userId: string): {
        canAdd: boolean;
        message?: string;
    };
    incrementUserTask(userId: string, count?: number): void;
    resetUserQueue(userId: string): void;
    saveLastTask(userId: string, session: Session<'authority'>, options: any, input: string, pointsCost?: number): void;
    getLastTask(userId: string): {
        session: Session<'authority'>;
        options: any;
        input: string;
        pointsCost?: number;
    } | undefined;
    getLastRedrawTime(): number;
    setLastRedrawTime(time: number): void;
}
