aboutsummaryrefslogtreecommitdiff
path: root/ingame/src/main/kotlin/moe/nea89/sbdata/Commands.kt
blob: e4eff174bb1f981c80ec9d82b635a4a036f1e73e (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
package moe.nea89.sbdata

import net.minecraft.command.CommandBase
import net.minecraft.command.ICommandSender
import net.minecraft.util.BlockPos
import net.minecraft.util.ChatComponentText
import net.minecraft.util.EnumChatFormatting
import net.minecraft.util.IChatComponent

object Commands : CommandBase() {

    fun mkPrefix(text: String?) = "${EnumChatFormatting.AQUA} SBDATA ${text?.let { "$it " } ?: ""}| "

    data class CommandContext(
        val subcommand: String,
        val sender: ICommandSender,
        val allArgs: List<String>,
        val args: List<String>,
    ) {
        val prefix = mkPrefix(subcommand)
        fun reply(vararg lines: String) {
            replyJust(ChatComponentText("").apply {
                lines.forEach {
                    appendSibling(ChatComponentText(prefix))
                    appendText(it + "\n")
                }
            })
        }

        fun replyJust(component: IChatComponent) {
            sender.addChatMessage(component)
        }

        fun reply(vararg lines: IChatComponent) {
            replyJust(ChatComponentText("").apply {
                lines.forEach {
                    appendSibling(ChatComponentText(prefix))
                    appendSibling(it)
                    appendText("\n")
                }
            })
        }
    }

    val subcommands = mutableMapOf<String, CommandContext.() -> Unit>()

    override fun getRequiredPermissionLevel(): Int = 0
    override fun getCommandName(): String = "sbdata"

    override fun getCommandUsage(p0: ICommandSender): String =
        "SubCommands: ${subcommands.keys.joinToString(separator = ", ")}"

    override fun getCommandAliases(): List<String> = listOf("sbd")

    override fun canCommandSenderUseCommand(p0: ICommandSender): Boolean = true

    override fun processCommand(p0: ICommandSender, p1: Array<out String>) {
        if (p1.isEmpty()) {
            p0.addChatMessage(ChatComponentText(mkPrefix(null)).appendText("Please provide a subcommand!"))
        } else {
            val subcommandName = p1[0]
            val subcommand = subcommands[subcommandName]
            if (subcommand == null) {
                p0.addChatMessage(ChatComponentText(mkPrefix(null)).appendText("Unknown subcommand $subcommandName!"))
            } else {
                subcommand(CommandContext(subcommandName, p0, p1.toList(), p1.slice(1 until p1.size)))
            }
        }
    }

    override fun addTabCompletionOptions(
        p0: ICommandSender?,
        p1: Array<out String>?,
        p2: BlockPos?
    ): MutableList<String> {
        return mutableListOf()
    }


    fun addSubCommand(name: String, exec: CommandContext.() -> Unit) {
        if (name in subcommands) {
            println("Duplicate subcommand registered in sbdata: $name")
        }
        subcommands[name] = exec
    }

}