package Ġme . me li jn . me lij nb ot . objects . utils Ċ Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġme . me li jn . me lij nb ot . Container Ċ import Ġme . me li jn . me lij nb ot . Mel ijn Bot Ċ import Ġme . me li jn . me lij nb ot . Settings Ċ import Ġme . me li jn . me lij nb ot . database . embed . Embed Disabled Wrapper Ċ import Ġme . me li jn . me lij nb ot . database . message . Mod ular Message Ċ import Ġme . me li jn . me lij nb ot . objects . command . Command Context Ċ import Ġme . me li jn . me lij nb ot . objects . command . PLACE HOLDER _ PREFIX Ċ import Ġme . me li jn . me lij nb ot . objects . translation . get Language Ċ import Ġme . me li jn . me lij nb ot . objects . translation . i 1 8 n Ċ import Ġme . me li jn . me lij nb ot . objects . utils . StringUtils . human Readable Byte Count Bin Ċ import Ġme . me li jn . me lij nb ot . objects . utils . StringUtils . to Base 6 4 Ċ import Ġnet . dv 8 tion . j da . api . Permission Ċ import Ġnet . dv 8 tion . j da . api . entities .* Ċ import Ġnet . dv 8 tion . j da . api . requests . rest action . Message Action Ċ import Ġnet . dv 8 tion . j da . api . utils . Markdown Sanit izer Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . net . URL Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjavax . image io . Image IO Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ val Ġlogger Ġ= ĠLoggerFactory . getLogger (" message utils ") Ċ Ċ fun ĠThrowable . send In Guild ( context : ĠCommand Context , Ġthread : ĠThread Ġ= ĠThread . currentThread (), Ġextra : ĠString ? Ġ= Ġnull ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġsend In Guild Suspend ( context . guild N , Ġcontext . message Channel , Ġcontext . author , Ġthread , Ġ" Message : Ġ${ Markdown Sanit izer . escape ( context . message . content Raw )}\ n " Ġ+ Ġ( extra ĊĠĠĠĠĠĠĠ Ġ?: Ġ"") ĊĠĠĠ Ġ) Ċ } ĊĊ Ċ fun ĠThrowable . send In Guild ( guild : ĠGuild ? Ġ= Ġnull , Ġchannel : ĠMessage Channel ? Ġ= Ġnull , Ġauthor : ĠUser ? Ġ= Ġnull , Ġthread : ĠThread Ġ= ĠThread . currentThread (), Ġextra : ĠString ? Ġ= Ġnull ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġsend In Guild Suspend ( guild , Ġchannel , Ġauthor , Ġthread , Ġextra ) Ċ } Ċ Ċ suspend Ġfun ĠThrowable . send In Guild Suspend ( guild : ĠGuild ? Ġ= Ġnull , Ġchannel : ĠMessage Channel ? Ġ= Ġnull , Ġauthor : ĠUser ? Ġ= Ġnull , Ġthread : ĠThread Ġ= ĠThread . currentThread (), Ġextra : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġif Ġ( Container . instance . settings . un Logged Threads . contains ( thread . name )) Ġreturn ĊĊĠĠĠ Ġval Ġchannel Id Ġ= ĠContainer . instance . settings . exception Channel ĊĠĠĠ Ġval Ġtext Channel Ġ= ĠMel ijn Bot . shard Manager . getText Channel ById ( channelId ) Ġ?: Ġreturn ĊĊĠĠĠ Ġval Ġcase Id Ġ= ĠSystem . currentTimeMillis (). to Base 6 4 () ĊĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĊĠĠĠ Ġsb . append ln (" ** Case ID **: Ġ$ case Id ") ĊĠĠĠ Ġif Ġ( guild Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ln (" ** Guild **: Ġ" Ġ+ Ġguild . name Ġ+ Ġ" Ġ| Ġ" Ġ+ Ġguild . id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( channel Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ln (" ** " Ġ+ Ġchannel . type . name . to Upper Word Case () Ġ+ Ġ" Channel **: Ġ# " Ġ+ Ġchannel . name Ġ+ Ġ" Ġ| Ġ" Ġ+ Ġchannel . id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( author Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ln (" ** User **: Ġ" Ġ+ Ġauthor . as Tag Ġ+ Ġ" Ġ| Ġ" Ġ+ Ġauthor . id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġsb . append ln (" ** Thread **: Ġ" Ġ+ Ġthread . name ) ĊĊĠĠĠ Ġval Ġwriter Ġ= ĠString Writer () ĊĠĠĠ Ġval Ġprint Writer Ġ= ĠPrintWriter ( writer ) ĊĠĠĠ Ġthis . printStackTrace ( print Writer ) ĊĠĠĠ Ġval Ġstack trace Ġ= ĠMarkdown Sanit izer . escape ( writer . toString ()) ĊĠĠĠĠĠĠĠ Ġ. replace (" at Ġme . me li jn . me lij nb ot ", Ġ"** at Ġme . me li jn . me lij nb ot ** ") ĊĠĠĠ Ġsb . append ( stack trace ) ĊĠĠĠ Ġextra ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ln (" ** Extra ** ") ĊĠĠĠĠĠĠĠ Ġsb . append ln ( it ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( Container . instance . log To Discord ) ĊĠĠĠĠĠĠĠ Ġsend Msg ( text Channel , Ġsb . toString ()) ĊĊĠĠĠ Ġif Ġ( channel Ġ!= Ġnull Ġ&& Ġ( channel Ġ! is ĠText Channel Ġ|| Ġchannel . can Talk ()) Ġ&& Ġ( channel Ġis ĠText Channel Ġ|| Ġchannel Ġis ĠPrivate Channel )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlang Ġ= Ġget Language ( Container . instance . dao Manager , Ġauthor ?. id Long Ġ?: Ġ- 1 , Ġguild ?. id Long Ġ?: Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġi 1 8 n . get Translation ( lang , Ġ" message . exception ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% case Id %", Ġcase Id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( channel Ġis ĠText Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( channel , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( channel Ġis ĠPrivate Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( channel , Ġmsg ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Syntax ( context : ĠCommand Context , Ġtranslation Path : ĠString Ġ= Ġcontext . command Order . last (). syntax ) Ġ{ ĊĠĠĠ Ġval Ġsyntax Ġ= Ġcontext . get Translation (" message . command . usage ") ĊĠĠĠĠĠĠĠ Ġ. replace ("% syntax %", Ġcontext . get Translation ( translation Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( PLACE HOLDER _ PREFIX , Ġcontext . used Prefix ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġsend Msg ( context , Ġsyntax ) Ċ } Ċ Ċ suspend Ġfun Ġsend Msg Code Block ( context : ĠCommand Context , Ġmsg : ĠString , Ġlang : ĠString , Ġshould Pag inate : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġcontext . text Channel ĊĠĠĠĠĠĠĠ Ġif Ġ(! channel . can Talk ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . length Ġ<= Ġ 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . sendMessage ( msg ). queue () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= ĠStringUtils . split Message ( msg , ĠmaxLength Ġ= Ġ 2 0 0 0 Ġ- Ġ( 8 Ġ+ Ġlang . length ) Ġ- Ġif Ġ( should Pag inate ) Ġ 1 0 0 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Pag inate Ġ&& Ġparts . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpag inated Parts Ġ= Ġparts . map Indexed Ġ{ Ġindex , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ== Ġ 0 Ġ-> Ġ"$ s ``` \ n Page Ġ${ index Ġ+ Ġ 1 }/${ parts . size }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+ Ġ 1 Ġ== Ġparts . size Ġ-> Ġ" ``` $ lang \ n $ s \ n Page Ġ${ index Ġ+ Ġ 1 }/${ parts . size }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" ``` $ lang \ n $ s ``` \ n Page Ġ${ index Ġ+ Ġ 1 }/${ parts . size }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġchannel . sendMessage ( pag inated Parts [ 0 ]). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Pagination Message ( channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġmessage , Ġpag inated Parts , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . forEach Indexed Ġ{ Ġindex , Ġmsg Part Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . sendMessage ( when Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ== Ġ 0 Ġ-> Ġ"$ msg Part ``` " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+ Ġ 1 Ġ== Ġparts . size Ġ-> Ġ" ``` $ lang \ n $ msg Part " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" ``` $ lang \ n $ msg Part ``` " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). queue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprivate Channel Ġ= Ġcontext . private Channel ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . length Ġ<= Ġ 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Channel . sendMessage ( msg ). queue () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= ĠStringUtils . split Message ( msg , ĠmaxLength Ġ= Ġ 2 0 0 0 Ġ- Ġ( 8 Ġ+ Ġlang . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Pag inate Ġ&& Ġparts . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpag inated Parts Ġ= Ġparts . map Indexed Ġ{ Ġindex , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ== Ġ 0 Ġ-> Ġ"$ s ``` \ n Page Ġ${ index Ġ+ Ġ 1 }/${ parts . size }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+ Ġ 1 Ġ== Ġparts . size Ġ-> Ġ" ``` $ lang \ n $ s \ n Page Ġ${ index Ġ+ Ġ 1 }/${ parts . size }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" ``` $ lang \ n $ s ``` \ n Page Ġ${ index Ġ+ Ġ 1 }/${ parts . size }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġprivate Channel . sendMessage ( pag inated Parts [ 0 ]). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Pagination Message ( private Channel , Ġmessage , Ġpag inated Parts , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . forEach Indexed Ġ{ Ġindex , Ġmsg Part Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Channel . sendMessage ( when Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ== Ġ 0 Ġ-> Ġ"$ msg Part ``` " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+ Ġ 1 Ġ== Ġparts . size Ġ-> Ġ" ``` $ lang \ n $ msg Part " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" ``` $ lang \ n $ msg Part ``` " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). queue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg Code Blocks ( ĊĠĠĠ Ġcontext : ĠCommand Context , ĊĠĠĠ Ġmsg : ĠString , ĊĠĠĠ Ġlang : ĠString , ĊĠĠĠ Ġsuccess : Ġ(( message : ĠMessage ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( context . is From Guild ) Ġsend Msg Code Blocks ( context . text Channel , Ġmsg , Ġlang , Ġsuccess , Ġfailed ) ĊĠĠĠ Ġelse Ġsend Msg Code Blocks ( context . private Channel , Ġmsg , Ġlang , Ġsuccess , Ġfailed ) Ċ } Ċ Ċ suspend Ġfun Ġsend Msg Code Blocks ( ĊĠĠĠ Ġchannel : ĠPrivate Channel , ĊĠĠĠ Ġmsg : ĠString , ĊĠĠĠ Ġlang : ĠString , ĊĠĠĠ Ġsuccess : Ġ(( message : ĠMessage ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( msg . length Ġ<= Ġ 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . sendMessage ( msg ). queue ( success , Ġfailed ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠStringUtils . split Message With Code Blocks ( msg , Ġ 1 6 0 0 , Ġ 2 0 Ġ+ Ġlang . length , Ġlang ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġrsp Ġ= Ġsend Pagination Msg ( channel , Ġlist , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( rsp ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg Code Blocks ( ĊĠĠĠ Ġchannel : ĠText Channel , ĊĠĠĠ Ġmsg : ĠString , ĊĠĠĠ Ġlang : ĠString , ĊĠĠĠ Ġsuccess : Ġ(( message : ĠMessage ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( channel . can Talk ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . length Ġ<= Ġ 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . sendMessage ( msg ). queue ( success , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠStringUtils . split Message With Code Blocks ( msg , Ġ 1 6 0 0 , Ġ 2 0 Ġ+ Ġlang . length , Ġlang ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrsp Ġ= Ġsend Pagination Msg ( channel , Ġlist , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( rsp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġescape For Log ( string : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġstring ĊĠĠĠĠĠĠĠ Ġ. replace (" `", Ġ" Â ´ ") ĊĠĠĠĠĠĠĠ Ġ. replace ("\ n ", Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġ. trim () Ċ } Ċ Ċ suspend Ġfun Ġsend Attachments ( text Channel : ĠMessage Channel , Ġurls : ĠMap < String , ĠString >): ĠMessage Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠMessage Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġfailed : ĠThrowable Ġ-> Ġit . resume With Exception ( failed ) Ġ} ĊĠĠĠ Ġvar Ġmessage Action : ĠMessage Action ? Ġ= Ġnull ĊĠĠĠ Ġfor Ġ(( index , Ġurl ) Ġin Ġurls . iterator (). with Index ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠURL ( url . key ). open Stream () ĊĠĠĠĠĠĠĠ Ġmessage Action Ġ= Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Channel . send File ( stream , Ġurl . value ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Action ?. add File ( stream , Ġurl . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġmessage Action ?. queue ( success , Ġfailed ) Ċ } Ċ Ċ suspend Ġfun Ġsend Msg With Attachments ( channel : ĠMessage Channel , Ġmessage : ĠMessage , Ġattachments : ĠMap < String , ĠString >): ĠMessage Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠMessage Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġfailed : ĠThrowable Ġ-> Ġit . resume With Exception ( failed ) Ġ} ĊĠĠĠ Ġvar Ġmessage Action : ĠMessage Action ? Ġ= Ġnull ĊĠĠĠ Ġfor Ġ(( index , Ġurl ) Ġin Ġattachments . iterator (). with Index ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠURL ( url . key ). open Stream () ĊĠĠĠĠĠĠĠ Ġmessage Action Ġ= Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaction Ġ= Ġif Ġ( message . content Raw . isNotBlank ()) Ġchannel . sendMessage ( message . content Raw ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( embed Ġin Ġmessage . embed s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== Ġnull ) Ġaction Ġ= Ġchannel . sendMessage ( embed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġaction . embed ( embed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Action ĊĠĠĠĠĠĠĠ Ġ} ?. add File ( stream , Ġurl . value ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmessage Action ?. queue ( success , Ġfailed ) Ċ } Ċ Ċ suspend Ġfun Ġsend Embed ( context : ĠCommand Context , Ġembed : ĠMessage Embed , Ġsuccess : Ġ(( messages : ĠList < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Embed ( context . dao Manager . embed Disabled Wrapper , Ġcontext . text Channel , Ġembed , Ġsuccess , Ġfailed ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Embed ( context . private Channel , Ġembed , Ġsuccess , Ġfailed ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Embed ( context : ĠCommand Context , Ġembed : ĠMessage Embed ): ĠList < Message > Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Embed ( context . dao Manager . embed Disabled Wrapper , Ġcontext . text Channel , Ġembed ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Embed ( context . private Channel , Ġembed ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Embed ( private Channel : ĠPrivate Channel , Ġembed : ĠMessage Embed , Ġsuccess : Ġ(( messages : ĠList < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġprivate Channel . sendMessage ( embed ). await () ĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( listOf ( msg )) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Embed ( private Channel : ĠPrivate Channel , Ġembed : ĠMessage Embed ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( private Channel . user . is Bot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġprivate Channel . sendMessage ( embed ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( listOf ( msg )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume With Exception ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġsend Embed ( embed Disabled Wrapper : ĠEmbed Disabled Wrapper , Ġtext Channel : ĠText Channel , Ġembed : ĠMessage Embed ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġtext Channel . guild ĊĠĠĠĠĠĠĠ Ġif Ġ(! text Channel . can Talk ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume With Exception ( IllegalArgumentException (" No Ġpermission Ġto Ġtalk Ġin Ġthis Ġchannel ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( guild . self Member . has Permission ( text Channel , ĠPermission . MESSAGE _ EMB ED _ LIN KS ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! embed Disabled Wrapper . embed Disabled Cache . contains ( guild . id Long )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġtext Channel . sendMessage ( embed ). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( listOf ( msg )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume With Exception ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( send Embed As Message ( text Channel , Ġembed )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Embed ( embed Disabled Wrapper : ĠEmbed Disabled Wrapper , Ġtext Channel : ĠText Channel , Ġembed : ĠMessage Embed , Ġsuccess : Ġ(( messages : ĠList < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġguild Ġ= Ġtext Channel . guild ĊĠĠĠ Ġif Ġ(! text Channel . can Talk ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( IllegalArgumentException (" No Ġpermission Ġto Ġtalk Ġin Ġthis Ġchannel ")) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( guild . self Member . has Permission ( text Channel , ĠPermission . MESSAGE _ EMB ED _ LIN KS ) Ġ&& ĊĠĠĠĠĠĠĠ Ġ! embed Disabled Wrapper . embed Disabled Cache . contains ( guild . id Long )) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġtext Channel . sendMessage ( embed ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( listOf ( msg )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Embed As Message ( text Channel , Ġembed , Ġsuccess , Ġfailed ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠMessage Embed . to Message (): ĠString Ġ{ ĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠ Ġif Ġ( this . author Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append (" *** "). append ( this . author ?. name ). append ln (" *** ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this . title Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ln ("__ ${ this . title } __ \ n ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this . description Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ( this . description ?. replace ( Regex ("\\ [( .+ )] \\ (( . +) \\ )"), Ġ"$ 1 Ġ( Link : Ġ$ 2 ) ")). append ("\ n \ n ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this . image Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ( this . image ?. url ). append ("\ n \ n ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this . fields . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġthis . fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" ** "). append ( field . name ). append (" ** \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( field . value ?. replace ( Regex ("\\ [( .+ )] \\ (( . +) \\ )"), Ġ"$ 1 Ġ( Link : Ġ$ 2 ) ")). append ("\ n \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this . footer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ("* ${ this . footer ?. text }") ĊĠĠĠĠĠĠĠ Ġif Ġ( this . timestamp Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Ġ| Ġ") ĊĠĠĠĠĠĠĠ Ġelse Ġsb . append ("* ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this . timestamp Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append ( this . timestamp ?. format ( DateTime Formatter . ISO _ DATE _ TIME )). append ("* ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsb . toString () Ċ } Ċ Ċ suspend Ġfun Ġsend Embed As Message ( text Channel : ĠText Channel , Ġembed : ĠMessage Embed , Ġsuccess : Ġ(( messages : ĠList < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġsend Msg ( text Channel , Ġembed . to Message (), Ġsuccess , Ġfailed ) Ċ } Ċ Ċ suspend Ġfun Ġsend Embed As Message ( text Channel : ĠText Channel , Ġembed : ĠMessage Embed ): ĠList < Message > Ġ{ ĊĠĠĠ Ġreturn Ġsend Msg ( text Channel , Ġembed . to Message ()) Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( context : ĠCommand Context , Ġmsg : ĠString , Ġsuccess : Ġ(( messages : ĠList < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġif Ġ( context . is From Guild ) Ġsend Msg ( context . text Channel , Ġmsg , Ġsuccess , Ġfailed ) ĊĠĠĠ Ġelse Ġsend Msg ( context . private Channel , Ġmsg , Ġsuccess , Ġfailed ) Ċ } ĊĊ Ċ suspend Ġfun Ġsend Msg ( context : ĠCommand Context , Ġimage : ĠBufferedImage , Ġextension : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠList < Message > Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġfailed : ĠThrowable Ġ-> Ġit . resume With Exception ( failed ) Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . text Channel , Ġimage , Ġextension , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . private Channel , Ġimage , Ġextension , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( private Channel : ĠPrivate Channel , Ġimage : ĠBufferedImage , Ġextension : ĠString , Ġsuccess : Ġ(( List < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĊĠĠĠĠĠĠĠ Ġval ĠbyteArray OutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage IO . write ( image , Ġextension , ĠbyteArray OutputStream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage List . add ( private Channel . send File ( byteArray OutputStream . toByteArray (), Ġ" finished .$ extension "). await ()) ĊĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( text Channel : ĠText Channel , Ġimage : ĠBufferedImage , Ġextension : ĠString , Ġsuccess : Ġ(( List < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġrequire ( text Channel . can Talk ()) Ġ{ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel Ġ" Ġ+ Ġtext Channel . name Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĊĠĠĠĠĠĠĠ Ġval ĠbyteArray OutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage IO . write ( image , Ġextension , ĠbyteArray OutputStream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage List . add ( text Channel . send File ( byteArray OutputStream . toByteArray (), Ġ" finished .$ extension "). await ()) ĊĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend File ( context : ĠCommand Context , Ġbytes : ĠByteArray , Ġextension : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠList < Message > Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġfailed : ĠThrowable Ġ-> Ġit . resume With Exception ( failed ) Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend File ( context . get Language (), Ġcontext . text Channel , Ġbytes , Ġextension , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend File ( context . get Language (), Ġcontext . private Channel , Ġbytes , Ġextension , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġsend File ( language : ĠString , Ġprivate Channel : ĠPrivate Channel , Ġbytes : ĠByteArray , Ġextension : ĠString , Ġsuccess : Ġ(( List < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĠĠĠĠĠĠĠ Ġif Ġ( private Channel . j da . self User . allowed FileSize Ġ< Ġ( bytes . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġhuman Readable Byte Count Bin ( bytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġhuman Readable Byte Count Bin ( private Channel . j da . self User . allowed FileSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġi 1 8 n . get Translation ( language , Ġ" message . file to ob ig ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% size %", Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% max %", Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( private Channel , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage List . add ( private Channel . send File ( bytes , Ġ" finished .$ extension "). await ()) ĊĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend File ( language : ĠString , Ġtext Channel : ĠText Channel , Ġbytes : ĠByteArray , Ġextension : ĠString , Ġsuccess : Ġ(( List < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġrequire ( text Channel . can Talk ()) Ġ{ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel Ġ" Ġ+ Ġtext Channel . name Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĠĠĠĠĠĠĠ Ġif Ġ( text Channel . j da . self User . allowed FileSize Ġ< Ġ( bytes . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġhuman Readable Byte Count Bin ( bytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġhuman Readable Byte Count Bin ( text Channel . j da . self User . allowed FileSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġi 1 8 n . get Translation ( language , Ġ" message . file to ob ig ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% size %", Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("% max %", Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( text Channel , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage List . add ( text Channel . send File ( bytes , Ġ" finished .$ extension "). await ()) ĊĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġsend Msg ( context : ĠCommand Context , Ġlist Images : ĠList < Buffered Image >, Ġextension : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠList < Message > Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġfailed : ĠThrowable Ġ-> Ġit . resume With Exception ( failed ) Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . text Channel , Ġlist Images , Ġextension , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . private Channel , Ġlist Images , Ġextension , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( private Channel : ĠPrivate Channel , Ġlist Images : ĠList < Buffered Image >, Ġextension : ĠString , Ġsuccess : Ġ(( List < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĊĠĠĠĠĠĠĠ Ġval ĠbyteArray OutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( image Ġin Ġlist Images ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage IO . write ( image , Ġextension , ĠbyteArray OutputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage List . add ( private Channel . send File ( byteArray OutputStream . toByteArray (), Ġ" finished .$ extension "). await ()) ĊĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( text Channel : ĠText Channel , Ġlist Images : ĠList < Buffered Image >, Ġextension : ĠString , Ġsuccess : Ġ(( List < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġrequire ( text Channel . can Talk ()) Ġ{ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel Ġ" Ġ+ Ġtext Channel . name Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĊĠĠĠĠĠĠĠ Ġval ĠbyteArray OutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( image Ġin Ġlist Images ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage IO . write ( image , Ġextension , ĠbyteArray OutputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage List . add ( text Channel . send File ( byteArray OutputStream . toByteArray (), Ġ" finished .$ extension "). await ()) ĊĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġsend Msg ( context : ĠCommand Context , Ġmsg : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠList < Message > Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġfailed : ĠThrowable Ġ-> Ġit . resume With Exception ( failed ) Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . text Channel , Ġmsg , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . private Channel , Ġmsg , Ġsuccess , Ġfailed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġsend Msg ( private Channel : ĠPrivate Channel , Ġmsg : ĠMod ular Message ): ĠMessage ? Ġ{ ĊĠĠĠ Ġval Ġmessage : ĠMessage ? Ġ= Ġmsg . to Message () ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Ġ== Ġnull Ġ-> Ġsend Attachments ( private Channel , Ġmsg . attachments ) ĊĠĠĠĠĠĠĠ Ġmsg . attachments . isNotEmpty () Ġ-> Ġsend Msg With Attachments ( private Channel , Ġmessage , Ġmsg . attachments ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsend Msg ( private Channel , Ġmessage ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( text Channel : ĠText Channel , Ġmsg : ĠMod ular Message ): ĠMessage ? Ġ{ ĊĠĠĠ Ġval Ġmessage : ĠMessage ? Ġ= Ġmsg . to Message () ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Ġ== Ġnull Ġ-> Ġsend Attachments ( text Channel , Ġmsg . attachments ) ĊĠĠĠĠĠĠĠ Ġmsg . attachments . isNotEmpty () Ġ-> Ġsend Msg With Attachments ( text Channel , Ġmessage , Ġmsg . attachments ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsend Msg ( text Channel , Ġmessage ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġsend Pagination Msg ( context : ĠCommand Context , Ġmsg List : ĠMutable List < String >, Ġindex : ĠInt ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġmsg Ġ= Ġmsg List [ index ] ĊĠĠĠ Ġif Ġ( msg . length Ġ> Ġ 2 0 0 0 ) Ġthrow ĠIllegalArgumentException (" No Ġsplitting Ġhere Ġ: ang ry :") ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( context . text Channel , Ġmsg ). first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Pagination Message ( context . text Channel , Ġmessage , Ġmsg List , Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( context . private Channel , Ġmsg ). first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Pagination Message ( context . private Channel , Ġmessage , Ġmsg List , Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Pagination Msg ( text Channel : ĠText Channel , Ġmsg List : ĠMutable List < String >, Ġindex : ĠInt ): ĠMessage Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġmsg Ġ= Ġmsg List [ index ] ĊĠĠĠ Ġif Ġ( msg . length Ġ> Ġ 2 0 0 0 ) Ġthrow ĠIllegalArgumentException (" No Ġsplitting Ġhere Ġ: ang ry :") ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( text Channel , Ġmsg ). first () ĊĠĠĠĠĠĠĠ Ġit . resume ( message ) ĊĠĠĠĠĠĠĠ Ġregister Pagination Message ( text Channel , Ġmessage , Ġmsg List , Ġindex ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Pagination Msg ( private Channel : ĠPrivate Channel , Ġmsg List : ĠMutable List < String >, Ġindex : ĠInt ): ĠMessage Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġmsg Ġ= Ġmsg List [ index ] ĊĠĠĠ Ġif Ġ( msg . length Ġ> Ġ 2 0 0 0 ) Ġthrow ĠIllegalArgumentException (" No Ġsplitting Ġhere Ġ: ang ry :") ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( private Channel , Ġmsg ). first () ĊĠĠĠĠĠĠĠ Ġit . resume ( message ) ĊĠĠĠĠĠĠĠ Ġregister Pagination Message ( private Channel , Ġmessage , Ġmsg List , Ġindex ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Pagination Mod ular Msg ( context : ĠCommand Context , Ġmsg List : ĠMutable List < Mod ular Message >, Ġindex : ĠInt ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġmsg Ġ= Ġmsg List [ index ] ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( context . text Channel , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Couldn 't Ġsend Ġthe Ġmessage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Pagination Mod ular Message ( context . text Channel , Ġmessage , Ġmsg List , Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( context . private Channel , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Couldn 't Ġsend Ġthe Ġmessage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Pagination Mod ular Message ( context . private Channel , Ġmessage , Ġmsg List , Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Pagination Mod ular Msg ( text Channel : ĠText Channel , Ġmodular List : ĠMutable List < Mod ular Message >, Ġindex : ĠInt ): ĠMessage Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġmsg Ġ= Ġmodular List [ index ] ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( text Channel , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Couldn 't Ġsend Ġthe Ġmessage ") ĊĠĠĠĠĠĠĠ Ġit . resume ( message ) ĊĠĠĠĠĠĠĠ Ġregister Pagination Mod ular Message ( text Channel , Ġmessage , Ġmodular List , Ġindex ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Pagination Mod ular Msg ( private Channel : ĠPrivate Channel , Ġmsg List : ĠMutable List < Mod ular Message >, Ġindex : ĠInt ): ĠMessage Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġmsg Ġ= Ġmsg List [ index ] ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġsend Msg ( private Channel , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Couldn 't Ġsend Ġthe Ġmessage ") ĊĠĠĠĠĠĠĠ Ġit . resume ( message ) ĊĠĠĠĠĠĠĠ Ġregister Pagination Mod ular Message ( private Channel , Ġmessage , Ġmsg List , Ġindex ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġregister Pagination Mod ular Message ( text Channel : ĠText Channel , Ġmessage : ĠMessage , Ġmsg List : ĠMutable List < Mod ular Message >, Ġindex : ĠInt ) Ġ{ ĊĠĠĠ ĠContainer . instance . mod ular Pagination Map [ System . nano Time ()] Ġ= ĠMod ular Pagination Info ( ĊĠĠĠĠĠĠĠ Ġtext Channel . guild . id Long , ĊĠĠĠĠĠĠĠ Ġtext Channel . id Long , ĊĠĠĠĠĠĠĠ Ġmessage . id Long , ĊĠĠĠĠĠĠĠ Ġmsg List , ĊĠĠĠĠĠĠĠ Ġindex ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġadd Pagination Em otes ( message ) Ċ } Ċ Ċ fun Ġregister Pagination Mod ular Message ( private Channel : ĠPrivate Channel , Ġmessage : ĠMessage , Ġmsg List : ĠMutable List < Mod ular Message >, Ġindex : ĠInt ) Ġ{ ĊĠĠĠ ĠContainer . instance . mod ular Pagination Map [ System . nano Time ()] Ġ= ĠMod ular Pagination Info ( ĊĠĠĠĠĠĠĠ Ġ- 1 , ĊĠĠĠĠĠĠĠ Ġprivate Channel . id Long , ĊĠĠĠĠĠĠĠ Ġmessage . id Long , ĊĠĠĠĠĠĠĠ Ġmsg List , ĊĠĠĠĠĠĠĠ Ġindex ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġadd Pagination Em otes ( message ) Ċ } Ċ Ċ fun Ġregister Pagination Message ( text Channel : ĠText Channel , Ġmessage : ĠMessage , Ġmsg List : ĠMutable List < String >, Ġindex : ĠInt ) Ġ{ ĊĠĠĠ ĠContainer . instance . pagination Map [ System . nano Time ()] Ġ= ĠPagination Info ( ĊĠĠĠĠĠĠĠ Ġtext Channel . guild . id Long , ĊĠĠĠĠĠĠĠ Ġtext Channel . id Long , ĊĠĠĠĠĠĠĠ Ġmessage . id Long , ĊĠĠĠĠĠĠĠ Ġmsg List , ĊĠĠĠĠĠĠĠ Ġindex ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġadd Pagination Em otes ( message ) Ċ } Ċ Ċ fun Ġregister Pagination Message ( private Channel : ĠPrivate Channel , Ġmessage : ĠMessage , Ġmsg List : ĠMutable List < String >, Ġindex : ĠInt ) Ġ{ ĊĠĠĠ ĠContainer . instance . pagination Map [ System . nano Time ()] Ġ= ĠPagination Info ( ĊĠĠĠĠĠĠĠ Ġ- 1 , ĊĠĠĠĠĠĠĠ Ġprivate Channel . id Long , ĊĠĠĠĠĠĠĠ Ġmessage . id Long , ĊĠĠĠĠĠĠĠ Ġmsg List , ĊĠĠĠĠĠĠĠ Ġindex ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġadd Pagination Em otes ( message ) Ċ } Ċ Ċ fun Ġadd Pagination Em otes ( message : ĠMessage ) Ġ{ ĊĠĠĠ Ġmessage . add Reaction (" â ı ª "). queue () ĊĠĠĠ Ġmessage . add Reaction (" âĹ Ģ ï¸ı "). queue () ĊĠĠĠ Ġmessage . add Reaction (" âĸ ¶ ï¸ı "). queue () ĊĠĠĠ Ġmessage . add Reaction (" â ı © "). queue () Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( private Channel : ĠPrivate Channel , Ġmsg : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠList < Message > Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġfailed : ĠThrowable Ġ-> Ġit . resume With Exception ( failed ) Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Msg ( private Channel , Ġmsg , Ġsuccess , Ġfailed ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Returns Ġempty Ġmessage Ġlist Ġon Ġfailures Ċ suspend Ġfun Ġsend Msg EL ( private Channel : ĠPrivate Channel , Ġmsg : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġsuccess : ĠList < Message > Ġ-> Ġit . resume ( success ) Ġ} ĊĠĠĠ Ġval Ġfailed Ġ= Ġ{ Ġ_: ĠThrowable Ġ-> Ġit . resume ( emptyList ()) Ġ} ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Msg ( private Channel , Ġmsg , Ġsuccess , Ġfailed ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġsend Msg ( private Channel : ĠPrivate Channel , Ġmsg : ĠString , Ġsuccess : Ġ(( messages : ĠList < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . length Ġ<= Ġ 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( private Channel . sendMessage ( msg ). await ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Parts Ġ= ĠStringUtils . split Message ( msg ). with Index () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġtext ) Ġin Ġmsg Parts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( index , Ġprivate Channel . sendMessage ( text ). await ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( channel : ĠText Channel , Ġmsg : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( channel . can Talk ()) Ġ{ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel Ġ" Ġ+ Ġchannel . name Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . length Ġ<= Ġ 2 0 0 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . contains ("% ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" raw Ġvariable Ġ?: Ġ$ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( channel . sendMessage ( msg ). await ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Parts Ġ= ĠStringUtils . split Message ( msg ). with Index () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġtext ) Ġin Ġmsg Parts ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . contains ("% ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" raw Ġvariable Ġ?: Ġ$ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( index , Ġchannel . sendMessage ( text ). await ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( message List ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume With Exception ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( channel : ĠText Channel , Ġmsg : ĠString , Ġsuccess : Ġ(( messages : ĠList < Message >) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġrequire ( channel . can Talk ()) Ġ{ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel Ġ" Ġ+ Ġchannel . name Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . length Ġ<= Ġ 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( channel . sendMessage ( msg ). await ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Parts Ġ= ĠStringUtils . split Message ( msg ). with Index () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġtext ) Ġin Ġmsg Parts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( index , Ġchannel . sendMessage ( text ). await ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuccess ?. invoke ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġfailed ?. invoke ( t ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġsend Msg ( channel : ĠText Channel , Ġmsg : ĠMessage , Ġsuccess : Ġ(( messages : ĠMessage ) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġrequire ( channel . can Talk ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel : Ġ# (${ channel . name }, Ġ${ channel . id }) Ġ- Ġ${ channel . guild . id }" ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġaction Ġ= Ġif Ġ( msg . content Raw . isNotBlank ()) Ġchannel . sendMessage ( msg . content Raw ) Ġelse Ġnull ĊĠĠĠ Ġfor Ġ( embed Ġin Ġmsg . embed s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== Ġnull ) Ġaction Ġ= Ġchannel . sendMessage ( embed ) ĊĠĠĠĠĠĠĠ Ġelse Ġaction . embed ( embed ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġaction ?. queue ( success , Ġfailed ) Ċ } Ċ Ċ fun Ġsend Msg ( channel : ĠPrivate Channel , Ġmsg : ĠMessage , Ġsuccess : Ġ(( messages : ĠMessage ) Ġ-> ĠUnit )? Ġ= Ġnull , Ġfailed : Ġ(( ex : ĠThrowable ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġvar Ġaction Ġ= Ġif Ġ( msg . content Raw . isNotBlank ()) Ġchannel . sendMessage ( msg . content Raw ) Ġelse Ġnull ĊĠĠĠ Ġfor Ġ( embed Ġin Ġmsg . embed s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== Ġnull ) Ġaction Ġ= Ġchannel . sendMessage ( embed ) ĊĠĠĠĠĠĠĠ Ġelse Ġaction . embed ( embed ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġaction ?. queue ( success , Ġfailed ) Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( channel : ĠText Channel , Ġmsg : ĠMessage ): ĠMessage ? Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġrequire ( channel . can Talk ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel : Ġ# (${ channel . name }, Ġ${ channel . id }) Ġ- Ġ${ channel . guild . id }" ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġaction Ġ= Ġif Ġ( msg . content Raw . isNotBlank ()) Ġchannel . sendMessage ( msg . content Raw ) Ġelse Ġnull ĊĠĠĠ Ġfor Ġ( embed Ġin Ġmsg . embed s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== Ġnull ) Ġaction Ġ= Ġchannel . sendMessage ( embed ) ĊĠĠĠĠĠĠĠ Ġelse Ġaction . embed ( embed ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( action Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . resume ( null ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġaction ?. queue ({ Ġmsg Ġ-> ĊĠĠĠĠĠĠĠ Ġit . resume ( msg ) ĊĠĠĠ Ġ}, Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġit . resume ( null ) ĊĠĠĠ Ġ}) Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( channel : ĠPrivate Channel , Ġmsg : ĠMessage ): ĠMessage ? Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġvar Ġaction Ġ= Ġif Ġ( msg . content Raw . isNotBlank ()) Ġchannel . sendMessage ( msg . content Raw ) Ġelse Ġnull ĊĠĠĠ Ġfor Ġ( embed Ġin Ġmsg . embed s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== Ġnull ) Ġaction Ġ= Ġchannel . sendMessage ( embed ) ĊĠĠĠĠĠĠĠ Ġelse Ġaction . embed ( embed ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( action Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . resume ( null ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġaction ?. queue ({ Ġmsg Ġ-> ĊĠĠĠĠĠĠĠ Ġit . resume ( msg ) ĊĠĠĠ Ġ}, Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġit . resume ( null ) ĊĠĠĠ Ġ}) Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( context : ĠCommand Context , Ġmsg : ĠString , Ġbuffered Image : ĠBufferedImage ?, Ġextension : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġit . resume ( if Ġ( context . is From Guild ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . text Channel , Ġmsg , Ġbuffered Image , Ġextension ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Msg ( context . private Channel , Ġmsg , Ġbuffered Image , Ġextension ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( text Channel : ĠText Channel , Ġmsg : ĠString , Ġimage : ĠBufferedImage ?, Ġextension : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġrequire ( text Channel . can Talk ()) Ġ{ Ġ" Cannot Ġtalk Ġin Ġthis Ġchannel Ġ" Ġ+ Ġtext Channel . name Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĠĠĠĠĠĠĠ Ġval ĠbyteArray OutputStream Ġ= ĠByteArrayOutputStream () ĊĊĠĠĠĠĠĠĠ ĠImage IO . write ( image , Ġextension , ĠbyteArray OutputStream ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sendMessage ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add File ( byteArray OutputStream . toByteArray (), Ġ" finished .$ extension ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠbyteArray OutputStream . close () ĊĊĠĠĠĠĠĠĠ Ġit . resume ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġit . resume With Exception ( t ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Msg ( private Channel : ĠPrivate Channel , Ġmsg : ĠString , Ġimage : ĠBufferedImage ?, Ġextension : ĠString ): ĠList < Message > Ġ= Ġsuspend Coroutine Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage List Ġ= Ġmutable ListOf < Message >() ĊĠĠĠĠĠĠĠ Ġval ĠbyteArray OutputStream Ġ= ĠByteArrayOutputStream () ĊĊĠĠĠĠĠĠĠ ĠImage IO . write ( image , Ġextension , ĠbyteArray OutputStream ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sendMessage ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add File ( byteArray OutputStream . toByteArray (), Ġ" finished .$ extension ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠbyteArray OutputStream . close () ĊĊĠĠĠĠĠĠĠ Ġit . resume ( message List ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġit . resume With Exception ( t ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsend Feature Requires Prem ium Message ( context : ĠCommand Context , Ġfeature Path : ĠString , Ġfeature Replace Map : ĠMap < String , ĠString > Ġ= Ġempty Map ()) Ġ{ ĊĠĠĠ Ġvar Ġfeature Ġ= Ġcontext . get Translation ( feature Path ) ĊĠĠĠ Ġfor Ġ(( key , Ġreplacement ) Ġin Ġfeature Replace Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfeature Ġ= Ġfeature . replace ("% $ key %", Ġreplacement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbase Msg Ġ= Ġcontext . get Translation (" message . feature . requires . premium ") ĊĠĠĠĠĠĠĠ Ġ. replace ("% feature %", Ġfeature ) ĊĠĠĠ Ġsend Msg ( context , Ġbase Msg ) Ċ } Ċ Ċ suspend Ġfun Ġsend Feature Requires Guild Prem ium Message ( context : ĠCommand Context , Ġfeature Path : ĠString , Ġfeature Replace Map : ĠMap < String , ĠString > Ġ= Ġempty Map ()) Ġ{ ĊĠĠĠ Ġvar Ġfeature Ġ= Ġcontext . get Translation ( feature Path ) ĊĠĠĠ Ġfor Ġ(( key , Ġreplacement ) Ġin Ġfeature Replace Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfeature Ġ= Ġfeature . replace ("% $ key %", Ġreplacement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbase Msg Ġ= Ġcontext . get Translation (" message . feature . requires . premium . server ") ĊĠĠĠĠĠĠĠ Ġ. replace ("% feature %", Ġfeature ) ĊĠĠĠ Ġsend Msg ( context , Ġbase Msg ) Ċ } Ċ Ċ fun ĠString . to Upper Word Case (): ĠString Ġ{ ĊĠĠĠ Ġvar Ġprevious Ġ= Ġ' Ġ' ĊĠĠĠ Ġvar Ġnew String Ġ= Ġ"" ĊĠĠĠ Ġthis . toCharArray (). forEach Ġ{ Ġc : ĠChar Ġ-> ĊĠĠĠĠĠĠĠ Ġnew String Ġ+= Ġif Ġ( previous Ġ== Ġ' Ġ') Ġc . toUpperCase () Ġelse Ġc . toLowerCase () ĊĠĠĠĠĠĠĠ Ġprevious Ġ= Ġc ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnew String Ċ } Ċ Ċ fun ĠString . replace Prefix ( context : ĠCommand Context ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġthis . replace ( PLACE HOLDER _ PREFIX , Ġcontext . used Prefix ) Ċ } Ċ Ċ fun ĠString . replace Prefix ( prefix : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġthis . replace ( PLACE HOLDER _ PREFIX , Ġprefix ) Ċ } Ċ Ċ fun Ġget N icer Used Prefix ( settings : ĠSettings , Ġprefix : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( prefix . contains ( settings . id . toString ()) Ġ&& ĠUSER _ MENT ION . matcher ( prefix ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"@ ${ settings . name } Ġ" ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġprefix ĊĠĠĠ Ġ} Ċ }