diff --git a/src/webpage/jsontypes.ts b/src/webpage/jsontypes.ts index 11d08a2..d5ea1d1 100644 --- a/src/webpage/jsontypes.ts +++ b/src/webpage/jsontypes.ts @@ -483,33 +483,33 @@ type memberChunk = { not_found: string[]; }; type voiceupdate={ - op: 0, - t: "VOICE_STATE_UPDATE", - d: { - guild_id: string, - channel_id: string, - user_id: string, - member: memberjson, - session_id: string, - token: string, - deaf: boolean, - mute: boolean, - self_deaf: boolean, - self_mute: boolean, - self_video: boolean, - suppress: boolean - }, - s: number + op: 0, + t: "VOICE_STATE_UPDATE", + d: { + guild_id: string, + channel_id: string, + user_id: string, + member: memberjson, + session_id: string, + token: string, + deaf: boolean, + mute: boolean, + self_deaf: boolean, + self_mute: boolean, + self_video: boolean, + suppress: boolean + }, + s: number }; type voiceserverupdate={ - op: 0, - t: "VOICE_SERVER_UPDATE", - d: { - token: string, - guild_id: string, - endpoint: string - }, - s: 6 + op: 0, + t: "VOICE_SERVER_UPDATE", + d: { + token: string, + guild_id: string, + endpoint: string + }, + s: 6 }; type memberlistupdatejson={ op: 0, @@ -541,7 +541,7 @@ type memberlistupdatejson={ count: number, id: string }[] - } + } } type webRTCSocket= { op: 8, @@ -552,21 +552,21 @@ type webRTCSocket= { op:6, d:{t: number} }|{ - op: 2, - d: { - ssrc: number, - "streams": { - type: "video",//probally more options, but idk - rid: string, - quality: number, - ssrc: number, - rtx_ssrc:number - }[], - ip: number, - port: number, - "modes": [],//no clue - "experiments": []//no clue - } + op: 2, + d: { + ssrc: number, + "streams": { + type: "video",//probally more options, but idk + rid: string, + quality: number, + ssrc: number, + rtx_ssrc:number + }[], + ip: number, + port: number, + "modes": [],//no clue + "experiments": []//no clue + } }|sdpback|opRTC12; type sdpback={ op: 4, @@ -578,29 +578,29 @@ type sdpback={ } }; type opRTC12={ - op: 12, - d: { - user_id: string, - audio_ssrc: number, - video_ssrc: number, - streams: [ - { - type: "video", - rid: "100", - ssrc: number, - active: boolean, - quality: 100, - rtx_ssrc: number, - max_bitrate: 2500000, - max_framerate: number, - max_resolution: { - type: "fixed", - width: number, - height: number - } - } - ] - } + op: 12, + d: { + user_id: string, + audio_ssrc: number, + video_ssrc: number, + streams: [ + { + type: "video", + rid: "100", + ssrc: number, + active: boolean, + quality: 100, + rtx_ssrc: number, + max_bitrate: 2500000, + max_framerate: number, + max_resolution: { + type: "fixed", + width: number, + height: number + } + } + ] + } } export{ readyjson, diff --git a/src/webpage/localuser.ts b/src/webpage/localuser.ts index 67c704d..b9235b6 100644 --- a/src/webpage/localuser.ts +++ b/src/webpage/localuser.ts @@ -507,6 +507,9 @@ class Localuser{ waitingForVoice?:((arg:voiceupdate|undefined)=>void); currentVoice?:Voice; async joinVoice(voice:Voice){ + if(this.currentVoice){ + this.currentVoice.leave(); + } this.currentVoice=voice; if(this.ws){ this.ws.send(JSON.stringify({ diff --git a/src/webpage/voice.ts b/src/webpage/voice.ts index f7a6ccd..fe513e1 100644 --- a/src/webpage/voice.ts +++ b/src/webpage/voice.ts @@ -62,6 +62,10 @@ class Voice{ setTimeout(this.sendAlive.bind(this), 1000); break; case 12: + if(!this.users.has(json.d.audio_ssrc)){ + console.log("redo 12!"); + this.makeOp12(); + } this.users.set(json.d.audio_ssrc,json.d.user_id); break @@ -176,8 +180,6 @@ a=rtcp-mux\r`; })).sdp; await pc.setLocalDescription({sdp:this.offer}); - - if(!this.counter) throw new Error("counter isn't defined"); const counter=this.counter; const remote:{sdp:string,type:RTCSdpType}={sdp:this.cleanServerSDP(counter),type:"answer"}; @@ -188,7 +190,7 @@ a=rtcp-mux\r`; for(const thing of (await sender.getStats())){ if(thing[1].ssrc){ this.ssrcMap.set(sender,thing[1].ssrc); - this.makeOp12(sender) + this.makeOp12(sender); } } } @@ -196,7 +198,11 @@ a=rtcp-mux\r`; }); } } - async makeOp12(sender:RTCRtpSender){ + async makeOp12(sender:RTCRtpSender|undefined|[RTCRtpSender,string]=(this.ssrcMap.entries().next().value)){ + if(!sender) throw new Error("sender doesn't exist"); + if(sender instanceof Array){ + sender=sender[0]; + } if(this.ws){ this.ws.send(JSON.stringify({ op: 12, @@ -480,5 +486,16 @@ a=rtcp-mux\r`; //pc.setRemoteDescription({sdp:json.d.token,type:""}) */ } + async leave(){ + this.status="Left voice chat"; + if(this.ws){ + this.ws.close(); + this.ws=undefined; + } + if(this.pc){ + this.pc.close(); + this.pc=undefined; + } + } } export {Voice};