package Ġcom . nis ht ah ir . link b ait . plugin Ċ Ċ import Ġcom . nis ht ah ir . link b ait . commons . Browser Action Ċ import Ġcom . nis ht ah ir . link b ait . commons . Browser Pool Executor Ċ import Ġorg . js oup . J soup Ċ import Ġorg . openqa . selenium . WebDriver Ċ Ċ class ĠJob Search Handler ( val Ġcontext : ĠPlugin Context ) Ġ: ĠMessage EventListener Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message Event ( event : ĠMessage Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . is Direct ed At Bot Ġ== Ġfalse Ġ|| Ġevent . message . startsWith ("$ TRIGGER ") Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= Ġparse JobRequest ( event . message ) ĊĠĠĠĠĠĠĠ Ġif Ġ( req . has Missing Property ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get Messenger (). sendMessage ( event . channel , ĠHEL P _ MESSAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġquery Linked In For Jobs ( req , Ġevent ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġquery Linked In For Jobs ( request : ĠJob Request , Ġevent : ĠMessage Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlinked In Query Ġ= Ġbuild Linked In Url ( request ) ĊĠĠĠĠĠĠĠ ĠBrowser Pool Executor . execute ( object Ġ: ĠBrowser Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo On Executor Pool ( driver : ĠWebDriver ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get Messenger (). set Typing ( event . channel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdriver . get ( linked In Query ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Source Ġ= Ġdriver . page Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠJ soup . parse ( page Source ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob List ings Ġ= Ġmutable ListOf < Job >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . select (". job - listing "). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . select (". date - posted - or - new "). text (). toLowerCase () Ġ== Ġ" new " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJob ( title Ġ= Ġit . select (". job - title - text "). join ToString (" Ġ") Ġ{ Ġelem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelem . text (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Url Ġ= Ġit . select (". job - title - link "). attr (" abs : href "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompany Ġ= Ġit . select (". company - name - text "). text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġit . select (". job - location "). text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Posted Ġ= Ġit . select (". date - posted - or - new "). text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġit . select (". job - description "). text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" Linked In ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Collection ( job List ings ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( job List ings . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get Messenger (). sendMessage ( event . channel , Ġ" No Ġnew Ġjobs Ġin Ġthe Ġarea .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġjob List ings . join ToString ("\ n ") Ġ{ Ġlisting : ĠJob Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"* < ${ listing . title Url }| ${ listing . title }> *, Ġ${ listing . company }, Ġ${ listing . location }. Ġ\ n ${ listing . description }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get Messenger (). sendMessage ( event . channel , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse JobRequest ( str : ĠString ): ĠJob Request Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠJob Request () ĊĠĠĠĠĠĠĠ ĠP ATTERN . match Ent ire ( str )?. let Ġ{ Ġmatch Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq . tags Ġ= Ġmatch Result . groups [ 1 ]?. value ?. trim ()?. split (" Ġ"). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq . location Ġ= Ġmatch Result . groups [ 4 ]?. value . or Empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġreq ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Linked In Url ( request : ĠJob Request ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkeywords Ġ= Ġrequest . tags . join ToString ("% 2 0 ") ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġrequest . location . replace (" Ġ", Ġ"% 2 0 ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ LINK ED IN _ SEARCH _ ROUTE ? keywords =$ keywords & location =$ location " ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠJob Request Ġ{ ĊĠĠĠ Ġvar Ġtags Ġ= Ġempty List < String >() ĊĊĠĠĠ Ġvar Ġlocation : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġfun Ġhas Missing Property (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtags . isEmpty () Ġ|| Ġlocation . isNull Or Blank () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠJob ( val Ġtitle : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Url : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompany : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Posted : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource : ĠString ) Ċ