Skip to content

Commit 6070bb9

Browse files
authored
feat: Add /mininglevels info command (#38) (#39)
1 parent 41d72e0 commit 6070bb9

5 files changed

Lines changed: 158 additions & 2 deletions

File tree

src/main/java/de/chafficplugins/mininglevels/listeners/MiningLevelsCommandListener.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
8484
return true;
8585
}
8686
case "info" -> {
87-
sender.sendMessage("§aMining Levels by §c" + plugin.getDescription().getAuthors());
88-
sender.sendMessage("§aVersion: §c" + plugin.getDescription().getVersion());
87+
if(!hasOnePermissions(sender, "mininglevels.info")) {
88+
sendMessage(sender, NO_PERMISSION);
89+
return true;
90+
}
91+
LevelingCommands.info(sender);
92+
return true;
8993
}
9094
case "self" -> {
9195
if(!(sender instanceof Player)) {

src/main/java/de/chafficplugins/mininglevels/listeners/commands/LevelingCommands.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,21 @@ public static void level(CommandSender sender, String[] args) {
7474
sendMessage(sender, USAGE_LEVEL);
7575
}
7676

77+
public static void info(CommandSender sender) {
78+
if(!(sender instanceof Player player)) {
79+
sendMessage(sender, NO_CONSOLE_COMMAND);
80+
return;
81+
}
82+
MiningPlayer miningPlayer = MiningPlayer.getMiningPlayer(player.getUniqueId());
83+
if(miningPlayer == null) {
84+
sendMessage(sender, ERROR_OCCURRED);
85+
return;
86+
}
87+
MiningLevel miningLevel = miningPlayer.getLevel();
88+
sendMessage(sender, CURRENT_LEVEL, miningLevel.getName());
89+
sendMessage(sender, CURRENT_XP, String.valueOf(miningPlayer.getXp()), String.valueOf(miningLevel.getNextLevelXP()));
90+
}
91+
7792
public static void leaderboard(CommandSender sender) {
7893
//sort miningPlayers by level and xp
7994
List<MiningPlayer> miningPlayers = getSortedPlayers();

src/main/java/de/chafficplugins/mininglevels/utils/ConfigStrings.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class ConfigStrings {
1717
public final static String PERMISSION_RELOAD = "mininglevels.reload";
1818
public final static String PERMISSION_EDITOR = "mininglevels.editor";
1919
public final static String PERMISSIONS_LEADERBOARD = "mininglevels.leaderboard";
20+
public final static String PERMISSION_INFO = "mininglevels.info";
2021

2122
//Configuration
2223
public final static String LVL_UP_SOUND = "levelup_sound";

src/main/resources/plugin.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,6 @@ commands:
1616
- mr
1717
usage: /miningrewards
1818
permissions:
19+
mininglevels.info:
20+
description: Allows the player to view their mining level and XP
21+
default: true
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package de.chafficplugins.mininglevels.listeners.commands;
2+
3+
import de.chafficplugins.mininglevels.api.MiningLevel;
4+
import de.chafficplugins.mininglevels.api.MiningPlayer;
5+
import org.junit.jupiter.api.AfterAll;
6+
import org.junit.jupiter.api.BeforeAll;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
import org.mockbukkit.mockbukkit.MockBukkit;
10+
import org.mockbukkit.mockbukkit.ServerMock;
11+
import org.mockbukkit.mockbukkit.entity.PlayerMock;
12+
13+
import java.util.UUID;
14+
15+
import static org.junit.jupiter.api.Assertions.*;
16+
17+
/**
18+
* Tests for the /mininglevels info command logic.
19+
* <p>
20+
* Since CrucialLib's Localizer is not available in tests, we verify that
21+
* the data retrieval and state used by the info command is correct:
22+
* the player's MiningPlayer exists and exposes the expected level and XP.
23+
*/
24+
class InfoCommandTest {
25+
26+
private static ServerMock server;
27+
28+
@BeforeAll
29+
static void setUpServer() {
30+
server = MockBukkit.mock();
31+
}
32+
33+
@AfterAll
34+
static void tearDown() {
35+
MockBukkit.unmock();
36+
}
37+
38+
@BeforeEach
39+
void setUp() {
40+
MiningPlayer.miningPlayers.clear();
41+
MiningLevel.miningLevels.clear();
42+
MiningLevel.miningLevels.add(new MiningLevel("Beginner", 100, 0));
43+
MiningLevel.miningLevels.add(new MiningLevel("Apprentice", 300, 1));
44+
MiningLevel.miningLevels.add(new MiningLevel("Expert", 500, 2));
45+
}
46+
47+
@Test
48+
void infoCommand_playerHasLevel0_shouldShowBeginnerLevelAndZeroXp() {
49+
PlayerMock mockPlayer = server.addPlayer();
50+
MiningPlayer mp = new MiningPlayer(mockPlayer.getUniqueId(), 0, 0);
51+
52+
MiningLevel level = mp.getLevel();
53+
assertNotNull(level);
54+
assertEquals("Beginner", level.getName());
55+
assertEquals(0, mp.getXp());
56+
assertEquals(100, level.getNextLevelXP());
57+
}
58+
59+
@Test
60+
void infoCommand_playerHasLevel1WithXp_shouldShowApprenticeAndXp() {
61+
PlayerMock mockPlayer = server.addPlayer();
62+
MiningPlayer mp = new MiningPlayer(mockPlayer.getUniqueId(), 1, 150);
63+
64+
MiningLevel level = mp.getLevel();
65+
assertNotNull(level);
66+
assertEquals("Apprentice", level.getName());
67+
assertEquals(150, mp.getXp());
68+
assertEquals(300, level.getNextLevelXP());
69+
}
70+
71+
@Test
72+
void infoCommand_playerAtMaxLevel_shouldShowExpertLevel() {
73+
PlayerMock mockPlayer = server.addPlayer();
74+
MiningPlayer mp = new MiningPlayer(mockPlayer.getUniqueId(), 2, 400);
75+
76+
MiningLevel level = mp.getLevel();
77+
assertNotNull(level);
78+
assertEquals("Expert", level.getName());
79+
assertEquals(400, mp.getXp());
80+
assertEquals(500, level.getNextLevelXP());
81+
}
82+
83+
@Test
84+
void infoCommand_noMiningPlayer_shouldReturnNull() {
85+
PlayerMock mockPlayer = server.addPlayer();
86+
87+
MiningPlayer mp = MiningPlayer.getMiningPlayer(mockPlayer.getUniqueId());
88+
assertNull(mp);
89+
}
90+
91+
@Test
92+
void infoCommand_afterLevelChange_shouldReflectNewLevel() {
93+
PlayerMock mockPlayer = server.addPlayer();
94+
MiningPlayer mp = new MiningPlayer(mockPlayer.getUniqueId(), 0, 50);
95+
96+
assertEquals("Beginner", mp.getLevel().getName());
97+
assertEquals(50, mp.getXp());
98+
99+
mp.setLevel(2);
100+
mp.setXp(450);
101+
102+
assertEquals("Expert", mp.getLevel().getName());
103+
assertEquals(450, mp.getXp());
104+
}
105+
106+
@Test
107+
void infoCommand_requiresPlayerSender() {
108+
// The info command should only work for Player senders.
109+
// Console senders should get a "no console command" response.
110+
// Verified by the instanceof Player check in LevelingCommands.info().
111+
UUID consoleUUID = UUID.randomUUID();
112+
MiningPlayer mp = MiningPlayer.getMiningPlayer(consoleUUID);
113+
assertNull(mp, "Console has no MiningPlayer");
114+
}
115+
116+
@Test
117+
void infoCommand_correctPlayerLookup_shouldFindRightPlayer() {
118+
PlayerMock player1 = server.addPlayer();
119+
PlayerMock player2 = server.addPlayer();
120+
new MiningPlayer(player1.getUniqueId(), 0, 25);
121+
new MiningPlayer(player2.getUniqueId(), 2, 350);
122+
123+
MiningPlayer mp1 = MiningPlayer.getMiningPlayer(player1.getUniqueId());
124+
MiningPlayer mp2 = MiningPlayer.getMiningPlayer(player2.getUniqueId());
125+
126+
assertNotNull(mp1);
127+
assertNotNull(mp2);
128+
assertEquals("Beginner", mp1.getLevel().getName());
129+
assertEquals(25, mp1.getXp());
130+
assertEquals("Expert", mp2.getLevel().getName());
131+
assertEquals(350, mp2.getXp());
132+
}
133+
}

0 commit comments

Comments
 (0)