Skip to content

Commit c3081c9

Browse files
committed
Synced with MC-1.14.4 branch.
Signed-off-by: Pavel Erokhin (MairwunNx) <[email protected]>
1 parent 796d9d7 commit c3081c9

File tree

11 files changed

+739
-4
lines changed

11 files changed

+739
-4
lines changed

src/main/kotlin/com/mairwunnx/projectessentials/chat/EntryPoint.kt

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.mairwunnx.projectessentials.chat
22

3+
import com.mairwunnx.projectessentials.chat.api.MuteAPI
4+
import com.mairwunnx.projectessentials.chat.commands.*
35
import com.mairwunnx.projectessentials.chat.models.ChatModelUtils
6+
import com.mairwunnx.projectessentials.chat.models.MuteModelUtils
47
import com.mairwunnx.projectessentials.core.EssBase
58
import com.mairwunnx.projectessentials.core.extensions.empty
69
import com.mairwunnx.projectessentials.core.extensions.sendMsg
@@ -14,6 +17,7 @@ import net.minecraftforge.common.MinecraftForge
1417
import net.minecraftforge.event.ServerChatEvent
1518
import net.minecraftforge.eventbus.api.SubscribeEvent
1619
import net.minecraftforge.fml.common.Mod
20+
import net.minecraftforge.fml.event.server.FMLServerStartingEvent
1721
import net.minecraftforge.fml.event.server.FMLServerStoppingEvent
1822
import org.apache.logging.log4j.LogManager
1923

@@ -30,6 +34,7 @@ class EntryPoint : EssBase() {
3034
MinecraftForge.EVENT_BUS.register(this)
3135
loadAdditionalModules()
3236
ChatModelUtils.loadData()
37+
MuteModelUtils.loadData()
3338
}
3439

3540
private fun loadAdditionalModules() {
@@ -40,11 +45,20 @@ class EntryPoint : EssBase() {
4045
} catch (_: ClassNotFoundException) {
4146
// ignored
4247
}
48+
49+
try {
50+
Class.forName(cooldownAPIClassPath)
51+
cooldownInstalled = true
52+
logger.info("Cooldown module found!")
53+
} catch (_: ClassNotFoundException) {
54+
// ignored
55+
}
4356
}
4457

4558
companion object {
4659
lateinit var modInstance: EntryPoint
47-
private var permissionsInstalled: Boolean = false
60+
var permissionsInstalled: Boolean = false
61+
var cooldownInstalled: Boolean = false
4862

4963
fun hasPermission(player: ServerPlayerEntity, node: String, opLevel: Int = 0): Boolean =
5064
if (permissionsInstalled) {
@@ -54,10 +68,20 @@ class EntryPoint : EssBase() {
5468
}
5569
}
5670

71+
@SubscribeEvent
72+
fun onServerStarting(it: FMLServerStartingEvent) {
73+
ClearChatCommand.register(it.commandDispatcher)
74+
MuteCommand.register(it.commandDispatcher)
75+
UnmuteCommand.register(it.commandDispatcher)
76+
UnmuteAllCommand.register(it.commandDispatcher)
77+
MutedPlayersCommand.register(it.commandDispatcher)
78+
}
79+
5780
@Suppress("UNUSED_PARAMETER")
5881
@SubscribeEvent
5982
fun onServerStopping(it: FMLServerStoppingEvent) {
6083
ChatModelUtils.saveData()
84+
MuteModelUtils.saveData()
6185
}
6286

6387
@SubscribeEvent
@@ -86,6 +110,21 @@ class EntryPoint : EssBase() {
86110

87111
@SubscribeEvent
88112
fun onChatMessage(event: ServerChatEvent) {
113+
if (MuteAPI.isInMute(event.username)) {
114+
val mutedBy = MuteAPI.getMuteInitiator(event.username)!!
115+
val reason = MuteAPI.getMuteReason(event.username)!!
116+
117+
sendMsg(
118+
"chat",
119+
event.player.commandSource,
120+
"chat.muted",
121+
mutedBy,
122+
reason.replace(" ", " §7")
123+
)
124+
event.isCanceled = true
125+
return
126+
}
127+
89128
if (!ChatModelUtils.chatModel.messaging.chatEnabled) {
90129
sendMsg("chat", event.player.commandSource, "chat.disabled")
91130
event.isCanceled = true
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.mairwunnx.projectessentials.chat.commands
2+
3+
import com.mairwunnx.projectessentials.chat.EntryPoint
4+
import com.mairwunnx.projectessentials.cooldown.essentials.CommandsAliases
5+
import com.mairwunnx.projectessentials.core.extensions.isPlayerSender
6+
import com.mairwunnx.projectessentials.core.extensions.playerName
7+
import com.mairwunnx.projectessentials.core.extensions.sendMsg
8+
import com.mairwunnx.projectessentials.core.helpers.PERMISSION_LEVEL
9+
import com.mojang.brigadier.CommandDispatcher
10+
import com.mojang.brigadier.arguments.BoolArgumentType
11+
import com.mojang.brigadier.builder.LiteralArgumentBuilder.literal
12+
import com.mojang.brigadier.context.CommandContext
13+
import net.minecraft.client.Minecraft
14+
import net.minecraft.command.CommandSource
15+
import net.minecraft.command.Commands
16+
import net.minecraft.util.text.TextComponentUtils
17+
import net.minecraftforge.api.distmarker.Dist
18+
import net.minecraftforge.fml.DistExecutor
19+
import org.apache.logging.log4j.LogManager
20+
21+
object ClearChatCommand {
22+
private val logger = LogManager.getLogger()
23+
private val aliases = listOf("clearchat", "chat-clear", "chatclear", "cc")
24+
25+
fun register(dispatcher: CommandDispatcher<CommandSource>) {
26+
logger.info("Register \"/clear-chat\" command")
27+
applyAliases()
28+
29+
val literalArgument = literal<CommandSource>("clear-chat").then(
30+
Commands.argument(
31+
"only for you", BoolArgumentType.bool()
32+
).executes {
33+
return@executes execute(it, BoolArgumentType.getBool(it, "only for you"))
34+
}
35+
)
36+
37+
val literalNode = dispatcher.register(literalArgument.executes {
38+
execute(it, false)
39+
})
40+
41+
aliases.forEach { alias ->
42+
dispatcher.register(
43+
Commands.literal(alias).executes { ctx ->
44+
execute(ctx, false)
45+
}.redirect(literalNode)
46+
)
47+
}
48+
}
49+
50+
private fun applyAliases() {
51+
if (!EntryPoint.cooldownInstalled) return
52+
CommandsAliases.aliases["clear-chat"] = aliases.toMutableList()
53+
}
54+
55+
private fun execute(
56+
context: CommandContext<CommandSource>,
57+
clearOnlyForSender: Boolean
58+
): Int {
59+
if (clearOnlyForSender) {
60+
if (context.isPlayerSender()) {
61+
if (EntryPoint.hasPermission(context.source.asPlayer(), "ess.chat.clear", 2)) {
62+
DistExecutor.runWhenOn(Dist.CLIENT) {
63+
Runnable {
64+
Minecraft.getInstance().ingameGUI.chatGUI.clearChatMessages(true)
65+
}
66+
}
67+
} else {
68+
logger.warn(
69+
PERMISSION_LEVEL
70+
.replace("%0", context.playerName())
71+
.replace("%1", "clear-chat")
72+
)
73+
sendMsg("chat", context.source, "chat.clear_restricted")
74+
}
75+
} else {
76+
logger.info("Command with parameter `clearOnlyForSender` can't be executed from server. Type `cls` if you use windows or `/clear` if you use mac os or linux.")
77+
}
78+
} else {
79+
if (!context.isPlayerSender() || EntryPoint.hasPermission(
80+
context.source.asPlayer(),
81+
"ess.chat.clear.other",
82+
3
83+
)
84+
) {
85+
val message = StringBuilder()
86+
repeat(256) {
87+
message.append("\n")
88+
}
89+
90+
context.source.server.playerList.sendMessage(
91+
TextComponentUtils.toTextComponent { message.toString() }
92+
)
93+
94+
if (context.isPlayerSender()) {
95+
DistExecutor.runWhenOn(Dist.CLIENT) {
96+
Runnable {
97+
Minecraft.getInstance().ingameGUI.chatGUI.clearChatMessages(true)
98+
}
99+
}
100+
}
101+
} else {
102+
sendMsg("chat", context.source, "chat.clear_other_restricted")
103+
return 0
104+
}
105+
}
106+
return 0
107+
}
108+
}
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
package com.mairwunnx.projectessentials.chat.commands
2+
3+
import com.mairwunnx.projectessentials.chat.EntryPoint
4+
import com.mairwunnx.projectessentials.chat.api.MuteAPI
5+
import com.mairwunnx.projectessentials.chat.models.ChatModelUtils
6+
import com.mairwunnx.projectessentials.chat.models.MuteModelUtils
7+
import com.mairwunnx.projectessentials.core.extensions.isPlayerSender
8+
import com.mairwunnx.projectessentials.core.extensions.playerName
9+
import com.mairwunnx.projectessentials.core.extensions.sendMsg
10+
import com.mojang.brigadier.CommandDispatcher
11+
import com.mojang.brigadier.arguments.BoolArgumentType
12+
import com.mojang.brigadier.arguments.StringArgumentType
13+
import com.mojang.brigadier.builder.LiteralArgumentBuilder.literal
14+
import com.mojang.brigadier.context.CommandContext
15+
import net.minecraft.command.CommandSource
16+
import net.minecraft.command.Commands
17+
import net.minecraft.command.arguments.EntityArgument
18+
import net.minecraft.entity.player.ServerPlayerEntity
19+
import net.minecraft.util.text.TranslationTextComponent
20+
import org.apache.logging.log4j.LogManager
21+
22+
object MuteCommand {
23+
private val logger = LogManager.getLogger()
24+
25+
private val argument = Commands.argument(
26+
"reason", StringArgumentType.string()
27+
).executes {
28+
return@executes execute(it, StringArgumentType.getString(it, "reason"))
29+
}.then(
30+
Commands.argument(
31+
"override", BoolArgumentType.bool()
32+
).executes {
33+
return@executes execute(
34+
it,
35+
StringArgumentType.getString(it, "reason"),
36+
BoolArgumentType.getBool(it, "override")
37+
)
38+
}
39+
)
40+
41+
fun register(dispatcher: CommandDispatcher<CommandSource>) {
42+
logger.info("Register \"/mute\" command")
43+
44+
dispatcher.register(
45+
literal<CommandSource>("mute")
46+
.then(
47+
Commands.argument(
48+
"player", EntityArgument.player()
49+
).then(argument).executes {
50+
return@executes execute(it)
51+
}
52+
).then(
53+
Commands.argument(
54+
"player name", StringArgumentType.string()
55+
).then(argument).executes {
56+
return@executes execute(it)
57+
}
58+
)
59+
)
60+
}
61+
62+
private fun execute(
63+
context: CommandContext<CommandSource>,
64+
reason: String = ChatModelUtils.chatModel.mute.defaultReason,
65+
override: Boolean = false
66+
): Int {
67+
if (context.isPlayerSender() && !EntryPoint.hasPermission(
68+
context.source.asPlayer(),
69+
"ess.chat.mute",
70+
3
71+
)
72+
) {
73+
sendMsg("chat", context.source, "chat.mute_restricted")
74+
return 0
75+
}
76+
77+
val player = getPlayer(context)
78+
val playerName = getPlayerName(context)
79+
80+
if (player != null) {
81+
if (player.name.string in ChatModelUtils.chatModel.mute.ignoredPlayers) {
82+
sendMsg(
83+
"chat",
84+
context.source,
85+
"chat.mute_failed_player_ignored",
86+
player.name.string
87+
)
88+
return 0
89+
}
90+
91+
val result = MuteAPI.mutePlayer(
92+
player.name.string, context.playerName(), reason, override
93+
)
94+
95+
if (result) {
96+
MuteModelUtils.addPlayer(player.name.string, context.playerName(), reason)
97+
98+
if (ChatModelUtils.chatModel.mute.notifyAllAboutMute) {
99+
context.source.server.playerList.sendMessage(
100+
TranslationTextComponent(
101+
"project_essentials_chat.notify_muted",
102+
player.name.string,
103+
context.playerName(),
104+
reason.replace(" ", " §c")
105+
)
106+
)
107+
}
108+
109+
sendMsg(
110+
"chat",
111+
player.commandSource,
112+
"chat.lol_youre_muted",
113+
context.playerName(),
114+
reason.replace(" ", " §7")
115+
)
116+
sendMsg(
117+
"chat",
118+
context.source,
119+
"chat.mute_success",
120+
player.name.string
121+
)
122+
} else {
123+
sendMsg(
124+
"chat",
125+
context.source,
126+
"chat.mute_failed",
127+
player.name.string
128+
)
129+
}
130+
} else if (playerName != null) {
131+
if (playerName in ChatModelUtils.chatModel.mute.ignoredPlayers) {
132+
sendMsg(
133+
"chat",
134+
context.source,
135+
"chat.mute_failed_player_ignored",
136+
playerName
137+
)
138+
return 0
139+
}
140+
141+
val result = MuteAPI.mutePlayer(
142+
playerName, context.playerName(), reason, override
143+
)
144+
145+
if (result) {
146+
MuteModelUtils.addPlayer(playerName, context.playerName(), reason)
147+
148+
if (ChatModelUtils.chatModel.mute.notifyAllAboutMute) {
149+
context.source.server.playerList.sendMessage(
150+
TranslationTextComponent(
151+
"project_essentials_chat.notify_muted",
152+
playerName,
153+
context.playerName(),
154+
reason.replace(" ", " §c")
155+
)
156+
)
157+
}
158+
159+
sendMsg(
160+
"chat",
161+
context.source,
162+
"chat.mute_success",
163+
playerName
164+
)
165+
} else {
166+
sendMsg(
167+
"chat",
168+
context.source,
169+
"chat.mute_failed",
170+
playerName
171+
)
172+
}
173+
}
174+
return 0
175+
}
176+
177+
private fun getPlayer(context: CommandContext<CommandSource>): ServerPlayerEntity? = try {
178+
EntityArgument.getPlayer(context, "player")
179+
} catch (ex: IllegalArgumentException) {
180+
null
181+
}
182+
183+
private fun getPlayerName(context: CommandContext<CommandSource>): String? = try {
184+
StringArgumentType.getString(context, "player name")
185+
} catch (ex: IllegalArgumentException) {
186+
null
187+
}
188+
}

0 commit comments

Comments
 (0)