mirror of
https://github.com/Aust1n46/VentureChat.git
synced 2025-05-23 02:19:05 +00:00
224 lines
8.6 KiB
Java
224 lines
8.6 KiB
Java
package mineverse.Aust1n46.chat.command.mute;
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.DataOutputStream;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
|
|
import org.bukkit.command.Command;
|
|
import org.bukkit.command.CommandSender;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.util.StringUtil;
|
|
|
|
import mineverse.Aust1n46.chat.MineverseChat;
|
|
import mineverse.Aust1n46.chat.api.MineverseChatAPI;
|
|
import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
|
|
import mineverse.Aust1n46.chat.channel.ChatChannel;
|
|
import mineverse.Aust1n46.chat.command.MineverseCommand;
|
|
import mineverse.Aust1n46.chat.localization.LocalizedMessage;
|
|
import mineverse.Aust1n46.chat.utilities.Format;
|
|
|
|
public class Mute extends MineverseCommand {
|
|
private static final List<String> COMMON_MUTE_TIMES = Collections.unmodifiableList(Arrays.asList(new String[]{"12h", "15m", "1d", "1h", "1m", "30s"}));
|
|
|
|
public Mute(String name) {
|
|
super(name);
|
|
}
|
|
|
|
@Override
|
|
public void execute(CommandSender sender, String command, String[] args) {
|
|
if (sender.hasPermission("venturechat.mute")) {
|
|
if (args.length < 2) {
|
|
sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/mute")
|
|
.replace("{args}", "[channel] [player] {time} {reason}"));
|
|
return;
|
|
}
|
|
if (ChatChannel.isChannel(args[0])) {
|
|
ChatChannel channel = ChatChannel.getChannel(args[0]);
|
|
if (channel.isMutable()) {
|
|
long datetime = System.currentTimeMillis();
|
|
long time = 0;
|
|
int reasonStartPos = 2;
|
|
String reason = "";
|
|
if(args.length > 2) {
|
|
String timeString = args[2];
|
|
if(Character.isDigit(timeString.charAt(0))) {
|
|
reasonStartPos = 3;
|
|
time = Format.parseTimeStringToMillis(timeString);
|
|
if (time <= 0) {
|
|
sender.sendMessage(LocalizedMessage.INVALID_TIME.toString().replace("{args}", timeString));
|
|
return;
|
|
}
|
|
}
|
|
StringBuilder reasonBuilder = new StringBuilder();
|
|
for(int a = reasonStartPos; a < args.length; a ++) {
|
|
reasonBuilder.append(args[a]);
|
|
}
|
|
reason = reasonBuilder.toString();
|
|
}
|
|
if(channel.getBungee()) {
|
|
sendBungeeCordMute(sender, args[1], channel, time, reason);
|
|
return;
|
|
}
|
|
MineverseChatPlayer playerToMute = MineverseChatAPI.getMineverseChatPlayer(args[1]);
|
|
if (playerToMute == null || (!playerToMute.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) {
|
|
sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[1]));
|
|
return;
|
|
}
|
|
if (playerToMute.isMuted(channel.getName())) {
|
|
sender.sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString()
|
|
.replace("{player}", playerToMute.getName()).replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName()));
|
|
return;
|
|
}
|
|
|
|
if(time > 0) {
|
|
if(reason.isEmpty()) {
|
|
playerToMute.addMute(channel.getName(), datetime + time);
|
|
String timeString = Format.parseTimeStringFromMillis(time);
|
|
sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME.toString()
|
|
.replace("{player}", playerToMute.getName())
|
|
.replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName())
|
|
.replace("{time}", timeString));
|
|
if (playerToMute.isOnline()) {
|
|
playerToMute.getPlayer()
|
|
.sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME.toString()
|
|
.replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName())
|
|
.replace("{time}", timeString));
|
|
}
|
|
else {
|
|
playerToMute.setModified(true);
|
|
}
|
|
return;
|
|
}
|
|
else {
|
|
playerToMute.addMute(channel.getName(), datetime + time, reason);
|
|
String timeString = Format.parseTimeStringFromMillis(time);
|
|
sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME_REASON.toString()
|
|
.replace("{player}", playerToMute.getName())
|
|
.replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName())
|
|
.replace("{time}", timeString)
|
|
.replace("{reason}", reason));
|
|
if (playerToMute.isOnline()) {
|
|
playerToMute.getPlayer()
|
|
.sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME_REASON.toString()
|
|
.replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName())
|
|
.replace("{time}", timeString)
|
|
.replace("{reason}", reason));
|
|
}
|
|
else {
|
|
playerToMute.setModified(true);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
if(reason.isEmpty()) {
|
|
playerToMute.addMute(channel.getName());
|
|
sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER.toString()
|
|
.replace("{player}", playerToMute.getName()).replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName()));
|
|
if (playerToMute.isOnline()) {
|
|
playerToMute.getPlayer()
|
|
.sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER.toString()
|
|
.replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName()));
|
|
}
|
|
else {
|
|
playerToMute.setModified(true);
|
|
}
|
|
return;
|
|
}
|
|
else {
|
|
playerToMute.addMute(channel.getName(), reason);
|
|
sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_REASON.toString()
|
|
.replace("{player}", playerToMute.getName()).replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName())
|
|
.replace("{reason}", reason));
|
|
if (playerToMute.isOnline()) {
|
|
playerToMute.getPlayer()
|
|
.sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_REASON.toString()
|
|
.replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName())
|
|
.replace("{reason}", reason));
|
|
}
|
|
else {
|
|
playerToMute.setModified(true);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
sender.sendMessage(LocalizedMessage.CHANNEL_CANNOT_MUTE.toString()
|
|
.replace("{channel_color}", channel.getColor())
|
|
.replace("{channel_name}", channel.getName()));
|
|
return;
|
|
}
|
|
sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0]));
|
|
return;
|
|
}
|
|
sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString());
|
|
}
|
|
|
|
@Override
|
|
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
|
|
List<String> completions = new ArrayList<>();
|
|
if(args.length == 1) {
|
|
StringUtil.copyPartialMatches(args[0], ChatChannel.getChatChannels().stream().map(ChatChannel::getName).collect(Collectors.toList()), completions);
|
|
Collections.sort(completions);
|
|
return completions;
|
|
}
|
|
if(args.length == 2) {
|
|
if(ChatChannel.isChannel(args[0])) {
|
|
ChatChannel chatChannelObj = ChatChannel.getChannel(args[0]);
|
|
if(chatChannelObj.getBungee()) {
|
|
StringUtil.copyPartialMatches(args[1], MineverseChat.networkPlayerNames, completions);
|
|
Collections.sort(completions);
|
|
return completions;
|
|
}
|
|
StringUtil.copyPartialMatches(args[1], MineverseChatAPI.getOnlineMineverseChatPlayers().stream().filter(mcp -> !mcp.isMuted(chatChannelObj.getName())).map(MineverseChatPlayer::getName).collect(Collectors.toList()), completions);
|
|
Collections.sort(completions);
|
|
return completions;
|
|
}
|
|
}
|
|
if(args.length == 3) {
|
|
StringUtil.copyPartialMatches(args[2], COMMON_MUTE_TIMES, completions);
|
|
Collections.sort(completions);
|
|
return completions;
|
|
|
|
}
|
|
return Collections.emptyList();
|
|
}
|
|
|
|
private void sendBungeeCordMute(CommandSender sender, String playerToMute, ChatChannel channel, long time, String reason) {
|
|
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
|
|
DataOutputStream out = new DataOutputStream(byteOutStream);
|
|
try {
|
|
out.writeUTF("Mute");
|
|
out.writeUTF("Send");
|
|
if(sender instanceof Player) {
|
|
out.writeUTF(((Player) sender).getUniqueId().toString());
|
|
}
|
|
else {
|
|
out.writeUTF("VentureChat:Console");
|
|
}
|
|
out.writeUTF(playerToMute);
|
|
out.writeUTF(channel.getName());
|
|
out.writeLong(time);
|
|
out.writeUTF(reason);
|
|
MineverseChat.sendPluginMessage(byteOutStream);
|
|
out.close();
|
|
}
|
|
catch(Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|