Skip to content

Commit

Permalink
chore(Threads): general fixup and catch up on features (#5959)
Browse files Browse the repository at this point in the history
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
  • Loading branch information
ckohen and vladfrangu committed Jun 29, 2021
1 parent 63a8df1 commit bbc48fd
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 22 deletions.
22 changes: 13 additions & 9 deletions src/managers/GuildChannelManager.js
Expand Up @@ -3,6 +3,7 @@
const BaseManager = require('./BaseManager');
const GuildChannel = require('../structures/GuildChannel');
const PermissionOverwrites = require('../structures/PermissionOverwrites');
const ThreadChannel = require('../structures/ThreadChannel');
const Collection = require('../util/Collection');
const { ChannelTypes, ThreadChannelTypes } = require('../util/Constants');

Expand Down Expand Up @@ -36,7 +37,7 @@ class GuildChannelManager extends BaseManager {

/**
* The cache of this Manager
* @type {Collection<Snowflake, GuildChannel>}
* @type {Collection<Snowflake, GuildChannel|ThreadChannel>}
* @name GuildChannelManager#cache
*/

Expand All @@ -50,27 +51,30 @@ class GuildChannelManager extends BaseManager {
/**
* Data that can be resolved to give a Guild Channel object. This can be:
* * A GuildChannel object
* * A ThreadChannel object
* * A Snowflake
* @typedef {GuildChannel|Snowflake} GuildChannelResolvable
* @typedef {GuildChannel|ThreadChannel|Snowflake} GuildChannelResolvable
*/

/**
* Resolves a GuildChannelResolvable to a Channel object.
* @method resolve
* @memberof GuildChannelManager
* @instance
* @param {GuildChannelResolvable} channel The GuildChannel resolvable to resolve
* @returns {?GuildChannel}
* @returns {?(GuildChannel|ThreadChannel)}
*/
resolve(channel) {
if (channel instanceof ThreadChannel) return super.resolve(channel.id);
return super.resolve(channel);
}

/**
* Resolves a GuildChannelResolvable to a channel ID string.
* @method resolveID
* @memberof GuildChannelManager
* @instance
* @param {GuildChannelResolvable} channel The GuildChannel resolvable to resolve
* @returns {?Snowflake}
*/
resolveID(channel) {
if (channel instanceof ThreadChannel) return super.resolveID(channel.id);
return super.resolveID(channel);
}

/**
* Options used to create a new channel in a guild.
Expand Down
21 changes: 13 additions & 8 deletions src/managers/ThreadManager.js
Expand Up @@ -63,8 +63,8 @@ class ThreadManager extends BaseManager {
* A number that is allowed to be the duration in minutes before a thread is automatically archived. This can be:
* * `60` (1 hour)
* * `1440` (1 day)
* * `4320` (3 days)
* * `10080` (7 days)
* * `4320` (3 days) <warn>This is only available when the guild has the `THREE_DAY_THREAD_ARCHIVE` feature.</warn>
* * `10080` (7 days) <warn>This is only available when the guild has the `SEVEN_DAY_THREAD_ARCHIVE` feature.</warn>
* @typedef {number} ThreadAutoArchiveDuration
*/

Expand All @@ -76,8 +76,8 @@ class ThreadManager extends BaseManager {
* @property {ThreadAutoArchiveDuration} autoArchiveDuration How long before the thread is automatically archived
* @property {MessageResolvable} [startMessage] The message to start a public or news thread from,
* creates a private thread if not provided
* @property {ThreadChannelType|number} [type] The type of thread to create
* <warn>When creating threads in a `news` channel this is always `news_thread`</warn>
* @property {ThreadChannelType|number} [type='public_thread'] The type of thread to create
* <warn>When creating threads in a `news` channel this is ignored and is always `news_thread`</warn>
* @param {string} [reason] Reason for creating the thread
*/

Expand All @@ -89,16 +89,21 @@ class ThreadManager extends BaseManager {
* // Create a new public thread
* channel.threads
* .create({
* name: 'food-talk'
* name: 'food-talk',
* autoArchiveDuration: 60,
* startMessage: channel.lastMessageID,
* reason: 'Needed a separate thread for food',
* })
* .then(console.log)
* .catch(console.error);
* @example
* // Create a new private thread
* channel.threads
* .create({ name: 'mod-talk', autoArchiveDuration: 60, reason: 'Needed a separate thread for moderation' })
* .create({
* name: 'mod-talk',
* autoArchiveDuration: 60,
* type: 'private_thread',
* reason: 'Needed a separate thread for moderation',
* })
* .then(console.log)
* .catch(console.error);
*/
Expand All @@ -113,7 +118,7 @@ class ThreadManager extends BaseManager {
if (!startMessageID) throw new TypeError('INVALID_TYPE', 'startMessage', 'MessageResolvable');
path = path.messages(startMessageID);
} else if (this.channel.type !== 'news') {
resolvedType = typeof type === 'string' ? ChannelTypes[type.toUpperCase()] : type;
resolvedType = typeof type === 'string' ? ChannelTypes[type.toUpperCase()] : type ?? resolvedType;
}

const data = await path.threads.post({
Expand Down
3 changes: 3 additions & 0 deletions src/structures/Guild.js
Expand Up @@ -170,7 +170,10 @@ class Guild extends AnonymousGuild {
* * NEWS
* * PARTNERED
* * PREVIEW_ENABLED
* * PRIVATE_THREADS
* * RELAY_ENABLED
* * SEVEN_DAY_THREAD_ARCHIVE
* * THREE_DAY_THREAD_ARCHIVE
* * TICKETED_EVENTS_ENABLED
* * VANITY_URL
* * VERIFIED
Expand Down
4 changes: 2 additions & 2 deletions src/structures/GuildMember.js
Expand Up @@ -256,13 +256,13 @@ class GuildMember extends Base {
/**
* Returns `channel.permissionsFor(guildMember)`. Returns permissions for a member in a guild channel,
* taking into account roles and permission overwrites.
* @param {ChannelResolvable} channel The guild channel to use as context
* @param {GuildChannelResolvable} channel The guild channel to use as context
* @returns {Readonly<Permissions>}
*/
permissionsIn(channel) {
channel = this.guild.channels.resolve(channel);
if (!channel) throw new Error('GUILD_CHANNEL_RESOLVE');
return channel.memberPermissions(this);
return channel.permissionsFor(this);
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/util/Constants.js
Expand Up @@ -764,6 +764,7 @@ exports.APIErrors = {
ANNOUNCEMENT_EDIT_LIMIT_EXCEEDED: 20022,
CHANNEL_HIT_WRITE_RATELIMIT: 20028,
CONTENT_NOT_ALLOWED: 20031,
GUILD_PREMIUM_LEVEL_TOO_LOW: 20035,
MAXIMUM_GUILDS: 30001,
MAXIMUM_FRIENDS: 30002,
MAXIMUM_PINS: 30003,
Expand Down
14 changes: 11 additions & 3 deletions typings/index.d.ts
Expand Up @@ -1082,7 +1082,7 @@ declare module 'discord.js' {
public deleteDM(): Promise<DMChannel>;
public edit(data: GuildMemberEditData, reason?: string): Promise<GuildMember>;
public kick(reason?: string): Promise<GuildMember>;
public permissionsIn(channel: ChannelResolvable): Readonly<Permissions>;
public permissionsIn(channel: GuildChannelResolvable): Readonly<Permissions>;
public setNickname(nickname: string | null, reason?: string): Promise<GuildMember>;
public toJSON(): unknown;
public toString(): string;
Expand Down Expand Up @@ -2400,7 +2400,11 @@ declare module 'discord.js' {
): Promise<Collection<Snowflake, ApplicationCommandPermissions[]>>;
}

export class GuildChannelManager extends BaseManager<Snowflake, GuildChannel, GuildChannelResolvable> {
export class GuildChannelManager extends BaseManager<
Snowflake,
GuildChannel | ThreadChannel,
GuildChannelResolvable
> {
constructor(guild: Guild, iterable?: Iterable<any>);
public readonly channelCountWithoutThreads: number;
public guild: Guild;
Expand Down Expand Up @@ -2740,6 +2744,7 @@ declare module 'discord.js' {
ANNOUNCEMENT_EDIT_LIMIT_EXCEEDED: 20022;
CHANNEL_HIT_WRITE_RATELIMIT: 20028;
CONTENT_NOT_ALLOWED: 20031;
GUILD_PREMIUM_LEVEL_TOO_LOW: 20035;
MAXIMUM_GUILDS: 30001;
MAXIMUM_FRIENDS: 30002;
MAXIMUM_PINS: 30003;
Expand Down Expand Up @@ -3372,7 +3377,7 @@ declare module 'discord.js' {
type?: number;
}

type GuildChannelResolvable = Snowflake | GuildChannel;
type GuildChannelResolvable = Snowflake | GuildChannel | ThreadChannel;

interface GuildChannelCreateOptions {
permissionOverwrites?: OverwriteResolvable[] | Collection<Snowflake, OverwriteResolvable>;
Expand Down Expand Up @@ -3466,7 +3471,10 @@ declare module 'discord.js' {
| 'NEWS'
| 'PARTNERED'
| 'PREVIEW_ENABLED'
| 'PRIVATE_THREADS'
| 'RELAY_ENABLED'
| 'SEVEN_DAY_THREAD_ARCHIVE'
| 'THREE_DAY_THREAD_ARCHIVE'
| 'TICKETED_EVENTS_ENABLED'
| 'VANITY_URL'
| 'VERIFIED'
Expand Down

0 comments on commit bbc48fd

Please sign in to comment.