Skip to content

Commit

Permalink
add named files and attachments (#379)
Browse files Browse the repository at this point in the history
* add named files and attachments

* add a conversion method from core attachments to common structure

* use data since it has identical structure
  • Loading branch information
HopeBaron authored Sep 5, 2021
1 parent 3c31bbd commit a9f36c0
Show file tree
Hide file tree
Showing 21 changed files with 124 additions and 69 deletions.
8 changes: 8 additions & 0 deletions core/src/main/kotlin/entity/Attachment.kt
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -67,4 +69,10 @@ data class Attachment(val data: AttachmentData, override val kord: Kord) : KordE
return "Attachment(data=$data, kord=$kord)"
}

}

fun Attachment.toRawType(): DiscordAttachment {
with(data) {
return DiscordAttachment(id, filename, size, url, proxyUrl, height, width)
}
}
12 changes: 12 additions & 0 deletions rest/src/main/kotlin/NamedFile.kt
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -14,13 +15,13 @@ interface PersistentMessageCreateBuilder : MessageCreateBuilder {
/**
* The files to include as attachments.
*/
val files: MutableList<Pair<String, InputStream>>
val files: MutableList<NamedFile>

/**
* 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)
}

/**
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.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
Expand Down Expand Up @@ -30,7 +31,7 @@ class PublicFollowupMessageCreateBuilder

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

override val files: MutableList<Pair<String, InputStream>> = mutableListOf()
override val files: MutableList<NamedFile> = mutableListOf()

override fun toRequest(): MultipartFollowupMessageCreateRequest {
return MultipartFollowupMessageCreateRequest(
Expand All @@ -41,7 +42,7 @@ class PublicFollowupMessageCreateBuilder
allowedMentions = Optional(allowedMentions).coerceToMissing().map { it.build() },
components = Optional(components).coerceToMissing().mapList { it.build() },
),
Optional(files)
files
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -31,7 +32,7 @@ class PublicInteractionResponseCreateBuilder

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

override val files: MutableList<Pair<String, InputStream>> = mutableListOf()
override val files: MutableList<NamedFile> = mutableListOf()

override fun toRequest(): MultipartInteractionResponseCreateRequest {
return MultipartInteractionResponseCreateRequest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -50,7 +51,7 @@ class UserMessageCreateBuilder
*/
var failIfNotExists: Boolean? = null

override val files: MutableList<Pair<String, InputStream>> = mutableListOf()
override val files: MutableList<NamedFile> = mutableListOf()

@OptIn(KordPreview::class)
override fun toRequest(): MultipartMessageCreateRequest {
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.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
Expand Down Expand Up @@ -32,7 +33,7 @@ class WebhookMessageCreateBuilder

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

override val files: MutableList<Pair<String, InputStream>> = mutableListOf()
override val files: MutableList<NamedFile> = mutableListOf()

@OptIn(KordPreview::class)
override fun toRequest(): MultiPartWebhookExecuteRequest {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
)
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -14,7 +16,7 @@ import java.io.InputStream
*/
internal class MessageModifyStateHolder {

var files: Optional<MutableList<Pair<String, InputStream>>> = Optional.Missing()
var files: Optional<MutableList<NamedFile>> = Optional.Missing()

var content: Optional<String?> = Optional.Missing()

Expand All @@ -24,6 +26,7 @@ internal class MessageModifyStateHolder {

var allowedMentions: Optional<AllowedMentionsBuilder> = Optional.Missing()

var attachments: Optional<MutableList<DiscordAttachment>> = Optional.Missing()

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

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -14,11 +16,13 @@ interface PersistentMessageModifyBuilder : MessageModifyBuilder {
/**
* The files to include as attachments
*/
var files: MutableList<Pair<String, InputStream>>?
var files: MutableList<NamedFile>?

var attachments: MutableList<DiscordAttachment>?

fun addFile(name: String, content: InputStream) {
files = (files ?: mutableListOf()).also {
it.add(name to content)
it.add(NamedFile(name, content))
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -21,7 +23,9 @@ class PublicFollowupMessageModifyBuilder

private var state = MessageModifyStateHolder()

override var files: MutableList<Pair<String, InputStream>>? by state::files.delegate()
override var files: MutableList<NamedFile>? by state::files.delegate()

override var attachments: MutableList<DiscordAttachment>? by state::attachments.delegate()

override var content: String? by state::content.delegate()

Expand All @@ -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
)
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -21,7 +21,9 @@ class PublicInteractionResponseModifyBuilder

private var state = MessageModifyStateHolder()

override var files: MutableList<Pair<String, InputStream>>? by state::files.delegate()
override var files: MutableList<NamedFile>? by state::files.delegate()

override var attachments: MutableList<DiscordAttachment>? by state::attachments.delegate()

override var content: String? by state::content.delegate()

Expand All @@ -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
)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<MultipartInteractionResponseCreateRequest> {

private var state = MessageModifyStateHolder()

override var files: MutableList<Pair<String, InputStream>>? by state::files.delegate()
override var files: MutableList<NamedFile> = mutableListOf()

override var content: String? by state::content.delegate()
override var content: String? = null

override var embeds: MutableList<EmbedBuilder>? by state::embeds.delegate()
override var tts: Boolean? = null

override var allowedMentions: AllowedMentionsBuilder? by state::allowedMentions.delegate()
override var embeds: MutableList<EmbedBuilder> = mutableListOf()

override var components: MutableList<MessageComponentBuilder>? by state::components.delegate()
override var allowedMentions: AllowedMentionsBuilder? = null

override var components: MutableList<MessageComponentBuilder> = 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)
)

}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
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,
RequestBuilder<MultipartMessagePatchRequest> {

private var state = MessageModifyStateHolder()

override var files: MutableList<Pair<String, InputStream>>? by state::files.delegate()
override var files: MutableList<NamedFile>? by state::files.delegate()

override var attachments: MutableList<DiscordAttachment>? by state::attachments.delegate()

override var content: String? by state::content.delegate()

Expand All @@ -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,
)
Expand Down
Loading

0 comments on commit a9f36c0

Please sign in to comment.