harmony/src/gateway/handlers/voiceStateUpdate.ts

48 lines
1.5 KiB
TypeScript

import type { Guild } from '../../structures/guild.ts'
import type { VoiceState } from '../../structures/voiceState.ts'
import type { MemberPayload } from '../../types/guild.ts'
import type { VoiceStatePayload } from '../../types/voice.ts'
import type { Gateway, GatewayEventHandler } from '../mod.ts'
export const voiceStateUpdate: GatewayEventHandler = async (
gateway: Gateway,
d: VoiceStatePayload
) => {
if (d.guild_id === undefined) return
const guild = ((await gateway.client.guilds.get(
d.guild_id
)) as unknown) as Guild
const voiceState = await guild.voiceStates.get(d.user_id)
if (d.channel_id === null) {
if (voiceState === undefined) {
await guild.members.set(d.user_id, (d.member as unknown) as MemberPayload)
const member = ((await guild.members.get(
d.user_id
)) as unknown) as MemberPayload
return gateway.client.emit('voiceStateRemoveUncached', { guild, member })
}
// No longer in the channel, so delete
await guild.voiceStates._delete(d.user_id)
gateway.client.emit(
'voiceStateRemove',
(voiceState as unknown) as VoiceState
)
return
}
await guild.voiceStates.set(d.user_id, d)
const newVoiceState = (await guild.voiceStates.get(d.user_id))!
if (d.user_id === gateway.client.user!.id) {
gateway.client.voice.emit('voiceStateUpdate', newVoiceState)
}
if (voiceState === undefined) {
gateway.client.emit('voiceStateAdd', newVoiceState)
} else {
gateway.client.emit('voiceStateUpdate', voiceState, newVoiceState)
}
}