This commit is contained in:
DjDeveloperr 2021-02-06 19:45:31 +05:30
parent 361baa39eb
commit 921d7323a3

View file

@ -1,112 +0,0 @@
import { Guild } from '../structures/guild.ts'
import {
VoiceChannel,
VoiceServerData
} from '../structures/guildVoiceChannel.ts'
import { VoiceOpcodes } from '../types/voice.ts'
import { Collection } from '../utils/collection.ts'
import { HarmonyEventEmitter } from '../utils/events.ts'
import { Client } from './client.ts'
export interface VoiceOptions {
channel: VoiceChannel
data: VoiceServerData
manager: VoiceConnectionsManager
}
export class VoiceConnectionsManager {
client: Client
connections: Collection<string, VoiceConnection> = new Collection()
constructor(client: Client) {
this.client = client
}
async establish(options: VoiceOptions): Promise<VoiceConnection> {
if (this.connections.has(options.channel.guild.id) === true)
throw new Error('Voice Connection already established')
const conn = new VoiceConnection(this, options)
this.connections.set(options.channel.guild.id, conn)
await conn.connect()
return conn
}
}
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
export type VoiceConnectionEvents = {
ready: []
}
/** Represents a Voice Connection made through a Voice Channel */
export class VoiceConnection extends HarmonyEventEmitter<VoiceConnectionEvents> {
client: Client
ws?: WebSocket
guild: Guild
channel: VoiceChannel
data: VoiceServerData
manager: VoiceConnectionsManager
ssrc?: number
ip?: string
port?: number
constructor(manager: VoiceConnectionsManager, options: VoiceOptions) {
super()
this.client = manager.client
this.manager = manager
this.channel = options.channel
this.guild = options.channel.guild
this.data = options.data
}
/** Connect to Voice Server */
async connect(): Promise<VoiceConnection> {
this.ws = new WebSocket(`wss://${this.data.endpoint}`)
this.ws.binaryType = 'arraybuffer'
this.ws.onopen = this.onopen.bind(this)
this.ws.onclose = this.onclose.bind(this)
this.ws.onmessage = this.onmessage.bind(this)
this.ws.onerror = this.onerror.bind(this)
return this
}
private send(data: { op: VoiceOpcodes; d: any }): void {
this.ws?.send(JSON.stringify(data))
}
private sendIdentify(): void {
this.send({
op: VoiceOpcodes.IDENTIFY,
d: {
server_id: this.guild.id,
user_id: this.client.user?.id,
session_id: this.data.sessionID,
token: this.data.token
}
})
}
private onopen(): void {
this.sendIdentify()
}
private onclose(): void {}
private onmessage(e: MessageEvent): void {
const data = JSON.parse(e.data)
if (typeof data !== 'object') return
switch (data.op) {
case VoiceOpcodes.READY:
this.ssrc = data.d.ssrc
this.ip = data.d.ip
this.port = data.d.port
this.emit('ready')
break
default:
break
}
}
private onerror(): void {}
}