diff --git a/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java b/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java index 652c3d0b..ba486f40 100644 --- a/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java +++ b/src/main/java/net/tfminecraft/simplefactions/managers/CommandManager.java @@ -293,8 +293,14 @@ private boolean dispatchCommand(CommandSender sender, Command cmd, String label, return true; } Guild g = FactionManager.getGuildByMember(Members.key(p)); + if(g.isBase()) { + p.sendMessage("§cYou are in the main guild of your faction. Use /faction leave to leave the faction."); + return true; + } + // Leaving a guild keeps you in the faction, back in its main guild. g.kick(Members.key(p)); - p.sendMessage("§aLeft "+g.getName()); + g.getFaction().addMember(Members.key(p)); + p.sendMessage("§aLeft "+g.getName()+" §aand returned to the main guild of "+g.getFaction().getName()); return true; } else if(cmd.getName().equalsIgnoreCase(cmd2) && args[0].equalsIgnoreCase("kick") && args.length >= 2) { Guild guild = FactionManager.getGuildByLeader(Members.key(p)); @@ -315,9 +321,12 @@ private boolean dispatchCommand(CommandSender sender, Command cmd, String label, p.sendMessage("§cYou cannot dismiss the leader!"); return true; } + // A guild leader can only remove someone from the guild; they stay in the faction's main guild. guild.kick(kicked); + guild.getFaction().addMember(kicked); p.sendMessage("§aKicked "+Members.display(kicked)); - Members.online(kicked).ifPresent(pl -> pl.sendMessage("§a"+Members.name(p)+ " kicked you from "+guild.getName())); + Members.online(kicked).ifPresent(pl -> pl.sendMessage("§a"+Members.name(p)+ " kicked you from "+guild.getName() + + "§a. You are back in the main guild of "+guild.getFaction().getName())); return true; } else if(cmd.getName().equalsIgnoreCase(cmd2) && args[0].equalsIgnoreCase("setbank") && args.length == 1) { if(FactionManager.getGuildByLeader(Members.key(p)) != null) { @@ -1070,7 +1079,7 @@ private boolean dispatchCommand(CommandSender sender, Command cmd, String label, } Faction f = FactionManager.getByMember(Members.key(p)); if(f.isInGuild(Members.key(p))) { - p.sendMessage("§cYou are in a guild, use /guild leave instead"); + p.sendMessage("§cYou are in a guild. Use /guild leave first, then /faction leave"); return true; } f.forceRemoveMember(Members.key(p)); diff --git a/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java b/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java index 082149cd..aa257ef3 100644 --- a/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/guild/GuildKickCommandTest.java @@ -18,16 +18,20 @@ import org.mockito.MockedStatic; import net.tfminecraft.simplefactions.managers.CommandManager; +import net.tfminecraft.simplefactions.objects.Faction; import net.tfminecraft.simplefactions.managers.FactionManager; import net.tfminecraft.simplefactions.utils.TabCompletion; class GuildKickCommandTest { @Test - void leaderRemovesAMemberAndNotifiesThem() { + void leaderRemovesAMemberFromTheGuildButKeepsThemInTheFaction() { Player leader = player("Leader"); Player member = player("Steve"); Guild guild = guild(false, "Smiths", "Leader", "Leader", "Steve"); + Faction realm = mock(Faction.class); + when(realm.getName()).thenReturn("Avalon"); + when(guild.getFaction()).thenReturn(realm); Command command = guildCommand(); try (MockedStatic factions = mockStatic(FactionManager.class); @@ -39,8 +43,9 @@ void leaderRemovesAMemberAndNotifiesThem() { // The typed name finds the member by character name; the stored key is what leaves. verify(guild).kick("Steve"); + verify(realm).addMember("Steve"); verify(leader).sendMessage("§aKicked Steve"); - verify(member).sendMessage("§aLeader kicked you from Smiths"); + verify(member).sendMessage("§aLeader kicked you from Smiths§a. You are back in the main guild of Avalon"); } } diff --git a/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java b/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java index 39a67cd7..15ae09f0 100644 --- a/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java +++ b/src/test/java/net/tfminecraft/simplefactions/managers/CommandManagerCoverageTest.java @@ -895,14 +895,24 @@ void leavingRequiresMembershipAndNonLeadership(String name) { if (name.equals("faction")) { when(faction.isInGuild("Leader")).thenReturn(true); assertTrue(run(name, "leave")); - verify(player).sendMessage(contains("use /guild leave")); + verify(player).sendMessage(contains("Use /guild leave first")); when(faction.isInGuild("Leader")).thenReturn(false); + } else { + when(guild.isBase()).thenReturn(true); + assertTrue(run(name, "leave")); + verify(player).sendMessage(contains("Use /faction leave")); + verify(guild, never()).kick("Leader"); + when(guild.isBase()).thenReturn(false); + when(guild.getFaction()).thenReturn(faction); } assertTrue(run(name, "leave")); if (name.equals("faction")) { verify(faction).forceRemoveMember("Leader"); verify(faction).updatePrestige(); - } else verify(guild).kick("Leader"); + } else { + verify(guild).kick("Leader"); + verify(faction).addMember("Leader"); + } verify(player).sendMessage(contains("Left ")); }