2019-06-08 21:14:57 +02:00
package moe.kageru.kagebot
2019-11-11 18:10:28 +01:00
import moe.kageru.kagebot.config.Config
2019-10-06 16:14:01 +02:00
import moe.kageru.kagebot.config.SystemSpec
2019-07-14 16:35:20 +02:00
import org.javacord.api.entity.message.Message
2019-06-08 21:14:57 +02:00
import org.javacord.api.entity.message.MessageAuthor
2019-07-17 22:04:06 +02:00
import org.javacord.api.entity.message.Messageable
2019-06-09 18:41:51 +02:00
import org.javacord.api.entity.message.embed.EmbedBuilder
2019-07-14 16:35:20 +02:00
import java.util.concurrent.CompletableFuture
2019-06-08 21:14:57 +02:00
object MessageUtil {
2019-11-14 15:10:30 +01:00
fun MessageAuthor . mention ( ) = " <@ $id > "
2019-06-12 23:43:36 +02:00
2019-11-14 15:10:30 +01:00
fun withEmbed ( op : EmbedBuilder . ( ) -> Unit ) : EmbedBuilder {
return EmbedBuilder ( ) . apply {
Config . server . icon . ifPresent { setThumbnail ( it ) }
setColor ( SystemSpec . color )
op ( )
2019-06-12 23:43:36 +02:00
}
2019-11-14 15:10:30 +01:00
}
2019-06-12 23:43:36 +02:00
2019-11-14 15:10:30 +01:00
fun Messageable . sendEmbed ( op : EmbedBuilder . ( ) -> Unit ) {
val embed = withEmbed {
setTimestampToNow ( )
op ( )
2019-07-17 22:04:06 +02:00
}
2019-11-14 15:10:30 +01:00
sendMessage ( embed )
}
2019-07-17 22:04:06 +02:00
2019-11-14 15:10:30 +01:00
/ * *
* Send and embed and add the current time to it .
* The time is not set in [ withEmbed ] because of https : //git.kageru.moe/kageru/discord-kagebot/issues/13.
* /
fun sendEmbed ( target : Messageable , embed : EmbedBuilder ) : CompletableFuture < Message > {
return target . sendMessage ( embed . setTimestampToNow ( ) )
}
2019-07-14 16:35:20 +02:00
2019-11-14 15:10:30 +01:00
/ * *
* The reason we use a list here ( rather than a map ) is that maps would not retain the order specified in the config .
* I tried LinkedHashMaps , but those don ’ t seem to work either .
* /
fun listToEmbed ( contents : List < String > ) : EmbedBuilder {
check ( contents . size % 2 != 1 ) { " Embed must have even number of content strings (title/content pairs) " }
return withEmbed {
contents . toPairs ( ) . forEach { ( heading , content ) ->
addField ( heading , content )
}
2019-06-09 18:41:51 +02:00
}
2019-11-14 15:10:30 +01:00
}
2019-11-12 22:22:32 +01:00
2019-11-14 15:10:30 +01:00
/ * *
* Convert a list of elements to pairs , retaining order .
* The last element is dropped if the input size is odd .
* [ 1 , 2 , 3 , 4 , 5 ] -> [ [ 1 , 2 ] , [ 3 , 4 ] ]
* /
private fun < T > Collection < T > . toPairs ( ) : List < Pair < T , T > > = this . iterator ( ) . run {
( 0 until size / 2 ) . map {
Pair ( next ( ) , next ( ) )
2019-11-12 22:22:32 +01:00
}
2019-11-14 15:10:30 +01:00
}
2019-07-12 14:08:22 +02:00
}