11package dev .plex .command .sub ;
22
3- import com .google .common .collect .ImmutableList ;
43import dev .plex .Guilds ;
54import dev .plex .command .source .RequiredCommandSource ;
65import dev .plex .guild .Guild ;
7- import dev .plex .guild .data .GuildRole ;
86import dev .plex .storage .entity .GuildInviteEntity ;
7+ import java .time .Instant ;
8+ import java .util .List ;
9+ import java .util .UUID ;
910import net .kyori .adventure .text .Component ;
1011import net .kyori .adventure .text .minimessage .tag .resolver .Placeholder ;
1112import org .bukkit .command .CommandSender ;
1213import org .bukkit .entity .Player ;
1314import org .jetbrains .annotations .NotNull ;
1415import org .jetbrains .annotations .Nullable ;
1516
16- import java .time .Instant ;
17- import java .util .List ;
18- import java .util .UUID ;
19-
2017public class AcceptSubCommand extends GuildSubCommand
2118{
2219 public AcceptSubCommand (Guilds module )
2320 {
2421 super (module , command ("accept" )
25- .description ("Accept an invite" )
22+ .description ("Accept a guild invite" )
2623 .usage ("/guild <command> <guild>" )
2724 .permission ("plex.guilds.accept" )
2825 .source (RequiredCommandSource .IN_GAME )
2926 .build ());
3027 }
3128
29+ @ Override
30+ public boolean isAvailable (@ Nullable Player player )
31+ {
32+ return player != null && guildOf (player ) == null ;
33+ }
34+
3235 @ Override
3336 public Component executeSubCommand (@ NotNull CommandSender commandSender , @ Nullable Player player , @ Nullable String first , @ Nullable String remaining )
3437 {
@@ -37,12 +40,16 @@ public Component executeSubCommand(@NotNull CommandSender commandSender, @Nullab
3740 return usage ();
3841 }
3942 assert player != null ;
43+ if (guildOf (player ) != null )
44+ {
45+ return messageComponent ("alreadyInGuild" );
46+ }
4047 UUID playerUuid = player .getUniqueId ();
41- String playerName = player .getName ();
4248 module .getGuildRepository ().invitesFor (playerUuid ).whenComplete ((invites , throwable ) ->
4349 {
4450 if (throwable != null )
4551 {
52+ module .getLogger ().error ("Failed to load invites for {}" , playerUuid , throwable );
4653 player .sendMessage (messageComponent ("guildStorageFailed" ));
4754 return ;
4855 }
@@ -52,19 +59,14 @@ public Component executeSubCommand(@NotNull CommandSender commandSender, @Nullab
5259 player .sendMessage (messageComponent ("guildNotValidInvite" ));
5360 return ;
5461 }
55- if (invite .getExpiresAt () < Instant .now ().toEpochMilli ())
62+ Guild guild = module .getGuildHolder ().guildById (UUID .fromString (invite .getGuildUuid ())).orElse (null );
63+ if (invite .getExpiresAt () < Instant .now ().toEpochMilli () || guild == null )
5664 {
5765 module .getGuildRepository ().deleteInvite (UUID .fromString (invite .getGuildUuid ()), playerUuid );
5866 player .sendMessage (messageComponent ("guildInviteExpired" ));
5967 return ;
6068 }
61- Guild target = module .getGuildHolder ().guildById (UUID .fromString (invite .getGuildUuid ())).orElse (null );
62- if (target == null )
63- {
64- player .sendMessage (messageComponent ("guildNotValidInvite" ));
65- return ;
66- }
67- leaveCurrentIfNeeded (player , playerUuid , playerName , target );
69+ join (player , guild );
6870 });
6971 return null ;
7072 }
@@ -79,60 +81,23 @@ private GuildInviteEntity findInvite(List<GuildInviteEntity> invites, String gui
7981 .orElse (null );
8082 }
8183
82- private void leaveCurrentIfNeeded (Player player , UUID playerUuid , String playerName , Guild target )
84+ private void join (Player player , Guild guild )
8385 {
84- module .getGuildHolder ().guild (playerUuid ).ifPresentOrElse (current ->
86+ // The player may have joined or created a guild while the invites loaded.
87+ if (guildOf (player ) != null )
8588 {
86- if (current .getGuildUuid ().equals (target .getGuildUuid ()))
87- {
88- player .sendMessage (messageComponent ("guildInThis" ));
89- return ;
90- }
91- if (current .isOwner (playerUuid ) && current .getMembers ().size () > 1 )
92- {
93- player .sendMessage (messageComponent ("guildOwnerLeaveBlocked" ));
94- return ;
95- }
96- if (current .isOwner (playerUuid ))
89+ player .sendMessage (messageComponent ("alreadyInGuild" ));
90+ return ;
91+ }
92+ String playerName = player .getName ();
93+ module .getGuildMutationService ().addMember (guild , player .getUniqueId (), true ).whenComplete ((unused , throwable ) ->
94+ {
95+ if (throwable != null )
9796 {
98- module .getGuildMutationService ().deleteGuild (current ).whenComplete ((unused , throwable ) ->
99- {
100- if (throwable != null )
101- {
102- player .sendMessage (messageComponent ("guildStorageFailed" ));
103- return ;
104- }
105- joinTarget (player , playerUuid , playerName , target );
106- });
97+ player .sendMessage (failureMessage (throwable , null ));
10798 return ;
10899 }
109- module .getGuildMutationService ().removeMember (current , playerUuid ).whenComplete ((unused , throwable ) ->
110- {
111- if (throwable != null )
112- {
113- player .sendMessage (messageComponent ("guildStorageFailed" ));
114- return ;
115- }
116- module .broadcastToGuild (current , messageComponent ("guildMemberLeft" , Placeholder .unparsed ("player" , playerName )))
117- .thenRun (() -> joinTarget (player , playerUuid , playerName , target ));
118- });
119- }, () -> joinTarget (player , playerUuid , playerName , target ));
120- }
121-
122- private void joinTarget (Player player , UUID playerUuid , String playerName , Guild guild )
123- {
124- UUID guildUuid = guild .getGuildUuid ();
125- module .getGuildMutationService ().addMember (guild , playerUuid , true )
126- .whenComplete ((unused , throwable ) ->
127- {
128- if (throwable != null )
129- {
130- player .sendMessage (messageComponent ("guildStorageFailed" ));
131- return ;
132- }
133- module .broadcastToGuild (guild , messageComponent ("guildMemberJoined" , Placeholder .unparsed ("player" , playerName )));
134- });
100+ module .broadcastToGuild (guild , messageComponent ("guildMemberJoined" , Placeholder .unparsed ("player" , playerName )));
101+ });
135102 }
136-
137-
138103}
0 commit comments