implement event settings

This commit is contained in:
ghost 2023-10-11 22:34:47 +03:00
parent d4fbb4b592
commit 7aa2c03abc
14 changed files with 657 additions and 171 deletions

View file

@ -29,7 +29,6 @@ class ArticleController extends AbstractController
)]
public function info(
Request $request,
TranslatorInterface $translator,
UserService $userService,
ActivityService $activityService
): Response
@ -263,7 +262,11 @@ class ArticleController extends AbstractController
time(),
$this->getParameter('app.locale'),
explode('|', $this->getParameter('app.locales')),
$this->getParameter('app.theme')
$activityService->getEventCodes(),
$this->getParameter('app.theme'),
$this->getParameter('app.sensitive'),
$this->getParameter('app.yggdrasil'),
$this->getParameter('app.approved')
);
// Add user join event

View file

@ -164,7 +164,11 @@ class SearchController extends AbstractController
time(),
$this->getParameter('app.locale'),
explode('|', $this->getParameter('app.locales')),
$this->getParameter('app.theme')
$activityService->getEventCodes(),
$this->getParameter('app.theme'),
$this->getParameter('app.sensitive'),
$this->getParameter('app.yggdrasil'),
$this->getParameter('app.approved')
);
// Add user join event

View file

@ -1155,11 +1155,14 @@ class TorrentController extends AbstractController
);
// Filter trackers
$file->setAnnounceList(
[
explode('|', $this->getParameter('app.trackers'))
]
);
if ($user->isYggdrasil())
{
$file->setAnnounceList(
[
explode('|', $this->getParameter('app.trackers'))
]
);
}
$data = $file->dumpToString();
@ -1260,11 +1263,14 @@ class TorrentController extends AbstractController
);
// Filter trackers
$file->setAnnounceList(
[
explode('|', $this->getParameter('app.trackers'))
]
);
if ($user->isYggdrasil())
{
$file->setAnnounceList(
[
explode('|', $this->getParameter('app.trackers'))
]
);
}
// Return magnet link
return $this->redirect(
@ -1308,7 +1314,11 @@ class TorrentController extends AbstractController
time(),
$this->getParameter('app.locale'),
explode('|', $this->getParameter('app.locales')),
$this->getParameter('app.theme')
$activityService->getEventCodes(),
$this->getParameter('app.theme'),
$this->getParameter('app.sensitive'),
$this->getParameter('app.yggdrasil'),
$this->getParameter('app.approved')
);
// Add user join event

View file

@ -63,8 +63,8 @@ class UserController extends AbstractController
}
#[Route(
'/{_locale}/profile',
name: 'user_profile',
'/{_locale}/settings',
name: 'user_settings',
defaults: [
'_locale' => '%app.locale%'
],
@ -72,7 +72,7 @@ class UserController extends AbstractController
'_locale' => '%app.locales%',
],
)]
public function profile(
public function settings(
Request $request,
UserService $userService,
ActivityService $activityService
@ -121,17 +121,36 @@ class UserController extends AbstractController
);
}
// Update events
$events = [];
foreach ((array) $request->get('events') as $event)
{
if (in_array($event, $activityService->getEventCodes()))
{
$events[] = $event;
}
}
$user->setEvents(
$events
);
// Update sensitive
$user->setSensitive(
$request->get('sensitive') === 'true'
);
// Update yggdrasil
$user->setYggdrasil(
$request->get('yggdrasil') === 'true'
);
// Save changes to DB
$userService->save($user);
// Redirect user to new locale
return $this->redirectToRoute(
'user_profile',
'user_settings',
[
'_locale' => $user->getLocale()
]
@ -140,38 +159,35 @@ class UserController extends AbstractController
// Render template
return $this->render(
'default/user/profile.html.twig',
'default/user/settings.html.twig',
[
'user' => [
'id' => $user->getId(),
'address' => $request->getClientIp() == $user->getAddress() ? $user->getAddress() : false,
'moderator' => $user->isModerator(),
'approved' => $user->isApproved(),
'status' => $user->isStatus(),
'sensitive' => $user->isSensitive(),
'yggdrasil' => $user->isYggdrasil(),
'locale' => $user->getLocale(),
'locales' => $user->getLocales(),
'events' => $user->getEvents(),
'theme' => $user->getTheme(),
'added' => $user->getAdded(),
'identicon' => $userService->identicon(
$user->getAddress(),
48
),
'added' => $user->getAdded()
],
'locales' => explode('|', $this->getParameter('app.locales')),
'themes' => explode('|', $this->getParameter('app.themes'))
'themes' => explode('|', $this->getParameter('app.themes')),
'events' => $activityService->getEventsTree()
]
);
}
#[Route(
'/{_locale}/user/{userId}',
'/{_locale}/profile/{userId}',
name: 'user_info',
defaults: [
'_locale' => '%app.locale%'
'_locale' => '%app.locale%',
'userId' => null
],
requirements: [
'_locale' => '%app.locales%',
'userId' => '\d+',
],
)]
public function info(
@ -197,7 +213,9 @@ class UserController extends AbstractController
}
// Init target user
if (!$userTarget = $userService->getUser($request->get('userId')))
if (!$userTarget = $userService->getUser(
$request->get('userId') ? $request->get('userId') : $user->getId()
))
{
throw $this->createNotFoundException();
}
@ -208,13 +226,15 @@ class UserController extends AbstractController
[
'user' => [
'id' => $userTarget->getId(),
'address' => $request->getClientIp() == $userTarget->getAddress() ? $userTarget->getAddress() : false,
'address' => $userTarget->getId() === $user->getId() ? $userTarget->getAddress() : false,
'moderator' => $userTarget->isModerator(),
'approved' => $userTarget->isApproved(),
'status' => $userTarget->isStatus(),
'sensitive' => $userTarget->isSensitive(),
'yggdrasil' => $userTarget->isYggdrasil(),
'locale' => $userTarget->getLocale(),
'locales' => $userTarget->getLocales(),
'events' => $userTarget->getEvents(),
'theme' => $userTarget->getTheme(),
'added' => $userTarget->getAdded(),
'identicon' => $userService->identicon(
@ -232,7 +252,8 @@ class UserController extends AbstractController
$userTarget->getId()
)
],
]
],
'events' => $activityService->getEventsTree()
]
);
}
@ -587,7 +608,11 @@ class UserController extends AbstractController
time(),
$this->getParameter('app.locale'),
explode('|', $this->getParameter('app.locales')),
$this->getParameter('app.theme')
$activityService->getEventCodes(),
$this->getParameter('app.theme'),
$this->getParameter('app.sensitive'),
$this->getParameter('app.yggdrasil'),
$this->getParameter('app.approved')
);
// Add user join event

View file

@ -35,12 +35,18 @@ class User
#[ORM\Column(type: Types::ARRAY)]
private array $locales = [];
#[ORM\Column(type: Types::ARRAY)]
private array $events = [];
#[ORM\Column(length: 255)]
private ?string $theme = null;
#[ORM\Column]
private ?bool $sensitive = null;
#[ORM\Column]
private ?bool $yggdrasil = null;
public function getId(): ?int
{
return $this->id;
@ -137,6 +143,18 @@ class User
return $this;
}
public function getEvents(): array
{
return $this->events;
}
public function setEvents(array $events): static
{
$this->events = $events;
return $this;
}
public function getTheme(): ?string
{
return $this->theme;
@ -160,4 +178,16 @@ class User
return $this;
}
public function isYggdrasil(): ?bool
{
return $this->yggdrasil;
}
public function setYggdrasil(bool $yggdrasil): static
{
$this->yggdrasil = $yggdrasil;
return $this;
}
}

View file

@ -5,16 +5,359 @@ namespace App\Service;
use App\Entity\Activity;
use App\Repository\ActivityRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ActivityService
{
private EntityManagerInterface $entityManagerInterface;
private TranslatorInterface $translatorInterface;
public function __construct(
EntityManagerInterface $entityManagerInterface
EntityManagerInterface $entityManagerInterface,
TranslatorInterface $translatorInterface
)
{
$this->entityManagerInterface = $entityManagerInterface;
$this->translatorInterface = $translatorInterface;
}
public function getEventCodes(): array
{
return
[
// User
Activity::EVENT_USER_ADD,
Activity::EVENT_USER_APPROVE_ADD,
Activity::EVENT_USER_APPROVE_DELETE,
Activity::EVENT_USER_MODERATOR_ADD,
Activity::EVENT_USER_MODERATOR_DELETE,
Activity::EVENT_USER_STATUS_ADD,
Activity::EVENT_USER_STATUS_DELETE,
Activity::EVENT_USER_STAR_ADD,
Activity::EVENT_USER_STAR_DELETE,
// Torrents
Activity::EVENT_TORRENT_ADD,
Activity::EVENT_TORRENT_LOCALES_ADD,
Activity::EVENT_TORRENT_LOCALES_DELETE,
Activity::EVENT_TORRENT_LOCALES_APPROVE_ADD,
Activity::EVENT_TORRENT_LOCALES_APPROVE_DELETE,
Activity::EVENT_TORRENT_SENSITIVE_ADD,
Activity::EVENT_TORRENT_SENSITIVE_DELETE,
Activity::EVENT_TORRENT_SENSITIVE_APPROVE_ADD,
Activity::EVENT_TORRENT_SENSITIVE_APPROVE_DELETE,
Activity::EVENT_TORRENT_STAR_ADD,
Activity::EVENT_TORRENT_STAR_DELETE,
Activity::EVENT_TORRENT_DOWNLOAD_FILE_ADD,
Activity::EVENT_TORRENT_DOWNLOAD_MAGNET_ADD,
// Articles
Activity::EVENT_ARTICLE_ADD,
];
}
public function getEventsTree(): array
{
$events = [];
foreach ($this->getEventCodes() as $code)
{
switch ($code)
{
// User
case Activity::EVENT_USER_ADD:
$events
[
$this->translatorInterface->trans('Users')
]
[
$this->translatorInterface->trans('Joined')
] = $code;
break;
/// User approve
case Activity::EVENT_USER_APPROVE_ADD:
$events
[
$this->translatorInterface->trans('Users')
]
[
$this->translatorInterface->trans('Approved')
] = $code;
break;
case Activity::EVENT_USER_APPROVE_DELETE:
$events
[
$this->translatorInterface->trans('Users')
]
[
$this->translatorInterface->trans('Disapproved')
] = $code;
break;
/// User status
case Activity::EVENT_USER_STATUS_ADD:
$events
[
$this->translatorInterface->trans('User statuses')
]
[
$this->translatorInterface->trans('Enabled')
] = $code;
break;
case Activity::EVENT_USER_STATUS_DELETE:
$events
[
$this->translatorInterface->trans('User statuses')
]
[
$this->translatorInterface->trans('Disabled')
] = $code;
break;
/// User moderator
case Activity::EVENT_USER_MODERATOR_ADD:
$events
[
$this->translatorInterface->trans('User moderators')
]
[
$this->translatorInterface->trans('Added')
] = $code;
break;
case Activity::EVENT_USER_MODERATOR_DELETE:
$events
[
$this->translatorInterface->trans('User moderators')
]
[
$this->translatorInterface->trans('Removed')
] = $code;
break;
/// User star
case Activity::EVENT_USER_STAR_ADD:
$events
[
$this->translatorInterface->trans('User stars')
]
[
$this->translatorInterface->trans('Added')
] = $code;
break;
case Activity::EVENT_USER_STAR_DELETE:
$events
[
$this->translatorInterface->trans('User stars')
]
[
$this->translatorInterface->trans('Removed')
] = $code;
break;
// Torrent
case Activity::EVENT_TORRENT_ADD:
$events
[
$this->translatorInterface->trans('Torrents')
]
[
$this->translatorInterface->trans('Added')
] = $code;
break;
/// Torrent locales
case Activity::EVENT_TORRENT_LOCALES_ADD:
$events
[
$this->translatorInterface->trans('Torrent locales')
]
[
$this->translatorInterface->trans('Added')
] = $code;
break;
case Activity::EVENT_TORRENT_LOCALES_DELETE:
$events
[
$this->translatorInterface->trans('Torrent locales')
]
[
$this->translatorInterface->trans('Deleted')
] = $code;
break;
case Activity::EVENT_TORRENT_LOCALES_APPROVE_ADD:
$events
[
$this->translatorInterface->trans('Torrent locales')
]
[
$this->translatorInterface->trans('Approved')
] = $code;
break;
case Activity::EVENT_TORRENT_LOCALES_APPROVE_DELETE:
$events
[
$this->translatorInterface->trans('Torrent locales')
]
[
$this->translatorInterface->trans('Disapproved')
] = $code;
break;
/// Torrent sensitive
case Activity::EVENT_TORRENT_SENSITIVE_ADD:
$events
[
$this->translatorInterface->trans('Torrent sensitive')
]
[
$this->translatorInterface->trans('Added')
] = $code;
break;
case Activity::EVENT_TORRENT_SENSITIVE_DELETE:
$events
[
$this->translatorInterface->trans('Torrent sensitive')
]
[
$this->translatorInterface->trans('Deleted')
] = $code;
break;
case Activity::EVENT_TORRENT_SENSITIVE_APPROVE_ADD:
$events
[
$this->translatorInterface->trans('Torrent sensitive')
]
[
$this->translatorInterface->trans('Approved')
] = $code;
break;
case Activity::EVENT_TORRENT_SENSITIVE_APPROVE_DELETE:
$events
[
$this->translatorInterface->trans('Torrent sensitive')
]
[
$this->translatorInterface->trans('Disapproved')
] = $code;
break;
/// Torrent stars
case Activity::EVENT_TORRENT_STAR_ADD:
$events
[
$this->translatorInterface->trans('Torrent stars')
]
[
$this->translatorInterface->trans('Added')
] = $code;
break;
case Activity::EVENT_TORRENT_STAR_DELETE:
$events
[
$this->translatorInterface->trans('Torrent stars')
]
[
$this->translatorInterface->trans('Removed')
] = $code;
break;
/// Torrent downloads
case Activity::EVENT_TORRENT_DOWNLOAD_FILE_ADD:
$events
[
$this->translatorInterface->trans('Torrent downloads')
]
[
$this->translatorInterface->trans('Files')
] = $code;
break;
case Activity::EVENT_TORRENT_DOWNLOAD_MAGNET_ADD:
$events
[
$this->translatorInterface->trans('Torrent downloads')
]
[
$this->translatorInterface->trans('Magnet links')
] = $code;
break;
// Article
case Activity::EVENT_TORRENT_ADD:
$events
[
$this->translatorInterface->trans('Articles')
]
[
$this->translatorInterface->trans('Added')
] = $code;
break;
}
}
return $events;
}
public function findLastActivities(): array

View file

@ -28,8 +28,10 @@ class UserService
string $added,
string $locale,
array $locales,
array $events,
string $theme,
bool $sensitive = true,
bool $yggdrasil = true,
bool $approved = false,
bool $moderator = false,
bool $status = true
@ -70,10 +72,18 @@ class UserService
$theme
);
$user->setEvents(
$events
);
$user->setSensitive(
$sensitive
);
$user->setYggdrasil(
$yggdrasil
);
$this->entityManagerInterface->persist($user);
$this->entityManagerInterface->flush();