package Ġme . nya _ n . notification notifier . view models Ċ Ċ import Ġandroidx . core . text . is Digits Only Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġme . nya _ n . notification notifier . R Ċ import Ġme . nya _ n . notification notifier . entities . Message Ċ import Ġme . nya _ n . notification notifier . repositories . User Setting Repository Ċ import Ġme . nya _ n . notification notifier . repositories . sources . User Setting DataStore Ċ import Ġme . nya _ n . notification notifier . utils . Event Ċ import Ġjava . net . Data gram Packet Ċ import Ġjava . net . Data gram Socket Ċ import Ġjava . net . Inet Address Ċ Ċ class ĠTop ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġuser Setting Repository : ĠUser Setting Repository Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ message Ġ= ĠMutable LiveData < Event < Message >>() ĊĠĠĠ Ġval Ġmessage : ĠLive Data < Event < Message >> Ġ= Ġ_ message ĊĠĠĠ Ġval Ġaddress Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetting Ġ= Ġuser Setting Repository . getUser Setting () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġif Ġ( setting . port Ġ== ĠUser Setting DataStore . DEFAULT _ PORT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetting . port ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddr Ġ= Ġ"${ setting . host }:${ port }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress . post Value ( if Ġ( addr . length Ġ== Ġ 1 ) Ġ"" Ġelse Ġaddr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddr Ġ= Ġ( address . value Ġ?: Ġ""). split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( addr . size Ġ!= Ġ 2 Ġ|| Ġ!( addr [ 1 ]. isNotEmpty () Ġ&& Ġaddr [ 1 ]. is Digits Only ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ message . post Value ( Event ( Message . Error ( R . string . validation _ error _ addr ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetting Ġ= Ġuser Setting Repository . getUser Setting () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġaddr [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġaddr [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Setting Repository . save User Setting ( setting ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ message . post Value ( Event ( Message . Notice ( R . string . addr _ saved ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Test () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetting Ġ= Ġuser Setting Repository . getUser Setting () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuff Ġ= Ġ" éĢļçŁ¥ ãĥĨãĤ¹ãĥĪ ". toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddr Ġ= ĠInet Address . get ByName ( setting . host ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= ĠData gram Packet ( buff , Ġbuff . size , Ġaddr , Ġsetting . port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData gram Socket (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( packet ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ message . post Value ( Event ( Message . Notice ( R . string . notify _ test _ succeeded ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ message . post Value ( Event ( Message . Error ( R . string . notify _ test _ failed ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }