package disgord

// Code generated - This file has been automatically generated by generate/events/main.go - DO NOT EDIT.
// Warning: This file is overwritten at "go generate", instead adapt events.go and event/events.go and run go generate

import (
	"github.com/andersfylling/disgord/internal/event"
)

// helpers

func AllEvents() []string {
	return event.All()
}

func AllEventsExcept(except ...string) []string {
	return event.AllExcept(except...)
}

// ---------------------------

// EvtChannelCreate Sent when a new channel is created, relevant to the current user. The inner payload is a DM channel or
// guild channel object.
const EvtChannelCreate = event.ChannelCreate

func (h *ChannelCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtChannelDelete Sent when a channel relevant to the current user is deleted. The inner payload is a DM or Guild channel object.
const EvtChannelDelete = event.ChannelDelete

func (h *ChannelDelete) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtChannelPinsUpdate Sent when a message is pinned or unpinned in a text channel. This is not sent when a pinned message is deleted.
const EvtChannelPinsUpdate = event.ChannelPinsUpdate

func (h *ChannelPinsUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtChannelUpdate Sent when a channel is updated. The inner payload is a guild channel object.
const EvtChannelUpdate = event.ChannelUpdate

func (h *ChannelUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildBanAdd Sent when a user is banned from a guild. The inner payload is a user object, with an extra guild_id key.
const EvtGuildBanAdd = event.GuildBanAdd

func (h *GuildBanAdd) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildBanRemove Sent when a user is unbanned from a guild. The inner payload is a user object, with an extra guild_id key.
const EvtGuildBanRemove = event.GuildBanRemove

func (h *GuildBanRemove) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildCreate This event can be sent in three different scenarios:
//  1. When a user is initially connecting, to lazily load and backfill information for all unavailable guilds
//     sent in the Ready event.
//  2. When a Guild becomes available again to the client.
//  3. When the current user joins a new Guild.
const EvtGuildCreate = event.GuildCreate

func (h *GuildCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildDelete Sent when a guild becomes unavailable during a guild outage, or when the user leaves or is removed from a guild.
// The inner payload is an unavailable guild object. If the unavailable field is not set, the user was removed
// from the guild.
const EvtGuildDelete = event.GuildDelete

func (h *GuildDelete) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildEmojisUpdate Sent when a guild's emojis have been updated.
const EvtGuildEmojisUpdate = event.GuildEmojisUpdate

func (h *GuildEmojisUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildIntegrationsUpdate Sent when a guild integration is updated.
const EvtGuildIntegrationsUpdate = event.GuildIntegrationsUpdate

func (h *GuildIntegrationsUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildMemberAdd Sent when a new user joins a guild.
const EvtGuildMemberAdd = event.GuildMemberAdd

func (h *GuildMemberAdd) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildMemberRemove Sent when a user is removed from a guild (leave/kick/ban).
const EvtGuildMemberRemove = event.GuildMemberRemove

func (h *GuildMemberRemove) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildMemberUpdate Sent when a guild member is updated.
const EvtGuildMemberUpdate = event.GuildMemberUpdate

func (h *GuildMemberUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildMembersChunk Sent in response to Gateway Request Guild Members.
const EvtGuildMembersChunk = event.GuildMembersChunk

func (h *GuildMembersChunk) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildRoleCreate Sent when a guild role is created.
const EvtGuildRoleCreate = event.GuildRoleCreate

func (h *GuildRoleCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildRoleDelete Sent when a guild role is created.
const EvtGuildRoleDelete = event.GuildRoleDelete

func (h *GuildRoleDelete) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildRoleUpdate Sent when a guild role is created.
const EvtGuildRoleUpdate = event.GuildRoleUpdate

func (h *GuildRoleUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildScheduledEventCreate ...
const EvtGuildScheduledEventCreate = event.GuildScheduledEventCreate

func (h *GuildScheduledEventCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildScheduledEventDelete ...
const EvtGuildScheduledEventDelete = event.GuildScheduledEventDelete

func (h *GuildScheduledEventDelete) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildScheduledEventUpdate ...
const EvtGuildScheduledEventUpdate = event.GuildScheduledEventUpdate

func (h *GuildScheduledEventUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildScheduledEventUserAdd ...
const EvtGuildScheduledEventUserAdd = event.GuildScheduledEventUserAdd

func (h *GuildScheduledEventUserAdd) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildScheduledEventUserRemove ...
const EvtGuildScheduledEventUserRemove = event.GuildScheduledEventUserRemove

func (h *GuildScheduledEventUserRemove) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildStickersUpdate ...
const EvtGuildStickersUpdate = event.GuildStickersUpdate

func (h *GuildStickersUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtGuildUpdate Sent when a guild is updated. The inner payload is a guild object.
const EvtGuildUpdate = event.GuildUpdate

func (h *GuildUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtInteractionCreate Sent when a user in a guild uses a Slash Command.
const EvtInteractionCreate = event.InteractionCreate

func (h *InteractionCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtInviteCreate Sent when a guild's invite is created.
const EvtInviteCreate = event.InviteCreate

func (h *InviteCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtInviteDelete Sent when an invite is deleted.
const EvtInviteDelete = event.InviteDelete

func (h *InviteDelete) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageCreate Sent when a message is created. The inner payload is a message object.
const EvtMessageCreate = event.MessageCreate

func (h *MessageCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageDelete Sent when a message is deleted.
const EvtMessageDelete = event.MessageDelete

func (h *MessageDelete) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageDeleteBulk Sent when multiple messages are deleted at once.
const EvtMessageDeleteBulk = event.MessageDeleteBulk

func (h *MessageDeleteBulk) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageReactionAdd Sent when a user adds a reaction to a message.
const EvtMessageReactionAdd = event.MessageReactionAdd

func (h *MessageReactionAdd) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageReactionRemove Sent when a user removes a reaction from a message.
const EvtMessageReactionRemove = event.MessageReactionRemove

func (h *MessageReactionRemove) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageReactionRemoveAll Sent when a user explicitly removes all reactions from a message.
const EvtMessageReactionRemoveAll = event.MessageReactionRemoveAll

func (h *MessageReactionRemoveAll) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageReactionRemoveEmoji Sent when a bot removes all instances of a given emoji from the reactions of a message.
const EvtMessageReactionRemoveEmoji = event.MessageReactionRemoveEmoji

func (h *MessageReactionRemoveEmoji) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtMessageUpdate Sent when a message is updated. The inner payload is a message object.
//
// NOTE! Has _at_least_ the GuildID and ChannelID fields.
const EvtMessageUpdate = event.MessageUpdate

func (h *MessageUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtPresenceUpdate A user's presence is their current state on a guild. This event is sent when a user's presence is updated for a guild.
const EvtPresenceUpdate = event.PresenceUpdate

func (h *PresenceUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtReady The ready event is dispatched when a client has completed the initial handshake with the gateway (for new sessions).
// The ready event can be the largest and most complex event the gateway will send, as it contains all the state
// required for a client to begin interacting with the rest of the platform.
const EvtReady = event.Ready

func (h *Ready) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtResumed The resumed event is dispatched when a client has sent a resume payload to the gateway
// (for resuming existing sessions).
const EvtResumed = event.Resumed

func (h *Resumed) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtThreadCreate Sent when a thread is created, relevant to the current user, or when the current user is added to a thread.
const EvtThreadCreate = event.ThreadCreate

func (h *ThreadCreate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtThreadDelete Sent when a thread relevant to the current user is deleted.
const EvtThreadDelete = event.ThreadDelete

func (h *ThreadDelete) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtThreadListSync Sent when the current user gains access to a channel.
const EvtThreadListSync = event.ThreadListSync

func (h *ThreadListSync) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtThreadMemberUpdate Sent when the thread member object for the current user is updated.
const EvtThreadMemberUpdate = event.ThreadMemberUpdate

func (h *ThreadMemberUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtThreadMembersUpdate Sent when anyone is added to or removed from a thread.
const EvtThreadMembersUpdate = event.ThreadMembersUpdate

func (h *ThreadMembersUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtThreadUpdate Sent when a thread is updated.
const EvtThreadUpdate = event.ThreadUpdate

func (h *ThreadUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtTypingStart Sent when a user starts typing in a channel.
const EvtTypingStart = event.TypingStart

func (h *TypingStart) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtUserUpdate Sent when properties about the user change. Inner payload is a user object.
const EvtUserUpdate = event.UserUpdate

func (h *UserUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtVoiceServerUpdate Sent when a guild's voice server is updated. This is sent when initially connecting to voice, and when the current
// voice instance fails over to a new server.
const EvtVoiceServerUpdate = event.VoiceServerUpdate

func (h *VoiceServerUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtVoiceStateUpdate Sent when someone joins/leaves/moves voice channels. Inner payload is a voice state object.
const EvtVoiceStateUpdate = event.VoiceStateUpdate

func (h *VoiceStateUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

// EvtWebhooksUpdate Sent when a guild channel's WebHook is created, updated, or deleted.
const EvtWebhooksUpdate = event.WebhooksUpdate

func (h *WebhooksUpdate) setShardID(id uint) { h.ShardID = id }

// ---------------------------

type dispatchRegistrater interface {
	register(evt string, inputs ...interface{}) error
}

type socketHandlerRegister struct {
	evtName     string
	middlewares []Middleware
	handlers    []Handler
	ctrl        HandlerCtrl

	reactor dispatchRegistrater
}

func (shr *socketHandlerRegister) build() {
	inputs := make([]interface{}, 0, len(shr.middlewares)+len(shr.handlers)+1)
	for _, mdlw := range shr.middlewares {
		inputs = append(inputs, mdlw)
	}
	for _, handler := range shr.handlers {
		inputs = append(inputs, handler)
	}
	if shr.ctrl != nil {
		inputs = append(inputs, shr.ctrl)
	}

	if err := shr.reactor.register(shr.evtName, inputs...); err != nil {
		panic(err)
	}
}

func (shr socketHandlerRegister) WithCtrl(ctrl HandlerCtrl) SocketHandlerRegistrator {
	if shr.ctrl != nil {
		panic("a controller was already registered for this handler specification")
	}
	shr.ctrl = ctrl
	return shr
}

func (shr socketHandlerRegister) WithMiddleware(first Middleware, extra ...Middleware) SocketHandlerRegistrator {
	shr.middlewares = append(shr.middlewares, first)
	shr.middlewares = append(shr.middlewares, extra...)
	return shr
}

// ChannelCreate Sent when a new channel is created, relevant to the current user. The inner payload is a DM channel or
// guild channel object.
func (shr socketHandlerRegister) ChannelCreate(handler HandlerChannelCreate, moreHandlers ...HandlerChannelCreate) {
	shr.evtName = EvtChannelCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ChannelCreateChan(handler chan *ChannelCreate, moreHandlers ...chan *ChannelCreate) {
	shr.evtName = EvtChannelCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ChannelDelete Sent when a channel relevant to the current user is deleted. The inner payload is a DM or Guild channel object.
func (shr socketHandlerRegister) ChannelDelete(handler HandlerChannelDelete, moreHandlers ...HandlerChannelDelete) {
	shr.evtName = EvtChannelDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ChannelDeleteChan(handler chan *ChannelDelete, moreHandlers ...chan *ChannelDelete) {
	shr.evtName = EvtChannelDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ChannelPinsUpdate Sent when a message is pinned or unpinned in a text channel. This is not sent when a pinned message is deleted.
func (shr socketHandlerRegister) ChannelPinsUpdate(handler HandlerChannelPinsUpdate, moreHandlers ...HandlerChannelPinsUpdate) {
	shr.evtName = EvtChannelPinsUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ChannelPinsUpdateChan(handler chan *ChannelPinsUpdate, moreHandlers ...chan *ChannelPinsUpdate) {
	shr.evtName = EvtChannelPinsUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ChannelUpdate Sent when a channel is updated. The inner payload is a guild channel object.
func (shr socketHandlerRegister) ChannelUpdate(handler HandlerChannelUpdate, moreHandlers ...HandlerChannelUpdate) {
	shr.evtName = EvtChannelUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ChannelUpdateChan(handler chan *ChannelUpdate, moreHandlers ...chan *ChannelUpdate) {
	shr.evtName = EvtChannelUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildBanAdd Sent when a user is banned from a guild. The inner payload is a user object, with an extra guild_id key.
func (shr socketHandlerRegister) GuildBanAdd(handler HandlerGuildBanAdd, moreHandlers ...HandlerGuildBanAdd) {
	shr.evtName = EvtGuildBanAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildBanAddChan(handler chan *GuildBanAdd, moreHandlers ...chan *GuildBanAdd) {
	shr.evtName = EvtGuildBanAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildBanRemove Sent when a user is unbanned from a guild. The inner payload is a user object, with an extra guild_id key.
func (shr socketHandlerRegister) GuildBanRemove(handler HandlerGuildBanRemove, moreHandlers ...HandlerGuildBanRemove) {
	shr.evtName = EvtGuildBanRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildBanRemoveChan(handler chan *GuildBanRemove, moreHandlers ...chan *GuildBanRemove) {
	shr.evtName = EvtGuildBanRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildCreate This event can be sent in three different scenarios:
//  1. When a user is initially connecting, to lazily load and backfill information for all unavailable guilds
//     sent in the Ready event.
//  2. When a Guild becomes available again to the client.
//  3. When the current user joins a new Guild.
func (shr socketHandlerRegister) GuildCreate(handler HandlerGuildCreate, moreHandlers ...HandlerGuildCreate) {
	shr.evtName = EvtGuildCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildCreateChan(handler chan *GuildCreate, moreHandlers ...chan *GuildCreate) {
	shr.evtName = EvtGuildCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildDelete Sent when a guild becomes unavailable during a guild outage, or when the user leaves or is removed from a guild.
// The inner payload is an unavailable guild object. If the unavailable field is not set, the user was removed
// from the guild.
func (shr socketHandlerRegister) GuildDelete(handler HandlerGuildDelete, moreHandlers ...HandlerGuildDelete) {
	shr.evtName = EvtGuildDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildDeleteChan(handler chan *GuildDelete, moreHandlers ...chan *GuildDelete) {
	shr.evtName = EvtGuildDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildEmojisUpdate Sent when a guild's emojis have been updated.
func (shr socketHandlerRegister) GuildEmojisUpdate(handler HandlerGuildEmojisUpdate, moreHandlers ...HandlerGuildEmojisUpdate) {
	shr.evtName = EvtGuildEmojisUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildEmojisUpdateChan(handler chan *GuildEmojisUpdate, moreHandlers ...chan *GuildEmojisUpdate) {
	shr.evtName = EvtGuildEmojisUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildIntegrationsUpdate Sent when a guild integration is updated.
func (shr socketHandlerRegister) GuildIntegrationsUpdate(handler HandlerGuildIntegrationsUpdate, moreHandlers ...HandlerGuildIntegrationsUpdate) {
	shr.evtName = EvtGuildIntegrationsUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildIntegrationsUpdateChan(handler chan *GuildIntegrationsUpdate, moreHandlers ...chan *GuildIntegrationsUpdate) {
	shr.evtName = EvtGuildIntegrationsUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildMemberAdd Sent when a new user joins a guild.
func (shr socketHandlerRegister) GuildMemberAdd(handler HandlerGuildMemberAdd, moreHandlers ...HandlerGuildMemberAdd) {
	shr.evtName = EvtGuildMemberAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildMemberAddChan(handler chan *GuildMemberAdd, moreHandlers ...chan *GuildMemberAdd) {
	shr.evtName = EvtGuildMemberAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildMemberRemove Sent when a user is removed from a guild (leave/kick/ban).
func (shr socketHandlerRegister) GuildMemberRemove(handler HandlerGuildMemberRemove, moreHandlers ...HandlerGuildMemberRemove) {
	shr.evtName = EvtGuildMemberRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildMemberRemoveChan(handler chan *GuildMemberRemove, moreHandlers ...chan *GuildMemberRemove) {
	shr.evtName = EvtGuildMemberRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildMemberUpdate Sent when a guild member is updated.
func (shr socketHandlerRegister) GuildMemberUpdate(handler HandlerGuildMemberUpdate, moreHandlers ...HandlerGuildMemberUpdate) {
	shr.evtName = EvtGuildMemberUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildMemberUpdateChan(handler chan *GuildMemberUpdate, moreHandlers ...chan *GuildMemberUpdate) {
	shr.evtName = EvtGuildMemberUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildMembersChunk Sent in response to Gateway Request Guild Members.
func (shr socketHandlerRegister) GuildMembersChunk(handler HandlerGuildMembersChunk, moreHandlers ...HandlerGuildMembersChunk) {
	shr.evtName = EvtGuildMembersChunk
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildMembersChunkChan(handler chan *GuildMembersChunk, moreHandlers ...chan *GuildMembersChunk) {
	shr.evtName = EvtGuildMembersChunk
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildRoleCreate Sent when a guild role is created.
func (shr socketHandlerRegister) GuildRoleCreate(handler HandlerGuildRoleCreate, moreHandlers ...HandlerGuildRoleCreate) {
	shr.evtName = EvtGuildRoleCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildRoleCreateChan(handler chan *GuildRoleCreate, moreHandlers ...chan *GuildRoleCreate) {
	shr.evtName = EvtGuildRoleCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildRoleDelete Sent when a guild role is created.
func (shr socketHandlerRegister) GuildRoleDelete(handler HandlerGuildRoleDelete, moreHandlers ...HandlerGuildRoleDelete) {
	shr.evtName = EvtGuildRoleDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildRoleDeleteChan(handler chan *GuildRoleDelete, moreHandlers ...chan *GuildRoleDelete) {
	shr.evtName = EvtGuildRoleDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildRoleUpdate Sent when a guild role is created.
func (shr socketHandlerRegister) GuildRoleUpdate(handler HandlerGuildRoleUpdate, moreHandlers ...HandlerGuildRoleUpdate) {
	shr.evtName = EvtGuildRoleUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildRoleUpdateChan(handler chan *GuildRoleUpdate, moreHandlers ...chan *GuildRoleUpdate) {
	shr.evtName = EvtGuildRoleUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildScheduledEventCreate ...
func (shr socketHandlerRegister) GuildScheduledEventCreate(handler HandlerGuildScheduledEventCreate, moreHandlers ...HandlerGuildScheduledEventCreate) {
	shr.evtName = EvtGuildScheduledEventCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildScheduledEventCreateChan(handler chan *GuildScheduledEventCreate, moreHandlers ...chan *GuildScheduledEventCreate) {
	shr.evtName = EvtGuildScheduledEventCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildScheduledEventDelete ...
func (shr socketHandlerRegister) GuildScheduledEventDelete(handler HandlerGuildScheduledEventDelete, moreHandlers ...HandlerGuildScheduledEventDelete) {
	shr.evtName = EvtGuildScheduledEventDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildScheduledEventDeleteChan(handler chan *GuildScheduledEventDelete, moreHandlers ...chan *GuildScheduledEventDelete) {
	shr.evtName = EvtGuildScheduledEventDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildScheduledEventUpdate ...
func (shr socketHandlerRegister) GuildScheduledEventUpdate(handler HandlerGuildScheduledEventUpdate, moreHandlers ...HandlerGuildScheduledEventUpdate) {
	shr.evtName = EvtGuildScheduledEventUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildScheduledEventUpdateChan(handler chan *GuildScheduledEventUpdate, moreHandlers ...chan *GuildScheduledEventUpdate) {
	shr.evtName = EvtGuildScheduledEventUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildScheduledEventUserAdd ...
func (shr socketHandlerRegister) GuildScheduledEventUserAdd(handler HandlerGuildScheduledEventUserAdd, moreHandlers ...HandlerGuildScheduledEventUserAdd) {
	shr.evtName = EvtGuildScheduledEventUserAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildScheduledEventUserAddChan(handler chan *GuildScheduledEventUserAdd, moreHandlers ...chan *GuildScheduledEventUserAdd) {
	shr.evtName = EvtGuildScheduledEventUserAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildScheduledEventUserRemove ...
func (shr socketHandlerRegister) GuildScheduledEventUserRemove(handler HandlerGuildScheduledEventUserRemove, moreHandlers ...HandlerGuildScheduledEventUserRemove) {
	shr.evtName = EvtGuildScheduledEventUserRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildScheduledEventUserRemoveChan(handler chan *GuildScheduledEventUserRemove, moreHandlers ...chan *GuildScheduledEventUserRemove) {
	shr.evtName = EvtGuildScheduledEventUserRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildStickersUpdate ...
func (shr socketHandlerRegister) GuildStickersUpdate(handler HandlerGuildStickersUpdate, moreHandlers ...HandlerGuildStickersUpdate) {
	shr.evtName = EvtGuildStickersUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildStickersUpdateChan(handler chan *GuildStickersUpdate, moreHandlers ...chan *GuildStickersUpdate) {
	shr.evtName = EvtGuildStickersUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// GuildUpdate Sent when a guild is updated. The inner payload is a guild object.
func (shr socketHandlerRegister) GuildUpdate(handler HandlerGuildUpdate, moreHandlers ...HandlerGuildUpdate) {
	shr.evtName = EvtGuildUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) GuildUpdateChan(handler chan *GuildUpdate, moreHandlers ...chan *GuildUpdate) {
	shr.evtName = EvtGuildUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// InteractionCreate Sent when a user in a guild uses a Slash Command.
func (shr socketHandlerRegister) InteractionCreate(handler HandlerInteractionCreate, moreHandlers ...HandlerInteractionCreate) {
	shr.evtName = EvtInteractionCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) InteractionCreateChan(handler chan *InteractionCreate, moreHandlers ...chan *InteractionCreate) {
	shr.evtName = EvtInteractionCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// InviteCreate Sent when a guild's invite is created.
func (shr socketHandlerRegister) InviteCreate(handler HandlerInviteCreate, moreHandlers ...HandlerInviteCreate) {
	shr.evtName = EvtInviteCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) InviteCreateChan(handler chan *InviteCreate, moreHandlers ...chan *InviteCreate) {
	shr.evtName = EvtInviteCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// InviteDelete Sent when an invite is deleted.
func (shr socketHandlerRegister) InviteDelete(handler HandlerInviteDelete, moreHandlers ...HandlerInviteDelete) {
	shr.evtName = EvtInviteDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) InviteDeleteChan(handler chan *InviteDelete, moreHandlers ...chan *InviteDelete) {
	shr.evtName = EvtInviteDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageCreate Sent when a message is created. The inner payload is a message object.
func (shr socketHandlerRegister) MessageCreate(handler HandlerMessageCreate, moreHandlers ...HandlerMessageCreate) {
	shr.evtName = EvtMessageCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageCreateChan(handler chan *MessageCreate, moreHandlers ...chan *MessageCreate) {
	shr.evtName = EvtMessageCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageDelete Sent when a message is deleted.
func (shr socketHandlerRegister) MessageDelete(handler HandlerMessageDelete, moreHandlers ...HandlerMessageDelete) {
	shr.evtName = EvtMessageDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageDeleteChan(handler chan *MessageDelete, moreHandlers ...chan *MessageDelete) {
	shr.evtName = EvtMessageDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageDeleteBulk Sent when multiple messages are deleted at once.
func (shr socketHandlerRegister) MessageDeleteBulk(handler HandlerMessageDeleteBulk, moreHandlers ...HandlerMessageDeleteBulk) {
	shr.evtName = EvtMessageDeleteBulk
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageDeleteBulkChan(handler chan *MessageDeleteBulk, moreHandlers ...chan *MessageDeleteBulk) {
	shr.evtName = EvtMessageDeleteBulk
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageReactionAdd Sent when a user adds a reaction to a message.
func (shr socketHandlerRegister) MessageReactionAdd(handler HandlerMessageReactionAdd, moreHandlers ...HandlerMessageReactionAdd) {
	shr.evtName = EvtMessageReactionAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageReactionAddChan(handler chan *MessageReactionAdd, moreHandlers ...chan *MessageReactionAdd) {
	shr.evtName = EvtMessageReactionAdd
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageReactionRemove Sent when a user removes a reaction from a message.
func (shr socketHandlerRegister) MessageReactionRemove(handler HandlerMessageReactionRemove, moreHandlers ...HandlerMessageReactionRemove) {
	shr.evtName = EvtMessageReactionRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageReactionRemoveChan(handler chan *MessageReactionRemove, moreHandlers ...chan *MessageReactionRemove) {
	shr.evtName = EvtMessageReactionRemove
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageReactionRemoveAll Sent when a user explicitly removes all reactions from a message.
func (shr socketHandlerRegister) MessageReactionRemoveAll(handler HandlerMessageReactionRemoveAll, moreHandlers ...HandlerMessageReactionRemoveAll) {
	shr.evtName = EvtMessageReactionRemoveAll
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageReactionRemoveAllChan(handler chan *MessageReactionRemoveAll, moreHandlers ...chan *MessageReactionRemoveAll) {
	shr.evtName = EvtMessageReactionRemoveAll
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageReactionRemoveEmoji Sent when a bot removes all instances of a given emoji from the reactions of a message.
func (shr socketHandlerRegister) MessageReactionRemoveEmoji(handler HandlerMessageReactionRemoveEmoji, moreHandlers ...HandlerMessageReactionRemoveEmoji) {
	shr.evtName = EvtMessageReactionRemoveEmoji
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageReactionRemoveEmojiChan(handler chan *MessageReactionRemoveEmoji, moreHandlers ...chan *MessageReactionRemoveEmoji) {
	shr.evtName = EvtMessageReactionRemoveEmoji
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// MessageUpdate Sent when a message is updated. The inner payload is a message object.
//
// NOTE! Has _at_least_ the GuildID and ChannelID fields.
func (shr socketHandlerRegister) MessageUpdate(handler HandlerMessageUpdate, moreHandlers ...HandlerMessageUpdate) {
	shr.evtName = EvtMessageUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) MessageUpdateChan(handler chan *MessageUpdate, moreHandlers ...chan *MessageUpdate) {
	shr.evtName = EvtMessageUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// PresenceUpdate A user's presence is their current state on a guild. This event is sent when a user's presence is updated for a guild.
func (shr socketHandlerRegister) PresenceUpdate(handler HandlerPresenceUpdate, moreHandlers ...HandlerPresenceUpdate) {
	shr.evtName = EvtPresenceUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) PresenceUpdateChan(handler chan *PresenceUpdate, moreHandlers ...chan *PresenceUpdate) {
	shr.evtName = EvtPresenceUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// Ready The ready event is dispatched when a client has completed the initial handshake with the gateway (for new sessions).
// The ready event can be the largest and most complex event the gateway will send, as it contains all the state
// required for a client to begin interacting with the rest of the platform.
func (shr socketHandlerRegister) Ready(handler HandlerReady, moreHandlers ...HandlerReady) {
	shr.evtName = EvtReady
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ReadyChan(handler chan *Ready, moreHandlers ...chan *Ready) {
	shr.evtName = EvtReady
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// Resumed The resumed event is dispatched when a client has sent a resume payload to the gateway
// (for resuming existing sessions).
func (shr socketHandlerRegister) Resumed(handler HandlerResumed, moreHandlers ...HandlerResumed) {
	shr.evtName = EvtResumed
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ResumedChan(handler chan *Resumed, moreHandlers ...chan *Resumed) {
	shr.evtName = EvtResumed
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ThreadCreate Sent when a thread is created, relevant to the current user, or when the current user is added to a thread.
func (shr socketHandlerRegister) ThreadCreate(handler HandlerThreadCreate, moreHandlers ...HandlerThreadCreate) {
	shr.evtName = EvtThreadCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ThreadCreateChan(handler chan *ThreadCreate, moreHandlers ...chan *ThreadCreate) {
	shr.evtName = EvtThreadCreate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ThreadDelete Sent when a thread relevant to the current user is deleted.
func (shr socketHandlerRegister) ThreadDelete(handler HandlerThreadDelete, moreHandlers ...HandlerThreadDelete) {
	shr.evtName = EvtThreadDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ThreadDeleteChan(handler chan *ThreadDelete, moreHandlers ...chan *ThreadDelete) {
	shr.evtName = EvtThreadDelete
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ThreadListSync Sent when the current user gains access to a channel.
func (shr socketHandlerRegister) ThreadListSync(handler HandlerThreadListSync, moreHandlers ...HandlerThreadListSync) {
	shr.evtName = EvtThreadListSync
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ThreadListSyncChan(handler chan *ThreadListSync, moreHandlers ...chan *ThreadListSync) {
	shr.evtName = EvtThreadListSync
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ThreadMemberUpdate Sent when the thread member object for the current user is updated.
func (shr socketHandlerRegister) ThreadMemberUpdate(handler HandlerThreadMemberUpdate, moreHandlers ...HandlerThreadMemberUpdate) {
	shr.evtName = EvtThreadMemberUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ThreadMemberUpdateChan(handler chan *ThreadMemberUpdate, moreHandlers ...chan *ThreadMemberUpdate) {
	shr.evtName = EvtThreadMemberUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ThreadMembersUpdate Sent when anyone is added to or removed from a thread.
func (shr socketHandlerRegister) ThreadMembersUpdate(handler HandlerThreadMembersUpdate, moreHandlers ...HandlerThreadMembersUpdate) {
	shr.evtName = EvtThreadMembersUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ThreadMembersUpdateChan(handler chan *ThreadMembersUpdate, moreHandlers ...chan *ThreadMembersUpdate) {
	shr.evtName = EvtThreadMembersUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// ThreadUpdate Sent when a thread is updated.
func (shr socketHandlerRegister) ThreadUpdate(handler HandlerThreadUpdate, moreHandlers ...HandlerThreadUpdate) {
	shr.evtName = EvtThreadUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) ThreadUpdateChan(handler chan *ThreadUpdate, moreHandlers ...chan *ThreadUpdate) {
	shr.evtName = EvtThreadUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// TypingStart Sent when a user starts typing in a channel.
func (shr socketHandlerRegister) TypingStart(handler HandlerTypingStart, moreHandlers ...HandlerTypingStart) {
	shr.evtName = EvtTypingStart
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) TypingStartChan(handler chan *TypingStart, moreHandlers ...chan *TypingStart) {
	shr.evtName = EvtTypingStart
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// UserUpdate Sent when properties about the user change. Inner payload is a user object.
func (shr socketHandlerRegister) UserUpdate(handler HandlerUserUpdate, moreHandlers ...HandlerUserUpdate) {
	shr.evtName = EvtUserUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) UserUpdateChan(handler chan *UserUpdate, moreHandlers ...chan *UserUpdate) {
	shr.evtName = EvtUserUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// VoiceServerUpdate Sent when a guild's voice server is updated. This is sent when initially connecting to voice, and when the current
// voice instance fails over to a new server.
func (shr socketHandlerRegister) VoiceServerUpdate(handler HandlerVoiceServerUpdate, moreHandlers ...HandlerVoiceServerUpdate) {
	shr.evtName = EvtVoiceServerUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) VoiceServerUpdateChan(handler chan *VoiceServerUpdate, moreHandlers ...chan *VoiceServerUpdate) {
	shr.evtName = EvtVoiceServerUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// VoiceStateUpdate Sent when someone joins/leaves/moves voice channels. Inner payload is a voice state object.
func (shr socketHandlerRegister) VoiceStateUpdate(handler HandlerVoiceStateUpdate, moreHandlers ...HandlerVoiceStateUpdate) {
	shr.evtName = EvtVoiceStateUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) VoiceStateUpdateChan(handler chan *VoiceStateUpdate, moreHandlers ...chan *VoiceStateUpdate) {
	shr.evtName = EvtVoiceStateUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

// WebhooksUpdate Sent when a guild channel's WebHook is created, updated, or deleted.
func (shr socketHandlerRegister) WebhooksUpdate(handler HandlerWebhooksUpdate, moreHandlers ...HandlerWebhooksUpdate) {
	shr.evtName = EvtWebhooksUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

func (shr socketHandlerRegister) WebhooksUpdateChan(handler chan *WebhooksUpdate, moreHandlers ...chan *WebhooksUpdate) {
	shr.evtName = EvtWebhooksUpdate
	shr.handlers = append(shr.handlers, handler)
	for _, h := range moreHandlers {
		shr.handlers = append(shr.handlers, h)
	}
	shr.build()
}

type SocketHandlerRegistrator interface {
	ChannelCreate(handler HandlerChannelCreate, moreHandlers ...HandlerChannelCreate)
	ChannelCreateChan(handler chan *ChannelCreate, moreHandlers ...chan *ChannelCreate)
	ChannelDelete(handler HandlerChannelDelete, moreHandlers ...HandlerChannelDelete)
	ChannelDeleteChan(handler chan *ChannelDelete, moreHandlers ...chan *ChannelDelete)
	ChannelPinsUpdate(handler HandlerChannelPinsUpdate, moreHandlers ...HandlerChannelPinsUpdate)
	ChannelPinsUpdateChan(handler chan *ChannelPinsUpdate, moreHandlers ...chan *ChannelPinsUpdate)
	ChannelUpdate(handler HandlerChannelUpdate, moreHandlers ...HandlerChannelUpdate)
	ChannelUpdateChan(handler chan *ChannelUpdate, moreHandlers ...chan *ChannelUpdate)
	GuildBanAdd(handler HandlerGuildBanAdd, moreHandlers ...HandlerGuildBanAdd)
	GuildBanAddChan(handler chan *GuildBanAdd, moreHandlers ...chan *GuildBanAdd)
	GuildBanRemove(handler HandlerGuildBanRemove, moreHandlers ...HandlerGuildBanRemove)
	GuildBanRemoveChan(handler chan *GuildBanRemove, moreHandlers ...chan *GuildBanRemove)
	GuildCreate(handler HandlerGuildCreate, moreHandlers ...HandlerGuildCreate)
	GuildCreateChan(handler chan *GuildCreate, moreHandlers ...chan *GuildCreate)
	GuildDelete(handler HandlerGuildDelete, moreHandlers ...HandlerGuildDelete)
	GuildDeleteChan(handler chan *GuildDelete, moreHandlers ...chan *GuildDelete)
	GuildEmojisUpdate(handler HandlerGuildEmojisUpdate, moreHandlers ...HandlerGuildEmojisUpdate)
	GuildEmojisUpdateChan(handler chan *GuildEmojisUpdate, moreHandlers ...chan *GuildEmojisUpdate)
	GuildIntegrationsUpdate(handler HandlerGuildIntegrationsUpdate, moreHandlers ...HandlerGuildIntegrationsUpdate)
	GuildIntegrationsUpdateChan(handler chan *GuildIntegrationsUpdate, moreHandlers ...chan *GuildIntegrationsUpdate)
	GuildMemberAdd(handler HandlerGuildMemberAdd, moreHandlers ...HandlerGuildMemberAdd)
	GuildMemberAddChan(handler chan *GuildMemberAdd, moreHandlers ...chan *GuildMemberAdd)
	GuildMemberRemove(handler HandlerGuildMemberRemove, moreHandlers ...HandlerGuildMemberRemove)
	GuildMemberRemoveChan(handler chan *GuildMemberRemove, moreHandlers ...chan *GuildMemberRemove)
	GuildMemberUpdate(handler HandlerGuildMemberUpdate, moreHandlers ...HandlerGuildMemberUpdate)
	GuildMemberUpdateChan(handler chan *GuildMemberUpdate, moreHandlers ...chan *GuildMemberUpdate)
	GuildMembersChunk(handler HandlerGuildMembersChunk, moreHandlers ...HandlerGuildMembersChunk)
	GuildMembersChunkChan(handler chan *GuildMembersChunk, moreHandlers ...chan *GuildMembersChunk)
	GuildRoleCreate(handler HandlerGuildRoleCreate, moreHandlers ...HandlerGuildRoleCreate)
	GuildRoleCreateChan(handler chan *GuildRoleCreate, moreHandlers ...chan *GuildRoleCreate)
	GuildRoleDelete(handler HandlerGuildRoleDelete, moreHandlers ...HandlerGuildRoleDelete)
	GuildRoleDeleteChan(handler chan *GuildRoleDelete, moreHandlers ...chan *GuildRoleDelete)
	GuildRoleUpdate(handler HandlerGuildRoleUpdate, moreHandlers ...HandlerGuildRoleUpdate)
	GuildRoleUpdateChan(handler chan *GuildRoleUpdate, moreHandlers ...chan *GuildRoleUpdate)
	GuildScheduledEventCreate(handler HandlerGuildScheduledEventCreate, moreHandlers ...HandlerGuildScheduledEventCreate)
	GuildScheduledEventCreateChan(handler chan *GuildScheduledEventCreate, moreHandlers ...chan *GuildScheduledEventCreate)
	GuildScheduledEventDelete(handler HandlerGuildScheduledEventDelete, moreHandlers ...HandlerGuildScheduledEventDelete)
	GuildScheduledEventDeleteChan(handler chan *GuildScheduledEventDelete, moreHandlers ...chan *GuildScheduledEventDelete)
	GuildScheduledEventUpdate(handler HandlerGuildScheduledEventUpdate, moreHandlers ...HandlerGuildScheduledEventUpdate)
	GuildScheduledEventUpdateChan(handler chan *GuildScheduledEventUpdate, moreHandlers ...chan *GuildScheduledEventUpdate)
	GuildScheduledEventUserAdd(handler HandlerGuildScheduledEventUserAdd, moreHandlers ...HandlerGuildScheduledEventUserAdd)
	GuildScheduledEventUserAddChan(handler chan *GuildScheduledEventUserAdd, moreHandlers ...chan *GuildScheduledEventUserAdd)
	GuildScheduledEventUserRemove(handler HandlerGuildScheduledEventUserRemove, moreHandlers ...HandlerGuildScheduledEventUserRemove)
	GuildScheduledEventUserRemoveChan(handler chan *GuildScheduledEventUserRemove, moreHandlers ...chan *GuildScheduledEventUserRemove)
	GuildStickersUpdate(handler HandlerGuildStickersUpdate, moreHandlers ...HandlerGuildStickersUpdate)
	GuildStickersUpdateChan(handler chan *GuildStickersUpdate, moreHandlers ...chan *GuildStickersUpdate)
	GuildUpdate(handler HandlerGuildUpdate, moreHandlers ...HandlerGuildUpdate)
	GuildUpdateChan(handler chan *GuildUpdate, moreHandlers ...chan *GuildUpdate)
	InteractionCreate(handler HandlerInteractionCreate, moreHandlers ...HandlerInteractionCreate)
	InteractionCreateChan(handler chan *InteractionCreate, moreHandlers ...chan *InteractionCreate)
	InviteCreate(handler HandlerInviteCreate, moreHandlers ...HandlerInviteCreate)
	InviteCreateChan(handler chan *InviteCreate, moreHandlers ...chan *InviteCreate)
	InviteDelete(handler HandlerInviteDelete, moreHandlers ...HandlerInviteDelete)
	InviteDeleteChan(handler chan *InviteDelete, moreHandlers ...chan *InviteDelete)
	MessageCreate(handler HandlerMessageCreate, moreHandlers ...HandlerMessageCreate)
	MessageCreateChan(handler chan *MessageCreate, moreHandlers ...chan *MessageCreate)
	MessageDelete(handler HandlerMessageDelete, moreHandlers ...HandlerMessageDelete)
	MessageDeleteChan(handler chan *MessageDelete, moreHandlers ...chan *MessageDelete)
	MessageDeleteBulk(handler HandlerMessageDeleteBulk, moreHandlers ...HandlerMessageDeleteBulk)
	MessageDeleteBulkChan(handler chan *MessageDeleteBulk, moreHandlers ...chan *MessageDeleteBulk)
	MessageReactionAdd(handler HandlerMessageReactionAdd, moreHandlers ...HandlerMessageReactionAdd)
	MessageReactionAddChan(handler chan *MessageReactionAdd, moreHandlers ...chan *MessageReactionAdd)
	MessageReactionRemove(handler HandlerMessageReactionRemove, moreHandlers ...HandlerMessageReactionRemove)
	MessageReactionRemoveChan(handler chan *MessageReactionRemove, moreHandlers ...chan *MessageReactionRemove)
	MessageReactionRemoveAll(handler HandlerMessageReactionRemoveAll, moreHandlers ...HandlerMessageReactionRemoveAll)
	MessageReactionRemoveAllChan(handler chan *MessageReactionRemoveAll, moreHandlers ...chan *MessageReactionRemoveAll)
	MessageReactionRemoveEmoji(handler HandlerMessageReactionRemoveEmoji, moreHandlers ...HandlerMessageReactionRemoveEmoji)
	MessageReactionRemoveEmojiChan(handler chan *MessageReactionRemoveEmoji, moreHandlers ...chan *MessageReactionRemoveEmoji)
	MessageUpdate(handler HandlerMessageUpdate, moreHandlers ...HandlerMessageUpdate)
	MessageUpdateChan(handler chan *MessageUpdate, moreHandlers ...chan *MessageUpdate)
	PresenceUpdate(handler HandlerPresenceUpdate, moreHandlers ...HandlerPresenceUpdate)
	PresenceUpdateChan(handler chan *PresenceUpdate, moreHandlers ...chan *PresenceUpdate)
	Ready(handler HandlerReady, moreHandlers ...HandlerReady)
	ReadyChan(handler chan *Ready, moreHandlers ...chan *Ready)
	Resumed(handler HandlerResumed, moreHandlers ...HandlerResumed)
	ResumedChan(handler chan *Resumed, moreHandlers ...chan *Resumed)
	ThreadCreate(handler HandlerThreadCreate, moreHandlers ...HandlerThreadCreate)
	ThreadCreateChan(handler chan *ThreadCreate, moreHandlers ...chan *ThreadCreate)
	ThreadDelete(handler HandlerThreadDelete, moreHandlers ...HandlerThreadDelete)
	ThreadDeleteChan(handler chan *ThreadDelete, moreHandlers ...chan *ThreadDelete)
	ThreadListSync(handler HandlerThreadListSync, moreHandlers ...HandlerThreadListSync)
	ThreadListSyncChan(handler chan *ThreadListSync, moreHandlers ...chan *ThreadListSync)
	ThreadMemberUpdate(handler HandlerThreadMemberUpdate, moreHandlers ...HandlerThreadMemberUpdate)
	ThreadMemberUpdateChan(handler chan *ThreadMemberUpdate, moreHandlers ...chan *ThreadMemberUpdate)
	ThreadMembersUpdate(handler HandlerThreadMembersUpdate, moreHandlers ...HandlerThreadMembersUpdate)
	ThreadMembersUpdateChan(handler chan *ThreadMembersUpdate, moreHandlers ...chan *ThreadMembersUpdate)
	ThreadUpdate(handler HandlerThreadUpdate, moreHandlers ...HandlerThreadUpdate)
	ThreadUpdateChan(handler chan *ThreadUpdate, moreHandlers ...chan *ThreadUpdate)
	TypingStart(handler HandlerTypingStart, moreHandlers ...HandlerTypingStart)
	TypingStartChan(handler chan *TypingStart, moreHandlers ...chan *TypingStart)
	UserUpdate(handler HandlerUserUpdate, moreHandlers ...HandlerUserUpdate)
	UserUpdateChan(handler chan *UserUpdate, moreHandlers ...chan *UserUpdate)
	VoiceServerUpdate(handler HandlerVoiceServerUpdate, moreHandlers ...HandlerVoiceServerUpdate)
	VoiceServerUpdateChan(handler chan *VoiceServerUpdate, moreHandlers ...chan *VoiceServerUpdate)
	VoiceStateUpdate(handler HandlerVoiceStateUpdate, moreHandlers ...HandlerVoiceStateUpdate)
	VoiceStateUpdateChan(handler chan *VoiceStateUpdate, moreHandlers ...chan *VoiceStateUpdate)
	WebhooksUpdate(handler HandlerWebhooksUpdate, moreHandlers ...HandlerWebhooksUpdate)
	WebhooksUpdateChan(handler chan *WebhooksUpdate, moreHandlers ...chan *WebhooksUpdate)
	WithCtrl(HandlerCtrl) SocketHandlerRegistrator
	WithMiddleware(first Middleware, extra ...Middleware) SocketHandlerRegistrator
}
