tweaks724/src/main/java/eu/m724/utils/chat/ChatCommands.java
2024-11-15 19:43:42 +01:00

165 lines
8.2 KiB
Java

package eu.m724.utils.chat;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.hover.content.Text;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.Arrays;
import java.util.stream.Collectors;
public class ChatCommands implements CommandExecutor {
private final ChatManager manager;
public ChatCommands(ChatManager manager) {
this.manager = manager;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, Command command, @NotNull String label, String[] args) {
if (command.getName().equals("chat")) {
Player player = (Player) sender;
ChatRoom chatRoom = manager.getPlayerChatRoom(player);
if (args.length == 0) { // show room
BaseComponent[] component = new ComponentBuilder("Active chat room: ").color(ChatColor.GOLD)
.append(chatRoom.id).color(chatRoom.color)
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(chatRoom.getInfoComponent())))
.create();
player.spigot().sendMessage(component);
} else { // join room
// TODO move joining logic
String id = args[0];
String password = null;
if (args.length > 1) {
password = Arrays.stream(args).skip(1).collect(Collectors.joining(" ")).strip();
}
boolean authenticated = false;
BaseComponent[] component = null;
ChatRoom newRoom = manager.getById(id);
if (newRoom != null) {
if (newRoom.password != null) {
if (newRoom.password.equals(password)) {
authenticated = true;
} else if (password == null) {
component = new ComponentBuilder("This room is password protected").color(ChatColor.RED)
.create();
} else {
component = new ComponentBuilder("Invalid password").color(ChatColor.RED)
.create();
}
}
} else {
component = new ComponentBuilder("No room named ").color(ChatColor.RED)
.append(id).color(ChatColor.AQUA)
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(chatRoom.getInfoComponent())))
.create();
}
if (authenticated) {
manager.setPlayerChatRoom(newRoom, player);
component = new ComponentBuilder("Joined chat room: ").color(ChatColor.GOLD)
.append(newRoom.id).color(newRoom.color)
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(newRoom.getInfoComponent())))
.append("\nThere are %d other players".formatted(newRoom.players.size())).color(ChatColor.GOLD)
.create();
}
player.spigot().sendMessage(component);
}
} else if (command.getName().equals("chatmanage")) {
Player player = (Player) sender;
ChatRoom chatRoom = manager.getPlayerChatRoom(player);
if (!chatRoom.owner.equals(player)) {
sender.sendMessage("You're not the owner of %s, please enter the room you want to make changes in".formatted(chatRoom.id));
return true;
}
if (args.length > 1) {
String action = args[0];
String argument = args[1];
if (action.equals("create")) {
try {
ChatRoom newRoom = manager.createChatRoom(argument, null, player);
sender.sendMessage("Created a chat room. Join it: /c " + newRoom.id);
sender.sendMessage("You might also want to protect it with a password: /cm setpassword");
} catch (ChatManager.InvalidIdException e) {
sender.sendMessage("ID is invalid: " + e.getMessage());
} catch (ChatManager.ChatRoomExistsException e) {
sender.sendMessage("Room %s already exists".formatted(argument));
} catch (IOException e) {
sender.sendMessage("Failed to create room");
e.printStackTrace();
}
} else if (action.equals("delete")) {
// TODO
} else if (action.equals("setowner")) {
Player newOwner = Bukkit.getPlayer(argument);
if (newOwner != null && newOwner.isOnline()) {
chatRoom.owner = newOwner;
try {
manager.saveChatRoom(chatRoom);
sender.sendMessage("Owner changed to " + newOwner.getName());
} catch (IOException e) {
sender.sendMessage("Failed to change owner");
e.printStackTrace();
}
} else {
sender.sendMessage("Player must be online");
}
} else if (action.equals("setpassword")) {
chatRoom.password = Arrays.stream(args).skip(1).collect(Collectors.joining(" ")).strip();
try {
manager.saveChatRoom(chatRoom);
sender.sendMessage("Password changed");
} catch (IOException e) {
sender.sendMessage("Failed to change password");
e.printStackTrace();
}
} else if (action.equals("setcolor")) {
ChatColor newColor = ChatColor.of(argument);
if (newColor != null) {
chatRoom.color = newColor;
try {
manager.saveChatRoom(chatRoom);
sender.sendMessage("Message color changed to " + newColor.getName());
} catch (IOException e) {
sender.sendMessage("Failed to change color");
e.printStackTrace();
}
} else {
sender.sendMessage("Invalid color");
}
}
} else if (args.length > 0) {
switch (args[0]) {
case "create" ->
sender.sendMessage("Please pass a room name as an argument. The room name must be of characters and digits.");
case "delete" ->
sender.sendMessage("You want to delete room %s. Confirm by passing its name as an argument for this action.".formatted(chatRoom));
case "setowner" ->
sender.sendMessage("To transfer ownership of room %s, pass the new owner name as an argument for this action.".formatted(chatRoom));
case "setpassword" ->
sender.sendMessage("To change the password of room %s, pass the new password as an argument for this action.".formatted(chatRoom));
case "setcolor" ->
sender.sendMessage("To change the message color of room %s, pass the new color as an argument for this action. #hex or color name.".formatted(chatRoom));
default -> sender.sendMessage("create, delete, setowner, setpassword");
}
} else {
sender.sendMessage("create, delete, setowner, setpassword, setcolor");
}
}
return true;
}
}