mirror of
https://github.com/diamondburned/arikawa.git
synced 2024-12-04 12:52:45 +00:00
94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
package discord
|
|
|
|
import "encoding/json"
|
|
|
|
// ComponentType is the type of a component.
|
|
type ComponentType uint
|
|
|
|
const (
|
|
ActionRowComponent ComponentType = iota + 1
|
|
ButtonComponent
|
|
)
|
|
|
|
// Component is a component that can be attached to an interaction response.
|
|
type Component interface {
|
|
json.Marshaler
|
|
Type() ComponentType
|
|
}
|
|
|
|
// ActionRow is a row of components at the bottom of a message.
|
|
type ActionRow struct {
|
|
Components []Component `json:"components"`
|
|
}
|
|
|
|
// Type implements the InteractionComponent interface.
|
|
func (ActionRow) Type() ComponentType {
|
|
return ActionRowComponent
|
|
}
|
|
|
|
// MarshalJSON marshals the action row in the format Discord expects.
|
|
func (a ActionRow) MarshalJSON() ([]byte, error) {
|
|
type actionRow ActionRow
|
|
|
|
return json.Marshal(struct {
|
|
actionRow
|
|
Type ComponentType `json:"type"`
|
|
}{
|
|
actionRow: actionRow(a),
|
|
Type: ActionRowComponent,
|
|
})
|
|
}
|
|
|
|
// Button is a clickable button that may be added to an interaction response.
|
|
type Button struct {
|
|
Label string `json:"label"`
|
|
// CustomID attached to InteractionCreate event when clicked.
|
|
CustomID string `json:"custom_id"`
|
|
Style ButtonStyle `json:"style"`
|
|
Emoji *ButtonEmoji `json:"emoji,omitempty"`
|
|
// Present on link-style buttons.
|
|
URL string `json:"url,omitempty"`
|
|
Disabled bool `json:"disabled,omitempty"`
|
|
}
|
|
|
|
// ButtonStyle is the style to display a button in.
|
|
type ButtonStyle uint
|
|
|
|
// All types of ButtonStyle documented.
|
|
const (
|
|
PrimaryButton ButtonStyle = iota + 1 // Blurple button.
|
|
SecondaryButton // Grey button.
|
|
SuccessButton // Green button.
|
|
DangerButton // Red button.
|
|
LinkButton // Button that navigates to a URL.
|
|
)
|
|
|
|
// ButtonEmoji is the emoji displayed on the button before the text.
|
|
type ButtonEmoji struct {
|
|
Name string `json:"name,omitempty"`
|
|
ID EmojiID `json:"id,omitempty"`
|
|
Animated bool `json:"animated,omitempty"`
|
|
}
|
|
|
|
// Type implements the InteractionComponent interface.
|
|
func (Button) Type() ComponentType {
|
|
return ButtonComponent
|
|
}
|
|
|
|
// MarshalJSON marshals the button in the format Discord expects.
|
|
func (b Button) MarshalJSON() ([]byte, error) {
|
|
type button Button
|
|
|
|
if b.Style == 0 {
|
|
b.Style = PrimaryButton // Sane default for button.
|
|
}
|
|
|
|
return json.Marshal(struct {
|
|
button
|
|
Type ComponentType `json:"type"`
|
|
}{
|
|
button: button(b),
|
|
Type: ButtonComponent,
|
|
})
|
|
}
|