Skip to content

Commit 9a99e55

Browse files
Added alias cooldowns
1 parent e51b72a commit 9a99e55

File tree

5 files changed

+58
-9
lines changed

5 files changed

+58
-9
lines changed

src/main/kotlin/de/randombyte/commandutils/CommandUtils.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ class CommandUtils @Inject constructor(
5858
private val configManager = ConfigManager(
5959
configLoader = configurationLoader,
6060
clazz = Config::class.java,
61-
hyphenSeparatedKeys = true
61+
hyphenSeparatedKeys = true,
62+
simpleDateSerialization = true,
63+
simpleDurationSerialization = true
6264
)
6365

6466
private lateinit var config: Config

src/main/kotlin/de/randombyte/commandutils/Config.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.randombyte.commandutils
22

33
import de.randombyte.commandutils.alias.AliasConfig
4+
import de.randombyte.commandutils.alias.LastAliasExecutionsConfig
45
import de.randombyte.commandutils.executeonserverstartup.ExecuteOnServerStartupConfig
56
import ninja.leaping.configurate.objectmapping.Setting
67
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable
@@ -10,7 +11,8 @@ import java.util.*
1011
data class Config(
1112
@Setting val executeWhenOnline: ExecuteWhenOnline = Config.ExecuteWhenOnline(),
1213
@Setting val alias: AliasConfig = AliasConfig(),
13-
@Setting val executeOnServerStartup: ExecuteOnServerStartupConfig = ExecuteOnServerStartupConfig()
14+
@Setting val executeOnServerStartup: ExecuteOnServerStartupConfig = ExecuteOnServerStartupConfig(),
15+
@Setting val lastAliasExecutionsConfig: LastAliasExecutionsConfig = LastAliasExecutionsConfig()
1416
) {
1517
@ConfigSerializable
1618
data class ExecuteWhenOnline(

src/main/kotlin/de/randombyte/commandutils/alias/AliasConfig.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package de.randombyte.commandutils.alias
22

33
import ninja.leaping.configurate.objectmapping.Setting
44
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable
5+
import java.time.Duration
56

67
@ConfigSerializable
78
class AliasConfig(
@@ -10,7 +11,8 @@ class AliasConfig(
1011
@ConfigSerializable
1112
class Alias(
1213
@Setting val permission: String = "",
13-
@Setting val commands: List<String> = emptyList()
14+
@Setting val commands: List<String> = emptyList(),
15+
@Setting val cooldown: Duration? = null
1416
)
1517

1618
constructor() : this(
@@ -19,8 +21,9 @@ class AliasConfig(
1921
permission = "example.permission",
2022
commands = listOf(
2123
"*say Executed alias with argument {0}",
22-
"*give \$s minecraft:cookie 3"
23-
)
24+
"*give \$p minecraft:cookie 3"
25+
),
26+
cooldown = null
2427
)
2528
)
2629
)

src/main/kotlin/de/randombyte/commandutils/alias/CommandListener.kt

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,69 @@ package de.randombyte.commandutils.alias
33
import de.randombyte.commandutils.ConfigAccessor
44
import de.randombyte.commandutils.execute
55
import de.randombyte.commandutils.executeForPlayer
6+
import de.randombyte.kosp.config.serializers.duration.SimpleDurationTypeSerializer
7+
import de.randombyte.kosp.extensions.red
68
import de.randombyte.kosp.extensions.toText
79
import org.slf4j.Logger
810
import org.spongepowered.api.command.CommandSource
911
import org.spongepowered.api.entity.living.player.Player
1012
import org.spongepowered.api.event.Listener
1113
import org.spongepowered.api.event.command.SendCommandEvent
1214
import org.spongepowered.api.event.filter.cause.First
15+
import java.time.Instant
16+
import java.util.*
1317

1418
class CommandListener(
1519
val logger: Logger,
1620
val configAccessor: ConfigAccessor
1721
) {
1822
@Listener
1923
fun onCommand(event: SendCommandEvent, @First commandSource: CommandSource) {
24+
val config = configAccessor.get()
25+
2026
val wholeCommand = event.wholeCommand
21-
val matchedAliasedMap = configAccessor.get().alias.aliases.mapNotNull { (alias, aliasConfig) ->
27+
val matchedAliasedMap = config.alias.aliases.mapNotNull { (alias, aliasConfig) ->
2228
(alias to aliasConfig) to (AliasParser.parse(alias, wholeCommand) ?: return@mapNotNull null)
2329
}.toList()
2430

2531
if (matchedAliasedMap.isEmpty()) return // doesn't match any of our aliases
2632

33+
event.isCancelled = true
34+
2735
if (matchedAliasedMap.size > 1) {
2836
val matchedAliasesString = matchedAliasedMap.joinToString(separator = ", ", prefix = "[", postfix = "]", transform = { "'${it.first.first}'" })
2937
logger.error("More than one alias matched! command: '$wholeCommand'; matched aliases: $matchedAliasesString")
3038
throw IllegalArgumentException("More than one alias matched, report to admin!")
3139
}
3240

3341
val (aliasEntry, arguments) = matchedAliasedMap.single()
34-
val (_, aliasConfig) = aliasEntry
42+
val (alias, aliasConfig) = aliasEntry
3543
if (!commandSource.hasPermission(aliasConfig.permission)) {
3644
commandSource.sendMessage("You don't have the permission to execute this command!".toText())
3745
return
3846
}
3947

48+
if (aliasConfig.cooldown != null && commandSource is Player) {
49+
val lastExecution = config.lastAliasExecutionsConfig.get(commandSource.uniqueId, alias)
50+
if (lastExecution != null) {
51+
val remainingCooldown = config.lastAliasExecutionsConfig.remainingCooldown(lastExecution, aliasConfig.cooldown)
52+
if (!remainingCooldown.isNegative) {
53+
val cooldownString = SimpleDurationTypeSerializer.serialize(remainingCooldown, outputMilliseconds = false)
54+
commandSource.sendMessage("The cooldown for this command is still up! Wait another $cooldownString.".red())
55+
return
56+
}
57+
}
58+
59+
val newLastExecutionsConfig = config.lastAliasExecutionsConfig.add(commandSource.uniqueId, alias, Date.from(Instant.now()))
60+
configAccessor.save(config.copy(lastAliasExecutionsConfig = newLastExecutionsConfig))
61+
}
62+
4063
aliasConfig.commands.forEach {
4164
var modifiedWholeCommand = it
4265
arguments.forEach { (parameter, argument) -> modifiedWholeCommand = modifiedWholeCommand.replace(parameter, argument) }
4366
if (commandSource is Player) executeForPlayer(modifiedWholeCommand, commandSource)
4467
else execute(modifiedWholeCommand, commandSource)
4568
}
46-
47-
event.isCancelled = true
4869
}
4970

5071
private val SendCommandEvent.wholeCommand: String
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package de.randombyte.commandutils.alias
2+
3+
import ninja.leaping.configurate.objectmapping.Setting
4+
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable
5+
import java.time.Duration
6+
import java.time.Instant
7+
import java.util.*
8+
9+
@ConfigSerializable
10+
data class LastAliasExecutionsConfig(
11+
@Setting val aliases: Map<UUID, Map<String, Date>> = emptyMap()
12+
) {
13+
fun add(player: UUID, alias: String, date: Date): LastAliasExecutionsConfig {
14+
val newPlayerCooldowns = (aliases[player] ?: emptyMap()).plus(alias to date)
15+
return copy(aliases = aliases.plus(player to newPlayerCooldowns))
16+
}
17+
18+
fun get(player: UUID, alias: String): Date? = aliases[player]?.get(alias)
19+
20+
fun remainingCooldown(lastExecution: Date, cooldown: Duration) = Duration.ofMillis(lastExecution.time + cooldown.toMillis() - Date.from(Instant.now()).time)
21+
}

0 commit comments

Comments
 (0)