import { Context } from "koishi";
import { Config } from "../../config";
import { BeatLeaderService } from "./composed/beatleader";
import { BeatSaverService } from "./composed/beatsaver";
import { ScoreSaberService } from "./composed/scoresaber";
import { AIOSaberService } from "./composed/aiosaber";
import { NetReqResult } from "./netResult";
type ServiceWithAPIHelper<API, Wrap extends boolean = false> = Wrapped<API, Wrap> & APIHelper<API, Wrap>;
type Wrapping<T, I extends boolean = false> = T extends ((...args: infer Args) => infer R) ? <Wrap extends boolean = false>(...args: Args) => (R extends Promise<infer R1> ? (I extends true ? Promise<NetReqResult<R1>> : (Wrap extends true ? Promise<NetReqResult<R1>> : Promise<R1>)) : R) : T;
type Wrapped<T, Wrap extends boolean = false> = {
    [K in keyof T]: Wrapping<T[K], Wrap>;
};
export declare class APIService {
    BeatLeader: ServiceWithAPIHelper<BeatLeaderService>;
    ScoreSaber: ServiceWithAPIHelper<ScoreSaberService>;
    BeatSaver: ServiceWithAPIHelper<BeatSaverService>;
    AIOSaber: ServiceWithAPIHelper<AIOSaberService>;
    private constructor();
    static create(ctx: Context, cfg: Config): APIService;
}
type Res<Base, T> = Base extends true ? NetReqResult<T> : T;
declare class APIHelper<API, Base extends boolean = false> {
    constructor();
    private retryTime;
    private _wrapper;
    private _onRetry;
    withRetry(times?: number, onRetry?: (retryTime: number, e?: any) => void): this;
    onRetry(func: (times: number, e: any) => void): this;
    call<T>(block: () => Promise<T>): Promise<Res<Base, T>>;
    wrapperResult(): ServiceWithAPIHelper<API, true>;
}
export {};
