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
*/
message: MessageInfo
message: ComponentEventMessage
/**
* The channel that this event occurred in.
*
* @see https://discord.com/developers/docs/resources/channel#channel-object
*/
channel: ChannelInfo
channel: ComponentEventChannel
/**
* The user that triggered this event.
*
* @see https://discord.com/developers/docs/resources/user#user-object
*/
user: UserInfo
user: ComponentEventUser
/**
* The guild that this event occurred in.
*
* @see https://discord.com/developers/docs/resources/guild#guild-object
*/
guild?: GuildInfo
guild?: ComponentEventGuild
/** 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
@@ -45,13 +48,13 @@ export interface ComponentEvent {
}
/** @category Component Event */
export interface ReplyInfo {
export interface ComponentEventReplyOptions {
ephemeral?: boolean
tts?: boolean
}
/** @category Component Event */
export interface ChannelInfo {
export interface ComponentEventChannel {
id: string
name?: string
topic?: string
@@ -63,11 +66,11 @@ export interface ChannelInfo {
}
/** @category Component Event */
export interface MessageInfo {
export interface ComponentEventMessage {
id: string
channelId: string
authorId: string
member?: GuildMemberInfo
member?: ComponentEventGuildMember
content: string
timestamp: string
editedTimestamp?: string
@@ -78,14 +81,14 @@ export interface MessageInfo {
}
/** @category Component Event */
export interface GuildInfo {
export interface ComponentEventGuild {
id: string
name: string
member: GuildMemberInfo
member: ComponentEventGuildMember
}
/** @category Component Event */
export interface GuildMemberInfo {
export interface ComponentEventGuildMember {
id: string
nick?: string
displayName: string
@@ -100,7 +103,7 @@ export interface GuildMemberInfo {
}
/** @category Component Event */
export interface UserInfo {
export interface ComponentEventUser {
id: string
username: string
discriminator: string

View File

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

View File

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