types(MessageManager): Allow comparison of messages again (#9612)

* types(MessageManager): allow comparison of messages again

* feat: match TypeScript

* docs: update wording

* chore: revert breaking change

---------

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
Jiralite
2023-07-07 22:39:01 +01:00
committed by GitHub
parent a73d54e43a
commit a48d0efb09
11 changed files with 98 additions and 32 deletions

View File

@@ -4005,14 +4005,13 @@ export class GuildMemberRoleManager extends DataManager<Snowflake, Role, RoleRes
): Promise<GuildMember>;
}
export class MessageManager<InGuild extends boolean = boolean> extends CachedManager<
export abstract class MessageManager<InGuild extends boolean = boolean> extends CachedManager<
Snowflake,
Message<InGuild>,
MessageResolvable
> {
private constructor(channel: TextBasedChannel, iterable?: Iterable<RawMessageData>);
public channel: If<InGuild, GuildTextBasedChannel, TextBasedChannel>;
public crosspost(message: MessageResolvable): Promise<Message<InGuild>>;
protected constructor(channel: TextBasedChannel, iterable?: Iterable<RawMessageData>);
public channel: TextBasedChannel;
public delete(message: MessageResolvable): Promise<void>;
public edit(
message: MessageResolvable,
@@ -4026,6 +4025,15 @@ export class MessageManager<InGuild extends boolean = boolean> extends CachedMan
public unpin(message: MessageResolvable, reason?: string): Promise<void>;
}
export class DMMessageManager extends MessageManager {
public channel: DMChannel;
}
export class GuildMessageManager extends MessageManager<true> {
public channel: GuildTextBasedChannel;
public crosspost(message: MessageResolvable): Promise<Message<true>>;
}
export class PermissionOverwriteManager extends CachedManager<
Snowflake,
PermissionOverwrites,
@@ -4192,7 +4200,7 @@ export interface TextBasedChannelFields<InGuild extends boolean = boolean>
get lastMessage(): Message | null;
lastPinTimestamp: number | null;
get lastPinAt(): Date | null;
messages: MessageManager<InGuild>;
messages: If<InGuild, GuildMessageManager, DMMessageManager>;
awaitMessageComponent<T extends MessageComponentType>(
options?: AwaitMessageCollectorOptionsParams<T, true>,
): Promise<MappedInteractionTypes[T]>;

View File

@@ -163,6 +163,8 @@ import {
ThreadManager,
FetchedThreads,
FetchedThreadsMore,
DMMessageManager,
GuildMessageManager,
ApplicationCommandChannelOptionData,
ApplicationCommandChannelOption,
ApplicationCommandChoicesOption,
@@ -349,6 +351,19 @@ declare const assertIsMessage: (m: Promise<Message>) => void;
client.on('messageCreate', async message => {
const { client, channel } = message;
// https://github.com/discordjs/discord.js/issues/8545
{
// These should not throw any errors when comparing messages from any source.
channel.messages.cache.filter(m => m);
(await channel.messages.fetch()).filter(m => m.author.id === message.author.id);
if (channel.isDMBased()) {
expectType<DMMessageManager>(channel.messages.channel.messages);
} else {
expectType<GuildMessageManager>(channel.messages.channel.messages);
}
}
if (!message.inGuild() && message.partial) {
expectNotType<never>(message);
}
@@ -1519,7 +1534,7 @@ declare const guildChannelManager: GuildChannelManager;
if (channel.isTextBased()) {
const { messages } = channel;
const message = await messages.fetch('123');
expectType<MessageManager<true>>(messages);
expectType<GuildMessageManager>(messages);
expectType<Promise<Message<true>>>(messages.crosspost('1234567890'));
expectType<Promise<Message<true>>>(messages.edit('1234567890', 'text'));
expectType<Promise<Message<true>>>(messages.fetch('1234567890'));
@@ -1533,18 +1548,24 @@ declare const guildChannelManager: GuildChannelManager;
{
const { messages } = dmChannel;
const message = await messages.fetch('123');
expectType<MessageManager<false>>(messages);
expectType<Promise<Message<false>>>(messages.crosspost('1234567890')); // This shouldn't even exist!
expectType<Promise<Message<false>>>(messages.edit('1234567890', 'text'));
expectType<Promise<Message<false>>>(messages.fetch('1234567890'));
expectType<Promise<Collection<Snowflake, Message<false>>>>(messages.fetchPinned());
expectType<null>(message.guild);
expectType<null>(message.guildId);
expectType<TextBasedChannel>(message.channel.messages.channel);
expectType<DMMessageManager>(messages);
expectType<Promise<Message>>(messages.edit('1234567890', 'text'));
expectType<Promise<Message>>(messages.fetch('1234567890'));
expectType<Promise<Collection<Snowflake, Message>>>(messages.fetchPinned());
expectType<Guild | null>(message.guild);
expectType<Snowflake | null>(message.guildId);
expectType<DMChannel | GuildTextBasedChannel>(message.channel.messages.channel);
expectType<MessageMentions>(message.mentions);
expectType<Guild | null>(message.mentions.guild);
expectType<Collection<Snowflake, GuildMember> | null>(message.mentions.members);
expectType<MessageMentions<false>>(message.mentions);
expectType<null>(message.mentions.guild);
expectType<null>(message.mentions.members);
if (messages.channel.isDMBased()) {
expectType<DMChannel>(messages.channel);
expectType<DMChannel>(messages.channel.messages.channel);
}
// @ts-expect-error Crossposting is not possible in direct messages.
messages.crosspost('1234567890');
}
declare const threadManager: ThreadManager;