Skip to content

Commit 2138819

Browse files
vLuckyyyCitralFlogemini-code-assist[bot]P1otrullaigoyek
authored
GH-977 Make /homeadmin-related command to work with offline players. (#1248)
* player -> offlinePlayer / User Move home messages, add handling for few cases and new messages for some more * Replace translate to translation in notices * Update eternalcore-core/src/main/java/com/eternalcode/core/litecommand/argument/messages/PLArgumentMessages.java Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update eternalcore-core/src/main/java/com/eternalcode/core/feature/home/messages/PLHomeMessages.java Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update eternalcore-core/src/main/java/com/eternalcode/core/feature/home/messages/PLHomeMessages.java Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update suggestion of player to use userManager * Reduce number of operations * Update eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/PlayerHomeMultiArgument.java Co-authored-by: Piotr Zych <[email protected]> * Update eternalcore-core/src/main/java/com/eternalcode/core/litecommand/argument/messages/ENArgumentMessages.java Co-authored-by: Igor Michalski <[email protected]> * Update eternalcore-core/src/main/java/com/eternalcode/core/litecommand/argument/messages/PLArgumentMessages.java Co-authored-by: Igor Michalski <[email protected]> * Refactor HomeAdminCommand and related classes to replace User with OfflinePlayer, improve validation, and optimize methods. * Fix method declaration formatting in `PlayerHomeMultiArgument` to enhance readability. * Fix constructor formatting in `HomeAdminCommand` for consistency. * Remove unused messages and adjust visibility modifiers in HomeMessages classes for better consistency. * Add auto click command formatting as private static fields. * Improve UX - Add configurable formats for home list entries and integrate TranslationManager into HomeCommand and HomeAdminCommand for better customization. * Clarification in comments about homeListEntry --------- Co-authored-by: CitralFlo <[email protected]> Co-authored-by: Michał Wojtas <[email protected]> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Piotr Zych <[email protected]> Co-authored-by: Igor Michalski <[email protected]>
1 parent 7800bf6 commit 2138819

File tree

10 files changed

+275
-144
lines changed

10 files changed

+275
-144
lines changed

eternalcore-core/src/main/java/com/eternalcode/core/feature/home/command/HomeCommand.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
package com.eternalcode.core.feature.home.command;
22

33
import com.eternalcode.annotations.scan.command.DescriptionDocs;
4+
import com.eternalcode.core.configuration.implementation.PluginConfiguration;
45
import com.eternalcode.core.feature.home.Home;
56
import com.eternalcode.core.feature.home.HomeService;
67
import com.eternalcode.core.feature.home.HomeTeleportService;
78
import com.eternalcode.core.feature.home.HomesSettings;
89
import com.eternalcode.core.injector.annotations.Inject;
910
import com.eternalcode.core.notice.NoticeService;
11+
import com.eternalcode.core.translation.TranslationManager;
1012
import dev.rollczi.litecommands.annotations.argument.Arg;
1113
import dev.rollczi.litecommands.annotations.command.Command;
1214
import dev.rollczi.litecommands.annotations.context.Sender;
1315
import dev.rollczi.litecommands.annotations.execute.Execute;
1416
import dev.rollczi.litecommands.annotations.permission.Permission;
1517
import java.util.Collection;
1618
import java.util.Optional;
19+
import java.util.stream.Collectors;
1720
import org.bukkit.entity.Player;
1821

1922
@Command(name = "home")
@@ -24,18 +27,24 @@ class HomeCommand {
2427
private final NoticeService noticeService;
2528
private final HomeService homeService;
2629
private final HomeTeleportService homeTeleportService;
30+
private final PluginConfiguration pluginConfiguration;
31+
private final TranslationManager translationManager;
2732

2833
@Inject
2934
HomeCommand(
3035
HomesSettings homesSettings,
3136
NoticeService noticeService,
3237
HomeService homeService,
33-
HomeTeleportService homeTeleportService
38+
HomeTeleportService homeTeleportService,
39+
PluginConfiguration pluginConfiguration,
40+
TranslationManager translationManager
3441
) {
3542
this.homesSettings = homesSettings;
3643
this.noticeService = noticeService;
3744
this.homeService = homeService;
3845
this.homeTeleportService = homeTeleportService;
46+
this.pluginConfiguration = pluginConfiguration;
47+
this.translationManager = translationManager;
3948
}
4049

4150
@Execute
@@ -52,12 +61,6 @@ void execute(@Sender Player player) {
5261
}
5362

5463
if (playerHomes.size() > 1) {
55-
String homes = String.join(
56-
", ",
57-
playerHomes.stream()
58-
.map(Home::getName)
59-
.toList());
60-
6164
Optional<Home> mainHome = playerHomes.stream()
6265
.filter(home -> home.getName().equals(this.homesSettings.defaultName()))
6366
.findFirst();
@@ -67,6 +70,8 @@ void execute(@Sender Player player) {
6770
return;
6871
}
6972

73+
String homes = this.formatHomeList(playerHomes);
74+
7075
this.noticeService.create()
7176
.player(player.getUniqueId())
7277
.notice(translation -> translation.home().homeList())
@@ -85,4 +90,14 @@ void execute(@Sender Player player) {
8590
void execute(@Sender Player player, @Arg Home home) {
8691
this.homeTeleportService.teleport(player, home);
8792
}
93+
94+
private String formatHomeList(Collection<Home> homes) {
95+
String format = this.translationManager.getMessages().home().homeListEntryFormat();
96+
return homes.stream()
97+
.map(home -> {
98+
String homeName = home.getName();
99+
return format.replace("{HOME}", homeName);
100+
})
101+
.collect(Collectors.joining(this.pluginConfiguration.format.separator));
102+
}
88103
}

eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java

Lines changed: 113 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@
66
import com.eternalcode.core.feature.home.HomeManager;
77
import com.eternalcode.core.injector.annotations.Inject;
88
import com.eternalcode.core.notice.NoticeService;
9-
import com.eternalcode.core.user.User;
9+
import com.eternalcode.core.translation.TranslationManager;
1010
import com.eternalcode.core.viewer.Viewer;
1111
import dev.rollczi.litecommands.annotations.argument.Arg;
1212
import dev.rollczi.litecommands.annotations.command.Command;
1313
import dev.rollczi.litecommands.annotations.context.Sender;
1414
import dev.rollczi.litecommands.annotations.execute.Execute;
1515
import dev.rollczi.litecommands.annotations.permission.Permission;
1616
import io.papermc.lib.PaperLib;
17+
import java.util.Collection;
1718
import java.util.Optional;
1819
import java.util.UUID;
1920
import java.util.stream.Collectors;
2021
import org.bukkit.Location;
22+
import org.bukkit.OfflinePlayer;
2123
import org.bukkit.entity.Player;
2224

2325
@Command(name = "homeadmin")
@@ -27,78 +29,61 @@ class HomeAdminCommand {
2729
private final HomeManager homeManager;
2830
private final NoticeService noticeService;
2931
private final PluginConfiguration pluginConfiguration;
32+
private final TranslationManager translationManager;
3033

3134
@Inject
3235
public HomeAdminCommand(
3336
HomeManager homeManager,
3437
NoticeService noticeService,
35-
PluginConfiguration pluginConfiguration
38+
PluginConfiguration pluginConfiguration,
39+
TranslationManager translationManager
3640
) {
3741
this.homeManager = homeManager;
3842
this.noticeService = noticeService;
3943
this.pluginConfiguration = pluginConfiguration;
44+
this.translationManager = translationManager;
4045
}
4146

4247
@Execute(name = "sethome")
4348
@DescriptionDocs(description = "Set home for user", arguments = "<user> <home> [location]")
44-
void setHome(@Sender Player sender, @Arg("player home") PlayerHomeEntry playerHomeEntry, @Arg Optional<Location> location) {
45-
Location optionalLocation = location.orElse(sender.getLocation());
46-
47-
Home home = playerHomeEntry.home();
48-
Player player = playerHomeEntry.player();
49-
UUID uniqueId = player.getUniqueId();
49+
void setHome(
50+
@Sender Player sender,
51+
@Arg("target") OfflinePlayer targetPlayer,
52+
@Arg("home") String homeName,
53+
@Arg Optional<Location> location
54+
) {
55+
if (!this.hasPlayerEverJoined(targetPlayer)) {
56+
this.sendPlayerNeverJoinedNotice(sender, targetPlayer);
57+
return;
58+
}
5059

51-
boolean hasHome = this.homeManager.hasHome(uniqueId, home);
52-
String name = home.getName();
60+
Location homeLocation = location.orElse(sender.getLocation());
61+
UUID targetId = targetPlayer.getUniqueId();
62+
boolean homeExists = this.homeManager.hasHome(targetId, homeName);
5363

54-
if (hasHome) {
55-
this.homeManager.createHome(uniqueId, name, optionalLocation);
56-
this.noticeService.create()
57-
.notice(translate -> translate.home().overrideHomeLocationAsAdmin())
58-
.placeholder("{HOME}", name)
59-
.placeholder("{PLAYER}", player.getName())
60-
.player(player.getUniqueId())
61-
.send();
64+
this.homeManager.createHome(targetId, homeName, homeLocation);
6265

63-
return;
66+
if (homeExists) {
67+
this.sendHomeOverrideNotice(sender.getUniqueId(), homeName, targetPlayer);
68+
}
69+
else {
70+
this.sendHomeCreatedNotice(sender.getUniqueId(), homeName, targetPlayer);
6471
}
65-
66-
this.homeManager.createHome(uniqueId, name, optionalLocation);
67-
this.noticeService.create()
68-
.notice(translate -> translate.home().createAsAdmin())
69-
.placeholder("{HOME}", name)
70-
.placeholder("{PLAYER}", player.getName())
71-
.player(player.getUniqueId())
72-
.send();
7372
}
7473

7574
@Execute(name = "delhome")
7675
@DescriptionDocs(description = "Delete home for user", arguments = "<user> <home>")
7776
void deleteHome(@Sender Player sender, @Arg("player home") PlayerHomeEntry playerHomeEntry) {
7877
Home home = playerHomeEntry.home();
79-
Player player = playerHomeEntry.player();
80-
81-
UUID uniqueId = player.getUniqueId();
82-
boolean hasHome = this.homeManager.hasHome(uniqueId, home);
83-
84-
if (!hasHome) {
85-
String homes = this.formattedListUserHomes(uniqueId);
86-
87-
this.noticeService.create()
88-
.notice(translate -> translate.home().homeList())
89-
.placeholder("{HOMES}", homes)
90-
.placeholder("{PLAYER}", player.getName())
91-
.player(sender.getUniqueId())
92-
.send();
78+
OfflinePlayer targetPlayer = playerHomeEntry.offlinePlayer();
79+
UUID targetId = targetPlayer.getUniqueId();
9380

94-
return;
95-
}
81+
this.homeManager.deleteHome(targetId, home.getName());
9682

97-
this.homeManager.deleteHome(uniqueId, home.getName());
9883
this.noticeService.create()
99-
.notice(translate -> translate.home().deleteAsAdmin())
84+
.notice(translation -> translation.home().deleteAsAdmin())
10085
.placeholder("{HOME}", home.getName())
101-
.placeholder("{PLAYER}", player.getName())
86+
.placeholder("{PLAYER}", targetPlayer.getName())
10287
.player(sender.getUniqueId())
10388
.send();
10489
}
@@ -107,41 +92,102 @@ void deleteHome(@Sender Player sender, @Arg("player home") PlayerHomeEntry playe
10792
@DescriptionDocs(description = "Teleport to user home", arguments = "<user> <home>")
10893
void home(@Sender Player player, @Arg("player home") PlayerHomeEntry playerHomeEntry) {
10994
Home home = playerHomeEntry.home();
110-
Player user = playerHomeEntry.player();
95+
OfflinePlayer targetPlayer = playerHomeEntry.offlinePlayer();
96+
97+
PaperLib.teleportAsync(player, home.getLocation());
98+
99+
this.noticeService.create()
100+
.notice(translation -> translation.home().teleportedAsAdmin())
101+
.placeholder("{HOME}", home.getName())
102+
.placeholder("{PLAYER}", targetPlayer.getName())
103+
.player(player.getUniqueId())
104+
.send();
105+
}
111106

112-
Optional<Home> homeOption = this.homeManager.getHome(user.getUniqueId(), home.getName());
107+
@Execute(name = "list")
108+
@DescriptionDocs(description = "List user homes", arguments = "<user>")
109+
void list(@Sender Viewer viewer, @Arg("target") OfflinePlayer targetPlayer) {
110+
if (!this.hasPlayerEverJoined(targetPlayer)) {
111+
this.sendPlayerNeverJoinedNoticeToViewer(viewer, targetPlayer);
112+
return;
113+
}
113114

114-
if (homeOption.isEmpty()) {
115-
this.noticeService.create()
116-
.notice(translate -> translate.home().playerNoOwnedHomes())
117-
.placeholder("{HOME}", home.getName())
118-
.placeholder("{PLAYER}", user.getName())
119-
.player(player.getUniqueId())
120-
.send();
115+
UUID targetId = targetPlayer.getUniqueId();
116+
Collection<Home> homes = this.homeManager.getHomes(targetId);
121117

118+
if (homes.isEmpty()) {
119+
this.sendNoHomesNotice(viewer, targetPlayer);
122120
return;
123121
}
124122

125-
PaperLib.teleportAsync(player, homeOption.get().getLocation());
123+
this.sendHomeListNotice(viewer, homes, targetPlayer);
126124
}
127125

128-
@Execute(name = "list")
129-
@DescriptionDocs(description = "List user homes", arguments = "<user>")
130-
void list(@Sender Viewer viewer, @Arg User user) {
131-
String homes = this.formattedListUserHomes(user.getUniqueId());
126+
private boolean hasPlayerEverJoined(OfflinePlayer player) {
127+
return player.hasPlayedBefore() || player.isOnline();
128+
}
129+
130+
private void sendPlayerNeverJoinedNotice(Player sender, OfflinePlayer targetPlayer) {
131+
this.noticeService.create()
132+
.notice(translation -> translation.argument().offlinePlayer())
133+
.placeholder("{PLAYER}", targetPlayer.getName())
134+
.player(sender.getUniqueId())
135+
.send();
136+
}
137+
138+
private void sendPlayerNeverJoinedNoticeToViewer(Viewer viewer, OfflinePlayer targetPlayer) {
139+
this.noticeService.create()
140+
.notice(translation -> translation.argument().offlinePlayer())
141+
.placeholder("{PLAYER}", targetPlayer.getName())
142+
.viewer(viewer)
143+
.send();
144+
}
145+
146+
private void sendHomeOverrideNotice(UUID senderId, String homeName, OfflinePlayer targetPlayer) {
147+
this.noticeService.create()
148+
.notice(translation -> translation.home().overrideHomeLocationAsAdmin())
149+
.placeholder("{HOME}", homeName)
150+
.placeholder("{PLAYER}", targetPlayer.getName())
151+
.player(senderId)
152+
.send();
153+
}
154+
155+
private void sendHomeCreatedNotice(UUID senderId, String homeName, OfflinePlayer targetPlayer) {
156+
this.noticeService.create()
157+
.notice(translation -> translation.home().createAsAdmin())
158+
.placeholder("{HOME}", homeName)
159+
.placeholder("{PLAYER}", targetPlayer.getName())
160+
.player(senderId)
161+
.send();
162+
}
163+
164+
private void sendNoHomesNotice(Viewer viewer, OfflinePlayer targetPlayer) {
165+
this.noticeService.create()
166+
.notice(translation -> translation.home().noHomesOnListAsAdmin())
167+
.placeholder("{PLAYER}", targetPlayer.getName())
168+
.viewer(viewer)
169+
.send();
170+
}
171+
172+
private void sendHomeListNotice(Viewer viewer, Collection<Home> homes, OfflinePlayer targetPlayer) {
173+
String playerName = targetPlayer.getName();
174+
String formattedHomes = this.formatHomeList(homes, playerName);
132175

133176
this.noticeService.create()
134-
.notice(translate -> translate.home().homeListAsAdmin())
135-
.placeholder("{HOMES}", homes)
136-
.placeholder("{PLAYER}", user.getName())
177+
.notice(translation -> translation.home().homeListAsAdmin())
178+
.placeholder("{HOMES}", formattedHomes)
179+
.placeholder("{PLAYER}", playerName)
137180
.viewer(viewer)
138181
.send();
139182
}
140183

141-
private String formattedListUserHomes(UUID uniqueId) {
142-
return this.homeManager.getHomes(uniqueId).stream()
143-
.map(home -> home.getName())
184+
private String formatHomeList(Collection<Home> homes, String playerName) {
185+
String format = this.translationManager.getMessages().home().homeListEntryFormatAsAdmin();
186+
187+
return homes.stream()
188+
.map(home -> format
189+
.replace("{HOME}", home.getName())
190+
.replace("{PLAYER}", playerName))
144191
.collect(Collectors.joining(this.pluginConfiguration.format.separator));
145192
}
146193
}
147-
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.eternalcode.core.feature.home.homeadmin;
22

33
import com.eternalcode.core.feature.home.Home;
4-
import org.bukkit.entity.Player;
4+
import org.bukkit.OfflinePlayer;
55

6-
record PlayerHomeEntry(Player player, Home home) {
6+
public record PlayerHomeEntry(OfflinePlayer offlinePlayer, Home home) {
77
}

0 commit comments

Comments
 (0)