package Ġjav abot . operations Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġjav abot . J av abot Ċ import Ġjav abot . Message Ċ import Ġjav abot . dao . Admin Dao Ċ import Ġjav abot . operations . url content . URL Content Analyzer Ċ import Ġjav abot . operations . url content . URL From Message Parser Ċ import Ġjav abot . service . Http Service Ċ import Ġjav abot . service . Twitter Service Ċ import Ġorg . apache . http . client . utils . URL Encoded Utils Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . nodes . Document Ċ import Ġorg . js oup . nodes . Element Ċ import Ġorg . js oup . nodes . Text Node Ċ import Ġorg . js oup . select . Elements Ċ import Ġjava . io . IOException Ċ import Ġjava . net . URI Ċ import Ġjava . net . URL Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠURL Title Operation Ġ@ Inject Ġconstructor ( bot : ĠJ av abot , Ġadmin Dao : ĠAdmin Dao , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġanalyzer : ĠURL Content Analyzer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġparser : ĠURL From Message Parser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġhttp Service : ĠHttp Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtwitter Service : ĠTwitter Service ) ĊĠĠĠ Ġ: ĠBot Operation ( bot , Ġadmin Dao ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Channel Message ( event : ĠMessage ): ĠList < Message > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponses Ġ= Ġarray ListOf < Message >() ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġevent . value ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle sTo Post Ġ= Ġparser . urls From Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġs Ġ-> Ġfind Title ( s , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġs Ġ-> Ġs . length Ġ>= Ġ 2 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( title sTo Post . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Message To Channel ( responses , Ġtitle sTo Post , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponses ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Message To Channel ( responses : ĠMutable List < Message >, Ġtitle sTo Post : ĠList < String >, Ġevent : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdistinct Titles = title sTo Post . distinct () ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġif Ġ( distinct Titles . size Ġ== Ġ 1 ) Ġ" title " Ġelse Ġ" titles " ĊĠĠĠĠĠĠĠ Ġresponses . add ( Message ( event , Ġ"${ event . user . nick }' s Ġ$ title : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistinct Titles . join ToString (" Ġ| Ġ", Ġtransform Ġ= Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . length Ġ> Ġ 2 4 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" "${ s . substring ( 0 , Ġ 2 3 9 )} ... """" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" "$ s """" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Title ( url : ĠString , Ġloop : ĠBoolean ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( analyzer . pre check ( url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtyped Url Ġ= ĠURL ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġused Ġto Ġbe Ġparsing Ġhere Ġfor Ġyoutube Ġbut Ġthey Ġuse Ġ< title > Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( typed Url . host . contains (" twitter . com ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Twitter Title ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠJ soup . parse ( http Service . get ( url )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtitle Ġ= Ġparse Title ( document ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġclean ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( analyzer . check ( url , Ġtitle )) Ġtitle Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( loop Ġ&& Ġ! url . take ( 1 0 ). contains ("// www .")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Url Ġ= Ġurl . replace ("// ", Ġ"// www .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Title ( t Url , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Twitter Title ( url : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( twitter Service . isEnabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . contains (" status ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex Ġ= ĠRegex (" status / \\ d ++ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġregex . find ( url ) Ġ// Ġif Ġmatch Ġisn 't Ġnull , Ġwe Ġhave Ġa Ġstatus Ġnumber Ġnow , Ġw oo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ( match . value . substring (" status / ". length )). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtwitter Service . getStatus ( id ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhat Ġhappens Ġif Ġit 's Ġactually Ġa Ġtwitter Ġuser ? ĠWho Ġca res , Ġwe Ġhaven 't Ġseen Ġthat Ġyet Ġin Ġuse , Ġright ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Twitter Links ( elt : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelt . children (). forEach Ġ{ Ġfix Twitter Links ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtwitter Links Ġ= Ġelt . getElementsBy AttributeValue (" data - pre - embedded ", Ġ" true ") ĊĠĠĠĠĠĠĠ Ġtwitter Links . forEach Ġ{ Ġlink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlink . insert Children ( 0 , ĠText Node (" Ġ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Title ( doc : ĠDocument ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġdoc . select (" meta [ property =\" og : title \"] ") ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( header . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody : ĠElements Ġ= Ġdoc . select (". permalink - tweet - container Ġ. js - tweet - text - container ") Ġ?: ĠElements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . forEach Ġ{ Ġfix Twitter Links ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ("% s : Ġ\"% s \"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader . first (). attr (" content "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . first (). text ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . title () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . title () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean ( title : ĠString ) Ġ= Ġtitle Ġ// ĠIRC Ġcan Ġhandle Ġreal Ġcharacters Ċ } Ċ