2020-12-05 08:56:43 +00:00
|
|
|
import { VoiceServerUpdateData } from '../gateway/handlers/index.ts'
|
|
|
|
import { VoiceStateOptions } from '../gateway/index.ts'
|
2020-10-23 16:11:00 +00:00
|
|
|
import { Client } from '../models/client.ts'
|
2020-10-31 12:33:34 +00:00
|
|
|
import { GuildVoiceChannelPayload, Overwrite } from '../types/channel.ts'
|
2020-10-23 16:11:00 +00:00
|
|
|
import { Channel } from './channel.ts'
|
2020-11-08 07:57:24 +00:00
|
|
|
import { Guild } from './guild.ts'
|
2020-12-05 08:56:43 +00:00
|
|
|
import { VoiceState } from './voiceState.ts'
|
2020-10-23 16:11:00 +00:00
|
|
|
|
|
|
|
export class VoiceChannel extends Channel {
|
|
|
|
bitrate: string
|
|
|
|
userLimit: number
|
|
|
|
guildID: string
|
|
|
|
name: string
|
2020-11-01 13:42:00 +00:00
|
|
|
guild: Guild
|
2020-10-23 16:11:00 +00:00
|
|
|
position: number
|
|
|
|
permissionOverwrites: Overwrite[]
|
|
|
|
nsfw: boolean
|
|
|
|
parentID?: string
|
|
|
|
|
2020-12-02 12:29:52 +00:00
|
|
|
constructor(client: Client, data: GuildVoiceChannelPayload, guild: Guild) {
|
2020-10-23 16:11:00 +00:00
|
|
|
super(client, data)
|
|
|
|
this.bitrate = data.bitrate
|
|
|
|
this.userLimit = data.user_limit
|
|
|
|
this.guildID = data.guild_id
|
|
|
|
this.name = data.name
|
|
|
|
this.position = data.position
|
2020-11-01 13:42:00 +00:00
|
|
|
this.guild = guild
|
2020-10-23 16:11:00 +00:00
|
|
|
this.permissionOverwrites = data.permission_overwrites
|
|
|
|
this.nsfw = data.nsfw
|
|
|
|
this.parentID = data.parent_id
|
2020-11-01 11:22:09 +00:00
|
|
|
// TODO: Cache in Gateway Event Code
|
|
|
|
// cache.set('guildvoicechannel', this.id, this)
|
2020-10-29 14:43:27 +00:00
|
|
|
}
|
|
|
|
|
2020-12-05 08:56:43 +00:00
|
|
|
async join(options?: VoiceStateOptions): Promise<VoiceServerUpdateData> {
|
|
|
|
return await new Promise((resolve, reject) => {
|
|
|
|
let vcdata: VoiceServerUpdateData | undefined
|
|
|
|
let done = 0
|
|
|
|
|
|
|
|
const onVoiceStateAdd = (state: VoiceState): void => {
|
|
|
|
if (state.user.id !== this.client.user?.id) return
|
|
|
|
if (state.channel?.id !== this.id) return
|
|
|
|
this.client.removeListener('voiceStateAdd', onVoiceStateAdd)
|
|
|
|
done++
|
|
|
|
if (done >= 2) resolve(vcdata)
|
|
|
|
}
|
|
|
|
|
|
|
|
const onVoiceServerUpdate = (data: VoiceServerUpdateData): void => {
|
|
|
|
if (data.guild.id !== this.guild.id) return
|
|
|
|
vcdata = data
|
|
|
|
this.client.removeListener('voiceServerUpdate', onVoiceServerUpdate)
|
|
|
|
done++
|
|
|
|
if (done >= 2) resolve(vcdata)
|
|
|
|
}
|
|
|
|
|
|
|
|
this.client.gateway?.updateVoiceState(this.guild.id, this.id, options)
|
|
|
|
|
|
|
|
this.client.on('voiceStateAdd', onVoiceStateAdd)
|
|
|
|
this.client.on('voiceServerUpdate', onVoiceServerUpdate)
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
if (done < 2) {
|
|
|
|
this.client.removeListener('voiceServerUpdate', onVoiceServerUpdate)
|
|
|
|
this.client.removeListener('voiceStateAdd', onVoiceStateAdd)
|
|
|
|
reject(
|
|
|
|
new Error(
|
|
|
|
"Connection timed out - couldn't connect to Voice Channel"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}, 1000 * 60)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
leave(): void {
|
|
|
|
this.client.gateway?.updateVoiceState(this.guild.id, undefined)
|
|
|
|
}
|
|
|
|
|
2020-12-03 05:28:20 +00:00
|
|
|
readFromData(data: GuildVoiceChannelPayload): void {
|
2020-10-29 14:43:27 +00:00
|
|
|
super.readFromData(data)
|
|
|
|
this.bitrate = data.bitrate ?? this.bitrate
|
|
|
|
this.userLimit = data.user_limit ?? this.userLimit
|
|
|
|
this.guildID = data.guild_id ?? this.guildID
|
|
|
|
this.name = data.name ?? this.name
|
|
|
|
this.position = data.position ?? this.position
|
|
|
|
this.permissionOverwrites =
|
|
|
|
data.permission_overwrites ?? this.permissionOverwrites
|
|
|
|
this.nsfw = data.nsfw ?? this.nsfw
|
|
|
|
this.parentID = data.parent_id ?? this.parentID
|
2020-10-23 16:11:00 +00:00
|
|
|
}
|
|
|
|
}
|