All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.spongepowered.api.service.economy.account.Account Maven / Gradle / Ivy

The newest version!
/*
 * This file is part of SpongeAPI, licensed under the MIT License (MIT).
 *
 * Copyright (c) SpongePowered 
 * Copyright (c) contributors
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package org.spongepowered.api.service.economy.account;

import net.kyori.adventure.text.Component;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.living.player.User;
import org.spongepowered.api.event.Cause;
import org.spongepowered.api.profile.GameProfile;
import org.spongepowered.api.service.context.Context;
import org.spongepowered.api.service.context.Contextual;
import org.spongepowered.api.service.economy.Currency;
import org.spongepowered.api.service.economy.EconomyService;
import org.spongepowered.api.service.economy.transaction.TransactionResult;
import org.spongepowered.api.service.economy.transaction.TransferResult;

import java.math.BigDecimal;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

/**
 * Represents an account, which stores amounts of various {@link Currency currencies}.
 *
 * 

Accounts come in two varieties: {@link UniqueAccount user accounts} * and {@link VirtualAccount} virtual accounts. * * Unique accounts are bound to a {@link UUID}, usually of a particular * {@link User}'s {@link GameProfile}. * * Virtual accounts are identified by a String identifier, which may have any * value. They are not tied to any {@link Entity}, player or otherwise. Virtual * accounts may be used for purposes such as bank accounts, non-player * {@link Entity} accounts, or other things.

*/ public interface Account extends Contextual { /** * Gets the display name for this account. * *

This should be used by plugins to get a human-readable name for an * account, regardless of the specific type ({@link UniqueAccount} or * {@link VirtualAccount}).

* *

Its contents are dependent on the provider of {@link EconomyService}. * For example, an economy plugin could allow players to configure the * display name of their account

. * * @return The display name for this account */ Component displayName(); /** * Gets the default balance of this account for the specified * {@link Currency}. * *

The default balance is used when the balance is retrieved for the * first time for a given {@link Currency} on this account, or if no * balance is available for the {@link Context}s used when retrieving * a balance.

* * @param currency the currency to get the default balance for. * @return The default balance for the specified {@link Currency}. */ BigDecimal defaultBalance(Currency currency); /** * Returns whether this account has a set balance for the specified * {@link Currency}, with the specified {@link Context}s. * *

If this method returns false, then * {@link #defaultBalance(Currency)} will be used when * retrieving a balance for the specified {@link Currency} with * the specified {@link Context}s.

* * @param currency The {@link Currency} to determine if a balance is set for * @param contexts The {@link Context}s to use with the {@link Currency} * @return Whether this account has a set balance for the specified * {@link Currency} and {@link Context}s */ boolean hasBalance(Currency currency, Set contexts); /** * Returns whether this account has a set balance for the specified * {@link Currency}, with context from the specified {@link Cause}s. * *

If this method returns false, then * {@link #defaultBalance(Currency)} will be used when * retrieving a balance for the specified {@link Currency} with * the specified {@link Context}s.

* * @param currency The {@link Currency} to determine if a balance is set for * @param cause The {@link Cause} to use to compute context for * this {@link Currency} * @return Whether this account has a set balance for the specified * {@link Currency} and {@link Context}s */ boolean hasBalance(Currency currency, Cause cause); /** * Returns whether this account has a set balance for the specified * {@link Currency}, with the current active cause. * *

If this method returns false, then * {@link #defaultBalance(Currency)} will be used when retrieving * a balance for the specifid {@link Currency} with * the current active cause

. * * @param currency The {@link Currency} to determine if a balance is set for. * @return Whether this account has a set balance for the specified * {@link Currency} and current active cause. */ default boolean hasBalance(Currency currency) { return this.hasBalance(currency, this.contextCause()); } /** * Returns a {@link BigDecimal} representative of the balance stored within this * {@link Account} for the {@link Currency} given and the set of {@link Context}s. * *

The default result when the account does not have a balance of the * given {@link Currency} will be {@link #defaultBalance(Currency)}.

* *

The balance may be unavailable depending on the set of * {@link Context}s used.

* * @param currency a {@link Currency} to check the balance of * @param contexts a set of Contexts to check the balance against * @return The value for the specified {@link Currency} with * the specified {@link Context}s. */ BigDecimal balance(Currency currency, Set contexts); /** * Returns a {@link BigDecimal} representative of the balance stored within this * {@link Account} for the {@link Currency} given and the set of {@link Context}s. * *

The default result when the account does not have a balance of the * given {@link Currency} will be {@link #defaultBalance(Currency)}.

* *

The balance may be unavailable depending on the set of * {@link Context}s used.

* * @param currency a {@link Currency} to check the balance of * @param cause a cause used for deriving context to check the balance against * @return The value for the specified {@link Currency} with * the specified {@link Cause}. */ BigDecimal balance(Currency currency, Cause cause); /** * Returns a {@link BigDecimal} representative of the balance stored * within this {@link Account} for the {@link Currency} given, with * the current active cause. * *

The default result when the account does not have a balance of the * given {@link Currency} will be {@link #defaultBalance(Currency)}.

* * @param currency a {@link Currency} to check the balance of * @return the value for the specified {@link Currency}. */ default BigDecimal balance(final Currency currency) { return this.balance(currency, this.contextCause()); } /** * Returns a {@link Map} of all currently set balances the account holds * within the set of {@link Context}s. * *

Amounts may differ depending on the {@link Context}s specified and * the implementation. The set of {@link Context}s may be empty.

* *

{@link Currency} amounts which are 0 may or may not be included in * the returned mapping.

* *

Changes to the returned {@link Map} will not be reflected in * the underlying {@link Account}. See * {@link #setBalance(Currency, BigDecimal, Cause)} to set values.

* * @param contexts the set of {@link Context}s to use with the * specified amounts * @return A {@link Map} of {@link Currency} to {@link BigDecimal} amounts * that this account holds */ Map balances(Set contexts); /** * Returns a {@link Map} of all currently set balances the account holds * within the set of {@link Context}s. * *

Amounts may differ depending on the {@link Cause} specified and * the implementation. The set of {@link Context}s may be empty.

* *

{@link Currency} amounts which are 0 may or may not be included in * the returned mapping.

* *

Changes to the returned {@link Map} will not be reflected in * the underlying {@link Account}. See * {@link #setBalance(Currency, BigDecimal, Cause)} to set values.

* * @param cause the set of {@link Context}s to use with the * specified amounts * @return A {@link Map} of {@link Currency} to {@link BigDecimal} amounts * that this account holds */ Map balances(Cause cause); /** * Returns a {@link Map} of all currently set balances the account holds * within the current active {@link Context}. * *

Amounts may differ depending on the {@link Context}s specified and * the implementation. The set of {@link Context}s may be empty.

* *

{@link Currency} amounts which are 0 may or may not be included in * the returned mapping.

* *

Changes to the returned {@link Map} will not be reflected in * the underlying {@link Account} and may result in runtime exceptions * depending on implementation. See * {@link #setBalance(Currency, BigDecimal, Cause)} to set values.

* * @return A {@link Map} of {@link Currency} to {@link BigDecimal} amounts * that this account holds */ default Map balances() { return this.balances(this.contextCause()); } /** * Sets the balance for this account to the specified amount for * the specified {@link Currency}, with the specified set of {@link Context}s. * *

Negative balances may or may not be supported depending on * the {@link Currency} specified and the implementation.

* * @param currency The {@link Currency} to set the balance for * @param amount The amount to set for the specified {@link Currency} * @param contexts The set of {@link Context}s to use with the * specified {@link Currency} * @return The result of the transaction */ TransactionResult setBalance(Currency currency, BigDecimal amount, Set contexts); /** * Sets the balance for this account to the specified amount for * the specified {@link Currency}, with the specified {@link Cause}. * *

Negative balances may or may not be supported depending on * the {@link Currency} specified and the implementation.

* * @param currency The {@link Currency} to set the balance for * @param amount The amount to set for the specified {@link Currency} * @param cause The cause used to computer context to use with the * specified {@link Currency} * @return The result of the transaction */ TransactionResult setBalance(Currency currency, BigDecimal amount, Cause cause); /** * Sets the balance for this account to the specified amount for the * specified {@link Currency}, with the current active {@link Context}s. * *

Negative balances may or may not be supported depending on * the {@link Currency} specified and the implementation.

* * @param currency The {@link Currency} to set the balance for * @param amount The amount to set for the specified {@link Currency} * @return The result of the transaction */ default TransactionResult setBalance(Currency currency, BigDecimal amount) { return this.setBalance(currency, amount, this.contextCause()); } /** * Resets the balances for all {@link Currency}s used on this account * to their default values ({@link #defaultBalance(Currency)}), * using the specified {@link Context}s. * * @param contexts the {@link Context}s to use when resetting the balances. * @return A map of {@link Currency} to {@link TransactionResult}. Each * entry represents the result of resetting a particular currency. */ Map resetBalances(Set contexts); /** * Resets the balances for all {@link Currency}s used on this account * to their default values ({@link #defaultBalance(Currency)}), * using the specified {@link Cause}s. * * @param cause the cause to computer context to use when resetting the balances. * @return A map of {@link Currency} to {@link TransactionResult}. Each * entry represents the result of resetting a particular currency. */ Map resetBalances(Cause cause); /** * Resets the balances for all {@link Currency}s used on this account to * their default values ({@link #defaultBalance(Currency)}), using * the current active {@link Context}. * * @return A map of {@link Currency} to {@link TransactionResult}. Each * entry represents the result of resetting a particular currency */ default Map resetBalances() { return this.resetBalances(this.contextCause()); } /** * Resets the balance for the specified {@link Currency} to its default * value ({@link #defaultBalance(Currency)}), using * the specified {@link Context}s. * * @param currency The {@link Currency} to reset the balance for * @param contexts The {@link Context}s to use when resetting the balance * * @return The result of the transaction */ TransactionResult resetBalance(Currency currency, Set contexts); /** * Resets the balance for the specified {@link Currency} to its default * value ({@link #defaultBalance(Currency)}), using context from * the specified {@link Cause}. * * @param currency The {@link Currency} to reset the balance for * @param cause The cause to use to compute context when resetting * the balance * * @return The result of the transaction */ TransactionResult resetBalance(Currency currency, Cause cause); /** * Resets the balance for the specified {@link Currency} to its default * value ({@link #defaultBalance(Currency)}), * using the current active {@link Context}s. * * @param currency The {@link Currency} to reset the balance for * @return The result of the transaction */ default TransactionResult resetBalance(Currency currency) { return this.resetBalance(currency, this.contextCause()); } /** * Deposits the specified amount of the specified {@link Currency} to * this account, using the specified {@link Context}s. * * @param currency The {@link Currency} to deposit the specified amount for * @param amount The amount to deposit for the specified {@link Currency} * @param contexts the {@link Context}s to use with the * specified {@link Currency} * @return The result of the transaction */ TransactionResult deposit(Currency currency, BigDecimal amount, Set contexts); /** * Deposits the specified amount of the specified {@link Currency} to * this account, using the specified {@link Cause}. * * @param currency The {@link Currency} to deposit the specified amount for * @param amount The amount to deposit for the specified {@link Currency} * @param cause the cause to use to compute context with the * specified {@link Currency} * @return The result of the transaction */ TransactionResult deposit(Currency currency, BigDecimal amount, Cause cause); /** * Deposits the given amount of the specified {@link Currency} to * this account, using the current active {@link Context}s. * * @param currency The {@link Currency} to deposit the specified amount for * @param amount The amount to deposit for the specified {@link Currency} * @return The result of the transaction */ default TransactionResult deposit(Currency currency, BigDecimal amount) { return this.deposit(currency, amount, this.contextCause()); } /** * Withdraws the specified amount of the specified {@link Currency} from * this account, using the specified {@link Context}s. * * @param currency The {@link Currency} to deposit the specified amount for * @param amount The amount to deposit for the specified {@link Currency} * @param contexts The {@link Context}s to use with the * specified {@link Currency} * @return The result of the transaction */ TransactionResult withdraw(Currency currency, BigDecimal amount, Set contexts); /** * Withdraws the specified amount of the specified {@link Currency} from * this account, using the specified {@link Cause}. * * @param currency The {@link Currency} to deposit the specified amount for * @param amount The amount to deposit for the specified {@link Currency} * @param cause The cause to use to compute context with the * specified {@link Currency} * @return The result of the transaction */ TransactionResult withdraw(Currency currency, BigDecimal amount, Cause cause); /** * Withdraws the specified amount of the specified {@link Currency} from * this account, using the current active {@link Context}s. * * @param currency The {@link Currency} to deposit the specified amount for * @param amount The amount to deposit for the specified {@link Currency} * @return The result of the transaction */ default TransactionResult withdraw(Currency currency, BigDecimal amount) { return this.withdraw(currency, amount, this.contextCause()); } /** * Transfers the specified amount of the specified {@link Currency} * from this account the destination account, * using the specified {@link Context}s. * *

This operation is a merged {@link #withdraw(Currency, BigDecimal, Cause)} * from this account with a {@link #deposit(Currency, BigDecimal, Cause)} * into the specified account.

* * @param to the Account to transfer the amounts to. * @param currency The {@link Currency} to transfer the specified amount for * @param amount The amount to transfer for the specified {@link Currency} * @param contexts The {@link Context}s to use with the * specified {@link Currency} and account * @return A {@link TransferResult} representative of the effects of * the operation */ TransferResult transfer(Account to, Currency currency, BigDecimal amount, Set contexts); /** * Transfers the specified amount of the specified {@link Currency} * from this account the destination account, * using the specified {@link Cause}. * *

This operation is a merged {@link #withdraw(Currency, BigDecimal, Cause)} * from this account with a {@link #deposit(Currency, BigDecimal, Cause)} * into the specified account.

* * @param to the Account to transfer the amounts to. * @param currency The {@link Currency} to transfer the specified amount for * @param amount The amount to transfer for the specified {@link Currency} * @param cause The cause to use with the * specified {@link Currency} and account * @return A {@link TransferResult} representative of the effects of * the operation */ TransferResult transfer(Account to, Currency currency, BigDecimal amount, Cause cause); /** * Transfers the specified amount of the specified {@link Currency} * from this account the destination account, * using the current active {@link Context}s. * *

This operation is a merged {@link #withdraw(Currency, BigDecimal, Cause)} * from this account with a {@link #deposit(Currency, BigDecimal, Cause)} * into the specified account.

* * @param to the Account to transfer the amounts to. * @param currency The {@link Currency} to transfer the specified amount for * @param amount The amount to transfer for the specified {@link Currency} * @return A {@link TransferResult} representative of the effects of the * operation */ default TransferResult transfer(Account to, Currency currency, BigDecimal amount) { return this.transfer(to, currency, amount, this.contextCause()); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy