package Ġnet . source bot . api . module Ċ Ċ import Ġme . hw ig gy . ext ensible . binding . jvm . class loader . Jar Parent ClassLoader Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ Ċ @ Suppress (" DE PREC ATION ", Ġ" UN CHECK ED _ CAST ", Ġ" UNUSED ") Ċ class ĠModule Parent ClassLoader ( ĊĠĠĠ Ġparent : ĠClassLoader Ċ ) Ġ: ĠJar Parent ClassLoader < Module Descriptor , ĠSource Module >( parent ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Module Parent ClassLoader :: class . java ) ĊĠĠĠ Ġoverride Ġval Ġloader Ġ= ĠModule Loader ( this ) ĊĊĠĠĠ Ġfun Ġmodule Exists ( name : ĠString ) Ġ= Ġloader . find Extension ( name ) Ġ!= Ġnull ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠSource Module > Ġget Extension () Ġ= Ġloader . getExtension ( T :: class . java ) ĊĊĠĠĠ Ġfun Ġload And Enable ( folder : ĠFile ) Ġ= Ġload Modules ( folder ). also Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" En abling Ġmodules Ġfrom Ġ'${ folder . path }' ...") ĊĠĠĠĠĠĠĠ Ġit . forEach ( this :: enable Module ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload And Enable ( module : ĠSource Module ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Module ( module ) ĊĠĠĠĠĠĠĠ Ġenable Module ( module ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Modules ( folder : ĠFile ) Ġ= Ġloader . load Extensions ( folder ) Ġ{ Ġit . extension . equals (" jar ", Ġtrue ) Ġ} ĊĠĠĠ Ġfun Ġload Module ( file : ĠFile ) Ġ= Ġloader . load Extension ( file ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMan ually Ġindexes Ġa Ġmodule . ĊĠĠĠĠ Ġ* ĠShould Ġonly Ġbe Ġused Ġby Ġthe Ġbase Ġmodule . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġindex ( module : ĠSource Module ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloader . index Extension ( module . name , Ġmodule ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Module Throw ing ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠSource Module ĊĠĠĠ Ġ) Ġ= Ġmodule . load () ĊĊĠĠĠ Ġprivate Ġfun Ġload Module ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠSource Module ĊĠĠĠ Ġ) Ġ= Ġperform Lifecycle ( module , Ġ:: load Module Throw ing ) ĊĊĠĠĠ Ġprivate Ġfun Ġenable Module Throw ing ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠSource Module ĊĠĠĠ Ġ) Ġ= Ġmodule . enable Ġ{ Ġmodule . enabled Ġ= Ġtrue Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Module ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠSource Module ĊĠĠĠ Ġ) Ġ= Ġperform Lifecycle ( module , Ġ:: enable Module Throw ing ) ĊĊĠĠĠ Ġprivate Ġfun Ġdisable Module Throw ing ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠSource Module ĊĠĠĠ Ġ) Ġ= Ġmodule . disable Ġ{ Ġmodule . enabled Ġ= Ġfalse Ġ} ĊĊĠĠĠ Ġfun Ġdisable Module ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠSource Module ĊĠĠĠ Ġ) Ġ= Ġperform Lifecycle ( module , Ġ:: disable Module Throw ing ) ĊĊĠĠĠ Ġprivate Ġfun Ġperform Lifecycle ( ĊĠĠĠĠĠĠĠ Ġmodule : ĠSource Module , ĊĠĠĠĠĠĠĠ Ġlifecycle Task : Ġ( Source Module ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Task ( module ) ĊĠĠĠ Ġ} Ġcatch Ġ( err : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerr . printStackTrace () ĊĠĠĠ Ġ} Ċ }