mirror of
https://github.com/openvk/openvk
synced 2024-12-25 01:51:03 +03:00
ec4757f356
Resolves #183
140 lines
5.1 KiB
PHP
140 lines
5.1 KiB
PHP
<?php declare(strict_types=1);
|
||
namespace openvk\Web\Presenters;
|
||
use openvk\Web\Models\Repositories\{Gifts, Users};
|
||
use openvk\Web\Models\Entities\Notifications\GiftNotification;
|
||
|
||
final class GiftsPresenter extends OpenVKPresenter
|
||
{
|
||
private $gifts;
|
||
private $users;
|
||
|
||
function __construct(Gifts $gifts, Users $users)
|
||
{
|
||
$this->gifts = $gifts;
|
||
$this->users = $users;
|
||
}
|
||
|
||
function renderUserGifts(int $user): void
|
||
{
|
||
$this->assertUserLoggedIn();
|
||
|
||
$user = $this->users->get($user);
|
||
if(!$user)
|
||
$this->notFound();
|
||
|
||
$this->template->user = $user;
|
||
$this->template->page = $page = (int) ($this->queryParam("p") ?? 1);
|
||
$this->template->count = $user->getGiftCount();
|
||
$this->template->iterator = $user->getGifts($page);
|
||
$this->template->hideInfo = $this->user->id !== $user->getId();
|
||
}
|
||
|
||
function renderGiftMenu(): void
|
||
{
|
||
$user = $this->users->get((int) ($this->queryParam("user") ?? 0));
|
||
if(!$user)
|
||
$this->notFound();
|
||
|
||
$this->template->page = $page = (int) ($this->queryParam("p") ?? 1);
|
||
$cats = $this->gifts->getCategories($page, NULL, $this->template->count);
|
||
|
||
$this->template->user = $user;
|
||
$this->template->iterator = $cats;
|
||
$this->template->_template = "Gifts/Menu.xml";
|
||
}
|
||
|
||
function renderGiftList(): void
|
||
{
|
||
$user = $this->users->get((int) ($this->queryParam("user") ?? 0));
|
||
$cat = $this->gifts->getCat((int) ($this->queryParam("pack") ?? 0));
|
||
if(!$user || !$cat)
|
||
$this->flashFail("err", "Не удалось подарить", "Пользователь или набор не существуют.");
|
||
|
||
$this->template->page = $page = (int) ($this->queryParam("p") ?? 1);
|
||
$gifts = $cat->getGifts($page, null, $this->template->count);
|
||
|
||
$this->template->user = $user;
|
||
$this->template->cat = $cat;
|
||
$this->template->gifts = iterator_to_array($gifts);
|
||
$this->template->_template = "Gifts/Pick.xml";
|
||
}
|
||
|
||
function renderConfirmGift(): void
|
||
{
|
||
$user = $this->users->get((int) ($this->queryParam("user") ?? 0));
|
||
$gift = $this->gifts->get((int) ($this->queryParam("elid") ?? 0));
|
||
$cat = $this->gifts->getCat((int) ($this->queryParam("pack") ?? 0));
|
||
if(!$user || !$cat || !$gift || !$cat->hasGift($gift))
|
||
$this->flashFail("err", "Не удалось подарить", "Не удалось подтвердить права на подарок.");
|
||
|
||
if(!$gift->canUse($this->user->identity))
|
||
$this->flashFail("err", "Не удалось подарить", "У вас больше не осталось таких подарков.");
|
||
|
||
$coinsLeft = $this->user->identity->getCoins() - $gift->getPrice();
|
||
if($coinsLeft < 0)
|
||
$this->flashFail("err", "Не удалось подарить", "Ору нищ не пук.");
|
||
|
||
$this->template->_template = "Gifts/Confirm.xml";
|
||
if($_SERVER["REQUEST_METHOD"] !== "POST") {
|
||
$this->template->user = $user;
|
||
$this->template->cat = $cat;
|
||
$this->template->gift = $gift;
|
||
return;
|
||
}
|
||
|
||
$comment = empty($c = $this->postParam("comment")) ? NULL : $c;
|
||
$notification = new GiftNotification($user, $this->user->identity, $gift, $comment);
|
||
$notification->emit();
|
||
$this->user->identity->setCoins($coinsLeft);
|
||
$this->user->identity->save();
|
||
$user->gift($this->user->identity, $gift, $comment, !is_null($this->postParam("anonymous")));
|
||
$gift->used();
|
||
|
||
$this->flash("succ", "Подарок отправлен", "Вы отправили подарок <b>" . $user->getFirstName() . "</b> за " . $gift->getPrice() . " голосов.");
|
||
$this->redirect($user->getURL(), static::REDIRECT_TEMPORARY);
|
||
}
|
||
|
||
function renderStub(): void
|
||
{
|
||
$this->assertUserLoggedIn();
|
||
|
||
$act = $this->queryParam("act");
|
||
switch($act) {
|
||
case "pick":
|
||
$this->renderGiftMenu();
|
||
break;
|
||
|
||
case "menu":
|
||
$this->renderGiftList();
|
||
break;
|
||
|
||
case "confirm":
|
||
$this->renderConfirmGift();
|
||
break;
|
||
|
||
default:
|
||
$this->notFound();
|
||
}
|
||
}
|
||
|
||
function renderGiftImage(int $id, int $timestamp): void
|
||
{
|
||
$gift = $this->gifts->get($id);
|
||
if(!$gift)
|
||
$this->notFound();
|
||
|
||
$image = $gift->getImage();
|
||
header("Cache-Control: no-transform, immutable");
|
||
header("Content-Length: " . strlen($image));
|
||
header("Content-Type: image/png");
|
||
exit($image);
|
||
}
|
||
|
||
function onStartup(): void
|
||
{
|
||
if(!OPENVK_ROOT_CONF["openvk"]["preferences"]["commerce"])
|
||
$this->flashFail("err", tr("error"), tr("feature_disabled"));
|
||
|
||
parent::onStartup();
|
||
}
|
||
}
|