eris-boiler
Version:
A Discord bot framework using eris
342 lines (290 loc) • 11.1 kB
TypeScript
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<T extends DataClient, C extends CommandContext> = {
name: string
description: string
run?: CommandAction<T, C>
options?: CommandOptions<T, C>
}
type SettingCommandData<T extends DataClient, C extends CommandContext> = {
displayName: string
setting: string
getValue?: SettingCommandGetValue<T, C>
} & CommandData<T, C>
type CommandOptions<T extends DataClient, C extends CommandContext> = {
aliases?: string[]
parameters?: string[]
permission?: Permission<T>
postHook?: PostHook<T, C>
deleteInvoking?: boolean
deleteResponse?: boolean
deleteResponseDelay?: number
subCommands?: Command<T, C>[]
dmOnly?: boolean
guildOnly?: boolean
}
type PostHook<T extends DataClient, C extends CommandContext> = (bot: T, context: C, response: C['msg']) => void
type CommandAction<T extends DataClient, C extends CommandContext> = (bot: T, context: C) => CommandResults | Promise<CommandResults>
type SettingCommandGetValue<T extends DataClient, C extends CommandContext> = (bot: T, context: C) => string | Promise<string>
interface CommandContext {
params: string[]
msg: Message
}
interface GuildCommandContext extends CommandContext {
msg: Message<GuildTextableChannel>
}
interface PrivateCommandContext extends CommandContext {
msg: Message<PrivateTextableChannel>
}
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<T extends DataClient = DataClient, C extends CommandContext = CommandContext> {
constructor(data: CommandData<T, C>)
name: string
description: string
run: CommandAction<T, C>
aliases: string[]
parameters: string[]
middleware: CommandMiddleware<T>[]
deleteInvoking: boolean
deleteResponse: boolean
deleteResponseDelay: number
permission: Permission<T>
postHook?: PostHook<T, C>
dmOnly: boolean
guildOnly: boolean
subCommands: ExtendedMap<string, Command<T, C>>
info: string
}
class GuildCommand<T extends DataClient = DataClient> extends Command<T, GuildCommandContext> {}
class PrivateCommand<T extends DataClient = DataClient> extends Command<T, PrivateCommandContext> {}
class SettingCommand<T extends DataClient = DataClient> extends GuildCommand<T> {
constructor(data: SettingCommandData<T, GuildCommandContext>)
displayName: string
setting: string
getValue: SettingCommandGetValue<T, GuildCommandContext>
}
class ToggleCommand<T extends DataClient = DataClient> extends SettingCommand<T> {}
type AnyCommand<T extends DataClient = DataClient> = Command<T> | PrivateCommand<T> | GuildCommand<T> | SettingCommand<T> | ToggleCommand<T>
class CommandMiddleware<T extends DataClient, C extends CommandContext = CommandContext> {
constructor(data: CommandMiddlewareData<T, C>)
run: MiddlewareRun<T, C>
}
type CommandMiddlewareData<T extends DataClient, C extends CommandContext> = {
run?: MiddlewareRun<T, C>
}
type MiddlewareRun<T extends DataClient, C extends CommandContext> = (bot: T, context: C) => Promise<unknown> | unknown
type PermissionRun<T extends DataClient, C extends CommandContext> = (bot: T, context: C) => Promise<boolean> | boolean
type DataClientOptions = {
databaseManager?: DatabaseManager
oratorOptions?: OratorOptions
statusManagerOptions?: StatusManagerOptions
erisOptions?: ClientOptions
}
type Loadable<T extends DataClient> = string | LoadableObject<T> | (string | LoadableObject<T>)[]
type LoadableObject<T extends DataClient> = Command | DiscordEvent | Permission
class DataClient extends Client {
constructor(token: string, options?: DataClientOptions)
dbm: DatabaseManager
ora: Orator
sm: StatusManager
commands: ExtendedMap<string, AnyCommand<this>>
permissions: ExtendedMap<string, Permission<this>>
connect(): Promise<void>
findCommand(name: string, commands: ExtendedMap<string, AnyCommand<this>>): AnyCommand<this> | undefined
addCommands(...commands: (string | AnyCommand<this> | (string | AnyCommand<this>)[])[]): DataClient
addSettingCommands(...commands: (string | SettingCommand<this> | ToggleCommand<this> | (string | SettingCommand<this> | ToggleCommand<this>)[])[]): DataClient
addEvents(...events: (string | DiscordEvent<this> | (string | DiscordEvent<this>)[])[]): DataClient
addPermissions(...permissions: (string | Permission<this> | (string | Permission<this>)[])[]): 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<any>
abstract delete(object: DatabaseObject): Promise<void>
abstract update(object: DatabaseObject): Promise<any>
abstract get(query: DatabaseQuery): Promise<any>
abstract find(query: DatabaseQuery): Promise<any[]>
}
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<void>
save(data?: any): Promise<DatabaseObject>
}
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<DatabaseObject[]>
get(value: any, key?: string): Promise<DatabaseObject | undefined>
}
type DiscordEventData<T extends DataClient> = {
name: string
run: DiscordEventRunner<T>
}
type DiscordEventRunner<T> = (bot: T, ...rest: any[]) => void
class DiscordEvent<T extends DataClient = DataClient> {
constructor(data: DiscordEventData<T>)
name: string
run: DiscordEventRunner<T>
}
class Orator<T extends DataClient = DataClient> {
constructor(defaultPrefix: string, oratorOptions: OratorOptions)
defaultPrefix: string
permissions: Permission<T>[]
tryMessageDelete(me: ExtendedUser, msg: Message): Promise<void> | void
tryCreateMessage(me: ExtendedUser, channel: GuildTextableChannel, content: string | any, file: any): Promise<Message<GuildTextableChannel> | undefined> | undefined
tryDMCreateMessage(me: ExtendedUser, msg: Message<GuildTextableChannel>, content: string | any, file: any): Promise<Message<GuildTextableChannel> >
processMessage(bot: T, msg: Message): void
hasPermission<C extends CommandContext = CommandContext>(bot: T, context: C): Promise<{ ok: boolean; message: string }>
}
type OratorOptions = {
defaultPrefix?: string
deleteInvoking?: boolean
deleteResponse?: boolean
deleteResponseDelay?: number
}
type PermissionData<T extends DataClient, C extends CommandContext> = {
level?: number
reason?: string
run?: PermissionRun<T, C>
}
class Permission<T extends DataClient = DataClient, C extends CommandContext = CommandContext> extends CommandMiddleware<T, C> {
constructor(data: PermissionData<T, C>)
run: PermissionRun<T, C>
}
class RAMManager extends DatabaseManager {
constructor()
add(type: string, data: any): Promise<any>
delete(object: DatabaseObject): Promise<void>
update(object: DatabaseObject): Promise<any>
get(query: DatabaseQuery): Promise<any>
find(query: DatabaseQuery): Promise<any[]>
}
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<any>
delete(object: DatabaseObject): Promise<void>
update(object: DatabaseObject): Promise<any>
get(query: DatabaseQuery): Promise<any>
find(query: DatabaseQuery): Promise<any[]>
}
type StatusManagerOptions = {
mode?: string
interval?: number
defaultStatus: Status
}
class StatusManager {
constructor(bot: DataClient, databaseManager: DatabaseManager, options?: StatusManagerOptions)
defaultStatus: Status
current: Status
initialize(): Promise<void>
getStatuses(): Promise<DatabaseObject[]>
findStatusByName(name: string): Promise<DatabaseObject[]>
addStatus(status: Status): Promise<void>
deleteStatus(dbStatus: DatabaseObject): Promise<void>
setStatus(status?: Status): Promise<void>
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<T> = (item: T) => boolean
export class ExtendedMap<Key, T> extends Map<Key,T> {
find(func: FilterCallback<T>): T | undefined
filter(func: FilterCallback<T>): T[]
map<R>(func: (item: T) => R): R[]
reduce(func: (accumulator: T, item: T) => T, initialValue?: T): T
reduce<R>(func: (accumulator: R, item: T) => R, initialValue: R): R
every(func: FilterCallback<T>): boolean
some(func: FilterCallback<T>): 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
}