package Ġnet . source bot . module . documentation . commands Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . node . Array Node Ċ import Ġnet . dv 8 tion . j da . api . entities . Message Ċ import Ġnet . dv 8 tion . j da . api . utils . Markdown Util Ċ import Ġnet . source bot . api . command . argument . Arguments Ċ import Ġnet . source bot . api . configuration . Json Serial Ċ import Ġnet . source bot . api . response . Response Ċ import Ġnet . source bot . api . response . Standard ErrorResponse Ċ import Ġnet . source bot . api . response . Standard Info Response Ċ import Ġnet . source bot . module . documentation . commands . bootstrap . Documentation Command Ċ import Ġnet . source bot . module . documentation . utility .* Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . nodes . Document Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . net . URL Ċ Ċ class ĠM DN Command Ġ: ĠDocumentation Command ( ĊĠĠĠ Ġ" md n ", Ġ" Allow s Ġthe Ġuser Ġto Ġquery Ġthe ĠM DN ĠDocumentation ." Ċ ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġaliases : ĠArray < String > Ġ= ĠarrayOf (" javascript ", Ġ" js ") ĊĠĠĠ Ġprivate Ġval ĠbaseUrl Ġ= Ġ" https :// developer . mozilla . org " ĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠM DN Doc Cache () ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( message : ĠMessage , Ġargs : ĠArguments ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġmessage . author ĊĠĠĠĠĠĠĠ Ġval Ġicon Url Ġ= Ġ" https :// developer . mozilla . org / static / img / open graph - logo . 7 2 3 8 2 e 6 0 5 ce 3 . png " ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! args . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġcan Ġfind Ġthe ĠM DN ĠDocumentation Ġat Ġ[ developer . mozilla . org ]( https :// developer . mozilla . org / en - US / docs /) " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStandard Info Response ( user . name , Ġdescription ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġargs . next (" Unable Ġto Ġfind Ġquery ! "). replace ("# ", Ġ". "). remove Suffix (" () ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cache . has Response ( query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache . getResponse ( query ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconnection Str Ġ= Ġ" https :// developer . mozilla . org / api / v 1 / search / en - US ? q =$ query " ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Found Response Ġ= ĠStandard ErrorResponse ( user . name , Ġ" Unable Ġto Ġfind Ġ`$ query ` Ġin Ġthe ĠM DN ĠDocumentation !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠURL ( connection Str ). open Stream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠInputStreamReader ( it , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Serial . mapper . read Tree ( reader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Array Ġ= ĠjsonObject [" documents "] Ġas ĠArray Node ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document Array . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnot Found Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult List : ĠMutable List < JsonNode > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Array . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġit [" title "]. as Text ()?. remove Suffix (" () ") Ġ?: Ġreturn @ filter Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwithout Prototype Ġ= Ġtitle . replace (". prototype ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ filter Ġquery . equals ( title , Ġtrue ) Ġ|| Ġquery . equals ( without Prototype , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Collection ( result List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Desc SB Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Array . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle : ĠString Ġ= Ġit [" title "]. as Text () Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"$ baseUrl / en - US / docs /${ it [" slug "]. as Text () Ġ?: Ġreturn @ forEach }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title . isEmpty ()) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Hyper link Ġ= Ġ" [$ title ]( $ url )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Desc SB . append (" ** $ item Hyper link ** \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Desc SB . isEmpty ()) Ġreturn Ġnot Found Response ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Result Response Ġ= ĠDoc Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Response . set Author (" MD N ĠDocumentation ", Ġnull , Ġicon Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Search ĠResults :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setDescription ( response Desc SB . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put Response ( query , Ġsearch Result Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsearch Result Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Object Result Ġ= Ġresult List [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Url Ġ= Ġ"$ baseUrl / en - US / docs /${ doc Object Result [" slug "]. as Text () }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Document Ġ= ĠURL ( result Url ). open Stream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ soup . parse ( it , Ġ" UTF - 8 ", Ġresult Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Response Ġ= ĠDoc Response () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Response . set Author (" MD N ĠDocumentation ", Ġnull , Ġicon Url ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwiki Element Ġ= Ġresult Document . select First (" article . main - page - content ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwiki Element . html ( wiki Element . html (). replace ("< p ></ p >", Ġ"")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Element Ġ= Ġwiki Element . select First (" div Ġ> Ġp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠStandard ErrorResponse ( user . name , Ġ" Unable Ġto Ġfind Ġarticle Ġdescription !") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= Ġdescription Element . anchors To Hyper links ( baseUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Markdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. truncate ( 6 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanchor Text Ġ= Ġdoc Object Result [" title "]. as Text () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Hyper link Ġ= ĠMarkdown Util . masked Link ( anchor Text , Ġresult Url ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Response . setDescription (" ** __ ${ item Hyper link } __ ** \ n $ description ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! anchor Text . contains (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty String Ġ= Ġretrieve Formatted Sidebar List ( result Document , Ġ" Properties ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Response . attempt Add Embed Field (" Properties :", Ġproperty String ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod String Ġ= Ġretrieve Formatted Sidebar List ( result Document , Ġ" Methods ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Response . attempt Add Embed Field (" Methods :", Ġmethod String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Names Ġ= ĠarrayOf (" parameters ", Ġ" return _ value ", Ġ" returns ", Ġ" exceptions ", Ġ" value ", Ġ" throws ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Names . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġif Ġ( it . equals (" return _ value ", Ġtrue )) Ġ" Returns :" Ġelse Ġ"${ it . capitalize ()} :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Description Ġ= Ġretrieve Formatted Element ( result Document , Ġit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Response . attempt Add Embed Field ( fieldName , Ġfield Description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put Response ( query , Ġdoc Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdoc Response ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStandard ErrorResponse ( user . name , Ġ" Something Ġwent Ġwrong , Ġplease Ġtry Ġagain !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Formatted Sidebar List ( document : ĠDocument , Ġheader Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsidebar Ġ= Ġdocument . select First (" nav # sidebar - quick links Ġ> Ġdiv Ġ> Ġol ") Ġ?: Ġreturn Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Header Ġ= Ġsidebar . select (" li "). first Ġ{ Ġit . select First (" a ") ?. text (). equals ( header Name , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlist Children Ġ= Ġlist Header . select First (" ol ") ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġlist Children . select (" li "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanchor Ġ= Ġit . select First (" a ") Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġanchor . text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . contains (" Ġ") Ġ|| Ġtext . contains (" [" )) Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" `${ text . substring After Last (". "). remove Suffix (" () ") }` Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString (). truncate ( 5 1 2 ). replace (" ` [^ ` ]* [ . ]{ 3 }\ $ ". to Regex (), Ġ"... ") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Formatted Element ( document : ĠDocument , Ġheader Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġdocument . select First (" h 3 #$ header Name ") Ġ?: Ġreturn Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġreturn Element Ġ= Ġheader . nextElement Sibling () ĊĠĠĠĠĠĠĠ Ġval Ġdesc Tag List Ġ= Ġreturn Element . select (" dt ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( desc Tag List . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesc Ġ= Ġreturn Element . select First (" p ") Ġ?: Ġreturn Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdesc . anchors To Hyper links ( baseUrl ). to Markdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreturn SB Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġdesc Tag List . stream (). limit ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPre vents Ġnested Ġdl Ġelements Ġfrom Ġshowing Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Of Parent Ġ= Ġit . parent ()?. parent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Of Parent Ġ!= Ġnull Ġ&& Ġparent Of Parent . tagName (). equals (" dd ", Ġtrue )) Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Name Ġ= Ġit . html (). to Markdown (). replace (" Optional ", Ġ"* ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPre vents Ġtext Ġfrom Ġa Ġnested Ġdl Ġfrom Ġbeing Ġput Ġinto Ġthe Ġitem Ġdescription ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdesc Element Ġ= Ġit . nextElement Sibling () Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc Element Ġ= Ġdesc Element . select First (" p ") Ġ?: Ġdesc Element ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemoves ĠHTML Ġlist Ġelements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc Element . select (" ul "). remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc Element . select (" ol "). remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc Element . select (" dl "). remove () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemoves Ġrem n ants Ġof Ġlist Ġelements Ġ( i . e . Ġ" This Ġcan Ġeither Ġbe :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc Element Ġ= Ġdesc Element . html ( desc Element . html (). replace ("( \\. )( .* ) [:] ". to Regex (), Ġ"$ 1 ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Desc Ġ= Ġdesc Element . anchors To Hyper links ( baseUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Markdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. truncate ( 1 2 8 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġappend Format Ġ= Ġ"$ itemName Ġ- Ġ$ item Desc \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn SB . append ("$ append Format \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn SB . trim To Size () ĊĠĠĠĠĠĠĠ Ġ// ĠMax Ġfield Ġlength Ġis Ġ 1 0 2 4 , Ġmax Ġitem Desc Ġis Ġ 1 2 8 , Ġ 1 0 2 4 - 1 2 8 - 3 ( for Ġtrunc ation )= 8 9 3 ĊĠĠĠĠĠĠĠ Ġreturn Ġreturn SB . toString (). truncate ( 8 9 3 ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠM DN Doc Cache Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm dn Cache : ĠMutable Map < String , ĠResponse > Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġfun Ġhas Response ( query : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm dn Cache . containsKey ( query . toLowerCase ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġput Response ( query : ĠString , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm dn Cache [ query . toLowerCase ()] Ġ= Ġresponse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Response ( query : ĠString ): ĠResponse ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm dn Cache [ query . toLowerCase ()] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }