/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠM ic hel ĠK re mer Ġ( k rem i 1 5 1 ) Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġlu . k rem i 1 5 1 . chat ster . plugin . meme Ċ Ċ import Ġlu . k rem i 1 5 1 . chat ster . api . command .* Ċ import Ġlu . k rem i 1 5 1 . chat ster . api . context . Command Context Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . invoke . Method Handles Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ class ĠMe me Command Provider : ĠCommand Provider Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOGGER : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Method Handles . lookup (). lookup Class ()) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠME ME _ PATTERN Ġ= ĠPattern . compile ("< img \\ s + id =[ \" '] im [\" ']. + src =[ \" ']( [^ \" '] + )") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTITLE _ PATTERN Ġ= ĠPattern . compile ("< h 1 Ġid =[ \" '] img - title [\" '] >( [^ < ]+ )") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEXT ENSION _ PATTERN Ġ= ĠPattern . compile ("\\ . ([ a - zA - Z 0 - 9 ]+ )$ ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsanitize Filename ( input Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinput Name . replace ("[ ^ a - zA - Z 0 - 9 - _. ] ". to Regex (), Ġ"_ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdelete Folder ( file : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġfile . list Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult Ġand Ġdelete Folder ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . delete () Ġ&& Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġclient Ġ= ĠOk HttpClient . Builder (). build () ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġhandle Me me ( context : ĠCommand Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . send Writing ( true ) ĊĠĠĠĠĠĠĠ Ġvar Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// img flip . com / i /") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġvar Ġme me Url : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġme me Title : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme me Url Ġ= Ġclient . new Call ( request ). execute (). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhtml Ġ= Ġresponse . body !!. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatcher Ġ= ĠTITLE _ PATTERN . matcher ( html ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġme me Title Ġ= Ġmatcher . group ( 1 ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher Ġ= ĠME ME _ PATTERN . matcher ( html ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ use Ġmatcher . group ( 1 ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ use Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meme Url Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( meme Url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . send Text Message (" Sorry , Ġno Ġme me Ġfor Ġyou Ġtoday Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( meme Title Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme me Title Ġ= Ġ" meme _" Ġ+ ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar ĠfileName Ġ= Ġsanitize Filename ( meme Title !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName . length Ġ> Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ= ĠfileName . substring ( 0 , Ġ 1 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠEXT ENSION _ PATTERN . matcher ( meme Url ) ĊĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ+= Ġ"." Ġ+ Ġmatcher . group ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtemp Dir Ġ= ĠFiles . create Temp Directory (" meme "). to File () ĊĠĠĠĠĠĠĠ Ġif Ġ(! temp Dir . mkdir s () Ġ&& Ġ! temp Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" Could Ġnot Ġcreate Ġtemporary Ġdir ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFile ( temp Dir , ĠfileName ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( meme Url . startsWith ("// ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme me Url Ġ= Ġ" https :$ meme Url " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequest Ġ= ĠRequest . Builder (). url ( meme Url ). build () ĊĠĠĠĠĠĠĠ Ġclient . new Call ( request ). execute (). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( temp File ). use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body Ġ?: Ġthrow ĠIOException (" Could Ġnot Ġread Ġresponse ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . byte Stream (). use Ġ{ Ġbody Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 5 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlength : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlength Ġ= Ġbody Stream . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( buffer , Ġ 0 , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . send Text Message ( temp File ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! delete Folder ( temp Dir )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" Could Ġnot Ġdelete Ġtemporary Ġfolder Ġat Ġ{}", Ġtemp Dir . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister Commands ( builder : ĠRoot Command Builder , Ġregistry : ĠCommand Registry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregistry . register Command ( builder . literal (" meme ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exec utes ( object Ġ: ĠCommand Executor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( command : ĠExec uted Command ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Me me ( command . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. top ()) ĊĠĠĠ Ġ} Ċ Ċ }