/* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof Ġbackup - secret ary , Ġlicensed Ġunder Ġthe ĠMIT ĠLicense Ġ( MIT ). Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) ĠOct av ia ĠT og ami Ġ< https :// oct yl . net > Ċ Ġ* ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE Ġ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 Ġnet . oct yl . backup . core . main Ċ Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġnet . oct yl . backup . config . open Config Ċ import Ġnet . oct yl . backup . util . flow . Flow Files Ċ import Ġnet . oct yl . backup . util . flow . ticker Flow Ċ import Ġnet . oct yl . backup . core . setup . Backup Setup Ċ import Ġnet . oct yl . backup . core . setup . Backup Setup Storage Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Z onedDateTime Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġdata Directory Ġ= ĠPath . of ("./ data ") ĊĠĠĠ Ġval Ġsetup s Ġ= Ġdata Directory . resolve (" setup s ") ĊĠĠĠ ĠFiles . create Directories ( setup s ) ĊĠĠĠ Ġval Ġcomponent Ġ= ĠD agger Main Component . create () ĊĊĠĠĠ Ġrun Blocking ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsetup Storage Ġ= Ġcomponent . setup Storage ĊĠĠĠĠĠĠĠ Ġload Setup s ( setup s , Ġsetup Storage ) ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġticker Flow ( Duration . of Seconds ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġrun Ready Backups ( setup Storage , Ġcomponent ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġload Setup s ( setup s : ĠPath , Ġsetup Storage : ĠBackup Setup Storage ) Ġ{ ĊĠĠĠ ĠFlow Files . list ( setup s ). collect Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġopen Config ( it ) ĊĠĠĠĠĠĠĠ Ġval Ġsetup Ġ= ĠBackup Setup ( config ) ĊĠĠĠĠĠĠĠ Ġsetup Storage . store ( it . fileName . toString (). substring Before Last ('. '), Ġsetup ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun Ġrun Ready Backups ( setup Storage : ĠBackup Setup Storage , Ġcomponent : ĠMain Component ) Ġ{ ĊĠĠĠ Ġsetup Storage . list Ready Setup s () ĊĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġ( key , Ġsetup ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackup Component Ġ= Ġcomponent . backup Component Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind Backup Setup ( setup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Component . backup Task . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup . scheduled Time ?. let Ġ{ Ġtime Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= ĠZ onedDateTime . now (). plus Days ( 1 ). with ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Storage . store ( key , Ġsetup . copy ( next Backup Time Ġ= Ġnext . to Instant ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ