Skip to content

Commit

Permalink
Add silent messages and extend builders (#762)
Browse files Browse the repository at this point in the history
In addition to adding MessageFlag.SuppressNotifications the message
create and edit builders were extended to allow setting MessageFlags
with convenience properties for setting MessageFlag.SuppressEmbeds
and MessageFlag.SuppressNotifications directly.

see discord/discord-api-docs#5910 and
discord/discord-api-docs@f7cc5dd

Co-authored-by: Lukellmann <lukellmann@gmail.com>
  • Loading branch information
DRSchlaubi and lukellmann committed Mar 2, 2023
1 parent 8a30116 commit b9f1d7e
Show file tree
Hide file tree
Showing 18 changed files with 244 additions and 49 deletions.
1 change: 1 addition & 0 deletions common/api/common.api
Expand Up @@ -6832,6 +6832,7 @@ public final class dev/kord/common/entity/MessageFlag : java/lang/Enum {
public static final field Loading Ldev/kord/common/entity/MessageFlag;
public static final field SourceMessageDeleted Ldev/kord/common/entity/MessageFlag;
public static final field SuppressEmbeds Ldev/kord/common/entity/MessageFlag;
public static final field SuppressNotifications Ldev/kord/common/entity/MessageFlag;
public static final field Urgent Ldev/kord/common/entity/MessageFlag;
public final fun getCode ()I
public static fun valueOf (Ljava/lang/String;)Ldev/kord/common/entity/MessageFlag;
Expand Down
3 changes: 3 additions & 0 deletions common/src/main/kotlin/entity/DiscordMessage.kt
Expand Up @@ -424,6 +424,9 @@ public enum class MessageFlag(public val code: Int) {

/** This message failed to mention some roles and add their members to the thread. */
FailedToMentionSomeRolesInThread(1 shl 8),

/** This message will not trigger push and desktop notifications. */
SuppressNotifications(1 shl 12)
}

@Serializable(with = MessageFlags.Serializer::class)
Expand Down
108 changes: 86 additions & 22 deletions rest/api/rest.api

Large diffs are not rendered by default.

@@ -1,7 +1,6 @@
package dev.kord.rest.builder.message.create

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.MessageFlag
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.*
import dev.kord.rest.NamedFile
Expand Down Expand Up @@ -33,6 +32,10 @@ public class FollowupMessageCreateBuilder(public val ephemeral: Boolean) :

override val files: MutableList<NamedFile> = mutableListOf()

override var flags: MessageFlags? = null
override var suppressEmbeds: Boolean? = null
override var suppressNotifications: Boolean? = null

override fun toRequest(): MultipartFollowupMessageCreateRequest {
return MultipartFollowupMessageCreateRequest(
FollowupMessageCreateRequest(
Expand All @@ -41,7 +44,7 @@ public class FollowupMessageCreateBuilder(public val ephemeral: Boolean) :
embeds = Optional(embeds).mapList { it.toRequest() },
allowedMentions = Optional(allowedMentions).coerceToMissing().map { it.build() },
components = Optional(components).coerceToMissing().mapList { it.build() },
flags = Optional(if (ephemeral) MessageFlags(MessageFlag.Ephemeral) else null).coerceToMissing()
flags = buildMessageFlags(flags, suppressEmbeds, suppressNotifications, ephemeral)
),
files
)
Expand Down
Expand Up @@ -2,7 +2,6 @@ package dev.kord.rest.builder.message.create

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.InteractionResponseType
import dev.kord.common.entity.MessageFlag
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.*
import dev.kord.rest.NamedFile
Expand Down Expand Up @@ -34,6 +33,10 @@ public class InteractionResponseCreateBuilder(public val ephemeral: Boolean = fa

override val files: MutableList<NamedFile> = mutableListOf()

override var flags: MessageFlags? = null
override var suppressEmbeds: Boolean? = null
override var suppressNotifications: Boolean? = null

override fun toRequest(): MultipartInteractionResponseCreateRequest {
return MultipartInteractionResponseCreateRequest(
InteractionResponseCreateRequest(
Expand All @@ -45,7 +48,7 @@ public class InteractionResponseCreateBuilder(public val ephemeral: Boolean = fa
embeds = Optional(embeds).mapList { it.toRequest() },
allowedMentions = Optional(allowedMentions).coerceToMissing().map { it.build() },
components = Optional(components).coerceToMissing().mapList { it.build() },
flags = Optional(if (ephemeral) MessageFlags(MessageFlag.Ephemeral) else null).coerceToMissing()
flags = buildMessageFlags(flags, suppressEmbeds, suppressNotifications, ephemeral)
)
)
),
Expand Down
@@ -1,6 +1,9 @@
package dev.kord.rest.builder.message.create

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.MessageFlag
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.Optional
import dev.kord.rest.NamedFile
import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.component.MessageComponentBuilder
Expand Down Expand Up @@ -53,6 +56,24 @@ public sealed interface MessageCreateBuilder {
*/
public val files: MutableList<NamedFile>

/**
* Optional custom [MessageFlags] to add to the message created.
*
* @see suppressEmbeds
* @see suppressNotifications
*/
public var flags: MessageFlags?

/**
* Do not include any embeds when serializing this message.
*/
public var suppressEmbeds: Boolean?

/**
* This message will not trigger push and desktop notifications.
*/
public var suppressNotifications: Boolean?

/**
* Adds a file with the [name] and [content] to the attachments.
*
Expand Down Expand Up @@ -86,6 +107,35 @@ public sealed interface MessageCreateBuilder {
*/
public suspend fun addFile(path: Path): NamedFile =
addFile(path.fileName.toString(), ChannelProvider { path.readChannel() })

}

internal fun buildMessageFlags(
base: MessageFlags?,
suppressEmbeds: Boolean?,
suppressNotifications: Boolean? = null,
ephemeral: Boolean? = null
): Optional<MessageFlags> {
fun MessageFlags.Builder.add(add: Boolean?, flag: MessageFlag) {
when (add) {
true -> +flag
false -> -flag
null -> {}
}
}

if (base == null && suppressEmbeds == null && suppressNotifications == null && ephemeral == null) {
return Optional.Missing()
}

val flags = MessageFlags {
if (base != null) +base
add(suppressEmbeds, MessageFlag.SuppressEmbeds)
add(suppressNotifications, MessageFlag.SuppressNotifications)
add(ephemeral, MessageFlag.Ephemeral)
}

return Optional.Value(flags)
}

/**
Expand Down Expand Up @@ -116,3 +166,15 @@ public inline fun MessageCreateBuilder.actionRow(builder: ActionRowBuilder.() ->

components.add(ActionRowBuilder().apply(builder))
}

/**
* Sets the [MessageFlags] for the created message.
*
* **Only supports [MessageFlag.SuppressEmbeds] and [MessageFlag.SuppressNotifications]**
*/
public inline fun MessageCreateBuilder.messageFlags(builder: MessageFlags.Builder.() -> Unit) {
contract {
callsInPlace(builder, InvocationKind.EXACTLY_ONCE)
}
flags = MessageFlags(builder)
}
Expand Up @@ -2,6 +2,7 @@ package dev.kord.rest.builder.message.create

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.InteractionResponseType
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.*
import dev.kord.rest.NamedFile
import dev.kord.rest.builder.RequestBuilder
Expand Down Expand Up @@ -30,6 +31,10 @@ public class UpdateMessageInteractionResponseCreateBuilder :

override var components: MutableList<MessageComponentBuilder> = mutableListOf()

override var flags: MessageFlags? = null
override var suppressEmbeds: Boolean? = null
override var suppressNotifications: Boolean? = null

override fun toRequest(): MultipartInteractionResponseCreateRequest {
return MultipartInteractionResponseCreateRequest(
InteractionResponseCreateRequest(
Expand All @@ -40,6 +45,7 @@ public class UpdateMessageInteractionResponseCreateBuilder :
allowedMentions = Optional(allowedMentions).map { it.build() },
components = Optional(components).mapList { it.build() },
tts = Optional(tts).coerceToMissing().toPrimitive(),
flags = buildMessageFlags(flags, suppressEmbeds, suppressNotifications)
).optional()
),
Optional(files)
Expand Down
Expand Up @@ -2,6 +2,7 @@ package dev.kord.rest.builder.message.create

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.DiscordMessageReference
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.Snowflake
import dev.kord.common.entity.optional.*
import dev.kord.rest.NamedFile
Expand Down Expand Up @@ -53,6 +54,10 @@ public class UserMessageCreateBuilder

override val files: MutableList<NamedFile> = mutableListOf()

override var flags: MessageFlags? = null
override var suppressEmbeds: Boolean? = null
override var suppressNotifications: Boolean? = null

override fun toRequest(): MultipartMessageCreateRequest {
return MultipartMessageCreateRequest(
MessageCreateRequest(
Expand All @@ -69,7 +74,8 @@ public class UserMessageCreateBuilder
)
)
} ?: Optional.Missing(),
components = Optional(components).coerceToMissing().mapList { it.build() }
components = Optional(components).coerceToMissing().mapList { it.build() },
flags = buildMessageFlags(flags, suppressEmbeds, suppressNotifications)
),
files
)
Expand Down
@@ -1,6 +1,7 @@
package dev.kord.rest.builder.message.create

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.*
import dev.kord.rest.NamedFile
import dev.kord.rest.builder.RequestBuilder
Expand Down Expand Up @@ -35,6 +36,10 @@ public class WebhookMessageCreateBuilder :

override val files: MutableList<NamedFile> = mutableListOf()

override var flags: MessageFlags? = null
override var suppressEmbeds: Boolean? = null
override var suppressNotifications: Boolean? = null

override fun toRequest(): MultiPartWebhookExecuteRequest {
return MultiPartWebhookExecuteRequest(
WebhookExecuteRequest(
Expand All @@ -44,7 +49,8 @@ public class WebhookMessageCreateBuilder :
tts = Optional(tts).coerceToMissing().toPrimitive(),
embeds = Optional(embeds).mapList { it.toRequest() },
allowedMentions = Optional(allowedMentions).coerceToMissing().map { it.build() },
components = Optional(components).coerceToMissing().mapList { it.build() }
components = Optional(components).coerceToMissing().mapList { it.build() },
flags = buildMessageFlags(flags, suppressEmbeds, suppressNotifications)
),
files
)
Expand Down
Expand Up @@ -2,6 +2,7 @@ package dev.kord.rest.builder.message.modify

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.DiscordAttachment
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.delegate.delegate
import dev.kord.common.entity.optional.map
import dev.kord.common.entity.optional.mapList
Expand All @@ -10,6 +11,7 @@ import dev.kord.rest.builder.RequestBuilder
import dev.kord.rest.builder.component.MessageComponentBuilder
import dev.kord.rest.builder.message.AllowedMentionsBuilder
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.create.buildMessageFlags
import dev.kord.rest.json.request.FollowupMessageModifyRequest
import dev.kord.rest.json.request.MultipartFollowupMessageModifyRequest

Expand All @@ -30,6 +32,8 @@ public class FollowupMessageModifyBuilder :

override var allowedMentions: AllowedMentionsBuilder? by state::allowedMentions.delegate()

override var flags: MessageFlags? = null
override var suppressEmbeds: Boolean? = null

override var components: MutableList<MessageComponentBuilder>? by state::components.delegate()

Expand All @@ -40,7 +44,8 @@ public class FollowupMessageModifyBuilder :
embeds = state.embeds.mapList { it.toRequest() },
allowedMentions = state.allowedMentions.map { it.build() },
components = state.components.mapList { it.build() },
attachments = state.attachments
attachments = state.attachments,
flags = buildMessageFlags(flags, suppressEmbeds)
),
state.files
)
Expand Down
Expand Up @@ -2,6 +2,7 @@ package dev.kord.rest.builder.message.modify

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.DiscordAttachment
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.delegate.delegate
import dev.kord.common.entity.optional.map
import dev.kord.common.entity.optional.mapList
Expand All @@ -10,12 +11,12 @@ import dev.kord.rest.builder.RequestBuilder
import dev.kord.rest.builder.component.MessageComponentBuilder
import dev.kord.rest.builder.message.AllowedMentionsBuilder
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.create.buildMessageFlags
import dev.kord.rest.json.request.InteractionResponseModifyRequest
import dev.kord.rest.json.request.MultipartInteractionResponseModifyRequest

@KordDsl
public class InteractionResponseModifyBuilder :
MessageModifyBuilder,
public class InteractionResponseModifyBuilder : MessageModifyBuilder,
RequestBuilder<MultipartInteractionResponseModifyRequest> {

private var state = MessageModifyStateHolder()
Expand All @@ -30,6 +31,8 @@ public class InteractionResponseModifyBuilder :

override var allowedMentions: AllowedMentionsBuilder? by state::allowedMentions.delegate()

override var flags: MessageFlags? = null
override var suppressEmbeds: Boolean? = null

override var components: MutableList<MessageComponentBuilder>? by state::components.delegate()

Expand All @@ -40,9 +43,9 @@ public class InteractionResponseModifyBuilder :
embeds = state.embeds.mapList { it.toRequest() },
allowedMentions = state.allowedMentions.map { it.build() },
components = state.components.mapList { it.build() },
attachments = state.attachments
),
state.files
attachments = state.attachments,
flags = buildMessageFlags(flags, suppressEmbeds)
), state.files
)
}

Expand Down
Expand Up @@ -2,11 +2,14 @@ package dev.kord.rest.builder.message.modify

import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.DiscordAttachment
import dev.kord.common.entity.MessageFlag
import dev.kord.common.entity.MessageFlags
import dev.kord.rest.NamedFile
import dev.kord.rest.builder.component.ActionRowBuilder
import dev.kord.rest.builder.component.MessageComponentBuilder
import dev.kord.rest.builder.message.AllowedMentionsBuilder
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.create.MessageCreateBuilder
import io.ktor.client.request.forms.*
import io.ktor.util.cio.*
import io.ktor.utils.io.jvm.javaio.*
Expand Down Expand Up @@ -35,6 +38,18 @@ public sealed interface MessageModifyBuilder {

public var attachments: MutableList<DiscordAttachment>?

/**
* Optional custom [MessageFlags] to update in this message.
*
* @see suppressEmbeds
*/
public var flags: MessageFlags?

/**
* Do not include any embeds when serializing this message.
*/
public var suppressEmbeds: Boolean?

/**
* Adds a file with the [name] and [content] to the attachments.
*
Expand Down Expand Up @@ -101,3 +116,15 @@ public inline fun MessageModifyBuilder.actionRow(builder: ActionRowBuilder.() ->
it.add(ActionRowBuilder().apply(builder))
}
}

/**
* Sets/Unsets the [MessageFlags] for this message.
*
* **Only supports [MessageFlag.SuppressEmbeds]**
*/
public inline fun MessageModifyBuilder.messageFlags(builder: MessageFlags.Builder.() -> Unit) {
contract {
callsInPlace(builder, InvocationKind.EXACTLY_ONCE)
}
flags = MessageFlags(builder)
}

0 comments on commit b9f1d7e

Please sign in to comment.