From f5e030150296b3e98e927e9a73f23bce663c3f21 Mon Sep 17 00:00:00 2001 From: HopeBaron Date: Sun, 29 Aug 2021 10:57:21 +0300 Subject: [PATCH 1/3] add named files and attachments --- rest/src/main/kotlin/NamedFile.kt | 12 +++++++ .../create/PersistentMessageCreateBuilder.kt | 5 +-- .../PublicFollowupMessageCreateBuilder.kt | 5 +-- .../create/PublicInteractionCreateBuilder.kt | 3 +- .../create/UserMessageCreateBuilder.kt | 3 +- .../create/WebhookMessageCreateBuilder.kt | 3 +- ...hemeralInteractionResponseModifyBuilder.kt | 6 ++-- .../modify/MessageModifyStateHolder.kt | 5 ++- .../modify/PersistentMessageModifyBuilder.kt | 8 +++-- .../PublicFollowupMessageModifyBuilder.kt | 9 +++-- .../PublicInteractionResponseModifyBuilder.kt | 11 +++--- ...MessageInteractionResponseCreateBuilder.kt | 36 +++++++++---------- .../modify/UserMessageModifyBuilder.kt | 10 ++++-- .../modify/WebhookMessageModifyBuilder.kt | 10 ++++-- .../json/request/InteractionsRequests.kt | 15 ++++---- .../kotlin/json/request/MessageRequests.kt | 10 +++--- .../kotlin/json/request/WebhookRequests.kt | 9 +++-- rest/src/main/kotlin/request/Request.kt | 13 +++---- .../src/main/kotlin/request/RequestBuilder.kt | 9 ++--- .../test/kotlin/request/MessageRequests.kt | 3 +- 20 files changed, 116 insertions(+), 69 deletions(-) create mode 100644 rest/src/main/kotlin/NamedFile.kt diff --git a/rest/src/main/kotlin/NamedFile.kt b/rest/src/main/kotlin/NamedFile.kt new file mode 100644 index 000000000000..0f96db3915b7 --- /dev/null +++ b/rest/src/main/kotlin/NamedFile.kt @@ -0,0 +1,12 @@ +package dev.kord.rest + +import java.io.InputStream + +class NamedFile(val name: String, val inputStream: InputStream) { + + val url: String get() = "attachment://$name" + + operator fun component1() = name + operator fun component2() = inputStream + operator fun component3() = url +} \ No newline at end of file diff --git a/rest/src/main/kotlin/builder/message/create/PersistentMessageCreateBuilder.kt b/rest/src/main/kotlin/builder/message/create/PersistentMessageCreateBuilder.kt index 88302b48636c..37c818f47590 100644 --- a/rest/src/main/kotlin/builder/message/create/PersistentMessageCreateBuilder.kt +++ b/rest/src/main/kotlin/builder/message/create/PersistentMessageCreateBuilder.kt @@ -1,5 +1,6 @@ package dev.kord.rest.builder.message.create +import dev.kord.rest.NamedFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.InputStream @@ -14,13 +15,13 @@ interface PersistentMessageCreateBuilder : MessageCreateBuilder { /** * The files to include as attachments. */ - val files: MutableList> + val files: MutableList /** * Adds a file with the [name] and [content] to the attachments. */ fun addFile(name: String, content: InputStream) { - files += name to content + files += NamedFile(name, content) } /** diff --git a/rest/src/main/kotlin/builder/message/create/PublicFollowupMessageCreateBuilder.kt b/rest/src/main/kotlin/builder/message/create/PublicFollowupMessageCreateBuilder.kt index 8de7643514c5..00e32e3b7bf0 100644 --- a/rest/src/main/kotlin/builder/message/create/PublicFollowupMessageCreateBuilder.kt +++ b/rest/src/main/kotlin/builder/message/create/PublicFollowupMessageCreateBuilder.kt @@ -2,6 +2,7 @@ package dev.kord.rest.builder.message.create import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.optional.* +import dev.kord.rest.NamedFile import dev.kord.rest.builder.RequestBuilder import dev.kord.rest.builder.component.MessageComponentBuilder import dev.kord.rest.builder.message.AllowedMentionsBuilder @@ -30,7 +31,7 @@ class PublicFollowupMessageCreateBuilder override val components: MutableList = mutableListOf() - override val files: MutableList> = mutableListOf() + override val files: MutableList = mutableListOf() override fun toRequest(): MultipartFollowupMessageCreateRequest { return MultipartFollowupMessageCreateRequest( @@ -41,7 +42,7 @@ class PublicFollowupMessageCreateBuilder allowedMentions = Optional(allowedMentions).coerceToMissing().map { it.build() }, components = Optional(components).coerceToMissing().mapList { it.build() }, ), - Optional(files) + files ) } diff --git a/rest/src/main/kotlin/builder/message/create/PublicInteractionCreateBuilder.kt b/rest/src/main/kotlin/builder/message/create/PublicInteractionCreateBuilder.kt index 8e34c6dbf779..ba04695b6a7c 100644 --- a/rest/src/main/kotlin/builder/message/create/PublicInteractionCreateBuilder.kt +++ b/rest/src/main/kotlin/builder/message/create/PublicInteractionCreateBuilder.kt @@ -3,6 +3,7 @@ package dev.kord.rest.builder.message.create import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.InteractionResponseType import dev.kord.common.entity.optional.* +import dev.kord.rest.NamedFile import dev.kord.rest.builder.RequestBuilder import dev.kord.rest.builder.component.MessageComponentBuilder import dev.kord.rest.builder.message.AllowedMentionsBuilder @@ -31,7 +32,7 @@ class PublicInteractionResponseCreateBuilder override val components: MutableList = mutableListOf() - override val files: MutableList> = mutableListOf() + override val files: MutableList = mutableListOf() override fun toRequest(): MultipartInteractionResponseCreateRequest { return MultipartInteractionResponseCreateRequest( diff --git a/rest/src/main/kotlin/builder/message/create/UserMessageCreateBuilder.kt b/rest/src/main/kotlin/builder/message/create/UserMessageCreateBuilder.kt index 61db49f2a5c0..2e10ddd95264 100644 --- a/rest/src/main/kotlin/builder/message/create/UserMessageCreateBuilder.kt +++ b/rest/src/main/kotlin/builder/message/create/UserMessageCreateBuilder.kt @@ -4,6 +4,7 @@ import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.DiscordMessageReference import dev.kord.common.entity.Snowflake import dev.kord.common.entity.optional.* +import dev.kord.rest.NamedFile import dev.kord.rest.builder.RequestBuilder import dev.kord.rest.builder.component.MessageComponentBuilder import dev.kord.rest.builder.message.AllowedMentionsBuilder @@ -50,7 +51,7 @@ class UserMessageCreateBuilder */ var failIfNotExists: Boolean? = null - override val files: MutableList> = mutableListOf() + override val files: MutableList = mutableListOf() @OptIn(KordPreview::class) override fun toRequest(): MultipartMessageCreateRequest { diff --git a/rest/src/main/kotlin/builder/message/create/WebhookMessageCreateBuilder.kt b/rest/src/main/kotlin/builder/message/create/WebhookMessageCreateBuilder.kt index 5610b4ac29c9..df656a35323b 100644 --- a/rest/src/main/kotlin/builder/message/create/WebhookMessageCreateBuilder.kt +++ b/rest/src/main/kotlin/builder/message/create/WebhookMessageCreateBuilder.kt @@ -2,6 +2,7 @@ package dev.kord.rest.builder.message.create import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.optional.* +import dev.kord.rest.NamedFile import dev.kord.rest.builder.RequestBuilder import dev.kord.rest.builder.component.MessageComponentBuilder import dev.kord.rest.builder.message.AllowedMentionsBuilder @@ -32,7 +33,7 @@ class WebhookMessageCreateBuilder override val components: MutableList = mutableListOf() - override val files: MutableList> = mutableListOf() + override val files: MutableList = mutableListOf() @OptIn(KordPreview::class) override fun toRequest(): MultiPartWebhookExecuteRequest { diff --git a/rest/src/main/kotlin/builder/message/modify/EphemeralInteractionResponseModifyBuilder.kt b/rest/src/main/kotlin/builder/message/modify/EphemeralInteractionResponseModifyBuilder.kt index 6bdc1bb428a9..c39766c020c1 100644 --- a/rest/src/main/kotlin/builder/message/modify/EphemeralInteractionResponseModifyBuilder.kt +++ b/rest/src/main/kotlin/builder/message/modify/EphemeralInteractionResponseModifyBuilder.kt @@ -1,6 +1,5 @@ package dev.kord.rest.builder.message.modify -import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.MessageFlag import dev.kord.common.entity.MessageFlags import dev.kord.common.entity.optional.Optional @@ -36,10 +35,11 @@ class EphemeralInteractionResponseModifyBuilder return MultipartInteractionResponseModifyRequest( InteractionResponseModifyRequest( content = state.content, + embeds = state.embeds.mapList { it.toRequest() }, allowedMentions = state.allowedMentions.map { it.build() }, + flags = Optional(MessageFlags(MessageFlag.Ephemeral)), components = state.components.mapList { it.build() }, - embeds = state.embeds.mapList { it.toRequest() }, - flags = Optional(MessageFlags(MessageFlag.Ephemeral)) + attachments = state.attachments ) ) } diff --git a/rest/src/main/kotlin/builder/message/modify/MessageModifyStateHolder.kt b/rest/src/main/kotlin/builder/message/modify/MessageModifyStateHolder.kt index b1b94af3a1d4..50feec7e3f1d 100644 --- a/rest/src/main/kotlin/builder/message/modify/MessageModifyStateHolder.kt +++ b/rest/src/main/kotlin/builder/message/modify/MessageModifyStateHolder.kt @@ -1,8 +1,10 @@ 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.rest.NamedFile import dev.kord.rest.builder.component.MessageComponentBuilder import dev.kord.rest.builder.message.AllowedMentionsBuilder import dev.kord.rest.builder.message.EmbedBuilder @@ -14,7 +16,7 @@ import java.io.InputStream */ internal class MessageModifyStateHolder { - var files: Optional>> = Optional.Missing() + var files: Optional> = Optional.Missing() var content: Optional = Optional.Missing() @@ -24,6 +26,7 @@ internal class MessageModifyStateHolder { var allowedMentions: Optional = Optional.Missing() + var attachments: Optional> = Optional.Missing() var components: Optional> = Optional.Missing() diff --git a/rest/src/main/kotlin/builder/message/modify/PersistentMessageModifyBuilder.kt b/rest/src/main/kotlin/builder/message/modify/PersistentMessageModifyBuilder.kt index 19e769a34dfd..86256e5e6c29 100644 --- a/rest/src/main/kotlin/builder/message/modify/PersistentMessageModifyBuilder.kt +++ b/rest/src/main/kotlin/builder/message/modify/PersistentMessageModifyBuilder.kt @@ -1,5 +1,7 @@ package dev.kord.rest.builder.message.modify +import dev.kord.common.entity.DiscordAttachment +import dev.kord.rest.NamedFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.InputStream @@ -14,11 +16,13 @@ interface PersistentMessageModifyBuilder : MessageModifyBuilder { /** * The files to include as attachments */ - var files: MutableList>? + var files: MutableList? + + var attachments: MutableList? fun addFile(name: String, content: InputStream) { files = (files ?: mutableListOf()).also { - it.add(name to content) + it.add(NamedFile(name, content)) } } diff --git a/rest/src/main/kotlin/builder/message/modify/PublicFollowupMessageModifyBuilder.kt b/rest/src/main/kotlin/builder/message/modify/PublicFollowupMessageModifyBuilder.kt index cf33cea8b6e9..075c33e2b77d 100644 --- a/rest/src/main/kotlin/builder/message/modify/PublicFollowupMessageModifyBuilder.kt +++ b/rest/src/main/kotlin/builder/message/modify/PublicFollowupMessageModifyBuilder.kt @@ -1,11 +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.optional.Optional import dev.kord.common.entity.optional.coerceToMissing import dev.kord.common.entity.optional.delegate.delegate import dev.kord.common.entity.optional.map import dev.kord.common.entity.optional.mapList +import dev.kord.rest.NamedFile import dev.kord.rest.builder.RequestBuilder import dev.kord.rest.builder.component.MessageComponentBuilder import dev.kord.rest.builder.message.AllowedMentionsBuilder @@ -21,7 +23,9 @@ class PublicFollowupMessageModifyBuilder private var state = MessageModifyStateHolder() - override var files: MutableList>? by state::files.delegate() + override var files: MutableList? by state::files.delegate() + + override var attachments: MutableList? by state::attachments.delegate() override var content: String? by state::content.delegate() @@ -38,7 +42,8 @@ class PublicFollowupMessageModifyBuilder content = state.content, embeds = state.embeds.mapList { it.toRequest() }, allowedMentions = state.allowedMentions.map { it.build() }, - components = Optional(components).coerceToMissing().mapList { it.build() }, + components = state.components.mapList { it.build() }, + attachments = state.attachments ), state.files ) diff --git a/rest/src/main/kotlin/builder/message/modify/PublicInteractionResponseModifyBuilder.kt b/rest/src/main/kotlin/builder/message/modify/PublicInteractionResponseModifyBuilder.kt index 5993c16162bb..f8efc1382674 100644 --- a/rest/src/main/kotlin/builder/message/modify/PublicInteractionResponseModifyBuilder.kt +++ b/rest/src/main/kotlin/builder/message/modify/PublicInteractionResponseModifyBuilder.kt @@ -1,18 +1,18 @@ package dev.kord.rest.builder.message.modify -import dev.kord.common.annotation.KordPreview +import dev.kord.common.entity.DiscordAttachment import dev.kord.common.entity.optional.Optional import dev.kord.common.entity.optional.coerceToMissing import dev.kord.common.entity.optional.delegate.delegate import dev.kord.common.entity.optional.map import dev.kord.common.entity.optional.mapList +import dev.kord.rest.NamedFile 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.json.request.InteractionResponseModifyRequest import dev.kord.rest.json.request.MultipartInteractionResponseModifyRequest -import java.io.InputStream class PublicInteractionResponseModifyBuilder @@ -21,7 +21,9 @@ class PublicInteractionResponseModifyBuilder private var state = MessageModifyStateHolder() - override var files: MutableList>? by state::files.delegate() + override var files: MutableList? by state::files.delegate() + + override var attachments: MutableList? by state::attachments.delegate() override var content: String? by state::content.delegate() @@ -38,7 +40,8 @@ class PublicInteractionResponseModifyBuilder content = state.content, embeds = state.embeds.mapList { it.toRequest() }, allowedMentions = state.allowedMentions.map { it.build() }, - components = Optional(components).coerceToMissing().mapList { it.build() }, + components = state.components.mapList { it.build() }, + attachments = state.attachments ), state.files ) diff --git a/rest/src/main/kotlin/builder/message/modify/UpdatePublicMessageInteractionResponseCreateBuilder.kt b/rest/src/main/kotlin/builder/message/modify/UpdatePublicMessageInteractionResponseCreateBuilder.kt index dce076589291..0912c9f1d206 100644 --- a/rest/src/main/kotlin/builder/message/modify/UpdatePublicMessageInteractionResponseCreateBuilder.kt +++ b/rest/src/main/kotlin/builder/message/modify/UpdatePublicMessageInteractionResponseCreateBuilder.kt @@ -1,51 +1,49 @@ package dev.kord.rest.builder.message.modify -import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.InteractionResponseType -import dev.kord.common.entity.MessageFlags -import dev.kord.common.entity.optional.coerceToMissing +import dev.kord.common.entity.optional.* import dev.kord.common.entity.optional.delegate.delegate -import dev.kord.common.entity.optional.map -import dev.kord.common.entity.optional.mapList -import dev.kord.common.entity.optional.optional +import dev.kord.rest.NamedFile 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.PersistentMessageCreateBuilder import dev.kord.rest.json.request.InteractionApplicationCommandCallbackData import dev.kord.rest.json.request.InteractionResponseCreateRequest import dev.kord.rest.json.request.MultipartInteractionResponseCreateRequest -import java.io.InputStream class UpdatePublicMessageInteractionResponseCreateBuilder : - PersistentMessageModifyBuilder, + PersistentMessageCreateBuilder, RequestBuilder { - private var state = MessageModifyStateHolder() - override var files: MutableList>? by state::files.delegate() + override var files: MutableList = mutableListOf() - override var content: String? by state::content.delegate() + override var content: String? = null - override var embeds: MutableList? by state::embeds.delegate() + override var tts: Boolean? = null - override var allowedMentions: AllowedMentionsBuilder? by state::allowedMentions.delegate() + override var embeds: MutableList = mutableListOf() - override var components: MutableList? by state::components.delegate() + override var allowedMentions: AllowedMentionsBuilder? = null + + override var components: MutableList = mutableListOf() override fun toRequest(): MultipartInteractionResponseCreateRequest { return MultipartInteractionResponseCreateRequest( InteractionResponseCreateRequest( InteractionResponseType.UpdateMessage, InteractionApplicationCommandCallbackData( - content = state.content, - embeds = state.embeds.mapList { it.toRequest() }, - allowedMentions = state.allowedMentions.map { it.build() }, - components = state.components.mapList { it.build() } + content = Optional(content).coerceToMissing(), + embeds = Optional(embeds).mapList { it.toRequest() }, + allowedMentions = Optional(allowedMentions).map { it.build() }, + components = Optional(components).mapList { it.build() }, + tts = Optional(tts).coerceToMissing().toPrimitive() ).optional() ), - state.files + Optional(files) ) } diff --git a/rest/src/main/kotlin/builder/message/modify/UserMessageModifyBuilder.kt b/rest/src/main/kotlin/builder/message/modify/UserMessageModifyBuilder.kt index 47280ec118f7..565b4962eb3b 100644 --- a/rest/src/main/kotlin/builder/message/modify/UserMessageModifyBuilder.kt +++ b/rest/src/main/kotlin/builder/message/modify/UserMessageModifyBuilder.kt @@ -1,17 +1,18 @@ 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.delegate.delegate import dev.kord.common.entity.optional.map import dev.kord.common.entity.optional.mapList +import dev.kord.rest.NamedFile 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.json.request.MessageEditPatchRequest import dev.kord.rest.json.request.MultipartMessagePatchRequest -import java.io.InputStream class UserMessageModifyBuilder : PersistentMessageModifyBuilder, @@ -19,7 +20,9 @@ class UserMessageModifyBuilder private var state = MessageModifyStateHolder() - override var files: MutableList>? by state::files.delegate() + override var files: MutableList? by state::files.delegate() + + override var attachments: MutableList? by state::attachments.delegate() override var content: String? by state::content.delegate() @@ -39,7 +42,8 @@ class UserMessageModifyBuilder embeds = state.embeds.mapList { it.toRequest() }, flags = state.flags, allowedMentions = state.allowedMentions.map { it.build() }, - components = state.components.mapList { it.build() } + components = state.components.mapList { it.build() }, + attachments = state.attachments ), state.files, ) diff --git a/rest/src/main/kotlin/builder/message/modify/WebhookMessageModifyBuilder.kt b/rest/src/main/kotlin/builder/message/modify/WebhookMessageModifyBuilder.kt index 05dd1d908b88..c2ed26d8a71e 100644 --- a/rest/src/main/kotlin/builder/message/modify/WebhookMessageModifyBuilder.kt +++ b/rest/src/main/kotlin/builder/message/modify/WebhookMessageModifyBuilder.kt @@ -1,16 +1,17 @@ package dev.kord.rest.builder.message.modify import dev.kord.common.annotation.KordPreview +import dev.kord.common.entity.DiscordAttachment import dev.kord.common.entity.optional.delegate.delegate import dev.kord.common.entity.optional.map import dev.kord.common.entity.optional.mapList +import dev.kord.rest.NamedFile 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.json.request.MultipartWebhookEditMessageRequest import dev.kord.rest.json.request.WebhookEditMessageRequest -import java.io.InputStream class WebhookMessageModifyBuilder : PersistentMessageModifyBuilder, @@ -18,7 +19,9 @@ class WebhookMessageModifyBuilder private var state = MessageModifyStateHolder() - override var files: MutableList>? by state::files.delegate() + override var files: MutableList? by state::files.delegate() + + override var attachments: MutableList? by state::attachments.delegate() override var content: String? by state::content.delegate() @@ -36,7 +39,8 @@ class WebhookMessageModifyBuilder content = state.content, embeds = state.embeds.mapList { it.toRequest() }, allowedMentions = state.allowedMentions.map { it.build() }, - components = state.components.mapList { it.build() } + components = state.components.mapList { it.build() }, + attachments = state.attachments ), files = state.files ) diff --git a/rest/src/main/kotlin/json/request/InteractionsRequests.kt b/rest/src/main/kotlin/json/request/InteractionsRequests.kt index 31b5088c72ba..38c7e816931b 100644 --- a/rest/src/main/kotlin/json/request/InteractionsRequests.kt +++ b/rest/src/main/kotlin/json/request/InteractionsRequests.kt @@ -4,6 +4,7 @@ import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.* import dev.kord.common.entity.optional.Optional import dev.kord.common.entity.optional.OptionalBoolean +import dev.kord.rest.NamedFile import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import java.io.InputStream @@ -37,13 +38,14 @@ data class InteractionResponseModifyRequest( @SerialName("allowed_mentions") val allowedMentions: Optional = Optional.Missing(), val flags: Optional = Optional.Missing(), - val components: Optional?> = Optional.Missing() + val components: Optional?> = Optional.Missing(), + val attachments: Optional?> = Optional.Missing() ) data class MultipartInteractionResponseModifyRequest( val request: InteractionResponseModifyRequest, - val files: Optional>> = Optional.Missing(), + val files: Optional> = Optional.Missing(), ) @Serializable @@ -56,7 +58,7 @@ data class InteractionResponseCreateRequest( data class MultipartInteractionResponseCreateRequest( val request: InteractionResponseCreateRequest, - val files: Optional>> = Optional.Missing() + val files: Optional> = Optional.Missing() ) @Serializable @@ -74,7 +76,7 @@ class InteractionApplicationCommandCallbackData( data class MultipartFollowupMessageCreateRequest( val request: FollowupMessageCreateRequest, - val files: Optional>> = Optional.Missing(), + val files: List = emptyList(), ) @Serializable @@ -99,13 +101,14 @@ data class FollowupMessageModifyRequest( val embeds: Optional?> = Optional.Missing(), @SerialName("allowed_mentions") val allowedMentions: Optional = Optional.Missing(), - val components: Optional?> = Optional.Missing() + val components: Optional?> = Optional.Missing(), + val attachments: Optional?> = Optional.Missing() ) data class MultipartFollowupMessageModifyRequest( val request: FollowupMessageModifyRequest, - val files: Optional>> = Optional.Missing(), + val files: Optional> = Optional.Missing() ) @Serializable diff --git a/rest/src/main/kotlin/json/request/MessageRequests.kt b/rest/src/main/kotlin/json/request/MessageRequests.kt index 5bb24444f793..d8ec588419a1 100644 --- a/rest/src/main/kotlin/json/request/MessageRequests.kt +++ b/rest/src/main/kotlin/json/request/MessageRequests.kt @@ -5,9 +5,8 @@ import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.* import dev.kord.common.entity.optional.Optional import dev.kord.common.entity.optional.OptionalBoolean -import dev.kord.common.entity.optional.OptionalInt +import dev.kord.rest.NamedFile import kotlinx.datetime.Instant -import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -28,7 +27,7 @@ data class MessageCreateRequest constructor( data class MultipartMessageCreateRequest( val request: MessageCreateRequest, - val files: List> = emptyList(), + val files: List = emptyList(), ) @Serializable @@ -83,12 +82,13 @@ data class MessageEditPatchRequest( val flags: Optional = Optional.Missing(), @SerialName("allowed_mentions") val allowedMentions: Optional = Optional.Missing(), - val components: Optional> = Optional.Missing() + val components: Optional> = Optional.Missing(), + val attachments: Optional> = Optional.Missing() ) data class MultipartMessagePatchRequest( val requests: MessageEditPatchRequest, - val files: Optional>> = Optional.Missing() + val files: Optional> = Optional.Missing() ) @Serializable diff --git a/rest/src/main/kotlin/json/request/WebhookRequests.kt b/rest/src/main/kotlin/json/request/WebhookRequests.kt index 7ed29d2d8729..15e8d2487d7f 100644 --- a/rest/src/main/kotlin/json/request/WebhookRequests.kt +++ b/rest/src/main/kotlin/json/request/WebhookRequests.kt @@ -2,10 +2,12 @@ package dev.kord.rest.json.request import dev.kord.common.annotation.KordPreview import dev.kord.common.entity.AllowedMentions +import dev.kord.common.entity.DiscordAttachment import dev.kord.common.entity.DiscordComponent import dev.kord.common.entity.optional.Optional import dev.kord.common.entity.optional.OptionalBoolean import dev.kord.common.entity.optional.OptionalSnowflake +import dev.kord.rest.NamedFile import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -36,7 +38,7 @@ data class WebhookExecuteRequest constructor( data class MultiPartWebhookExecuteRequest( val request: WebhookExecuteRequest, - val files: List> = emptyList() + val files: List = emptyList() ) @Serializable @@ -46,10 +48,11 @@ data class WebhookEditMessageRequest( val embeds: Optional> = Optional.Missing(), @SerialName("allowed_mentions") val allowedMentions: Optional = Optional.Missing(), - val components: Optional> = Optional.Missing() + val components: Optional> = Optional.Missing(), + val attachments: Optional> = Optional.Missing() ) data class MultipartWebhookEditMessageRequest( val request: WebhookEditMessageRequest, - val files: Optional>> = Optional.Missing() + val files: Optional> = Optional.Missing() ) diff --git a/rest/src/main/kotlin/request/Request.kt b/rest/src/main/kotlin/request/Request.kt index 8c80b8b865cf..497363e3a5f1 100644 --- a/rest/src/main/kotlin/request/Request.kt +++ b/rest/src/main/kotlin/request/Request.kt @@ -1,5 +1,6 @@ package dev.kord.rest.request +import dev.kord.rest.NamedFile import dev.kord.rest.route.Route import io.ktor.client.request.forms.* import io.ktor.http.* @@ -13,7 +14,7 @@ sealed class Request { abstract val headers: StringValues abstract val parameters: StringValues abstract val body: RequestBody? - abstract val files: List>? + abstract val files: List? val path: String get() { @@ -64,7 +65,7 @@ class JsonRequest( override val headers: StringValues, override val body: RequestBody? ) : Request() { - override val files: List>? = null + override val files: List? = null } class MultipartRequest( @@ -73,7 +74,7 @@ class MultipartRequest( override val parameters: StringValues, override val headers: StringValues, override val body: RequestBody?, - override val files: List> = emptyList() + override val files: List = emptyList() ) : Request() { val data = formData { @@ -83,8 +84,8 @@ class MultipartRequest( try { files.forEachIndexed { index, pair -> - val name = pair.first - val inputStream = pair.second + + val (name, inputStream) = pair append( "file$index", inputStream.readBytes(), @@ -92,7 +93,7 @@ class MultipartRequest( ) } } finally { - files.forEach { it.second.close() } + files.forEach { it.inputStream.close() } } } } diff --git a/rest/src/main/kotlin/request/RequestBuilder.kt b/rest/src/main/kotlin/request/RequestBuilder.kt index 14353ad4cde1..cfb13cf84059 100644 --- a/rest/src/main/kotlin/request/RequestBuilder.kt +++ b/rest/src/main/kotlin/request/RequestBuilder.kt @@ -1,6 +1,7 @@ package dev.kord.rest.request import dev.kord.common.entity.Snowflake +import dev.kord.rest.NamedFile import dev.kord.rest.route.Route import io.ktor.http.* import kotlinx.serialization.SerializationStrategy @@ -15,7 +16,7 @@ class RequestBuilder(private val route: Route, keySize: Int = 2) { private val parameters = ParametersBuilder() private var body: RequestBody<*>? = null - private val files: MutableList> = mutableListOf() + private val files: MutableList = mutableListOf() operator fun MutableMap.set(key: Route.Key, value: String) = set(key.identifier, value) @@ -30,11 +31,11 @@ class RequestBuilder(private val route: Route, keySize: Int = 2) { fun header(key: String, value: String) = headers.append(key, value.encodeURLQueryComponent()) fun file(name: String, input: java.io.InputStream) { - files.add(name to input) + files.add(NamedFile(name, input)) } - fun file(pair: Pair) { - files.add(pair) + fun file(file: NamedFile) { + files.add(file) } fun build(): Request<*, T> = when { diff --git a/rest/src/test/kotlin/request/MessageRequests.kt b/rest/src/test/kotlin/request/MessageRequests.kt index 05475ed5d1eb..780632cb30da 100644 --- a/rest/src/test/kotlin/request/MessageRequests.kt +++ b/rest/src/test/kotlin/request/MessageRequests.kt @@ -1,5 +1,6 @@ package dev.kord.rest.request +import dev.kord.rest.NamedFile import dev.kord.rest.json.response.GatewayResponse import dev.kord.rest.route.Route import io.ktor.util.* @@ -33,7 +34,7 @@ class MessageRequests { StringValues.Empty, StringValues.Empty, null, - listOf("linus.png" to linusStream) + listOf(NamedFile("linus.png", linusStream)) ) assert(linusStream.closed) From b042b763839179b938d6fa709c68644d8b656b5c Mon Sep 17 00:00:00 2001 From: HopeBaron Date: Mon, 30 Aug 2021 17:20:39 +0300 Subject: [PATCH 2/3] add a conversion method from core attachments to common structure --- core/src/main/kotlin/entity/Attachment.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/kotlin/entity/Attachment.kt b/core/src/main/kotlin/entity/Attachment.kt index ecbb6bb5648c..7aa7ff51309d 100644 --- a/core/src/main/kotlin/entity/Attachment.kt +++ b/core/src/main/kotlin/entity/Attachment.kt @@ -1,6 +1,8 @@ package dev.kord.core.entity +import dev.kord.common.entity.DiscordAttachment import dev.kord.common.entity.Snowflake +import dev.kord.common.entity.optional.optionalInt import dev.kord.common.entity.optional.value import dev.kord.core.Kord import dev.kord.core.cache.data.AttachmentData @@ -67,4 +69,8 @@ data class Attachment(val data: AttachmentData, override val kord: Kord) : KordE return "Attachment(data=$data, kord=$kord)" } +} + +fun Attachment.toRawType(): DiscordAttachment { + return DiscordAttachment(id, filename, size, url, proxyUrl, height?.optionalInt(), width?.optionalInt()) } \ No newline at end of file From 994a3a9c7e84af55bbe53acda0212a015e2fef33 Mon Sep 17 00:00:00 2001 From: HopeBaron Date: Tue, 31 Aug 2021 12:07:46 +0300 Subject: [PATCH 3/3] use data since it has identical structure --- core/src/main/kotlin/entity/Attachment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/kotlin/entity/Attachment.kt b/core/src/main/kotlin/entity/Attachment.kt index 7aa7ff51309d..c50f64f81d26 100644 --- a/core/src/main/kotlin/entity/Attachment.kt +++ b/core/src/main/kotlin/entity/Attachment.kt @@ -72,5 +72,7 @@ data class Attachment(val data: AttachmentData, override val kord: Kord) : KordE } fun Attachment.toRawType(): DiscordAttachment { - return DiscordAttachment(id, filename, size, url, proxyUrl, height?.optionalInt(), width?.optionalInt()) + with(data) { + return DiscordAttachment(id, filename, size, url, proxyUrl, height, width) + } } \ No newline at end of file