You've already forked Atomcms-edit
105 lines
3.3 KiB
PHP
Executable File
105 lines
3.3 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Actions\SendCurrency;
|
|
use App\Actions\SendFurniture;
|
|
use App\Models\Shop\WebsiteShopArticle;
|
|
use App\Models\User;
|
|
|
|
class PurchaseService
|
|
{
|
|
public function __construct(
|
|
private readonly RconService $rconService,
|
|
private readonly SendCurrency $sendCurrency,
|
|
) {}
|
|
|
|
public function processPurchase(User $currentUser, WebsiteShopArticle $package, ?User $recipient = null): string
|
|
{
|
|
$user = $recipient ?? $currentUser;
|
|
|
|
$this->deductBalance($currentUser, $package);
|
|
$this->deliverCurrencies($user, $package);
|
|
$this->deliverRank($user, $package);
|
|
$this->deliverBadges($user, $package);
|
|
$this->deliverFurniture($currentUser, $package);
|
|
|
|
return $this->buildSuccessMessage($currentUser, $user, $package);
|
|
}
|
|
|
|
private function deductBalance(User $user, WebsiteShopArticle $package): void
|
|
{
|
|
$user->decrement('website_balance', $package->price());
|
|
}
|
|
|
|
private function deliverCurrencies(User $user, WebsiteShopArticle $package): void
|
|
{
|
|
$this->sendCurrency->execute($user, 'credits', $package->credits);
|
|
$this->sendCurrency->execute($user, 'duckets', $package->duckets);
|
|
$this->sendCurrency->execute($user, 'diamonds', $package->diamonds);
|
|
}
|
|
|
|
private function deliverRank(User $user, WebsiteShopArticle $package): void
|
|
{
|
|
if (! $package->give_rank) {
|
|
return;
|
|
}
|
|
|
|
if ($this->rconService->isConnected) {
|
|
$this->rconService->setRank($user, $package->give_rank);
|
|
$this->rconService->disconnectUser($user);
|
|
} else {
|
|
$user->forceFill(['rank' => $package->give_rank])->save();
|
|
}
|
|
}
|
|
|
|
private function deliverBadges(User $user, WebsiteShopArticle $package): void
|
|
{
|
|
if (! $package->badges) {
|
|
return;
|
|
}
|
|
|
|
$badgeList = explode(';', $package->badges);
|
|
$ownedBadges = $user->badges()->pluck('badge_code')->toArray();
|
|
|
|
foreach ($badgeList as $badge) {
|
|
if (in_array($badge, $ownedBadges)) {
|
|
continue;
|
|
}
|
|
|
|
if ($this->rconService->isConnected) {
|
|
$this->rconService->giveBadge($user, $badge);
|
|
} else {
|
|
$user->badges()->updateOrCreate([
|
|
'user_id' => $user->id,
|
|
'badge_code' => $badge,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function deliverFurniture(User $currentUser, WebsiteShopArticle $package): void
|
|
{
|
|
if (! $package->furniture) {
|
|
return;
|
|
}
|
|
|
|
$sendFurniture = app(SendFurniture::class);
|
|
$sendFurniture->execute($currentUser, json_decode($package->furniture, true));
|
|
}
|
|
|
|
private function buildSuccessMessage(User $currentUser, User $recipient, WebsiteShopArticle $package): string
|
|
{
|
|
$message = __('You have successfully purchased the package :name', ['name' => $package->name]);
|
|
|
|
if ($recipient->username !== $currentUser->username) {
|
|
$message = __('You have successfully purchased the package :name for :username', [
|
|
'name' => $package->name,
|
|
'username' => $recipient->username,
|
|
]);
|
|
}
|
|
|
|
return $message;
|
|
}
|
|
}
|