1
0
Fork 0
mirror of https://github.com/diamondburned/arikawa.git synced 2024-12-01 03:03:48 +00:00
arikawa/gateway/events.go
diamondburned a2333996a2 Gateway: Presence to contain user and guild fields
This commit changes the gateway.Presence struct to be similar to commits
prior to the last refactor, that is, the struct would have the User and
GuildID fields. This is done so it's easier to store them.
2020-11-28 22:36:33 -08:00

393 lines
12 KiB
Go

package gateway
import "github.com/diamondburned/arikawa/v2/discord"
// Rules: VOICE_STATE_UPDATE -> VoiceStateUpdateEvent
// https://discord.com/developers/docs/topics/gateway#connecting-and-resuming
type (
HelloEvent struct {
HeartbeatInterval discord.Milliseconds `json:"heartbeat_interval"`
}
// Ready is too big, so it's moved to ready.go
ResumedEvent struct{}
// InvalidSessionEvent indicates if the event is resumable.
InvalidSessionEvent bool
)
// https://discord.com/developers/docs/topics/gateway#channels
type (
ChannelCreateEvent struct {
discord.Channel
}
ChannelUpdateEvent struct {
discord.Channel
}
ChannelDeleteEvent struct {
discord.Channel
}
ChannelPinsUpdateEvent struct {
GuildID discord.GuildID `json:"guild_id,omitempty"`
ChannelID discord.ChannelID `json:"channel_id,omitempty"`
LastPin discord.Timestamp `json:"timestamp,omitempty"`
}
ChannelUnreadUpdateEvent struct {
GuildID discord.GuildID `json:"guild_id"`
ChannelUnreadUpdates []struct {
ID discord.ChannelID `json:"id"`
LastMessageID discord.MessageID `json:"last_message_id"`
}
}
)
// https://discord.com/developers/docs/topics/gateway#guilds
type (
GuildCreateEvent struct {
discord.Guild
Joined discord.Timestamp `json:"timestamp,omitempty"`
Large bool `json:"large,omitempty"`
Unavailable bool `json:"unavailable,omitempty"`
MemberCount uint64 `json:"member_count,omitempty"`
VoiceStates []discord.VoiceState `json:"voice_states,omitempty"`
Members []discord.Member `json:"members,omitempty"`
Channels []discord.Channel `json:"channels,omitempty"`
Presences []Presence `json:"presences,omitempty"`
}
GuildUpdateEvent struct {
discord.Guild
}
GuildDeleteEvent struct {
ID discord.GuildID `json:"id"`
// Unavailable if false == removed
Unavailable bool `json:"unavailable"`
}
GuildBanAddEvent struct {
GuildID discord.GuildID `json:"guild_id"`
User discord.User `json:"user"`
}
GuildBanRemoveEvent struct {
GuildID discord.GuildID `json:"guild_id"`
User discord.User `json:"user"`
}
GuildEmojisUpdateEvent struct {
GuildID discord.GuildID `json:"guild_id"`
Emojis []discord.Emoji `json:"emoji"`
}
GuildIntegrationsUpdateEvent struct {
GuildID discord.GuildID `json:"guild_id"`
}
GuildMemberAddEvent struct {
discord.Member
GuildID discord.GuildID `json:"guild_id"`
}
GuildMemberRemoveEvent struct {
GuildID discord.GuildID `json:"guild_id"`
User discord.User `json:"user"`
}
GuildMemberUpdateEvent struct {
GuildID discord.GuildID `json:"guild_id"`
RoleIDs []discord.RoleID `json:"roles"`
User discord.User `json:"user"`
Nick string `json:"nick"`
}
// GuildMembersChunkEvent is sent when Guild Request Members is called.
GuildMembersChunkEvent struct {
GuildID discord.GuildID `json:"guild_id"`
Members []discord.Member `json:"members"`
ChunkIndex int `json:"chunk_index"`
ChunkCount int `json:"chunk_count"`
// Whatever's not found goes here
NotFound []string `json:"not_found,omitempty"`
// Only filled if requested
Presences []Presence `json:"presences,omitempty"`
Nonce string `json:"nonce,omitempty"`
}
// GuildMemberListUpdate is an undocumented event. It's received when the
// client sends over GuildSubscriptions with the Channels field used.
// The State package does not handle this event.
GuildMemberListUpdate struct {
ID string `json:"id"`
GuildID discord.GuildID `json:"guild_id"`
MemberCount uint64 `json:"member_count"`
OnlineCount uint64 `json:"online_count"`
// Groups is all the visible role sections.
Groups []GuildMemberListGroup `json:"groups"`
Ops []GuildMemberListOp `json:"ops"`
}
GuildMemberListGroup struct {
ID string `json:"id"` // either discord.RoleID, "online" or "offline"
Count uint64 `json:"count"`
}
GuildMemberListOp struct {
// Mysterious string, so far spotted to be [SYNC, INSERT, UPDATE, DELETE].
Op string `json:"op"`
// NON-SYNC ONLY
// Only available for Ops that aren't "SYNC".
Index int `json:"index,omitempty"`
Item GuildMemberListOpItem `json:"item,omitempty"`
// SYNC ONLY
// Range requested in GuildSubscribeData.
Range [2]int `json:"range,omitempty"`
// Items is basically a linear list of roles and members, similarly to
// how the client renders it. No, it's not nested.
Items []GuildMemberListOpItem `json:"items,omitempty"`
}
// GuildMemberListOpItem is an enum. Either of the fields are provided, but
// never both. Refer to (*GuildMemberListUpdate).Ops for more.
GuildMemberListOpItem struct {
Group *GuildMemberListGroup `json:"group,omitempty"`
Member *struct {
discord.Member
HoistedRole string `json:"hoisted_role"`
Presence Presence `json:"presence"`
} `json:"member,omitempty"`
}
GuildRoleCreateEvent struct {
GuildID discord.GuildID `json:"guild_id"`
Role discord.Role `json:"role"`
}
GuildRoleUpdateEvent struct {
GuildID discord.GuildID `json:"guild_id"`
Role discord.Role `json:"role"`
}
GuildRoleDeleteEvent struct {
GuildID discord.GuildID `json:"guild_id"`
RoleID discord.RoleID `json:"role_id"`
}
)
func (u GuildMemberUpdateEvent) Update(m *discord.Member) {
m.RoleIDs = u.RoleIDs
m.User = u.User
m.Nick = u.Nick
}
// https://discord.com/developers/docs/topics/gateway#invites
type (
InviteCreateEvent struct {
Code string `json:"code"`
CreatedAt discord.Timestamp `json:"created_at"`
ChannelID discord.ChannelID `json:"channel_id"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
// Similar to discord.Invite
Inviter *discord.User `json:"inviter,omitempty"`
Target *discord.User `json:"target_user,omitempty"`
TargetType discord.InviteUserType `json:"target_user_type,omitempty"`
discord.InviteMetadata
}
InviteDeleteEvent struct {
Code string `json:"code"`
ChannelID discord.ChannelID `json:"channel_id"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
}
)
// https://discord.com/developers/docs/topics/gateway#messages
type (
MessageCreateEvent struct {
discord.Message
Member *discord.Member `json:"member,omitempty"`
}
MessageUpdateEvent struct {
discord.Message
Member *discord.Member `json:"member,omitempty"`
}
MessageDeleteEvent struct {
ID discord.MessageID `json:"id"`
ChannelID discord.ChannelID `json:"channel_id"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
}
MessageDeleteBulkEvent struct {
IDs []discord.MessageID `json:"ids"`
ChannelID discord.ChannelID `json:"channel_id"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
}
MessageReactionAddEvent struct {
UserID discord.UserID `json:"user_id"`
ChannelID discord.ChannelID `json:"channel_id"`
MessageID discord.MessageID `json:"message_id"`
Emoji discord.Emoji `json:"emoji,omitempty"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
Member *discord.Member `json:"member,omitempty"`
}
MessageReactionRemoveEvent struct {
UserID discord.UserID `json:"user_id"`
ChannelID discord.ChannelID `json:"channel_id"`
MessageID discord.MessageID `json:"message_id"`
Emoji discord.Emoji `json:"emoji"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
}
MessageReactionRemoveAllEvent struct {
ChannelID discord.ChannelID `json:"channel_id"`
MessageID discord.MessageID `json:"message_id"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
}
MessageReactionRemoveEmojiEvent struct {
ChannelID discord.ChannelID `json:"channel_id"`
MessageID discord.MessageID `json:"message_id"`
Emoji discord.Emoji `json:"emoji"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
}
MessageAckEvent struct {
MessageID discord.MessageID `json:"message_id"`
ChannelID discord.ChannelID `json:"channel_id"`
}
)
// Status is the enumerate type for a user's status.
type Status string
const (
UnknownStatus Status = ""
OnlineStatus Status = "online"
DoNotDisturbStatus Status = "dnd"
IdleStatus Status = "idle"
InvisibleStatus Status = "invisible"
OfflineStatus Status = "offline"
)
// https://discord.com/developers/docs/topics/gateway#presence
type (
// Presence represents a partial Presence structure used by other structs to be
// easily embedded. It does not contain any ID to identify who it belongs
// to. For more information, refer to the PresenceUpdateEvent struct.
Presence struct {
// User is the user presence is being updated for. Only the ID field is
// guaranteed to be valid per Discord documentation.
User discord.User `json:"user"`
// GuildID is the id of the guild
GuildID discord.GuildID `json:"guild_id"`
// Status is either "idle", "dnd", "online", or "offline".
Status Status `json:"status"`
// Activities are the user's current activities.
Activities []discord.Activity `json:"activities"`
// ClientStaus is the user's platform-dependent status.
ClientStatus ClientStatus `json:"client_status"`
}
// ClientStaus is the user's platform-dependent status.
//
// https://discord.com/developers/docs/topics/gateway#client-status-object
ClientStatus struct {
// Desktop is the user's status set for an active desktop (Windows,
// Linux, Mac) application session.
Desktop Status `json:"desktop,omitempty"`
// Mobile is the user's status set for an active mobile (iOS, Android)
// application session.
Mobile Status `json:"mobile,omitempty"`
// Web is the user's status set for an active web (browser, bot
// account) application session.
Web Status `json:"web,omitempty"`
}
// PresenceUpdateEvent represents the structure of the Presence Update Event
// object.
//
// https://discord.com/developers/docs/topics/gateway#presence-update-presence-update-event-fields
PresenceUpdateEvent struct {
Presence
}
PresencesReplaceEvent []PresenceUpdateEvent
// SessionsReplaceEvent is an undocumented user event. It's likely used for
// current user's presence updates.
SessionsReplaceEvent []struct {
Status Status `json:"status"`
SessionID string `json:"session_id"`
Activities []discord.Activity `json:"activities"`
ClientInfo struct {
Version int `json:"version"`
OS string `json:"os"`
Client string `json:"client"`
} `json:"client_info"`
Active bool `json:"active"`
}
TypingStartEvent struct {
ChannelID discord.ChannelID `json:"channel_id"`
UserID discord.UserID `json:"user_id"`
Timestamp discord.UnixTimestamp `json:"timestamp"`
GuildID discord.GuildID `json:"guild_id,omitempty"`
Member *discord.Member `json:"member,omitempty"`
}
UserUpdateEvent struct {
discord.User
}
)
// https://discord.com/developers/docs/topics/gateway#voice
type (
VoiceStateUpdateEvent struct {
discord.VoiceState
}
VoiceServerUpdateEvent struct {
Token string `json:"token"`
GuildID discord.GuildID `json:"guild_id"`
Endpoint string `json:"endpoint"`
}
)
// https://discord.com/developers/docs/topics/gateway#webhooks
type (
WebhooksUpdateEvent struct {
GuildID discord.GuildID `json:"guild_id"`
ChannelID discord.ChannelID `json:"channel_id"`
}
)
// Undocumented
type (
UserGuildSettingsUpdateEvent struct {
UserGuildSettings
}
UserSettingsUpdateEvent struct {
UserSettings
}
UserNoteUpdateEvent struct {
ID discord.UserID `json:"id"`
Note string `json:"note"`
}
)
type (
RelationshipAddEvent struct {
discord.Relationship
}
RelationshipRemoveEvent struct {
discord.Relationship
}
)