summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/command/CommandsAdminPrivilegesGlobal.kt
blob: cee3e629c5c93d1d0f34295fdef933a7c9159230 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
@file:Suppress("NON_EXHAUSTIVE_WHEN")

package io.dico.parcels2.command

import io.dico.dicore.command.ExecutionContext
import io.dico.dicore.command.Validate
import io.dico.dicore.command.annotation.Cmd
import io.dico.dicore.command.annotation.Desc
import io.dico.parcels2.*
import io.dico.parcels2.Privilege.BANNED
import io.dico.parcels2.Privilege.CAN_BUILD
import io.dico.parcels2.PrivilegeChangeResult.*
import io.dico.parcels2.defaultimpl.InfoBuilder
import io.dico.parcels2.util.ext.PERM_ADMIN_MANAGE
import org.bukkit.OfflinePlayer

class CommandsAdminPrivilegesGlobal(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
    private val data
        inline get() = plugin.globalPrivileges

    private fun checkContext(context: ExecutionContext, owner: OfflinePlayer, changing: Boolean = true): OfflinePlayer {
        if (changing) {
            checkConnected("have privileges changed")
        }
        val sender = context.sender
        if (sender !== owner) {
            Validate.isAuthorized(sender, PERM_ADMIN_MANAGE)
        }
        return owner
    }

    @Cmd("list", aliases = ["l"])
    @Desc(
        "List globally declared privileges, players you",
        "allowed to build on or banned from all your parcels",
        shortVersion = "lists globally declared privileges"
    )
    fun cmdList(context: ExecutionContext, owner: OfflinePlayer): Any? {
        checkContext(context, owner, changing = false)
        val map = plugin.globalPrivileges[owner]
        Validate.isTrue(map.hasAnyDeclaredPrivileges(), "This user has not declared any global privileges")

        return StringBuilder().apply {
            with(InfoBuilder) {
                appendProfilesWithPrivilege("Globally Allowed", map, null, CAN_BUILD)
                appendProfilesWithPrivilege("Globally Banned", map, null, BANNED)
            }
        }.toString()
    }

    @Cmd("entrust")
    @Desc(
        "Allows a player to manage globally",
        shortVersion = "allows a player to manage globally"
    )
    suspend fun cmdEntrust(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
        when (data[checkContext(context, owner)].allowManage(toPrivilegeKey(player))) {
            FAIL_OWNER -> err("The target cannot be the owner themselves")
            FAIL -> err("${player.name} is already allowed to manage globally")
            SUCCESS -> "${player.name} is now allowed to manage globally"
        }

    @Cmd("distrust")
    @Desc(
        "Disallows a player to manage globally,",
        "they will still be able to build",
        shortVersion = "disallows a player to manage globally"
    )
    suspend fun cmdDistrust(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
        when (data[checkContext(context, owner)].disallowManage(toPrivilegeKey(player))) {
            FAIL_OWNER -> err("The target cannot be the owner themselves")
            FAIL -> err("${player.name} is not currently allowed to manage globally")
            SUCCESS -> "${player.name} is not allowed to manage globally anymore"
        }

    @Cmd("allow", aliases = ["add", "permit"])
    @Desc(
        "Globally allows a player to build on all",
        "the parcels that you own.",
        shortVersion = "globally allows a player to build on your parcels"
    )
    suspend fun cmdAllow(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
        when (data[checkContext(context, owner)].allowBuild(toPrivilegeKey(player))) {
            FAIL_OWNER -> err("The target cannot be the owner themselves")
            FAIL -> err("${player.name} is already allowed globally")
            SUCCESS -> "${player.name} is now allowed to build globally"
        }

    @Cmd("disallow", aliases = ["remove", "forbid"])
    @Desc(
        "Globally disallows a player to build on",
        "the parcels that you own.",
        "If the player is allowed to build on specific",
        "parcels, they can still build there.",
        shortVersion = "globally disallows a player to build on your parcels"
    )
    suspend fun cmdDisallow(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
        when (data[checkContext(context, owner)].disallowBuild(toPrivilegeKey(player))) {
            FAIL_OWNER -> err("The target cannot be the owner themselves")
            FAIL -> err("${player.name} is not currently allowed globally")
            SUCCESS -> "${player.name} is not allowed to build globally anymore"
        }

    @Cmd("ban", aliases = ["deny"])
    @Desc(
        "Globally bans a player from all the parcels",
        "that you own, making them unable to enter.",
        shortVersion = "globally bans a player from your parcels"
    )
    suspend fun cmdBan(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
        when (data[checkContext(context, owner)].disallowEnter(toPrivilegeKey(player))) {
            FAIL_OWNER -> err("The target cannot be the owner themselves")
            FAIL -> err("${player.name} is already banned globally")
            SUCCESS -> "${player.name} is now banned globally"
        }

    @Cmd("unban", aliases = ["undeny"])
    @Desc(
        "Globally unbans a player from all the parcels",
        "that you own, they can enter again.",
        "If the player is banned from specific parcels,",
        "they will still be banned there.",
        shortVersion = "globally unbans a player from your parcels"
    )
    suspend fun cmdUnban(context: ExecutionContext, owner: OfflinePlayer, player: PlayerProfile): Any? =
        when (data[checkContext(context, owner)].allowEnter(toPrivilegeKey(player))) {
            FAIL_OWNER -> err("The target cannot be the owner themselves")
            FAIL -> err("${player.name} is not currently banned globally")
            SUCCESS -> "${player.name} is not banned globally anymore"
        }

}