import { BiliDataServer as BiliDataServer$1, BilibiliAPI } from "@bilibili-notify/api";
import { BilibiliPush, SubItem, Subscriptions } from "@bilibili-notify/push";
import { CookieData, StorageManager } from "@bilibili-notify/storage";
import { Awaitable, Context, Schema, Service } from "koishi";
import { FlatSubConfigItem } from "@bilibili-notify/subscription";
import { DataService } from "@koishijs/plugin-console";

//#region src/config.d.ts
interface BilibiliNotifyConfig {
  advancedSub: boolean;
  subs: FlatSubConfigItem[];
  logLevel: number;
  userAgent?: string;
  loginHealthCheckMinutes: number;
  master: {
    enable: boolean;
    platform?: string;
    masterAccount?: string;
    masterAccountGuildId?: string;
  };
}
declare const BilibiliNotifyConfigSchema: Schema<BilibiliNotifyConfig>;
//#endregion
//#region src/data-server.d.ts
declare class BilibiliNotifyDataServer extends DataService<BiliDataServer$1> {
  private biliData;
  constructor(ctx: Context);
  get(): Promise<BiliDataServer$1>;
}
//#endregion
//#region src/server-manager.d.ts
declare class BilibiliNotifyServerManager extends Service<BilibiliNotifyConfig> {
  static readonly [Service.provide] = "bilibili-notify";
  private readonly serverLogger;
  private readonly selfCtx;
  private api;
  private push;
  private subMgr;
  private loginTimer?;
  private subNotifier?;
  private running;
  storageMgr: StorageManager;
  private currentSubs;
  private auth;
  private authLostNotifiedAt;
  constructor(ctx: Context, config: BilibiliNotifyConfig);
  /** For commands */
  get subManager(): any;
  /** For commands: read the current login snapshot. */
  getAuthSnapshot(): BiliDataServer;
  subList(): string;
  protected start(): Promise<void>;
  protected stop(): Awaitable<void>;
  /**
   * 向持有 BILIBILI_NOTIFY_TOKEN 的友好插件暴露 api / push / subs 实例。
   * 第三方插件无法获取此令牌，因此无法访问内部实例。
   */
  getInternals(token: symbol): {
    api: BilibiliAPI;
    push: BilibiliPush;
    subs: Subscriptions | null;
    addSub: (params: {
      uid: string;
      name: string;
      platform: string;
      target: string;
      dynamic?: boolean;
      dynamicAtAll?: boolean;
      live?: boolean;
      liveAtAll?: boolean;
      liveEnd?: boolean;
      liveGuardBuy?: boolean;
      superchat?: boolean;
      wordcloud?: boolean;
      liveSummary?: boolean;
    }) => Promise<string>;
    removeSub: (uid: string) => string;
    updateSub: (params: {
      uid: string;
      dynamic?: boolean;
      dynamicAtAll?: boolean;
      live?: boolean;
      liveAtAll?: boolean;
      liveEnd?: boolean;
      liveGuardBuy?: boolean;
      superchat?: boolean;
      wordcloud?: boolean;
      liveSummary?: boolean;
    }) => Promise<string>;
  } | null;
  private addSub;
  private updateSub;
  private removeSub;
  /** Rebuild currentSubs from the subManager (uid-keyed). */
  private syncCurrentSubs;
  /** Compute ops by diffing two subManager snapshots. Used for advanced-sub full reload. */
  private diffSubManagers;
  registerPlugin(): Promise<boolean>;
  disposePlugin(): boolean;
  restartPlugin(): Promise<boolean>;
  private initCookies;
  private isLoggedIn;
  private clearLoginTimer;
  private reportAccountInfo;
  private handleAuthLost;
  private loadInitialSubscriptions;
  private updateSubNotifier;
  private registerConsoleEvents;
  private startLoginFlow;
  private pollLoginStatus;
  private warnMissingPlugins;
}
//#endregion
//#region src/types.d.ts
/** A scoped change object — each variant only carries fields relevant to its scope. */
type LiveSubChange = {
  scope: "live";
} & Partial<Pick<SubItem, "live" | "liveAtAll" | "liveEnd" | "liveGuardBuy" | "superchat" | "wordcloud" | "liveSummary" | "uname" | "roomId" | "customCardStyle" | "customLiveMsg" | "customGuardBuy" | "customLiveSummary" | "customSpecialDanmakuUsers" | "customSpecialUsersEnterTheRoom" | "specialUsers">>;
type DynamicSubChange = {
  scope: "dynamic";
} & Partial<Pick<SubItem, "dynamic" | "dynamicAtAll">>;
type TargetSubChange = {
  scope: "target";
} & Pick<SubItem, "target">;
type SubChange = LiveSubChange | DynamicSubChange | TargetSubChange;
type SubscriptionOp = {
  type: "add";
  sub: SubItem;
} | {
  type: "delete";
  uid: string;
} | {
  type: "update";
  uid: string;
  changes: SubChange[];
};
//#endregion
//#region src/index.d.ts
declare module "koishi" {
  interface Context {
    "bilibili-notify": BilibiliNotifyServerManager;
  }
  interface Events {
    "bilibili-notify/login-status-report"(data: BiliDataServer$1): void;
    "bilibili-notify/auth-lost"(): void;
    "bilibili-notify/auth-restored"(): void;
    "bilibili-notify/advanced-sub"(subs: Subscriptions): void;
    "bilibili-notify/ready-to-receive"(): void;
    "bilibili-notify/cookies-refreshed"(data: CookieData): void;
    "bilibili-notify/subscription-changed"(ops: SubscriptionOp[]): void;
    "bilibili-notify/ready"(api: BilibiliAPI): void;
    "bilibili-notify/plugin-error"(source: string, message: string): void;
    "bilibili-notify/update-config"(config: BilibiliNotifyConfig): void;
  }
}
declare module "@koishijs/plugin-console" {
  namespace Console {
    interface Services {
      "bilibili-notify": BilibiliNotifyDataServer;
    }
  }
  interface Events {
    "bilibili-notify/start-login"(): void;
    "bilibili-notify/reset-key"(): void;
    "bilibili-notify/request-cors"(url: string): any;
  }
}
declare const inject: {
  required: string[];
  optional: string[];
};
declare const name = "bilibili-notify";
declare const usage = "\n<h1>Bilibili-Notify</h1>\n<p>\u4F7F\u7528\u95EE\u9898\u8BF7\u52A0\u7FA4\u54A8\u8BE2 801338523</p>\n\n---\n\n\u4E3B\u4EBA\u597D\u5440\uFF5E\u6211\u662F\u7B28\u7B28\u5973\u4EC6\u5C0F\u52A9\u624B\u54D2 (\u3003\u2200\u3003)\u2661\n\u4E13\u95E8\u5E2E\u4E3B\u4EBA\u7BA1\u7406 B \u7AD9\u8BA2\u9605\u548C\u76F4\u64AD\u63A8\u9001\u7684\uFF01\n\u5973\u4EC6\u867D\u7136\u7B28\u7B28\u7684\uFF0C\u4F46\u662F\u4F1A\u5C3D\u529B\u4E0D\u51FA\u9519\u54E6\uFF5E\n\u4E3B\u4EBA\uFF0C\u53EA\u8981\u6309\u7167\u5973\u4EC6\u7684\u63D0\u793A\u4E00\u6B65\u4E00\u6B65\u8BBE\u7F6E\uFF0C\u5973\u4EC6\u5C31\u53EF\u4EE5\u4E56\u4E56\u5E2E\u60A8\u5DE5\u4F5C\u5566\uFF01\n\n\u9996\u5148\u5462\uFF5E\u8BF7\u4E3B\u4EBA\u4ED4\u7EC6\u9605\u8BFB\u8BA2\u9605\u76F8\u5173\u7684 subs \u7684\u586B\u5199\u8BF4\u660E (>\u03C9<)b\n\u3010\u4E3B\u4EBA\u8D26\u53F7\u90E8\u5206\u975E\u5FC5\u586B\u3011\u7136\u540E\u518D\u544A\u8BC9\u5973\u4EC6\u60A8\u7684 \u4E3B\u4EBA\u8D26\u53F7 (///\u25BD///)\uFF0C\u5E76\u9009\u62E9\u60A8\u5E0C\u671B\u5973\u4EC6\u670D\u52A1\u7684\u5E73\u53F0\uFF5E\n\u63A5\u7740\uFF0C\u8BF7\u8BA4\u771F\u586B\u5199 \u4E3B\u4EBA\u7684 ID \u548C \u7FA4\u7EC4 ID\uFF0C\u786E\u4FDD\u4FE1\u606F\u5B8C\u5168\u6B63\u786E\uFF5E\n\u8FD9\u6837\u5973\u4EC6\u624D\u80FD\u987A\u5229\u627E\u5230\u60A8\u5E76\u51C6\u786E\u6C47\u62A5\u52A8\u6001\u5462 (\u2267\u25BD\u2266)\n\n\u4E0D\u7528\u7740\u6025\uFF0C\u5973\u4EC6\u4F1A\u4E00\u76F4\u5728\u8FD9\u91CC\u966A\u7740\u60A8\uFF0C\u4E00\u6B65\u4E00\u6B65\u5B8C\u6210\u8BBE\u7F6E\uFF5E\n\u4E3B\u4EBA\u53EA\u8981\u4E56\u4E56\u586B\u597D\u8FD9\u4E9B\u4FE1\u606F\uFF0C\u5C31\u80FD\u8BA9\u5973\u4EC6\u53D8\u5F97\u8D85\u7EA7\u542C\u8BDD\u3001\u8D85\u7EA7\u52E4\u5FEB\u5566 (>///<)\u2661\n\n\u60F3\u8981\u91CD\u65B0\u767B\u5F55\u7684\u8BDD\uFF0C\u53EA\u9700\u8981\u70B9\u51FB\u63A7\u5236\u53F0\u5DE6\u4FA7\u7684\u300C\u626B\u7801\u767B\u5F55\u300D\u54E6\uFF5E\n\n\u4E3B\u4EBA\uFF5E\u6CE8\u610F\u4E8B\u9879\u8981\u4ED4\u7EC6\u770B\u5440 (>_<)\u2661\n- \u5982\u679C\u4E3B\u4EBA\u4F7F\u7528\u7684\u662F onebot \u673A\u5668\u4EBA\uFF0C\u5E73\u53F0\u540D\u8BF7\u586B\u5199 onebot\uFF0C\u800C\u4E0D\u662F qq \u54E6\uFF5E\n- \u5982\u679C\u9700\u8981\u66F4\u7075\u6D3B\u7684\u8BA2\u9605\u914D\u7F6E\uFF0C\u8BF7\u5B89\u88C5 bilibili-notify-advanced-subscription \u63D2\u4EF6\n\n\u4E56\u4E56\u9075\u5B88\u8FD9\u4E9B\u89C4\u5219\uFF0C\u5973\u4EC6\u624D\u80FD\u987A\u5229\u5E2E\u4E3B\u4EBA\u5DE5\u4F5C\u5462 (*>\u03C9<)b\n\n---\n";
declare function apply(ctx: Context, config: BilibiliNotifyConfig): void;
declare const Config: Schema<BilibiliNotifyConfig>;
//#endregion
export { type BilibiliNotifyConfig, BilibiliNotifyConfigSchema, Config, type DynamicSubChange, type LiveSubChange, type SubChange, type SubscriptionOp, type TargetSubChange, apply, inject, name, usage };