diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java index 1f4922d42..c1cc16f45 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/Warp.java @@ -12,6 +12,4 @@ public interface Warp { List<String> getPermissions(); - void setPermissions(List<String> permissions); - } diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java index 45ee1d8f7..b5e73bed0 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/warp/WarpService.java @@ -7,21 +7,21 @@ public interface WarpService { - Warp createWarp(String name, Location location); + Warp create(String name, Location location); - void removeWarp(String warp); + void delete(String warp); void addPermissions(String warp, String... permissions); void removePermission(String warp, String permission); - boolean warpExists(String name); + boolean exists(String name); - boolean doesWarpPermissionExist(String warp, String permission); + boolean hasPermission(String warp, String permission); Optional<Warp> findWarp(String name); - Collection<String> getNamesOfWarps(); + Collection<String> getAllNames(); - boolean hasWarps(); + boolean isEmpty(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/WarpsConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/WarpsConfiguration.java deleted file mode 100644 index d9fca3da7..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/WarpsConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.eternalcode.core.configuration.implementation; - -import com.eternalcode.core.configuration.ReloadableConfig; -import com.eternalcode.core.feature.warp.WarpConfigEntry; -import com.eternalcode.core.injector.annotations.component.ConfigurationFile; -import net.dzikoysk.cdn.entity.Description; -import net.dzikoysk.cdn.source.Resource; -import net.dzikoysk.cdn.source.Source; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -@ConfigurationFile -public class WarpsConfiguration implements ReloadableConfig { - - @Description({"# Warps configuration", "# These are warp locations, for your own safety, please don't touch it."}) - public Map<String, WarpConfigEntry> warps = new HashMap<>(); - - @Override - public Resource resource(File folder) { - return Source.of(folder, "warps.yml"); - } - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigRepository.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigRepository.java deleted file mode 100644 index 510198152..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigRepository.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.eternalcode.core.feature.warp; - -import com.eternalcode.commons.bukkit.position.PositionAdapter; -import com.eternalcode.core.configuration.ConfigurationManager; -import com.eternalcode.core.configuration.implementation.LocationsConfiguration; -import com.eternalcode.core.configuration.implementation.WarpsConfiguration; -import com.eternalcode.core.injector.annotations.Inject; -import com.eternalcode.core.injector.annotations.component.Service; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -@Service -class WarpConfigRepository implements WarpRepository { - - private final LocationsConfiguration locationsConfiguration; - private final WarpsConfiguration warpsConfiguration; - private final ConfigurationManager configurationManager; - - @Inject - WarpConfigRepository( - ConfigurationManager configurationManager, - LocationsConfiguration locationsConfiguration, - WarpsConfiguration warpsConfiguration - ) { - this.locationsConfiguration = locationsConfiguration; - this.configurationManager = configurationManager; - this.warpsConfiguration = warpsConfiguration; - - this.migrateWarps(); - } - - @Override - public void addWarp(Warp warp) { - WarpConfigEntry warpConfigEntry = new WarpConfigEntry(PositionAdapter.convert(warp.getLocation()), warp.getPermissions()); - this.edit(warps -> warps.put( - warp.getName(), - warpConfigEntry - )); - } - - @Override - public void removeWarp(String warp) { - this.edit(warps -> warps.remove(warp)); - } - - @Override - public void addPermissions(String warp, String... permissions) { - this.edit(warps -> { - WarpConfigEntry warpConfigEntry = warps.get(warp); - if (warpConfigEntry == null) { - return; - } - - List<String> newPermissions = new ArrayList<>(warpConfigEntry.permissions); - newPermissions.addAll(List.of(permissions)); - - warpConfigEntry.permissions = newPermissions; - }); - } - - @Override - public void removePermission(String warp, String permission) { - this.edit(warps -> { - WarpConfigEntry warpConfigEntry = warps.get(warp); - - if (warpConfigEntry == null) { - return; - } - - List<String> newPermissions = new ArrayList<>(warpConfigEntry.permissions); - newPermissions.remove(permission); - - warpConfigEntry.permissions = newPermissions; - }); - } - - private void edit(Consumer<Map<String, WarpConfigEntry>> editor) { - Map<String, WarpConfigEntry> warps = new HashMap<>(this.warpsConfiguration.warps); - editor.accept(warps); - - warps.forEach((key, value) -> System.out.println(key + ": " + value)); - this.warpsConfiguration.warps.putAll(warps); - this.configurationManager.save(this.warpsConfiguration); - } - - @Override - public CompletableFuture<Optional<Warp>> getWarp(String name) { - return CompletableFuture.completedFuture(Optional.of(this.warpsConfiguration.warps.get(name)) - .map(warpConfigEntry -> new WarpImpl(name, warpConfigEntry.position, warpConfigEntry.permissions))); - } - - @Override - public CompletableFuture<List<Warp>> getWarps() { - return CompletableFuture.completedFuture(this.warpsConfiguration.warps.entrySet().stream() - .map(warpConfigEntry -> { - WarpConfigEntry warpContextual = warpConfigEntry.getValue(); - return new WarpImpl(warpConfigEntry.getKey(), warpContextual.position, warpContextual.permissions); - }) - .collect(Collectors.toList())); - } - - private void migrateWarps() { - if (this.locationsConfiguration.warps.isEmpty()) { - return; - } - - this.edit(warps -> warps.putAll(this.locationsConfiguration.warps - .entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, entry -> - new WarpConfigEntry(entry.getValue(), new ArrayList<>())) - ) - )); - - this.locationsConfiguration.warps.clear(); - this.configurationManager.save(this.locationsConfiguration); - this.configurationManager.save(this.warpsConfiguration); - } -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java index 46acae415..a948e6100 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpImpl.java @@ -2,21 +2,23 @@ import com.eternalcode.commons.bukkit.position.Position; import com.eternalcode.commons.bukkit.position.PositionAdapter; +import java.util.ArrayList; import org.bukkit.Location; import java.util.Collections; import java.util.List; -class WarpImpl implements Warp { +@SuppressWarnings("LombokSetterMayBeUsed") +public class WarpImpl implements Warp { private final String name; private final Position position; private List<String> permissions; - WarpImpl(String name, Position position, List<String> permissions) { + public WarpImpl(String name, Position position, List<String> permissions) { this.name = name; this.position = position; - this.permissions = permissions; + this.permissions = new ArrayList<>(permissions); } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java index f2e9df6eb..184caa653 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpInventory.java @@ -198,7 +198,7 @@ public void openInventory(Player player, Language language) { } public void addWarp(Warp warp) { - if (!this.warpManager.warpExists(warp.getName())) { + if (!this.warpManager.exists(warp.getName())) { return; } @@ -243,7 +243,7 @@ public void addWarp(Warp warp) { public boolean removeWarp(String warpName) { - if (!this.warpManager.warpExists(warpName)) { + if (!this.warpManager.exists(warpName)) { return false; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpPermissionController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpPermissionController.java index b01da97dd..8f39392eb 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpPermissionController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpPermissionController.java @@ -22,12 +22,12 @@ public class WarpPermissionController implements Listener { private final NoticeService noticeService; - private final PluginConfiguration pluginConfiguration; + private final PluginConfiguration config; @Inject - public WarpPermissionController(NoticeService noticeService, PluginConfiguration pluginConfiguration) { + public WarpPermissionController(NoticeService noticeService, PluginConfiguration config) { this.noticeService = noticeService; - this.pluginConfiguration = pluginConfiguration; + this.config = config; } @EventHandler @@ -55,6 +55,7 @@ private void checkWarpPermission(PreWarpTeleportEvent event, Warp warp, Player p this.noticeService.create() .player(uniqueId) .placeholder("{WARP}", warp.getName()) + .placeholder("{PERMISSIONS}", String.join(this.config.format.separator, permissions)) .notice(translation -> translation.warp().noPermission()) .send(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpRepository.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpRepository.java deleted file mode 100644 index b6914269e..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.eternalcode.core.feature.warp; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -interface WarpRepository { - - void addWarp(Warp warp); - - void removeWarp(String warp); - - void addPermissions(String warp, String... permissions); - - void removePermission(String warp, String permission); - - CompletableFuture<Optional<Warp>> getWarp(String name); - - CompletableFuture<List<Warp>> getWarps(); -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java index 71f9eeb26..90b3a8931 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpServiceImpl.java @@ -2,17 +2,18 @@ import com.eternalcode.annotations.scan.feature.FeatureDocs; import com.eternalcode.commons.bukkit.position.PositionAdapter; +import com.eternalcode.core.feature.warp.data.WarpDataRepository; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; -import org.bukkit.Location; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; +import org.bukkit.Location; @FeatureDocs( name = "Warp System", @@ -21,33 +22,33 @@ @Service class WarpServiceImpl implements WarpService { - private final Map<String, Warp> warpMap = new HashMap<>(); - private final WarpRepository warpRepository; + private final Map<String, Warp> warps = new ConcurrentHashMap<>(); + private final WarpDataRepository warpRepository; @Inject - private WarpServiceImpl(WarpRepository warpRepository) { + private WarpServiceImpl(WarpDataRepository warpRepository) { this.warpRepository = warpRepository; warpRepository.getWarps().thenAcceptAsync(warps -> { for (Warp warp : warps) { - this.warpMap.put(warp.getName(), warp); + this.warps.put(warp.getName(), warp); } }); } @Override - public Warp createWarp(String name, Location location) { + public Warp create(String name, Location location) { Warp warp = new WarpImpl(name, PositionAdapter.convert(location), new ArrayList<>()); - this.warpMap.put(name, warp); + this.warps.put(name, warp); this.warpRepository.addWarp(warp); return warp; } @Override - public void removeWarp(String warp) { - Warp remove = this.warpMap.remove(warp); + public void delete(String warp) { + Warp remove = this.warps.remove(warp); if (remove == null) { return; @@ -58,42 +59,62 @@ public void removeWarp(String warp) { @Override public void addPermissions(String warpName, String... permissions) { - Warp warp = this.warpMap.get(warpName); + Warp warp = this.warps.get(warpName); if (warp == null) { return; } + if (permissions == null) { + return; + } + List<String> updatedPermissions = new ArrayList<>(warp.getPermissions()); updatedPermissions.addAll(List.of(permissions)); - warp.setPermissions(updatedPermissions); + this.modifyPermissions(warpName, perms -> perms.addAll(List.of(permissions))); this.warpRepository.addPermissions(warpName, permissions); } @Override public void removePermission(String warpName, String permission) { - Warp warp = this.warpMap.get(warpName); + Warp warp = this.warps.get(warpName); + + if (warp == null) { + return; + } + + this.modifyPermissions(warpName, perms -> perms.remove(permission)); + this.warpRepository.removePermission(warpName, permission); + } + + private void modifyPermissions(String warpName, Consumer<List<String>> modifier) { + Warp warp = this.warps.get(warpName); if (warp == null) { return; } List<String> updatedPermissions = new ArrayList<>(warp.getPermissions()); - updatedPermissions.remove(permission); + modifier.accept(updatedPermissions); - warp.setPermissions(updatedPermissions); - this.warpRepository.removePermission(warpName, permission); + Warp updatedWarp = new WarpImpl( + warp.getName(), + PositionAdapter.convert(warp.getLocation()), + updatedPermissions + ); + + this.warps.put(warpName, updatedWarp); } @Override - public boolean warpExists(String name) { - return this.warpMap.containsKey(name); + public boolean exists(String name) { + return this.warps.containsKey(name); } @Override - public boolean doestWarpPermissionExist(String warpName, String permission) { - Warp warp = this.warpMap.get(warpName); + public boolean hasPermission(String warpName, String permission) { + Warp warp = this.warps.get(warpName); if (warp == null) { return false; @@ -104,16 +125,16 @@ public boolean doestWarpPermissionExist(String warpName, String permission) { @Override public Optional<Warp> findWarp(String name) { - return Optional.ofNullable(this.warpMap.get(name)); + return Optional.ofNullable(this.warps.get(name)); } @Override - public Collection<String> getNamesOfWarps() { - return Collections.unmodifiableCollection(this.warpMap.keySet()); + public Collection<String> getAllNames() { + return Collections.unmodifiableCollection(this.warps.keySet()); } @Override - public boolean hasWarps() { - return !this.warpMap.isEmpty(); + public boolean isEmpty() { + return !this.warps.isEmpty(); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java index c76774b25..816d68aa9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/DelWarpCommand.java @@ -37,7 +37,7 @@ void remove(@Context Player player, @Arg Warp warp) { } private void removeWarp(Player player, String name) { - if (!this.warpService.warpExists(name)) { + if (!this.warpService.exists(name)) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.warp().notExist()) @@ -47,7 +47,7 @@ private void removeWarp(Player player, String name) { return; } - this.warpService.removeWarp(name); + this.warpService.delete(name); this.warpInventory.removeWarp(name); this.noticeService.create() diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java index 288f14b34..a11db47a4 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/SetWarpCommand.java @@ -44,7 +44,7 @@ void add(@Context Player player, @Arg String warpName) { } private void createWarp(Player player, String warp, UUID uniqueId) { - if (this.warpService.warpExists(warp)) { + if (this.warpService.exists(warp)) { this.noticeService.create() .player(uniqueId) .notice(translation -> translation.warp().warpAlreadyExists()) @@ -54,7 +54,7 @@ private void createWarp(Player player, String warp, UUID uniqueId) { return; } - Warp createdWarp = this.warpService.createWarp(warp, player.getLocation()); + Warp createdWarp = this.warpService.create(warp, player.getLocation()); this.noticeService.create() .player(uniqueId) @@ -63,7 +63,7 @@ private void createWarp(Player player, String warp, UUID uniqueId) { .send(); if (this.config.warp.autoAddNewWarps) { - if (this.warpService.getNamesOfWarps().size() <= MAX_WARPS_IN_GUI) { + if (this.warpService.getAllNames().size() <= MAX_WARPS_IN_GUI) { this.warpInventory.addWarp(createdWarp); this.noticeService.create() diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java index 5b5b6946b..40526f207 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpArgument.java @@ -58,7 +58,7 @@ public SuggestionResult suggest( Argument<Warp> argument, SuggestionContext context ) { - return this.warpService.getNamesOfWarps().stream() + return this.warpService.getAllNames().stream() .collect(SuggestionResult.collector()); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java index ec5f12370..bf5c480c5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/WarpCommand.java @@ -48,13 +48,13 @@ void warp(@Context Player player, @Context User user) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.warp().available()) - .placeholder("{WARPS}", String.join(", ", this.warpService.getNamesOfWarps())) + .placeholder("{WARPS}", String.join(", ", this.warpService.getAllNames())) .send(); return; } - if (!this.warpService.hasWarps()) { + if (!this.warpService.isEmpty()) { this.noticeService.create() .player(player.getUniqueId()) .notice(translation -> translation.warp().noWarps()) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/AddWarpPermissionCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpAddPermissionCommand.java similarity index 88% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/AddWarpPermissionCommand.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpAddPermissionCommand.java index ecbe78185..69057d289 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/AddWarpPermissionCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpAddPermissionCommand.java @@ -1,4 +1,4 @@ -package com.eternalcode.core.feature.warp.command; +package com.eternalcode.core.feature.warp.command.permission; import com.eternalcode.core.feature.warp.Warp; import com.eternalcode.core.feature.warp.WarpService; @@ -13,15 +13,15 @@ import java.util.UUID; -@Command(name = "addwarp-permissions") +@Command(name = "warp-permission add") @Permission("eternalcore.warp.changepermissions") -public class AddWarpPermissionCommand { +public class WarpAddPermissionCommand { private final WarpService warpService; private final NoticeService noticeService; @Inject - public AddWarpPermissionCommand(WarpService warpService, NoticeService noticeService) { + public WarpAddPermissionCommand(WarpService warpService, NoticeService noticeService) { this.warpService = warpService; this.noticeService = noticeService; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/RemoveWarpPermissionCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpRemovePermissionCommand.java similarity index 68% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/RemoveWarpPermissionCommand.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpRemovePermissionCommand.java index c71bddb5a..852c87be7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/RemoveWarpPermissionCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/WarpRemovePermissionCommand.java @@ -1,7 +1,8 @@ -package com.eternalcode.core.feature.warp.command; +package com.eternalcode.core.feature.warp.command.permission; import com.eternalcode.core.feature.warp.Warp; import com.eternalcode.core.feature.warp.WarpService; +import com.eternalcode.core.feature.warp.command.permission.argument.WarpPermissionMultipleResolverEntry; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; import dev.rollczi.litecommands.annotations.argument.Arg; @@ -11,29 +12,32 @@ import dev.rollczi.litecommands.annotations.permission.Permission; import org.bukkit.entity.Player; -import java.util.UUID; - -@Command(name = "removewarp-permission") +@Command(name = "warp-permission remove") @Permission("eternalcore.warp.changepermissions") -public class RemoveWarpPermissionCommand { +public class WarpRemovePermissionCommand { private final WarpService warpService; private final NoticeService noticeService; @Inject - public RemoveWarpPermissionCommand(WarpService warpService, NoticeService noticeService) { + public WarpRemovePermissionCommand(WarpService warpService, NoticeService noticeService) { this.warpService = warpService; this.noticeService = noticeService; } @Execute - void removePermission(@Context Player player, @Arg Warp warp, @Arg String permission) { - UUID uniqueId = player.getUniqueId(); + void removePermission( + @Context Player player, + @Arg WarpPermissionMultipleResolverEntry entry + ) { + Warp warp = entry.warp(); + String permission = entry.permission(); if (!warp.getPermissions().contains(permission)) { this.noticeService.create() - .player(uniqueId) + .placeholder("{WARP}", warp.getName()) .placeholder("{PERMISSION}", permission) + .player(player.getUniqueId()) .notice(translation -> translation.warp().permissionDoesNotExist()) .send(); return; @@ -42,11 +46,10 @@ void removePermission(@Context Player player, @Arg Warp warp, @Arg String permis this.warpService.removePermission(warp.getName(), permission); this.noticeService.create() - .player(uniqueId) .placeholder("{WARP}", warp.getName()) .placeholder("{PERMISSION}", permission) + .player(player.getUniqueId()) .notice(translation -> translation.warp().removePermission()) .send(); } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultiArgumentResolver.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultiArgumentResolver.java new file mode 100644 index 000000000..f2eab3979 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultiArgumentResolver.java @@ -0,0 +1,138 @@ +package com.eternalcode.core.feature.warp.command.permission.argument; + +import com.eternalcode.core.configuration.implementation.PluginConfiguration; +import com.eternalcode.core.feature.warp.Warp; +import com.eternalcode.core.feature.warp.WarpService; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.lite.LiteArgument; +import com.eternalcode.core.notice.NoticeService; +import com.eternalcode.core.viewer.Viewer; +import com.eternalcode.core.viewer.ViewerService; +import dev.rollczi.litecommands.argument.Argument; +import dev.rollczi.litecommands.argument.parser.ParseResult; +import dev.rollczi.litecommands.argument.resolver.MultipleArgumentResolver; +import dev.rollczi.litecommands.input.raw.RawInput; +import dev.rollczi.litecommands.invocation.Invocation; +import dev.rollczi.litecommands.range.Range; +import dev.rollczi.litecommands.suggestion.Suggestion; +import dev.rollczi.litecommands.suggestion.SuggestionContext; +import dev.rollczi.litecommands.suggestion.SuggestionResult; +import java.util.Collection; +import java.util.Optional; +import org.bukkit.command.CommandSender; + +@LiteArgument(type = WarpPermissionMultipleResolverEntry.class) +public class WarpPermissionMultiArgumentResolver + implements MultipleArgumentResolver<CommandSender, WarpPermissionMultipleResolverEntry> { + + private static final String WARP_PLACEHOLDER_PREFIX = "{WARP}"; + private static final String PERMISSION_PLACEHOLDER_PREFIX = "{PERMISSION}"; + + private final PluginConfiguration config; + private final WarpService warpService; + private final NoticeService noticeService; + private final ViewerService viewerService; + + @Inject + public WarpPermissionMultiArgumentResolver( + PluginConfiguration config, + WarpService warpService, + NoticeService noticeService, + ViewerService viewerService + ) { + this.config = config; + this.warpService = warpService; + this.noticeService = noticeService; + this.viewerService = viewerService; + } + + @Override + public ParseResult<WarpPermissionMultipleResolverEntry> parse( + Invocation<CommandSender> invocation, + Argument<WarpPermissionMultipleResolverEntry> argument, + RawInput rawInput + ) { + Viewer viewer = this.viewerService.any(invocation.sender()); + + if (!rawInput.hasNext()) { + return ParseResult.failure(this.noticeService.create() + .notice(translation -> translation.warp().missingWarpName()) + .viewer(viewer) + ); + } + + String warpName = rawInput.next(); + Optional<Warp> warp = this.warpService.findWarp(warpName); + + if (warp.isEmpty()) { + return ParseResult.failure( + this.noticeService.create() + .notice(translation -> translation.warp().notExist()) + .placeholder(WARP_PLACEHOLDER_PREFIX, warpName) + .viewer(viewer) + ); + } + + if (!rawInput.hasNext()) { + Collection<String> permissions = warp.get().getPermissions(); + + if (permissions.isEmpty()) { + return ParseResult.failure(this.noticeService.create() + .notice(translation -> translation.warp().noPermissionAssigned()) + .placeholder(WARP_PLACEHOLDER_PREFIX, warpName) + .viewer(viewer) + ); + } + + return ParseResult.failure(this.noticeService.create() + .notice(translation -> translation.warp().listPermission()) + .placeholder(WARP_PLACEHOLDER_PREFIX, warpName) + .placeholder(PERMISSION_PLACEHOLDER_PREFIX, String.join(this.config.format.separator, permissions)) + .viewer(viewer) + ); + } + + String permission = rawInput.next(); + + return ParseResult.success(new WarpPermissionMultipleResolverEntry(warp.get(), permission)); + } + + @Override + public Range getRange(Argument<WarpPermissionMultipleResolverEntry> argument) { + return Range.of(2); + } + + @Override + public SuggestionResult suggest( + Invocation<CommandSender> invocation, + Argument<WarpPermissionMultipleResolverEntry> argument, + SuggestionContext context + ) { + Suggestion current = context.getCurrent(); + int index = current.lengthMultilevel(); + + if (index == 1) { + return SuggestionResult.of(this.warpService.getAllNames()); + } + + if (index == 2) { + String warpName = current.multilevelList().get(0); + Optional<Warp> warpOptional = this.warpService.findWarp(warpName); + + if (warpOptional.isEmpty()) { + return SuggestionResult.empty(); + } + + Warp warp = warpOptional.get(); + Collection<String> permissions = warp.getPermissions(); + + if (permissions.isEmpty()) { + return SuggestionResult.empty(); + } + + return SuggestionResult.of(permissions).appendLeft(warpName); + } + + return SuggestionResult.empty(); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultipleResolverEntry.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultipleResolverEntry.java new file mode 100644 index 000000000..a0e3beb6d --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/command/permission/argument/WarpPermissionMultipleResolverEntry.java @@ -0,0 +1,6 @@ +package com.eternalcode.core.feature.warp.command.permission.argument; + +import com.eternalcode.core.feature.warp.Warp; + +public record WarpPermissionMultipleResolverEntry(Warp warp, String permission) { +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfig.java new file mode 100644 index 000000000..5e13c12c0 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfig.java @@ -0,0 +1,26 @@ +package com.eternalcode.core.feature.warp.data; + +import com.eternalcode.core.configuration.ReloadableConfig; +import com.eternalcode.core.injector.annotations.component.ConfigurationFile; +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import net.dzikoysk.cdn.entity.Description; +import net.dzikoysk.cdn.entity.Exclude; +import net.dzikoysk.cdn.source.Resource; +import net.dzikoysk.cdn.source.Source; + +@ConfigurationFile +public class WarpDataConfig implements ReloadableConfig { + + @Exclude + public static final String WARP_DATA_FILE_PATH = "data" + File.separator + "warps.yml"; + + @Description({"# Warps data", "# These are warp locations, for your own safety, please don't touch it."}) + public Map<String, WarpDataConfigRepresenter> warps = new HashMap<>(); + + @Override + public Resource resource(File folder) { + return Source.of(folder, WARP_DATA_FILE_PATH); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigEntry.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfigRepresenter.java similarity index 57% rename from eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigEntry.java rename to eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfigRepresenter.java index bfa64e7da..c37ae603c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/WarpConfigEntry.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfigRepresenter.java @@ -1,19 +1,18 @@ -package com.eternalcode.core.feature.warp; +package com.eternalcode.core.feature.warp.data; import com.eternalcode.commons.bukkit.position.Position; -import net.dzikoysk.cdn.entity.Contextual; - import java.util.List; +import net.dzikoysk.cdn.entity.Contextual; @Contextual -public class WarpConfigEntry { +public class WarpDataConfigRepresenter { public Position position; public List<String> permissions; - public WarpConfigEntry() { + public WarpDataConfigRepresenter() { } - public WarpConfigEntry(Position position, List<String> permissions) { + public WarpDataConfigRepresenter(Position position, List<String> permissions) { this.position = position; this.permissions = permissions; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataDataRepositoryImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataDataRepositoryImpl.java new file mode 100644 index 000000000..fca475451 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataDataRepositoryImpl.java @@ -0,0 +1,129 @@ +package com.eternalcode.core.feature.warp.data; + +import com.eternalcode.commons.bukkit.position.PositionAdapter; +import com.eternalcode.core.configuration.ConfigurationManager; +import com.eternalcode.core.configuration.implementation.LocationsConfiguration; +import com.eternalcode.core.feature.warp.Warp; +import com.eternalcode.core.feature.warp.WarpImpl; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +@Service +public class WarpDataDataRepositoryImpl implements WarpDataRepository { + + private final LocationsConfiguration locationsConfiguration; + private final WarpDataConfig warpDataConfig; + private final ConfigurationManager configurationManager; + + @Inject + WarpDataDataRepositoryImpl( + ConfigurationManager configurationManager, + LocationsConfiguration locationsConfiguration, + WarpDataConfig warpDataConfig + ) { + this.locationsConfiguration = locationsConfiguration; + this.configurationManager = configurationManager; + this.warpDataConfig = warpDataConfig; + + this.migrateWarps(); + } + + @Override + public CompletableFuture<Void> addWarp(Warp warp) { + return CompletableFuture.runAsync(() -> { + WarpDataConfigRepresenter warpDataConfigRepresenter = new WarpDataConfigRepresenter( + PositionAdapter.convert(warp.getLocation()), + warp.getPermissions() + ); + + this.edit(warps -> warps.put(warp.getName(), warpDataConfigRepresenter)); + }); + } + + @Override + public CompletableFuture<Void> removeWarp(String warp) { + return CompletableFuture.runAsync(() -> this.edit(warps -> warps.remove(warp))); + } + @Override + public CompletableFuture<Void> addPermissions(String warp, String... permissions) { + return CompletableFuture.runAsync(() -> this.edit(warps -> { + WarpDataConfigRepresenter warpDataConfigRepresenter = warps.get(warp); + if (warpDataConfigRepresenter == null) { + return; + } + + List<String> newPermissions = new ArrayList<>(warpDataConfigRepresenter.permissions); + newPermissions.addAll(List.of(permissions)); + + warpDataConfigRepresenter.permissions = newPermissions; + })); + } + + @Override + public CompletableFuture<Void> removePermission(String warp, String permission) { + return CompletableFuture.runAsync(() -> this.edit(warps -> { + WarpDataConfigRepresenter warpDataConfigRepresenter = warps.get(warp); + + if (warpDataConfigRepresenter == null) { + return; + } + + List<String> newPermissions = new ArrayList<>(warpDataConfigRepresenter.permissions); + newPermissions.remove(permission); + + warpDataConfigRepresenter.permissions = newPermissions; + })); + } + + private void edit(Consumer<Map<String, WarpDataConfigRepresenter>> editor) { + synchronized (warpDataConfig.warps) { + Map<String, WarpDataConfigRepresenter> warps = new HashMap<>(this.warpDataConfig.warps); + editor.accept(warps); + this.warpDataConfig.warps.putAll(warps); + } + this.configurationManager.save(this.warpDataConfig); + } + + @Override + public CompletableFuture<Optional<Warp>> getWarp(String name) { + return CompletableFuture.completedFuture(Optional.of(this.warpDataConfig.warps.get(name)) + .map(warpDataConfigRepresenter -> new WarpImpl(name, warpDataConfigRepresenter.position, warpDataConfigRepresenter.permissions))); + } + + @Override + public CompletableFuture<List<Warp>> getWarps() { + return CompletableFuture.completedFuture(this.warpDataConfig.warps.entrySet().stream() + .map(warpConfigEntry -> { + WarpDataConfigRepresenter warpContextual = warpConfigEntry.getValue(); + return new WarpImpl(warpConfigEntry.getKey(), warpContextual.position, warpContextual.permissions); + }) + .collect(Collectors.toList())); + } + + private void migrateWarps() { + if (this.locationsConfiguration.warps.isEmpty()) { + return; + } + + this.edit(warps -> warps.putAll(this.locationsConfiguration.warps + .entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> + new WarpDataConfigRepresenter(entry.getValue(), new ArrayList<>())) + ) + )); + + this.locationsConfiguration.warps.clear(); + this.configurationManager.save(this.locationsConfiguration); + this.configurationManager.save(this.warpDataConfig); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataRepository.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataRepository.java new file mode 100644 index 000000000..11a6bb8a4 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataRepository.java @@ -0,0 +1,21 @@ +package com.eternalcode.core.feature.warp.data; + +import com.eternalcode.core.feature.warp.Warp; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +public interface WarpDataRepository { + + CompletableFuture<Void> addWarp(Warp warp); + + CompletableFuture<Void> removeWarp(String warp); + + CompletableFuture<Void> addPermissions(String warp, String... permissions); + + CompletableFuture<Void> removePermission(String warp, String permission); + + CompletableFuture<Optional<Warp>> getWarp(String name); + + CompletableFuture<List<Warp>> getWarps(); +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java index 8f0762b14..8317275c3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java @@ -157,6 +157,9 @@ interface WarpSection { Notice removePermission(); Notice permissionDoesNotExist(); Notice noPermissionsProvided(); + Notice noPermissionAssigned(); + Notice missingWarpName(); + Notice listPermission(); WarpInventorySection warpInventory(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java index cc93e15e2..eac3396dc 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java @@ -387,6 +387,9 @@ public static class ENWarpSection implements WarpSection { public Notice removePermission = Notice.chat("<red>► <white>Removed permission <red>{PERMISSION}</red> <white>from warp <red>{WARP}<white>!"); public Notice noPermissionsProvided = Notice.chat("<red>✘ <dark_red>No permissions provided!"); public Notice permissionDoesNotExist = Notice.chat("<red>✘ <dark_red>Permission <red>{PERMISSION} <dark_red>doesn't exist!"); + public Notice noPermissionAssigned = Notice.chat("<red>✘ <red>There are no permissions assigned to this warp!"); + public Notice missingWarpName = Notice.chat("<red>✘ <dark_red>You must provide a warp name!"); + public Notice listPermission = Notice.chat("<green>► <white>Permissions for warp <green>{WARP}<white>: <green>{PERMISSIONS}"); @Description({" ", "# {WARPS} - List of warps (separated by commas)"}) public Notice available = Notice.chat("<green>► <white>Available warps: <green>{WARPS}"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java index 2a2a224d1..f98bfd126 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java @@ -106,7 +106,7 @@ public static class PLArgumentSection implements ArgumentSection { public Notice usageMessageEntry = Notice.chat("<gold>✘ <white>{USAGE}"); @Description(" ") - public Notice missingPlayerName = Notice.chat("<red>✘ <dark_red>Błąd: <red>Musisz podać nazwę gracza!"); + public Notice missingPlayerName = Notice.chat("<red>✘ <red>Musisz podać nazwę gracza!"); public Notice offlinePlayer = Notice.chat("<red>✘ <dark_red>Ten gracz jest obecnie offline!"); public Notice onlyPlayer = Notice.chat("<red>✘ <dark_red>Ta komenda jest dostępna tylko dla graczy!"); public Notice numberBiggerThanOrEqualZero = Notice.chat("<red>✘ <dark_red>Liczba musi być równa lub większa od 0!"); @@ -308,7 +308,7 @@ public static class PLChatSection implements ChatSection { public Notice alertQueueAdded = Notice.chat("<green>► <white>Dodano wiadomość do kolejki!"); public Notice alertQueueRemoved = Notice.chat("<green>► <white>Usunięto wiadomość z kolejki!"); public Notice alertQueueCleared = Notice.chat("<green>► <white>Wyczyszczono kolejkę wiadomości!"); - public Notice alertQueueEmpty = Notice.chat("<red>✘ <dark_red>Błąd: <red>Kolejka wiadomości jest pusta!"); + public Notice alertQueueEmpty = Notice.chat("<red>✘ <red>Kolejka wiadomości jest pusta!"); public Notice alertQueueSent = Notice.chat("<green>► <white>Wysłano wszystkie wiadomości z kolejki!"); } @@ -385,14 +385,19 @@ public static class PLWarpSection implements WarpSection { public Notice itemAdded = Notice.chat("<green>► <white>Dodano warp do GUI!"); public Notice noWarps = Notice.chat("<red>✘ <dark_red>Nie ma dostępnych warpów!"); public Notice itemLimit = Notice.chat("<red>✘ <red>Osiągnąłeś limit warpów w GUI! Limit to: {LIMIT}!"); - public Notice noPermission = Notice.chat("<red>✘ <red>Nie masz uprawnień do skorzystania z tego warpa ({WARP})!"); + public Notice noPermission = Notice.chat("<red>✘ <red>Nie masz uprawnień do skorzystania z tego warpa <dark_red>{WARP}<red>!"); public Notice addPermissions = Notice.chat("<green>► <white>Dodano uprawnienia do warpa <green>{WARP}<white>!"); - public Notice removePermission = Notice.chat("<red>► <white>Usunięto uprawnienie <red>{PERMISSION}</red> do warpa <red>{WARP}</red>!"); - public Notice noPermissionsProvided = Notice.chat("<red>✘ <dark_red>Błąd: <red>Nie podano żadnych uprawnień!"); - public Notice permissionDoesNotExist = Notice.chat("<red>✘ <dark_red>Błąd: <red>Podane uprawnienie nie istnieje ({PERMISSION})!"); + public Notice removePermission = Notice.chat("<red>► <white>Usunięto uprawnienie <red>{PERMISSION}</red> z warpa <red>{WARP}</red>!"); + public Notice noPermissionsProvided = Notice.chat("<red>✘ <red>Nie podano żadnych uprawnień!"); + public Notice permissionDoesNotExist = Notice.chat("<red>✘ <red>Podane uprawnienie nie istnieje ({PERMISSION})!"); + public Notice noPermissionAssigned = Notice.chat("<red>✘ <red>Ten warp nie ma przypisanych żadnych permisji"); + public Notice missingWarpName = Notice.chat("<red>✘ <dark_red>Musisz podać nazwę warpu!"); + public Notice listPermission = Notice.chat("<green>► <white>Lista uprawnień dla warpa <green>{WARP}<white>: <green>{PERMISSIONS}!"); + @Description({" ", "# {WARPS} - Lista dostępnych warpów"}) public Notice available = Notice.chat("<green>► <white>Dostepne warpy: <green>{WARPS}!"); + @Description({" ", "# Ustawienia gui listy dostępnych warpów"}) public PLWarpInventory warpInventory = new PLWarpInventory(); @@ -468,7 +473,7 @@ public static class PLHomeSection implements HomeSection { "# {HOME} - Nazwa domu, {PLAYER} - Gracz, {HOMES} - Lista domów" }) public Notice overrideHomeLocationAsAdmin = Notice.chat("<green>► <white>Nadpisałeś lokalizację domu <green>{HOME} <white>dla gracza <green>{PLAYER}<white>!"); - public Notice playerNoOwnedHomes = Notice.chat("<red>✘ <dark_red>Błąd: <red>Gracz <dark_red>{PLAYER} <red>nie posiada żadnego domu!"); + public Notice playerNoOwnedHomes = Notice.chat("<red>✘ <red>Gracz <dark_red>{PLAYER} <red>nie posiada żadnego domu!"); public Notice createAsAdmin = Notice.chat("<green>► <white>Stworzono dom <green>{HOME} <white>dla gracza <green>{PLAYER}<white>!"); public Notice deleteAsAdmin = Notice.chat("<red>► <white>Usunięto dom <red>{HOME} <white>dla gracza <red>{PLAYER}<white>!"); public Notice homeListAsAdmin = Notice.chat("<green>► <white>Lista domów gracza <green>{PLAYER}<white>: <green>{HOMES}!");