Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
91e4172
Added `CurrencyHolder` interface
NonSwag Jul 14, 2025
d978e3f
Added `Currency` interface and improved currency handling
NonSwag Jul 14, 2025
205a7b7
Refactored to use `Currency` for balance operations
NonSwag Jul 14, 2025
619d4eb
Added TODOs for improving `ServiceConvertCommand`
NonSwag Jul 14, 2025
65b6d1b
Bumped version to 3.0.0-pre1
NonSwag Jul 15, 2025
b36da65
Added `@Contract` annotations for API methods
NonSwag Jul 15, 2025
8b54dcc
Added support for nullable `World` parameters
NonSwag Jul 15, 2025
72f62c0
Added `hasMultiWorldSupport` to controllers
NonSwag Jul 15, 2025
8a0585f
Updated Javadocs for method clarity
NonSwag Jul 15, 2025
5f5a486
Removed `@ApiStatus.NonExtendable` from `Currency` methods
NonSwag Jul 15, 2025
17a9b45
Renamed `getController` to `getHolder`
NonSwag Jul 15, 2025
fa532d4
Removed redundant `deleteAccounts` method
NonSwag Jul 15, 2025
e8f79a5
Commented out incomplete conversion logic
NonSwag Jul 15, 2025
050af7c
Added `@since` annotations across API interfaces
NonSwag Jul 15, 2025
b30e45a
Added nullable `World` support to controllers
NonSwag Jul 15, 2025
065e948
Added methods for singular and plural locale mappings
NonSwag Jul 16, 2025
dc1fe9e
Refactored currency and account APIs for flexibility
NonSwag Jul 19, 2025
01585a7
[ci skip] Improved Javadoc parameter descriptions
NonSwag Jul 19, 2025
3982838
Enhanced currency and account APIs for precision and flexibility
NonSwag Jul 19, 2025
9dee09e
Added exception to `editCurrency` method in `Currency`
NonSwag Jul 19, 2025
7da4eef
Added `deleteCurrency(Currency)` method to `CurrencyHolder`
NonSwag Jul 19, 2025
af3c132
Reintroduced `toBuilder` method in `Currency`
NonSwag Jul 19, 2025
cf2a278
Decoupled `CurrencyHolder` from controllers and services
NonSwag Jul 19, 2025
ffd4fe6
Added `hasBank` methods and improved `Currency` linkage
NonSwag Jul 19, 2025
0c94a62
Implemented `createCurrency` in `CurrencyHolder`
NonSwag Jul 22, 2025
37814ee
Improved Javadoc and parameter handling in banking APIs
NonSwag Jul 22, 2025
9251748
Added `canDeposit`, `canWithdraw`, and `canHold` methods
NonSwag Jul 22, 2025
45447fa
[ci skip] Added `@since 3.0.0` annotations to API methods
NonSwag Jul 22, 2025
6cbab12
Refactored currency and bank access to use CurrencyHolder
NonSwag Oct 23, 2025
5fa9bba
Restore backwards compatibility
NonSwag Oct 24, 2025
26a2b42
Refactored bank response handling with Optionals
NonSwag Oct 24, 2025
52aac8f
unbreak more abi
NonSwag Oct 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,17 @@ private <C extends Controller> LiteralArgumentBuilder<CommandSourceStack> conver
private static final class BankConverter extends PlayerConverter<BankController> {
@Override
public CompletableFuture<Void> convert(OfflinePlayer player, BankController source, BankController target) {
return source.loadBanks().thenAccept(banks -> banks.forEach(bank ->
bank.getWorld().map(world -> target.createBank(bank.getOwner(), bank.getName(), world))
.orElseGet(() -> target.createBank(bank.getOwner(), bank.getName()))
.thenAccept(targetBank -> {
targetBank.setBalance(bank.getBalance());
bank.getMembers().forEach(targetBank::addMember);
})));
return CompletableFuture.completedFuture(null);
// todo: convert all currencies
// todo: convert balance with currencies
// fixme:
// return source.loadBanks().thenAccept(banks -> banks.forEach(bank ->
// bank.getWorld().map(world -> target.createBank(bank.getOwner(), bank.getName(), world))
// .orElseGet(() -> target.createBank(bank.getOwner(), bank.getName()))
// .thenAccept(targetBank -> {
// targetBank.setBalance(bank.getBalance());
// bank.getMembers().forEach(targetBank::addMember);
// })));
}
}

Expand Down Expand Up @@ -119,14 +123,16 @@ public CompletableFuture<Void> convert(EconomyController source, EconomyControll
}

public CompletableFuture<Void> convert(Account account, EconomyController source, EconomyController target) {
return account.getWorld().map(world -> target.tryGetAccount(account.getOwner(), world)
.thenCompose(account1 -> account1.map(CompletableFuture::completedFuture)
.orElseGet(() -> target.createAccount(account.getOwner(), world)))
.thenAccept(account1 -> account1.setBalance(account.getBalance())))
.orElseGet(() -> target.tryGetAccount(account.getOwner())
.thenCompose(account1 -> account1.map(CompletableFuture::completedFuture)
.orElseGet(() -> target.createAccount(account.getOwner())))
.thenAccept(account1 -> account1.setBalance(account.getBalance())));
return CompletableFuture.completedFuture(null);
// fixme
// return account.getWorld().map(world -> target.tryGetAccount(account.getOwner(), world)
// .thenCompose(account1 -> account1.map(CompletableFuture::completedFuture)
// .orElseGet(() -> target.createAccount(account.getOwner(), world)))
// .thenAccept(account1 -> account1.setBalance(account.getBalance())))
// .orElseGet(() -> target.tryGetAccount(account.getOwner())
// .thenCompose(account1 -> account1.map(CompletableFuture::completedFuture)
// .orElseGet(() -> target.createAccount(account.getOwner())))
// .thenAccept(account1 -> account1.setBalance(account.getBalance())));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import net.thenextlvl.service.api.chat.ChatProfile;
import net.thenextlvl.service.model.chat.GroupManagerChatProfile;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
Expand All @@ -21,55 +21,20 @@ public class GroupManagerChatController implements ChatController {
private final GroupManager groupManager = JavaPlugin.getPlugin(GroupManager.class);

@Override
public CompletableFuture<ChatProfile> loadProfile(OfflinePlayer player) {
return getProfile(player)
.map(CompletableFuture::completedFuture)
.orElseGet(() -> CompletableFuture.completedFuture(null));
}

@Override
public CompletableFuture<ChatProfile> loadProfile(OfflinePlayer player, World world) {
return getProfile(player, world)
.map(CompletableFuture::completedFuture)
.orElseGet(() -> CompletableFuture.completedFuture(null));
}

@Override
public CompletableFuture<ChatProfile> loadProfile(UUID uuid) {
return getProfile(uuid)
.map(CompletableFuture::completedFuture)
.orElseGet(() -> CompletableFuture.completedFuture(null));
}

@Override
public CompletableFuture<ChatProfile> loadProfile(UUID uuid, World world) {
public CompletableFuture<ChatProfile> loadProfile(UUID uuid, @Nullable World world) {
return getProfile(uuid, world)
.map(CompletableFuture::completedFuture)
.orElseGet(() -> CompletableFuture.completedFuture(null));
}

@Override
public Optional<ChatProfile> getProfile(OfflinePlayer player) {
var holder = groupManager.getWorldsHolder().getDefaultWorld();
return getProfile(holder, player.getUniqueId(), player.getName());
public Optional<ChatProfile> getProfile(UUID uuid, @Nullable World world) {
return getProfile(getHolder(world), uuid, null);
}

@Override
public Optional<ChatProfile> getProfile(OfflinePlayer player, World world) {
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
return getProfile(holder, player.getUniqueId(), player.getName());
}

@Override
public Optional<ChatProfile> getProfile(UUID uuid) {
var holder = groupManager.getWorldsHolder().getDefaultWorld();
return getProfile(holder, uuid, null);
}

@Override
public Optional<ChatProfile> getProfile(UUID uuid, World world) {
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
return getProfile(holder, uuid, null);
private @Nullable OverloadedWorldHolder getHolder(@Nullable World world) {
if (world == null) return groupManager.getWorldsHolder().getDefaultWorld();
return groupManager.getWorldsHolder().getWorldData(world.getName());
}

private Optional<ChatProfile> getProfile(@Nullable WorldDataHolder holder, UUID uuid, @Nullable String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.Optional;
import java.util.UUID;
Expand All @@ -25,33 +26,24 @@ public LuckPermsChatController(Plugin plugin) {
}

@Override
public CompletableFuture<ChatProfile> loadProfile(UUID uuid) {
return luckPerms.getUserManager().loadUser(uuid).thenApply(user ->
new LuckPermsChatProfile(user, QueryOptions.defaultContextualOptions()));
}

@Override
public CompletableFuture<ChatProfile> loadProfile(UUID uuid, World world) {
public CompletableFuture<ChatProfile> loadProfile(UUID uuid, @Nullable World world) {
return luckPerms.getUserManager().loadUser(uuid).thenApply(user -> {
var options = QueryOptions.contextual(ImmutableContextSet.of("world", world.getName()));
return new LuckPermsChatProfile(user, options);
return new LuckPermsChatProfile(user, getOptions(world));
});
}

@Override
public Optional<ChatProfile> getProfile(UUID uuid) {
return Optional.ofNullable(luckPerms.getUserManager().getUser(uuid)).map(user ->
new LuckPermsChatProfile(user, QueryOptions.defaultContextualOptions()));
}

@Override
public Optional<ChatProfile> getProfile(UUID uuid, World world) {
public Optional<ChatProfile> getProfile(UUID uuid, @Nullable World world) {
return Optional.ofNullable(luckPerms.getUserManager().getUser(uuid)).map(user -> {
var options = QueryOptions.contextual(ImmutableContextSet.of("world", world.getName()));
return new LuckPermsChatProfile(user, options);
return new LuckPermsChatProfile(user, getOptions(world));
});
}

private QueryOptions getOptions(@Nullable World world) {
if (world == null) return QueryOptions.defaultContextualOptions();
return QueryOptions.contextual(ImmutableContextSet.of("world", world.getName()));
}

@Override
public Plugin getPlugin() {
return plugin;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import net.thenextlvl.service.model.group.GroupManagerGroup;
import net.thenextlvl.service.model.permission.GroupManagerPermissionHolder;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
Expand All @@ -32,59 +32,30 @@ public CompletableFuture<Group> createGroup(String name) {
}

@Override
public CompletableFuture<Group> createGroup(String name, World world) {
public CompletableFuture<Group> createGroup(String name, @Nullable World world) {
if (world == null) return createGroup(name);
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
if (holder == null) return CompletableFuture.completedFuture(null);
return CompletableFuture.completedFuture(new GroupManagerGroup(holder.createGroup(name)));
}

@Override
public CompletableFuture<Group> loadGroup(String name) {
return CompletableFuture.completedFuture(getGroup(name).orElse(null));
}

@Override
public CompletableFuture<Group> loadGroup(String name, World world) {
public CompletableFuture<Group> loadGroup(String name, @Nullable World world) {
return CompletableFuture.completedFuture(getGroup(name, world).orElse(null));
}

@Override
public CompletableFuture<GroupHolder> loadGroupHolder(OfflinePlayer player) {
return CompletableFuture.completedFuture(getGroupHolder(player).orElse(null));
}

@Override
public CompletableFuture<GroupHolder> loadGroupHolder(OfflinePlayer player, World world) {
return CompletableFuture.completedFuture(getGroupHolder(player, world).orElse(null));
}

@Override
public CompletableFuture<GroupHolder> loadGroupHolder(UUID uuid) {
return CompletableFuture.completedFuture(getGroupHolder(uuid).orElse(null));
}

@Override
public CompletableFuture<GroupHolder> loadGroupHolder(UUID uuid, World world) {
public CompletableFuture<GroupHolder> loadGroupHolder(UUID uuid, @Nullable World world) {
return CompletableFuture.completedFuture(getGroupHolder(uuid, world).orElse(null));
}

@Override
public CompletableFuture<Set<Group>> loadGroups() {
return CompletableFuture.completedFuture(getGroups());
}

@Override
public CompletableFuture<Set<Group>> loadGroups(World world) {
public CompletableFuture<Set<Group>> loadGroups(@Nullable World world) {
return CompletableFuture.completedFuture(getGroups(world));
}

@Override
public CompletableFuture<Boolean> deleteGroup(Group group) {
return deleteGroup(group.getName());
}

@Override
public CompletableFuture<Boolean> deleteGroup(Group group, World world) {
public CompletableFuture<Boolean> deleteGroup(Group group, @Nullable World world) {
return deleteGroup(group.getName(), world);
}

Expand All @@ -94,7 +65,8 @@ public CompletableFuture<Boolean> deleteGroup(String name) {
}

@Override
public CompletableFuture<Boolean> deleteGroup(String name, World world) {
public CompletableFuture<Boolean> deleteGroup(String name, @Nullable World world) {
if (world == null) return deleteGroup(name);
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
if (holder != null) CompletableFuture.completedFuture(holder.removeGroup(name));
return CompletableFuture.completedFuture(null);
Expand All @@ -107,35 +79,17 @@ public Optional<Group> getGroup(String name) {
}

@Override
public Optional<Group> getGroup(String name, World world) {
public Optional<Group> getGroup(String name, @Nullable World world) {
if (world == null) return getGroup(name);
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
return Optional.ofNullable(holder)
.map(holder1 -> holder1.getGroup(name))
.map(GroupManagerGroup::new);
}

@Override
public Optional<GroupHolder> getGroupHolder(OfflinePlayer player) {
var holder = groupManager.getWorldsHolder().getDefaultWorld();
return getHolder(holder, player.getUniqueId(), player.getName());
}

@Override
public Optional<GroupHolder> getGroupHolder(OfflinePlayer player, World world) {
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
return getHolder(holder, player.getUniqueId(), player.getName());
}

@Override
public Optional<GroupHolder> getGroupHolder(UUID uuid) {
var holder = groupManager.getWorldsHolder().getDefaultWorld();
return getHolder(holder, uuid, null);
}

@Override
public Optional<GroupHolder> getGroupHolder(UUID uuid, World world) {
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
return getHolder(holder, uuid, null);
public Optional<GroupHolder> getGroupHolder(UUID uuid, @Nullable World world) {
return getHolder(getHolder(world), uuid, null);
}

@Override
Expand All @@ -146,14 +100,20 @@ public Set<Group> getGroups() {
}

@Override
public Set<Group> getGroups(World world) {
var holder = groupManager.getWorldsHolder().getWorldData(world.getName());
public Set<Group> getGroups(@Nullable World world) {
if (world == null) return getGroups();
var holder = getHolder(world);
if (holder == null) return Set.of();
return holder.getGroups().values().stream()
.map(GroupManagerGroup::new)
.collect(Collectors.toUnmodifiableSet());
}

private @Nullable OverloadedWorldHolder getHolder(@Nullable World world) {
if (world == null) return groupManager.getWorldsHolder().getDefaultWorld();
return groupManager.getWorldsHolder().getWorldData(world.getName());
}

private Optional<GroupHolder> getHolder(@Nullable WorldDataHolder holder, UUID uuid, @Nullable String name) {
if (holder == null) return Optional.empty();
var user = name != null ? holder.getUser(uuid.toString(), name) : holder.getUser(uuid.toString());
Expand Down
Loading