/* Ċ Ġ* ĠJ ico fo , Ġthe ĠJ its i ĠConference ĠFocus . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 2 1 - Present Ġ 8 x 8 , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . j its i . j ico fo . x mpp Ċ Ċ import Ġorg . j its i . impl . protocol . x mpp . Registration Listener Ċ import Ġorg . j its i . impl . protocol . x mpp . X mpp Provider Ċ import Ġorg . j its i . j ico fo . Conference Store Ċ import Ġorg . j its i . j ico fo . Task Pools Ċ import Ġorg . j its i . utils . MediaType Ċ import Ġorg . j its i . utils . logging 2 . create Logger Ċ import Ġorg . j its i . x mpp . extensions . j its ime et . Json Message Extension Ċ import Ġorg . j ives o ftware . sm ack . St anza Listener Ċ import Ġorg . j ives o ftware . sm ack . filter . MessageType Filter Ċ import Ġorg . j ives o ftware . sm ack . packet . St anza Ċ import Ġorg . json . simple . JSONObject Ċ import Ġorg . json . simple . parser . JSONParser Ċ import Ġorg . jx mpp . jid . Domain B are J id Ċ import Ġorg . jx mpp . jid . impl . J id Create Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġkotlin . jvm . Throws Ċ Ċ /** Ċ Ġ* ĠAdds Ġthe ĠA / V Ġmod eration Ġhandling . ĠProcess Ġincoming Ġmessages Ġand Ġwhen Ġaudio Ġor Ġvideo Ġmod eration Ġis Ġenabled , Ċ Ġ* Ġmut ed Ġall Ġparticipants Ġin Ġthe Ġmeeting Ġ( that Ġare Ġnot Ġmod erators ). ĠMod erators Ġare Ġalways Ġallowed Ġto Ġun mute . Ċ Ġ*/ Ċ class ĠAv Mod eration Handler ( ĊĠĠĠ Ġprivate Ġval Ġx mpp Provider : ĠX mpp Provider , ĊĠĠĠ Ġprivate Ġval Ġconference Store : ĠConference Store Ċ ) Ġ: ĠRegistration Listener , ĠSt anza Listener Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġav Mod eration Address : ĠDomain B are J id ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġcreate Logger () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġx mpp Provider . x mpp Connection . add Sync St anza Listener ( this , ĠMessageType Filter . NORMAL ) ĊĠĠĠĠĠĠĠ Ġx mpp Provider . add Registration Listener ( this ) ĊĠĠĠĠĠĠĠ Ġregistration Changed ( x mpp Provider . is Registered ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess St anza ( stan za : ĠSt anza ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stan za . from Ġ!= Ġav Mod eration Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġjson Message Ġ= Ġst anza . getExtension ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Message Extension :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĠUnit . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Skip Ġprocessing Ġst anza Ġwithout ĠJson Message Extension ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTask Pools . io Pool . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincoming Json Ġ= ĠJSON Parser (). parse ( json Message . json ) Ġas ĠJSONObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( incoming Json [" type "] Ġ== Ġ" av _ mod eration ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconference J id Ġ= ĠJ id Create . entity B are From ( incoming Json [" room "] ?. toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconference Ġ= Ġconference Store . get Conference ( conference J id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Conference Ġ$ conference J id Ġdoes Ġnot Ġexist .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Room Ġ= Ġconference . chat Room ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Conference Ġhas Ġno Ġassociated Ġchat Room .") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenabled Ġ= Ġincoming Json [" enabled "] Ġas ĠBoolean ? ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enabled Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Type Ġ= ĠMediaType . parse String ( incoming Json [" media Type "] Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Enabled Value Ġ= Ġchat Room . is Av Mod eration Enabled ( media Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Room . set Av Mod eration Enabled ( media Type , Ġenabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Enabled Value Ġ!= Ġenabled Ġ&& Ġenabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mod eration Ġhad Ġbeen Ġenabled Ġfor Ġconference J id =$ conference J id , Ġby =${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Json [" actor "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfor Ġmedia Type =$ media Type " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlet 's Ġmute Ġeveryone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconference . mute All Participants ( media Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Json [" wh itel ists "] ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Room . update Av Mod eration Wh itel ists ( parse As Map Of String ToList Of String ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Failed Ġto Ġprocess Ġav _ mod eration Ġrequest Ġfrom Ġ${ stan za . from }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġconnection Ġis Ġregistered Ġwe Ġdo Ġdisco - info Ġquery Ġto Ġcheck Ġfor Ġ' av _ mod eration ' Ġcomponent ĊĠĠĠĠ Ġ* Ġand Ġwe Ġuse Ġthat Ġaddress Ġto Ġverify Ġincoming Ġmessages . ĊĠĠĠĠ Ġ* ĠWe Ġdo Ġthat Ġonly Ġonce Ġfor Ġthe Ġlife Ġof Ġj ico fo Ġand Ġskip Ġit Ġon Ġre connections . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġregistration Changed ( registered : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġav Mod eration Address Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġx mpp Provider . discover Info ( J id Create . bare From ( X mpp Config . client . x mpp Domain )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġav Mod Id entities Ġ= Ġinfo ?. getId entities (" component ", Ġ" av _ mod eration ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( av Mod Id entities Ġ!= Ġnull Ġ&& Ġav Mod Id entities . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġav Mod eration Address Ġ= ĠJ id Create . domain B are From ( av Mod Id entities [ 0 ]. name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Dis covered Ġav _ mod eration Ġcomponent Ġat Ġ$ av Mod eration Address .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġav Mod eration Address Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Did Ġnot Ġdiscover Ġav _ mod eration Ġcomponent .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġav Mod eration Address Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Error Ġchecking Ġfor Ġav _ mod eration Ġcomponent ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshutdown () Ġ{ ĊĠĠĠĠĠĠĠ Ġx mpp Provider . x mpp Connection . remove Sync St anza Listener ( this ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġthe Ġgiven Ġobject Ġ( expected Ġto Ġbe Ġa Ġ[ JSONObject ]) Ġas Ġa ĠMap < String , ĠList < String >> . ĠThrows Ċ Ġ* Ġ[ IllegalArgumentException ] Ġif Ġ[ o ] Ġis Ġnot Ġof Ġthe Ġexpected Ġtype . Ċ Ġ* Ġ@ return Ġa Ġmap Ġthat Ġis Ġguaranteed Ġto Ġhave Ġa Ġruntime Ġtype Ġof ĠMap < String , ĠList < String >> . Ċ Ġ*/ Ċ @ Throws ( IllegalArgumentException :: class ) Ċ private Ġfun Ġparse As Map Of String ToList Of String ( o : ĠAny ): ĠMap < String , ĠList < String >> Ġ{ ĊĠĠĠ Ġval ĠjsonObject : ĠJSONObject Ġ= Ġo Ġas ? ĠJSONObject Ġ?: Ġthrow ĠIllegalArgumentException (" Not Ġa ĠJSONObject ") ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠList < String >>() ĊĠĠĠ ĠjsonObject . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠ Ġk Ġas ? ĠString Ġ?: Ġthrow ĠIllegalArgumentException (" Key Ġis Ġnot Ġa Ġstring ") ĊĠĠĠĠĠĠĠ Ġv Ġas ? ĠList < *> Ġ?: Ġthrow ĠIllegalArgumentException (" Value Ġis Ġnot Ġa Ġlist ") ĊĠĠĠĠĠĠĠ Ġmap [ k ] Ġ= Ġv . map Ġ{ Ġit . toString () Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmap Ċ } Ċ