Skip to content

Commit

Permalink
Add app subscriptions (#319)
Browse files Browse the repository at this point in the history
  • Loading branch information
cane authored Sep 29, 2023
1 parent 4d0bbb2 commit 2570fd3
Show file tree
Hide file tree
Showing 22 changed files with 297 additions and 9 deletions.
42 changes: 42 additions & 0 deletions discord/entitlement.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package discord

import (
"time"

"github.com/disgoorg/snowflake/v2"
)

type Entitlement struct {
ID snowflake.ID `json:"id"`
SkuID snowflake.ID `json:"sku_id"`
UserID *snowflake.ID `json:"user_id"`
GuildID *snowflake.ID `json:"guild_id"`
ApplicationID snowflake.ID `json:"application_id"`
Type EntitlementType `json:"type"`
Consumed bool `json:"consumed"`
StartsAt *time.Time `json:"starts_at"`
EndsAt *time.Time `json:"ends_at"`
PromotionID *snowflake.ID `json:"promotion_id"`
Deleted bool `json:"deleted"`
GiftCodeFlags int `json:"gift_code_flags"`
SubscriptionID *snowflake.ID `json:"subscription_id"`
}

type EntitlementType int

const (
EntitlementTypeApplicationSubscription EntitlementType = 8
)

type TestEntitlementCreate struct {
SkuID snowflake.ID `json:"sku_id"`
OwnerID snowflake.ID `json:"owner_id"`
OwnerType EntitlementOwnerType `json:"owner_type"`
}

type EntitlementOwnerType int

const (
EntitlementOwnerTypeGuild EntitlementOwnerType = iota + 1
EntitlementOwnerTypeUser
)
2 changes: 2 additions & 0 deletions discord/interaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ type rawInteraction struct {
Member *ResolvedMember `json:"member,omitempty"`
User *User `json:"user,omitempty"`
AppPermissions *Permissions `json:"app_permissions,omitempty"`
Entitlements []Entitlement `json:"entitlements"`
}

// Interaction is used for easier unmarshalling of different Interaction(s)
Expand All @@ -53,6 +54,7 @@ type Interaction interface {
Member() *ResolvedMember
User() User
AppPermissions() *Permissions
Entitlements() []Entitlement
CreatedAt() time.Time

interaction()
Expand Down
2 changes: 2 additions & 0 deletions discord/interaction_application_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ func (i *ApplicationCommandInteraction) UnmarshalJSON(data []byte) error {
i.baseInteraction.member = interaction.Member
i.baseInteraction.user = interaction.User
i.baseInteraction.appPermissions = interaction.AppPermissions
i.baseInteraction.entitlements = interaction.Entitlements

i.Data = interactionData
return nil
Expand All @@ -102,6 +103,7 @@ func (i ApplicationCommandInteraction) MarshalJSON() ([]byte, error) {
Member: i.member,
User: i.user,
AppPermissions: i.appPermissions,
Entitlements: i.entitlements,
},
Data: i.Data,
})
Expand Down
2 changes: 2 additions & 0 deletions discord/interaction_autocomplete.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func (i *AutocompleteInteraction) UnmarshalJSON(data []byte) error {
i.baseInteraction.member = interaction.Member
i.baseInteraction.user = interaction.User
i.baseInteraction.appPermissions = interaction.AppPermissions
i.baseInteraction.entitlements = interaction.Entitlements

i.Data = interaction.Data
return nil
Expand All @@ -59,6 +60,7 @@ func (i AutocompleteInteraction) MarshalJSON() ([]byte, error) {
Member: i.member,
User: i.user,
AppPermissions: i.appPermissions,
Entitlements: i.entitlements,
},
Data: i.Data,
})
Expand Down
5 changes: 5 additions & 0 deletions discord/interaction_base.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type baseInteraction struct {
member *ResolvedMember
user *User
appPermissions *Permissions
entitlements []Entitlement
}

func (i baseInteraction) ID() snowflake.ID {
Expand Down Expand Up @@ -64,6 +65,10 @@ func (i baseInteraction) AppPermissions() *Permissions {
return i.appPermissions
}

func (i baseInteraction) Entitlements() []Entitlement {
return i.entitlements
}

func (i baseInteraction) CreatedAt() time.Time {
return i.id.Time()
}
2 changes: 2 additions & 0 deletions discord/interaction_component.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ func (i *ComponentInteraction) UnmarshalJSON(data []byte) error {
i.baseInteraction.member = interaction.Member
i.baseInteraction.user = interaction.User
i.baseInteraction.appPermissions = interaction.AppPermissions
i.baseInteraction.entitlements = interaction.Entitlements

i.Data = interactionData
i.Message = interaction.Message
Expand Down Expand Up @@ -115,6 +116,7 @@ func (i ComponentInteraction) MarshalJSON() ([]byte, error) {
Member: i.member,
User: i.user,
AppPermissions: i.appPermissions,
Entitlements: i.entitlements,
},
Data: i.Data,
Message: i.Message,
Expand Down
2 changes: 2 additions & 0 deletions discord/interaction_modal_submit.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ func (i *ModalSubmitInteraction) UnmarshalJSON(data []byte) error {
i.baseInteraction.member = interaction.Member
i.baseInteraction.user = interaction.User
i.baseInteraction.appPermissions = interaction.AppPermissions
i.baseInteraction.entitlements = interaction.Entitlements

i.Data = interaction.Data
return nil
Expand All @@ -56,6 +57,7 @@ func (i ModalSubmitInteraction) MarshalJSON() ([]byte, error) {
Member: i.member,
User: i.user,
AppPermissions: i.appPermissions,
Entitlements: i.entitlements,
},
Data: i.Data,
})
Expand Down
4 changes: 4 additions & 0 deletions discord/interaction_ping.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,8 @@ func (PingInteraction) AppPermissions() *Permissions {
return nil
}

func (PingInteraction) Entitlements() []Entitlement {
return nil
}

func (PingInteraction) interaction() {}
1 change: 1 addition & 0 deletions discord/interaction_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const (
InteractionResponseTypeUpdateMessage
InteractionResponseTypeApplicationCommandAutocompleteResult
InteractionResponseTypeModal
InteractionResponseTypePremiumRequired
)

// InteractionResponse is how you answer interactions. If an answer is not sent within 3 seconds of receiving it, the interaction is failed, and you will be unable to respond to it.
Expand Down
36 changes: 36 additions & 0 deletions discord/sku.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package discord

import (
"time"

"github.com/disgoorg/snowflake/v2"
)

type SKU struct {
ID snowflake.ID `json:"id"`
Type SKUType `json:"type"`
ApplicationID snowflake.ID `json:"application_id"`
Name string `json:"name"`
Slug string `json:"slug"`
DependentSkuID *snowflake.ID `json:"dependent_sku_id"`
AccessType int `json:"access_type"`
Features []string `json:"features"`
ReleaseDate *time.Time `json:"release_date"`
Premium bool `json:"premium"`
Flags SKUFlags `json:"flags"`
ShowAgeGate bool `json:"show_age_gate"`
}

type SKUType int

const (
SKUTypeSubscription SKUType = iota + 5
SKUTypeSubscriptionGroup
)

type SKUFlags int

const (
SKUFlagGuildSubscription SKUFlags = 1 << (iota + 7)
SKUFlagUserSubscription
)
20 changes: 20 additions & 0 deletions events/entitlement_events.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package events

import "github.com/disgoorg/disgo/discord"

type GenericEntitlementEvent struct {
*GenericEvent
discord.Entitlement
}

type EntitlementCreate struct {
*GenericEntitlementEvent
}

type EntitlementUpdate struct {
*GenericEntitlementEvent
}

type EntitlementDelete struct {
*GenericEntitlementEvent
}
15 changes: 15 additions & 0 deletions events/interaction_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ func (e *ApplicationCommandInteractionCreate) CreateModal(modalCreate discord.Mo
return e.Respond(discord.InteractionResponseTypeModal, modalCreate, opts...)
}

// PremiumRequired responds to the interaction with an upgrade button if available.
func (e *ApplicationCommandInteractionCreate) PremiumRequired(opts ...rest.RequestOpt) error {
return e.Respond(discord.InteractionResponseTypePremiumRequired, nil, opts...)
}

// ComponentInteractionCreate indicates that a new component interaction has been created.
type ComponentInteractionCreate struct {
*GenericEvent
Expand Down Expand Up @@ -107,6 +112,11 @@ func (e *ComponentInteractionCreate) CreateModal(modalCreate discord.ModalCreate
return e.Respond(discord.InteractionResponseTypeModal, modalCreate, opts...)
}

// PremiumRequired responds to the interaction with an upgrade button if available.
func (e *ComponentInteractionCreate) PremiumRequired(opts ...rest.RequestOpt) error {
return e.Respond(discord.InteractionResponseTypePremiumRequired, nil, opts...)
}

// AutocompleteInteractionCreate indicates that a new autocomplete interaction has been created.
type AutocompleteInteractionCreate struct {
*GenericEvent
Expand Down Expand Up @@ -169,3 +179,8 @@ func (e *ModalSubmitInteractionCreate) UpdateMessage(messageUpdate discord.Messa
func (e *ModalSubmitInteractionCreate) DeferUpdateMessage(opts ...rest.RequestOpt) error {
return e.Respond(discord.InteractionResponseTypeDeferredUpdateMessage, nil, opts...)
}

// PremiumRequired responds to the interaction with an upgrade button if available.
func (e *ModalSubmitInteractionCreate) PremiumRequired(opts ...rest.RequestOpt) error {
return e.Respond(discord.InteractionResponseTypePremiumRequired, nil, opts...)
}
19 changes: 19 additions & 0 deletions events/listener_adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ type ListenerAdapter struct {
OnEmojiUpdate func(event *EmojiUpdate)
OnEmojiDelete func(event *EmojiDelete)

// Entitlement Events
OnEntitlementCreate func(event *EntitlementCreate)
OnEntitlementUpdate func(event *EntitlementUpdate)
OnEntitlementDelete func(event *EntitlementDelete)

// Sticker Events
OnStickersUpdate func(event *StickersUpdate)
OnStickerCreate func(event *StickerCreate)
Expand Down Expand Up @@ -318,6 +323,20 @@ func (l *ListenerAdapter) OnEvent(event bot.Event) {
listener(e)
}

// Entitlement Events
case *EntitlementCreate:
if listener := l.OnEntitlementCreate; listener != nil {
listener(e)
}
case *EntitlementUpdate:
if listener := l.OnEntitlementUpdate; listener != nil {
listener(e)
}
case *EntitlementDelete:
if listener := l.OnEntitlementDelete; listener != nil {
listener(e)
}

// Sticker Events
case *StickersUpdate:
if listener := l.OnStickersUpdate; listener != nil {
Expand Down
3 changes: 3 additions & 0 deletions gateway/gateway_event_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ const (
EventTypeChannelUpdate EventType = "CHANNEL_UPDATE"
EventTypeChannelDelete EventType = "CHANNEL_DELETE"
EventTypeChannelPinsUpdate EventType = "CHANNEL_PINS_UPDATE"
EventTypeEntitlementCreate EventType = "ENTITLEMENT_CREATE"
EventTypeEntitlementUpdate EventType = "ENTITLEMENT_UPDATE"
EventTypeEntitlementDelete EventType = "ENTITLEMENT_DELETE"
EventTypeThreadCreate EventType = "THREAD_CREATE"
EventTypeThreadUpdate EventType = "THREAD_UPDATE"
EventTypeThreadDelete EventType = "THREAD_DELETE"
Expand Down
21 changes: 21 additions & 0 deletions gateway/gateway_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -705,3 +705,24 @@ type EventHeartbeatAck struct {

func (EventHeartbeatAck) messageData() {}
func (EventHeartbeatAck) eventData() {}

type EventEntitlementCreate struct {
discord.Entitlement
}

func (EventEntitlementCreate) messageData() {}
func (EventEntitlementCreate) eventData() {}

type EventEntitlementUpdate struct {
discord.Entitlement
}

func (EventEntitlementUpdate) messageData() {}
func (EventEntitlementUpdate) eventData() {}

type EventEntitlementDelete struct {
discord.Entitlement
}

func (EventEntitlementDelete) messageData() {}
func (EventEntitlementDelete) eventData() {}
15 changes: 15 additions & 0 deletions gateway/gateway_messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,21 @@ func UnmarshalEventData(data []byte, eventType EventType) (EventData, error) {
err = json.Unmarshal(data, &d)
eventData = d

case EventTypeEntitlementCreate:
var d EventEntitlementCreate
err = json.Unmarshal(data, &d)
eventData = d

case EventTypeEntitlementUpdate:
var d EventEntitlementUpdate
err = json.Unmarshal(data, &d)
eventData = d

case EventTypeEntitlementDelete:
var d EventEntitlementDelete
err = json.Unmarshal(data, &d)
eventData = d

case EventTypeThreadCreate:
var d EventThreadCreate
err = json.Unmarshal(data, &d)
Expand Down
4 changes: 4 additions & 0 deletions handlers/all_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ var allEventHandlers = []bot.GatewayEventHandler{
bot.NewGatewayEventHandler(gateway.EventTypeChannelDelete, gatewayHandlerChannelDelete),
bot.NewGatewayEventHandler(gateway.EventTypeChannelPinsUpdate, gatewayHandlerChannelPinsUpdate),

bot.NewGatewayEventHandler(gateway.EventTypeEntitlementCreate, gatewayHandlerEntitlementCreate),
bot.NewGatewayEventHandler(gateway.EventTypeEntitlementUpdate, gatewayHandlerEntitlementUpdate),
bot.NewGatewayEventHandler(gateway.EventTypeEntitlementDelete, gatewayHandlerEntitlementDelete),

bot.NewGatewayEventHandler(gateway.EventTypeThreadCreate, gatewayHandlerThreadCreate),
bot.NewGatewayEventHandler(gateway.EventTypeThreadUpdate, gatewayHandlerThreadUpdate),
bot.NewGatewayEventHandler(gateway.EventTypeThreadDelete, gatewayHandlerThreadDelete),
Expand Down
34 changes: 34 additions & 0 deletions handlers/entitlement_handlers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package handlers

import (
"github.com/disgoorg/disgo/bot"
"github.com/disgoorg/disgo/events"
"github.com/disgoorg/disgo/gateway"
)

func gatewayHandlerEntitlementCreate(client bot.Client, sequenceNumber int, shardID int, event gateway.EventEntitlementCreate) {
client.EventManager().DispatchEvent(&events.EntitlementCreate{
GenericEntitlementEvent: &events.GenericEntitlementEvent{
GenericEvent: events.NewGenericEvent(client, sequenceNumber, shardID),
Entitlement: event.Entitlement,
},
})
}

func gatewayHandlerEntitlementUpdate(client bot.Client, sequenceNumber int, shardID int, event gateway.EventEntitlementUpdate) {
client.EventManager().DispatchEvent(&events.EntitlementUpdate{
GenericEntitlementEvent: &events.GenericEntitlementEvent{
GenericEvent: events.NewGenericEvent(client, sequenceNumber, shardID),
Entitlement: event.Entitlement,
},
})
}

func gatewayHandlerEntitlementDelete(client bot.Client, sequenceNumber int, shardID int, event gateway.EventEntitlementDelete) {
client.EventManager().DispatchEvent(&events.EntitlementDelete{
GenericEntitlementEvent: &events.GenericEntitlementEvent{
GenericEvent: events.NewGenericEvent(client, sequenceNumber, shardID),
Entitlement: event.Entitlement,
},
})
}
Loading

0 comments on commit 2570fd3

Please sign in to comment.