Skip to content

Commit

Permalink
Synced with MC-1.14.4 branch.
Browse files Browse the repository at this point in the history
Signed-off-by: Pavel Erokhin (MairwunNx) <[email protected]>
  • Loading branch information
MairwunNx committed Feb 11, 2020
1 parent 796d9d7 commit c3081c9
Show file tree
Hide file tree
Showing 11 changed files with 739 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.mairwunnx.projectessentials.chat

import com.mairwunnx.projectessentials.chat.api.MuteAPI
import com.mairwunnx.projectessentials.chat.commands.*
import com.mairwunnx.projectessentials.chat.models.ChatModelUtils
import com.mairwunnx.projectessentials.chat.models.MuteModelUtils
import com.mairwunnx.projectessentials.core.EssBase
import com.mairwunnx.projectessentials.core.extensions.empty
import com.mairwunnx.projectessentials.core.extensions.sendMsg
Expand All @@ -14,6 +17,7 @@ import net.minecraftforge.common.MinecraftForge
import net.minecraftforge.event.ServerChatEvent
import net.minecraftforge.eventbus.api.SubscribeEvent
import net.minecraftforge.fml.common.Mod
import net.minecraftforge.fml.event.server.FMLServerStartingEvent
import net.minecraftforge.fml.event.server.FMLServerStoppingEvent
import org.apache.logging.log4j.LogManager

Expand All @@ -30,6 +34,7 @@ class EntryPoint : EssBase() {
MinecraftForge.EVENT_BUS.register(this)
loadAdditionalModules()
ChatModelUtils.loadData()
MuteModelUtils.loadData()
}

private fun loadAdditionalModules() {
Expand All @@ -40,11 +45,20 @@ class EntryPoint : EssBase() {
} catch (_: ClassNotFoundException) {
// ignored
}

try {
Class.forName(cooldownAPIClassPath)
cooldownInstalled = true
logger.info("Cooldown module found!")
} catch (_: ClassNotFoundException) {
// ignored
}
}

companion object {
lateinit var modInstance: EntryPoint
private var permissionsInstalled: Boolean = false
var permissionsInstalled: Boolean = false
var cooldownInstalled: Boolean = false

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

@SubscribeEvent
fun onServerStarting(it: FMLServerStartingEvent) {
ClearChatCommand.register(it.commandDispatcher)
MuteCommand.register(it.commandDispatcher)
UnmuteCommand.register(it.commandDispatcher)
UnmuteAllCommand.register(it.commandDispatcher)
MutedPlayersCommand.register(it.commandDispatcher)
}

@Suppress("UNUSED_PARAMETER")
@SubscribeEvent
fun onServerStopping(it: FMLServerStoppingEvent) {
ChatModelUtils.saveData()
MuteModelUtils.saveData()
}

@SubscribeEvent
Expand Down Expand Up @@ -86,6 +110,21 @@ class EntryPoint : EssBase() {

@SubscribeEvent
fun onChatMessage(event: ServerChatEvent) {
if (MuteAPI.isInMute(event.username)) {
val mutedBy = MuteAPI.getMuteInitiator(event.username)!!
val reason = MuteAPI.getMuteReason(event.username)!!

sendMsg(
"chat",
event.player.commandSource,
"chat.muted",
mutedBy,
reason.replace(" ", " §7")
)
event.isCanceled = true
return
}

if (!ChatModelUtils.chatModel.messaging.chatEnabled) {
sendMsg("chat", event.player.commandSource, "chat.disabled")
event.isCanceled = true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.mairwunnx.projectessentials.chat.commands

import com.mairwunnx.projectessentials.chat.EntryPoint
import com.mairwunnx.projectessentials.cooldown.essentials.CommandsAliases
import com.mairwunnx.projectessentials.core.extensions.isPlayerSender
import com.mairwunnx.projectessentials.core.extensions.playerName
import com.mairwunnx.projectessentials.core.extensions.sendMsg
import com.mairwunnx.projectessentials.core.helpers.PERMISSION_LEVEL
import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.arguments.BoolArgumentType
import com.mojang.brigadier.builder.LiteralArgumentBuilder.literal
import com.mojang.brigadier.context.CommandContext
import net.minecraft.client.Minecraft
import net.minecraft.command.CommandSource
import net.minecraft.command.Commands
import net.minecraft.util.text.TextComponentUtils
import net.minecraftforge.api.distmarker.Dist
import net.minecraftforge.fml.DistExecutor
import org.apache.logging.log4j.LogManager

object ClearChatCommand {
private val logger = LogManager.getLogger()
private val aliases = listOf("clearchat", "chat-clear", "chatclear", "cc")

fun register(dispatcher: CommandDispatcher<CommandSource>) {
logger.info("Register \"/clear-chat\" command")
applyAliases()

val literalArgument = literal<CommandSource>("clear-chat").then(
Commands.argument(
"only for you", BoolArgumentType.bool()
).executes {
return@executes execute(it, BoolArgumentType.getBool(it, "only for you"))
}
)

val literalNode = dispatcher.register(literalArgument.executes {
execute(it, false)
})

aliases.forEach { alias ->
dispatcher.register(
Commands.literal(alias).executes { ctx ->
execute(ctx, false)
}.redirect(literalNode)
)
}
}

private fun applyAliases() {
if (!EntryPoint.cooldownInstalled) return
CommandsAliases.aliases["clear-chat"] = aliases.toMutableList()
}

private fun execute(
context: CommandContext<CommandSource>,
clearOnlyForSender: Boolean
): Int {
if (clearOnlyForSender) {
if (context.isPlayerSender()) {
if (EntryPoint.hasPermission(context.source.asPlayer(), "ess.chat.clear", 2)) {
DistExecutor.runWhenOn(Dist.CLIENT) {
Runnable {
Minecraft.getInstance().ingameGUI.chatGUI.clearChatMessages(true)
}
}
} else {
logger.warn(
PERMISSION_LEVEL
.replace("%0", context.playerName())
.replace("%1", "clear-chat")
)
sendMsg("chat", context.source, "chat.clear_restricted")
}
} else {
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.")
}
} else {
if (!context.isPlayerSender() || EntryPoint.hasPermission(
context.source.asPlayer(),
"ess.chat.clear.other",
3
)
) {
val message = StringBuilder()
repeat(256) {
message.append("\n")
}

context.source.server.playerList.sendMessage(
TextComponentUtils.toTextComponent { message.toString() }
)

if (context.isPlayerSender()) {
DistExecutor.runWhenOn(Dist.CLIENT) {
Runnable {
Minecraft.getInstance().ingameGUI.chatGUI.clearChatMessages(true)
}
}
}
} else {
sendMsg("chat", context.source, "chat.clear_other_restricted")
return 0
}
}
return 0
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
package com.mairwunnx.projectessentials.chat.commands

import com.mairwunnx.projectessentials.chat.EntryPoint
import com.mairwunnx.projectessentials.chat.api.MuteAPI
import com.mairwunnx.projectessentials.chat.models.ChatModelUtils
import com.mairwunnx.projectessentials.chat.models.MuteModelUtils
import com.mairwunnx.projectessentials.core.extensions.isPlayerSender
import com.mairwunnx.projectessentials.core.extensions.playerName
import com.mairwunnx.projectessentials.core.extensions.sendMsg
import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.arguments.BoolArgumentType
import com.mojang.brigadier.arguments.StringArgumentType
import com.mojang.brigadier.builder.LiteralArgumentBuilder.literal
import com.mojang.brigadier.context.CommandContext
import net.minecraft.command.CommandSource
import net.minecraft.command.Commands
import net.minecraft.command.arguments.EntityArgument
import net.minecraft.entity.player.ServerPlayerEntity
import net.minecraft.util.text.TranslationTextComponent
import org.apache.logging.log4j.LogManager

object MuteCommand {
private val logger = LogManager.getLogger()

private val argument = Commands.argument(
"reason", StringArgumentType.string()
).executes {
return@executes execute(it, StringArgumentType.getString(it, "reason"))
}.then(
Commands.argument(
"override", BoolArgumentType.bool()
).executes {
return@executes execute(
it,
StringArgumentType.getString(it, "reason"),
BoolArgumentType.getBool(it, "override")
)
}
)

fun register(dispatcher: CommandDispatcher<CommandSource>) {
logger.info("Register \"/mute\" command")

dispatcher.register(
literal<CommandSource>("mute")
.then(
Commands.argument(
"player", EntityArgument.player()
).then(argument).executes {
return@executes execute(it)
}
).then(
Commands.argument(
"player name", StringArgumentType.string()
).then(argument).executes {
return@executes execute(it)
}
)
)
}

private fun execute(
context: CommandContext<CommandSource>,
reason: String = ChatModelUtils.chatModel.mute.defaultReason,
override: Boolean = false
): Int {
if (context.isPlayerSender() && !EntryPoint.hasPermission(
context.source.asPlayer(),
"ess.chat.mute",
3
)
) {
sendMsg("chat", context.source, "chat.mute_restricted")
return 0
}

val player = getPlayer(context)
val playerName = getPlayerName(context)

if (player != null) {
if (player.name.string in ChatModelUtils.chatModel.mute.ignoredPlayers) {
sendMsg(
"chat",
context.source,
"chat.mute_failed_player_ignored",
player.name.string
)
return 0
}

val result = MuteAPI.mutePlayer(
player.name.string, context.playerName(), reason, override
)

if (result) {
MuteModelUtils.addPlayer(player.name.string, context.playerName(), reason)

if (ChatModelUtils.chatModel.mute.notifyAllAboutMute) {
context.source.server.playerList.sendMessage(
TranslationTextComponent(
"project_essentials_chat.notify_muted",
player.name.string,
context.playerName(),
reason.replace(" ", " §c")
)
)
}

sendMsg(
"chat",
player.commandSource,
"chat.lol_youre_muted",
context.playerName(),
reason.replace(" ", " §7")
)
sendMsg(
"chat",
context.source,
"chat.mute_success",
player.name.string
)
} else {
sendMsg(
"chat",
context.source,
"chat.mute_failed",
player.name.string
)
}
} else if (playerName != null) {
if (playerName in ChatModelUtils.chatModel.mute.ignoredPlayers) {
sendMsg(
"chat",
context.source,
"chat.mute_failed_player_ignored",
playerName
)
return 0
}

val result = MuteAPI.mutePlayer(
playerName, context.playerName(), reason, override
)

if (result) {
MuteModelUtils.addPlayer(playerName, context.playerName(), reason)

if (ChatModelUtils.chatModel.mute.notifyAllAboutMute) {
context.source.server.playerList.sendMessage(
TranslationTextComponent(
"project_essentials_chat.notify_muted",
playerName,
context.playerName(),
reason.replace(" ", " §c")
)
)
}

sendMsg(
"chat",
context.source,
"chat.mute_success",
playerName
)
} else {
sendMsg(
"chat",
context.source,
"chat.mute_failed",
playerName
)
}
}
return 0
}

private fun getPlayer(context: CommandContext<CommandSource>): ServerPlayerEntity? = try {
EntityArgument.getPlayer(context, "player")
} catch (ex: IllegalArgumentException) {
null
}

private fun getPlayerName(context: CommandContext<CommandSource>): String? = try {
StringArgumentType.getString(context, "player name")
} catch (ex: IllegalArgumentException) {
null
}
}
Loading

0 comments on commit c3081c9

Please sign in to comment.