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

Update low-level APIs for mutes #448

Merged
merged 3 commits into from
Dec 23, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion common/src/main/kotlin/entity/Member.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package dev.kord.common.entity
import dev.kord.common.entity.optional.Optional
import dev.kord.common.entity.optional.OptionalBoolean
import dev.kord.common.entity.optional.OptionalSnowflake
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand All @@ -23,6 +24,8 @@ data class DiscordGuildMember(
val mute: OptionalBoolean = OptionalBoolean.Missing,
val pending: OptionalBoolean = OptionalBoolean.Missing,
val avatar: Optional<String?> = Optional.Missing(),
@SerialName("communication_disabled_until")
val communicationDisabledUntil: Optional<Instant?> = Optional.Missing()
)


Expand All @@ -42,6 +45,8 @@ data class DiscordInteractionGuildMember(
val permissions: Permissions,
val pending: OptionalBoolean = OptionalBoolean.Missing,
val avatar: Optional<String?> = Optional.Missing(),
@SerialName("communication_disabled_until")
val communicationDisabledUntil: Optional<Instant?> = Optional.Missing()
)


Expand All @@ -64,6 +69,8 @@ data class DiscordAddedGuildMember(
val guildId: Snowflake,
val pending: OptionalBoolean = OptionalBoolean.Missing,
val avatar: Optional<String?> = Optional.Missing(),
@SerialName("communication_disabled_until")
val communicationDisabledUntil: Optional<Instant?> = Optional.Missing()
)

@Serializable
Expand All @@ -86,6 +93,8 @@ data class DiscordUpdatedGuildMember(
val premiumSince: Optional<String?> = Optional.Missing(),
val pending: OptionalBoolean = OptionalBoolean.Missing,
val avatar: Optional<String?> = Optional.Missing(),
@SerialName("communication_disabled_until")
val communicationDisabledUntil: Optional<Instant?> = Optional.Missing()
)

@Serializable
Expand All @@ -96,4 +105,4 @@ data class DiscordThreadMember(
@SerialName("join_timestamp")
val joinTimestamp: String,
val flags: Int
)
)
4 changes: 3 additions & 1 deletion common/src/main/kotlin/entity/Permission.kt
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ sealed class Permission(val code: DiscordBitSet) {
object CreatePublicThreads : Permission(0x0800000000)
object CreatePrivateThreads : Permission(0x1000000000)
object SendMessagesInThreads : Permission(0x4000000000)
object ModerateMembers : Permission(0x0000010000000000)
object All : Permission(values.fold(EmptyBitSet()) { acc, value -> acc.add(value.code); acc })

companion object {
Expand Down Expand Up @@ -200,7 +201,8 @@ sealed class Permission(val code: DiscordBitSet) {
ManageThreads,
CreatePublicThreads,
CreatePrivateThreads,
SendMessagesInThreads
SendMessagesInThreads,
ModerateMembers
)
}
}
49 changes: 44 additions & 5 deletions core/src/main/kotlin/cache/data/MemberData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import dev.kord.cache.api.data.description
import dev.kord.common.entity.*
import dev.kord.common.entity.optional.Optional
import dev.kord.common.entity.optional.OptionalBoolean
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable

private val MemberData.id get() = "$userId$guildId"
Expand All @@ -18,28 +19,66 @@ public data class MemberData(
val joinedAt: String,
val premiumSince: Optional<String?> = Optional.Missing(),
val pending: OptionalBoolean = OptionalBoolean.Missing,
val avatar: Optional<String?> = Optional.Missing()
val avatar: Optional<String?> = Optional.Missing(),
val communicationDisabledUntil: Optional<Instant?> = Optional.Missing()
) {

public companion object {
public val description: DataDescription<MemberData, String> = description(MemberData::id)

public fun from(userId: Snowflake, guildId: Snowflake, entity: DiscordGuildMember): MemberData = with(entity) {
MemberData(userId = userId, guildId = guildId, nick, roles, joinedAt, premiumSince, avatar = avatar)
MemberData(
userId = userId,
guildId = guildId,
nick,
roles,
joinedAt,
premiumSince,
avatar = avatar,
communicationDisabledUntil = communicationDisabledUntil
)
}


public fun from(userId: Snowflake, guildId: Snowflake, entity: DiscordInteractionGuildMember): MemberData =
with(entity) {
MemberData(userId = userId, guildId = guildId, nick, roles, joinedAt, premiumSince, avatar = avatar)
MemberData(
userId = userId,
guildId = guildId,
nick,
roles,
joinedAt,
premiumSince,
avatar = avatar,
communicationDisabledUntil = communicationDisabledUntil
)
}

public fun from(userId: Snowflake, entity: DiscordAddedGuildMember): MemberData = with(entity) {
MemberData(userId = userId, guildId = guildId, nick, roles, joinedAt, premiumSince, avatar = avatar)
MemberData(
userId = userId,
guildId = guildId,
nick,
roles,
joinedAt,
premiumSince,
avatar = avatar,
communicationDisabledUntil = communicationDisabledUntil
)
}

public fun from(entity: DiscordUpdatedGuildMember): MemberData = with(entity) {
MemberData(userId = user.id, guildId = guildId, nick, roles, joinedAt, premiumSince, pending, avatar = avatar)
MemberData(
userId = user.id,
guildId = guildId,
nick,
roles,
joinedAt,
premiumSince,
pending,
avatar = avatar,
communicationDisabledUntil
)
}

}
Expand Down
5 changes: 5 additions & 0 deletions core/src/main/kotlin/entity/Member.kt
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ public class Member(
*/
public val isPending: Boolean get() = memberData.pending.discordBoolean

/**
* The [Instant] until the user's timeout expires, or `null` if the user does not have a timeout.
*/
public val communicationDisabledUntil: Instant? get() = memberData.communicationDisabledUntil.value

/**
* Whether this member's [id] equals the [Guild.ownerId].
*
Expand Down
11 changes: 8 additions & 3 deletions rest/src/main/kotlin/builder/member/MemberModifyBuilder.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package dev.kord.rest.builder.member

import dev.kord.rest.builder.AuditRequestBuilder
import dev.kord.common.annotation.KordDsl
import dev.kord.common.entity.Snowflake
import dev.kord.common.entity.optional.Optional
import dev.kord.common.entity.optional.OptionalBoolean
import dev.kord.common.entity.optional.OptionalSnowflake
import dev.kord.common.entity.optional.delegate.delegate
import dev.kord.rest.builder.AuditRequestBuilder
import dev.kord.rest.json.request.GuildMemberModifyRequest
import kotlinx.datetime.Instant

@KordDsl
class MemberModifyBuilder : AuditRequestBuilder<GuildMemberModifyRequest> {
Expand All @@ -25,6 +26,9 @@ class MemberModifyBuilder : AuditRequestBuilder<GuildMemberModifyRequest> {
private var _nickname: Optional<String?> = Optional.Missing()
var nickname: String? by ::_nickname.delegate()

private var _communicationDisabledUntil: Optional<Instant?> = Optional.Missing()
var communicationDisabledUntil: Instant? by ::_communicationDisabledUntil.delegate()

private var _roles: Optional<MutableSet<Snowflake>?> = Optional.Missing()
var roles: MutableSet<Snowflake>? by ::_roles.delegate()

Expand All @@ -33,6 +37,7 @@ class MemberModifyBuilder : AuditRequestBuilder<GuildMemberModifyRequest> {
channelId = _voiceChannelId,
mute = _muted,
deaf = _deafened,
roles = _roles
roles = _roles,
communicationDisabledUntil = _communicationDisabledUntil
)
}
}
5 changes: 5 additions & 0 deletions rest/src/main/kotlin/json/request/GuildRequests.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import dev.kord.common.entity.optional.Optional
import dev.kord.common.entity.optional.OptionalBoolean
import dev.kord.common.entity.optional.OptionalInt
import dev.kord.common.entity.optional.OptionalSnowflake
import kotlinx.datetime.Instant
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.KSerializer
Expand Down Expand Up @@ -108,6 +109,8 @@ data class GuildMemberAddRequest(
val roles: Optional<Set<Snowflake>> = Optional.Missing(),
val mute: OptionalBoolean = OptionalBoolean.Missing,
val deaf: OptionalBoolean = OptionalBoolean.Missing,
@SerialName("communication_disabled_until")
val communicationDisabledUntil: Optional<Instant> = Optional.Missing()
)

@Serializable
Expand All @@ -118,6 +121,8 @@ data class GuildMemberModifyRequest(
val deaf: OptionalBoolean? = OptionalBoolean.Missing,
@SerialName("channel_id")
val channelId: OptionalSnowflake? = OptionalSnowflake.Missing,
@SerialName("communication_disabled_until")
val communicationDisabledUntil: Optional<Instant?> = Optional.Missing()
)


Expand Down