func (c *Client) OnPresenceUpdate(f func(p *discord.Presence)) {
	c.registerHandler(eventPresenceUpdate, presenceUpdateHandler(f))
}
OnPresenceUpdate registers the handler function for the "PRESENCE_UPDATE" event.
This event is fired when a user's presence is updated for a guild.
The user object within this event can be partial, the only field which must be sent
is the id field, everything else is optional. Along with this limitation, no fields
are required, and the types of the fields are not validated. Your client should expect
any combination of fields and types within this event.
package harmony
import (
	"github.com/skwair/harmony/discord"
	"github.com/skwair/harmony/voice"
)
type handler interface {
	handle(interface{})
}
var intents = map[string]discord.GatewayIntent{
	eventGuildCreate:       discord.GatewayIntentGuild,
	eventGuildUpdate:       discord.GatewayIntentGuild,
	eventGuildRoleCreate:   discord.GatewayIntentGuild,
	eventGuildRoleUpdate:   discord.GatewayIntentGuild,
	eventGuildRoleDelete:   discord.GatewayIntentGuild,
	eventChannelCreate:     discord.GatewayIntentGuild,
	eventChannelUpdate:     discord.GatewayIntentGuild,
	eventChannelDelete:     discord.GatewayIntentGuild,
	eventChannelPinsUpdate: discord.GatewayIntentGuild,
	eventGuildMemberAdd:    discord.GatewayIntentGuildMembers,
	eventGuildMemberUpdate: discord.GatewayIntentGuildMembers,
	eventGuildMemberRemove: discord.GatewayIntentGuildMembers,
	eventGuildBanAdd:    discord.GatewayIntentGuildBans,
	eventGuildBanRemove: discord.GatewayIntentGuildBans,
	eventGuildEmojisUpdate: discord.GatewayIntentGuildEmojis,
	eventGuildIntegrationsUpdate: discord.GatewayIntentGuildIntegrations,
	eventWebhooksUpdate: discord.GatewayIntentGuildWebhooks,
	eventGuildInviteCreate: discord.GatewayIntentGuildInvites,
	eventGuildInviteDelete: discord.GatewayIntentGuildInvites,
	eventVoiceStateUpdate: discord.GatewayIntentGuildVoiceStates,
	eventPresenceUpdate: discord.GatewayIntentGuildPresences,
	eventMessageCreate:     discord.GatewayIntentGuildMessages | discord.GatewayIntentDirectMessages,
	eventMessageUpdate:     discord.GatewayIntentGuildMessages | discord.GatewayIntentDirectMessages,
	eventMessageDelete:     discord.GatewayIntentGuildMessages | discord.GatewayIntentDirectMessages,
	eventMessageDeleteBulk: discord.GatewayIntentGuildMessages | discord.GatewayIntentDirectMessages,
	eventMessageReactionAdd:         discord.GatewayIntentGuildMessageReactions | discord.GatewayIntentDirectMessageReactions,
	eventMessageReactionRemove:      discord.GatewayIntentGuildMessageReactions | discord.GatewayIntentDirectMessageReactions,
	eventMessageReactionRemoveAll:   discord.GatewayIntentGuildMessageReactions | discord.GatewayIntentDirectMessageReactions,
	eventMessageReactionRemoveEmoji: discord.GatewayIntentGuildMessageReactions | discord.GatewayIntentDirectMessageReactions,
	eventTypingStart: discord.GatewayIntentGuildMessageTyping | discord.GatewayIntentDirectMessageTyping,
}
func (c *Client) registerHandler(event string, h handler) {
	c.mu.Lock()
	defer c.mu.Unlock()
	if missing := intents[event]; missing&c.intents == 0 {
		c.logger.Warnf("registering handler for event %q without required intent %q", event, missing)
	}
	if h == nil {
		panic("harmony: trying to register a nil event handler")
	}
	c.handlersMu.Lock()
	c.handlers[event] = h
	c.handlersMu.Unlock()
	c.logger.Debugf("registered handler for %s events", event)
}
type readyHandler func(*Ready)
func (h readyHandler) handle(v interface{}) {
	h(v.(*Ready))
}
func (c *Client) OnReady(f func(r *Ready)) {
	c.registerHandler(eventReady, readyHandler(f))
}
type channelCreateHandler func(*discord.Channel)
func (h channelCreateHandler) handle(v interface{}) {
	h(v.(*discord.Channel))
}
func (c *Client) OnChannelCreate(f func(c *discord.Channel)) {
	c.registerHandler(eventChannelCreate, channelCreateHandler(f))
}
type channelUpdateHandler func(*discord.Channel)
func (h channelUpdateHandler) handle(v interface{}) {
	h(v.(*discord.Channel))
}
func (c *Client) OnChannelUpdate(f func(c *discord.Channel)) {
	c.registerHandler(eventChannelUpdate, channelUpdateHandler(f))
}
type channelDeleteHandler func(*discord.Channel)
func (h channelDeleteHandler) handle(v interface{}) {
	h(v.(*discord.Channel))
}
func (c *Client) OnChannelDelete(f func(c *discord.Channel)) {
	c.registerHandler(eventChannelDelete, channelDeleteHandler(f))
}
type ChannelPinsUpdate struct {
	ChannelID        string       `json:"channel_id"`
	LastPinTimestamp discord.Time `json:"last_pin_timestamp"`
}
type channelPinsUpdateHandler func(*ChannelPinsUpdate)
func (h channelPinsUpdateHandler) handle(v interface{}) {
	h(v.(*ChannelPinsUpdate))
}
func (c *Client) OnChannelPinsUpdate(f func(cpu *ChannelPinsUpdate)) {
	c.registerHandler(eventChannelPinsUpdate, channelPinsUpdateHandler(f))
}
type guildCreateHandler func(*discord.Guild)
func (h guildCreateHandler) handle(v interface{}) {
	h(v.(*discord.Guild))
}
func (c *Client) OnGuildCreate(f func(g *discord.Guild)) {
	c.registerHandler(eventGuildCreate, guildCreateHandler(f))
}
type guildUpdateHandler func(*discord.Guild)
func (h guildUpdateHandler) handle(v interface{}) {
	h(v.(*discord.Guild))
}
func (c *Client) OnGuildUpdate(f func(g *discord.Guild)) {
	c.registerHandler(eventGuildUpdate, guildUpdateHandler(f))
}
type guildDeleteHandler func(*discord.UnavailableGuild)
func (h guildDeleteHandler) handle(v interface{}) {
	h(v.(*discord.UnavailableGuild))
}
func (c *Client) OnGuildDelete(f func(g *discord.UnavailableGuild)) {
	c.registerHandler(eventGuildDelete, guildDeleteHandler(f))
}
type GuildBan struct {
	*discord.User
	GuildID string `json:"guild_id"`
}
type guildBanAddHandler func(*GuildBan)
func (h guildBanAddHandler) handle(v interface{}) {
	h(v.(*GuildBan))
}
func (c *Client) OnGuildBanAdd(f func(ban *GuildBan)) {
	c.registerHandler(eventGuildBanAdd, guildBanAddHandler(f))
}
type guildBanRemoveHandler func(*GuildBan)
func (h guildBanRemoveHandler) handle(v interface{}) {
	h(v.(*GuildBan))
}
func (c *Client) OnGuildBanRemove(f func(ban *GuildBan)) {
	c.registerHandler(eventGuildBanRemove, guildBanRemoveHandler(f))
}
type GuildEmojis struct {
	Emojis  []discord.Emoji `json:"emojis"`
	GuildID string          `json:"guild_id"`
}
type guildEmojisUpdateHandler func(*GuildEmojis)
func (h guildEmojisUpdateHandler) handle(v interface{}) {
	h(v.(*GuildEmojis))
}
func (c *Client) OnGuildEmojisUpdate(f func(emojis *GuildEmojis)) {
	c.registerHandler(eventGuildEmojisUpdate, guildEmojisUpdateHandler(f))
}
type GuildIntegrationUpdate struct {
	GuildID string `json:"guild_id"`
}
type guildIntegrationUpdateHandler func(*GuildIntegrationUpdate)
func (h guildIntegrationUpdateHandler) handle(v interface{}) {
	h(v.(*GuildIntegrationUpdate))
}
func (c *Client) OnGuildIntegrationsUpdate(f func(u *GuildIntegrationUpdate)) {
	c.registerHandler(eventGuildIntegrationsUpdate, guildIntegrationUpdateHandler(f))
}
type GuildMemberAdd struct {
	*discord.GuildMember
	GuildID string `json:"guild_id"`
}
type guildMemberAddHandler func(*GuildMemberAdd)
func (h guildMemberAddHandler) handle(v interface{}) {
	h(v.(*GuildMemberAdd))
}
func (c *Client) OnGuildMemberAdd(f func(m *GuildMemberAdd)) {
	c.registerHandler(eventGuildMemberAdd, guildMemberAddHandler(f))
}
type GuildMemberRemove struct {
	User    *discord.User `json:"user"`
	GuildID string        `json:"guild_id"`
}
type guildMemberRemoveHandler func(*GuildMemberRemove)
func (h guildMemberRemoveHandler) handle(v interface{}) {
	h(v.(*GuildMemberRemove))
}
func (c *Client) OnGuildMemberRemove(f func(m *GuildMemberRemove)) {
	c.registerHandler(eventGuildMemberRemove, guildMemberRemoveHandler(f))
}
type GuildMemberUpdate struct {
	GuildID string        `json:"guild_id"`
	Roles   []string      `json:"roles"`
	User    *discord.User `json:"user"`
	Nick    string        `json:"nick"`
}
type guildMemberUpdateHandler func(*GuildMemberUpdate)
func (h guildMemberUpdateHandler) handle(v interface{}) {
	h(v.(*GuildMemberUpdate))
}
func (c *Client) OnGuildMemberUpdate(f func(m *GuildMemberUpdate)) {
	c.registerHandler(eventGuildMemberUpdate, guildMemberUpdateHandler(f))
}
type GuildMembersChunk struct {
	GuildID string                `json:"guild_id"`
	Members []discord.GuildMember `json:"members"`
}
type guildMembersChunkHandler func(*GuildMembersChunk)
func (h guildMembersChunkHandler) handle(v interface{}) {
	h(v.(*GuildMembersChunk))
}
func (c *Client) OnGuildMembersChunk(f func(m *GuildMembersChunk)) {
	c.registerHandler(eventGuildMembersChunk, guildMembersChunkHandler(f))
}
type GuildRole struct {
	GuildID string        `json:"guild_id"`
	Role    *discord.Role `json:"role"`
}
type guildRoleCreateHandler func(*GuildRole)
func (h guildRoleCreateHandler) handle(v interface{}) {
	h(v.(*GuildRole))
}
func (c *Client) OnGuildRoleCreate(f func(r *GuildRole)) {
	c.registerHandler(eventGuildRoleCreate, guildRoleCreateHandler(f))
}
type guildRoleUpdateHandler func(*GuildRole)
func (h guildRoleUpdateHandler) handle(v interface{}) {
	h(v.(*GuildRole))
}
func (c *Client) OnGuildRoleUpdate(f func(r *GuildRole)) {
	c.registerHandler(eventGuildRoleUpdate, guildRoleUpdateHandler(f))
}
type GuildRoleDelete struct {
	GuildID string `json:"guild_id"`
	RoleID  string `json:"role_id"`
}
type guildRoleDeleteHandler func(*GuildRoleDelete)
func (h guildRoleDeleteHandler) handle(v interface{}) {
	h(v.(*GuildRoleDelete))
}
func (c *Client) OnGuildRoleDelete(f func(r *GuildRoleDelete)) {
	c.registerHandler(eventGuildRoleDelete, guildRoleDeleteHandler(f))
}
type GuildInviteCreate struct {
	ChannelID      string        `json:"channel_id"`
	Code           string        `json:"code"`
	CreatedAt      discord.Time  `json:"created_at"`
	GuildID        string        `json:"guild_id"`
	Inviter        *discord.User `json:"inviter"`
	MaxAge         int           `json:"max_age"`
	MaxUses        int           `json:"max_uses"`
	TargetUser     *discord.User `json:"target_user"`
	TargetUserType int           `json:"target_user_type"`
	Temporary      bool          `json:"temporary"`
	Uses           int           `json:"uses"`
}
type guildInviteCreateHandler func(*GuildInviteCreate)
func (h guildInviteCreateHandler) handle(v interface{}) {
	h(v.(*GuildInviteCreate))
}
func (c *Client) OnGuildInviteCreate(f func(i *GuildInviteCreate)) {
	c.registerHandler(eventGuildInviteCreate, guildInviteCreateHandler(f))
}
type GuildInviteDelete struct {
	ChannelID string `json:"channel_id"`
	GuildID   string `json:"guild_id"`
	Code      string `json:"code"`
}
type guildInviteDeleteHandler func(*GuildInviteDelete)
func (h guildInviteDeleteHandler) handle(v interface{}) {
	h(v.(*GuildInviteDelete))
}
func (c *Client) OnGuildInviteDelete(f func(i *GuildInviteDelete)) {
	c.registerHandler(eventGuildInviteDelete, guildInviteDeleteHandler(f))
}
type messageCreateHandler func(*discord.Message)
func (h messageCreateHandler) handle(v interface{}) {
	h(v.(*discord.Message))
}
func (c *Client) OnMessageCreate(f func(m *discord.Message)) {
	c.registerHandler(eventMessageCreate, messageCreateHandler(f))
}
type messageUpdateHandler func(*discord.Message)
func (h messageUpdateHandler) handle(v interface{}) {
	h(v.(*discord.Message))
}
func (c *Client) OnMessageUpdate(f func(m *discord.Message)) {
	c.registerHandler(eventMessageUpdate, messageUpdateHandler(f))
}
type MessageDelete struct {
	ChannelID string `json:"channel_id"`
	MessageID string `json:"id"`
}
type messageDeleteHandler func(*MessageDelete)
func (h messageDeleteHandler) handle(v interface{}) {
	h(v.(*MessageDelete))
}
func (c *Client) OnMessageDelete(f func(m *MessageDelete)) {
	c.registerHandler(eventMessageDelete, messageDeleteHandler(f))
}
type MessageDeleteBulk struct {
	GuildID   string   `json:"guild_id"`
	ChannelID string   `json:"channel_id"`
	IDs       []string `json:"ids"`
}
type messageDeleteBulkHandler func(*MessageDeleteBulk)
func (h messageDeleteBulkHandler) handle(v interface{}) {
	h(v.(*MessageDeleteBulk))
}
func (c *Client) OnMessageDeleteBulk(f func(mdb *MessageDeleteBulk)) {
	c.registerHandler(eventMessageDeleteBulk, messageDeleteBulkHandler(f))
}
type MessageAck struct {
	ChannelID string `json:"channel_id"`
	MessageID string `json:"message_id"`
}
type messageAckHandler func(*MessageAck)
func (h messageAckHandler) handle(v interface{}) {
	h(v.(*MessageAck))
}
func (c *Client) OnMessageAck(f func(ack *MessageAck)) {
	c.registerHandler(eventMessageAck, messageAckHandler(f))
}
type MessageReaction struct {
	UserID    string         `json:"user_id"`
	GuildID   string         `json:"guild_id"`
	ChannelID string         `json:"channel_id"`
	MessageID string         `json:"message_id"`
	Emoji     *discord.Emoji `json:"emoji"`
}
type messageReactionAddHandler func(*MessageReaction)
func (h messageReactionAddHandler) handle(v interface{}) {
	h(v.(*MessageReaction))
}
func (c *Client) OnMessageReactionAdd(f func(r *MessageReaction)) {
	c.registerHandler(eventMessageReactionAdd, messageReactionAddHandler(f))
}
type messageReactionRemoveHandler func(*MessageReaction)
func (h messageReactionRemoveHandler) handle(v interface{}) {
	h(v.(*MessageReaction))
}
func (c *Client) OnMessageReactionRemove(f func(r *MessageReaction)) {
	c.registerHandler(eventMessageReactionRemove, messageReactionRemoveHandler(f))
}
type MessageReactionRemoveAll struct {
	GuildID   string `json:"guild_id"`
	ChannelID string `json:"channel_id"`
	MessageID string `json:"message_id"`
}
type messageReactionRemoveAllHandler func(*MessageReactionRemoveAll)
func (h messageReactionRemoveAllHandler) handle(v interface{}) {
	h(v.(*MessageReactionRemoveAll))
}
func (c *Client) OnMessageReactionRemoveAll(f func(r *MessageReactionRemoveAll)) {
	c.registerHandler(eventMessageReactionRemoveAll, messageReactionRemoveAllHandler(f))
}
type MessageReactionRemoveEmoji struct {
	GuildID   string         `json:"guild_id"`
	ChannelID string         `json:"channel_id"`
	MessageID string         `json:"message_id"`
	Emoji     *discord.Emoji `json:"emoji"`
}
type messageReactionRemoveEmojiHandler func(*MessageReactionRemoveEmoji)
func (h messageReactionRemoveEmojiHandler) handle(v interface{}) {
	h(v.(*MessageReactionRemoveEmoji))
}
func (c *Client) OnMessageReactionRemoveEmoji(f func(r *MessageReactionRemoveEmoji)) {
	c.registerHandler(eventMessageReactionRemoveEmoji, messageReactionRemoveEmojiHandler(f))
}
type presenceUpdateHandler func(*discord.Presence)
func (h presenceUpdateHandler) handle(v interface{}) {
	h(v.(*discord.Presence))
}