aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/features/chat/AutoCompletions.kt
blob: f13fe7e0fd8d97ce8cc862b027e3ad4e46364f53 (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
package moe.nea.firmament.features.chat

import com.mojang.brigadier.Message
import com.mojang.brigadier.arguments.StringArgumentType.string
import com.mojang.brigadier.context.CommandContext
import com.mojang.brigadier.exceptions.BuiltInExceptions
import com.mojang.brigadier.exceptions.CommandExceptionType
import com.mojang.brigadier.exceptions.CommandSyntaxException
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType
import kotlin.concurrent.thread
import net.minecraft.SharedConstants
import net.minecraft.commands.BrigadierExceptions
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.commands.get
import moe.nea.firmament.commands.suggestsList
import moe.nea.firmament.commands.thenArgument
import moe.nea.firmament.commands.thenExecute
import moe.nea.firmament.events.CommandEvent
import moe.nea.firmament.events.MaskCommands
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.data.Config
import moe.nea.firmament.util.data.ManagedConfig
import moe.nea.firmament.util.tr

object AutoCompletions {

	@Config
	object TConfig : ManagedConfig(identifier, Category.CHAT) {
		val provideWarpTabCompletion by toggle("warp-complete") { true }
		val replaceWarpIsByWarpIsland by toggle("warp-is") { true }
	}

	val identifier: String
		get() = "auto-completions"

	@Subscribe
	fun onMaskCommands(event: MaskCommands) {
		if (TConfig.provideWarpTabCompletion) {
			event.mask("warp")
		}
	}

	@Subscribe
	fun onCommandEvent(event: CommandEvent) {
		if (!TConfig.provideWarpTabCompletion) return
		event.deleteCommand("warp")
		event.register("warp") {
			thenArgument("to", string()) { toArg ->
				suggestsList {
					RepoManager.neuRepo.constants?.islands?.warps?.flatMap { listOf(it.warp) + it.aliases } ?: listOf()
				}
				thenExecute {
					val warpName = get(toArg)
					if (warpName == "is" && TConfig.replaceWarpIsByWarpIsland) {
						MC.sendCommand("warp island")
					} else {
						redirectToServer()
					}
				}
			}
		}
	}

	fun CommandContext<*>.redirectToServer() {
		val message = tr(
			"firmament.warp.auto-complete.internal-throw",
			"This is an internal syntax exception that should not show up in gameplay, used to pass on a command to the server"
		)
		throw CommandSyntaxException(CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownCommand(), message)
	}
}