breaking: more descriptive component event types

This commit is contained in:
itsMapleLeaf
2023-10-28 14:39:16 -05:00
parent fb0a997855
commit 11153dfe0f
4 changed files with 45 additions and 35 deletions

View File

@@ -0,0 +1,5 @@
---
"reacord": minor
---
breaking: more descriptive component event types

View File

@@ -9,31 +9,34 @@ export interface ComponentEvent {
* *
* @see https://discord.com/developers/docs/resources/channel#message-object * @see https://discord.com/developers/docs/resources/channel#message-object
*/ */
message: MessageInfo message: ComponentEventMessage
/** /**
* The channel that this event occurred in. * The channel that this event occurred in.
* *
* @see https://discord.com/developers/docs/resources/channel#channel-object * @see https://discord.com/developers/docs/resources/channel#channel-object
*/ */
channel: ChannelInfo channel: ComponentEventChannel
/** /**
* The user that triggered this event. * The user that triggered this event.
* *
* @see https://discord.com/developers/docs/resources/user#user-object * @see https://discord.com/developers/docs/resources/user#user-object
*/ */
user: UserInfo user: ComponentEventUser
/** /**
* The guild that this event occurred in. * The guild that this event occurred in.
* *
* @see https://discord.com/developers/docs/resources/guild#guild-object * @see https://discord.com/developers/docs/resources/guild#guild-object
*/ */
guild?: GuildInfo guild?: ComponentEventGuild
/** Create a new reply to this event. */ /** Create a new reply to this event. */
reply(content?: ReactNode, options?: ReplyInfo): ReacordInstance reply(
content?: ReactNode,
options?: ComponentEventReplyOptions,
): ReacordInstance
/** /**
* Create an ephemeral reply to this event, shown only to the user who * Create an ephemeral reply to this event, shown only to the user who
@@ -45,13 +48,13 @@ export interface ComponentEvent {
} }
/** @category Component Event */ /** @category Component Event */
export interface ReplyInfo { export interface ComponentEventReplyOptions {
ephemeral?: boolean ephemeral?: boolean
tts?: boolean tts?: boolean
} }
/** @category Component Event */ /** @category Component Event */
export interface ChannelInfo { export interface ComponentEventChannel {
id: string id: string
name?: string name?: string
topic?: string topic?: string
@@ -63,11 +66,11 @@ export interface ChannelInfo {
} }
/** @category Component Event */ /** @category Component Event */
export interface MessageInfo { export interface ComponentEventMessage {
id: string id: string
channelId: string channelId: string
authorId: string authorId: string
member?: GuildMemberInfo member?: ComponentEventGuildMember
content: string content: string
timestamp: string timestamp: string
editedTimestamp?: string editedTimestamp?: string
@@ -78,14 +81,14 @@ export interface MessageInfo {
} }
/** @category Component Event */ /** @category Component Event */
export interface GuildInfo { export interface ComponentEventGuild {
id: string id: string
name: string name: string
member: GuildMemberInfo member: ComponentEventGuildMember
} }
/** @category Component Event */ /** @category Component Event */
export interface GuildMemberInfo { export interface ComponentEventGuildMember {
id: string id: string
nick?: string nick?: string
displayName: string displayName: string
@@ -100,7 +103,7 @@ export interface GuildMemberInfo {
} }
/** @category Component Event */ /** @category Component Event */
export interface UserInfo { export interface ComponentEventUser {
id: string id: string
username: string username: string
discriminator: string discriminator: string

View File

@@ -14,12 +14,12 @@ import type {
import { ChannelMessageRenderer } from "../internal/renderers/channel-message-renderer" import { ChannelMessageRenderer } from "../internal/renderers/channel-message-renderer"
import { InteractionReplyRenderer } from "../internal/renderers/interaction-reply-renderer" import { InteractionReplyRenderer } from "../internal/renderers/interaction-reply-renderer"
import type { import type {
ChannelInfo, ComponentEventChannel,
GuildInfo, ComponentEventGuild,
GuildMemberInfo, ComponentEventGuildMember,
MessageInfo, ComponentEventMessage,
ReplyInfo, ComponentEventReplyOptions,
UserInfo, ComponentEventUser,
} from "./component-event" } from "./component-event"
import type { ReacordInstance } from "./instance" import type { ReacordInstance } from "./instance"
import type { ReacordConfig } from "./reacord" import type { ReacordConfig } from "./reacord"
@@ -194,7 +194,7 @@ export class ReacordDiscordJs extends Reacord {
interaction: Discord.MessageComponentInteraction, interaction: Discord.MessageComponentInteraction,
): ComponentInteraction { ): ComponentInteraction {
// todo please dear god clean this up // todo please dear god clean this up
const channel: ChannelInfo = interaction.channel const channel: ComponentEventChannel = interaction.channel
? { ? {
...pruneNullishValues( ...pruneNullishValues(
pick(interaction.channel, [ pick(interaction.channel, [
@@ -210,7 +210,7 @@ export class ReacordDiscordJs extends Reacord {
} }
: raise("Non-channel interactions are not supported") : raise("Non-channel interactions are not supported")
const message: MessageInfo = const message: ComponentEventMessage =
interaction.message instanceof Discord.Message interaction.message instanceof Discord.Message
? { ? {
...pick(interaction.message, [ ...pick(interaction.message, [
@@ -233,7 +233,7 @@ export class ReacordDiscordJs extends Reacord {
} }
: raise("Message not found") : raise("Message not found")
const member: GuildMemberInfo | undefined = const member: ComponentEventGuildMember | undefined =
interaction.member instanceof Discord.GuildMember interaction.member instanceof Discord.GuildMember
? { ? {
...pruneNullishValues( ...pruneNullishValues(
@@ -258,14 +258,14 @@ export class ReacordDiscordJs extends Reacord {
} }
: undefined : undefined
const guild: GuildInfo | undefined = interaction.guild const guild: ComponentEventGuild | undefined = interaction.guild
? { ? {
...pruneNullishValues(pick(interaction.guild, ["id", "name"])), ...pruneNullishValues(pick(interaction.guild, ["id", "name"])),
member: member ?? raise("unexpected: member is undefined"), member: member ?? raise("unexpected: member is undefined"),
} }
: undefined : undefined
const user: UserInfo = { const user: ComponentEventUser = {
...pruneNullishValues( ...pruneNullishValues(
pick(interaction.user, ["id", "username", "discriminator", "tag"]), pick(interaction.user, ["id", "username", "discriminator", "tag"]),
), ),
@@ -307,7 +307,7 @@ export class ReacordDiscordJs extends Reacord {
user, user,
guild, guild,
reply: (content?: ReactNode, options?: ReplyInfo) => reply: (content?: ReactNode, options?: ComponentEventReplyOptions) =>
this.createInstance( this.createInstance(
this.createInteractionReplyRenderer(interaction, options ?? {}), this.createInteractionReplyRenderer(interaction, options ?? {}),
content, content,

View File

@@ -8,11 +8,11 @@ import { setTimeout } from "node:timers/promises"
import type { ReactNode } from "react" import type { ReactNode } from "react"
import { expect } from "vitest" import { expect } from "vitest"
import type { import type {
ChannelInfo, ComponentEventChannel,
GuildInfo, ComponentEventGuild,
MessageInfo, ComponentEventMessage,
ReplyInfo, ComponentEventReplyOptions,
UserInfo, ComponentEventUser,
} from "../library/core/component-event" } from "../library/core/component-event"
import type { ButtonClickEvent } from "../library/core/components/button" import type { ButtonClickEvent } from "../library/core/components/button"
import type { SelectChangeEvent } from "../library/core/components/select" import type { SelectChangeEvent } from "../library/core/components/select"
@@ -55,7 +55,9 @@ export class ReacordTester extends Reacord {
) )
} }
public createInteractionReply(_options?: ReplyInfo): ReacordInstance { public createInteractionReply(
_options?: ComponentEventReplyOptions,
): ReacordInstance {
return this.createInstance( return this.createInstance(
new InteractionReplyRenderer( new InteractionReplyRenderer(
new TestCommandInteraction(this.messageContainer), new TestCommandInteraction(this.messageContainer),
@@ -249,10 +251,10 @@ class TestSelectInteraction
class TestComponentEvent { class TestComponentEvent {
constructor(private tester: ReacordTester) {} constructor(private tester: ReacordTester) {}
message: MessageInfo = {} as MessageInfo // todo message: ComponentEventMessage = {} as ComponentEventMessage // todo
channel: ChannelInfo = {} as ChannelInfo // todo channel: ComponentEventChannel = {} as ComponentEventChannel // todo
user: UserInfo = {} as UserInfo // todo user: ComponentEventUser = {} as ComponentEventUser // todo
guild: GuildInfo = {} as GuildInfo // todo guild: ComponentEventGuild = {} as ComponentEventGuild // todo
reply(content?: ReactNode): ReacordInstance { reply(content?: ReactNode): ReacordInstance {
return this.tester.createInteractionReply().render(content) return this.tester.createInteractionReply().render(content)