Skip to content

Commit

Permalink
feat: release v4.0.3
Browse files Browse the repository at this point in the history
Closes #125
  • Loading branch information
cooldogedev committed Mar 13, 2024
1 parent c2e1dd2 commit 7e4244e
Show file tree
Hide file tree
Showing 34 changed files with 419 additions and 104 deletions.
2 changes: 1 addition & 1 deletion plugin.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: BedrockEconomy
version: 4.0.3
version: 4.0.4
api: [ 5.0.0 ]
author: cooldogedev
main: cooldogedev\BedrockEconomy\BedrockEconomy
Expand Down
6 changes: 3 additions & 3 deletions resources/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
config-version: 4.0.2
config-version: 4.0.4

language: en-US

Expand All @@ -12,11 +12,11 @@ currency:
name: United States Dollar
code: USD
symbol: $
formatter: "compact" # The currency formatter, compact or commadot
formatter: compact # The currency formatter, compact or commadot
default:
amount: 0
decimals: 00
decimals: true
decimals: false

database:
# The database provider, mysql or sqlite
Expand Down
36 changes: 29 additions & 7 deletions src/cooldogedev/BedrockEconomy/BedrockEconomy.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,14 @@
use CortexPE\Commando\PacketHooker;
use JsonException;
use pocketmine\plugin\PluginBase;
use pocketmine\promise\Promise;
use pocketmine\scheduler\ClosureTask;
use pocketmine\utils\SingletonTrait;
use pocketmine\utils\TextFormat;
use RuntimeException;
use function class_alias;
use function count;
use function rename;

final class BedrockEconomy extends PluginBase
{
Expand All @@ -66,6 +70,8 @@ final class BedrockEconomy extends PluginBase
*/
private ?array $migrationInfo;

private bool $ready = false;

protected function onLoad(): void
{
foreach ($this->getResources() as $resource) {
Expand Down Expand Up @@ -105,24 +111,29 @@ protected function onEnable(): void
$this->currencyManager = new CurrencyManager($this->currency);

GlobalCache::init();

QueryManager::init($this->currency->code, $this->getConfig()->getNested("database.provider") === "mysql");
QueryManager::TABLE()->execute();

$this->getScheduler()->scheduleDelayedTask(
task: new ClosureTask(
function (): void {
[$oldVersion, $oldProvider] = $this->migrationInfo;
$promises = [];

foreach (MigrationRegistry::get($oldVersion) as $migrationClass) {
$migration = new $migrationClass($this);

if ($migration->run($oldProvider)) {
$this->getLogger()->debug($migration->getName() . " migration ran successfully");
} else {
$this->getLogger()->debug($migration->getName() . " migration failed to run");
$promise = $migration->run($oldProvider);
if ($promise !== null) {
$promises[] = $promise;
}
}

if (count($promises) === 0) {
$this->ready = true;
return;
}

Promise::all($promises)->onCompletion(fn () => $this->ready = true, fn () => $this->ready = true);
}
),
delay: 0
Expand All @@ -136,7 +147,13 @@ function (): void {
}

$this->getScheduler()->scheduleRepeatingTask(
task: new ClosureTask(static fn() => GlobalCache::invalidate()),
task: new ClosureTask(function (): void {
if (!$this->ready) {
return;
}

GlobalCache::invalidate();
}),
period: $this->getConfig()->getNested("cache.invalidation") * 20
);
}
Expand Down Expand Up @@ -211,4 +228,9 @@ public function getCurrencyManager(): CurrencyManager
{
return $this->currencyManager;
}

public function isReady(): bool
{
return $this->ready;
}
}
49 changes: 41 additions & 8 deletions src/cooldogedev/BedrockEconomy/EventListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,47 +56,75 @@ public function __construct(private readonly BedrockEconomy $plugin) {}

private function handleAddTransaction(UpdateTransaction $transaction): void
{
$fetcher = static function (CacheEntry $entry) use ($transaction) {
$amount = $entry->amount + $transaction->amount;
$decimals = $entry->decimals + $transaction->decimals;

if ($decimals >= 100) {
$amount += 1;
$decimals -= 100;
}

return [$amount, $decimals];
};

$online = GlobalCache::ONLINE()->get($transaction->username);
$top = GlobalCache::TOP()->get($transaction->username);

if ($top !== null) {
[$amount, $decimals] = $fetcher($top);
GlobalCache::TOP()->set($transaction->username, new CacheEntry(
amount: $top->amount + $transaction->amount,
decimals: $top->decimals + $transaction->decimals,
amount: $amount,
decimals: $decimals,
position: $top->position,
));

GlobalCache::TOP()->sort();
}

if ($online !== null) {
[$amount, $decimals] = $fetcher($online);
GlobalCache::ONLINE()->set($transaction->username, new CacheEntry(
amount: $online->amount + $transaction->amount,
decimals: $online->decimals + $transaction->decimals,
amount: $amount,
decimals: $decimals,
position: GlobalCache::TOP()->get($transaction->username)?->position ?? $online->position,
));
}
}

private function handleSubtractTransaction(UpdateTransaction $transaction): void
{
$fetcher = static function (CacheEntry $entry) use ($transaction) {
$amount = $entry->amount - $transaction->amount;
$decimals = $entry->decimals - $transaction->decimals;

if ($decimals < 0) {
$amount -= 1;
$decimals += 100;
}

return [$amount, $decimals];
};

$online = GlobalCache::ONLINE()->get($transaction->username);
$top = GlobalCache::TOP()->get($transaction->username);

if ($top !== null) {
[$amount, $decimals] = $fetcher($top);
GlobalCache::TOP()->set($transaction->username, new CacheEntry(
amount: $top->amount - $transaction->amount,
decimals: $top->decimals - $transaction->decimals,
amount: $amount,
decimals: $decimals,
position: $top->position,
));

GlobalCache::TOP()->sort();
}

if ($online !== null) {
[$amount, $decimals] = $fetcher($online);
GlobalCache::ONLINE()->set($transaction->username, new CacheEntry(
amount: $online->amount - $transaction->amount,
decimals: $online->decimals - $transaction->decimals,
amount: $amount,
decimals: $decimals,
position: GlobalCache::TOP()->get($transaction->username)?->position ?? $online->position,
));
}
Expand Down Expand Up @@ -171,6 +199,11 @@ public function onPlayerCreation(PlayerCreationEvent $event): void
$networkSession = $event->getNetworkSession();
$playerInfo = $networkSession->getPlayerInfo();

if (!$this->plugin->isReady()) {
$networkSession->disconnect("An error occurred while loading the plugin. Please try again later.");
return;
}

if (!$playerInfo instanceof XboxLivePlayerInfo) {
throw new RuntimeException("BedrockEconomy requires xbox authentication.");
}
Expand Down
38 changes: 35 additions & 3 deletions src/cooldogedev/BedrockEconomy/api/type/ClosureAPI.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@
use cooldogedev\BedrockEconomy\event\transaction\TransactionFailEvent;
use cooldogedev\BedrockEconomy\event\transaction\TransactionSubmitEvent;
use cooldogedev\BedrockEconomy\event\transaction\TransactionSuccessEvent;
use function array_map;
use function explode;
use function number_format;

final class ClosureAPI extends BaseAPI
{
Expand All @@ -54,7 +57,13 @@ public function getVersion(): string

public function bulk(array $list, Closure $onSuccess, Closure $onError): void
{
QueryManager::BULK($list)->execute($onSuccess, $onError);
QueryManager::BULK($list)->execute(
onSuccess: fn (array $rows) => $onSuccess(array_map(fn (array $row) => [
...$row,
... $this->transformAmount($row["amount"]),
], $rows)),
onFail: $onError,
);
}

public function insert(string $xuid, string $username, int $balance, int $decimals, Closure $onSuccess, Closure $onError): void
Expand All @@ -76,12 +85,25 @@ public function migrate(string $xuid, string $username, string $newXuid, string
*/
public function get(string $xuid, string $username, Closure $onSuccess, Closure $onError): void
{
QueryManager::RETRIEVE($xuid, $username)->execute($onSuccess, $onError);
QueryManager::RETRIEVE($xuid, $username)
->execute(
onSuccess: fn (array $result) => $onSuccess([
... $result,
... $this->transformAmount($result["amount"]),
]),
onFail: $onError,
);
}

public function top(int $limit, int $offset, bool $ascending, Closure $onSuccess, Closure $onError): void
{
QueryManager::TOP($limit, $offset, $ascending)->execute($onSuccess, $onError);
QueryManager::TOP($limit, $offset, $ascending)->execute(
onSuccess: fn (array $rows) => $onSuccess(array_map(fn (array $row) => [
...$row,
... $this->transformAmount($row["amount"]),
], $rows)),
onFail: $onError,
);
}

public function transfer(array $source, array $target, int $amount, int $decimals, Closure $onSuccess, Closure $onError): void
Expand Down Expand Up @@ -151,4 +173,14 @@ public function set(string $xuid, string $username, int $amount, int $decimals,
onFail: ClosureWrapper::combine($onError, static fn() => (new TransactionFailEvent($transaction))->call()),
);
}

private function transformAmount(float $amount): array
{
$amount = number_format($amount, 2, ".", "");
$amount = explode(".", $amount);
return [
"amount" => (int) $amount[0],
"decimals" => (int) $amount[1],
];
}
}
4 changes: 4 additions & 0 deletions src/cooldogedev/BedrockEconomy/command/BalanceCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ protected function prepare(): void

public function onRun(CommandSender $sender, string $aliasUsed, array $args): void
{
if (!$this->getOwningPlugin()->isReady()) {
return;
}

$player = $args[BalanceCommand::ARGUMENT_PLAYER] ?? null;

if (!$sender instanceof Player && $player === null) {
Expand Down
7 changes: 7 additions & 0 deletions src/cooldogedev/BedrockEconomy/command/PayCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ protected function prepare(): void
*/
public function onRun(CommandSender $sender, string $aliasUsed, array $args): void
{
if (!$this->getOwningPlugin()->isReady()) {
return;
}

$player = $args[PayCommand::ARGUMENT_TARGET];
$amount = $args[PayCommand::ARGUMENT_AMOUNT];

Expand Down Expand Up @@ -108,6 +112,9 @@ public function onRun(CommandSender $sender, string $aliasUsed, array $args): vo

$balance = (int)$amount[0];
$decimals = (int)($amount[1] ?? 0);
if ($decimals >= 100) {
$decimals = 99;
}

Await::f2c(
function () use ($sender, $player, $balance, $decimals): Generator {
Expand Down
4 changes: 4 additions & 0 deletions src/cooldogedev/BedrockEconomy/command/RichCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ protected function prepare(): void

public function onRun(CommandSender $sender, string $aliasUsed, array $args): void
{
if (!$this->getOwningPlugin()->isReady()) {
return;
}

if (count(GlobalCache::TOP()->getAll()) === 0) {
GlobalCache::invalidate();
$sender->sendMessage(LanguageManager::getString(KnownMessages::ERROR_RICH_NO_RECORDS));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ protected function prepare(): void

public function onRun(CommandSender $sender, string $aliasUsed, array $args): void
{
if (!$this->getOwningPlugin()->isReady()) {
return;
}

$player = $args[AddBalanceCommand::ARGUMENT_PLAYER];
$amount = $args[AddBalanceCommand::ARGUMENT_AMOUNT];

Expand Down Expand Up @@ -96,6 +100,9 @@ public function onRun(CommandSender $sender, string $aliasUsed, array $args): vo

$balance = (int)$amount[0];
$decimals = (int)($amount[1] ?? 0);
if ($decimals >= 100) {
$decimals = 99;
}

Await::f2c(
function () use ($sender, $player, $balance, $decimals): Generator {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ protected function prepare(): void

public function onRun(CommandSender $sender, string $aliasUsed, array $args): void
{
if (!$this->getOwningPlugin()->isReady()) {
return;
}

$player = $args[RemoveBalanceCommand::ARGUMENT_PLAYER];
$amount = $args[RemoveBalanceCommand::ARGUMENT_AMOUNT];

Expand Down Expand Up @@ -97,6 +101,9 @@ public function onRun(CommandSender $sender, string $aliasUsed, array $args): vo

$balance = (int)$amount[0];
$decimals = (int)($amount[1] ?? 0);
if ($decimals >= 100) {
$decimals = 99;
}

Await::f2c(
function () use ($sender, $player, $balance, $decimals): Generator {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ protected function prepare(): void

public function onRun(CommandSender $sender, string $aliasUsed, array $args): void
{
if (!$this->getOwningPlugin()->isReady()) {
return;
}

$player = $args[SetBalanceCommand::ARGUMENT_PLAYER];
$amount = $args[SetBalanceCommand::ARGUMENT_AMOUNT];

Expand Down Expand Up @@ -96,6 +100,9 @@ public function onRun(CommandSender $sender, string $aliasUsed, array $args): vo

$balance = (int)$amount[0];
$decimals = (int)($amount[1] ?? 0);
if ($decimals >= 100) {
$decimals = 99;
}

Await::f2c(
function () use ($sender, $player, $balance, $decimals): Generator {
Expand Down
4 changes: 0 additions & 4 deletions src/cooldogedev/BedrockEconomy/currency/CurrencyFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,6 @@ public function commadot(int $number, ?int $decimals): string
$decimals = "0" . $decimals;
}

if ($decimals === "00") {
$decimals = null;
}

return $this->currency->symbol . $formatted . ($decimals !== null ? "." . $decimals : "");
}
}

0 comments on commit 7e4244e

Please sign in to comment.