1
0
Fork 0
mirror of https://github.com/diamondburned/arikawa.git synced 2024-09-12 05:06:28 +00:00
arikawa/gateway/intents.go
diamondburned 54cadd2f45 gateway: Refactor for a better concurrent API
This commit refactors the whole package gateway as well as utils/ws
(formerly utils/wsutil) and voice/voicegateway. The new refactor
utilizes a design pattern involving a concurrent loop and an arriving
event channel.

An additional change was made to the way gateway events are typed.
Before, pretty much any type will satisfy a gateway event type, since
the actual type was just interface{}. The new refactor defines a
concrete interface that events can implement:

    type Event interface {
        Op() OpCode
        EventType() EventType
    }

Using this interface, the user can easily add custom gateway events
independently of the library without relying on string maps. This adds a
lot of type safety into the library and makes type-switching on Event
types much more reasonable.

Gateway error callbacks are also almost entirely removed in favor of
custom gateway events. A catch-all can easily be added like this:

    s.AddHandler(func(err error) {
        log.Println("gateway error:, err")
    })
2021-12-14 13:49:34 -08:00

94 lines
2.9 KiB
Go

package gateway
import (
"github.com/diamondburned/arikawa/v3/discord"
"github.com/diamondburned/arikawa/v3/utils/ws"
)
// Intents for the new Discord API feature, documented at
// https://discord.com/developers/docs/topics/gateway#gateway-intents.
type Intents uint32
const (
IntentGuilds Intents = 1 << iota
IntentGuildMembers
IntentGuildBans
IntentGuildEmojis
IntentGuildIntegrations
IntentGuildWebhooks
IntentGuildInvites
IntentGuildVoiceStates
IntentGuildPresences
IntentGuildMessages
IntentGuildMessageReactions
IntentGuildMessageTyping
IntentDirectMessages
IntentDirectMessageReactions
IntentDirectMessageTyping
)
// PrivilegedIntents contains a list of privileged intents that Discord requires
// bots to have these intents explicitly enabled in the Developer Portal.
var PrivilegedIntents = []Intents{
IntentGuildPresences,
IntentGuildMembers,
}
// Has returns true if i has the given intents.
func (i Intents) Has(intents Intents) bool {
return discord.HasFlag(uint64(i), uint64(intents))
}
// IsPrivileged returns true for each of the boolean that indicates the type of
// the privilege.
func (i Intents) IsPrivileged() (presences, member bool) {
// Keep this in sync with PrivilegedIntents.
return i.Has(IntentGuildPresences), i.Has(IntentGuildMembers)
}
// EventIntents maps event types to intents.
var EventIntents = map[ws.EventType]Intents{
"GUILD_CREATE": IntentGuilds,
"GUILD_UPDATE": IntentGuilds,
"GUILD_DELETE": IntentGuilds,
"GUILD_ROLE_CREATE": IntentGuilds,
"GUILD_ROLE_UPDATE": IntentGuilds,
"GUILD_ROLE_DELETE": IntentGuilds,
"CHANNEL_CREATE": IntentGuilds,
"CHANNEL_UPDATE": IntentGuilds,
"CHANNEL_DELETE": IntentGuilds,
"CHANNEL_PINS_UPDATE": IntentGuilds | IntentDirectMessages,
"GUILD_MEMBER_ADD": IntentGuildMembers,
"GUILD_MEMBER_REMOVE": IntentGuildMembers,
"GUILD_MEMBER_UPDATE": IntentGuildMembers,
"GUILD_BAN_ADD": IntentGuildBans,
"GUILD_BAN_REMOVE": IntentGuildBans,
"GUILD_EMOJIS_UPDATE": IntentGuildEmojis,
"GUILD_INTEGRATIONS_UPDATE": IntentGuildIntegrations,
"WEBHOOKS_UPDATE": IntentGuildWebhooks,
"INVITE_CREATE": IntentGuildInvites,
"INVITE_DELETE": IntentGuildInvites,
"VOICE_STATE_UPDATE": IntentGuildVoiceStates,
"PRESENCE_UPDATE": IntentGuildPresences,
"MESSAGE_CREATE": IntentGuildMessages | IntentDirectMessages,
"MESSAGE_UPDATE": IntentGuildMessages | IntentDirectMessages,
"MESSAGE_DELETE": IntentGuildMessages | IntentDirectMessages,
"MESSAGE_DELETE_BULK": IntentGuildMessages,
"MESSAGE_REACTION_ADD": IntentGuildMessageReactions | IntentDirectMessageReactions,
"MESSAGE_REACTION_REMOVE": IntentGuildMessageReactions | IntentDirectMessageReactions,
"MESSAGE_REACTION_REMOVE_ALL": IntentGuildMessageReactions | IntentDirectMessageReactions,
"MESSAGE_REACTION_REMOVE_EMOJI": IntentGuildMessageReactions | IntentDirectMessageReactions,
"TYPING_START": IntentGuildMessageTyping | IntentDirectMessageTyping,
}