/* Ċ Ġ* ĠPoly Bootstrap Ġ- ĠA ĠDiscord Ġbot Ġfor Ġthe ĠPoly hed ral ĠDevelopment Ġdiscord Ġserver Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 - 2 0 2 1 Ġsol on ov am ax Ġ< sol on ov am ax @ 1 2 oc lock point . com > Ċ Ġ* Ċ Ġ* ĠThe Ġfile ĠLaunch er . kt Ġis Ġpart Ġof ĠPoly Bootstrap Ċ Ġ* ĠLast Ġmodified Ġon Ġ 2 2 - 1 2 - 2 0 2 1 Ġ 0 6 : 5 8 Ġp . m . Ċ Ġ* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠPOL Y BOOT STR AP ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġca . so lost ud ios . poly bot . bootstrap Ċ Ċ import Ġjava . io . File Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġkotlinx . cli . Arg Parser Ċ import Ġkotlinx . cli . Arg Type Ċ import Ġkotlinx . cli . default Ċ import Ġkotlinx . cli . delimiter Ċ import Ġkotlinx . cli . multiple Ċ import Ġkotlinx . cli . optional Ċ import Ġkotlinx . cli . var arg Ċ import Ġkotlinx . coroutines . future . await Ċ import Ġorg . slf 4 j . kotlin .* Ċ import Ġkotlin . system . exit Process Ċ Ċ class ĠLaunch er ( ĊĠĠĠĠĠĠĠ Ġargs : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġparser : ĠArg Parser Ġ= ĠArg Parser (" poly bot . bootstrap "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġby Ġget Logger () ĊĠĠĠĠĊĠĠĠ Ġprivate Ġval Ġversion Ġby Ġparser . option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . Boolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort Name Ġ= Ġ" v ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġ" version ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Print s Ġthe Ġcurrent Ġversion Ġof Ġthis Ġapplication ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). default ( false ) ĊĠĠĠ Ġprivate Ġval Ġj vm Args Ġby Ġparser . option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . String , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort Name Ġ= Ġ" j ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġ" jvm - args ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSets Ġthe ĠJVM Ġarguments Ġthat Ġare Ġprovided Ġto Ġthe Ġbot Ġprocess . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUse Ġ; Ġto Ġde limit Ġmultiple ĠJVM Ġargs , Ġor Ġspecify Ġmultiple Ġtimes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). delimiter ("; "). multiple () ĊĠĠĠ Ġprivate Ġval Ġheap Size Ġby Ġparser . option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . String , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort Name Ġ= Ġ" x ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġ" heap ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSets Ġthe ĠJVM Ġmaximum Ġheap Ġsize Ġfor Ġthe Ġbot Ġprocess . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSee Ġthe Ġjava Ġdocumentation Ġfor Ġ- X mx Ġfor Ġmore Ġinfo . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġinitial Heap Size Ġby Ġparser . option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . String , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort Name Ġ= Ġ" s ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġ" initial - heap ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSets Ġthe ĠJVM Ġinitial Ġheap Ġsize Ġfor Ġthe Ġbot Ġprocess . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSee Ġthe Ġjava Ġdocumentation Ġfor Ġ- X ms Ġfor Ġmore Ġinfo . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġjenkins BaseUrl Ġby Ġparser . option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . String , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġ" jenkins - base ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSets Ġthe ĠJenkins Ġbase ĠURL Ġused Ġto Ġresolve Ġthe Ġproject Ġupdater . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx . Ġhttps :// ci . example . com ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). default (" https :// ci . solo - stud ios . ca ") ĊĠĠĠĠĊĠĠĠ Ġprivate Ġval Ġjenkins Relative Project Url Ġby Ġparser . option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . String , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġ" jenkins - project ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSets Ġthe Ġproject Ġurl Ġfor ĠJenkins , Ġrelative Ġto Ġthe Ġbase Ġurl . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx . Ġjob / solo - stud ios / job / Poly Bot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). default (" job / solo - stud ios / job / Poly Bot ") ĊĠĠĠĠĊĠĠĠ Ġprivate Ġval Ġjar Location Ġby Ġparser . option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . String , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshort Name Ġ= Ġ" f ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSets Ġthe Ġlocation Ġat Ġwhich Ġthe Ġjar Ġfile Ġis Ġstored Ġfor Ġthe Ġbot . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġthe Ġjar Ġfile Ġalready Ġexists , Ġit Ġwill Ġload Ġthat Ġjar . ĠIf Ġnot , Ġit Ġwill Ġdownload Ġthe Ġjar Ġfrom Ġthe Ġconfigured ĠCI Ġserver . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). default (" Poly Bot . jar ") ĊĠĠĠĠĊĠĠĠ Ġprivate Ġval Ġarguments Ġby Ġparser . argument ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg Type . String , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfullName Ġ= Ġ" arguments ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġlist Ġof Ġarguments Ġto Ġbe Ġpassed Ġto Ġthe Ġbot . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSee Ġthe Ġdocumentation Ġfor Ġthe Ġbot . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). optional (). var arg () ĊĠĠĠĠĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġparser . parse ( args ) ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġprivate Ġval Ġupdate Task : ĠUpdate Task Ġ= ĠJenkins Update Task ( jenkins BaseUrl , Ġjenkins Relative Project Url ) ĊĠĠĠĠĊĠĠĠ Ġprivate Ġval Ġjar File Ġ= ĠFile ( jar Location ) ĊĠĠĠ Ġprivate Ġvar Ġrecent Boot s Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlast Start Attempt Time Ġ= ĠInstant . MIN ĊĠĠĠ Ġprivate Ġvar Ġhas Old Jar Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġold Jar File Ġ= ĠFile (" old .${ jar File . path }") ĊĠĠĠĠĊĠĠĠ Ġsuspend Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! jar File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Jar Ġfile Ġdoes Ġnot Ġexist . ĠDownloading Ġfrom ĠCI ..." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Task . update ( jar File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġif Ġ( old Jar File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Jar File . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Starting Ġbot Ġprocess ..." Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= ĠDuration . between ( last Start Attempt Time , Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duration Ġ> Ġtracked Boot Expiry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent Boot s Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Reset Ġboot s " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recent Boot s Ġ>= Ġmax Boot s Before Shutdown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Old Jar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar File . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Jar File . rename To ( jar File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" Failed Ġto Ġstart Ġ$ max Boot s Before Shutdown Ġtimes Ġwithin Ġ 3 0 Ġseconds Ġof Ġeach Ġboot . ĠThis Ġis Ġprobably Ġdue Ġto Ġan Ġerror ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Re verted Ġjar Ġfile Ġto Ġolder Ġversion , Ġas Ġthe Ġnew Ġversion Ġseems Ġto Ġcause Ġcrashes . Ġ!! ĠWarning Ġ!! ĠThis Ġis Ġonly Ġa Ġtemporary Ġfix ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" Failed Ġto Ġstart Ġ$ max Boot s Before Shutdown Ġtimes Ġwithin Ġ 3 0 Ġseconds Ġof Ġeach Ġboot . ĠThis Ġis Ġprobably Ġdue Ġto Ġan Ġerror . ĠExit ing ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( Exit Codes . EXIT _ CODE _ ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Start Attempt Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġstart Process (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent Boot s ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Exit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= Ġprocess . exit Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Bot Ġprocess Ġexited Ġwith Ġcode Ġ$ exit Code " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( exit Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExit Codes . EXIT _ CODE _ NORMAL ĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Bot Ġexited Ġclean ly ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExit Codes . EXIT _ CODE _ SHUT DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Bot Ġexited Ġsuccessfully , Ġrequesting Ġa Ġshutdown . ĠSh ut ting Ġdown Ġbootstrap Ġprocess ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExit Codes . EXIT _ CODE _ ERROR ĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" Bot Ġexited Ġwith Ġan Ġerror . ĠPlease Ġcheck Ġthe Ġbot Ġlogs Ġfor Ġmore Ġinformation ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExit Codes . EXIT _ CODE _ RE START Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Bot Ġexited Ġsuccessfully , Ġrequesting Ġa Ġrestart ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExit Codes . EXIT _ CODE _ UPDATE ĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Bot Ġexited Ġsuccessfully , Ġrequesting Ġan Ġupdate ." Ġ} ĊĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Updating Ġbot Ġjar ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Jar File . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Jar File . delete () ĊĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar File . rename To ( old Jar File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Old Jar Ġ= Ġtrue ĊĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Task . update ( jar File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) Ġ{ Ġ" Exception Ġwhile Ġupdating Ġjar !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Bot Ġjar Ġupdated Ġsuccessfully ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Bot Ġexited Ġwith Ġunknown Ġerror Ġcode , Ġ$ exit Code ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Re starting Ġbot Ġprocess ..." Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġprivate Ġfun Ġstart Process (): ĠProcess Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocess Builder Ġ= ĠProcess Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inherit IO () ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġprocess Builder . environment () ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġmutable ListOf (" java ") ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġargs Ġ+= Ġ"- D file . encoding = UTF - 8 " ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġif Ġ( heap Size Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs Ġ+= Ġ"- X mx $ heap Size " ĊĠĠĠĠĠĠĠ Ġif Ġ( initial Heap Size Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs Ġ+= Ġ"- X ms $ initial Heap Size " ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġargs Ġ+= Ġj vm Args ĊĠĠĠĠĊĠĠĠĠĠĠĠ Ġargs Ġ+= ĠlistOf ("- jar ", Ġjar Location ) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġargs Ġ+= Ġarguments ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġargs . join ToString ( separator Ġ= Ġ", Ġ", Ġprefix Ġ= Ġ" Launch ing Ġprocess Ġ[ ", Ġpostfix Ġ= Ġ"] ") Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Builder . command ( args ). start () ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtracked Boot Expiry Ġ= ĠDuration . of Seconds ( 3 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġmax Boot s Before Shutdown Ġ= Ġ 3 ĊĠĠĠ Ġ} Ċ }