Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add silent messages and extend builders #762

Merged
merged 11 commits into from
Mar 2, 2023
1 change: 1 addition & 0 deletions common/api/common.api
Original file line number Diff line number Diff line change
Expand Up @@ -6758,6 +6758,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
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,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
103 changes: 81 additions & 22 deletions rest/api/rest.api

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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? = null,
suppressNotifications: Boolean? = null,
ephemeral: Boolean? = null
): Optional<MessageFlags> {
fun MessageFlags.Builder.add(add: Boolean?, flag: MessageFlag) {
when (add) {
true -> +flag
false -> -flag
null -> {}
}
}

val flags = MessageFlags {
add(suppressEmbeds, MessageFlag.SuppressEmbeds)
add(suppressNotifications, MessageFlag.SuppressNotifications)
add(ephemeral, MessageFlag.Ephemeral)
}.takeIf { it.code > 0 }

val allFlags = listOfNotNull(base, flags)
return if (allFlags.isEmpty()) {
Optional.Missing()
} else {
Optional(MessageFlags(allFlags))
}
}

/**
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)
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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 val flags: MessageFlags? by state::flags.delegate()
override var suppressEmbeds: Boolean? by state::suppressEmbeds.delegate()

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
Original file line number Diff line number Diff line change
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 val flags: MessageFlags? by state::flags.delegate()
override var suppressEmbeds: Boolean? by state::suppressEmbeds.delegate()

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 = suppressEmbeds)
), state.files
)
}

Expand Down
Original file line number Diff line number Diff line change
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 add to the message created.
*
* @see suppressEmbeds
*/
public val 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 MessageCreateBuilder.messageFlags(builder: MessageFlags.Builder.() -> Unit) {
contract {
callsInPlace(builder, InvocationKind.EXACTLY_ONCE)
}
flags = MessageFlags(builder)
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package dev.kord.rest.builder.message.modify

import dev.kord.common.annotation.KordPreview
import dev.kord.common.entity.DiscordAttachment
import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.optional.Optional
import dev.kord.common.entity.optional.OptionalBoolean
import dev.kord.rest.NamedFile
import dev.kord.rest.builder.component.MessageComponentBuilder
import dev.kord.rest.builder.message.AllowedMentionsBuilder
import dev.kord.rest.builder.message.EmbedBuilder
import java.io.InputStream

/**
* Utility container for message modify builder. This class contains
Expand All @@ -30,4 +29,5 @@ internal class MessageModifyStateHolder {

var components: Optional<MutableList<MessageComponentBuilder>> = Optional.Missing()

var suppressEmbeds: OptionalBoolean = OptionalBoolean.Missing
}
Loading