summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/command/ParcelOptionsInteractCommand.kt
blob: fbe4333e0dd0c93d10558684f617ceed971e1c64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package io.dico.parcels2.command

import io.dico.dicore.command.*
import io.dico.dicore.command.parameter.type.ParameterTypes
import io.dico.parcels2.Interactables
import io.dico.parcels2.ParcelsPlugin
import io.dico.parcels2.Privilege
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player

class ParcelOptionsInteractCommand(val plugin: ParcelsPlugin) : Command() {

    init {
        setShortDescription("View and/or change the setting")
        setDescription(shortDescription)
        addContextFilter(IContextFilter.PLAYER_ONLY)
        addContextFilter(IContextFilter.INHERIT_PERMISSIONS)
        addParameter("allowed", "new setting", ParameterTypes.BOOLEAN)
        requiredParameters(0)
    }

    override fun execute(sender: CommandSender, context: ExecutionContext): String? {
        if (!plugin.storage.isConnected) err("Parcels cannot have their options changed right now because of a database error")

        val interactableClass = Interactables[context.address.mainKey]
        val allowed: Boolean? = context.get("allowed")

        val parcel = plugin.parcelProvider.getParcelRequired(sender as Player,
            if (allowed == null) Privilege.DEFAULT else Privilege.CAN_MANAGE)

        if (allowed == null) {
            val setting = parcel.interactableConfig.isInteractable(interactableClass)
            val default = setting == interactableClass.interactableByDefault

            val canColor = context.address.chatHandler.getChatFormatForType(EMessageType.BAD_NEWS)
            val cannotColor = context.address.chatHandler.getChatFormatForType(EMessageType.GOOD_NEWS)
            val resetColor = context.address.chatHandler.getChatFormatForType(EMessageType.RESULT)

            val settingString = (if (setting) "${canColor}can" else "${cannotColor}cannot") + resetColor
            val defaultString = if (default) " (default)" else ""

            return "Players $settingString interact with ${interactableClass.name} on this parcel$defaultString"
        }

        val change = parcel.interactableConfig.setInteractable(interactableClass, allowed)

        val interactableClassName = interactableClass.name
        return when {
            allowed && change -> "Other players can now interact with $interactableClassName"
            allowed && !change -> err("Other players could already interact with $interactableClassName")
            change -> "Other players can not interact with $interactableClassName anymore"
            else -> err("Other players were not allowed to interact with $interactableClassName")
        }
    }

}