diff --git a/common/src/main/java/net/draycia/carbon/common/command/commands/PartyCommands.java b/common/src/main/java/net/draycia/carbon/common/command/commands/PartyCommands.java index 5716dcf0e..22a817625 100644 --- a/common/src/main/java/net/draycia/carbon/common/command/commands/PartyCommands.java +++ b/common/src/main/java/net/draycia/carbon/common/command/commands/PartyCommands.java @@ -35,13 +35,12 @@ import net.draycia.carbon.common.command.Commander; import net.draycia.carbon.common.command.PlayerCommander; import net.draycia.carbon.common.config.ConfigManager; +import net.draycia.carbon.common.messages.CarbonMessages; import net.draycia.carbon.common.users.PartyInvites; import net.draycia.carbon.common.users.UserManagerInternal; import net.draycia.carbon.common.users.WrappedCarbonPlayer; -import net.kyori.adventure.audience.Audience; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.DefaultQualifier; @@ -54,6 +53,7 @@ public final class PartyCommands extends CarbonCommand { private final UserManagerInternal userManager; private final PartyInvites partyInvites; private final ConfigManager config; + private final CarbonMessages messages; @Inject public PartyCommands( @@ -61,13 +61,15 @@ public PartyCommands( final ArgumentFactory argumentFactory, final UserManagerInternal userManager, final PartyInvites partyInvites, - final ConfigManager config + final ConfigManager config, + final CarbonMessages messages ) { this.commandManager = commandManager; this.argumentFactory = argumentFactory; this.userManager = userManager; this.partyInvites = partyInvites; this.config = config; + this.messages = messages; } @Override @@ -123,9 +125,9 @@ private void info(final CommandContext ctx) { final CarbonPlayer player = ((PlayerCommander) ctx.getSender()).carbonPlayer(); final @Nullable Party party = player.party().join(); if (party == null) { - player.sendMessage(Component.text("You are not in a party.", NamedTextColor.RED)); + this.messages.notInParty(player); } else { - player.sendMessage(Component.text("You are in the party ").append(party.name())); + this.messages.currentParty(player, party.name()); } } @@ -133,7 +135,7 @@ private void createParty(final CommandContext ctx) { final CarbonPlayer player = ((PlayerCommander) ctx.getSender()).carbonPlayer(); final @Nullable Party oldParty = player.party().join(); if (oldParty != null) { - player.sendMessage(Component.text("You must leave your current party first.", NamedTextColor.RED)); + this.messages.mustLeavePartyFirst(player); return; } final String name = ctx.getOrDefault("name", player.username() + "'s party"); @@ -142,10 +144,11 @@ private void createParty(final CommandContext ctx) { try { party = this.userManager.createParty(component); } catch (final IllegalArgumentException e) { - player.sendMessage(Component.text("Party name is too long.", NamedTextColor.RED)); + this.messages.partyNameTooLong(player); return; } party.addMember(player.uuid()); + this.messages.partyCreated(player, party.name()); } private void invitePlayer(final CommandContext ctx) { @@ -153,11 +156,11 @@ private void invitePlayer(final CommandContext ctx) { final CarbonPlayer recipient = ctx.get("player"); final @Nullable Party party = player.party().join(); if (party == null) { - mustBeInParty(player); + this.messages.mustBeInParty(player); return; } this.partyInvites.sendInvite(player.uuid(), recipient.uuid(), party.id()); - recipient.sendMessage(Component.text("u got invited to ").append(party.name())); + this.messages.receivedPartyInvite(recipient, player.displayName(), party.name()); } private void acceptInvite(final CommandContext ctx) { @@ -176,34 +179,34 @@ private void acceptInvite(final CommandContext ctx) { final Map.Entry e = map.entrySet().iterator().next(); inv = Pair.of(e.getKey(), e.getValue()); } else { - player.sendMessage(Component.text("You must specify whose invite to accept.", NamedTextColor.RED)); + this.messages.mustSpecifyPartyInvite(player); return; } } if (inv == null) { - player.sendMessage(Component.text("You do not have a pending party invite.", NamedTextColor.RED)); + this.messages.noPendingPartyInvites(player); return; } final @Nullable Party party = this.userManager.party(inv.getSecond()).join(); if (party == null) { - player.sendMessage(Component.text("You do not have a pending party invite.", NamedTextColor.RED)); + this.messages.noPendingPartyInvites(player); return; } final @Nullable Party old = player.party().join(); if (old != null) { - player.sendMessage(Component.text("You must leave your current party first.", NamedTextColor.RED)); + this.messages.mustLeavePartyFirst(player); return; } this.partyInvites.invalidateInvite(inv.getFirst(), player.uuid()); party.addMember(player.uuid()); - player.sendMessage(Component.text("u joined ").append(party.name())); + this.messages.joinedParty(player, party.name()); } private void leaveParty(final CommandContext ctx) { final CarbonPlayer player = ((PlayerCommander) ctx.getSender()).carbonPlayer(); final @Nullable Party old = player.party().join(); if (old == null) { - mustBeInParty(player); + this.messages.mustBeInParty(player); return; } if (old.members().size() == 1) { @@ -211,25 +214,22 @@ private void leaveParty(final CommandContext ctx) { return; } old.removeMember(player.uuid()); - player.sendMessage(Component.text("u left party")); + this.messages.leftParty(player, old.name()); } private void disbandParty(final CommandContext ctx) { final CarbonPlayer player = ((PlayerCommander) ctx.getSender()).carbonPlayer(); final @Nullable Party old = player.party().join(); if (old == null) { - mustBeInParty(player); + this.messages.mustBeInParty(player); return; } if (old.members().size() != 1) { - player.sendMessage(Component.text("Cannot disband, you are not the last member.", NamedTextColor.RED)); + this.messages.cannotDisbandParty(player, old.name()); return; } old.disband(); - player.sendMessage(Component.text("u disbanded party")); + this.messages.disbandedParty(player, old.name()); } - private static void mustBeInParty(final Audience player) { - player.sendMessage(Component.text("You must be in a party to use this command.", NamedTextColor.RED)); - } } diff --git a/common/src/main/java/net/draycia/carbon/common/messages/CarbonMessages.java b/common/src/main/java/net/draycia/carbon/common/messages/CarbonMessages.java index e08afb816..4f4f017cc 100644 --- a/common/src/main/java/net/draycia/carbon/common/messages/CarbonMessages.java +++ b/common/src/main/java/net/draycia/carbon/common/messages/CarbonMessages.java @@ -427,6 +427,45 @@ void errorCommandCommandExecution( @Message("command.updateusername.updated") void usernameUpdated(final Audience audience, @Placeholder("newname") final String newName); + @Message("command.party.created") + void partyCreated(Audience audience, Component partyName); + + @Message("command.party.not_in_party") + void notInParty(Audience audience); + + @Message("command.party.current_party") + void currentParty(Audience audience, Component partyName); + + @Message("command.party.must_leave_current_first") + void mustLeavePartyFirst(Audience audience); + + @Message("command.party.name_too_long") + void partyNameTooLong(Audience audience); + + @Message("command.party.received_invite") + void receivedPartyInvite(Audience audience, Component senderDisplayName, Component partyName); + + @Message("command.party.must_specify_invite") + void mustSpecifyPartyInvite(Audience audience); + + @Message("command.party.no_pending_invites") + void noPendingPartyInvites(Audience audience); + + @Message("command.party.joined_party") + void joinedParty(Audience audience, Component partyName); + + @Message("command.party.left_party") + void leftParty(Audience audience, Component partyName); + + @Message("command.party.disbanded") + void disbandedParty(Audience audience, Component partyName); + + @Message("command.party.cannot_disband_multiple_members") + void cannotDisbandParty(Audience audience, Component partyName); + + @Message("command.party.must_be_in_party") + void mustBeInParty(Audience audience); + @Message("deletemessage.prefix") Component deleteMessagePrefix(); diff --git a/common/src/main/java/net/draycia/carbon/common/users/PartyInvites.java b/common/src/main/java/net/draycia/carbon/common/users/PartyInvites.java index d86cf3792..e5aa57fb6 100644 --- a/common/src/main/java/net/draycia/carbon/common/users/PartyInvites.java +++ b/common/src/main/java/net/draycia/carbon/common/users/PartyInvites.java @@ -27,12 +27,15 @@ import java.time.Duration; import java.util.Map; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; +import net.draycia.carbon.api.users.CarbonPlayer; +import net.draycia.carbon.api.users.Party; +import net.draycia.carbon.common.messages.CarbonMessages; import net.draycia.carbon.common.messaging.MessagingManager; import net.draycia.carbon.common.messaging.packets.InvalidatePartyInvitePacket; import net.draycia.carbon.common.messaging.packets.PacketFactory; import net.draycia.carbon.common.messaging.packets.PartyInvitePacket; -import net.kyori.adventure.text.Component; import org.apache.logging.log4j.Logger; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -47,18 +50,21 @@ public final class PartyInvites { private final PacketFactory packetFactory; private final UserManagerInternal users; private final Logger logger; + private final CarbonMessages messages; @Inject private PartyInvites( final Provider messaging, final PacketFactory packetFactory, final UserManagerInternal users, - final Logger logger + final Logger logger, + final CarbonMessages messages ) { this.messaging = messaging; this.packetFactory = packetFactory; this.users = users; this.logger = logger; + this.messages = messages; } public void sendInvite(final UUID from, final UUID to, final UUID party) { @@ -108,9 +114,14 @@ public void handle(final PartyInvitePacket pkt) { final @Nullable Cache cache = this.orCreateInvitesFor(pkt.to()); cache.put(pkt.from(), pkt.party()); this.pendingInvites.values().removeIf(it -> it.asMap().size() == 0); - this.users.user(pkt.to()).thenAccept(u -> { - if (u.online()) { - u.sendMessage(Component.text("u got an invite")); + + final CompletableFuture to = this.users.user(pkt.to()); + final CompletableFuture from = this.users.user(pkt.to()); + final CompletableFuture party = this.users.party(pkt.party()); + + CompletableFuture.allOf(to, from, party).thenRun(() -> { + if (to.join().online()) { + this.messages.receivedPartyInvite(to.join(), from.join().displayName(), party.join().name()); } }).whenComplete(($, thr) -> { if (thr != null) { diff --git a/common/src/main/resources/locale/messages-en_US.properties b/common/src/main/resources/locale/messages-en_US.properties index 17cab3ae7..44c7bb7f9 100644 --- a/common/src/main/resources/locale/messages-en_US.properties +++ b/common/src/main/resources/locale/messages-en_US.properties @@ -61,6 +61,19 @@ command.updateusername.updated=Updated 's username! command.whisper.argument.message=The message to send. command.whisper.argument.player=The name of the player to message. command.whisper.description=Sends a private message to the specified player. +command.party.created=Successfully created and joined party ''! +command.party.not_in_party=You are not in a party. +command.party.current_party=You are in party: +command.party.must_leave_current_first=You must leave your current party first. +command.party.name_too_long=Party name is too long. +command.party.received_invite=You were invited to the party '' by . +command.party.must_specify_invite=You must specify whose party invite to accept. +command.party.no_pending_invites=You do not have any pending party invites. +command.party.joined_party=Successfully joined party ''! +command.party.left_party=Successfully left party ''. +command.party.disbanded=Successfully disbanded party ''. +command.party.cannot_disband_multiple_members=Cannot disband party '', you are not the last member. +command.party.must_be_in_party=You must be in a party to use this command. config.reload.failed=Config failed to reload config.reload.success=Config reloaded successfully error.command.argument_parsing=Invalid command argument: