diff --git a/api/src/main/java/com/alttd/chat/config/Config.java b/api/src/main/java/com/alttd/chat/config/Config.java index a576ec7..0c99ff2 100755 --- a/api/src/main/java/com/alttd/chat/config/Config.java +++ b/api/src/main/java/com/alttd/chat/config/Config.java @@ -247,7 +247,6 @@ public final class Config { public static String PARTY_FORMAT = "( > → Party) "; public static String PARTY_SPY = "PC: : "; - public static String PARTY_HELP = ""; public static String NO_PERMISSION = "You don't have permission to use this command."; public static String NO_CONSOLE = "This command can not be used by console"; public static String CREATED_PARTY = "You created a chat party called: " + @@ -255,16 +254,28 @@ public final class Config { public static String NOT_IN_A_PARTY = "You're not in a chat party."; public static String NOT_YOUR_PARTY = "You don't own this chat party."; public static String NOT_A_PARTY = "This chat party does not exist."; + public static String PARTY_EXISTS = "A chat party called already exists."; public static String INVALID_PLAYER = "Invalid player."; public static String NOT_ONLINE = " must be online to receive an invite."; public static String INVALID_PASSWORD = "Invalid password."; public static String JOINED_PARTY = "You joined !"; public static String NOTIFY_FINDING_NEW_OWNER = "Since you own this chat party a new party owner will be chosen."; public static String LEFT_PARTY = "You have left the chat party!"; + public static String OWNER_LEFT_PARTY = "[ChatParty]: left the chat party, the new party owner is "; + public static String NEW_PARTY_OWNER = "[ChatParty]: transferred the party to !"; + public static String CANT_REMOVE_PARTY_OWNER = "You can't remove yourself, please leave instead."; + public static String REMOVED_FROM_PARTY = "You were removed from the '' chat party."; + public static String REMOVED_USER_FROM_PARTY = "You removed from the chat party!"; + public static String NOT_A_PARTY_MEMBER = " is not a member of your party!"; + public static String PARTY_INFO = """ + Chat party info: + Name: + Password: + Owner: + Members: """; private static void party() { PARTY_FORMAT = getString("party.format", PARTY_FORMAT); PARTY_SPY = getString("party.spy", PARTY_SPY); - PARTY_HELP = getString("party.messages.help", PARTY_HELP); NO_PERMISSION = getString("party.messages.no-permission", NO_PERMISSION); NO_CONSOLE = getString("party.messages.no-console", NO_CONSOLE); CREATED_PARTY = getString("party.messages.created-party", CREATED_PARTY); @@ -276,6 +287,37 @@ public final class Config { INVALID_PASSWORD = getString("party.messages.invalid-password", INVALID_PASSWORD); NOTIFY_FINDING_NEW_OWNER = getString("party.messages.notify-finding-new-owner", NOTIFY_FINDING_NEW_OWNER); LEFT_PARTY = getString("party.messages.left-party", LEFT_PARTY); + OWNER_LEFT_PARTY = getString("party.messages.owner-left-party", OWNER_LEFT_PARTY); + NEW_PARTY_OWNER = getString("party.messages.new-owner", NEW_PARTY_OWNER); + CANT_REMOVE_PARTY_OWNER = getString("party.messages.cant-remove-owner", CANT_REMOVE_PARTY_OWNER); + REMOVED_FROM_PARTY = getString("party.messages.removed-from-party", REMOVED_FROM_PARTY); + NOT_A_PARTY_MEMBER = getString("party.messages.not-a-party-member", NOT_A_PARTY_MEMBER); + PARTY_INFO = getString("party.messages.party-info", PARTY_INFO); + } + + public static String PARTY_HELP_WRAPPER = "ChatParty help:\n"; + public static String PARTY_HELP_HELP = "Show this menu: /party help"; + public static String PARTY_HELP_CREATE = "Create a party: /party create "; + public static String PARTY_HELP_INFO = "Show info about your current party: /party info"; + public static String PARTY_HELP_INVITE = "Invite a user to your party: /party invite "; + public static String PARTY_HELP_JOIN = "Join a party: /party join "; + public static String PARTY_HELP_LEAVE = "Leave your current party: /party leave"; + public static String PARTY_HELP_NAME = "Change the name of your party: /party name "; + public static String PARTY_HELP_OWNER = "Change the owner of your party: /party owner "; + public static String PARTY_HELP_PASSWORD = "Change the password of your party: /party password "; + public static String PARTY_HELP_REMOVE = "Remove a member from your party: /party remove "; + private static void partyHelp() { + PARTY_HELP_WRAPPER = getString("party.help.wrapper", PARTY_HELP_WRAPPER); + PARTY_HELP_HELP = getString("party.help.help", PARTY_HELP_HELP); + PARTY_HELP_CREATE = getString("party.help.create", PARTY_HELP_CREATE); + PARTY_HELP_INFO = getString("party.help.info", PARTY_HELP_INFO); + PARTY_HELP_INVITE = getString("party.help.invite", PARTY_HELP_INVITE); + PARTY_HELP_JOIN = getString("party.help.join", PARTY_HELP_JOIN); + PARTY_HELP_LEAVE = getString("party.help.leave", PARTY_HELP_LEAVE); + PARTY_HELP_NAME = getString("party.help.name", PARTY_HELP_NAME); + PARTY_HELP_OWNER = getString("party.help.owner", PARTY_HELP_OWNER); + PARTY_HELP_PASSWORD = getString("party.help.password", PARTY_HELP_PASSWORD); + PARTY_HELP_REMOVE = getString("party.help.remove", PARTY_HELP_REMOVE); } private static void chatChannels() { diff --git a/api/src/main/java/com/alttd/chat/objects/Party.java b/api/src/main/java/com/alttd/chat/objects/Party.java index f77a44d..01b4ac3 100755 --- a/api/src/main/java/com/alttd/chat/objects/Party.java +++ b/api/src/main/java/com/alttd/chat/objects/Party.java @@ -14,7 +14,7 @@ public class Party { private UUID ownerUuid; private String partyName; private String partyPassword; - private static ArrayList partyUsers; //TODO might need to be a map? + private static ArrayList partyUsers; public Party(int partyId, UUID ownerUuid, String partyName, String partyPassword) { this.partyId = partyId; @@ -29,9 +29,6 @@ public class Party { } public void addUser(ChatUser chatUser, String playerName) { -// this.partyUsers.put(partyUser.getUuid(), PlainComponentSerializer.plain().serialize(partyUser.getDisplayName())); -// partyUser.setPartyId(getPartyId()); -// Queries.addPartyUser(partyUser); partyUsers.add(new PartyUser(chatUser.getUuid(), chatUser.getDisplayName(), playerName)); chatUser.setPartyId(getPartyId()); Queries.addPartyUser(chatUser); @@ -41,9 +38,14 @@ public class Party { removeUser(ChatUserManager.getChatUser(uuid)); } - public void removeUser(ChatUser partyUser) { - partyUsers.remove(partyUser.getUuid()); - Queries.removePartyUser(partyUser.getUuid()); + public void removeUser(ChatUser chatUser) { + UUID uuid = chatUser.getUuid(); + Optional first = partyUsers.stream() + .filter(partyUser -> partyUser.getUuid().equals(uuid)) + .findFirst(); + if (first.isEmpty()) return; + partyUsers.remove(first.get()); + Queries.removePartyUser(uuid); } public int getPartyId() { @@ -54,7 +56,11 @@ public class Party { return ownerUuid; } - public UUID newOwner() { + public void setNewOwner(UUID uuid) { + setOwnerUuid(uuid); + } + + public UUID setNewOwner() { UUID uuid = partyUsers.iterator().next().getUuid(); setOwnerUuid(uuid); return uuid; @@ -62,7 +68,7 @@ public class Party { public void setOwnerUuid(UUID ownerUuid) { this.ownerUuid = ownerUuid; - Queries.setPartyOwner(ownerUuid, partyId); //TODO: Async pls + Queries.setPartyOwner(ownerUuid, partyId); } public String getPartyName() { @@ -71,7 +77,7 @@ public class Party { public void setPartyName(String partyName) { this.partyName = partyName; - Queries.setPartyName(partyName, partyId); //TODO: Async pls + Queries.setPartyName(partyName, partyId); } public String getPartyPassword() { @@ -80,7 +86,7 @@ public class Party { public void setPartyPassword(String partyPassword) { this.partyPassword = partyPassword; - Queries.setPartyPassword(partyPassword, partyId); //TODO: Async pls + Queries.setPartyPassword(partyPassword, partyId); } public boolean hasPartyPassword() { @@ -112,4 +118,13 @@ public class Party { } return null; } + + public PartyUser getPartyUser(String name) { + for(PartyUser user : partyUsers) { + if(name.equalsIgnoreCase(user.getPlayerName())) { + return user; + } + } + return null; + } } diff --git a/galaxy/src/main/java/com/alttd/chat/commands/ChatParty.java b/galaxy/src/main/java/com/alttd/chat/commands/ChatParty.java index be16d52..15a447e 100644 --- a/galaxy/src/main/java/com/alttd/chat/commands/ChatParty.java +++ b/galaxy/src/main/java/com/alttd/chat/commands/ChatParty.java @@ -5,16 +5,13 @@ import com.alttd.chat.config.Config; import com.alttd.chat.database.Queries; import com.alttd.chat.managers.ChatUserManager; import com.alttd.chat.managers.PartyManager; -import com.alttd.chat.objects.ChatUser; import com.alttd.chat.objects.Party; import com.alttd.chat.objects.PartyUser; import com.alttd.chat.util.Utility; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.Template; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; @@ -27,7 +24,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.stream.Collectors; public class ChatParty implements CommandExecutor, TabCompleter { @@ -117,7 +113,7 @@ public class ChatParty implements CommandExecutor, TabCompleter { party.removeUser(player.getUniqueId()); if (party.getOwnerUuid().equals(player.getUniqueId())) { if (party.getPartyUsers().size() > 0) { - UUID uuid = party.newOwner(); + UUID uuid = party.setNewOwner(); sender.sendMessage(Utility.parseMiniMessage("Since you own this chat party a new party owner will be chosen.")); ChatPlugin.getInstance().getChatHandler().partyMessage(party, player, "" + player.getName() + diff --git a/velocity/src/main/java/com/alttd/velocitychat/commands/Party.java b/velocity/src/main/java/com/alttd/velocitychat/commands/Party.java index ad95c52..e2e5292 100644 --- a/velocity/src/main/java/com/alttd/velocitychat/commands/Party.java +++ b/velocity/src/main/java/com/alttd/velocitychat/commands/Party.java @@ -1,15 +1,13 @@ package com.alttd.velocitychat.commands; import com.alttd.chat.config.Config; -import com.alttd.velocitychat.commands.partysubcommands.Create; -import com.alttd.velocitychat.commands.partysubcommands.Invite; -import com.alttd.velocitychat.commands.partysubcommands.Join; +import com.alttd.chat.util.Utility; +import com.alttd.velocitychat.commands.partysubcommands.*; import com.mojang.brigadier.arguments.StringArgumentType; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.command.SimpleCommand; import com.velocitypowered.api.proxy.Player; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.Template; import java.util.ArrayList; @@ -18,13 +16,19 @@ import java.util.List; public class Party implements SimpleCommand { private final List subCommands; - private final MiniMessage miniMessage; public Party() { - subCommands = Arrays.asList(new Create(), + subCommands = Arrays.asList( + new Help(this), + new Create(), + new Info(), new Invite(), - new Join()); - miniMessage = MiniMessage.get(); + new Join(), + new Leave(), + new Name(), + new Owner(), + new Password(), + new Remove()); } @Override @@ -34,19 +38,23 @@ public class Party implements SimpleCommand { if (args.length < 1) { if (!source.hasPermission("party.use")) - source.sendMessage(miniMessage.parse(Config.NO_PERMISSION)); + source.sendMessage(Utility.parseMiniMessage(Config.NO_PERMISSION)); else if (source instanceof Player) - source.sendMessage(miniMessage.parse(Config.PARTY_HELP)); + source.sendMessage(getHelpMessage(source)); else - source.sendMessage(miniMessage.parse(Config.NO_CONSOLE)); + source.sendMessage(Utility.parseMiniMessage(Config.NO_CONSOLE)); return; } subCommands.stream() .filter(subCommand -> subCommand.getName().equalsIgnoreCase(args[0])) .findFirst() - .ifPresentOrElse(subCommand -> subCommand.execute(args, source), - () -> source.sendMessage(getHelpMessage(source))); + .ifPresentOrElse(subCommand -> { + if (source.hasPermission(subCommand.getPermission())) + subCommand.execute(args, source); + else + source.sendMessage(Utility.parseMiniMessage(Config.NO_PERMISSION)); + }, () -> source.sendMessage(getHelpMessage(source))); } @Override @@ -58,7 +66,7 @@ public class Party implements SimpleCommand { subCommands.stream() .filter(subCommand -> invocation.source().hasPermission(subCommand.getPermission())) .forEach(subCommand -> suggest.add(subCommand.getName())); - } else if (args.length <= 1) { + } else if (args.length == 1) { subCommands.stream() .filter(subCommand -> invocation.source().hasPermission(subCommand.getPermission())) .filter(subCommand -> subCommand.getName().startsWith(args[0].toLowerCase())) @@ -68,7 +76,7 @@ public class Party implements SimpleCommand { .filter(subCommand -> invocation.source().hasPermission(subCommand.getPermission())) .filter(subCommand -> subCommand.getName().equalsIgnoreCase(args[0])) .findFirst() - .ifPresent(subCommand -> suggest.addAll(subCommand.suggest(args))); + .ifPresent(subCommand -> suggest.addAll(subCommand.suggest(args, invocation.source()))); } if (args.length == 0) @@ -89,7 +97,7 @@ public class Party implements SimpleCommand { return finalValues; } - private Component getHelpMessage(CommandSource source) { + public Component getHelpMessage(CommandSource source) { StringBuilder stringBuilder = new StringBuilder(); subCommands.stream() @@ -98,6 +106,12 @@ public class Party implements SimpleCommand { if (stringBuilder.length() != 0) stringBuilder.replace(stringBuilder.length() - 1, stringBuilder.length(), ""); - return miniMessage.parse(Config.PARTY_HELP, Template.of("commands", stringBuilder.toString())); + return Utility.parseMiniMessage(Config.PARTY_HELP_WRAPPER, List.of( + Template.template("commands", stringBuilder.toString()) + )); + } + + public List getSubCommands() { + return subCommands; } } \ No newline at end of file diff --git a/velocity/src/main/java/com/alttd/velocitychat/commands/SubCommand.java b/velocity/src/main/java/com/alttd/velocitychat/commands/SubCommand.java index 90e0e83..1f7ee48 100644 --- a/velocity/src/main/java/com/alttd/velocitychat/commands/SubCommand.java +++ b/velocity/src/main/java/com/alttd/velocitychat/commands/SubCommand.java @@ -14,7 +14,7 @@ public interface SubCommand { void execute(String[] args, CommandSource source); - List suggest(String[] args); + List suggest(String[] args, CommandSource source); String getHelpMessage(); diff --git a/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Create.java b/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Create.java index 9fc9423..fa011e8 100644 --- a/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Create.java +++ b/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Create.java @@ -12,6 +12,7 @@ import com.velocitypowered.api.proxy.Player; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.Template; +import java.util.ArrayList; import java.util.List; public class Create implements SubCommand { @@ -32,7 +33,9 @@ public class Create implements SubCommand { return; } if (PartyManager.getParty(args[1]) != null) { - source.sendMessage(Utility.parseMiniMessage("A chat party with this name already exists.")); + source.sendMessage(Utility.parseMiniMessage(Config.PARTY_EXISTS, List.of( + Template.template("party", args[1]) + ))); return; } Party party = Queries.addParty(player.getUniqueId(), args[1], args[2]); @@ -45,12 +48,12 @@ public class Create implements SubCommand { } @Override - public List suggest(String[] args) { - return null; + public List suggest(String[] args, CommandSource source) { + return new ArrayList<>(); } @Override public String getHelpMessage() { - return null; + return Config.PARTY_HELP_CREATE; } } diff --git a/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Help.java b/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Help.java new file mode 100644 index 0000000..ccd4ed2 --- /dev/null +++ b/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Help.java @@ -0,0 +1,39 @@ +package com.alttd.velocitychat.commands.partysubcommands; + +import com.alttd.chat.config.Config; +import com.alttd.velocitychat.commands.Party; +import com.alttd.velocitychat.commands.SubCommand; +import com.velocitypowered.api.command.CommandSource; + +import java.util.ArrayList; +import java.util.List; + +public class Help implements SubCommand { + + private final Party partyCommand; + + public Help(Party partyCommand) + { + this.partyCommand = partyCommand; + } + + @Override + public String getName() { + return "help"; + } + + @Override + public void execute(String[] args, CommandSource source) { + source.sendMessage(partyCommand.getHelpMessage(source)); + } + + @Override + public List suggest(String[] args, CommandSource source) { + return new ArrayList<>(); + } + + @Override + public String getHelpMessage() { + return Config.PARTY_HELP_HELP; + } +} diff --git a/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Info.java b/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Info.java new file mode 100644 index 0000000..c61847b --- /dev/null +++ b/velocity/src/main/java/com/alttd/velocitychat/commands/partysubcommands/Info.java @@ -0,0 +1,59 @@ +package com.alttd.velocitychat.commands.partysubcommands; + +import com.alttd.chat.config.Config; +import com.alttd.chat.managers.PartyManager; +import com.alttd.chat.objects.Party; +import com.alttd.chat.objects.PartyUser; +import com.alttd.chat.util.Utility; +import com.alttd.velocitychat.commands.SubCommand; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.Template; + +import java.util.ArrayList; +import java.util.List; + +public class Info implements SubCommand { + @Override + public String getName() { + return "info"; + } + + @Override + public void execute(String[] args, CommandSource source) { + if (!(source instanceof Player player)) { + source.sendMessage(Utility.parseMiniMessage(Config.NO_CONSOLE)); + return; + } + Party party = PartyManager.getParty(player.getUniqueId()); + if (party == null) { + source.sendMessage(Utility.parseMiniMessage(Config.NOT_IN_A_PARTY)); + return; + } + + List displayNames = new ArrayList<>(); + for (PartyUser partyUser : party.getPartyUsers()) { + displayNames.add(partyUser.getDisplayName()); + } + + List