Skip to content

Commit

Permalink
refactor followup messages
Browse files Browse the repository at this point in the history
  • Loading branch information
HopeBaron committed Feb 12, 2022
1 parent f810972 commit 992fac9
Show file tree
Hide file tree
Showing 25 changed files with 273 additions and 195 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ package dev.kord.core.behavior.interaction

import dev.kord.common.entity.Snowflake
import dev.kord.core.Kord
import dev.kord.core.behavior.interaction.response.EphemeralInteractionResponseBehavior
import dev.kord.core.behavior.interaction.response.EphemeralMessageInteractionResponseBehavior
import dev.kord.core.behavior.interaction.response.PublicInteractionResponseBehavior
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
import dev.kord.core.entity.Message
import dev.kord.core.exception.EntityNotFoundException
import dev.kord.core.supplier.EntitySupplier
Expand All @@ -23,9 +27,9 @@ public interface ActionInteractionBehavior : InteractionBehavior {
*
* @return [EphemeralInteractionResponseBehavior] Ephemeral acknowledgement of the interaction.
*/
public suspend fun acknowledgeEphemeral(): EphemeralInteractionResponseBehavior {
public suspend fun acknowledgeEphemeral(): EphemeralMessageInteractionResponseBehavior {
kord.rest.interaction.acknowledge(id, token, ephemeral = true)
return EphemeralInteractionResponseBehavior(applicationId, token, kord)
return EphemeralMessageInteractionResponseBehavior(applicationId, token, kord)
}

/**
Expand All @@ -35,7 +39,7 @@ public interface ActionInteractionBehavior : InteractionBehavior {
*/
public suspend fun acknowledgePublic(): PublicInteractionResponseBehavior {
kord.rest.interaction.acknowledge(id, token, ephemeral = false)
return PublicInteractionResponseBehavior(applicationId, token, kord)
return PublicMessageInteractionResponseBehavior(applicationId, token, kord)
}

/**
Expand Down Expand Up @@ -68,7 +72,7 @@ public suspend inline fun ActionInteractionBehavior.respondPublic(
): PublicInteractionResponseBehavior {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }
kord.rest.interaction.createInteractionResponse(id, token, ephemeral = false, builder)
return PublicInteractionResponseBehavior(applicationId, token, kord)
return PublicMessageInteractionResponseBehavior(applicationId, token, kord)
}


Expand All @@ -83,7 +87,7 @@ public suspend inline fun ActionInteractionBehavior.respondEphemeral(
): EphemeralInteractionResponseBehavior {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }
kord.rest.interaction.createInteractionResponse(id, token, ephemeral = true, builder)
return EphemeralInteractionResponseBehavior(applicationId, token, kord)
return EphemeralMessageInteractionResponseBehavior(applicationId, token, kord)
}

public fun InteractionBehavior(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package dev.kord.core.behavior.interaction

import dev.kord.common.entity.Snowflake
import dev.kord.core.Kord
import dev.kord.core.behavior.interaction.response.PopupInteractionResponseBehavior
import dev.kord.core.supplier.EntitySupplier
import dev.kord.rest.builder.interaction.ModalBuilder
import kotlin.contracts.InvocationKind
Expand Down Expand Up @@ -38,8 +39,8 @@ internal fun ApplicationCommandInteractionBehavior(

}

public inline suspend fun ApplicationCommandInteractionBehavior.modal(title: String, customId: String,builder: ModalBuilder.() -> Unit): PublicInteractionResponseBehavior {
public inline suspend fun ApplicationCommandInteractionBehavior.modal(title: String, customId: String,builder: ModalBuilder.() -> Unit): PopupInteractionResponseBehavior {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }
kord.rest.interaction.createModalInteractionResponse(id, token,title, customId, builder)
return PublicInteractionResponseBehavior(applicationId, token, kord)
return PopupInteractionResponseBehavior(applicationId, token, kord)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import dev.kord.common.entity.MessageFlags
import dev.kord.common.entity.Snowflake
import dev.kord.common.entity.optional.Optional
import dev.kord.core.Kord
import dev.kord.core.behavior.interaction.response.EphemeralInteractionResponseBehavior
import dev.kord.core.behavior.interaction.response.EphemeralMessageInteractionResponseBehavior
import dev.kord.core.behavior.interaction.response.PopupInteractionResponseBehavior
import dev.kord.core.behavior.interaction.response.PublicMessageInteractionResponseBehavior
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy
import dev.kord.rest.builder.interaction.ModalBuilder
Expand All @@ -29,14 +33,14 @@ public interface ComponentInteractionBehavior : ActionInteractionBehavior {
* on public and ephemeral messages. The only difference is in the **followUp** calls,
* which will become public or ephemeral respectively.
*/
public suspend fun acknowledgePublicDeferredMessageUpdate(): PublicInteractionResponseBehavior {
public suspend fun acknowledgePublicDeferredMessageUpdate(): PublicMessageInteractionResponseBehavior {
val request = InteractionResponseCreateRequest(
type = InteractionResponseType.DeferredUpdateMessage
)

kord.rest.interaction.createInteractionResponse(id, token, request)

return PublicInteractionResponseBehavior(applicationId, token, kord)
return PublicMessageInteractionResponseBehavior(applicationId, token, kord)
}

/**
Expand All @@ -50,7 +54,7 @@ public interface ComponentInteractionBehavior : ActionInteractionBehavior {
* on public and ephemeral messages. The only difference is in the **followUp** calls,
* which will become ephemeral or public respectively.
*/
public suspend fun acknowledgeEphemeralDeferredMessageUpdate(): EphemeralInteractionResponseBehavior {
public suspend fun acknowledgeEphemeralDeferredMessageUpdate(): EphemeralMessageInteractionResponseBehavior {
val request = InteractionResponseCreateRequest(
data = Optional.Value(
InteractionApplicationCommandCallbackData(
Expand All @@ -62,7 +66,7 @@ public interface ComponentInteractionBehavior : ActionInteractionBehavior {

kord.rest.interaction.createInteractionResponse(id, token, request)

return EphemeralInteractionResponseBehavior(applicationId, token, kord)
return EphemeralMessageInteractionResponseBehavior(applicationId, token, kord)
}


Expand All @@ -72,10 +76,10 @@ public interface ComponentInteractionBehavior : ActionInteractionBehavior {

}

public inline suspend fun ComponentInteractionBehavior.modal(title: String, customId: String, builder: ModalBuilder.() -> Unit): PublicInteractionResponseBehavior {
public suspend inline fun ComponentInteractionBehavior.modal(title: String, customId: String, builder: ModalBuilder.() -> Unit): PopupInteractionResponseBehavior {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }
kord.rest.interaction.createModalInteractionResponse(id, token,title, customId, builder)
return PublicInteractionResponseBehavior(applicationId, token, kord)
return PopupInteractionResponseBehavior(applicationId, token, kord)
}

/**
Expand Down Expand Up @@ -120,7 +124,7 @@ public fun ComponentInteractionBehavior(
*/
public suspend fun ComponentInteractionBehavior.acknowledgePublicUpdateMessage(
builder: UpdateMessageInteractionResponseCreateBuilder.() -> Unit
): PublicInteractionResponseBehavior {
): PublicMessageInteractionResponseBehavior {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }

val request = UpdateMessageInteractionResponseCreateBuilder().apply(builder).toRequest()
Expand All @@ -131,7 +135,7 @@ public suspend fun ComponentInteractionBehavior.acknowledgePublicUpdateMessage(
request.copy(request = request.request.copy(InteractionResponseType.UpdateMessage))
)

return PublicInteractionResponseBehavior(applicationId, token, kord)
return PublicMessageInteractionResponseBehavior(applicationId, token, kord)
}

/**
Expand All @@ -155,5 +159,5 @@ public suspend fun ComponentInteractionBehavior.acknowledgeEphemeralUpdateMessag
request
)

return EphemeralInteractionResponseBehavior(applicationId, token, kord)
return EphemeralMessageInteractionResponseBehavior(applicationId, token, kord)
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package behavior.interaction.followup
package dev.kord.core.behavior.interaction.followup

import dev.kord.common.entity.Snowflake
import dev.kord.core.Kord
import dev.kord.core.cache.data.toData
import dev.kord.core.entity.Message
import dev.kord.core.entity.interaction.EphemeralFollowupMessage
import dev.kord.core.entity.interaction.followup.EphemeralFollowupMessage
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy
import dev.kord.rest.builder.message.modify.FollowupMessageModifyBuilder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package behavior.interaction.followup
package dev.kord.core.behavior.interaction.followup

import dev.kord.common.entity.MessageFlag
import dev.kord.common.entity.Snowflake
Expand All @@ -8,9 +8,9 @@ import dev.kord.core.entity.KordEntity
import dev.kord.core.entity.Message
import dev.kord.core.entity.Strategizable
import dev.kord.core.entity.channel.MessageChannel
import dev.kord.core.entity.interaction.EphemeralFollowupMessage
import dev.kord.core.entity.interaction.FollowupMessage
import dev.kord.core.entity.interaction.PublicFollowupMessage
import dev.kord.core.entity.interaction.followup.EphemeralFollowupMessage
import dev.kord.core.entity.interaction.followup.FollowupMessage
import dev.kord.core.entity.interaction.followup.PublicFollowupMessage
import dev.kord.core.supplier.getChannelOf
import dev.kord.core.supplier.getChannelOfOrNull
import dev.kord.rest.builder.message.modify.FollowupMessageModifyBuilder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package behavior.interaction.followup
package dev.kord.core.behavior.interaction.followup

import dev.kord.common.entity.Snowflake
import dev.kord.core.Kord
import dev.kord.core.cache.data.toData
import dev.kord.core.entity.Message
import dev.kord.core.entity.interaction.PublicFollowupMessage
import dev.kord.core.entity.interaction.followup.PublicFollowupMessage
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy
import dev.kord.rest.builder.message.modify.FollowupMessageModifyBuilder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,7 @@
package behavior.interaction.response

import dev.kord.common.entity.Snowflake
import dev.kord.core.Kord
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy
package dev.kord.core.behavior.interaction.response

/**
* The behavior of an ephemeral [Discord ActionInteraction Response](https://discord.com/developers/docs/interactions/slash-commands#interaction-response)
* This response is visible to *only* to the user who made the interaction.
*/
public interface EphemeralInteractionResponseBehavior : InteractionResponseBehavior {

override fun withStrategy(strategy: EntitySupplyStrategy<*>): EphemeralInteractionResponseBehavior =
EphemeralInteractionResponseBehavior(applicationId, token, kord, strategy)
}


public fun EphemeralInteractionResponseBehavior(
applicationId: Snowflake,
token: String,
kord: Kord,
strategy: EntitySupplyStrategy<*> = kord.resources.defaultStrategy,
): EphemeralInteractionResponseBehavior =
object : EphemeralInteractionResponseBehavior {
override val applicationId: Snowflake = applicationId

override val token: String = token

override val kord: Kord = kord

override val supplier: EntitySupplier = strategy.supply(kord)
}
public sealed interface EphemeralInteractionResponseBehavior : InteractionResponseBehavior
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package dev.kord.core.behavior.interaction.response


import dev.kord.common.entity.Snowflake
import dev.kord.core.Kord
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy

public interface EphemeralMessageInteractionResponseBehavior : EphemeralInteractionResponseBehavior,
MessageInteractionResponseBehavior {
override fun withStrategy(strategy: EntitySupplyStrategy<*>): EphemeralMessageInteractionResponseBehavior {
return EphemeralMessageInteractionResponseBehavior(applicationId, token, kord, strategy.supply(kord))
}
}


public fun EphemeralMessageInteractionResponseBehavior(
applicationId: Snowflake,
token: String,
kord: Kord,
supplier: EntitySupplier = kord.defaultSupplier,
): EphemeralMessageInteractionResponseBehavior =
object : EphemeralMessageInteractionResponseBehavior {
override val applicationId: Snowflake = applicationId

override val token: String = token

override val kord: Kord = kord

override val supplier: EntitySupplier = supplier
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package behavior.interaction.response
package dev.kord.core.behavior.interaction.response

import dev.kord.common.entity.Snowflake
import dev.kord.core.KordObject
import dev.kord.core.cache.data.toData
import dev.kord.core.entity.Message
import dev.kord.core.entity.Strategizable
import dev.kord.core.entity.interaction.EphemeralFollowupMessage
import dev.kord.core.entity.interaction.PublicFollowupMessage
import dev.kord.core.entity.interaction.followup.EphemeralFollowupMessage
import dev.kord.core.entity.interaction.followup.PublicFollowupMessage
import dev.kord.core.exception.EntityNotFoundException
import dev.kord.rest.builder.message.create.FollowupMessageCreateBuilder
import dev.kord.rest.builder.message.modify.InteractionResponseModifyBuilder
Expand Down Expand Up @@ -58,17 +58,3 @@ public suspend inline fun InteractionResponseBehavior.followUpEphemeral(builder:
return EphemeralFollowupMessage(Message(message.toData(), kord), applicationId, token, kord)
}

/**
* Requests to edit this interaction response.
*
* @return The edited [Message] of the interaction response.
*
* @throws RestRequestException if something went wrong during the request.
*/
public suspend inline fun InteractionResponseBehavior.edit(
builder: InteractionResponseModifyBuilder.() -> Unit,
): Message {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }
val message = kord.rest.interaction.modifyInteractionResponse(applicationId, token, builder)
return Message(message.toData(), kord)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package dev.kord.core.behavior.interaction.response

import dev.kord.core.cache.data.toData
import dev.kord.core.entity.Message
import dev.kord.rest.builder.message.modify.InteractionResponseModifyBuilder
import dev.kord.rest.request.RestRequestException
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract

public sealed interface MessageInteractionResponseBehavior : InteractionResponseBehavior
/**
* Requests to edit this interaction response.
*
* @return The edited [Message] of the interaction response.
*
* @throws RestRequestException if something went wrong during the request.
*/
public suspend inline fun MessageInteractionResponseBehavior.edit(
builder: InteractionResponseModifyBuilder.() -> Unit,
): Message {
contract { callsInPlace(builder, InvocationKind.EXACTLY_ONCE) }
val message = kord.rest.interaction.modifyInteractionResponse(applicationId, token, builder)
return Message(message.toData(), kord)
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package dev.kord.core.behavior.interaction.response

import dev.kord.common.entity.Snowflake
import dev.kord.core.Kord
import dev.kord.core.behavior.interaction.ActionInteractionBehavior
import dev.kord.core.entity.Strategizable
import dev.kord.core.supplier.EntitySupplier
import dev.kord.core.supplier.EntitySupplyStrategy

public interface PopupInteractionResponseBehavior : InteractionResponseBehavior {

override fun withStrategy(strategy: EntitySupplyStrategy<*>): PopupInteractionResponseBehavior {
return PopupInteractionResponseBehavior(applicationId, token, kord, strategy.supply(kord))
}
}


public fun PopupInteractionResponseBehavior(
applicationId: Snowflake,
token: String,
kord: Kord,
supplier: EntitySupplier = kord.defaultSupplier,
): PopupInteractionResponseBehavior =
object : PopupInteractionResponseBehavior {
override val applicationId: Snowflake = applicationId

override val token: String = token

override val kord: Kord = kord

override val supplier: EntitySupplier = supplier
}
Loading

0 comments on commit 992fac9

Please sign in to comment.