package Ġdev . k ord . voice . udp Ċ Ċ import Ġio . ktor . network . selector .* Ċ import Ġio . ktor . network . sockets .* Ċ import Ġio . ktor . util . network .* Ċ import Ġio . ktor . utils . io . core .* Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Coroutine Name Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . flow . consume As Flow Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġmu . Kotlin Logging Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ private Ġval Ġudp Connection Logger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ internal Ġclass ĠVoice Udp Connection ( ĊĠĠĠ Ġoverride Ġval Ġserver : ĠNetwork Address , ĊĠĠĠ Ġprivate Ġval Ġs src : ĠInt , ĊĠĠĠ Ġdispatcher : ĠCor outine Dispatcher Ċ ) Ġ: ĠCor outine Scope , ĠDiscord Udp Connection Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ġ= ĊĠĠĠĠĠĠĠ ĠSuper visor Job () Ġ+ Ġdispatcher Ġ+ ĠCor outine Name (" Discord ĠVoice ĠUDP ĠConnection ") ĊĊĠĠĠ Ġprivate Ġval Ġsocket Ġ= Ġa Socket ( Actor Selector Manager ( coroutine Context )). udp (). connect ( server ) Ġ// Ġudp Ġconnection ĊĠĠĠ Ġoverride Ġval ĠisOpen : ĠBoolean Ġget () Ġ= Ġ! socket . is Closed ĊĊĠĠĠ Ġ@ Opt In ( Experimental Unsigned Types :: class , ĠExperimental Io Api :: class ) ĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġperform Ip Discovery (): ĠNetwork Address Ġ{ ĊĠĠĠĠĠĠĠ Ġudp Connection Logger . trace Ġ{ Ġ" discover ing Ġip " Ġ} ĊĊĠĠĠĠĠĠĠ Ġsend Packet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( ss rc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Fully ( ByteArray ( 6 6 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreceive Packet (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . discard Exact ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġit . read Text Exact ( 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim End Ġ{ Ġit . code Ġ== Ġ 0 Ġ} Ġ// Ġresponse Ġstring Ġis Ġnull Ġterminated Ġand Ġpadded Ġwith Ġnull s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġit . read U Short (). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNetwork Address ( ip , Ġport ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsend ( packet : ĠData gram ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket . outgoing . send ( packet ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġreceive (): ĠData gram Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsocket . incoming . consume As Flow (). first () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠ Ġ} Ċ }