165 lines
8.2 KiB
Java
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;
|
|
}
|
|
}
|