Merge pull request #132 from DjDeveloperr/refactor

breaking: client.ping -> client.gateway.ping, some jsdoc, RolesManager#fetch -> RolesManager#fetchAll
This commit is contained in:
DjDeveloper 2021-04-17 14:05:36 +05:30 committed by GitHub
commit 3868d29e3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 40 additions and 24 deletions

View File

@ -59,7 +59,7 @@ client.on('ready', () => {
// Listen for event whenever a Message is sent // Listen for event whenever a Message is sent
client.on('messageCreate', (msg: Message): void => { client.on('messageCreate', (msg: Message): void => {
if (msg.content === '!ping') { if (msg.content === '!ping') {
msg.channel.send(`Pong! WS Ping: ${client.ping}`) msg.channel.send(`Pong! WS Ping: ${client.gateway.ping}`)
} }
}) })
@ -95,7 +95,7 @@ class PingCommand extends Command {
name = 'ping' name = 'ping'
execute(ctx: CommandContext) { execute(ctx: CommandContext) {
ctx.message.reply(`pong! Ping: ${ctx.client.ping}ms`) ctx.message.reply(`pong! Ping: ${ctx.client.gateway.ping}ms`)
} }
} }

View File

@ -71,15 +71,13 @@ export interface ClientOptions {
} }
/** /**
* Discord Client. * Harmony Client. Provides high-level interface over the REST and WebSocket API.
*/ */
export class Client extends HarmonyEventEmitter<ClientEvents> { export class Client extends HarmonyEventEmitter<ClientEvents> {
/** REST Manager - used to make all requests */ /** REST Manager - used to make all requests */
rest: RESTManager rest: RESTManager
/** User which Client logs in to, undefined until logs in */ /** User which Client logs in to, undefined until logs in */
user?: User user?: User
/** WebSocket ping of Client */
ping = 0
/** Token of the Bot/User */ /** Token of the Bot/User */
token?: string token?: string
/** Cache Adapter */ /** Cache Adapter */
@ -148,9 +146,9 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
} }
} }
/** Get Shard 0's Gateway */
get gateway(): Gateway { get gateway(): Gateway {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return this.shards.list.get('0')!
return this.shards.list.get('0') as Gateway
} }
applicationID?: string applicationID?: string
@ -289,7 +287,10 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
* @param token Your token. This is required if not given in ClientOptions. * @param token Your token. This is required if not given in ClientOptions.
* @param intents Gateway intents in array. This is required if not given in ClientOptions. * @param intents Gateway intents in array. This is required if not given in ClientOptions.
*/ */
async connect(token?: string, intents?: GatewayIntents[]): Promise<Client> { async connect(
token?: string,
intents?: Array<GatewayIntents | keyof typeof GatewayIntents>
): Promise<Client> {
token ??= this.token token ??= this.token
if (token === undefined) throw new Error('No Token Provided') if (token === undefined) throw new Error('No Token Provided')
this.token = token this.token = token
@ -301,7 +302,9 @@ export class Client extends HarmonyEventEmitter<ClientEvents> {
} else if (intents === undefined && this.intents !== undefined) { } else if (intents === undefined && this.intents !== undefined) {
intents = this.intents intents = this.intents
} else if (intents !== undefined && this.intents === undefined) { } else if (intents !== undefined && this.intents === undefined) {
this.intents = intents this.intents = intents.map((e) =>
typeof e === 'string' ? GatewayIntents[e] : e
)
} else throw new Error('No Gateway Intents were provided') } else throw new Error('No Gateway Intents were provided')
this.rest.token = token this.rest.token = token

View File

@ -43,6 +43,11 @@ export interface CommandClientOptions extends ClientOptions {
caseSensitive?: boolean caseSensitive?: boolean
} }
/**
* Harmony Client with extended functionality for Message based Commands parsing and handling.
*
* See SlashClient (`Client#slash`) for more info about Slash Commands.
*/
export class CommandClient extends Client implements CommandClientOptions { export class CommandClient extends Client implements CommandClientOptions {
prefix: string | string[] prefix: string | string[]
mentionPrefix: boolean mentionPrefix: boolean
@ -372,7 +377,9 @@ export class CommandClient extends Client implements CommandClientOptions {
} }
} }
/** Command decorator */ /**
* Command decorator. Decorates the function with optional metadata as a Command registered upon constructing class.
*/
export function command(options?: CommandOptions) { export function command(options?: CommandOptions) {
return function (target: CommandClient | Extension, name: string) { return function (target: CommandClient | Extension, name: string) {
if (target._decoratedCommands === undefined) target._decoratedCommands = {} if (target._decoratedCommands === undefined) target._decoratedCommands = {}

View File

@ -300,6 +300,8 @@ export class CommandsLoader {
/** /**
* Load a Command from file. * Load a Command from file.
* *
* NOTE: Relative paths resolve from cwd
*
* @param filePath Path of Command file. * @param filePath Path of Command file.
* @param exportName Export name. Default is the "default" export. * @param exportName Export name. Default is the "default" export.
*/ */
@ -344,6 +346,8 @@ export class CommandsLoader {
/** /**
* Load commands from a Directory. * Load commands from a Directory.
* *
* NOTE: Relative paths resolve from cwd
*
* @param path Path of the directory. * @param path Path of the directory.
* @param options Options to configure loading. * @param options Options to configure loading.
*/ */

View File

@ -66,6 +66,7 @@ export class Gateway extends HarmonyEventEmitter<GatewayTypedEvents> {
cache: GatewayCache cache: GatewayCache
private timedIdentify: number | null = null private timedIdentify: number | null = null
shards?: number[] shards?: number[]
ping: number = 0
constructor(client: Client, shards?: number[]) { constructor(client: Client, shards?: number[]) {
super() super()
@ -115,11 +116,9 @@ export class Gateway extends HarmonyEventEmitter<GatewayTypedEvents> {
case GatewayOpcodes.HEARTBEAT_ACK: case GatewayOpcodes.HEARTBEAT_ACK:
this.heartbeatServerResponded = true this.heartbeatServerResponded = true
this.client.ping = Date.now() - this.lastPingTimestamp this.ping = Date.now() - this.lastPingTimestamp
this.emit('ping', this.client.ping) this.emit('ping', this.ping)
this.debug( this.debug(`Received Heartbeat Ack. Ping Recognized: ${this.ping}ms`)
`Received Heartbeat Ack. Ping Recognized: ${this.client.ping}ms`
)
break break
case GatewayOpcodes.INVALID_SESSION: case GatewayOpcodes.INVALID_SESSION:

View File

@ -22,14 +22,17 @@ export class RolesManager extends BaseManager<RolePayload, Role> {
this.guild = guild this.guild = guild
} }
/** Fetch a Guild Role (from API) */ /** Fetch All Guild Roles */
async fetch(id: string): Promise<Role> { async fetchAll(): Promise<Role[]> {
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
this.client.rest this.client.rest.api.guilds[this.guild.id].roles.get
.get(GUILD_ROLE(this.guild.id, id)) .then(async (data: RolePayload[]) => {
.then(async (data) => { const roles: Role[] = []
await this.set(id, data as RolePayload) for (const raw of data) {
resolve(((await this.get(id)) as unknown) as Role) await this.set(raw.id, raw)
roles.push(new Role(this.client, raw, this.guild))
}
resolve(roles)
}) })
.catch((e) => reject(e)) .catch((e) => reject(e))
}) })

View File

@ -5,6 +5,6 @@ export default class PingCommand extends Command {
execute(ctx: CommandContext): void { execute(ctx: CommandContext): void {
console.log(ctx.args, ctx.argString) console.log(ctx.args, ctx.argString)
ctx.message.reply(`Pong! Latency: ${ctx.client.ping}ms`) ctx.message.reply(`Pong! Latency: ${ctx.client.gateway.ping}ms`)
} }
} }

View File

@ -60,7 +60,7 @@ client.on('messageCreate', async (msg: Message) => {
console.log(`${msg.author.tag}: ${msg.content}`) console.log(`${msg.author.tag}: ${msg.content}`)
} }
if (msg.content === '!ping') { if (msg.content === '!ping') {
msg.reply(`Pong! Ping: ${client.ping}ms`) msg.reply(`Pong! Ping: ${client.gateway.ping}ms`)
} else if (msg.content === '!members') { } else if (msg.content === '!members') {
const col = await msg.guild?.members.array() const col = await msg.guild?.members.array()
const data = col const data = col