package Ġnet . source bot . api . module Ċ Ċ import Ġnet . source bot . Source Ċ import Ġnet . source bot . api . configuration . Json Serial Ċ import Ġnet . source bot . api . configuration . Properties Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ Ċ abstract Ġclass ĠSource Module Ġ{ ĊĠĠĠ Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĊĠĠĠ Ġlateinit Ġvar Ġclass Loader : ĠModule ClassLoader ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠ Ġlateinit Ġvar Ġdescriptor : ĠModule Descriptor ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠ Ġval Ġname Ġby Ġlazy Ġ{ Ġdescriptor . name Ġ} ĊĠĠĠ Ġval Ġversion Ġby Ġlazy Ġ{ Ġdescriptor . version Ġ} ĊĠĠĠ Ġval Ġdescription Ġby Ġlazy Ġ{ Ġdescriptor . description Ġ} ĊĠĠĠ Ġval Ġauthor Ġby Ġlazy Ġ{ Ġdescriptor . author Ġ} ĊĊĠĠĠ Ġvar Ġenabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠ Ġval Ġdata Folder : ĠFile Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠFile (" modules ", Ġdescriptor . name ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! exists ()) Ġmkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġconfig : ĠProperties Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( data Folder , Ġ" config . json ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġsave Resource ("/ config . json ") ĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġfile . let Ġ{ ĠJson Serial . mapper . readValue ( it , ĠProperties :: class . java ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Resource ( abs Path : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! abs Path . startsWith ("/ ")) Ġthrow ĠIllegalArgumentException (" Resource Ġpath Ġmust Ġbe Ġabsolute !") ĊĠĠĠĠĠĠĠ Ġval Ġrel Path Ġ= Ġabs Path . substring ( 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis :: class . java . getResource AsStream ( abs Path ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġthrow ĠIllegalStateException (" Could Ġnot Ġlocate Ġ'$ rel Path ' Ġin Ġmodule ĠJ AR !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġas Path Ġ= Ġdata Folder . to Path (). resolve ( rel Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Folder . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( it , Ġas Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas Path . to File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload ( source : ĠSource , Ġpost Load : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠonLoad ( source ) ĊĠĠĠĠĠĠĠ Ġpost Load () ĊĠĠĠĠĠĠĠ Ġlogger . info (" Loaded Ġ$ name Ġv $ version Ġby Ġ$ author .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF ired Ġwhen Ġthis ĠModule Ġis Ġbeing Ġloaded ; Ġbefore Ġit Ġis Ġenabled . ĊĠĠĠĠ Ġ* ĠMethods Ġin Ġthis Ġscope Ġshould Ġnot Ġutilize ĠAPI Ġfrom Ġother ĠModules . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun ĠonLoad ( source : ĠSource ) Ġ= ĠUnit ĊĊĠĠĠ Ġfun Ġenable ( source : ĠSource , Ġpost Enable : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Enable ( source ) ĊĠĠĠĠĠĠĠ Ġpost Enable () ĊĠĠĠĠĠĠĠ Ġlogger . info (" Enabled Ġ$ name Ġv ${ version }. ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF ired Ġwhen Ġthis ĠModule Ġis Ġbeing Ġenabled , Ġafter Ġit Ġis Ġloaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Enable ( source : ĠSource ) Ġ= ĠUnit ĊĊĠĠĠ Ġfun Ġdisable ( source : ĠSource , Ġpost Disable : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Disable ( source ) ĊĠĠĠĠĠĠĠ Ġpost Disable () ĊĠĠĠĠĠĠĠ Ġlogger . info (" Disabled Ġ$ name Ġv ${ version }. ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF ired Ġwhen Ġthis ĠModule Ġis Ġbeing Ġdisabled , Ġbefore Ġit Ġis Ġun loaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Disable ( source : ĠSource ) Ġ= ĠUnit Ċ }