/// /// /// /// import * as utils from 'koishi-utils'; import { MaybeArray, Get, Extract, Observed, Logger, Promisify, Awaitable } from 'koishi-utils'; import LruCache from 'lru-cache'; import { AxiosRequestConfig } from 'axios'; import { Server } from 'http'; import { inspect } from 'util'; import Router from '@koa/router'; import WebSocket from 'ws'; export type TableType = keyof Tables; type Primitive = string | number; type Comparable = Primitive | Date; type Keys = string & { [K in keyof O]: O[K] extends T ? K : never; }[keyof O]; export interface Tables { user: User; channel: Channel; } export namespace Tables { interface Field { type: Field.Type; length?: number; nullable?: boolean; initial?: T; precision?: number; scale?: number; } namespace Field { export const number: Type[]; export const string: Type[]; export const date: Type[]; export const object: Type[]; export type Type = T extends number ? 'integer' | 'unsigned' | 'float' | 'double' | 'decimal' : T extends string ? 'char' | 'string' | 'text' : T extends Date ? 'timestamp' | 'date' | 'time' : T extends any[] ? 'list' | 'json' : T extends object ? 'json' : never; type WithParam = S | `${S}(${any})`; export type Extension = { [K in keyof O]?: Field | WithParam>; }; export type Config = { [K in keyof O]?: Field; }; export function parse(source: string | Field): Field; export {}; } interface Extension { type?: 'random' | 'incremental'; primary?: Keys; unique?: MaybeArray>[]; foreign?: { [K in keyof O]?: [TableType, string]; }; fields?: Field.Extension; } interface Config extends Extension { fields?: Field.Config; } const config: Record; function extend(name: T, meta?: Extension): void; function create(name: T): Tables[T]; } export type Query = Query.Expr | Query.Shorthand; export namespace Query { export type Field = string & keyof Tables[T]; export type Index = Keys; export interface FieldExpr { $in?: Extract; $nin?: Extract; $eq?: Extract; $ne?: Extract; $gt?: Extract; $gte?: Extract; $lt?: Extract; $lte?: Extract; $el?: T extends (infer U)[] ? FieldQuery : never; $size?: Extract; $regex?: Extract; $regexFor?: Extract; $bitsAllClear?: Extract; $bitsAllSet?: Extract; $bitsAnyClear?: Extract; $bitsAnySet?: Extract; } export interface LogicalExpr { $or?: Expr[]; $and?: Expr[]; $not?: Expr; $expr?: Eval.Boolean; } export type Shorthand = Extract | Extract | Extract; export type FieldQuery = FieldExpr | Shorthand; export type Expr = LogicalExpr & { [K in keyof T]?: FieldQuery; }; export function resolve(name: T, query?: Query): Expr; export interface ModifierExpr { limit?: number; offset?: number; fields?: K[]; } export type Modifier = T[] | ModifierExpr; export function resolveModifier(modifier: Modifier): ModifierExpr; type Projection = Record>; type MapEval = { [K in keyof P]: Eval; }; export interface Database { drop(table?: TableType): Promise; get>(table: T, query: Query, modifier?: Modifier): Promise[]>; remove(table: T, query: Query): Promise; create(table: T, data: Partial): Promise; update(table: T, data: Partial[], key?: Index): Promise; aggregate>(table: T, fields: P, query?: Query): Promise>; } export {}; } export type Eval = U extends number ? number : U extends boolean ? boolean : U extends string ? Get : U extends Eval.NumericExpr ? number : U extends Eval.BooleanExpr ? boolean : U extends Eval.AggregationExpr ? number : never; export namespace Eval { type Any = A | number | boolean | Keys | NumericExpr | BooleanExpr; type GeneralExpr = NumericExpr & BooleanExpr & AggregationExpr; type Numeric = A | number | Keys | NumericExpr; type Boolean = boolean | Keys | BooleanExpr; type Aggregation = Any<{}, AggregationExpr>; interface NumericExpr { $add?: Numeric[]; $multiply?: Numeric[]; $subtract?: [Numeric, Numeric]; $divide?: [Numeric, Numeric]; } interface BooleanExpr { $eq?: [Numeric, Numeric]; $ne?: [Numeric, Numeric]; $gt?: [Numeric, Numeric]; $gte?: [Numeric, Numeric]; $lt?: [Numeric, Numeric]; $lte?: [Numeric, Numeric]; } interface AggregationExpr { $sum?: Any; $avg?: Any; $max?: Any; $min?: Any; $count?: Any; } } export interface User extends Record { id: string; flag: number; authority: number; name: string; usage: Record; timers: Record; } export namespace User { export enum Flag { ignore = 1 } export type Field = keyof User; export const fields: Field[]; export type Index = Platform | 'name' | 'id'; export type Observed = utils.Observed, Promise>; type Getter = (type: T, id: string) => Partial; /** * @deprecated use `Tables.extend('user', { fields })` instead */ export function extend(getter: Getter): void; export function create(type: T, id: string): User; export interface Database { getUser(type: T, id: string, modifier?: Query.Modifier): Promise>; getUser(type: T, ids: string[], modifier?: Query.Modifier): Promise[]>; getUser(type: T, id: MaybeArray, modifier?: Query.Modifier): Promise; setUser(type: T, id: string, data: Partial): Promise; createUser(type: T, id: string, data: Partial): Promise; } export {}; } export interface Channel { id: string; flag: number; assignee: string; disable: string[]; } export namespace Channel { export enum Flag { ignore = 1, silent = 4 } export type Field = keyof Channel; export const fields: Field[]; export type Observed = utils.Observed, Promise>; type Getter = (type: Platform, id: string) => Partial; /** * @deprecated use `Tables.extend('user', { fields })` instead */ export function extend(getter: Getter): void; export function create(type: Platform, id: string): Channel; export interface Database { getChannel(type: Platform, id: string, modifier?: Query.Modifier): Promise>; getChannel(type: Platform, ids: readonly string[], modifier?: Query.Modifier): Promise[]>; getChannel(type: Platform, id: MaybeArray, modifier?: Query.Modifier): Promise; getAssignedChannels(fields?: K[], assignMap?: Record): Promise[]>; setChannel(type: Platform, id: string, data: Partial): Promise; createChannel(type: Platform, id: string, data: Partial): Promise; } export {}; } export interface Database extends Query.Database, User.Database, Channel.Database { } type Methods = { [K in keyof S]?: S[K] extends (...args: infer R) => infer U ? (this: T, ...args: R) => U : S[K]; }; export namespace Database { export interface Statics { } type Constructor = new (...args: any[]) => T; type ExtensionMethods = Methods ? I : never>; type Extension = ((Database: T) => void) | ExtensionMethods; export function extend(module: K, extension: Extension): void; export function extend>(module: T, extension: Extension): void; export {}; } export interface Assets { types: readonly Assets.Type[]; upload(url: string, file: string): Promise; stats(): Promise; } export namespace Assets { type Type = 'image' | 'audio' | 'video' | 'file'; interface Stats { assetCount?: number; assetSize?: number; } } export interface HelpConfig extends Command.Config { shortcut?: boolean; options?: boolean; } export function getCommandNames(session: Session): string[]; export interface DelayOptions { character?: number; message?: number; cancel?: number; broadcast?: number; prompt?: number; } export interface AppOptions extends BotOptions { port?: number; host?: string; bots?: BotOptions[]; prefix?: string | string[] | ((session: Session.Message) => void | string | string[]); nickname?: string | string[]; maxListeners?: number; prettyErrors?: boolean; processMessage?: (message: string) => string; delay?: DelayOptions; help?: boolean | HelpConfig; autoAssign?: boolean | ((session: Session) => boolean); autoAuthorize?: number | ((session: Session) => number); userCacheAge?: number; userCacheLength?: number; channelCacheLength?: number; channelCacheAge?: number; minSimilarity?: number; selfUrl?: string; axiosConfig?: AxiosRequestConfig; } interface CommandMap extends Map { resolve(key: string): Command; } export class App extends Context { app: this; options: AppOptions; status: App.Status; adapters: Adapter.Instances; registry: Plugin.Registry; _bots: Bot[] & Record>; _commandList: Command[]; _commands: CommandMap; _shortcuts: Command.Shortcut[]; _hooks: Record any][]>; _userCache: Record, Promise>>>; _channelCache: LruCache, Promise>>; _httpServer?: Server; _sessions: Record; private _nameRE; static defaultConfig: AppOptions; constructor(options?: AppOptions); createServer(): void; prepare(): void; start(): Promise; private _listen; stop(): Promise; private _close; private _resolvePrefixes; private _process; private _suggest; private _handleMessage; private _handleArgv; private _handleShortcut; } export namespace App { enum Status { closed = 0, opening = 1, open = 2, closing = 3 } } export type NextFunction = (next?: NextFunction) => Promise; export type Middleware = (session: Session, next: NextFunction) => any; export type Disposable = () => void; export type Plugin = Plugin.Function | Plugin.Object; export namespace Plugin { export type Function = (ctx: Context, options: T) => void; export interface Meta { name?: string; sideEffect?: boolean; } export interface Object extends Meta { apply: Function; } export type Config = T extends Function ? U : T extends Object ? U : never; export interface State extends Meta { id?: string; parent?: State; context?: Context; config?: T; plugin?: Plugin; children: Plugin[]; disposables: Disposable[]; } export interface Packages { } export type Teleporter = (ctx: Context, ...modules: From) => void; type From = D extends readonly [infer L, ...infer R] ? [L extends keyof Packages ? Packages[L] : unknown, ...From] : []; export class Registry extends Map { resolve(plugin: Plugin): Function; get(plugin: Plugin): State; set(plugin: Plugin, state: State): this; has(plugin: Plugin): boolean; delete(plugin: Plugin): boolean; } export {}; } type Filter = (session: Session) => boolean; type PartialSeletor = (...values: T[]) => Context; interface Selector extends PartialSeletor { except?: PartialSeletor; } export interface Context extends Context.Delegates { } export class Context { filter: Filter; app?: App; private _plugin; static readonly middleware: unique symbol; static readonly current: unique symbol; protected _bots: Bot[] & Record; protected constructor(filter: Filter, app?: App, _plugin?: Plugin); private static inspect; [inspect.custom](): string; private createSelector; get user(): Selector; get self(): Selector; get group(): Selector; get channel(): Selector; get platform(): Selector; get private(): Selector; get bots(): Bot[] & Record>; logger(name: string): Logger; select(key: K, ...values: Session[K][]): Context; unselect(key: K, ...values: Session[K][]): Context; all(): Context; union(arg: Filter | Context): Context; intersect(arg: Filter | Context): Context; except(arg: Filter | Context): Context; match(session?: Session): boolean; get state(): Plugin.State; addSideEffect(state?: Plugin.State): void; private teleport; with(deps: D, callback: Plugin.Teleporter): this; plugin(plugin: T, options?: boolean | Plugin.Config): this; dispose(plugin?: Plugin): Promise; parallel(name: K, ...args: Parameters): Promise; parallel(session: Session, name: K, ...args: Parameters): Promise; emit(name: K, ...args: Parameters): void; emit(session: Session, name: K, ...args: Parameters): void; waterfall(name: K, ...args: Parameters): Promisify>; waterfall(session: Session, name: K, ...args: Parameters): Promisify>; chain(name: K, ...args: Parameters): ReturnType; chain(session: Session, name: K, ...args: Parameters): ReturnType; serial(name: K, ...args: Parameters): Promisify>; serial(session: Session, name: K, ...args: Parameters): Promisify>; bail(name: K, ...args: Parameters): ReturnType; bail(session: Session, name: K, ...args: Parameters): ReturnType; on(name: K, listener: EventMap[K], prepend?: boolean): () => boolean; before(name: K, listener: BeforeEventMap[K], append?: boolean): () => boolean; once(name: K, listener: EventMap[K], prepend?: boolean): () => boolean; off(name: K, listener: EventMap[K]): boolean; middleware(middleware: Middleware, prepend?: boolean): () => boolean; private createTimerDispose; setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; command(def: D, config?: Command.Config): Command>; command(def: D, desc: string, config?: Command.Config): Command>; transformAssets(content: string, assets?: Assets): Promise; getBot(platform: Platform, selfId?: string): Bot; getSelfIds(type?: Platform, assignees?: readonly string[]): Record; broadcast(content: string, forced?: boolean): Promise; broadcast(channels: readonly string[], content: string, forced?: boolean): Promise; static delegate(key: string & keyof Context): void; } export namespace Context { interface Delegates { database: Database; assets: Assets; router: Router; } } type FlattenEvents = { [K in keyof T & string]: K | `${K}/${FlattenEvents}`; }[keyof T & string]; type SessionEventMap = { [K in FlattenEvents]: K extends `${infer X}/${infer R}` ? R extends `${infer Y}/${any}` ? (session: Session.Payload) => void : (session: Session.Payload) => void : (session: Session.Payload) => void; }; type DelegateEventMap = { [K in keyof Context.Delegates as `delegate/${K}`]: () => void; }; type EventName = keyof EventMap; type OmitSubstring = S extends `${infer L}${T}${infer R}` ? `${L}${R}` : never; type BeforeEventName = OmitSubstring; export type BeforeEventMap = { [E in EventName & string as OmitSubstring]: EventMap[E]; }; export interface EventMap extends SessionEventMap, DelegateEventMap { [Context.middleware]: Middleware; 'appellation'(name: string, session: Session): string; 'before-parse'(content: string, session: Session): Argv; 'parse'(argv: Argv, session: Session): string; 'before-attach-channel'(session: Session, fields: Set): void; 'attach-channel'(session: Session): Awaitable; 'before-attach-user'(session: Session, fields: Set): void; 'attach-user'(session: Session): Awaitable; 'before-attach'(session: Session): void; 'attach'(session: Session): void; 'before-send'(session: Session): Awaitable; 'before-command'(argv: Argv): Awaitable; 'command'(argv: Argv): Awaitable; 'command-added'(command: Command): void; 'command-removed'(command: Command): void; 'middleware'(session: Session): void; 'plugin-added'(plugin: Plugin, registry: Map): void; 'plugin-removed'(plugin: Plugin, registry: Map): void; 'before-connect'(): Awaitable; 'connect'(): void; 'before-disconnect'(): Awaitable; 'disconnect'(): void; } export interface Token { rest?: string; content: string; quoted: boolean; terminator: string; inters: Argv[]; } export interface Argv { args?: A; options?: O; error?: string; source?: string; initiator?: string; terminator?: string; session?: Session; command?: Command; rest?: string; pos?: number; root?: boolean; tokens?: Token[]; name?: string; next?: NextFunction; } export namespace Argv { export interface Interpolation { terminator?: string; parse?(source: string): Argv; } export function interpolate(initiator: string, terminator: string, parse?: (source: string) => Argv): void; export class Tokenizer { private bracs; constructor(); interpolate(initiator: string, terminator: string, parse?: (source: string) => Argv): void; parseToken(source: string, stopReg?: string): Token; parse(source: string, terminator?: string): Argv; stringify(argv: Argv): string; } export function parse(source: string, terminator?: string): Argv; export function stringify(argv: Argv): string; export function revert(token: Token): void; export function parsePid(target: string): [Platform, string]; export interface Domain { string: string; number: number; boolean: boolean; text: string; rawtext: string; user: string; channel: string; integer: number; posint: number; natural: number; date: Date; } type DomainType = keyof Domain; type ParamType = S extends `${any}:${infer T}` ? T extends DomainType ? Domain[T] : F : F; type Replace = S extends `${infer L}${X}${infer R}` ? `${L}${Y}${Replace}` : S; type ExtractAll = S extends `${infer L}]${infer R}` ? [ParamType, ...ExtractAll] : []; type ExtractFirst = S extends `${infer L}]${any}` ? ParamType : boolean; type ExtractSpread = S extends `${infer L}...${infer R}` ? [...ExtractAll, ...ExtractFirst[]] : [...ExtractAll, ...string[]]; export type ArgumentType = ExtractSpread', ']'>>; export type OptionType = ExtractFirst', ']'>, any>; export type Type = DomainType | RegExp | string[] | Transform; export interface Declaration { name?: string; type?: Type; fallback?: any; variadic?: boolean; required?: boolean; } export type Transform = (source: string, session: Session) => T; export interface DomainConfig { transform?: Transform; greedy?: boolean; } export function createDomain(name: K, transform: Transform, options?: DomainConfig): void; export function parseValue(source: string, quoted: boolean, kind: string, argv: Argv, decl?: Declaration): any; export interface OptionConfig { value?: any; fallback?: any; type?: T; /** hide the option by default */ hidden?: boolean | ((session: Session) => boolean); authority?: number; notUsage?: boolean; } export interface TypedOptionConfig extends OptionConfig { type: T; } export interface OptionDeclaration extends Declaration, OptionConfig { description?: string; values?: Record; } type OptionDeclarationMap = Record; export class CommandBase { name: string; description: string; declaration: string; _arguments: Declaration[]; _options: OptionDeclarationMap; private _namedOptions; private _symbolicOptions; constructor(name: string, declaration: string, description: string); _createOption(name: string, def: string, config: OptionConfig): void; private _assignOption; removeOption(name: K): boolean; parse(argv: Argv): Argv; parse(source: string, terminator?: string, args?: any[], options?: Record): Argv; private stringifyArg; stringify(args: readonly string[], options: any): string; } export {}; } export type UserType = T | ((user: Pick) => T); export type Extend = { [P in K | keyof O]?: (P extends keyof O ? O[P] : unknown) & (P extends K ? T : unknown); }; export namespace Command { interface Config { /** hide all options by default */ hideOptions?: boolean; /** hide command */ hidden?: boolean; /** min authority */ authority?: number; /** disallow unknown options */ checkUnknown?: boolean; /** check argument count */ checkArgCount?: boolean; /** show command warnings */ showWarning?: boolean; /** usage identifier */ usageName?: string; /** max usage per day */ maxUsage?: UserType; /** min interval */ minInterval?: UserType; /** depend on existing commands */ patch?: boolean; } interface Shortcut { name?: string | RegExp; command?: Command; authority?: number; prefix?: boolean; fuzzy?: boolean; args?: string[]; options?: Record; } type Action = (argv: Argv, ...args: A) => Awaitable; type Usage = string | ((session: Session) => Awaitable); } export class Command extends Argv.CommandBase { context: Context; config: Command.Config; children: Command[]; parent: Command; _aliases: string[]; _examples: string[]; _usage?: Command.Usage; _disposed?: boolean; _disposables?: Disposable[]; private _userFields; private _channelFields; private _actions; private _checkers; static defaultConfig: Command.Config; static defaultOptionConfig: Argv.OptionConfig; private static _userFields; private static _channelFields; static userFields(fields: FieldCollector<'user'>): typeof Command; static channelFields(fields: FieldCollector<'channel'>): typeof Command; constructor(name: string, decl: string, desc: string, context: Context); get app(): App; private _registerAlias; [inspect.custom](): string; userFields(fields: FieldCollector<'user', T, A, O>): Command; channelFields(fields: FieldCollector<'channel', T, A, O>): Command; alias(...names: string[]): this; shortcut(name: string | RegExp, config?: Command.Shortcut): this; subcommand(def: D, config?: Command.Config): Command>; subcommand(def: D, desc: string, config?: Command.Config): Command>; usage(text: Command.Usage): this; example(example: string): this; option(name: K, desc: string, config: Argv.TypedOptionConfig): Command>; option(name: K, desc: string, config: Argv.TypedOptionConfig<(source: string) => R>): Command>; option(name: K, desc: string, config: Argv.TypedOptionConfig): Command>; option(name: K, desc: D, config?: Argv.OptionConfig): Command>>; match(session: Session): boolean; getConfig(key: K, session: Session): Exclude any>; check(callback: Command.Action, prepend?: boolean): this; action(callback: Command.Action, append?: boolean): this; execute(argv0: Argv, next?: NextFunction): Promise; dispose(): void; } export function getUsageName(command: Command): string; export type ValidationField = 'authority' | 'usage' | 'timers'; export function getUsage(name: string, user: Pick): number; export function checkUsage(name: string, user: Pick, maxUsage?: number): boolean; export function checkTimer(name: string, { timers }: Pick, offset?: number): boolean; type UnionToIntersection = (U extends any ? (key: U) => void : never) extends (key: infer I) => void ? I : never; type Flatten = UnionToIntersection; type InnerKeys = keyof Flatten & keyof Flatten; export interface Session extends MessageBase, Partial, Partial { } export namespace Session { type Genres = 'friend' | 'channel' | 'group' | 'group-member' | 'group-role' | 'group-file' | 'group-emoji'; type Actions = 'added' | 'deleted' | 'updated'; export interface Events extends Record<`${Genres}-${Actions}`, {}> { } export type MessageAction = 'message' | 'message-deleted' | 'message-updated' | 'send'; export type Message = Session; export interface Events extends Record { } export type RequestAction = 'friend-request' | 'group-request' | 'group-member-request'; export type Request = Session; export interface Events extends Record { } export interface Events { 'friend-request': {}; 'group-request': {}; 'group-member-request': {}; 'group-added': GroupMemberChangeType; 'group-member-added': GroupMemberChangeType; 'group-deleted': GroupMemberChangeType; 'group-member-deleted': GroupMemberChangeType; 'group-member': { 'role': {}; 'ban': {}; 'nickname': {}; }; 'notice': { 'poke': {}; 'lucky-king': {}; 'honor': { 'talkative': {}; 'performer': {}; 'emotion': {}; }; }; 'reaction-added': {}; 'reaction-deleted': { 'one': {}; 'all': {}; 'emoji': {}; }; } export interface GroupMemberChangeType { 'active': {}; 'passive': {}; } export interface MessageType { 'private': {}; 'group': {}; } type ParamX = Extract; type ParamY = Extract>, Y>; export type Payload = Session, ParamY>; export {}; } export interface Parsed { content: string; prefix: string; appel: boolean; } export class Session = InnerKeys> { type?: X; subtype?: Y; subsubtype?: InnerKeys, Y>; platform?: P; selfId?: string; operatorId?: string; targetId?: string; duration?: number; file?: FileInfo; readonly app: App; readonly bot: Bot.Instance

; readonly sid: string; uid: string; cid: string; gid: string; id?: string; argv?: Argv; user?: User.Observed; channel?: Channel.Observed; parsed?: Parsed; private _delay?; private _queued; private _hooks; private _promise; static readonly send: unique symbol; constructor(app: App, session: Partial); toJSON(): Partial; private _preprocess; preprocess(): Promise; get username(): string; get database(): Database; send(message: string): Promise; cancelQueued(delay?: number): void; sendQueued(content: string, delay?: number): Promise; resolveValue(source: T | ((session: Session) => T)): T; getChannel(id?: string, assignee?: string, fields?: K[]): Promise>; /** 在当前会话上绑定一个可观测频道实例 */ observeChannel(fields?: Iterable): Promise>; getUser(id?: string, authority?: number, fields?: K[]): Promise>; /** 在当前会话上绑定一个可观测用户实例 */ observeUser(fields?: Iterable): Promise>; collect(key: T, argv: Argv, fields?: Set): Set; resolve(argv: Argv): Command; execute(content: string, next?: true | NextFunction): Promise; execute(argv: Argv, next?: true | NextFunction): Promise; middleware(middleware: Middleware): () => boolean; prompt(timeout?: number): Promise; suggest(options: SuggestOptions): Promise; } export interface SuggestOptions { target: string; items: string[]; next?: NextFunction; prefix?: string; suffix: string; minSimilarity?: number; apply: (this: Session, suggestion: string, next: NextFunction) => void; } export function getSessionId(session: Session): string; export type FieldCollector = Iterable | ((argv: Argv, fields: Set) => void); export interface FileInfo { id: string; name: string; size: number; busid: number; } export interface BotOptions { type?: string; token?: string; selfId?: string; } type BotList = Array & Record; export function createBots(key: 'selfId' | 'sid'): BotList; export abstract class Adapter

{ app: App; private Bot?; bots: BotList>; abstract start(): Promise; abstract stop?(): void; constructor(app: App, Bot?: Bot.Constructor

); create(options: BotOptions, constructor?: Bot.Constructor

): Bot.Instance

; dispatch(session: Session): void; } export namespace Adapter { type Constructor = new (app: App, bot: BotOptions) => Adapter; type Instances = { [K in string]: K extends `${infer T}:${any}` ? Adapter : Adapter; }; const types: Record; function from(app: App, bot: BotOptions): Adapter; function redirect(target: string | ((bot: BotOptions) => string)): Constructor; interface WsClientOptions { retryLazy?: number; retryTimes?: number; retryInterval?: number; } abstract class WsClient

extends Adapter

{ abstract prepare(bot: Bot.Instance

): WebSocket | Promise; abstract connect(bot: Bot.Instance

): Promise; private _listening; options: WsClientOptions; static options: WsClientOptions; constructor(app: App, Bot: Bot.Constructor

, options?: WsClientOptions); private _listen; start(): Promise; stop(): void; } } export interface Bot

extends BotOptions, UserBase { [Session.send](session: Session, message: string): Promise; status: Bot.Status; socket?: WebSocket; version?: string; getStatus(): Promise; sendMessage(channelId: string, content: string, groupId?: string): Promise; sendPrivateMessage(userId: string, content: string): Promise; getMessage(channelId: string, messageId: string): Promise; editMessage(channelId: string, messageId: string, content: string): Promise; deleteMessage(channelId: string, messageId: string): Promise; getSelf(): Promise; getUser(userId: string): Promise; getFriendList(): Promise; deleteFriend(userId: string): Promise; getGroup(groupId: string): Promise; getGroupList(): Promise; getGroupMember(groupId: string, userId: string): Promise; getGroupMemberList(groupId: string): Promise; getChannel(channelId: string): Promise; getChannelList(groupId: string): Promise; handleFriendRequest(messageId: string, approve: boolean, comment?: string): Promise; handleGroupRequest(messageId: string, approve: boolean, comment?: string): Promise; handleGroupMemberRequest(messageId: string, approve: boolean, comment?: string): Promise; } export class Bot

{ adapter: Adapter

; readonly app: App; readonly logger: Logger; readonly platform: P; constructor(adapter: Adapter

, options: BotOptions); get sid(): string; createSession(session: Partial>): Session; getGroupMemberMap(groupId: string): Promise<{ [k: string]: string; }>; broadcast(channels: string[], content: string, delay?: number): Promise; } export namespace Bot { interface Platforms { } type Instance = [T] extends [never] ? Bot : Platforms[T]; type Constructor = new (adapter: Adapter, options: BotOptions) => Instance; enum Status { /** 正常运行 */ GOOD = 0, /** 机器人处于闲置状态 */ BOT_IDLE = 1, /** 机器人离线 */ BOT_OFFLINE = 2, /** 无法获得状态 */ NET_ERROR = 3, /** 服务器状态异常 */ SERVER_ERROR = 4, /** 机器人被封禁 */ BANNED = 5, /** 正在尝试连接 */ CONNECTING = 6 } } export type Platform = keyof Bot.Platforms; export interface ChannelInfo { channelId: string; channelName?: string; } export interface GroupInfo { groupId: string; groupName?: string; } export interface UserBase { username?: string; nickname?: string; avatar?: string; discriminator?: string; isBot?: boolean; } export interface UserInfo extends UserBase { userId: string; } export interface GroupMemberInfo extends UserInfo { roles?: string[]; } export interface AuthorInfo extends GroupMemberInfo { anonymous?: string; } export interface RoleInfo { id: string; } export interface MessageBase { messageId?: string; channelId?: string; groupId?: string; userId?: string; content?: string; timestamp?: number; author?: AuthorInfo; quote?: MessageInfo; } export interface MessageInfo extends MessageBase { subtype?: keyof Session.Events['message']; } export * from 'koishi-utils'; export const version: string; declare module 'koa' { interface Request { body?: any; rawBody: string; } }export default function apply(ctx: Context): void;