dexare
Version:
Modular and extendable Discord bot framework
59 lines (52 loc) • 1.89 kB
text/typescript
import Collection from '@discordjs/collection';
import Eris from 'eris';
import DexareClient from '../../client';
import DexareModule from '../../module';
import Collector from './collector';
import MessageCollector, { MessageCollectorFilter, MessageCollectorOptions } from './message';
/** The options for {@link CollectorModule#awaitMessages}. */
export interface AwaitMessagesOptions extends MessageCollectorOptions {
/** Stop/end reasons that cause the promise to reject */
errors?: string[];
}
/** The Dexare module for collecting objects. */
export default class CollectorModule<T extends DexareClient<any>> extends DexareModule<T> {
readonly activeCollectors = new Collection<string, Collector>();
constructor(client: T) {
super(client, {
name: 'collector',
description: "Dexare's collection handler, for asynchronous object collection."
});
this.filePath = __filename;
}
/**
* Creates a message collector.
* @param channel The channel to create the collector for
* @param filter The filter to use against new messages
* @param options The options for the collector.
*/
createMessageCollector(
channel: Eris.TextableChannel,
filter: MessageCollectorFilter,
options: MessageCollectorOptions = {}
): MessageCollector {
return new MessageCollector(this, channel, filter, options);
}
/** Awaits messages in a channel. */
awaitMessages(
channel: Eris.TextableChannel,
filter: MessageCollectorFilter,
options: AwaitMessagesOptions = {}
) {
return new Promise((resolve, reject) => {
const collector = this.createMessageCollector(channel, filter, options);
collector.once('end', (collection, reason) => {
if (options.errors && options.errors.includes(reason)) {
reject(collection);
} else {
resolve(collection);
}
});
});
}
}