declare module 'eris-boiler' { import { Client, ClientOptions, Message, ExtendedUser, GuildTextableChannel, PrivateChannel, EmbedOptions, FileContent, GroupChannel } from '@alex-taxiera/eris' import { ExtendedMap, Status } from 'eris-boiler/util' type PrivateTextableChannel = PrivateChannel | GroupChannel type CommandData = { name: string description: string run?: CommandAction options?: CommandOptions } type SettingCommandData = { displayName: string setting: string getValue?: SettingCommandGetValue } & CommandData type CommandOptions = { aliases?: string[] parameters?: string[] permission?: Permission postHook?: PostHook deleteInvoking?: boolean deleteResponse?: boolean deleteResponseDelay?: number subCommands?: Command[] dmOnly?: boolean guildOnly?: boolean } type PostHook = (bot: T, context: C, response: C['msg']) => void type CommandAction = (bot: T, context: C) => CommandResults | Promise type SettingCommandGetValue = (bot: T, context: C) => string | Promise interface CommandContext { params: string[] msg: Message } interface GuildCommandContext extends CommandContext { msg: Message } interface PrivateCommandContext extends CommandContext { msg: Message } type CommandResults = undefined | string | MessageData | WebhookData interface MessageData { content?: string embed?: EmbedOptions file?: FileContent dm?: boolean webhook?: boolean badCommand?: boolean } interface WebhookData extends MessageData { webhook: true username?: string avatarURL?: string dm?: false } class Command { constructor(data: CommandData) name: string description: string run: CommandAction aliases: string[] parameters: string[] middleware: CommandMiddleware[] deleteInvoking: boolean deleteResponse: boolean deleteResponseDelay: number permission: Permission postHook?: PostHook dmOnly: boolean guildOnly: boolean subCommands: ExtendedMap> info: string } class GuildCommand extends Command {} class PrivateCommand extends Command {} class SettingCommand extends GuildCommand { constructor(data: SettingCommandData) displayName: string setting: string getValue: SettingCommandGetValue } class ToggleCommand extends SettingCommand {} type AnyCommand = Command | PrivateCommand | GuildCommand | SettingCommand | ToggleCommand class CommandMiddleware { constructor(data: CommandMiddlewareData) run: MiddlewareRun } type CommandMiddlewareData = { run?: MiddlewareRun } type MiddlewareRun = (bot: T, context: C) => Promise | unknown type PermissionRun = (bot: T, context: C) => Promise | boolean type DataClientOptions = { databaseManager?: DatabaseManager oratorOptions?: OratorOptions statusManagerOptions?: StatusManagerOptions erisOptions?: ClientOptions } type Loadable = string | LoadableObject | (string | LoadableObject)[] type LoadableObject = Command | DiscordEvent | Permission class DataClient extends Client { constructor(token: string, options?: DataClientOptions) dbm: DatabaseManager ora: Orator sm: StatusManager commands: ExtendedMap> permissions: ExtendedMap> connect(): Promise findCommand(name: string, commands: ExtendedMap>): AnyCommand | undefined addCommands(...commands: (string | AnyCommand | (string | AnyCommand)[])[]): DataClient addSettingCommands(...commands: (string | SettingCommand | ToggleCommand | (string | SettingCommand | ToggleCommand)[])[]): DataClient addEvents(...events: (string | DiscordEvent | (string | DiscordEvent)[])[]): DataClient addPermissions(...permissions: (string | Permission | (string | Permission)[])[]): DataClient } type DatabaseManagerOptions = { DataObject: DatabaseObjectBuilder DataQuery: DatabaseQueryBuilder } type DatabaseObjectBuilder = (...params: any[]) => DatabaseObject type DatabaseQueryBuilder = (...params: any[]) => DatabaseQuery abstract class DatabaseManager { newObject(type: string, data?: any, isNew?: boolean): DatabaseObject newQuery(type: string): DatabaseQuery abstract add(type: string, data: any): Promise abstract delete(object: DatabaseObject): Promise abstract update(object: DatabaseObject): Promise abstract get(query: DatabaseQuery): Promise abstract find(query: DatabaseQuery): Promise } type DatabaseObjectOptions = { isNew?: boolean } class DatabaseObject { constructor(databaseManager: DatabaseManager, type: string, data?: any, options?: DatabaseObjectOptions) type: string id: string get(prop: string): any set(prop: string, val: any): DatabaseObject toJSON(): any delete(): Promise save(data?: any): Promise } type SubQueryType = 'and' | 'or' type SubQuery = { type: SubQueryType query: DatabaseQuery } class DatabaseQuery { constructor(databaseManager: DatabaseManager, type: string) type: string maxResults: number conditions: any sort: any getId: string subQueries: SubQuery[] static or(queries: DatabaseQuery[]): DatabaseQuery static and(queries: DatabaseQuery[]): DatabaseQuery or(queries: DatabaseQuery[]): this and(queries: DatabaseQuery[]): this limit(num: number): this equalTo(prop: string, val: any): this notEqualTo(prop: string, val: any): this lessThan(prop: string, num: number): this greaterThan(prop: string, num: number): this find(): Promise get(value: any, key?: string): Promise } type DiscordEventData = { name: string run: DiscordEventRunner } type DiscordEventRunner = (bot: T, ...rest: any[]) => void class DiscordEvent { constructor(data: DiscordEventData) name: string run: DiscordEventRunner } class Orator { constructor(defaultPrefix: string, oratorOptions: OratorOptions) defaultPrefix: string permissions: Permission[] tryMessageDelete(me: ExtendedUser, msg: Message): Promise | void tryCreateMessage(me: ExtendedUser, channel: GuildTextableChannel, content: string | any, file: any): Promise | undefined> | undefined tryDMCreateMessage(me: ExtendedUser, msg: Message, content: string | any, file: any): Promise > processMessage(bot: T, msg: Message): void hasPermission(bot: T, context: C): Promise<{ ok: boolean; message: string }> } type OratorOptions = { defaultPrefix?: string deleteInvoking?: boolean deleteResponse?: boolean deleteResponseDelay?: number } type PermissionData = { level?: number reason?: string run?: PermissionRun } class Permission extends CommandMiddleware { constructor(data: PermissionData) run: PermissionRun } class RAMManager extends DatabaseManager { constructor() add(type: string, data: any): Promise delete(object: DatabaseObject): Promise update(object: DatabaseObject): Promise get(query: DatabaseQuery): Promise find(query: DatabaseQuery): Promise } type ConnectionData = { connectionInfo: ConnectionInfo | string client: string pool?: PoolInfo } type ConnectionInfo = { database: string user: string password?: string host: string } type PoolInfo = { max?: number min?: number } class SQLManager extends DatabaseManager { constructor(connection: ConnectionData, options?: DatabaseManagerOptions) protected readonly _qb: any add(type: string, data: any): Promise delete(object: DatabaseObject): Promise update(object: DatabaseObject): Promise get(query: DatabaseQuery): Promise find(query: DatabaseQuery): Promise } type StatusManagerOptions = { mode?: string interval?: number defaultStatus: Status } class StatusManager { constructor(bot: DataClient, databaseManager: DatabaseManager, options?: StatusManagerOptions) defaultStatus: Status current: Status initialize(): Promise getStatuses(): Promise findStatusByName(name: string): Promise addStatus(status: Status): Promise deleteStatus(dbStatus: DatabaseObject): Promise setStatus(status?: Status): Promise timerStart(): void timerEnd(): void } } declare module 'eris-boiler/util' { export { default as logger } from 'eris-boiler/util/logger' type Key = string | number export type FilterCallback = (item: T) => boolean export class ExtendedMap extends Map { find(func: FilterCallback): T | undefined filter(func: FilterCallback): T[] map(func: (item: T) => R): R[] reduce(func: (accumulator: T, item: T) => T, initialValue?: T): T reduce(func: (accumulator: R, item: T) => R, initialValue: R): R every(func: FilterCallback): boolean some(func: FilterCallback): boolean } export type Status = { name: string type: number } } declare module 'eris-boiler/util/logger' { function success (...args: any[]): unknown function warn (...args: any[]): unknown function error (...args: any[]): unknown function info (...args: any[]): unknown }