Initial commit

This commit is contained in:
root
2026-05-09 17:28:23 +02:00
commit 9d73f82529
5575 changed files with 281989 additions and 0 deletions
+104
View File
@@ -0,0 +1,104 @@
<?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->update(['rank' => $package->give_rank]);
}
}
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;
}
}