Skip to content

Commit

Permalink
Merge branch 'main' into types/exection-allow-forum
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiralite committed Jun 11, 2023
2 parents 994b34f + 6c2242f commit d774a9a
Show file tree
Hide file tree
Showing 14 changed files with 81 additions and 29 deletions.
4 changes: 2 additions & 2 deletions packages/core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ import { WebSocketManager } from '@discordjs/ws';
import { GatewayDispatchEvents, GatewayIntentBits, InteractionType, MessageFlags, Client } from '@discordjs/core';

// Create REST and WebSocket managers directly
const rest = new REST({ version: '10' }).setToken(token);
const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);

const gateway = new WebSocketManager({
token,
token: process.env.DISCORD_TOKEN,
intents: GatewayIntentBits.GuildMessages | GatewayIntentBits.MessageContent,
rest,
});
Expand Down
8 changes: 4 additions & 4 deletions packages/discord.js/src/client/Client.js
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ class Client extends BaseClient {
await this.ws.connect();
return this.token;
} catch (error) {
this.destroy();
await this.destroy();
throw error;
}
}
Expand All @@ -242,13 +242,13 @@ class Client extends BaseClient {

/**
* Logs out, terminates the connection to Discord, and destroys the client.
* @returns {void}
* @returns {Promise<void>}
*/
destroy() {
async destroy() {
super.destroy();

this.sweepers.destroy();
this.ws.destroy();
await this.ws.destroy();
this.token = null;
this.rest.setToken(null);
}
Expand Down
4 changes: 2 additions & 2 deletions packages/discord.js/src/client/websocket/WebSocketManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -320,12 +320,12 @@ class WebSocketManager extends EventEmitter {
* Destroys this manager and all its shards.
* @private
*/
destroy() {
async destroy() {
if (this.destroyed) return;
// TODO: Make a util for getting a stack
this.debug(`Manager was destroyed. Called by:\n${new Error().stack}`);
this.destroyed = true;
this._ws?.destroy({ code: CloseCodes.Normal });
await this._ws?.destroy({ code: CloseCodes.Normal });
}

/**
Expand Down
4 changes: 2 additions & 2 deletions packages/discord.js/src/structures/GuildMember.js
Original file line number Diff line number Diff line change
Expand Up @@ -238,12 +238,12 @@ class GuildMember extends Base {
}

/**
* The nickname of this member, or their username if they don't have one
* The nickname of this member, or their user display name if they don't have one
* @type {?string}
* @readonly
*/
get displayName() {
return this.nickname ?? this.user.username;
return this.nickname ?? this.user.displayName;
}

/**
Expand Down
45 changes: 41 additions & 4 deletions packages/discord.js/src/structures/User.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
'use strict';

const process = require('node:process');
const { userMention } = require('@discordjs/builders');
const { calculateUserDefaultAvatarIndex } = require('@discordjs/rest');
const { DiscordSnowflake } = require('@sapphire/snowflake');
const Base = require('./Base');
const TextBasedChannel = require('./interfaces/TextBasedChannel');
const UserFlagsBitField = require('../util/UserFlagsBitField');

let tagDeprecationEmitted = false;

/**
* Represents a user on Discord.
* @implements {TextBasedChannel}
Expand Down Expand Up @@ -41,6 +45,16 @@ class User extends Base {
this.username ??= null;
}

if ('global_name' in data) {
/**
* The global name of this user
* @type {?string}
*/
this.globalName = data.global_name;
} else {
this.globalName ??= null;
}

if ('bot' in data) {
/**
* Whether or not the user is a bot
Expand All @@ -53,7 +67,8 @@ class User extends Base {

if ('discriminator' in data) {
/**
* A discriminator based on username for the user
* The discriminator of this user
* <info>`'0'`, or a 4-digit stringified number if they're using the legacy username system</info>
* @type {?string}
*/
this.discriminator = data.discriminator;
Expand Down Expand Up @@ -154,7 +169,8 @@ class User extends Base {
* @readonly
*/
get defaultAvatarURL() {
return this.client.rest.cdn.defaultAvatar(this.discriminator % 5);
const index = this.discriminator === '0' ? calculateUserDefaultAvatarIndex(this.id) : this.discriminator % 5;
return this.client.rest.cdn.defaultAvatar(index);
}

/**
Expand Down Expand Up @@ -188,12 +204,33 @@ class User extends Base {
}

/**
* The Discord "tag" (e.g. `hydrabolt#0001`) for this user
* The tag of this user
* <info>This user's username, or their legacy tag (e.g. `hydrabolt#0001`)
* if they're using the legacy username system</info>
* @type {?string}
* @readonly
* @deprecated Use {@link User#username} instead.
*/
get tag() {
return typeof this.username === 'string' ? `${this.username}#${this.discriminator}` : null;
if (!tagDeprecationEmitted) {
process.emitWarning('User#tag is deprecated. Use User#username instead.', 'DeprecationWarning');
tagDeprecationEmitted = true;
}

return typeof this.username === 'string'
? this.discriminator === '0'
? this.username
: `${this.username}#${this.discriminator}`
: null;
}

/**
* The global name of this user, or their username if they don't have one
* @type {?string}
* @readonly
*/
get displayName() {
return this.globalName ?? this.username;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/discord.js/src/util/Options.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const { version } = require('../../package.json');
* @property {IntentsResolvable} intents Intents to enable for this connection
* @property {number} [waitGuildTimeout=15_000] Time in milliseconds that clients with the
* {@link GatewayIntentBits.Guilds} gateway intent should wait for missing guilds to be received before being ready.
* @property {SweeperOptions} [sweepers={}] Options for cache sweeping
* @property {SweeperOptions} [sweepers=this.DefaultSweeperSettings] Options for cache sweeping
* @property {WebsocketOptions} [ws] Options for the WebSocket
* @property {RESTOptions} [rest] Options for the REST manager
* @property {Function} [jsonTransformer] A function used to transform outgoing json data
Expand Down
2 changes: 1 addition & 1 deletion packages/discord.js/test/createGuild.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ client.on('ready', async () => {
} catch (error) {
console.error(error);
} finally {
client.destroy();
await client.destroy();
}
});

Expand Down
4 changes: 2 additions & 2 deletions packages/discord.js/test/shard.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ process.send(123);
client.on('ready', () => {
console.log('Ready', client.options.shards);
if (client.options.shards === 0) {
setTimeout(() => {
setTimeout(async () => {
console.log('kek dying');
client.destroy();
await client.destroy();
}, 5_000);
}
});
Expand Down
2 changes: 1 addition & 1 deletion packages/discord.js/test/templateCreateGuild.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ client
} catch (error) {
console.error(error);
} finally {
client.destroy();
await client.destroy();
}
})
.login(token)
Expand Down
9 changes: 6 additions & 3 deletions packages/discord.js/typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -956,7 +956,7 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
public users: UserManager;
public voice: ClientVoiceManager;
public ws: WebSocketManager;
public destroy(): void;
public destroy(): Promise<void>;
public fetchGuildPreview(guild: GuildResolvable): Promise<GuildPreview>;
public fetchInvite(invite: InviteResolvable, options?: ClientFetchInviteOptions): Promise<Invite>;
public fetchGuildTemplate(template: GuildTemplateResolvable): Promise<GuildTemplate>;
Expand Down Expand Up @@ -1764,7 +1764,7 @@ export class BaseInteraction<Cached extends CacheType = CacheType> extends Base
public type: InteractionType;
public user: User;
public version: number;
public appPermissions: Readonly<PermissionsBitField> | null;
public appPermissions: CacheTypeReducer<Cached, Readonly<PermissionsBitField>>;
public memberPermissions: CacheTypeReducer<Cached, Readonly<PermissionsBitField>>;
public locale: Locale;
public guildLocale: CacheTypeReducer<Cached, Locale>;
Expand Down Expand Up @@ -3060,13 +3060,16 @@ export class User extends PartialTextBasedChannel(Base) {
public get createdAt(): Date;
public get createdTimestamp(): number;
public discriminator: string;
public get displayName(): string;
public get defaultAvatarURL(): string;
public get dmChannel(): DMChannel | null;
public flags: Readonly<UserFlagsBitField> | null;
public globalName: string | null;
public get hexAccentColor(): HexColorString | null | undefined;
public id: Snowflake;
public get partial(): false;
public system: boolean;
/** @deprecated Use {@link User#username} instead. */
public get tag(): string;
public username: string;
public avatarURL(options?: ImageURLOptions): string | null;
Expand Down Expand Up @@ -3326,7 +3329,7 @@ export class WebSocketManager extends EventEmitter {
private debug(message: string, shardId?: number): void;
private connect(): Promise<void>;
private broadcast(packet: unknown): void;
private destroy(): void;
private destroy(): Promise<void>;
private handlePacket(packet?: unknown, shard?: WebSocketShard): boolean;
private checkShardsReady(): void;
private triggerClientReady(): void;
Expand Down
2 changes: 1 addition & 1 deletion packages/rest/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export * from './lib/errors/RateLimitError.js';
export * from './lib/RequestManager.js';
export * from './lib/REST.js';
export * from './lib/utils/constants.js';
export { makeURLSearchParams, parseResponse } from './lib/utils/utils.js';
export { calculateUserDefaultAvatarIndex, makeURLSearchParams, parseResponse } from './lib/utils/utils.js';

/**
* The {@link https://github.com/discordjs/discord.js/blob/main/packages/rest/#readme | @discordjs/rest} version
Expand Down
11 changes: 7 additions & 4 deletions packages/rest/src/lib/CDN.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,15 @@ export class CDN {
}

/**
* Generates the default avatar URL for a discriminator.
* Generates a default avatar URL
*
* @param discriminator - The discriminator modulo 5
* @param index - The default avatar index
* @remarks
* To calculate the index for a user do `(userId >> 22) % 6`,
* or `discriminator % 5` if they're using the legacy username system.
*/
public defaultAvatar(discriminator: number): string {
return this.makeURL(`/embed/avatars/${discriminator}`, { extension: 'png' });
public defaultAvatar(index: number): string {
return this.makeURL(`/embed/avatars/${index}`, { extension: 'png' });
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/rest/src/lib/REST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export interface RESTOptions {
/**
* The cdn path
*
* @defaultValue 'https://cdn.discordapp.com'
* @defaultValue `'https://cdn.discordapp.com'`
*/
cdn: string;
/**
Expand Down
11 changes: 10 additions & 1 deletion packages/rest/src/lib/utils/utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { URLSearchParams } from 'node:url';
import type { RESTPatchAPIChannelJSONBody } from 'discord-api-types/v10';
import type { RESTPatchAPIChannelJSONBody, Snowflake } from 'discord-api-types/v10';
import type { RateLimitData, ResponseLike } from '../REST.js';
import { type RequestManager, RequestMethod } from '../RequestManager.js';
import { RateLimitError } from '../errors/RateLimitError.js';
Expand Down Expand Up @@ -112,3 +112,12 @@ export async function onRateLimit(manager: RequestManager, rateLimitData: RateLi
throw new RateLimitError(rateLimitData);
}
}

/**
* Calculates the default avatar index for a given user id.
*
* @param userId - The user id to calculate the default avatar index for
*/
export function calculateUserDefaultAvatarIndex(userId: Snowflake) {
return Number(BigInt(userId) >> 22n) % 6;
}

0 comments on commit d774a9a

Please sign in to comment.